diff --git a/internal/deerflow/client.go b/internal/deerflow/client.go index 680a827..496c25f 100644 --- a/internal/deerflow/client.go +++ b/internal/deerflow/client.go @@ -79,8 +79,16 @@ func (c *Client) AssertModelAvailable(model string) error { return fmt.Errorf("所选模型「%s」不在可用列表中(或不可用)。请换可用模型后重新开始会商,不会自动改用其它模型", want) } +// InitMultiAgentOpts 内网 DeerFlow 校验会商标识时需要的附加字段。 +type InitMultiAgentOpts struct { + DraftID string + TaskID string + RoomSessionID string +} + // InitMultiAgent 建多席线程,返回 agentName → threadId。 -func (c *Client) InitMultiAgent(agentNames []string, mainAgent, model string) (map[string]string, error) { +// draft_id 在内网较新 Gateway 上是「会商标识」,缺了会 4xx。 +func (c *Client) InitMultiAgent(agentNames []string, mainAgent, model string, opts InitMultiAgentOpts) (map[string]string, error) { body := map[string]interface{}{ "agent_names": agentNames, "main_agent_name": mainAgent, @@ -88,6 +96,15 @@ func (c *Client) InitMultiAgent(agentNames []string, mainAgent, model string) (m if m := strings.TrimSpace(model); m != "" && !strings.EqualFold(m, "demo") { body["model"] = m } + if d := strings.TrimSpace(opts.DraftID); d != "" { + body["draft_id"] = d + } + if t := strings.TrimSpace(opts.TaskID); t != "" { + body["task_id"] = t + } + if r := strings.TrimSpace(opts.RoomSessionID); r != "" { + body["room_session_id"] = r + } threadIDs := map[string]string{} var errMsg string err := c.readSSE("/api/multi-agent/init", body, nil, func(event string, parsed map[string]interface{}) (bool, error) { diff --git a/internal/worker/live_runner.go b/internal/worker/live_runner.go index 6f56808..4223f3c 100644 --- a/internal/worker/live_runner.go +++ b/internal/worker/live_runner.go @@ -74,7 +74,25 @@ func (r *LiveChainRunner) Run(job *domain.AnalysisJob) { putProgress(job, 2, "正在初始化 DeerFlow 席位线程…") r.flush(job) r.pullModelFromDB(job) - tids, err := r.DF.InitMultiAgent(agentNames, r.Coord, job.Model) + if strings.TrimSpace(job.DraftID) == "" { + r.fail(job, "缺少会商标识(draftId)。请从页面重新「开始研讨」以先落盘草稿。") + return + } + roomSessionID := asStr(plan["roomSessionId"]) + if roomSessionID == "" { + roomSessionID = "rs_" + jobID + plan["roomSessionId"] = roomSessionID + job.Plan = plan + } + dfTaskID := strings.TrimSpace(job.DraftKey) + if dfTaskID == "" { + dfTaskID = job.TaskID + } + tids, err := r.DF.InitMultiAgent(agentNames, r.Coord, job.Model, deerflow.InitMultiAgentOpts{ + DraftID: job.DraftID, + TaskID: dfTaskID, + RoomSessionID: roomSessionID, + }) if err != nil { r.fail(job, err.Error()) return