Files
ttstd-infinite-canvas/backend/internal/app/cloud_agent_prompt_context.go
ddcat666 1bbc95b996 fix(agent): Agent 运行 - 重复读取改为软收敛并保留可纠正的媒体失败原因
重复只读和同版本识图不再把运行标成失败,下一步暂时收起只读工具。媒体能力错误改为可纠正,准入失败保留安全原因。
2026-10-10 20:20:09 +08:00

56 lines
2.3 KiB
Go

package app
import "encoding/json"
const (
cloudAgentMaxToolCalls = 8
cloudAgentMaxOutputBytes = 32000
cloudAgentRuntimeContextMarker = "【运行状态】"
cloudAgentContextSourceKey = "agentContextSource"
)
type cloudAgentRuntimeContextKind string
const (
cloudAgentContextPlan cloudAgentRuntimeContextKind = "plan_state"
cloudAgentContextPendingPlan cloudAgentRuntimeContextKind = "pending_plan"
cloudAgentContextEmptyOutput cloudAgentRuntimeContextKind = "empty_output"
cloudAgentContextInvalidOutput cloudAgentRuntimeContextKind = "invalid_output"
cloudAgentContextTruncatedArguments cloudAgentRuntimeContextKind = "truncated_tool_arguments"
cloudAgentContextReadLoop cloudAgentRuntimeContextKind = "read_loop"
)
// Only serializable fact fields belong here. Behavioral instructions live in
// prompts/agent-system-policy.md and share its version/hash contract.
type cloudAgentRuntimeContext struct {
Source string `json:"source"`
Kind cloudAgentRuntimeContextKind `json:"kind"`
Items []cloudAgentPlanItem `json:"items,omitempty"`
PendingTitle string `json:"pendingTitle,omitempty"`
LatestUserMessage string `json:"latestUserMessage,omitempty"`
Detail string `json:"detail,omitempty"`
MaxToolCalls int `json:"maxToolCalls,omitempty"`
MaxOutputBytes int `json:"maxOutputBytes,omitempty"`
}
func cloudAgentRuntimeMessage(context cloudAgentRuntimeContext) map[string]any {
context.Source = "runtime"
// The closed struct contains only strings, integers and serializable plan items.
encoded, _ := json.Marshal(context)
return map[string]any{
"role": "user", "content": cloudAgentRuntimeContextMarker + string(encoded),
cloudAgentContextSourceKey: "runtime",
}
}
func cloudAgentLatestUserInstruction(messages []map[string]any) string {
for i := len(messages) - 1; i >= 0; i-- {
message := messages[i]
source := stringField(message, cloudAgentContextSourceKey)
if stringField(message, "role") == "user" && (source == "" || source == "user_interjection") {
return stringField(message, "content")
}
}
return ""
}