Compare commits

..

No commits in common. "main" and "v0.1.2" have entirely different histories.
main ... v0.1.2

2 changed files with 9 additions and 44 deletions

View File

@ -16,23 +16,6 @@ Go package for automated evaluation of academic papers using LLM-based criteria
go get gitea.r8z.us/stwhite/paperprocessor go get gitea.r8z.us/stwhite/paperprocessor
``` ```
## API Reference
### ProcessFile
`func ProcessFile(inputPath, outputPath, criteriaPath string, config Config, debug bool) error`
Processes papers from input JSON file and writes results to output JSON file
Parameters:
- inputPath: Path to input JSON file containing papers array
- outputPath: Path to write processing results JSON
- criteriaPath: Path to text file with evaluation criteria
- config: Configuration settings for API and processing
- debug: Enable debug logging when true
Returns:
- error: Processing error or nil if successful
## Usage ## Usage
### Basic Configuration ### Basic Configuration
@ -54,11 +37,7 @@ err := paperprocessor.ProcessFile(
"output/results.json", "output/results.json",
"criteria.txt", "criteria.txt",
config, config,
true, // debug mode
) )
if err != nil {
log.Fatal("Processing failed:", err)
}
``` ```
## Input Formats ## Input Formats

View File

@ -125,7 +125,6 @@ type decisionResult struct {
func (p *Processor) evaluatePaper(paper Paper, criteria string) (*decisionResult, error) { func (p *Processor) evaluatePaper(paper Paper, criteria string) (*decisionResult, error) {
prompt := fmt.Sprintf(`Please evaluate the following academic paper against the provided criteria. prompt := fmt.Sprintf(`Please evaluate the following academic paper against the provided criteria.
Respond with either "ACCEPT" or "REJECT" followed by a brief explanation of your decision. Respond with either "ACCEPT" or "REJECT" followed by a brief explanation of your decision.
Do not use markdown emphasis in your response. Keep your response clear and concise.
Your response should be in the format: Your response should be in the format:
DECISION DECISION
Explanation Explanation
@ -181,29 +180,18 @@ Abstract: %s`, criteria, paper.Title, paper.Abstract)
} }
content := llmResp.Choices[0].Message.Content content := llmResp.Choices[0].Message.Content
// Find first line with ACCEPT/REJECT
var decisionLine string
lines := bytes.Split([]byte(content), []byte("\n")) 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 == "" { if len(lines) < 2 {
return nil, fmt.Errorf("no decision found in response. Full response:\n%s", content) return nil, fmt.Errorf("invalid response format")
} }
// Clean and normalize decision // Clean and normalize decision
rawDecision := strings.TrimSpace(decisionLine) rawDecision := string(bytes.TrimSpace(lines[0]))
// Remove "DECISION:" prefix if present and trim non-alphabetic characters // Remove any non-alphabetic characters from start/end
cleanDecision := strings.TrimPrefix(rawDecision, "DECISION:") cleanDecision := strings.TrimFunc(rawDecision, func(r rune) bool {
cleanDecision = strings.TrimFunc(cleanDecision, func(r rune) bool { return !unicode.IsLetter(r)
return !unicode.IsLetter(r) && !unicode.IsNumber(r)
}) })
// Normalize case and check for valid decision // Normalize case and check for valid decision
@ -215,12 +203,10 @@ Abstract: %s`, criteria, paper.Title, paper.Abstract)
case strings.HasPrefix(upperDecision, "REJECT"): case strings.HasPrefix(upperDecision, "REJECT"):
decision = "REJECT" decision = "REJECT"
default: default:
return nil, fmt.Errorf("invalid decision value: %q (cleaned: %q). Full response:\n%s", return nil, fmt.Errorf("invalid decision value: %q (cleaned: %q)", rawDecision, cleanDecision)
rawDecision, cleanDecision, content)
} }
// Get explanation as everything after the decision line explanation := string(bytes.TrimSpace(bytes.Join(lines[1:], []byte("\n"))))
explanation := strings.TrimSpace(strings.Replace(content, decisionLine, "", 1))
return &decisionResult{ return &decisionResult{
Decision: decision, Decision: decision,