in gollm/gemini.go [414:455]
func (c *GeminiChat) SendStreaming(ctx context.Context, contents ...any) (ChatResponseIterator, error) {
log := klog.FromContext(ctx)
log.V(1).Info("sending LLM streaming request", "user", contents)
parts, err := c.partsToGemini(contents...)
if err != nil {
return nil, err
}
genaiContent := &genai.Content{
Role: "user",
Parts: parts,
}
c.history = append(c.history, genaiContent)
stream := c.client.Models.GenerateContentStream(ctx, c.model, c.history, c.genConfig)
return func(yield func(ChatResponse, error) bool) {
next, stop := iter.Pull2(stream)
defer stop()
for {
geminiResponse, err, ok := next()
if !ok {
return
}
var response *GeminiChatResponse
if geminiResponse != nil {
response = &GeminiChatResponse{geminiResponse: geminiResponse}
if len(geminiResponse.Candidates) > 0 {
// TODO: Should we try to coalesce parts when we have a streaming response?
c.history = append(c.history, geminiResponse.Candidates[0].Content)
}
}
if !yield(response, err) {
return
}
}
}, nil
}