package main
import (
+ "encoding/base64"
"encoding/json"
"net/http"
"path/filepath"
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)
+}