"github.com/volcengine/ark-runtime-go/arkruntime"
"github.com/volcengine/ark-runtime-go/arkruntime/model/responses"
mcpServerURL = "https://mcp.deepwiki.com/mcp"
mcpBetaHeader = "ark-beta-mcp"
userPrompt = "查一下 mark3labs/mcp-go 这个仓库的结构"
func newClient() *arkruntime.Client {
return arkruntime.NewClientWithApiKey(
os.Getenv("ARK_API_KEY"),
arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"),
fmt.Println("===== non-streaming =====")
ctx := context.Background()
req1 := &responses.ResponsesRequest{
Model: "doubao-seed-2-1-pro-260915",
Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{
{OneOf: responses.NewItemEasyMessageInputItemSum(buildUserMessage())},
Tools: []responses.Tool{mcpTool(false)},
resp1, err := client.CreateResponses(
arkruntime.WithCustomHeader(mcpBetaHeader, "true"),
fmt.Printf("round 1 error: %v\n", err)
fmt.Printf("response: %+v\n", resp1)
approvalRequestID := findApprovalRequestID(resp1.Output)
if approvalRequestID == "" {
fmt.Println("no approval request emitted; nothing to approve")
req2 := &responses.ResponsesRequest{
Model: "doubao-seed-2-1-pro-260915",
Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{
{OneOf: responses.NewItemFunctionMcpApprovalResponseInputItemSum(
responses.ItemFunctionMcpApprovalResponse{
Type: responses.ItemFunctionMcpApprovalResponseTypeMcpApprovalResponse,
ApprovalRequestID: approvalRequestID,
Tools: []responses.Tool{mcpTool(false)},
PreviousResponseID: responses.NewOptString(resp1.ID),
resp2, err := client.CreateResponses(
arkruntime.WithCustomHeader(mcpBetaHeader, "true"),
fmt.Printf("round 2 error: %v\n", err)
fmt.Printf("response: %+v\n", resp2)
req3 := &responses.ResponsesRequest{
Model: "doubao-seed-2-1-pro-260915",
Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{
{OneOf: responses.NewItemEasyMessageInputItemSum(buildUserMessage())},
Tools: []responses.Tool{mcpTool(true)},
resp3, err := client.CreateResponses(
arkruntime.WithCustomHeader(mcpBetaHeader, "true"),
fmt.Printf("round 3 error: %v\n", err)
fmt.Printf("response: %+v\n", resp3)
fmt.Println("===== streaming =====")
ctx := context.Background()
req1 := &responses.ResponsesRequest{
Model: "doubao-seed-2-1-pro-260915",
Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{
{OneOf: responses.NewItemEasyMessageInputItemSum(buildUserMessage())},
Tools: []responses.Tool{mcpTool(false)},
responseID, approvalRequestID, err := streamAndCapture(ctx, client, req1)
fmt.Printf("round 1 stream error: %v\n", err)
if approvalRequestID == "" {
fmt.Println("no approval request emitted; nothing to approve")
req2 := &responses.ResponsesRequest{
Model: "doubao-seed-2-1-pro-260915",
Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{
{OneOf: responses.NewItemFunctionMcpApprovalResponseInputItemSum(
responses.ItemFunctionMcpApprovalResponse{
Type: responses.ItemFunctionMcpApprovalResponseTypeMcpApprovalResponse,
ApprovalRequestID: approvalRequestID,
Tools: []responses.Tool{mcpTool(false)},
PreviousResponseID: responses.NewOptString(responseID),
if _, _, err := streamAndCapture(ctx, client, req2); err != nil {
fmt.Printf("round 2 stream error: %v\n", err)
req3 := &responses.ResponsesRequest{
Model: "doubao-seed-2-1-pro-260915",
Input: responses.NewInputItemArrayResponsesInput([]responses.InputItem{
{OneOf: responses.NewItemEasyMessageInputItemSum(buildUserMessage())},
Tools: []responses.Tool{mcpTool(true)},
if _, _, err := streamAndCapture(ctx, client, req3); err != nil {
fmt.Printf("round 3 stream error: %v\n", err)
func buildUserMessage() responses.ItemEasyMessage {
return responses.ItemEasyMessage{
Role: responses.NewOptMessageRole(responses.MessageRoleUser),
Content: responses.NewContentItemArrayMessageContent([]responses.ContentItem{
OneOf: responses.NewContentItemTextContentItemSum(responses.ContentItemText{
Type: responses.ContentItemTextTypeInputText,
func mcpTool(skipApproval bool) responses.Tool {
mcp := responses.McpTool{
Type: responses.McpToolTypeMcp,
ServerURL: mcpServerURL,
ServerDescription: responses.NewOptString("Query a GitHub repository's documentation"),
mcp.RequireApproval = responses.NewOptMcpRequireApproval(
responses.NewMcpApprovalModeMcpRequireApproval(responses.McpApprovalModeNever),
return responses.Tool{OneOf: responses.NewMcpToolToolSum(mcp)}
func findApprovalRequestID(output []responses.OutputItem) string {
for i := len(output) - 1; i >= 0; i-- {
if request, ok := output[i].OneOf.GetItemFunctionMcpApprovalRequest(); ok {
return request.ID.Or("")
client *arkruntime.Client,
req *responses.ResponsesRequest,
) (string, string, error) {
stream, err := client.CreateResponsesStream(
arkruntime.WithCustomHeader(mcpBetaHeader, "true"),
var approvalRequestID string
event, err := stream.Recv()
return responseID, approvalRequestID, nil
return responseID, approvalRequestID, err
switch event.OneOf.Type {
case responses.ResponseCreatedEventResponseStreamEventSum:
responseID = event.OneOf.ResponseCreatedEvent.Response.ID
case responses.ResponseReasoningSummaryTextDeltaEventResponseStreamEventSum:
fmt.Print(event.OneOf.ResponseReasoningSummaryTextDeltaEvent.Delta.Or(""))
case responses.ResponseTextDeltaEventResponseStreamEventSum:
fmt.Print(event.OneOf.ResponseTextDeltaEvent.Delta.Or(""))
case responses.ResponseTextDoneEventResponseStreamEventSum:
fmt.Printf("\n[text done] %s\n", event.OneOf.ResponseTextDoneEvent.Text.Or(""))
case responses.ResponseOutputItemDoneEventResponseStreamEventSum:
item := event.OneOf.ResponseOutputItemDoneEvent.Item
if request, ok := item.OneOf.GetItemFunctionMcpApprovalRequest(); ok {
approvalRequestID = request.ID.Or("")
"\n[mcp approval request] name=%s arguments=%s\n",
case responses.ResponseMcpCallArgumentsDeltaEventResponseStreamEventSum:
fmt.Print(event.OneOf.ResponseMcpCallArgumentsDeltaEvent.Delta)
case responses.ResponseMcpCallCompletedEventResponseStreamEventSum:
fmt.Println("\n[mcp call completed]")
case responses.ResponseMcpListToolsInProgressEventResponseStreamEventSum:
fmt.Println("\n[listing mcp tools]")
case responses.ResponseMcpListToolsCompletedEventResponseStreamEventSum:
fmt.Println("\n[mcp tools listed]")