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 "" }