in pkg/agent/conversation.go [437:481]
func candidateToShimCandidate(iterator gollm.ChatResponseIterator) (gollm.ChatResponseIterator, error) {
return func(yield func(gollm.ChatResponse, error) bool) {
buffer := ""
for response, err := range iterator {
if err != nil {
yield(nil, err)
return
}
if len(response.Candidates()) == 0 {
yield(nil, fmt.Errorf("no candidates in LLM response"))
return
}
candidate := response.Candidates()[0]
for _, part := range candidate.Parts() {
if text, ok := part.AsText(); ok {
buffer += text
klog.Infof("text is %q", text)
} else {
yield(nil, fmt.Errorf("no text part found in candidate"))
return
}
}
if _, found := extractJSON(buffer); found {
break
}
}
if buffer == "" {
yield(nil, nil)
return
}
parsedReActResp, err := parseReActResponse(buffer)
if err != nil {
yield(nil, fmt.Errorf("parsing ReAct response %q: %w", buffer, err))
return
}
buffer = "" // TODO: any trailing text?
yield(&ShimResponse{candidate: parsedReActResp}, nil)
}, nil
}