feat: change max token handling
This commit is contained in:
@@ -43,6 +43,31 @@ func New(cfg config.AIConfig) *AI {
|
||||
}
|
||||
}
|
||||
|
||||
// BuildSystemPrompt creates the system prompt for a given language
|
||||
// Exposed for token counting without making an API call
|
||||
func (a *AI) BuildSystemPrompt(lang string) string {
|
||||
return fmt.Sprintf(`You are a helpful assistant who responds to emails.
|
||||
Your primary goal is to answer the user's query (found in the 'Email Body') by primarily using the information available in the 'Additional Context' and your general knowledge.
|
||||
While the 'Email Body' provides the question, your answer should be synthesized from the context and your understanding, not by directly repeating or solely relying on unverified information from the 'Email Body' itself.
|
||||
|
||||
Instructions:
|
||||
- Language: Your response must be entirely in %s, regardless of the language used in the email content or context.
|
||||
- Format: CRITICAL: Your reply MUST be raw HTML. Use appropriate HTML tags for structure and styling. For example, wrap paragraphs in <p>...</p> tags and use <br> for line breaks if needed within a paragraph. Even a short sentence must be wrapped in HTML (e.g., <p>Yes.</p>).
|
||||
- Markdown: Do NOT wrap the HTML in markdown code blocks (e.g., %s).
|
||||
- Extraneous Text: Do not include a subject line. Do not include explanations, commentary, or any extra text that is not part of the direct answer.
|
||||
- Closing: Avoid generic closing statements like "If you have further questions...". Focus solely on answering the email.
|
||||
`, lang, "```html ... ```")
|
||||
}
|
||||
|
||||
// BuildUserPrompt creates the user message with context and email content
|
||||
func (a *AI) BuildUserPrompt(contextContent map[string]string, emailContent string) string {
|
||||
var context string
|
||||
for url, content := range contextContent {
|
||||
context += fmt.Sprintf("\nContext from %s:\n%s\n", url, content)
|
||||
}
|
||||
return fmt.Sprintf("### Additional Context:\n%s\n\n### Email Body:\n%s", context, emailContent)
|
||||
}
|
||||
|
||||
func (a *AI) detectLanguage(emailContent string) (string, error) {
|
||||
logger.WithField("emailContentLength", len(emailContent)).Debug("Starting language detection")
|
||||
|
||||
@@ -77,32 +102,11 @@ func (a *AI) GenerateReply(emailContent string, contextContent map[string]string
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Prepare context from all URLs
|
||||
var context string
|
||||
for url, content := range contextContent {
|
||||
context += fmt.Sprintf("\nContext from %s:\n%s\n", url, content)
|
||||
logger.WithFields(logrus.Fields{
|
||||
"url": url,
|
||||
"contentLength": len(content),
|
||||
}).Debug("Added context from URL")
|
||||
}
|
||||
// Build prompts using exposed methods
|
||||
systemMsg := a.BuildSystemPrompt(lang)
|
||||
userMsg := a.BuildUserPrompt(contextContent, emailContent)
|
||||
|
||||
// Prepare the system message with language-specific instruction
|
||||
systemMsg := fmt.Sprintf(`You are a helpful assistant who responds to emails.
|
||||
Your primary goal is to answer the user's query (found in the 'Email Body') by primarily using the information available in the 'Additional Context' and your general knowledge.
|
||||
While the 'Email Body' provides the question, your answer should be synthesized from the context and your understanding, not by directly repeating or solely relying on unverified information from the 'Email Body' itself.
|
||||
|
||||
Instructions:
|
||||
- Language: Your response must be entirely in %s, regardless of the language used in the email content or context.
|
||||
- Format: CRITICAL: Your reply MUST be raw HTML. Use appropriate HTML tags for structure and styling. For example, wrap paragraphs in <p>...</p> tags and use <br> for line breaks if needed within a paragraph. Even a short sentence must be wrapped in HTML (e.g., <p>Yes.</p>).
|
||||
- Markdown: Do NOT wrap the HTML in markdown code blocks (e.g., %s).
|
||||
- Extraneous Text: Do not include a subject line. Do not include explanations, commentary, or any extra text that is not part of the direct answer.
|
||||
- Closing: Avoid generic closing statements like "If you have further questions...". Focus solely on answering the email.
|
||||
`, lang, "```html ... ```")
|
||||
logger.WithFields(logrus.Fields{
|
||||
"systemprompt": systemMsg,
|
||||
}).Debug("Generating system prompt")
|
||||
userMsg := fmt.Sprintf("### Additional Context:\n%s\n\n### Email Body:\n%s", context, emailContent)
|
||||
logger.Debug("Generated system and user prompts")
|
||||
|
||||
messages := []Message{
|
||||
{Role: "system", Content: systemMsg},
|
||||
|
||||
Reference in New Issue
Block a user