More armoring of decision parsing.
This commit is contained in:
parent
36fdd5f00e
commit
4c2adc636b
|
@ -180,18 +180,29 @@ Abstract: %s`, criteria, paper.Title, paper.Abstract)
|
|||
}
|
||||
|
||||
content := llmResp.Choices[0].Message.Content
|
||||
lines := bytes.Split([]byte(content), []byte("\n"))
|
||||
|
||||
if len(lines) < 2 {
|
||||
return nil, fmt.Errorf("invalid response format")
|
||||
// Find first line with ACCEPT/REJECT
|
||||
var decisionLine string
|
||||
lines := bytes.Split([]byte(content), []byte("\n"))
|
||||
for _, line := range lines {
|
||||
if strings.Contains(strings.ToUpper(string(line)), "ACCEPT") ||
|
||||
strings.Contains(strings.ToUpper(string(line)), "REJECT") {
|
||||
decisionLine = string(line)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if decisionLine == "" {
|
||||
return nil, fmt.Errorf("no decision found in response. Full response:\n%s", content)
|
||||
}
|
||||
|
||||
// Clean and normalize decision
|
||||
rawDecision := string(bytes.TrimSpace(lines[0]))
|
||||
rawDecision := strings.TrimSpace(decisionLine)
|
||||
|
||||
// Remove any non-alphabetic characters from start/end
|
||||
cleanDecision := strings.TrimFunc(rawDecision, func(r rune) bool {
|
||||
return !unicode.IsLetter(r)
|
||||
// Remove "DECISION:" prefix if present and trim non-alphabetic characters
|
||||
cleanDecision := strings.TrimPrefix(rawDecision, "DECISION:")
|
||||
cleanDecision = strings.TrimFunc(cleanDecision, func(r rune) bool {
|
||||
return !unicode.IsLetter(r) && !unicode.IsNumber(r)
|
||||
})
|
||||
|
||||
// Normalize case and check for valid decision
|
||||
|
@ -203,10 +214,12 @@ Abstract: %s`, criteria, paper.Title, paper.Abstract)
|
|||
case strings.HasPrefix(upperDecision, "REJECT"):
|
||||
decision = "REJECT"
|
||||
default:
|
||||
return nil, fmt.Errorf("invalid decision value: %q (cleaned: %q)", rawDecision, cleanDecision)
|
||||
return nil, fmt.Errorf("invalid decision value: %q (cleaned: %q). Full response:\n%s",
|
||||
rawDecision, cleanDecision, content)
|
||||
}
|
||||
|
||||
explanation := string(bytes.TrimSpace(bytes.Join(lines[1:], []byte("\n"))))
|
||||
// Get explanation as everything after the decision line
|
||||
explanation := strings.TrimSpace(strings.Replace(content, decisionLine, "", 1))
|
||||
|
||||
return &decisionResult{
|
||||
Decision: decision,
|
||||
|
|
Loading…
Reference in New Issue