func()

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
}