package main import ( "net/http" "path/filepath" "testing" "github.com/stretchr/testify/require" ) func TestChainReturnsTheRepliesOfTheFinalAnswer(t *testing.T) { server := newModelFake(t) server.reply = func(w http.ResponseWriter, call ModelFakeCall) { if call.number == 0 { modelWriteEvents(w, modelCompletedEvent([]any{ modelMessageItem("Looking."), modelFunctionCallItem("fc_1", "call_1", "shell", `{"command":"echo hi"}`), }, 100, 0, 5)) return } modelWriteEvents(w, modelCompletedEvent([]any{ modelMessageItem("It said hi."), modelMessageItem("Done."), }, 120, 100, 5)) } memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, newFakeSummarizer()) require.NoError(t, err) t.Cleanup(func() { require.NoError(t, memory.Close()) }) chain := &Chain{ client: newModelClient(server.URL, ModelAPIKey(modelTestKey), "agent-key", filepath.Join(t.TempDir(), "usage.jsonl")), tools: &Toolbox{ log: memory, chat: memory, subagents: newTestSubagents(t), workdir: t.TempDir(), }, request: ModelRequest{ Model: "gpt-test", Effort: "low", }, take: func() []Message { return nil }, } text, err := chain.Run(t.Context(), []any{modelUserMessage("Run echo hi.")}) require.NoError(t, err) require.Equal(t, "It said hi.\n\nDone.", text) require.Equal(t, 2, server.Calls()) var kinds []string for id := range memory.Len() { message, err := memory.Message(id) require.NoError(t, err) kinds = append(kinds, message.Kind) } require.Equal(t, []string{"reply", "tool", "echo", "reply", "reply"}, kinds) }