Files
eightbf-analysis-go/internal/worker/prompts.go
T
gozerosandCursor 0c45b86d67 chore: 初始化 eightbf-analysis-go(对齐 Java 会商作业服务)
Go 实现 /api/v1/analysis 契约、Demo/Live Worker、DeerFlow SSE;含设计文档与冒烟脚本。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-11-03 00:13:46 +08:00

120 lines
4.6 KiB
Go

package worker
import (
"fmt"
"strings"
)
// 链条提示词(与 Java ChainPrompts / 前端历史行为对齐)。
const Lang = "【语言要求】你的全部可见输出(派活说明、任务描述、分析、结论)必须使用简体中文;" +
"禁止用英文句子作答。agent_name / 技能名等标识符可保持原文,正文一律中文。"
const Closeout = "各链条席位已按顺序完成发言,请你综合所有席位的交付,输出最终方案与结论。不要再派活、不要再向任何席位分配任务。\n" + Lang
func BuildSeed(progress map[string]interface{}) string {
if progress == nil {
return "请基于用户任务意图,调度子智能体完成研讨。"
}
var sb strings.Builder
title := asStr(progress["title"])
desc := asStr(progress["description"])
if payload, ok := progress["payload"].(map[string]interface{}); ok {
if intent, ok := payload["intent"].(map[string]interface{}); ok {
obj := firstNonEmpty(asStr(intent["objective"]), asStr(intent["summary"]), title)
if obj != "" {
sb.WriteString(obj)
}
if list, ok := intent["constraints"].([]interface{}); ok && len(list) > 0 {
sb.WriteString("\n\n约束条件:\n")
for _, c := range list {
sb.WriteString("- ")
sb.WriteString(fmt.Sprint(c))
sb.WriteByte('\n')
}
}
if list, ok := intent["assumptions"].([]interface{}); ok && len(list) > 0 {
sb.WriteString("\n关键假设:\n")
for _, a := range list {
sb.WriteString("- ")
sb.WriteString(fmt.Sprint(a))
sb.WriteByte('\n')
}
}
}
}
if sb.Len() == 0 {
sb.WriteString(title)
if desc != "" {
if sb.Len() > 0 {
sb.WriteByte('\n')
}
sb.WriteString(desc)
}
}
if sb.Len() == 0 {
return "请基于用户此前澄清的任务意图,调度子智能体完成研讨。"
}
sb.WriteString("\n\n用户已经过任务理解智能体澄清,以上信息可以直接作为研讨依据。请基于上述目标与约束,在圆桌内调度合适的子智能体完成研讨,不要再反问用户。")
return sb.String()
}
func BuildLeaderTask(seed string, position, total int, seatAgentID, seatName string, isFirst bool) string {
ordinal := fmt.Sprintf("%d/%d", position+1, total)
if isFirst {
return "这是一次【按业务链条顺序】进行的多智能体圆桌研讨。任务背景如下:\n" +
seed + "\n\n" +
"本次研讨严格按预设链条顺序进行,共 " + fmt.Sprint(total) + " 个席位,现在是第 " + ordinal + " 个席位。\n" +
"请你作为总控,通过 agent_orchestration 技能**仅**向智能体「" + seatName +
"」(agent_name: " + seatAgentID + ")派活,结合任务背景为它分配聚焦其职责的本轮任务。\n" +
"不要派给其他任何智能体,也不要自己直接作答或给出最终结论。\n" +
"派活说明与交给该席位的任务正文必须是简体中文(可写成:本轮派活给「" +
seatName + "」……),不要输出英文派活句。\n" + Lang
}
return "链条研讨继续,现在轮到第 " + ordinal + " 个席位。\n" +
"请你作为总控,结合此前各席位已完成的交付,通过 agent_orchestration 技能**仅**向智能体「" +
seatName + "」(agent_name: " + seatAgentID +
")派活,为它分配承接前序结论、聚焦其职责的本轮任务。\n" +
"不要派给其他任何智能体,也不要自己直接作答或给出最终结论。\n" +
"派活说明与任务正文必须是简体中文。\n" + Lang
}
func PickChainTask(dispatched [][2]string, leaderContent, seatAgentID, seatName string) string {
wanted := strings.ToLower(seatAgentID)
for _, row := range dispatched {
if strings.ToLower(row[0]) == wanted && strings.TrimSpace(row[1]) != "" {
return withLang(row[1])
}
}
for _, row := range dispatched {
if strings.TrimSpace(row[1]) != "" {
return withLang(row[1])
}
}
if strings.TrimSpace(leaderContent) != "" {
return withLang("请你作为「" + seatName + "」,基于以下总控说明与此前各席位的交付,从你的专业职责出发给出你的分析与交付:\n" + strings.TrimSpace(leaderContent))
}
return withLang("请你作为「" + seatName + "」,基于任务背景与此前各席位的交付,从你的专业职责出发给出你的分析与交付。")
}
func withLang(body string) string { return Lang + "\n" + body }
func asStr(v interface{}) string {
if v == nil {
return ""
}
if s, ok := v.(string); ok {
return strings.TrimSpace(s)
}
return strings.TrimSpace(fmt.Sprint(v))
}
func firstNonEmpty(parts ...string) string {
for _, p := range parts {
if strings.TrimSpace(p) != "" {
return strings.TrimSpace(p)
}
}
return ""
}