- session.* 传输暴露:新增 gateway_api 蓝图(list/create/history),RuntimeService 补 create_session - host Bearer 通道:gateway_auth 双通道认证(host 模式+回环限定,token 存 DATA_DIR/host_api_token),tasks/approval 路由接入 - api_v1 会话路由转调公共入口消双轨,会话索引/列表补齐 run_mode/model_key/custom_prompt_name/personalization_name - flask 包依赖拆解:_flask_bridge 延迟桥接 + context 子包 PEP 562 懒加载,import server.tasks/runtime 不再拉起 flask - 审批链路:mark_expired 终态回写(超时/软停止/取消三路径)+ 终态 TTL 惰性清理(3600s) - 测试 patch 点随迁;全量 75 测试失败恰为 4 项存量,独立启动验收 4/4 全绿 Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
343 lines
16 KiB
Python
343 lines
16 KiB
Python
"""聊天工具循环/任务主流域的后端 i18n 消息包(server/chat_flow_tool_loop.py、
|
||
server/chat_flow_task_main.py、server/deep_compression.py 等聊天管线文件)。
|
||
|
||
由 modules/i18n.py 自动聚合。纯数据,禁止 import。
|
||
"""
|
||
|
||
MESSAGES = {
|
||
# ── 工具审批预览(_build_tool_approval_preview) ──
|
||
"tool_loop.preview_missing_file_path": {
|
||
"zh-CN": "缺少 file_path",
|
||
"en-US": "Missing file_path",
|
||
},
|
||
"tool_loop.preview_missing_replacements": {
|
||
"zh-CN": "缺少 replacements(必须是非空数组)",
|
||
"en-US": "Missing replacements (must be a non-empty array)",
|
||
},
|
||
"tool_loop.preview_path_invalid": {
|
||
"zh-CN": "路径校验失败",
|
||
"en-US": "Path validation failed",
|
||
},
|
||
"tool_loop.preview_file_not_found": {
|
||
"zh-CN": "目标文件不存在,无法生成上下文预览",
|
||
"en-US": "Target file does not exist; cannot generate a context preview",
|
||
},
|
||
"tool_loop.preview_replace_all_type": {
|
||
"zh-CN": "第 1 组 replace_all 必须是 true 或 false",
|
||
"en-US": "replace_all of group 1 must be true or false",
|
||
},
|
||
"tool_loop.preview_short_old_notice": {
|
||
"zh-CN": "提示:第 1 组 old_string 少于3行,允许继续执行;需要批量替换的场景可以单行或不足一行",
|
||
"en-US": "Note: group 1 old_string has fewer than 3 lines; continuing anyway. Single-line or shorter old_string is allowed for batch replacements.",
|
||
},
|
||
"tool_loop.preview_mode_all": {
|
||
"zh-CN": "全部匹配",
|
||
"en-US": "all matches",
|
||
},
|
||
"tool_loop.preview_mode_first": {
|
||
"zh-CN": "首个匹配",
|
||
"en-US": "first match",
|
||
},
|
||
"tool_loop.preview_summary": {
|
||
"zh-CN": "编辑 {file_path},共 {count} 组;预览第 1 组第 {start}-{end} 行({mode})",
|
||
"en-US": "Edit {file_path}, {count} group(s); previewing group 1, lines {start}-{end} ({mode})",
|
||
},
|
||
"tool_loop.preview_old_not_found": {
|
||
"zh-CN": "共 {count} 组替换;未在文件中定位到第 1 组 old_string,显示原始替换内容",
|
||
"en-US": "{count} replacement group(s); could not locate group 1's old_string in the file, showing the raw replacement content",
|
||
},
|
||
"tool_loop.preview_short_old_suffix": {
|
||
"zh-CN": "(第 1 组 old_string 少于3行,已告知并继续)",
|
||
"en-US": " (group 1 old_string has fewer than 3 lines; notice given, continuing)",
|
||
},
|
||
"tool_loop.preview_failed": {
|
||
"zh-CN": "生成编辑预览失败: {error}",
|
||
"en-US": "Failed to generate edit preview: {error}",
|
||
},
|
||
"tool_loop.preview_run_command": {
|
||
"zh-CN": "执行命令: {command}",
|
||
"en-US": "Run command: {command}",
|
||
},
|
||
|
||
# ── 工具审批/拒绝 ──
|
||
"tool_loop.reason_not_provided": {
|
||
"zh-CN": "未提供",
|
||
"en-US": "Not provided",
|
||
},
|
||
"tool_loop.tool_call_rejected": {
|
||
"zh-CN": "工具调用被拒绝\n原因:{reason}",
|
||
"en-US": "Tool call rejected\nReason: {reason}",
|
||
},
|
||
"tool_loop.approval_missing": {
|
||
"zh-CN": "审批请求不存在",
|
||
"en-US": "Approval request not found",
|
||
},
|
||
"tool_loop.approval_user_mismatch": {
|
||
"zh-CN": "审批请求用户不匹配",
|
||
"en-US": "Approval request user mismatch",
|
||
},
|
||
"tool_loop.approval_timeout": {
|
||
"zh-CN": "审批超时",
|
||
"en-US": "Approval timed out",
|
||
},
|
||
"tool_loop.approval_stopped": {
|
||
"zh-CN": "任务已停止,审批不再等待",
|
||
"en-US": "Task stopped; approval no longer awaited",
|
||
},
|
||
"tool_loop.approval_expired": {
|
||
"zh-CN": "审批请求已过期",
|
||
"en-US": "Approval request expired",
|
||
},
|
||
"tool_loop.question_stopped": {
|
||
"zh-CN": "任务已停止,问题不再等待回答。",
|
||
"en-US": "Task stopped; the question is no longer awaiting an answer.",
|
||
},
|
||
"tool_loop.question_expired": {
|
||
"zh-CN": "用户问题已过期。",
|
||
"en-US": "The user question has expired.",
|
||
},
|
||
"tool_loop.awaiting_approval": {
|
||
"zh-CN": "等待用户审批",
|
||
"en-US": "Waiting for user approval",
|
||
},
|
||
"tool_loop.awaiting_approval_retry": {
|
||
"zh-CN": "检测到权限受限,等待用户审批后重试(审批只授予工作区内写权限)",
|
||
"en-US": "Permission is restricted; waiting for user approval before retrying (approval grants workspace-scoped write only)",
|
||
},
|
||
"tool_loop.awaiting_approval_retry_short": {
|
||
"zh-CN": "检测到权限受限,等待用户审批",
|
||
"en-US": "Permission restricted; waiting for user approval",
|
||
},
|
||
"tool_loop.rejected_by_user": {
|
||
"zh-CN": "操作被用户拒绝",
|
||
"en-US": "Operation rejected by the user",
|
||
},
|
||
"tool_loop.rejected_timeout": {
|
||
"zh-CN": "审批超时,操作未执行",
|
||
"en-US": "Approval timed out; the operation was not executed",
|
||
},
|
||
"tool_loop.retry_still_denied_read_scope": {
|
||
"zh-CN": "审批已授予本次工作区内写权限,但命令仍被沙箱拒绝:很可能是读取了授权范围(工作区 / 路径授权 / 系统基础路径)之外的路径。读越界不随审批放行,请引导用户在「路径授权」中添加所需路径后重试。",
|
||
"en-US": "Approval granted workspace-scoped write for this command only, but the sandbox still rejected it: it most likely tried to read paths outside the authorized scope (workspace / path authorization / base system paths). Read escalation is not granted by approval; ask the user to add the needed path via Path Authorization and retry.",
|
||
},
|
||
|
||
# ── ask_user ──
|
||
"tool_loop.question_missing": {
|
||
"zh-CN": "用户问题不存在。",
|
||
"en-US": "The user question no longer exists.",
|
||
},
|
||
"tool_loop.question_user_mismatch": {
|
||
"zh-CN": "用户问题所属用户不匹配。",
|
||
"en-US": "The user question belongs to a different user.",
|
||
},
|
||
"tool_loop.question_timeout": {
|
||
"zh-CN": "等待用户回答超时。",
|
||
"en-US": "Timed out waiting for the user's answer.",
|
||
},
|
||
"tool_loop.user_no_answer": {
|
||
"zh-CN": "用户未回答。",
|
||
"en-US": "No answer from the user.",
|
||
},
|
||
"tool_loop.awaiting_user_answer": {
|
||
"zh-CN": "等待用户回答",
|
||
"en-US": "Waiting for the user's answer",
|
||
},
|
||
|
||
# ── submit_plan(计划批准流) ──
|
||
"tool_loop.submit_plan_not_in_plan_mode": {
|
||
"zh-CN": "当前不在计划模式,submit_plan 不可用。若需要用户确认方案,请直接在回复中输出讨论内容。",
|
||
"en-US": "Not currently in plan mode; submit_plan is unavailable. If you need user confirmation, present the discussion directly in your reply.",
|
||
},
|
||
"tool_loop.submit_plan_missing_file": {
|
||
"zh-CN": "缺少 plan_file 参数。请先把计划写入 .astrion/plan/ 下的 .md 文件再提交。",
|
||
"en-US": "Missing plan_file parameter. Write the plan to a .md file under .astrion/plan/ first, then submit.",
|
||
},
|
||
"tool_loop.submit_plan_invalid_path": {
|
||
"zh-CN": "计划文件路径无效:{error}",
|
||
"en-US": "Invalid plan file path: {error}",
|
||
},
|
||
"tool_loop.submit_plan_wrong_dir": {
|
||
"zh-CN": "计划文件必须位于工作区 .astrion/plan/ 目录下。",
|
||
"en-US": "The plan file must be located in the workspace .astrion/plan/ directory.",
|
||
},
|
||
"tool_loop.submit_plan_not_md": {
|
||
"zh-CN": "计划文件必须是 .md 文档。",
|
||
"en-US": "The plan file must be a .md document.",
|
||
},
|
||
"tool_loop.submit_plan_file_missing": {
|
||
"zh-CN": "计划文件不存在:{plan_file}。请先写入计划文档再提交。",
|
||
"en-US": "Plan file not found: {plan_file}. Write the plan document first, then submit.",
|
||
},
|
||
"tool_loop.submit_plan_read_failed": {
|
||
"zh-CN": "读取计划文件失败:{error}",
|
||
"en-US": "Failed to read the plan file: {error}",
|
||
},
|
||
"tool_loop.submit_plan_empty": {
|
||
"zh-CN": "计划文档还是空的,请先写入计划内容再提交。",
|
||
"en-US": "The plan document is still empty. Write the plan content first, then submit.",
|
||
},
|
||
"tool_loop.awaiting_plan_approval": {
|
||
"zh-CN": "等待用户批准计划",
|
||
"en-US": "Waiting for the user to approve the plan",
|
||
},
|
||
"tool_loop.plan_switch_note_ok": {
|
||
"zh-CN": "系统已自动切换到执行模式,权限已解除只读锁定。",
|
||
"en-US": "The system has automatically switched to execute mode; the read-only permission lock has been lifted.",
|
||
},
|
||
"tool_loop.plan_switch_note_failed": {
|
||
"zh-CN": "(切换到执行模式失败:{error},可请用户手动切换运行模式)",
|
||
"en-US": "(Failed to switch to execute mode: {error}; you may ask the user to switch the work mode manually)",
|
||
},
|
||
"tool_loop.plan_approved": {
|
||
"zh-CN": "用户已批准你的计划。{switch_note}请立即按照计划开始实施。",
|
||
"en-US": "The user has approved your plan. {switch_note}Start implementing it now.",
|
||
},
|
||
"tool_loop.plan_approved_comment": {
|
||
"zh-CN": "\n用户批准时附带的意见:{comment}",
|
||
"en-US": "\nComment from the user on approval: {comment}",
|
||
},
|
||
"tool_loop.plan_rejected": {
|
||
"zh-CN": "用户拒绝了这份计划,你仍处于计划模式。请根据用户的意见修订计划文档后重新调用 submit_plan 提交。",
|
||
"en-US": "The user rejected this plan; you are still in plan mode. Revise the plan document based on the user's feedback and submit again via submit_plan.",
|
||
},
|
||
"tool_loop.plan_rejected_comment": {
|
||
"zh-CN": "\n用户的意见:{comment}",
|
||
"en-US": "\nUser feedback: {comment}",
|
||
},
|
||
"tool_loop.plan_rejected_no_comment": {
|
||
"zh-CN": "\n用户没有填写具体意见,可在回复中询问用户需要调整的方向。",
|
||
"en-US": "\nThe user did not provide specific feedback; you may ask in your reply which direction to adjust.",
|
||
},
|
||
"tool_loop.plan_no_decision": {
|
||
"zh-CN": "计划批准未得到用户决定(可能已超时或请求丢失),可重新调用 submit_plan 提交。",
|
||
"en-US": "No user decision was received for the plan approval (possibly timed out or the request was lost); you may submit again via submit_plan.",
|
||
},
|
||
"tool_loop.workflow_tool_error": {
|
||
"zh-CN": "工作流工具执行异常:{error}",
|
||
"en-US": "Workflow tool execution error: {error}",
|
||
},
|
||
|
||
# ── 工具执行状态/取消 ──
|
||
"tool_loop.cancelled_by_user": {
|
||
"zh-CN": "命令执行被用户取消",
|
||
"en-US": "Command execution cancelled by the user",
|
||
},
|
||
"tool_loop.tool_no_result": {
|
||
"zh-CN": "工具未返回结果",
|
||
"en-US": "The tool returned no result",
|
||
},
|
||
"tool_loop.tool_not_allowed": {
|
||
"zh-CN": "工具 {tool} 不在当前模型可用工具列表中,已拒绝执行。",
|
||
"en-US": "Tool {tool} is not in the list of tools available to the current model; execution refused.",
|
||
},
|
||
"tool_loop.permission_denied_default": {
|
||
"zh-CN": "当前权限模式不允许执行该工具。",
|
||
"en-US": "The current permission mode does not allow executing this tool.",
|
||
},
|
||
"tool_loop.image_path_recorded": {
|
||
"zh-CN": "系统已记录图片路径(不再附带二进制数据): {path}",
|
||
"en-US": "Image path recorded by the system (binary data no longer attached): {path}",
|
||
},
|
||
"tool_loop.video_path_recorded": {
|
||
"zh-CN": "系统已记录视频路径(不再附带二进制数据): {path}",
|
||
"en-US": "Video path recorded by the system (binary data no longer attached): {path}",
|
||
},
|
||
"tool_loop.deep_compression_failed": {
|
||
"zh-CN": "自动深层压缩失败",
|
||
"en-US": "Automatic deep compression failed",
|
||
},
|
||
|
||
# ── 任务主流(chat_flow_task_main) ──
|
||
"task_main.sub_agent_done_line": {
|
||
# i18n-match:前端 history.ts / ui/shared.ts 对子智能体完成通知有识别正则
|
||
"zh-CN": "子智能体{agent_id} ({summary}) 已完成任务。",
|
||
"en-US": "Sub-agent {agent_id} ({summary}) has completed its task.",
|
||
},
|
||
"task_main.deliverables_line": {
|
||
"zh-CN": "交付目录:{dir}",
|
||
"en-US": "Deliverables: {dir}",
|
||
},
|
||
"task_main.context_overflow": {
|
||
"zh-CN": "当前对话上下文已达 {current} tokens,超过模型上限 {max},请先使用压缩功能或清理对话后再试。",
|
||
"en-US": "This conversation's context has reached {current} tokens, exceeding the model limit of {max}. Please use compression or clear the conversation before retrying.",
|
||
},
|
||
"task_main.context_overflow_title": {
|
||
"zh-CN": "上下文过长",
|
||
"en-US": "Context too long",
|
||
},
|
||
"task_main.context_usage_hint": {
|
||
"zh-CN": "当前对话上下文约占 {percent}%({current}/{max}),建议使用压缩功能。",
|
||
"en-US": "This conversation is using about {percent}% of its context ({current}/{max}); compression is recommended.",
|
||
},
|
||
"task_main.task_stopped": {
|
||
"zh-CN": "任务已停止",
|
||
"en-US": "Task stopped",
|
||
},
|
||
"task_main.max_tool_calls_reached": {
|
||
"zh-CN": "⚠️ 已达到最大工具调用次数限制 ({limit}),任务结束。",
|
||
"en-US": "⚠️ Maximum tool call limit reached ({limit}); task ended.",
|
||
},
|
||
"task_main.quota_exceeded": {
|
||
"zh-CN": "配额已达到上限,暂时无法继续调用模型。",
|
||
"en-US": "Quota limit reached; model calls are temporarily unavailable.",
|
||
},
|
||
"task_main.auto_fix_instruction": {
|
||
"zh-CN": "你使用了错误的格式输出工具调用。请使用正确的工具调用格式而不是直接输出JSON。根据当前进度继续执行任务。",
|
||
"en-US": "You output a tool call in the wrong format. Use the proper tool call format instead of raw JSON, and continue the task from the current progress.",
|
||
},
|
||
"task_main.auto_fix_notice": {
|
||
"zh-CN": "⚠️ 自动修复: {message}",
|
||
"en-US": "⚠️ Auto-fix: {message}",
|
||
},
|
||
"task_main.auto_fix_failed": {
|
||
"zh-CN": "⌘ 工具调用格式错误,自动修复失败。请手动检查并重试。",
|
||
"en-US": "⌘ Tool call format error; auto-fix failed. Please check manually and retry.",
|
||
},
|
||
"task_main.repeat_tool_warning": {
|
||
"zh-CN": "⚠️ 检测到重复调用 {tool} 工具 {limit} 次,可能存在循环。",
|
||
"en-US": "⚠️ Detected {limit} consecutive calls to {tool}; a loop may be occurring.",
|
||
},
|
||
"task_main.repeat_tool_terminated": {
|
||
"zh-CN": "⌘ 工具 {tool} 重复调用过多,任务终止。",
|
||
"en-US": "⌘ Tool {tool} was called too many times; task terminated.",
|
||
},
|
||
|
||
# ── 深层压缩(deep_compression) ──
|
||
"deep_compression.conversation_not_found": {
|
||
"zh-CN": "对话不存在: {conversation_id}",
|
||
"en-US": "Conversation not found: {conversation_id}",
|
||
},
|
||
"deep_compression.in_progress": {
|
||
"zh-CN": "对话正在压缩中",
|
||
"en-US": "The conversation is being compressed",
|
||
},
|
||
"deep_compression.load_failed": {
|
||
"zh-CN": "加载目标对话失败: {error}",
|
||
"en-US": "Failed to load the target conversation: {error}",
|
||
},
|
||
"deep_compression.empty_model_content": {
|
||
"zh-CN": "模型返回空内容",
|
||
"en-US": "The model returned empty content",
|
||
},
|
||
"deep_compression.unknown_reason": {
|
||
"zh-CN": "未知原因",
|
||
"en-US": "unknown reason",
|
||
},
|
||
"deep_compression.summary_failed": {
|
||
"zh-CN": "生成总结失败({reason})",
|
||
"en-US": "Failed to generate the summary ({reason})",
|
||
},
|
||
"deep_compression.summary_failed_notice": {
|
||
"zh-CN": "自动压缩总结失败,将使用失败占位文本:{reason}",
|
||
"en-US": "Automatic compression summary failed; fallback placeholder text will be used: {reason}",
|
||
},
|
||
"deep_compression.marks_save_failed": {
|
||
"zh-CN": "压缩标记保存失败:{error}",
|
||
"en-US": "Failed to save compression marks: {error}",
|
||
},
|
||
"deep_compression.stats_reset_failed": {
|
||
"zh-CN": "压缩后重置上下文统计失败:{error}",
|
||
"en-US": "Failed to reset context statistics after compression: {error}",
|
||
},
|
||
}
|