Skip to content

Commit 852c8dd

Browse files
authored
server/agui: correct id for assistant message and tool result event (#703)
1 parent a521f39 commit 852c8dd

File tree

4 files changed

+38
-15
lines changed

4 files changed

+38
-15
lines changed

server/agui/runner/messagessnapshot.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ func (r *runner) convertToMessagesSnapshotEvent(ctx context.Context, userID stri
139139
messages = append(messages, *r.convertToUserMessage(event.ID, userID, choice))
140140
}
141141
case model.RoleAssistant:
142-
messages = append(messages, *r.convertToAssistantMessage(event.ID, choice))
142+
messages = append(messages, *r.convertToAssistantMessage(event.Response.ID, choice))
143143
case model.RoleTool:
144144
messages = append(messages, *r.convertToToolMessage(event.ID, choice))
145145
default:

server/agui/runner/messagessnapshot_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,26 @@ func TestConvertToMessagesSnapshotEventDeduplicatesUserMessages(t *testing.T) {
326326
assert.Equal(t, "next", *snapshot.Messages[1].Content)
327327
}
328328

329+
func TestConvertToMessagesSnapshotEventUsesResponseIDForAssistant(t *testing.T) {
330+
r := &runner{}
331+
assistantEvent := event.Event{
332+
ID: "event-id",
333+
Response: &model.Response{
334+
ID: "response-id",
335+
Object: model.ObjectTypeChatCompletion,
336+
Choices: []model.Choice{
337+
{Message: model.Message{Role: model.RoleAssistant, Content: "reply"}},
338+
},
339+
},
340+
}
341+
snapshot, err := r.convertToMessagesSnapshotEvent(context.Background(), "user-id", []event.Event{assistantEvent})
342+
assert.NoError(t, err)
343+
assert.NotNil(t, snapshot)
344+
if assert.Len(t, snapshot.Messages, 1) {
345+
assert.Equal(t, "response-id", snapshot.Messages[0].ID)
346+
}
347+
}
348+
329349
func TestIgnoreEvent(t *testing.T) {
330350
tests := []struct {
331351
name string

server/agui/translator/translator.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ func (t *translator) Translate(event *agentevent.Event) ([]aguievents.Event, err
6767
events = append(events, toolCallEvents...)
6868
}
6969
if rsp.IsToolResultResponse() {
70-
toolResultEvents, err := t.toolResultEvent(rsp)
70+
toolResultEvents, err := t.toolResultEvent(rsp, event.ID)
7171
if err != nil {
7272
return nil, err
7373
}
@@ -165,7 +165,7 @@ func (t *translator) toolCallEvent(rsp *model.Response) ([]aguievents.Event, err
165165
}
166166

167167
// toolResultEvent translates a tool result trpc-agent-go event to AG-UI events.
168-
func (t *translator) toolResultEvent(rsp *model.Response) ([]aguievents.Event, error) {
168+
func (t *translator) toolResultEvent(rsp *model.Response, messageID string) ([]aguievents.Event, error) {
169169
if rsp == nil || len(rsp.Choices) == 0 {
170170
return nil, nil
171171
}
@@ -174,7 +174,7 @@ func (t *translator) toolResultEvent(rsp *model.Response) ([]aguievents.Event, e
174174
// Tool call end event.
175175
eventas = append(eventas, aguievents.NewToolCallEndEvent(choice.Message.ToolID))
176176
// Tool call result event.
177-
eventas = append(eventas, aguievents.NewToolCallResultEvent(t.lastMessageID,
177+
eventas = append(eventas, aguievents.NewToolCallResultEvent(messageID,
178178
choice.Message.ToolID, choice.Message.Content))
179179
}
180180
return eventas, nil

server/agui/translator/translator_test.go

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -280,15 +280,15 @@ func TestToolCallAndResultEvents(t *testing.T) {
280280
Message: model.Message{ToolID: "call-1", Content: "done"},
281281
}},
282282
}
283-
resultEvents, err := translator.toolResultEvent(resultRsp)
283+
resultEvents, err := translator.toolResultEvent(resultRsp, "event-tool-result")
284284
assert.NoError(t, err)
285285
assert.Len(t, resultEvents, 2)
286286
end, ok := resultEvents[0].(*aguievents.ToolCallEndEvent)
287287
assert.True(t, ok)
288288
assert.Equal(t, "call-1", end.ToolCallID)
289289
res, ok := resultEvents[1].(*aguievents.ToolCallResultEvent)
290290
assert.True(t, ok)
291-
assert.Equal(t, "msg-tool", res.MessageID)
291+
assert.Equal(t, "event-tool-result", res.MessageID)
292292
assert.Equal(t, "call-1", res.ToolCallID)
293293
assert.Equal(t, "done", res.Content)
294294
}
@@ -416,17 +416,20 @@ func TestTranslateToolResultResponse(t *testing.T) {
416416
}})
417417
assert.NoError(t, err)
418418

419-
events, err := translator.Translate(&agentevent.Event{Response: &model.Response{
420-
Choices: []model.Choice{{
421-
Message: model.Message{ToolID: "tool-1", Content: "done"},
422-
}},
423-
}})
419+
events, err := translator.Translate(&agentevent.Event{
420+
ID: "evt-tool-1",
421+
Response: &model.Response{
422+
Choices: []model.Choice{{
423+
Message: model.Message{ToolID: "tool-1", Content: "done"},
424+
}},
425+
},
426+
})
424427
assert.NoError(t, err)
425428
assert.Len(t, events, 2)
426429
assert.IsType(t, (*aguievents.ToolCallEndEvent)(nil), events[0])
427430
result, ok := events[1].(*aguievents.ToolCallResultEvent)
428431
assert.True(t, ok)
429-
assert.Equal(t, "msg-1", result.MessageID)
432+
assert.Equal(t, "evt-tool-1", result.MessageID)
430433
assert.Equal(t, "tool-1", result.ToolCallID)
431434
assert.Equal(t, "done", result.Content)
432435
}
@@ -471,13 +474,13 @@ func TestTranslateSequentialEvents(t *testing.T) {
471474
Message: model.Message{ToolID: "call-1", Content: "success"},
472475
}},
473476
}
474-
events, err = translator.Translate(&agentevent.Event{Response: toolResultRsp})
477+
events, err = translator.Translate(&agentevent.Event{ID: "evt-call-1-result", Response: toolResultRsp})
475478
assert.NoError(t, err)
476479
assert.Len(t, events, 2)
477480
assert.IsType(t, (*aguievents.ToolCallEndEvent)(nil), events[0])
478481
res, ok := events[1].(*aguievents.ToolCallResultEvent)
479482
assert.True(t, ok)
480-
assert.Equal(t, "msg-1", res.MessageID)
483+
assert.Equal(t, "evt-call-1-result", res.MessageID)
481484
assert.Equal(t, "call-1", res.ToolCallID)
482485

483486
finalRsp := &model.Response{
@@ -545,7 +548,7 @@ func TestToolNilResponse(t *testing.T) {
545548
events, err := translator.toolCallEvent(nil)
546549
assert.Empty(t, events)
547550
assert.NoError(t, err)
548-
events, err = translator.toolResultEvent(nil)
551+
events, err = translator.toolResultEvent(nil, "")
549552
assert.Empty(t, events)
550553
assert.NoError(t, err)
551554
}

0 commit comments

Comments
 (0)