ai cooking
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

better gemini logging (#487)

Co-authored-by: paul miller <paul.miller>

authored by

Paul Miller
paul miller
and committed by
GitHub
d68404e4 5863de16

+38 -1
+14 -1
internal/ai/critique.go
··· 99 99 if err != nil { 100 100 return nil, err 101 101 } 102 + start := time.Now() 102 103 resp, err := client.Models.GenerateContent(ctx, c.model, genai.Text(prompt), &genai.GenerateContentConfig{ 103 104 SystemInstruction: genai.NewContentFromText(recipeCritiqueSystemInstruction, genai.RoleUser), 104 105 // Temperature: genai.Ptr[float32](0), ··· 113 114 "model", c.model, 114 115 "model_version", resp.ModelVersion, 115 116 "response_id", resp.ResponseID, 116 - "usage", resp.UsageMetadata, 117 + "latencyMS", time.Since(start).Milliseconds(), 118 + "usage", geminiUsageLogValue(resp.UsageMetadata), 117 119 ) 118 120 119 121 critique, err := parseRecipeCritique(resp.Text()) ··· 123 125 critique.Model = resp.ModelVersion 124 126 critique.CritiquedAt = time.Now().UTC() 125 127 return critique, nil 128 + } 129 + 130 + func geminiUsageLogValue(usage *genai.GenerateContentResponseUsageMetadata) any { 131 + if usage == nil { 132 + return json.RawMessage("null") 133 + } 134 + body, err := json.Marshal(usage) 135 + if err != nil { 136 + return fmt.Sprintf("failed to marshal Gemini usage metadata: %v", err) 137 + } 138 + return json.RawMessage(body) 126 139 } 127 140 128 141 func (c *critiquer) newClient(ctx context.Context) (*genai.Client, error) {
+24
internal/ai/critique_test.go
··· 1 1 package ai 2 2 3 3 import ( 4 + "encoding/json" 4 5 "testing" 5 6 6 7 "github.com/stretchr/testify/assert" 7 8 "github.com/stretchr/testify/require" 9 + "google.golang.org/genai" 8 10 ) 9 11 10 12 func TestBuildRecipeCritiquePrompt(t *testing.T) { ··· 89 91 assert.Equal(t, float64(1), overallScore["minimum"]) 90 92 assert.Equal(t, float64(10), overallScore["maximum"]) 91 93 } 94 + 95 + func TestGeminiUsageLogValue(t *testing.T) { 96 + t.Run("nil usage", func(t *testing.T) { 97 + raw, ok := geminiUsageLogValue(nil).(json.RawMessage) 98 + require.True(t, ok) 99 + assert.JSONEq(t, `null`, string(raw)) 100 + }) 101 + 102 + t.Run("usage marshals to json", func(t *testing.T) { 103 + raw, ok := geminiUsageLogValue(&genai.GenerateContentResponseUsageMetadata{ 104 + PromptTokenCount: 448, 105 + CandidatesTokenCount: 986, 106 + TotalTokenCount: 1877, 107 + }).(json.RawMessage) 108 + require.True(t, ok) 109 + assert.JSONEq(t, `{ 110 + "promptTokenCount": 448, 111 + "candidatesTokenCount": 986, 112 + "totalTokenCount": 1877 113 + }`, string(raw)) 114 + }) 115 + }