跳转到内容
Crystal CodeDocs
简简体中文

会话与回合

一条用户消息是一个回合:

  1. 快照记录和当前工具定义。
  2. 流式发送一次聊天请求。每个增量到达时作为事件发布。如果该轮因可重试的提供商错误失败(HTTP 429、404、408、5xx、超时、网络或不完整流),按指数退避等待并重复同一轮。config.json 中的 retry 策略设置上限和时机(默认:五次重试、2 秒基数、因子 2、25% 抖动、没有 Retry-After 时 30 秒上限);存在时遵循 Retry-After 或 retry-after-ms。引擎发布 RetryScheduled;终端进度行显示 Retrying In Ns (Attempt K) 并倒数剩余等待,记录打印 retrying model request 加上操作者消息。失败尝试的活动流文本被丢弃。HTTP 401、403、配额、invalid_prompt 和上下文溢出不重试。请求体仍在写入时关闭的连接只重试一次,以便替换过期连接,然后用传输原因报告,而不是用完其余预算。用户取消仍然立即中断。
  3. 选择候选零。
  4. 结束原因不是正常停止或工具请求时,在工具之前停止。length 保留助手文本,丢弃工具调用,并以 output_truncated 停止。内容过滤保留文本并以 content_filtered 停止。任何其他原因以 failed 停止,并发布 Model stopped with finish reason '<value>'. 这些停止不压缩。
  5. 候选含有工具调用时,整批通过 ToolExecutor 执行,或对支持图像的回合通过多模态桥执行(两种情况下都先审批)。放不进剩余工具调用预算的批次以 tool_call_limit_reached 停止,保留助手文本和推理,并把这些调用留在记录之外。
  6. 追加精确的 ToolResult 值。
  7. 重复,直到候选没有工具调用、配置的上限停止回合,或用户取消。每轮模型之前,如果估计的记录或上一轮模型用量超预算,则压缩。仍超预算时一次失败的压缩会停止回合(context_overflow)。重试后仍存在的提供商失败以 failed 停止回合:发布错误,进度行清除,记录(包括该用户消息)被保存。

文本和支持图像的回合共享 config.json 中的 executionBudget。每回合默认上限是 1024 次模型调用、8192 次工具调用和 7 天。该设置可以是三者都 "unlimited",或带可选 maximumModelCalls、maximumToolCalls 和 maximumDurationSeconds 字段的对象。省略的字段保持默认;null 移除该字段的上限。有限时,模型调用和时长必须为正。工具调用可以为零以阻止工具执行。时长必须适合运行时计时器。上限无限的回合仍会在模型完成、用户取消或上下文压缩耗尽时结束。此宿主拥有活动回合预算;它遵循 Crystal AgentRunLimits 的可空上限语义,但不把 Agent 用于流式 UI 回合。

内置 bash 有自己的每命令计时器,即 config.json 中的 bashTimeoutSeconds。省略它保持 600 秒。null 或 "unlimited" 禁用该计时器。至多运行时计时器上限的正整数替换它。用户取消和回合预算仍会停止命令。外部工具集保留自己的 timeoutSeconds,默认 120 秒,不跟随 bashTimeoutSeconds。

  1. 完成的回合之后,根据该上一轮报告的用量和估计的模型上下文考虑压缩。/compact(别名 /summarize)立即总结较早的回合,不等待该阈值。压缩在前端等待的引擎调用内运行;同时前端保持自己的界面活动(终端宿主泵送画面,使旋转指示、调整大小和输入框保持活动)。

会话保持两份记录。存档在提交时追加用户文本、助手文本、推理、工具调用和工具结果,压缩不改变它。模型上下文是发给模型的列表。压缩用活动系统提示、摘要和最近尾部替换该列表。用量、审批审查和之后的模型调用读取模型上下文。恢复、分叉重放和导出读取存档。/stats 的工具占比读取存档,没有存档的会话文件从其已保存项计数工具。存档存在之前写入的会话文件把已保存项作为存档加载。任一记录仍提到图像时,图像保留。/clear 丢弃两者。

回合运行时输入框保持打开。带文本的 Enter 把后续请求入队(FIFO)。排队项留在输入框上方的面板中,直到发送。当前工具批次结束,或回合(思考或对话)结束时发送队列。已有后续请求时的空 Enter 会中断回合,或在压缩仍在运行时中断压缩,使队列立即发送。队列为空时的空 Enter 不停止回合。/quit、/clear、/resume 和 /fork 停止忙碌的回合然后运行,包括其他会话工作仍在栈上时提交的命令。/clear、/resume 和 /fork 留在队列中并按键入顺序运行。/clear、/resume 和 /fork 丢弃排队的后续请求文本;面板更新且不保留它。压缩期间,除 /quit 外的这三者被拒绝,其他改变会话、工作区或模型的命令也被拒绝。/status、/help、/todos 以及其他只报告状态或调整显示的命令立即运行。/quit 取消压缩并退出。Ctrl+C 中断且不丢弃已排队的文本。空闲提示上,Ctrl+C 清空输入框。空输入框上按两次 Ctrl+C 退出。

/btw(别名 /side)从存档和此进程中最新的 20 次附带交换提出一个附带问题。请求使用工作模型、当前系统消息、空工具列表和自己的取消。该请求放不进窗口时,宿主压缩一份副本,且不把摘要写回。副本仍然放不下时,附带问题失败。当前轮仍在流式输出的文本不包括在内。工具调用不执行。与它一起到达的文本被保留;没有文本的工具调用失败,问题留在面板中以便再次询问。问题、答案和 token 用量不进入队列、记录、用量账本、压缩和已保存的会话。终端把答案画在输入框上方的面板中,并让状态栏、记录和进度行留在原地。推理开始前,该面板显示 Waiting for the model,旋转指示与进度行相同,占一格。推理开始后、答案文本之前,它显示 Thinking 和该旋转指示,面板打开时画面继续前进。Esc、Enter 或 Space 关闭面板。Left 和 Right 在较早的答案之间步进。x 清除内存中的线程。该面板打开时,Ctrl+C 取消进行中的附带问题,关闭面板,并让主回合继续运行。/clear、/resume 和 /fork 丢弃该线程。crystal run 与其他每条斜杠命令一样拒绝该命令。