Skip to content

Commit 6f4057a

Browse files
fix(adk): set streaming meta for agentic tool chunks
Change-Id: I4d42e16cd420690625342d5097df4dbcae07cb8b
1 parent 292d298 commit 6f4057a

2 files changed

Lines changed: 84 additions & 0 deletions

File tree

adk/wrappers.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,18 @@ func functionToolResultAgenticMessage(callID, name string, content []*schema.Fun
594594
}
595595
}
596596

597+
func markAgenticMessageStreamingMeta(msg *schema.AgenticMessage, index int) {
598+
if msg == nil {
599+
return
600+
}
601+
for _, block := range msg.ContentBlocks {
602+
if block == nil {
603+
continue
604+
}
605+
block.StreamingMeta = &schema.StreamingMeta{Index: index}
606+
}
607+
}
608+
597609
func toolSearchResultAgenticMessage(callID, name string, tr *schema.ToolResult) (*schema.AgenticMessage, bool) {
598610
if tr == nil || len(tr.Parts) != 1 {
599611
return nil, false
@@ -745,6 +757,7 @@ func typedToolStreamEvent[M MessageType](callID, toolName, toolMsgID string, str
745757
first := true
746758
cvt := func(in string) (*schema.AgenticMessage, error) {
747759
msg := functionToolResultAgenticMessage(callID, toolName, textToFunctionToolResultBlocks(in))
760+
markAgenticMessageStreamingMeta(msg, 0)
748761
if first {
749762
first = false
750763
msg.Extra = internal.SetMessageID(msg.Extra, toolMsgID)
@@ -813,6 +826,7 @@ func typedToolEnhancedStreamEvent[M MessageType](callID, toolName, toolMsgID str
813826
first := true
814827
cvt := func(in *schema.ToolResult) (*schema.AgenticMessage, error) {
815828
msg := toolResultAgenticMessage(callID, toolName, in)
829+
markAgenticMessageStreamingMeta(msg, 0)
816830
if first {
817831
first = false
818832
msg.Extra = internal.SetMessageID(msg.Extra, toolMsgID)

adk/wrappers_test.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1974,6 +1974,75 @@ func TestAgenticEventSenderToolHandler(t *testing.T) {
19741974
})
19751975
}
19761976

1977+
func TestTypedToolStreamEventAgenticMessageSetsStreamingMeta(t *testing.T) {
1978+
event := typedToolStreamEvent[*schema.AgenticMessage](
1979+
"call_1",
1980+
"execute",
1981+
"msg_1",
1982+
schema.StreamReaderFromArray([]string{"first\n", "second\n"}),
1983+
)
1984+
require.NotNil(t, event)
1985+
require.NotNil(t, event.Output)
1986+
require.NotNil(t, event.Output.MessageOutput)
1987+
require.True(t, event.Output.MessageOutput.IsStreaming)
1988+
require.NotNil(t, event.Output.MessageOutput.MessageStream)
1989+
1990+
first, err := event.Output.MessageOutput.MessageStream.Recv()
1991+
require.NoError(t, err)
1992+
require.Len(t, first.ContentBlocks, 1)
1993+
assert.Equal(t, &schema.StreamingMeta{Index: 0}, first.ContentBlocks[0].StreamingMeta)
1994+
1995+
second, err := event.Output.MessageOutput.MessageStream.Recv()
1996+
require.NoError(t, err)
1997+
require.Len(t, second.ContentBlocks, 1)
1998+
assert.Equal(t, &schema.StreamingMeta{Index: 0}, second.ContentBlocks[0].StreamingMeta)
1999+
2000+
result, err := schema.ConcatAgenticMessages([]*schema.AgenticMessage{first, second})
2001+
require.NoError(t, err)
2002+
require.Len(t, result.ContentBlocks, 1)
2003+
assert.Nil(t, result.ContentBlocks[0].StreamingMeta)
2004+
require.NotNil(t, result.ContentBlocks[0].FunctionToolResult)
2005+
require.Len(t, result.ContentBlocks[0].FunctionToolResult.Content, 2)
2006+
assert.Equal(t, "first\n", result.ContentBlocks[0].FunctionToolResult.Content[0].Text.Text)
2007+
assert.Equal(t, "second\n", result.ContentBlocks[0].FunctionToolResult.Content[1].Text.Text)
2008+
}
2009+
2010+
func TestTypedToolEnhancedStreamEventAgenticMessageSetsStreamingMeta(t *testing.T) {
2011+
event := typedToolEnhancedStreamEvent[*schema.AgenticMessage](
2012+
"call_1",
2013+
"execute",
2014+
"msg_1",
2015+
schema.StreamReaderFromArray([]*schema.ToolResult{
2016+
{Parts: []schema.ToolOutputPart{{Type: schema.ToolPartTypeText, Text: "first\n"}}},
2017+
{Parts: []schema.ToolOutputPart{{Type: schema.ToolPartTypeText, Text: "second\n"}}},
2018+
}),
2019+
)
2020+
require.NotNil(t, event)
2021+
require.NotNil(t, event.Output)
2022+
require.NotNil(t, event.Output.MessageOutput)
2023+
require.True(t, event.Output.MessageOutput.IsStreaming)
2024+
require.NotNil(t, event.Output.MessageOutput.MessageStream)
2025+
2026+
first, err := event.Output.MessageOutput.MessageStream.Recv()
2027+
require.NoError(t, err)
2028+
require.Len(t, first.ContentBlocks, 1)
2029+
assert.Equal(t, &schema.StreamingMeta{Index: 0}, first.ContentBlocks[0].StreamingMeta)
2030+
2031+
second, err := event.Output.MessageOutput.MessageStream.Recv()
2032+
require.NoError(t, err)
2033+
require.Len(t, second.ContentBlocks, 1)
2034+
assert.Equal(t, &schema.StreamingMeta{Index: 0}, second.ContentBlocks[0].StreamingMeta)
2035+
2036+
result, err := schema.ConcatAgenticMessages([]*schema.AgenticMessage{first, second})
2037+
require.NoError(t, err)
2038+
require.Len(t, result.ContentBlocks, 1)
2039+
assert.Nil(t, result.ContentBlocks[0].StreamingMeta)
2040+
require.NotNil(t, result.ContentBlocks[0].FunctionToolResult)
2041+
require.Len(t, result.ContentBlocks[0].FunctionToolResult.Content, 2)
2042+
assert.Equal(t, "first\n", result.ContentBlocks[0].FunctionToolResult.Content[0].Text.Text)
2043+
assert.Equal(t, "second\n", result.ContentBlocks[0].FunctionToolResult.Content[1].Text.Text)
2044+
}
2045+
19772046
// multimodalEnhancedInvokableTestTool returns a pre-built multimodal ToolResult.
19782047
type multimodalEnhancedInvokableTestTool struct {
19792048
name string
@@ -2091,6 +2160,7 @@ func TestTypedToolEnhancedEventAgenticToolSearchResult(t *testing.T) {
20912160
require.Len(t, msg.ContentBlocks, 1)
20922161
block := msg.ContentBlocks[0]
20932162
assert.Equal(t, schema.ContentBlockTypeToolSearchResult, block.Type)
2163+
assert.Equal(t, &schema.StreamingMeta{Index: 0}, block.StreamingMeta)
20942164
require.NotNil(t, block.ToolSearchFunctionToolResult)
20952165
assert.Equal(t, "call_2", block.ToolSearchFunctionToolResult.CallID)
20962166
assert.Equal(t, "tool_search", block.ToolSearchFunctionToolResult.Name)

0 commit comments

Comments
 (0)