mirror of
https://github.com/mudler/LocalAGI.git
synced 2026-08-27 11:25:27 -04:00
f32543e82e
* 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
55 lines
1.9 KiB
Go
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)
|
|
}
|
|
}
|