// Copyright (c) 2026 Probo Inc . // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. package evidencedescriber import ( "context" _ "embed" "fmt" "go.probo.inc/probo/pkg/agent" "go.probo.inc/probo/pkg/llm" ) //go:embed prompt.txt var systemPrompt string type ( Config struct { Model string Temp float64 MaxTokens int } Describer struct { client *llm.Client config Config } ) func New(client *llm.Client, cfg Config) *Describer { return &Describer{ client: client, config: cfg, } } func (d *Describer) Describe(ctx context.Context, filename string, mimeType string, fileBase64 string) (*string, error) { ag := agent.New( "evidence_describer", d.client, agent.WithInstructions(systemPrompt), agent.WithModel(d.config.Model), agent.WithTemperature(d.config.Temp), agent.WithMaxTokens(d.config.MaxTokens), ) result, err := ag.Run( ctx, []llm.Message{ { Role: llm.RoleUser, Parts: []llm.Part{ llm.TextPart{Text: fmt.Sprintf("Filename: %s", filename)}, llm.FilePart{ Data: fileBase64, MimeType: mimeType, Filename: filename, }, }, }, }, ) if err != nil { return nil, fmt.Errorf("cannot describe evidence: %w", err) } text := result.FinalMessage().Text() return &text, nil }