"github.com/volcengine/ark-runtime-go/arkruntime"
"github.com/volcengine/ark-runtime-go/arkruntime/model/responses"
deepChatFeature = "deepChat"
aiSearchFeature = "aiSearch"
reasoningSearchFeature = "reasoningSearch"
doubaoHeader = "ark-beta-doubao-app"
var featureToQuery = map[string]string{
chatFeature: "你好介绍一下你自己",
deepChatFeature: "为什么天空是蓝色",
aiSearchFeature: "今天的 AI 新闻",
reasoningSearchFeature: "今天的 AI 新闻",
func stream(feature string) {
client := arkruntime.NewClientWithApiKey(
os.Getenv("ARK_API_KEY"),
arkruntime.WithBaseUrl("https://ark.cn-beijing.volces.com/api/v3"),
ctx := context.Background()
fmt.Println("----- round 1 -----")
request := &responses.ResponsesRequest{
Model: "doubao-seed-2-1-pro-260915",
Input: textInput(featureToQuery[feature]),
Tools: []responses.Tool{doubaoAppTool(feature)},
responseID, err := streamResponse(ctx, client, request)
fmt.Printf("stream error: %v\n", err)
fmt.Println("\n----- round 2 -----")
followUp := &responses.ResponsesRequest{
Model: "doubao-seed-2-1-pro-260915",
Input: textInput("刚刚我们聊了什么"),
Tools: []responses.Tool{doubaoAppTool(feature)},
PreviousResponseID: responses.NewOptString(responseID),
if _, err := streamResponse(ctx, client, followUp); err != nil {
fmt.Printf("stream error: %v\n", err)
func textInput(text string) responses.ResponsesInput {
message := responses.ItemEasyMessage{
Role: responses.NewOptMessageRole(responses.MessageRoleUser),
Content: responses.NewContentItemArrayMessageContent(
[]responses.ContentItem{
OneOf: responses.NewContentItemTextContentItemSum(
responses.ContentItemText{
Type: responses.ContentItemTextTypeInputText,
return responses.NewInputItemArrayResponsesInput(
{OneOf: responses.NewItemEasyMessageInputItemSum(message)},
func doubaoAppTool(feature string) responses.Tool {
enabled := responses.NewOptDoubaoAppFeatureMode(
responses.DoubaoAppFeatureModeEnabled,
item := responses.NewOptDoubaoAppFeatureItem(
responses.DoubaoAppFeatureItem{Type: enabled},
var features responses.DoubaoAppFeature
features.DeepChat = item
features.AiSearch = item
case reasoningSearchFeature:
features.ReasoningSearch = item
OneOf: responses.NewDoubaoAppToolToolSum(
responses.DoubaoAppTool{
Type: responses.DoubaoAppToolTypeDoubaoApp,
client *arkruntime.Client,
request *responses.ResponsesRequest,
stream, err := client.CreateResponsesStream(
arkruntime.WithCustomHeader(doubaoHeader, "true"),
event, err := stream.Recv()
if event.OneOf.Type == responses.ResponseCreatedEventResponseStreamEventSum {
responseID = event.OneOf.ResponseCreatedEvent.Response.ID
func handleEvent(event *responses.ResponseStreamEvent) {
switch event.OneOf.Type {
case responses.ResponseDoubaoAppCallSearchSearchingEventResponseStreamEventSum:
fmt.Printf("[searching] %s\n", event.OneOf.ResponseDoubaoAppCallSearchSearchingEvent.SearchingState.Or(""))
case responses.ResponseDoubaoAppCallSearchCompletedEventResponseStreamEventSum:
fmt.Printf("\n[search done] %s\n", event.OneOf.ResponseDoubaoAppCallSearchCompletedEvent.Summary.Or(""))
case responses.ResponseDoubaoAppCallReasoningSearchCompletedEventResponseStreamEventSum:
fmt.Printf("\n[reasoning search done] %s\n", event.OneOf.ResponseDoubaoAppCallReasoningSearchCompletedEvent.Summary.Or(""))
case responses.ResponseDoubaoAppCallReasoningTextDeltaEventResponseStreamEventSum:
fmt.Print(event.OneOf.ResponseDoubaoAppCallReasoningTextDeltaEvent.Delta.Or(""))
case responses.ResponseDoubaoAppCallOutputTextDeltaEventResponseStreamEventSum:
fmt.Print(event.OneOf.ResponseDoubaoAppCallOutputTextDeltaEvent.Delta.Or(""))