X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/3cdbd017da9ae7a7045f4272f16d4b262fd01c79..b1be0ee8530df5db8973bfe355f2f6d3149383a0:/image_show_test.go diff --git a/image_show_test.go b/image_show_test.go index ed475fe..65e422c 100644 --- a/image_show_test.go +++ b/image_show_test.go @@ -1,6 +1,7 @@ package main import ( + "encoding/base64" "encoding/json" "net/http" "path/filepath" @@ -134,3 +135,97 @@ func TestAgentShowsImageInTerminalWithoutTelegram(t *testing.T) { Text: output, }), filepath.Join(test.agent.Images().dir, name)) } + +func TestTellImageMarkerGivesTheChildPixels(t *testing.T) { + server := newModelFake(t) + test := newDaemonMessageTest(t, t.TempDir(), server) + picture := imageTestPNG(t, 4, 2) + name, err := test.agents[0].agent.Images().Save(picture) + require.NoError(t, err) + test.Start(t, 0, 1) + + arguments, err := json.Marshal(ToolTellArguments{ + Name: "Garden", + Message: imageText([]string{name}, "Review this plan."), + }) + require.NoError(t, err) + require.Contains(t, test.loops[0].tools.run(t.Context(), "tell", string(arguments)), "Sent.") + test.events[1].WaitFor(t, "idle", 1) + + var childCall *ModelFakeCall + + for i := range server.Calls() { + call := server.Call(i) + if call.body["model"] == "gpt-test-garden" { + childCall = &call + break + } + } + + require.NotNil(t, childCall) + require.Contains(t, string(childCall.raw), "input_image") + require.Contains(t, string(childCall.raw), base64.StdEncoding.EncodeToString(picture)) + require.Contains(t, test.events[1].Last("user"), "[image "+name+"]") + require.NotContains(t, promptToolNames(test.agents[1].agent.Tools()), "image_show") +} + +func TestAgentShowsTelegramReceivedImageToItsOwner(t *testing.T) { + picture := imageTestPNG(t, 6, 4) + store := &ImageStore{dir: t.TempDir()} + name, err := store.Save(picture) + require.NoError(t, err) + + telegram := newTelegramFake(t) + telegram.Image("owner-photo", picture) + + bot, logs := telegramStartTestBot(t, telegram) + server := newModelFake(t) + server.reply = func(w http.ResponseWriter, call ModelFakeCall) { + if call.number == 0 { + arguments, err := json.Marshal(ToolImageShowArguments{ + Image: name, + Caption: "Here is your photo.", + }) + require.NoError(t, err) + modelWriteEvents(w, modelCompletedEvent([]any{modelFunctionCallItem("fc_1", "call_1", "image_show", string(arguments))}, 100, 0, 5)) + + return + } + + modelWriteEvents(w, modelCompletedEvent([]any{modelMessageItem("Shown.")}, 100, 0, 5)) + } + socket := daemonStartTestWithBot(t, server, bot) + terminal := terminalStartTestClient(t, socket) + terminal.WaitFor(t, "[connected to OneChat]") + + message := telegramOwnerMessage("") + message.Caption = "Show this photo." + message.Photo = []TelegramPhoto{{ + FileID: "owner-photo", + Width: 6, + Height: 4, + }} + telegram.Add(TelegramUpdate{ + UpdateID: 1, + Message: message, + }) + terminal.WaitFor(t, "Shown.\n[done]") + require.Contains(t, terminal.Output(), "[result] [image "+name+"]") + require.Contains(t, terminal.Output(), filepath.Join(imageDirName, name)) + + var photos []TelegramFakeCall + + for _, call := range telegram.Calls() { + if call.method == "sendPhoto" { + photos = append(photos, call) + } + } + + require.Len(t, photos, 1) + require.Equal(t, picture, photos[0].params["photo"]) + require.Equal(t, "4242", photos[0].params["chat_id"]) + require.Equal(t, "Here is your photo.", photos[0].params["caption"]) + require.NotContains(t, logs.String(), "Here is your photo.") + require.NotContains(t, logs.String(), "Show this photo.") + require.NotContains(t, logs.String(), telegramTestToken) +}