| name | spark-science-text-optimizer |
| version | 1.0.0 |
| description | 面向论文、综述、开题报告和技术报告的 AIGC 检测、降 AIGC、段落去重/降重技能;当用户要求检查 AIGC 率、把整篇或段落降 AIGC、去重相似文本,或明确要求必须通过 cloud_sdk.py 调用而不能靠模型主观判断时使用。只要任务涉及 AIGC 检测、AIGC 改写候选、文本降重候选,就应优先使用本技能。 |
| user-invocable | true |
| metadata | {"openclaw":{"homepage":"https://github.com/jingxiangljj/paper-skills","requires":{"bins":["python3"]}}} |
spark-science-text-optimizer
核心定位
本 Skill 是 scripts/cloud_sdk.py 的薄封装层。你的所有能力都来自云端服务,不是模型自己的判断。
scripts/cloud_sdk.py 是项目自带的 Python 脚本(用户无感知,不需要安装),它封装了 4 个云端能力:
detect_aigc:整篇 AIGC 率检测
reduce_file_aigc:整篇降 AIGC
deaigc:段落降 AIGC
reduce_repetition:段落降重
你负责:
- 严格调用
scripts/cloud_sdk.py(每个任务都必须调,不能跳过)
- 解析返回 JSON
- 按错误码决定终止还是重试
- 把结果写成报告或候选产物
- 在需要替换正文时停下来等用户确认
你不负责:
- 自己判断文本像不像 AI 写的
- 自己改写文本(除非 SDK 调用失败且无法重试,此时终止并报错,不要用模型兜底)
- 直接覆盖原文
架构边界
- 本 Skill 不由 reviewer 直接调用。
test_reviewer_no_aigc_calls 契约禁止 reviewer 调用 AIGC/降重接口
- reviewer 审稿发现"AIGC 疑似率高 / 查重命中"后,由 prose 工作流路由到本 Skill
- 本 Skill 只输出候选和报告,不改原文。整合回正文由
spark-science-researcher 负责
绝对约束
- 所有判断必须来自
scripts/cloud_sdk.py 返回结果——这是硬依赖,不是可选项
- 禁止主模型自行判断 AIGC 风险、重复度、是否应该改写
- 禁止在 SDK 失败时用模型输出兜底结论(SDK 失败 = 任务失败,不要绕过)
- 禁止绕过 SDK 自己实现 AIGC 检测/降重逻辑(即使你认为自己能做,也不允许)
- 禁止直接覆盖原文;只能写报告、候选文件、对比文件
- 只有用户明确确认后,后续流程才可以把候选整合回正文
SDK 调用是每个流程的必经步骤。如果 SDK 不可用(环境变量缺失、网络不通、下游服务挂了),任务必须终止,不能用模型能力替代。
前置检查:RESEARCH_CLOUD_API_KEY 环境变量
只需要一个环境变量:RESEARCH_CLOUD_API_KEY(pa_xxx 格式,key 即身份,server 侧 ApiKeyAuth 中间件会从 key 反查 user_id)。
内部测试阶段,scripts/cloud_sdk.py 可能将 key 硬编码在代码里(见 SDK 源文件);发布前会恢复 env 读取。无论哪种模式,Skill 都不得自己拼 Authorization header 或硬编码 key。
每次任务开始前用以下命令验证:
python -c "import os, sys; key=os.getenv('RESEARCH_CLOUD_API_KEY'); print('env ok' if key or True else ''); sys.exit(0)"
如果 SDK 实际调用时返回 auth failed (invalid or revoked api_key) 或 INVALID_USER / API_KEY_INVALID,立即终止并提示用户检查 key。
可选环境变量:
RESEARCH_CLOUD_BASE_URL:不设置时 SDK 走默认内网地址
SDK 通讯协议(理解用,不用手写)
不要手工拼 HTTP 请求,一律走 python scripts/cloud_sdk.py ...。只要知道下面这些事实即可:
- SDK 自动添加
Authorization: Bearer <api_key>,不需要 X-End-User-Id 这种 header(server 从 key 反查身份)
- SDK 自动组装请求 body:
{"base": {"request_id": "..."}, ...其他业务字段}
- SDK 不透传
base.uid(透传无效,中间件强制覆盖,越权失败)
- server 用 kratos 风格响应
{code, message, reason, data}。SDK 翻译后返回:
- 成功:
{"success": true, "result": {...data...}}
- 业务失败:
{"success": false, "code": N, "reason": "<REASON>", "error": "<中文 message>"}
- 网络 / HTTP 失败:
{"success": false, "error": "..."}
- 判错正确姿势:先看
success,再按 reason 路由;不要用 code 路由(多个 reason 共享同一个 code);更不要解析 error 中文字符串
code 是 HTTP 风格状态码(400/403/502/…),不是 enum 数值;SDK 里这个数字是 server body 内容,不是真实 HTTP 层状态
⚠️ 特别注意:reason=PAPER_CAPABILITY_FAILED 时 body 里 code=502,但这不是 HTTP 502 网关挂了,而是 server 把上游超时/失败包在 body 里的标记。SDK 已经区分:真 HTTP 非 200 会走 "error": "HTTP 502",两者字段结构不同。
输入来源
优先级从高到低:
- 用户显式给的参数
paper_path
project_id 对应项目目录中的草稿
文档类任务
适用于:detect_aigc、reduce_file_aigc
文件来源(三选一,SDK 在 _file_source_body 强校验互斥):
file_path:本地文件路径,用户场景下最常用。SDK 自动读盘并 base64 上传,server 接收后转存 OSS。
file_url:公网可直连下载链接,server 会从内网 → 公网 GET 文件。仅当用户已经把文件放在可访问存储时使用。
file_content:原始字节(bytes / bytearray / memoryview),适合内存中已经持有文件内容的场景。
通用必填参数:
file_name:文件名含扩展名。file_path 缺省时 SDK 会从路径自动推断;file_url / file_content 必须显式传。
detect_aigc 额外必填 file_type_hint(如 PDF / Word / TXT;SDK 强校验必填,空值会 raise ValueError)
project_id 或 paper_path 二选一更好,用于回写产物
不要自己拼 URL、不要把本地路径塞进 file_url 字段、也不要同时传两种来源(会触发 SDK 互斥检查)。如果用户连文件都没有,先停下来追问,不要伪造路径或 URL。
段落类任务
适用于:deaigc、reduce_repetition
需要:
deaigc:content(单次建议不超过 2000 字;超出时提示用户分段处理,不强制拒绝但需告知)
reduce_repetition:paper_part 和 similar_text(两者单次建议均不超过 2000 字)
如果用户只说"帮我去重",但没有给 similar_text 或查重结果来源,先停下来要输入,不要自己猜哪一段重复。
request_id 规则
request_id 由调用方派生,首选稳定键 tool_call_id,或从 tool_call_id 派生:
tool_call_id
tool_call_id:detect_aigc
tool_call_id:deaigc:p3
tool_call_id:dedup:p7
如果当前是纯 CLI 场景,没有 tool_call_id,用一次性稳定格式生成,例如:
detect_aigc_{project_id_or_adhoc}_{yyyyMMddHHmmss}
reduce_file_aigc_{project_id_or_adhoc}_{yyyyMMddHHmmss}
deaigc_{project_id_or_adhoc}_{paragraph_no}_{yyyyMMddHHmmss}
dedup_{project_id_or_adhoc}_{paragraph_no}_{yyyyMMddHHmmss}
关键点不是格式本身,而是:在本次流程第一次调用前生成一次,然后把该值写入当前执行上下文、日志或候选记录;后续重试只能复用这个值,不能重新生成。
幂等硬规则
- 同一逻辑请求的重试必须复用同一个
request_id
- 改了输入内容或改了目标段落,才生成新
request_id
- 不要在每次 HTTP 重试时重新生成 UUID
- 不传
--request-id = 幂等保证丢失,SDK 内部回落随机 UUID,server 会把每次当独立请求扣分
标准调用方式
统一通过 CLI 调用:
python scripts/cloud_sdk.py <command> ... --request-id <request_id>
支持的命令与用途:
detect_aigc:整篇 AIGC 率检测(文档级)
reduce_file_aigc:整篇降 AIGC(文档级)
deaigc:段落降 AIGC
reduce_repetition:段落降重
把 CLI 标准输出解析为 JSON 后再继续。JSON 解析失败时,立即终止。
段落类参数传递规则(防 shell 注入)
deaigc 的 --content、reduce_repetition 的 --paper-part 和 --similar-text 可能包含引号、换行、特殊字符,禁止直接内联进 shell 命令字符串。必须通过环境变量传递,例如:
export SDK_CONTENT="要降 AIGC 的段落内容"
export SDK_REQUEST_ID="deaigc_proj001_20260509120000"
python scripts/cloud_sdk.py deaigc \
--content "$SDK_CONTENT" \
--request-id "$SDK_REQUEST_ID"
export SDK_PAPER_PART="论文中需要降重的段落"
export SDK_SIMILAR_TEXT="相似的原始文本"
export SDK_REQUEST_ID="dedup_proj001_p1_20260509120000"
python scripts/cloud_sdk.py reduce_repetition \
--paper-part "$SDK_PAPER_PART" \
--similar-text "$SDK_SIMILAR_TEXT" \
--request-id "$SDK_REQUEST_ID"
如果当前 shell 环境不支持 export(例如 Windows PowerShell 里,可以用 $env:VAR_NAME="..."),改用 Python 直调 SDK:
import sys, json
sys.path.insert(0, "scripts")
from cloud_sdk import ResearchCloudSDK
sdk = ResearchCloudSDK()
result = sdk.deaigc("<内容直接传>", request_id="<request_id>")
print(json.dumps(result, ensure_ascii=False, indent=2))
云端能力实测状态(2026-05-12)
出处:docs/cloud_sdk_test_report.md。接入时必读——下面 3 个接口当前下游不稳定。
| 命令 | SDK 层 | 下游 server 层 | 本 Skill 处理策略 |
|---|
deaigc | ✅ 正常 | ✅ 正常(中文段落可用) | 正常调用 |
reduce_repetition | ✅ 正常 | ✅ 正常(语义保留较好) | 正常调用 |
detect_aigc | ✅ 正常 | ⚠️ BACKEND_TIMEOUT 概率高 | 必须带重试 + 失败降级告知用户 |
reduce_file_aigc | ✅ 正常 | ⚠️ BACKEND_TIMEOUT 概率高 | 同上,失败时可建议改走段落级 deaigc |
当 detect_aigc / reduce_file_aigc 持续返回 PAPER_CAPABILITY_FAILED 时:
- 按下面"二类:可重试,最多 3 次"退避重试一次
- 仍失败则明示用户:"云端 AIGC 服务当前不稳定,已尝试重试失败,可选:a) 稍后重试;b) 对关键段落改走 deaigc 段落级流程"
- 不要硬改模型判断绕开 SDK
错误路由
一类:立即终止,不重试
以下情况一律终止,并把错误原样报告给用户:
- JSON 解析失败
INSUFFICIENT_POINTS(积分不足 → 提示充值)
POINTS_ACCOUNT_FROZEN(账户冻结)
POINTS_ACCOUNT_NOT_FOUND(账户不存在)
PAPER_INVALID_PARAMS(参数非法)
PAPER_INVALID_PLATFORM(搜索类接口才会出现,不涉及本 Skill 但纳入通用判)
API_KEY_INVALID(key 失效或被 revoke,SDK 输出 auth failed (invalid or revoked api_key))
FEATURE_NOT_CONFIGURED(该 feature 未配置扣分值,联系管理员)
INVALID_USER(鉴权失败)
- SDK 成功标志为真,但关键业务字段缺失
推荐提示方式:
INSUFFICIENT_POINTS → 积分不足,请充值后重试
POINTS_ACCOUNT_FROZEN → 账户已冻结,无法继续调用
POINTS_ACCOUNT_NOT_FOUND → 账户不存在,请检查 RESEARCH_CLOUD_API_KEY
API_KEY_INVALID / INVALID_USER → 鉴权失败,请检查或轮换 RESEARCH_CLOUD_API_KEY
PAPER_INVALID_PARAMS → 参数非法,修正输入后再调用
FEATURE_NOT_CONFIGURED → 云端 feature 未配置扣分值,请联系管理员
- JSON 解析失败 → SDK 返回格式异常,请检查 Python 环境或脚本输出
二类:可重试,最多 3 次
以下情况用相同 request_id 重试:
POINTS_CONSUME_LOCK_FAILED(占位锁冲突)
PAPER_CAPABILITY_FAILED(下游能力失败 / 上游超时,积分已 release 不会冤扣)
- 网络错误(
network error: ...)
- HTTP 5xx(真 HTTP 层 5xx,SDK 返回
{"error": "HTTP 5xx"})
退避策略:
- 第 1 次失败后等 2 秒
- 第 2 次失败后等 4 秒
- 第 3 次失败后等 8 秒
- 3 次全部失败后终止,报告"服务暂时不可用",把
result.session_id(如果有)给用户,用户联系管理员可按 trace 拉日志
重试期间:
- 不要输出中间判断
- 不要切换到模型手工处理
- 不要更换
request_id
三类:成功返回但字段异常
这类也要终止,不能补猜:
detect_aigc
以下任一缺失即终止:
result
html_url
pdf_url
report_id
reduce_file_aigc
以下任一异常即终止:
success != true(注意:这是 result.success,server 业务侧 success,区别于 SDK 外层 success)
object_url 为空
file_name 为空
deaigc
以下异常即终止:
reduce_repetition
以下异常即终止:
四条执行流程
流程 1:查 AIGC
目标:生成检测报告,不改原文。
步骤:
-
准备文件来源(file_path / file_url / file_content 三选一,详见"文档类任务"段)和 file_type_hint(必填,值如 PDF / Word / TXT / docx / pdf / txt;SDK 强校验)。file_url / file_content 时还要 file_name。
-
生成稳定 request_id
-
【必须】调用 scripts/cloud_sdk.py detect_aigc(按文件来源选其一):
本地文件(最常用):
python scripts/cloud_sdk.py detect_aigc \
--file-path "<本地文件绝对路径>" \
--file-type-hint "<PDF|Word|TXT>" \
--request-id "<request_id>"
公网 URL(用户已有可访问链接时):
python scripts/cloud_sdk.py detect_aigc \
--file-url "<公网 URL>" \
--file-name "<文件名含扩展名>" \
--file-type-hint "<PDF|Word|TXT>" \
--request-id "<request_id>"
这一步不可跳过。如果 SDK 调用失败且重试无效,任务终止,不要用模型自己判断 AIGC 率。
不要同时传 --file-path 和 --file-url,CLI 层会立即 _fail。
-
解析 JSON,并按错误路由处理;遇到 PAPER_CAPABILITY_FAILED 按二类重试
-
成功后只提取:
result.result(SDK 检测结论字段)
result.html_url
result.pdf_url
result.report_id
-
写报告,不解读 result.result(原样复述 SDK 返回值)
-
把完整报告路径告诉用户
建议写入:
~/.research-assistant/projects/{project_id}/review/aigc_report.md
报告应包含:
- 检测时间
- 原文件名
report_id
- SDK 返回的检测结论原文
html_url
pdf_url
- 原始请求
request_id
session_id(排查用)
禁止:
- 自己说"这篇大概率是 AI 写的"
- 自己建议"建议降 AIGC",除非这是基于明确的 SDK 字段或固定规则
- 自己补写缺失字段
流程 2:整篇降 AIGC
目标:生成候选文件,不改原文。
步骤:
-
准备文件来源(file_path / file_url / file_content 三选一)。file_url / file_content 时必须给 file_name;file_path 缺省 file_name 时 SDK 自动从路径推断。
-
如果用户连本地文件都没有,停下来要文件,不要伪造。
-
生成稳定 request_id
-
【必须】调用 scripts/cloud_sdk.py reduce_file_aigc(按文件来源选其一):
本地文件(最常用):
python scripts/cloud_sdk.py reduce_file_aigc \
--file-path "<本地文件绝对路径>" \
--request-id "<request_id>"
公网 URL:
python scripts/cloud_sdk.py reduce_file_aigc \
--file-url "<公网 URL>" \
--file-name "<文件名>" \
--request-id "<request_id>"
这一步不可跳过。如果 SDK 调用失败且重试无效,任务终止,不要用模型自己改写文本。
不要同时传 --file-path 和 --file-url,CLI 层会立即 _fail。
-
解析 JSON,并按错误路由处理;遇到 PAPER_CAPABILITY_FAILED 按二类重试
-
成功后提取:
result.object_url
result.file_name
result.success(业务侧 success)
-
用确定性方式下载 object_url 对应的候选文件,使用 Python + httpx。不要依赖 ~ 的 shell 展开,目标路径由 Python 自己拼接,复用 result.file_name 作为文件名。为防止 URL 和文件名含特殊字符导致注入,必须通过环境变量传入:
export DOWNLOAD_URL="{object_url}"
export DOWNLOAD_FILENAME="{result.file_name}"
export DOWNLOAD_PROJECT="{project_id}"
python -c "
import os, httpx
from pathlib import Path
output_dir = Path.home() / '.research-assistant' / 'projects' / os.environ['DOWNLOAD_PROJECT'] / 'artifacts' / 'deaigc_candidates'
output_dir.mkdir(parents=True, exist_ok=True)
output_path = output_dir / os.environ['DOWNLOAD_FILENAME']
output_path.write_bytes(httpx.get(os.environ['DOWNLOAD_URL'], timeout=60).content)
print(output_path)
"
如果 `project_id` 不存在,目标目录改用:`~/.research-assistant/tmp/deaigc_candidates/`
8. 写候选记录和差异统计
9. 停下来等用户确认是否整合回正文
建议写入:
- `~/.research-assistant/projects/{project_id}/artifacts/deaigc_candidates/index.md`
- `~/.research-assistant/projects/{project_id}/artifacts/deaigc_candidates/candidate_r{n}.*`
- `~/.research-assistant/projects/{project_id}/artifacts/deaigc_candidates/diff_r{n}.md`
`n` 的取值规则:扫描目标目录下现有文件数 +1,确保不覆盖旧候选:
```bash
python -c "
from pathlib import Path
d = Path.home() / '.research-assistant' / 'projects' / '{project_id}' / 'artifacts' / 'deaigc_candidates'
existing = list(d.glob('candidate_r*.md')) + list(d.glob('candidate_r*.*')) if d.exists() else []
print(len(existing) + 1)
"
如果 project_id 不存在,使用 ~/.research-assistant/tmp/deaigc_candidates/ 作为候选目录。
差异文件必须用确定性方式生成,不要让模型手工估算:
- 如果原文和候选都是可直接比较的文本格式(如
.md、.txt),用 Python 脚本统计行数和按空行分段后的段落数
- 如果候选是
.docx、.pdf 或其他富文档 / 二进制格式,diff 文件只记录:
- 原文路径
- 候选文件路径
- 文件名
- 时间戳
未做文本级行数/段落统计:文件不是可直接比较的纯文本格式
不要评价改写质量,不要写"更自然""更像人工"。
流程 3:段落降 AIGC
目标:生成段落级改写候选,不改正文。
步骤:
- 获取
content
- 建议先做基本长度检查;单次建议不超过 2000 字;过长时要求用户分段,不强制拒绝但需告知
- 生成稳定
request_id
- 【必须】通过环境变量传参调用
scripts/cloud_sdk.py deaigc:
export SDK_CONTENT="<待降 AIGC 段落>"
export SDK_REQUEST_ID="<request_id>"
python scripts/cloud_sdk.py deaigc \
--content "$SDK_CONTENT" \
--request-id "$SDK_REQUEST_ID"
这一步不可跳过。如果 SDK 调用失败且重试无效,任务终止,不要用模型自己改写段落。
- 解析 JSON,并按错误路由处理
- 成功后提取
result.content
- 写原文 / 候选对照文件
- 停下来等用户确认是否替换到正文
注意:deaigc 的输出会重新组织语言,可能偏离原意或丢细节(实测见测试报告 2.5)。Skill 不评价改写质量,但必须把原文完整保留在对照文件,方便用户一眼对比。
建议写入:
~/.research-assistant/projects/{project_id}/artifacts/deaigc_candidates/paragraph_r{n}.md
n 的取值规则:扫描目标目录下现有 paragraph_r*.md 文件数 +1。如果 project_id 不存在,使用 ~/.research-assistant/tmp/deaigc_candidates/。
对照文件应包含:
- 原文段落
- SDK 返回候选段落
request_id
- 时间戳
session_id
流程 4:去重 / 降重
目标:生成降重候选,不改正文。
步骤:
- 获取
paper_part 和 similar_text
- 检查两者都非空
- 生成稳定
request_id
- 【必须】通过环境变量传参调用
scripts/cloud_sdk.py reduce_repetition:
export SDK_PAPER_PART="<待降重段>"
export SDK_SIMILAR_TEXT="<相似文本>"
export SDK_REQUEST_ID="<request_id>"
python scripts/cloud_sdk.py reduce_repetition \
--paper-part "$SDK_PAPER_PART" \
--similar-text "$SDK_SIMILAR_TEXT" \
--request-id "$SDK_REQUEST_ID"
这一步不可跳过。如果 SDK 调用失败且重试无效,任务终止,不要用模型自己改写段落。
- 解析 JSON,并按错误路由处理
- 成功后提取
result.content
- 写原文 / 相似文本 / 候选三段对照文件
- 停下来等用户确认是否替换原稿
注意:实测 reduce_repetition 语义保留较好,通常仅换词和调语序(测试报告 2.6)。但仍不得直接替换正文,必须走候选 → 用户确认 → researcher 整合的链路。
建议写入:
~/.research-assistant/projects/{project_id}/artifacts/dedup_candidates/candidate_r{n}.md
n 的取值规则:扫描目标目录下现有 candidate_r*.md 文件数 +1。如果 project_id 不存在,使用 ~/.research-assistant/tmp/dedup_candidates/。
对照文件应包含:
- 原文段落
paper_part
- 相似来源段
similar_text
- SDK 返回候选段落
request_id
- 时间戳
session_id
返回结果还是修改原文
这是硬规则:
| 能力 | 默认行为 |
|---|
| 查 AIGC | 返回检测结论和报告链接,写报告,不改原文 |
| 整篇降 AIGC | 返回候选文件和差异记录,不改原文 |
| 段落降 AIGC | 返回候选段落,不改原文 |
| 去重 / 降重 | 返回候选段落,不改原文 |
只有在用户明确确认后,才允许把候选整合回正文。整合动作由 spark-science-researcher 执行:它负责把候选替换到对应草稿位置、保持引用和论证链一致,并记录版本号。这个技能本身不直接做正文替换。
什么时候必须停下来问用户
以下情况必须追问,不能硬做:
- 文档类任务:用户既没给本地
file_path,也没给 file_url 或 file_content
- 用
file_url / file_content 时没有 file_name(file_path 模式下 SDK 会自动推断,不必追问)
detect_aigc 没有 file_type_hint(SDK 强校验必填)
- 去重时没有
similar_text
- 用户要求你"直接改正文"
- 用户要求"帮我判断像不像 AI 写的",但没有允许你先走检测流程
- 用户要求"查重",但实际只给了一段话,没有相似来源或查重结果
- 云端
PAPER_CAPABILITY_FAILED 连续 3 次退避重试仍失败,要征求用户是稍后重试还是改走段落级
进度和产物登记
如果任务运行在项目上下文中:
- 写入产物后,把完整路径在同一轮回复中返回给用户
- 如需更新进度,使用
scripts/progress.py write
- 如需登记产物,随后再用
scripts/progress.py log_artifact
- 这两个动作顺序执行,不要并发(
log_artifact 在 write 未落盘前会 Project not initialized)
输出风格
- 先给结果,再给一句短说明
- 结论只复述 SDK 返回,不扩写成模型观点
- 出错时直接说错误原因和是否已重试,不写长解释
- 任何时候都不要把工具缺失结果伪装成模型判断
最小示例
查 AIGC
输入意图:
你应该做:
- 确认文件来源(
file_path / file_url / file_content 三选一)和 file_type_hint 齐全
- 调
detect_aigc(本地文件优先用 --file-path,无需 --file-name)
- 按错误路由处理(含
PAPER_CAPABILITY_FAILED 重试)
- 写报告到
review/aigc_report.md
- 返回报告路径和官方返回字段(
result.result / html_url / pdf_url / report_id)
整篇降 AIGC
输入意图:
你应该做:
- 确认文件来源(
file_path / file_url / file_content 三选一)齐全
- 调
reduce_file_aigc(本地文件优先用 --file-path;含 PAPER_CAPABILITY_FAILED 重试)
- 下载
object_url 到 artifacts/deaigc_candidates/candidate_r{n}.*
- 写差异文件
- 返回候选路径
- 停下来等确认
段落降 AIGC
输入意图:
你应该做:
- 通过 env 传
content + request_id
- 调
deaigc
- 写
artifacts/deaigc_candidates/paragraph_r{n}.md(原文 + 候选 + request_id + session_id + 时间戳)
- 返回候选内容和路径
- 停下来等确认
去重
输入意图:
- "这段和原文太像了,帮我降重,但只能调用 cloud_sdk.py"
你应该做:
- 通过 env 传
paper_part + similar_text + request_id
- 调
reduce_repetition
- 写
artifacts/dedup_candidates/candidate_r{n}.md(三段对照)
- 返回候选内容和路径
- 停下来等确认