feat: add AI chat for repports

This commit is contained in:
2026-04-28 07:19:49 +02:00
parent 087bcab16b
commit 490a364c00
10 changed files with 340 additions and 5 deletions

View File

@ -296,6 +296,60 @@ func (p *Pipeline) callProviderForReport(ctx context.Context, excerpt, question
return provider.Summarize(ctx, prompt, GenOptions{Think: true, NumCtx: 16384})
}
// GenerateReportMessageAsync génère une réponse de conversation en arrière-plan.
// history contient tous les messages précédents (user + assistant), dans l'ordre.
func (p *Pipeline) GenerateReportMessageAsync(messageID string, report *models.Report, history []models.ReportMessage, mgr *ReportManager) {
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
mgr.Register(messageID, cancel)
go func() {
defer cancel()
defer mgr.Remove(messageID)
answer, err := p.callProviderForConversation(ctx, report, history)
if err != nil {
if ctx.Err() != nil {
return
}
_ = p.repo.UpdateReportMessage(messageID, "error", err.Error())
return
}
_ = p.repo.UpdateReportMessage(messageID, "done", answer)
}()
}
func (p *Pipeline) callProviderForConversation(ctx context.Context, report *models.Report, history []models.ReportMessage) (string, error) {
provider, _, err := p.buildProviderForRole("report")
if err != nil {
return "", err
}
var sb strings.Builder
sb.WriteString("Tu es un assistant financier expert engagé dans une conversation avec un trader.\n\n")
sb.WriteString("## Contexte initial\n")
sb.WriteString("Extraits sélectionnés :\n")
sb.WriteString(report.ContextExcerpt)
sb.WriteString("\n\nQuestion initiale : ")
sb.WriteString(report.Question)
sb.WriteString("\nRéponse initiale : ")
sb.WriteString(report.Answer)
sb.WriteString("\n\n## Suite de la conversation\n")
for _, msg := range history {
if msg.Role == "user" {
sb.WriteString("Trader : ")
} else {
sb.WriteString("Assistant : ")
}
sb.WriteString(msg.Content)
sb.WriteString("\n")
}
sb.WriteString("\nRéponds en français, de façon précise et orientée trading.")
return provider.Summarize(ctx, sb.String(), GenOptions{Think: true, NumCtx: 16384})
}
func buildPrompt(systemPrompt string, symbols []string, articles []models.Article, tz string) string {
var sb strings.Builder
sb.WriteString(systemPrompt)