fix(agent): 云端 Agent - 媒体失败可续跑并补齐快照哈希
生成任务失败不再把整轮判死,漏传画布快照由服务端补当前内容哈希,没有偏好层时不暴露空的 profile 读取。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -26,8 +26,23 @@ func cloudAgentCaptureStepSnapshotHash(calls []cloudAgentCall) string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func cloudAgentRewriteCallSnapshotHash(call cloudAgentCall, hash string) cloudAgentCall {
|
||||
args := map[string]any{}
|
||||
if err := json.Unmarshal([]byte(call.Function.Arguments), &args); err != nil {
|
||||
return call
|
||||
}
|
||||
args["snapshotHash"] = hash
|
||||
raw, err := json.Marshal(args)
|
||||
if err != nil {
|
||||
return call
|
||||
}
|
||||
call.Function.Arguments = string(raw)
|
||||
return call
|
||||
}
|
||||
|
||||
// cloudAgentRefreshStepSnapshotHash 把同一轮里后续写操作的 snapshotHash 接到当前画布上。
|
||||
// 只放宽同一轮内、且哈希仍等于本轮读时基线的调用;跨轮和模型自己换过哈希的调用仍走原校验。
|
||||
// generate_media 漏传快照时补当前媒体内容哈希,避免写画布后还要再读一轮。
|
||||
func (s *Service) cloudAgentRefreshStepSnapshotHash(run *model.CloudAgentExecution, state *cloudAgentRuntime, call cloudAgentCall) cloudAgentCall {
|
||||
if state == nil || state.CallIndex <= 0 || len(state.Calls) == 0 || !cloudAgentWrite(call.Function.Name) {
|
||||
return call
|
||||
@@ -35,14 +50,7 @@ func (s *Service) cloudAgentRefreshStepSnapshotHash(run *model.CloudAgentExecuti
|
||||
var current struct {
|
||||
SnapshotHash string `json:"snapshotHash"`
|
||||
}
|
||||
if err := json.Unmarshal([]byte(call.Function.Arguments), ¤t); err != nil || current.SnapshotHash == "" {
|
||||
return call
|
||||
}
|
||||
baseline := state.StepSnapshotHash
|
||||
if baseline == "" {
|
||||
return call
|
||||
}
|
||||
if current.SnapshotHash != baseline {
|
||||
if err := json.Unmarshal([]byte(call.Function.Arguments), ¤t); err != nil {
|
||||
return call
|
||||
}
|
||||
canvas, err := s.repo.CanvasProjectForUser(run.UserID, state.Request.CanvasID)
|
||||
@@ -53,20 +61,27 @@ func (s *Service) cloudAgentRefreshStepSnapshotHash(run *model.CloudAgentExecuti
|
||||
if err != nil {
|
||||
return call
|
||||
}
|
||||
if current.SnapshotHash == "" {
|
||||
if call.Function.Name != "generate_media" {
|
||||
return call
|
||||
}
|
||||
latest := cloudAgentMediaContentHash(doc)
|
||||
if latest == "" {
|
||||
return call
|
||||
}
|
||||
call = cloudAgentRewriteCallSnapshotHash(call, latest)
|
||||
log.Printf("agent step hash filled: run=%s step=%d index=%d tool=%s", run.ID, state.Step, state.CallIndex, call.Function.Name)
|
||||
return call
|
||||
}
|
||||
baseline := state.StepSnapshotHash
|
||||
if baseline == "" || current.SnapshotHash != baseline {
|
||||
return call
|
||||
}
|
||||
latest := cloudAgentCanvasHash(doc)
|
||||
if latest == "" || latest == current.SnapshotHash {
|
||||
return call
|
||||
}
|
||||
args := map[string]any{}
|
||||
if err := json.Unmarshal([]byte(call.Function.Arguments), &args); err != nil {
|
||||
return call
|
||||
}
|
||||
args["snapshotHash"] = latest
|
||||
raw, err := json.Marshal(args)
|
||||
if err != nil {
|
||||
return call
|
||||
}
|
||||
call.Function.Arguments = string(raw)
|
||||
call = cloudAgentRewriteCallSnapshotHash(call, latest)
|
||||
log.Printf("agent step hash refreshed: run=%s step=%d index=%d tool=%s", run.ID, state.Step, state.CallIndex, call.Function.Name)
|
||||
return call
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user