@roll-agent/octopus-agent 0.0.11 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -75,10 +75,26 @@ roll run octopus-agent query_sponge --json \
75
75
 
76
76
  `includeSql=true` 时会返回 `generatedSql`、`normalizedSql`、`repairedSql` 和 `validation`。
77
77
  所有模式都会返回 `needsClarification`。当 `needsClarification=true` 时,上层 Agent 必须原样展示 `answer` 并等待用户确认,不得自行选择候选项或再次调用 `query_sponge`。
78
+ 默认 `requirePlanConfirmation=true`,`query_sponge` 会先返回查询计划:匹配到的表、字段、筛选条件和执行步骤。用户回复“确认”后,再继续生成、校验和执行 SQL;用户提出修改时,会按修改后的口径重新整理查询计划并再次确认。调试或内部直通场景可以显式传 `requirePlanConfirmation=false`。
79
+
80
+ 普通业务返回使用单 `content` 通道,透传约束改由结构化字段承载:
81
+
82
+ - `content[0].text`:纯净业务答案,裸客户端可以直接展示。
83
+ - `structuredContent.answer`:同样保存纯净业务答案,作为结构化兜底。
84
+ - `structuredContent.responseMode=verbatim` 和 `structuredContent.finalAnswerOnly=true`:提示上层 Agent 应原样透传答案。约束只放在结构化字段,`content` 数组不再附带元指令文本,避免泄露给用户。
78
85
 
79
86
  ### 查询链路规范
80
87
 
81
- 一次完整查询链路由 `validate_sql` 和 `execute_sql` 组成,两步必须使用同一个 `traceId`(链路 ID)。同一个用户问题、同一次分析上下文必须复用同一个 `sessionId`(会话 ID)。
88
+ 一次完整查询链路先展示查询计划,再由 `validate_sql` 和 `execute_sql` 组成。`validate_sql` `execute_sql` 两步必须使用同一个 `traceId`(链路 ID)。同一个用户问题、同一次分析上下文必须复用同一个 `sessionId`(会话 ID)。
89
+
90
+ 查询计划包含:
91
+
92
+ - 查询表:来自 `get_schema` 的 schema 中文语义匹配结果。
93
+ - 查询字段:确认后必须尽量出现在 SQL 的 `SELECT` 中。
94
+ - 筛选条件:确认后必须尽量出现在 SQL 的 `WHERE` 中;名称类使用 `LIKE`,状态类使用 `schema.enums` 的枚举值。
95
+ - 执行步骤:从上层调用、意图判断、口径确认、SQL 校验执行到结果渲染。
96
+
97
+ 最终答案顶部会先展示“查询字段”和“筛选条件”,再展示查询结果。
82
98
 
83
99
  如果执行成功但结果异常,例如 `rowCount=0`、关键字段大量为空、结果明显不符合预期,Agent 不应自动改口径再跑第二次完整链路。应先说明异常点、可能原因、建议口径和影响范围,等待用户确认后,再用新的 `traceId`、原 `sessionId` 发起新链路。
84
100
 
@@ -116,6 +132,7 @@ LLM 配置读取 roll-core 现有 `llm` 配置;Agent 不读取模型 API Key
116
132
  ## 本地持久化
117
133
 
118
134
  - `data/sponge-schema-cache.json`:schema 缓存。
135
+ - `data/sponge-clarification-cache.json`:短期确认缓存,保存品牌/项目候选和查询计划确认上下文,默认 10 分钟过期。
119
136
  - `logs/octopus-sponge-audit.log`:审计日志。
120
137
 
121
138
  不新建数据库,不保存真实项目 ID、品牌 ID、数据库账号密码。
package/SKILL.md CHANGED
@@ -30,53 +30,94 @@ metadata:
30
30
  `query_sponge` 不接收用户或设备标识;权限由 Sponge MCP Server 根据 `Authorization` token 解析。
31
31
  Agent 只生成业务 SQL,不生成 `:scope.project_ids`、`:scope.brand_ids` 等权限占位符。
32
32
  调试时可传 `includeSql=true` 返回 `generatedSql`、`normalizedSql`、`repairedSql` 和 `validation`;默认不返回 SQL。
33
- `finalAnswerOnly` 默认是 `true`,并返回 `structuredContent.responseMode=verbatim`;上层 Agent 必须把 `content[0].text` `structuredContent.answer` 原样作为最终用户可见答复,不要只放在可折叠工具步骤里,也不要改写成摘要。
34
- 当返回 `needsClarification=true` 时,必须立即停止,原样展示 `structuredContent.answer` 给用户并等待确认;用户未确认前不得再次调用 `query_sponge`,不得自行选择候选项,不得把品牌+地点拼成项目名。
35
- 用户确认品牌/项目后,不要重新发现工具,不要调用 `diagnostic_status` `refresh_schema`,不要解释 schema,不要自行判断“schema 不支持项目维度”。必须直接再次调用 `query_sponge`,并传 `clarificationSelection`。
36
- `clarificationSelection` 必须包含:`baseQuestion`(原始问题)、`entityType`(brand=品牌,project=项目)、`entityId`(候选实体 ID)、`entityName`(候选实体名称)。优先从上一轮 `structuredContent.clarificationContext` 和 `structuredContent.clarificationPayload` 取值。
37
-
38
- 示例:
39
-
40
- ```json
41
- {
42
- "question": "项目",
43
- "originalQuestion": "项目",
44
- "clarificationSelection": {
45
- "baseQuestion": "海绵系统上陈香贵上海有哪些岗位",
46
- "entityType": "project",
47
- "entityId": 768,
48
- "entityName": "陈香贵"
49
- }
50
- }
51
- ```
33
+ `query_sponge` 不需要用户确认查询计划。工具内部会按 schema 中文语义识别表、字段、筛选条件、枚举和实体,把 `search_entities` 的真实命中项固化进 queryPlan,然后直接生成、校验并执行 SQL,不会在任何节点停下来等待用户确认。
34
+ `finalAnswerOnly` 默认是 `true`,并返回 `structuredContent.responseMode=verbatim`;上层 Agent 必须把 `content[0].text` 或 `structuredContent.answer` 原样作为最终用户可见答复,不要只放在可折叠工具步骤里,也不要改写成摘要。用户可见答复统一为三段式:`1. 查询实体`、`2. 筛选条件` 和 `3. 查询结果`。
35
+ 普通业务返回只带一个 `content` 项:`content[0].text` 是三段式用户可见答复。是否原样透传由 `structuredContent.responseMode=verbatim` `finalAnswerOnly=true` 这两个结构化字段承载,不再在 `content` 里附带任何元指令文本,避免元指令泄露给用户。
36
+ `search_entities` 只用于实体别称和模糊召回;品牌、项目等多个实体同时命中时不追问用户,queryPlan 会用同组 OR 条件承载,并在结果中展示各实体名称字段方便用户自行缩小范围。
37
+ 状态枚举不单独追问。用户明确提出状态条件时,把状态条件写入 SQL 的 WHERE;用户未提出状态条件或 schema 缺少枚举时,首次查询保持宽泛,但查询结果必须展示相关状态字段的中文含义。
38
+ 当 schema 完全匹配不到相关表时,`query_sponge` 会返回 `needsClarification=true`、`clarificationType=schema_no_match`。此时必须立即停止,原样展示 `structuredContent.answer` 给用户;这是"暂不支持该查询"的说明,不是查询计划确认,用户补充明确需求后重新发起查询即可。业务指标口径缺失等其它情况会直接返回普通 `answer`(`needsClarification=false`),上层原样展示即可。
52
39
 
53
40
  ## 上层调用规则
54
41
 
55
- 1. 查询前如需排查环境,先调用 `diagnostic_status`。
56
- 2. schema 过期或缺失时,调用 `refresh_schema`。
57
- 3. 用户提出业务数据查询时,调用 `query_sponge`。
58
- 4. 不要求上层提供真实项目 ID 或品牌 ID;权限由 Sponge MCP Server 处理。
59
- 5. 权限范围由 Sponge MCP Server 在 `execute_sql` 阶段统一补全并记录。
60
- 6. 不允许绕过本 Agent 直接连业务数据库。
61
- 7. 运行参数由 Agent 内置;本地只通过环境变量配置 Sponge 地址和 Token。
62
- 8. LLM roll-core 通过 MCP Sampling 代调,本 Agent 不读取模型 API Key
63
- 9. 对“匹配效果”“分析报告”“找出报名多但入职少/在招多但报名少/候选人多但岗位少”等报告类问题,只能调用一次 `query_sponge` 处理完整原始问题,不要拆成多个品牌/项目/城市子查询。
64
- 10. `query_sponge` 返回后,最终回复正文必须完整复制工具返回的 `answer`,不要只把报告放在执行命令、思考过程、工具详情或可折叠步骤里。
65
- 11. 如果 `structuredContent.needsClarification=true`,最终回复只能展示 `structuredContent.answer`,等待用户确认;用户未确认前不得二次查询。
66
- 12. 用户确认品牌/项目后,必须直接带 `clarificationSelection` 再调用 `query_sponge`;不要重新发现工具、不要解释 schema、不要输出“schema 不支持项目维度”这类自行判断。
67
- 13. 如果 `answer` 已包含分析报告,最终回复顺序必须保持:完整分析报告 -> 总结关键发现;不要自行改写成摘要替代报告。
42
+ 1. 用户只是说使用、启动、检查、看看丸子Agent,或确认 Agent 是否可用时,只调用 `diagnostic_status`,返回状态后停止;不得主动调用 `query_sponge`,不得编造示例业务问题。
43
+ 2. 查询前如需排查环境,先调用 `diagnostic_status`。
44
+ 3. schema 过期或缺失时,调用 `refresh_schema`。
45
+ 4. 用户提出明确业务数据查询时,调用 `query_sponge`。
46
+ 5. 不要求上层提供真实项目 ID 或品牌 ID;权限由 Sponge MCP Server 处理。
47
+ 6. 权限范围由 Sponge MCP Server 在 `execute_sql` 阶段统一补全并记录。
48
+ 7. 不允许绕过本 Agent 直接连业务数据库。
49
+ 8. 运行参数由 Agent 内置;本地只通过环境变量配置 Sponge 地址和 Token
50
+ 9. LLM roll-core 通过 MCP Sampling 代调,本 Agent 不读取模型 API Key。
51
+ 10. 对“匹配效果”“分析报告”“找出报名多但入职少/在招多但报名少/候选人多但岗位少”等报告类问题,只能调用一次 `query_sponge` 处理完整原始问题,不要拆成多个品牌/项目/城市子查询。
52
+ 11. `query_sponge` 返回后,最终回复正文必须完整复制工具返回的 `answer`,不要只把报告放在执行命令、思考过程、工具详情或可折叠步骤里。
53
+ 12. 如果 `structuredContent.needsClarification=true`(`clarificationType=schema_no_match`),最终回复只能展示 `structuredContent.answer`;这是"暂不支持该查询"的说明,用户补充明确需求后重新发起查询即可。
54
+ 13. 品牌、项目等实体多候选由 queryPlan 的同组 OR 条件处理;上层不要要求用户先选择品牌或项目。
55
+ 14. 如果 `answer` 已包含分析报告,最终回复顺序必须保持:完整分析报告 -> 总结关键发现;不要自行改写成摘要替代报告。
56
+
57
+ ## 最终展示 few-shot
58
+
59
+ 上层 Agent 必须把 `query_sponge` 返回的 `content[0].text` 或 `structuredContent.answer` 原样展示给用户。不得总结、改写、删除表格、删除实体和筛选条件。
60
+
61
+ ### 示例 1:保留实体和筛选条件
62
+
63
+ 用户:查询近一年门店的创建时间,根据每日创建时间计数门店个数,列出所有的门店数量和对应项目
64
+
65
+ 工具返回:
66
+
67
+ ```text
68
+ 1. 查询实体:
69
+ 门店;项目
70
+
71
+ 2. 筛选条件:
72
+ 创建时间 >= 2025-07-07;创建时间 < 2026-07-08;按创建日期、项目统计门店数量
73
+
74
+ 3. 查询结果:
75
+ 返回 500 行。
76
+ limited: true
77
+
78
+ |序号|创建日期|项目名称|门店数量|
79
+ |---|---|---|---|
80
+ |1|2026-07-07|示例项目|12|
81
+ ```
82
+
83
+ 最终回复必须原样展示以上两段式内容;不要改写成“我已查询到近一年数据”,也不要删除第一段。
84
+
85
+ ### 示例 2:“所有/全部”不覆盖时间范围
86
+
87
+ 用户:查询近一年门店数据,列出所有项目
88
+
89
+ 正确理解:
90
+
91
+ - `近一年` 是时间范围,必须保留。
92
+ - `所有` 是返回范围或导出诉求,不是取消时间范围。
93
+ - 如果生成 CSV,也必须在两段式答复中保留实体和筛选条件后再展示文件路径。
94
+
95
+ ### 示例 3:工具返回表格时不得摘要替代
96
+
97
+ 错误回复:
98
+
99
+ ```text
100
+ 我查到了门店数量最多的项目,结果如下……
101
+ ```
102
+
103
+ 正确回复:完整复制工具返回的 `content[0].text`,包括:
104
+
105
+ - `1. 查询实体`
106
+ - `2. 筛选条件`
107
+ - `3. 查询结果`
108
+ - 完整表格或 CSV 文件路径说明
68
109
 
69
110
  ## 查询链路规则
70
111
 
71
- 1. 一次完整查询链路是 `validate_sql` 后接 `execute_sql`;两步必须使用同一个 `traceId`(链路 ID)。
112
+ 1. 一次完整查询链路直接生成查询计划并执行 `validate_sql` `execute_sql`,不需要用户确认查询计划;后两步必须使用同一个 `traceId`(链路 ID)。
72
113
  2. 同一个用户问题、同一次分析上下文必须复用同一个 `sessionId`(会话 ID)。
73
114
  3. 口径修正仍属于同一问题,继续复用原 `sessionId`,但使用新的 `traceId` 发起新链路。
74
115
  4. 如果 `execute_sql` 成功但结果异常,例如 `rowCount=0`、关键字段大量为空、结果明显不符合问题预期,不自动改口径重跑。
75
116
  5. 出现结果异常时,先向用户说明异常点、可能原因、建议口径和影响范围,等待用户确认后再用新口径查询。
76
117
  6. 如果只是 SQL 校验失败,可以修正 SQL 后重新校验;涉及业务口径变化时必须先确认。
77
- 7. `originalQuestion` 只传**当前这一轮**用户原话,不要把同一会话里上一轮问题拼进来;`sessionId` 仅用于 MCP 审计与澄清续答,**不会**自动继承上一轮的项目/品牌/门店筛选。
118
+ 7. `originalQuestion` 只传**当前这一轮**用户原话,不要把同一会话里上一轮问题拼进来;`sessionId` 仅用于 MCP 审计,**不会**自动继承上一轮的项目/品牌/门店筛选。
78
119
  8. 用户从「查岗位列表」转为「查操作日志 / 算历史在招数」等新问题时,仍复用 `sessionId` 即可,但 `originalQuestion` 必须是新问题本身,例如「你得查岗位上下架操作日志,给我算一下6月21日有多少在招岗位」。
79
- 9. 品牌/项目澄清续答与问题隔离不冲突:用户确认后必须带 `clarificationSelection` 再调 `query_sponge`;Agent 会把 `baseQuestion` 拼成 `…,按项目「xxx」(id: 941)查询` 这类完整问题,**不会**再对这类续答做子句隔离。
120
+ 9. 品牌/项目等多实体命中不追问用户;Agent 会在查询计划中生成同组 OR 条件并直接执行,结果中展示各实体名称字段方便用户自行缩小范围。
80
121
 
81
122
  ## 持久化
82
123
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roll-agent/octopus-agent",
3
- "version": "0.0.11",
3
+ "version": "0.1.1",
4
4
  "description": "丸子Agent(Octopus Agent)",
5
5
  "license": "UNLICENSED",
6
6
  "keywords": [
package/pyproject.toml CHANGED
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "octopus-skill"
3
- version = "0.0.11"
3
+ version = "0.1.1"
4
4
  description = "丸子Agent(Octopus Agent)"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -23,3 +23,7 @@ env:
23
23
  required: false
24
24
  purpose: 实体模糊匹配的最低分数阈值(0~1),低于该分数不视为命中。默认 0.6。
25
25
  example: "0.6"
26
+ OCTOPUS_SAMPLING_MAX_TOKENS:
27
+ required: false
28
+ purpose: MCP sampling/createMessage 请求的 maxTokens(LLM 输出 token 上限)。默认 4096。
29
+ example: "4096"
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.0.11"
3
+ __version__ = "0.1.1"