| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- """Apply the user's Doubao workshop environment to local instruction documents."""
- from pathlib import Path
- import difflib
- import hashlib
- import json
- ROOT = Path(__file__).resolve().parents[2]
- OUT = Path(__file__).resolve().parent
- SKILL = ROOT / 'skills/ksf-workshop-runtime'
- sha = lambda value: hashlib.sha256(value).hexdigest()
- GENERAL = [
- ('权限/费用', '权限'), ('权限及预算', '权限'), ('权限与预算', '权限'),
- ('权限/预算', '权限'), ('已有权限/预算', '已有权限'),
- ('本题范围与现有预算内', '本题范围和现有权限内'),
- ('资料/次数/预算/时间', '资料/次数/时间'), ('次数/预算上限', '次数上限'),
- ('预算/授权上限', '任务范围/授权上限'),
- ('已收费缺正文', '已请求但缺正文'), ('已付费原件', '已取得原件'),
- ('已收费请求', '已发出的请求'), ('重复付费', '重复请求'),
- ('收费请求', '外部采集请求'), ('收费待批、', ''),
- ('工具/授权/费用不足', '工具或授权不足'),
- ('权限/费用不足', '权限不足'),
- ('费用/次数上限', '执行次数和时间上限'),
- ('、未付费或无评价', '或无评价'),
- ('、权限/费用', '、权限'),
- ('全量重采掩盖失败或重复请求', '全量重采掩盖失败或重复发起请求'),
- ]
- SPECIFIC = {
- 'SKILL.md': [
- ('不因课表自动开收费采集、配置排程或改变模型', '不因课表自动扩大采集、配置排程或改变模型'),
- ('执行权限、费用、数据资格', '执行权限、数据资格'),
- ],
- 'references/workshop-analysis.md': [
- ('已给定“不补采/不付费”就执行', '已给定“不补采/只用已有资料”就执行'),
- ],
- 'references/workshop-case-evidence.md': [
- ('采集和预算边界', '采集范围和执行边界'),
- ('自动采集或收费', '自动扩大采集范围'),
- ],
- 'references/workshop-autonomous-research.md': [
- ('先回查已有原件和账本,不把“库里没有”当成可再次付费的缺页。没有入口/权限的单元', '先回查已有原件和执行记录,不把“库里没有”当成可直接重新发起采集的缺页。没有入口或权限的单元'),
- ('补采仅执行本任务已有授权且计费/停止条件明确的单元', '补采在本任务已有授权范围和明确的停止条件内执行'),
- ('分页回执及计费/失败依据', '分页回执及失败原因'),
- ('归属或计费异常', '归属或执行异常'),
- ('不重复搜同一范围的旧归档或重发已请求但缺正文请求。', '不重复搜同一范围的旧归档;已请求但缺正文的单元先核原请求和可恢复的响应,不直接重发。'),
- ('若当前任务明确停止收费,则只用允许的无新增费用路径,该限制不扩大为全部新任务禁止外部研究。', '用户明确限定资料范围或暂停采集时遵守该约束,不将另一案例的临时限制扩大到全部新任务。'),
- ('没有入口/权限/预算的单元', '没有入口或权限的单元'),
- ],
- 'references/workshop-category-scan.md': [
- ('本题明确的费用限制继续有效', '本题明确的资料范围和采集限制继续有效'),
- ],
- 'references/research-library/full-schema-and-intake.md': [
- ('也不产生新的付费采集授权', '也不扩大外部采集授权'),
- ('上游付费凭据', '上游采集凭据'),
- ],
- 'references/workshop-competitor-landscape.md': [
- ('自动扩大采集、开启收费或声称已覆盖全网', '自动扩大采集或声称已覆盖全网'),
- ('任务授权和费用范围内', '任务授权范围内'),
- ('停采/收费限制', '资料范围和采集限制'),
- ('巡检或付费队列', '巡检或额外调度队列'),
- ],
- 'references/workshop-concept-presentation.md': [
- ('通知、会议、采集、付费或后台调度', '通知、会议、采集或后台调度'),
- ],
- 'references/research-library/operations.md': [
- ('查询本身不采集、不收费,外部调用按其真实工具合同执行', '查询本身不采集,外部调用按其真实工具合同执行'),
- ('采集工具和付费权限仍须实际存在', '采集工具和对应访问权限仍须实际存在'),
- ],
- 'references/research-library/retrieval-rules.md': [
- ('换库或收费补采', '换库或扩大采集'),
- ('不自动付费探测', '不自动扩大探测范围'),
- ],
- 'references/workshop-course-flow.md': [
- ('用户已明确的费用/采集边界', '用户已明确的资料范围和采集边界'),
- ('收费停止时只做确定无新增费用的已授权任务,其余明确待执行。', '按任务范围执行已授权工作,超出实际工具或访问范围的部分明确待执行。'),
- ('授权、频率和费用边界', '授权、频率和资料范围'),
- ('收费停止及真实能力边界继续有效', '既有任务范围及真实能力边界继续有效'),
- ],
- 'references/workshop-delivery.md': [
- ('新的费用、范围和正式确认边界', '研究范围和正式确认边界'),
- ('采集、付费调用或公开上传', '采集或公开上传'),
- ],
- 'references/workshop-feedback.md': [
- ('改变方向、费用或实质范围', '改变方向、企业资源投入或实质范围'),
- ],
- 'references/workshop-intake.md': [
- ('工具、权限、费用或执行能力', '工具、权限或执行能力'),
- ('新增付费或未授权行为停在相应动作前', '未授权行为停在相应动作前'),
- ('工作台、排程或预算', '工作台、排程或必要执行资源'),
- ('新增费用只问具体预算/取舍。', '购样、实验材料或人工测试确需业务资源时,只问会影响当前任务的具体条件。'),
- ],
- 'references/workshop-opportunity-validation.md': [
- ('费用停止仍有效。', '用户已给定的资料范围和采集限制仍有效。'),
- ('第二模型不可用、未授权或会产生未授权费用时', '第二模型未接入、不可用或未授权时'),
- ('保留具体阻断项,不重发已发出的请求或为补齐证据默认启动采集。', '保留具体阻断项;请求结果未知时先核原请求及已有原件,不盲目重发,也不为补齐证据扩大采集范围。'),
- ],
- 'references/workshop-research-acceptance.md': [
- ('原授权和收费停止边界', '原授权及资料范围边界'),
- ('不重复搜索同一归档或重发已请求但缺正文请求。', '不重复搜索同一归档;已请求但缺正文的单元先核原请求和可恢复的响应,不直接重发。'),
- ],
- 'references/workshop-research-loop.md': [
- ('尚未授权的费用、访问、范围扩展', '尚未授权的访问、范围扩展'),
- ('“只用已有资料/不采集/不付费”', '“只用已有资料/不采集”'),
- ('避免重复收费', '避免重复请求'),
- ('工具缺失不靠安装新运行时来解决,预算不明不视为无限授权。', '工具缺失按实际能力报告,不靠安装新运行时或扩大访问范围来解决。'),
- ('付费请求依既有预算/收费流程,结果未知先核原请求/账本,不盲目重试或换接口重复花费。', '请求结果未知时先核原请求和返回,不盲目重试或换接口重复采集。'),
- ('查询/调用/预算账本', '查询/调用/执行记录'),
- ],
- 'references/workshop-research-tasking.md': [
- ('数据访问和执行次数和时间上限', '数据访问范围、执行次数与时间上限'),
- ('为同一页重复花费', '为同一页重复发起请求'),
- ('为同一页重复请求', '为同一页重复发起请求'),
- ('| 资源与费用 | 每轮和本次总上限、可复用缓存/原件、可能的计费与失败口径、已消耗和可派发额度。授权续期不等于采集预算或群发授权 |',
- '| 执行资源 | 每轮与本次的资料、次数和时间边界,可复用缓存/原件、已处理单元及尚未完成部分。授权续期不等于扩大资料范围或群发授权 |'),
- ('鉴权/收费不明', '鉴权或范围不明'),
- ('费用按本题当前有效约定:已有授权及预算足够的外部补证直接执行,不逐项再批。若本题明确停止收费或保留额度,则继续允许的查库、原件复用及免费外部取证;需要新增费用的子任务留具体条件,不自动派发。历史另一案例的停采/停费不未经核实套到本题。',
- '本题范围内已有授权的资料补证直接执行,不逐项再批;用户明确只用已有资料或暂停采集时沿用其限制。缺入口、访问权限或真实排程能力的子任务留具体条件,其余可做部分继续。购样、实验材料与人工测试按实际任务列资源需求,不与模型或检索操作混为一谈。'),
- ],
- 'references/workshop-tasks.md': [
- ('VOC平台、分页、增量能力及费用', 'VOC平台、分页与增量能力'),
- ],
- 'references/workshop-verification.md': [
- ('自动更换模型或启用收费服务。收费停止继续有效;', '自动更换模型或配置新服务。'),
- ('本Skill不指定固定供应商。', '本工作坊以豆包为运行宿主;第二模型仅在环境确实接入时使用,不固定供应商。'),
- ],
- }
- ENVIRONMENT = '''## 豆包运行场景与能力接入
- 本工作坊最终由学员在豆包中安装并运行本 Skill;按用户给定的免费使用环境开展分析、已有资料检索、VOC补证、模型复核和成果产出,不设置模型/Skill收费或调用预算确认,也不在业务回复、报告或验收中逐轮列“零费用”“付费调用”“paidCalls”等操作状态。产品售价、原料/包装/制造成本、毛利与项目资源投入仍按业务问题正常分析;购样、实验材料和人工测试需要时说明具体资源条件,不与模型使用混淆。
- 先按豆包当前实际提供的文件读取、联网/浏览、VOC、命令执行和业务连接能力使用本 Skill。分析规则可随 Skill 读取;研究库、外部采集、业务保存/看板、身份及第二模型分别核实接入,安装成功不等于这些能力全部具备。缺能力时说明具体入口或资料缺项,继续可做的分析,不以收费或预算未确认为理由暂停,也不编造工具返回、员工身份、保存编号或模型结果。
- 本文现有 `/opt/data/...` 路径、CLI和身份工具是当前已部署实例的兼容接口,不是豆包客户端原生能力。豆包连接到该实例时沿实际受控接口调用;其他受支持的安装位置以环境明确提供的 Skill 根目录和可信配置解析相对资源,不扫描凭据、不猜路径或自行配置服务。仅能读取文件或对话时,先交有依据的分析与本地成果,真实保存、看板及模型交叉复核保持各自未接入状态。
- '''
- def main():
- old_manifest = (SKILL / 'FILES.sha256').read_bytes()
- expected = {}
- for line in old_manifest.decode('utf-8').splitlines():
- digest, name = line.split(' ', 1)
- assert sha((SKILL / name).read_bytes()) == digest, name
- expected[name] = digest
- assert expected['SKILL.md'] == '3cb64f381937411b0a2b853772bb19d37f44528a2902a89ef475b707472d3473'
- changes = []
- for path in sorted(SKILL.rglob('*.md')):
- name = path.relative_to(SKILL).as_posix()
- before = path.read_text(encoding='utf-8')
- after = before
- for old, new in GENERAL + SPECIFIC.get(name, []):
- after = after.replace(old, new)
- if name == 'SKILL.md':
- marker = '## 工作坊'
- # Add the shared context before all operational sections.
- first_heading = after.index('\n## ')
- after = after[:first_heading + 1] + ENVIRONMENT + after[first_heading + 1:]
- if after == before:
- continue
- backup = OUT / 'before' / name
- backup.parent.mkdir(parents=True, exist_ok=True)
- assert not backup.exists(), name
- backup.write_bytes(path.read_bytes())
- path.write_text(after, encoding='utf-8', newline='\n')
- changes.append({'path': name, 'beforeSha256': expected[name], 'afterSha256': sha(path.read_bytes())})
- diff = ''.join(difflib.unified_diff(before.splitlines(True), after.splitlines(True), fromfile='r6/' + name, tofile='local-doubao/' + name))
- patch = OUT / 'diff' / (name + '.diff')
- patch.parent.mkdir(parents=True, exist_ok=True)
- patch.write_text(diff, encoding='utf-8')
- (OUT / 'before/FILES.sha256').write_bytes(old_manifest)
- manifest = ''.join(sha((SKILL / name).read_bytes()) + ' ' + name + '\n' for name in expected)
- (SKILL / 'FILES.sha256').write_text(manifest, encoding='utf-8', newline='\n')
- report = {'kind': 'local-instruction-draft-not-installed-remotely',
- 'baseline': 'r6', 'changes': changes,
- 'skillSha256': sha((SKILL / 'SKILL.md').read_bytes()),
- 'manifestSha256': sha((SKILL / 'FILES.sha256').read_bytes()),
- 'runtimeFilesChanged': 0, 'sealedR6PackageModified': False,
- 'doubaoExecutionVerified': False, 'remoteInstalled': False}
- (OUT / 'change-receipt.json').write_text(json.dumps(report, ensure_ascii=False, indent=2) + '\n', encoding='utf-8')
- print(json.dumps(report, ensure_ascii=False, indent=2))
- if __name__ == '__main__':
- main()
|