Feature: Add detailed LLM interaction logging for debugging
This commit is contained in:
		
							parent
							
								
									54593c31da
								
							
						
					
					
						commit
						d547f472ca
					
				
							
								
								
									
										71
									
								
								llm.go
									
									
									
									
									
								
							
							
						
						
									
										71
									
								
								llm.go
									
									
									
									
									
								
							@ -197,6 +197,12 @@ func processArticleBatch(ollamaURL, model string, articles []Article) (map[strin
 | 
			
		||||
	logInfo("api", "Sending request to Ollama", requestDetails)
 | 
			
		||||
	startTime := time.Now()
 | 
			
		||||
 | 
			
		||||
	// Log the complete batch prompt for debugging
 | 
			
		||||
	logInfo("summarize_prompt", "Complete prompt sent to LLM for summarization", map[string]interface{}{
 | 
			
		||||
		"batchSize": len(articles),
 | 
			
		||||
		"prompt":    batchPrompt.String(),
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	// Pretty print request JSON for logging
 | 
			
		||||
	payloadBytes, err := json.MarshalIndent(payload, "", "  ")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@ -206,6 +212,15 @@ func processArticleBatch(ollamaURL, model string, articles []Article) (map[strin
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Log the request payload
 | 
			
		||||
	logInfo("summarize_request", "Summarization API request", map[string]interface{}{
 | 
			
		||||
		"model":       model,
 | 
			
		||||
		"batchSize":   len(articles),
 | 
			
		||||
		"apiEndpoint": ollamaURL + "/api/chat",
 | 
			
		||||
		"payload":     string(payloadBytes),
 | 
			
		||||
		"articleIDs":  extractArticleIDs(articles),
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	req, err := http.NewRequest("POST", ollamaURL+"/api/chat", bytes.NewReader(payloadBytes))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logInfo("api", "Request creation error", map[string]interface{}{
 | 
			
		||||
@ -235,6 +250,14 @@ func processArticleBatch(ollamaURL, model string, articles []Article) (map[strin
 | 
			
		||||
	bodyBytes, _ := io.ReadAll(resp.Body)
 | 
			
		||||
	apiDuration := time.Since(startTime)
 | 
			
		||||
 | 
			
		||||
	// Log the raw response for debugging
 | 
			
		||||
	logInfo("summarize_response", "Raw LLM response for summarization", map[string]interface{}{
 | 
			
		||||
		"statusCode":   resp.StatusCode,
 | 
			
		||||
		"response":     string(bodyBytes),
 | 
			
		||||
		"durationMs":   apiDuration.Milliseconds(),
 | 
			
		||||
		"msPerArticle": apiDuration.Milliseconds() / int64(len(articles)),
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	// Pretty print response JSON for debugging
 | 
			
		||||
	var prettyJSON bytes.Buffer
 | 
			
		||||
	err = json.Indent(&prettyJSON, bodyBytes, "", "  ")
 | 
			
		||||
@ -404,6 +427,12 @@ DO NOT include any other text, explanation, or formatting in your response, ONLY
 | 
			
		||||
		strings.Join(recentMessages, "\n"),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	// Log the complete prompt for debugging purposes
 | 
			
		||||
	logInfo("redundancy_prompt", "Complete prompt sent to LLM for redundancy check", map[string]interface{}{
 | 
			
		||||
		"candidateID": candidate.ID,
 | 
			
		||||
		"prompt":      prompt,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	// Get the URL for the Ollama API
 | 
			
		||||
	ollamaURL := os.Getenv("OLLAMA_URL")
 | 
			
		||||
	if ollamaURL == "" {
 | 
			
		||||
@ -433,6 +462,16 @@ DO NOT include any other text, explanation, or formatting in your response, ONLY
 | 
			
		||||
		return false, "", fmt.Errorf("error marshaling request: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Log the request payload
 | 
			
		||||
	var prettyPayload bytes.Buffer
 | 
			
		||||
	if err := json.Indent(&prettyPayload, payloadBytes, "", "  "); err == nil {
 | 
			
		||||
		logInfo("redundancy_request", "Redundancy check API request", map[string]interface{}{
 | 
			
		||||
			"candidateID": candidate.ID,
 | 
			
		||||
			"payload":     prettyPayload.String(),
 | 
			
		||||
			"url":         ollamaURL + "/api/chat",
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Create the request
 | 
			
		||||
	req, err := http.NewRequest("POST", ollamaURL+"/api/chat", bytes.NewReader(payloadBytes))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@ -483,6 +522,23 @@ DO NOT include any other text, explanation, or formatting in your response, ONLY
 | 
			
		||||
		return false, "Failed to read redundancy check response", nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Log the raw response for debugging
 | 
			
		||||
	var prettyResponse bytes.Buffer
 | 
			
		||||
	if err := json.Indent(&prettyResponse, bodyBytes, "", "  "); err == nil {
 | 
			
		||||
		logInfo("redundancy_response", "Raw LLM response for redundancy check", map[string]interface{}{
 | 
			
		||||
			"candidateID": candidate.ID,
 | 
			
		||||
			"statusCode":  resp.StatusCode,
 | 
			
		||||
			"response":    prettyResponse.String(),
 | 
			
		||||
		})
 | 
			
		||||
	} else {
 | 
			
		||||
		// If we can't pretty print, log as is
 | 
			
		||||
		logInfo("redundancy_response", "Raw LLM response for redundancy check (not JSON)", map[string]interface{}{
 | 
			
		||||
			"candidateID": candidate.ID,
 | 
			
		||||
			"statusCode":  resp.StatusCode,
 | 
			
		||||
			"response":    string(bodyBytes),
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Parse the response
 | 
			
		||||
	var result struct {
 | 
			
		||||
		Message struct {
 | 
			
		||||
@ -501,6 +557,12 @@ DO NOT include any other text, explanation, or formatting in your response, ONLY
 | 
			
		||||
	content := result.Message.Content
 | 
			
		||||
	content = strings.TrimSpace(content)
 | 
			
		||||
 | 
			
		||||
	// Log the extracted content
 | 
			
		||||
	logInfo("redundancy_content", "Extracted content from LLM response", map[string]interface{}{
 | 
			
		||||
		"candidateID": candidate.ID,
 | 
			
		||||
		"content":     content,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	// Handle case where the response might be wrapped in markdown code blocks
 | 
			
		||||
	if strings.HasPrefix(content, "```json") {
 | 
			
		||||
		content = strings.TrimPrefix(content, "```json")
 | 
			
		||||
@ -551,3 +613,12 @@ DO NOT include any other text, explanation, or formatting in your response, ONLY
 | 
			
		||||
 | 
			
		||||
	return redundancyResult.IsRedundant, redundancyResult.Reason, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Helper function to extract article IDs for logging
 | 
			
		||||
func extractArticleIDs(articles []Article) []string {
 | 
			
		||||
	ids := make([]string, len(articles))
 | 
			
		||||
	for i, article := range articles {
 | 
			
		||||
		ids[i] = article.ID
 | 
			
		||||
	}
 | 
			
		||||
	return ids
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user