From 015a7cb5cd592f8a208efa34f82e9222ff708432 Mon Sep 17 00:00:00 2001 From: John Costa Date: Sun, 5 Oct 2025 13:44:50 +0100 Subject: [PATCH] fix: saving image schema items --- backend/agents/client/client.go | 2 +- backend/agents/client/tools.go | 2 +- backend/agents/client/tools_test.go | 6 ++--- backend/agents/list_agent.go | 15 ++++++++----- backend/models/lists.go | 35 ++++++++++++++++++++++++++--- frontend/src/network/index.ts | 2 +- 6 files changed, 48 insertions(+), 14 deletions(-) diff --git a/backend/agents/client/client.go b/backend/agents/client/client.go index c4838df..971959f 100644 --- a/backend/agents/client/client.go +++ b/backend/agents/client/client.go @@ -262,7 +262,7 @@ func (client *AgentClient) RunAgent(userId uuid.UUID, imageId uuid.UUID, imageNa request.Chat.AddImage(imageName, imageData, client.Options.Query) toolHandlerInfo := ToolHandlerInfo{ - ImageId: imageId, + ImageID: imageId, ImageName: imageName, UserId: userId, Image: &imageData, diff --git a/backend/agents/client/tools.go b/backend/agents/client/tools.go index d58c12d..424e7ae 100644 --- a/backend/agents/client/tools.go +++ b/backend/agents/client/tools.go @@ -9,7 +9,7 @@ import ( type ToolHandlerInfo struct { UserId uuid.UUID - ImageId uuid.UUID + ImageID uuid.UUID ImageName string // Pointer because we don't want to copy this around too much. diff --git a/backend/agents/client/tools_test.go b/backend/agents/client/tools_test.go index e05bf7f..5c5905e 100644 --- a/backend/agents/client/tools_test.go +++ b/backend/agents/client/tools_test.go @@ -40,7 +40,7 @@ func (suite *ToolTestSuite) TestSingleToolCall() { response := suite.handler.Handle( ToolHandlerInfo{ UserId: uuid.Nil, - ImageId: uuid.Nil, + ImageID: uuid.Nil, }, ToolCall{ Index: 0, @@ -91,7 +91,7 @@ func (suite *ToolTestSuite) TestMultipleToolCalls() { err := suite.client.Process( ToolHandlerInfo{ UserId: uuid.Nil, - ImageId: uuid.Nil, + ImageID: uuid.Nil, }, &AgentRequestBody{ Chat: &chat, @@ -154,7 +154,7 @@ func (suite *ToolTestSuite) TestMultipleToolCallsWithErrors() { err := suite.client.Process( ToolHandlerInfo{ UserId: uuid.Nil, - ImageId: uuid.Nil, + ImageID: uuid.Nil, }, &AgentRequestBody{ Chat: &chat, diff --git a/backend/agents/list_agent.go b/backend/agents/list_agent.go index a31ce30..edfd437 100644 --- a/backend/agents/list_agent.go +++ b/backend/agents/list_agent.go @@ -176,7 +176,7 @@ type addToListArguments struct { Schema []models.IDValue } -func NewListAgent(log *log.Logger, listModel models.StackModel, limitsMethods limits.LimitsManagerMethods) client.AgentClient { +func NewListAgent(log *log.Logger, stackModel models.StackModel, limitsMethods limits.LimitsManagerMethods) client.AgentClient { agentClient := client.CreateAgentClient(client.CreateAgentClientOptions{ SystemPrompt: listPrompt, JsonTools: listTools, @@ -206,7 +206,7 @@ func NewListAgent(log *log.Logger, listModel models.StackModel, limitsMethods li } ctx := context.Background() - savedList, err := listModel.Save(ctx, info.UserId, args.Name, args.Desription, model.Progress_Complete) + savedList, err := stackModel.Save(ctx, info.UserId, args.Name, args.Desription, model.Progress_Complete) if err != nil { log.Error("saving list", "err", err) return "", err @@ -216,7 +216,7 @@ func NewListAgent(log *log.Logger, listModel models.StackModel, limitsMethods li args.Schema[i].StackID = savedList.ID } - err = listModel.SaveItems(ctx, args.Schema) + err = stackModel.SaveItems(ctx, args.Schema) if err != nil { log.Error("saving items", "err", err) return "", err @@ -226,7 +226,7 @@ func NewListAgent(log *log.Logger, listModel models.StackModel, limitsMethods li }) agentClient.ToolHandler.AddTool("listLists", func(info client.ToolHandlerInfo, args string, call client.ToolCall) (any, error) { - return listModel.List(context.Background(), info.UserId) + return stackModel.List(context.Background(), info.UserId) }) agentClient.ToolHandler.AddTool("addToList", func(info client.ToolHandlerInfo, _args string, call client.ToolCall) (any, error) { @@ -243,7 +243,12 @@ func NewListAgent(log *log.Logger, listModel models.StackModel, limitsMethods li return "", err } - if err := listModel.SaveImage(ctx, info.ImageId, listUUID); err != nil { + imageStack, err := stackModel.SaveImage(ctx, info.ImageID, listUUID) + if err != nil { + return "", err + } + + if err := stackModel.SaveSchemaItems(ctx, imageStack.ID, args.Schema); err != nil { return "", err } diff --git a/backend/models/lists.go b/backend/models/lists.go index d8931a5..6d3861a 100644 --- a/backend/models/lists.go +++ b/backend/models/lists.go @@ -3,6 +3,7 @@ package models import ( "context" "database/sql" + "fmt" "screenmark/screenmark/.gen/haystack/haystack/model" . "screenmark/screenmark/.gen/haystack/haystack/table" @@ -103,12 +104,40 @@ func (m StackModel) SaveItems(ctx context.Context, items []model.SchemaItems) er return err } -func (m StackModel) SaveImage(ctx context.Context, imageID uuid.UUID, stackID uuid.UUID) error { +func (m StackModel) SaveImage(ctx context.Context, imageID uuid.UUID, stackID uuid.UUID) (model.ImageStacks, error) { saveImageStmt := ImageStacks. INSERT(ImageStacks.ImageID, ImageStacks.StackID). - VALUES(imageID, stackID) + VALUES(imageID, stackID). + RETURNING(ImageStacks.AllColumns) - _, err := saveImageStmt.ExecContext(ctx, m.dbPool) + imageStack := model.ImageStacks{} + + err := saveImageStmt.QueryContext(ctx, m.dbPool, &imageStack) + + return imageStack, err +} + +func (m StackModel) SaveSchemaItems(ctx context.Context, imageID uuid.UUID, items []IDValue) error { + if len(items) == 0 { + return fmt.Errorf("items cannot be empty") + } + + saveSchemaItemStmt := ImageSchemaItems. + INSERT( + ImageSchemaItems.ImageID, + ImageSchemaItems.SchemaItemID, + ImageSchemaItems.Value, + ) + + for _, item := range items { + saveSchemaItemStmt = saveSchemaItemStmt.VALUES( + imageID, + item.ID, + item.Value, + ) + } + + _, err := saveSchemaItemStmt.ExecContext(ctx, m.dbPool) return err } diff --git a/frontend/src/network/index.ts b/frontend/src/network/index.ts index 796c6c3..2c7147f 100644 --- a/frontend/src/network/index.ts +++ b/frontend/src/network/index.ts @@ -222,7 +222,7 @@ const stackValidator = strictObject({ Name: string(), - Images: array(stackImage), + Images: pipe(nullable(array(stackImage)), transform(l => l ?? [])), SchemaItems: array(stackSchemaItem), });