Files
LocalAGI/core/agent/stream_callback_test.go
Ettore Di Giacinto f32543e82e telegram rich streaming (#488)
* docs: design Telegram rich response streaming

* feat(telegram): add rich message API client

* feat(telegram): preserve rich response formatting

* feat(agent): add request stream callbacks

* feat(telegram): add rich stream sessions

* fix(telegram): preserve initial stream preview

* fix(telegram): preserve streamed delivery fallbacks

* fix(telegram): complete stream worker delivery

* feat(telegram): integrate rich response streaming

* fix(telegram): complete native streaming integration

* fix(telegram): finish rich streaming lifecycle

* fix(telegram): preserve final delivery after job completion

* fix(telegram): honor delivery lifecycle contexts

* fix(telegram): serialize streamed status delivery

* fix(telegram): return preview flush errors

* fix(telegram): preserve final-only delivery context

* docs(telegram): explain streaming fallbacks
2026-08-22 08:33:30 +02:00

55 lines
1.9 KiB
Go

package agent
import (
"testing"
"github.com/mudler/LocalAGI/core/types"
"github.com/mudler/cogito"
)
func TestStreamCallbackForJobCombinesAgentAndRequestCallbacks(t *testing.T) {
var agentEvents, firstRequestEvents, secondRequestEvents []cogito.StreamEvent
a := &Agent{options: &options{
streamCallback: func(event cogito.StreamEvent) {
agentEvents = append(agentEvents, event)
},
}}
first := types.NewJob(types.WithStreamCallback(func(event cogito.StreamEvent) {
firstRequestEvents = append(firstRequestEvents, event)
}))
second := types.NewJob(types.WithStreamCallback(func(event cogito.StreamEvent) {
secondRequestEvents = append(secondRequestEvents, event)
}))
firstEvent := cogito.StreamEvent{Content: "first"}
secondEvent := cogito.StreamEvent{Content: "second"}
a.streamCallbackForJob(first)(firstEvent)
a.streamCallbackForJob(second)(secondEvent)
if len(agentEvents) != 2 || agentEvents[0].Content != "first" || agentEvents[1].Content != "second" {
t.Fatalf("agent callback events = %#v, want first and second events", agentEvents)
}
if len(firstRequestEvents) != 1 || firstRequestEvents[0].Content != "first" {
t.Fatalf("first request callback events = %#v, want only first event", firstRequestEvents)
}
if len(secondRequestEvents) != 1 || secondRequestEvents[0].Content != "second" {
t.Fatalf("second request callback events = %#v, want only second event", secondRequestEvents)
}
}
func TestStreamCallbackForJobNilRequestCallbackPreservesAgentCallback(t *testing.T) {
var events []cogito.StreamEvent
a := &Agent{options: &options{
streamCallback: func(event cogito.StreamEvent) {
events = append(events, event)
},
}}
callback := a.streamCallbackForJob(types.NewJob(types.WithStreamCallback(nil)))
callback(cogito.StreamEvent{Content: "agent"})
if len(events) != 1 || events[0].Content != "agent" {
t.Fatalf("agent callback events = %#v, want agent event", events)
}
}