Skip to content
FunCoding

Search

Search docs, Skills and MCP

用户提交输入 Hook

补充上下文或展开输入模板,并把提示性建议与真正的请求限制分开。

This page has not been translated into English yet. The original Chinese version is shown below.

onUserPromptSubmitted 在用户提交消息时运行。它可以改写 prompt 或追加上下文,适合输入模板、项目背景和偏好;官方明确说明它不能拒绝 prompt 或执行硬性政策限制。

输入和输出

input 提供 prompt、cwd、timestamp;专门参考把 timestamp 标为 number / Unix timestamp,invocation.sessionId 用于会话关联。

返回字段作用
modifiedPrompt替换原 prompt
additionalContext给会话添加上下文
suppressOutput抑制助手响应输出

返回 null 或 undefined 原样使用输入。只需要添加信息时,优先 additionalContext,避免无意改变用户目标。

添加应用背景

const session = await client.createSession({
  hooks: {
    onUserPromptSubmitted: async () => ({
      additionalContext: "This project uses TypeScript. Explain changes concisely.",
    }),
  },
});

这里的背景是示例应用已知事实。实际应用应传递当前项目的真实信息;不要因某个示例这样写,就向所有会话注入相同技术栈。

用模板展开约定输入

const session = await client.createSession({
  hooks: {
    onUserPromptSubmitted: async (input) => {
      if (!input.prompt.startsWith("bug:")) return null;
      const description = input.prompt.slice("bug:".length).trim();
      return {
        modifiedPrompt: `Investigate this bug and explain the cause: ${description}`,
      };
    },
  },
});

此例把应用约定的 bug 前缀转换为明确任务,不是 SDK 内置命令。较大改写应在产品中让用户能理解最终发送的内容;直接裁剪长 prompt 可能删掉约束,不能只按长度判断内容无关紧要。

这里不是拒绝请求的边界

官方示例包含敏感内容替换和短期请求数提示,但专门说明 additionalContext 只提供建议,不能强制限流。硬上限应在调用 session.send() 之前由应用检查。

suppressOutput 隐藏响应,不等于请求未发送或未处理;把 prompt 换成警告文本也不是拒绝接口。需要验证、禁止或要求用户补充输入时,应在应用接收消息的流程中处理,不能仅靠模型遵守提醒。

与转换后 Hook 配合

提交 Hook 之后,runtime 还可能补充日期等上下文。要检查最终写入历史和交给模型的文本,使用模型输入转换 Hook。两者字段不同:本页修改 modifiedPrompt,后者修改 modifiedTransformedPrompt。