xiaoyi88 · 小乙投标文件在线制作技能
Overview
本技能把 WorkBuddy 对话与 xiaoyi88.cn(小乙投标) 在线标书制作服务对接,让用户一句话完成:
> 上传招标文件 → 解析 → 确认材料清单 → AI 生成材料 → 标书合成 → 下载成品 docx
底层是真实的 FastAPI 执行引擎(生成 docx、版本管理、需求覆盖追踪),不是本地纯生成。
技能目录 scripts/client.py 是纯标准库实现的 API 客户端 + CLI,无第三方依赖。
与 openclaw 的区别(重要)
- openclaw:纯方法论技能,AI 在本地指导你做标书,不调用外部服务、不产出最终文档。
- xiaoyi88(本技能):调用 xiaoyi88.cn 真实执行,产出可下载的 docx格式的投标文件。
触发时优先判断用户意图:要"真实产出文件" → 用本技能;要"方法论/清单/风险点指导" → 引导 openclaw。两者不冲突。
When to use
- 用户提供了招标文件(docx / pdf),要求生成/制作/产出投标文件
- 用户明确提到 xiaoyi88、小乙投标、在线/云端制作标书
- 触发词参考:用 xiaoyi88 做标书、调用投标服务、在线生成投标文件、小乙帮我做标
⚠️ 数据隐私前置声明(必须遵守)
标书含报价、技术方案、财务等企业机密。使用本技能意味着:
1. 招标文件会被上传到 https://www.xiaoyi88.cn 并交由该服务处理;
2. 首次使用前,必须向用户明确说明这一点并取得同意,再执行上传;
3. 成品与中间文件存储于 xiaoyi88.cn(保留天数由项目 keep_days 决定,默认 7 天);
4. 企业用户如需数据不出本地,应改用自托管实例(暂不在此 MVP 范围)。
前置条件
- 用户必须已在 xiaoyi88.cn 注册账号(手机号)。未注册会报
400 用户未注册,需先去网站注册/购买套餐。 - 技能通过手机号 + 短信验证码登录,拿到 JWT 后调用接口。
使用流程(AI 编排步骤)
第一步 · 登录(两步,需用户参与)
- 询问用户手机号,执行:
python <skill>/scripts/client.py auth-init --phone <手机号>
若返回400 用户未注册→ 提示用户先到 xiaoyi88.cn 注册。 - 用户收到短信验证码后,询问验证码,执行:
python <skill>/scripts/client.py auth-verify --phone <手机号> --code <验证码>
成功会打印user_id与套餐级别,并把 token 存到state/token.json(后续命令自动读取)。
简化路径 · 测试账号免发码直登(⚠️ 仅开发者自测,公开版勿用)
> ⚠️ 公开版使用者请务必走上方「第一步·两步登录」用自己在 xiaoyi88.cn 注册的账号(手机号 + 短信验证码)。本技能不内置任何账号凭证,也不向最终用户开放测试账号的免码通道。
> 以下路径仅当你自己的后端开启了 TEST_VERIFY_CODE 且将某账号加入 TEST_ACCOUNTS 白名单时才可用,仅供开发者本地调试,不可分发给最终用户。
若使用测试环境/测试账号(后端开启 TEST_VERIFY_CODE 且账号在 TEST_ACCOUNTS 白名单),可跳过第一步发码,直接用邮箱 + 固定验证码登录:
python <skill>/scripts/client.py auth-verify --email <测试邮箱> --code <固定验证码>
例(自动化测试账号):auth-verify --email test@xiaoyi88.cn --code 888888。
此时 test@xiaoyi88.cn 的 account_type 为 email,后端走白名单免验证码分支,不查 verify_codes 表。
第二步 · 一键制作(闭环,3 步)
> ⚠️ 执行 run 前,先做「交互式参数收集」(见下方专节):若用户请求里没给生成模式 / 接收邮箱,用 AskUserQuestion 在对话里问,再翻译成下列 flag。
确认数据外发同意后,执行:
python <skill>/scripts/client.py run \
--file <招标文件路径> \
--name <项目名称> \
--bidder <投标主体/公司名> \ # 可省略(自动模拟占位名)
--mode <full|schemes_only> \ # 可省略,默认 full
--email <接收邮箱> \ # 可省略(默认用登录账号的注册邮箱)
--outdir <成品下载目录>
参数说明:
- --bidder 可省略:未提供时,脚本自动模拟一个占位投标主体「小乙投标第xxx子公司」(xxx 为 3 位中文数字,如「小乙投标第八三七子公司」),随后传给后台。成品标书中的该名称需用户自行替换为真实公司名。显式传 --bidder 则使用真实名称(推荐正式出标时使用)。
- --mode 可省略,默认 full:
- full = 全自动模式(生成完整标书,默认)
- schemes_only = 仅方案模式(只生成方案部分,速度快,适合先要框架/思路)
- 用户没指定时,脚本按默认 full 跑(生成完整标书)。绝不在未告知的情况下擅自降级为仅方案模式;若用户明确只要方案框架,显式传 --mode schemes_only。
- --email 可省略:默认用登录账号的注册邮箱(登录时已存 state/token.json)。显式传则发到指定邮箱。无论哪种,发送前必须向用户确认投递目的地(标书是企业机密,明示"发到哪"是合规底线)。
脚本会自动:创建项目 → 上传 → 调用 auto-build(后端一站式串联 解析 → 生成 → 合成 → 邮件交付)→ 轮询 /tasks 至 done → 下载成品 docx 到 --outdir,同时后端已把成品发到指定邮箱。进度通过 /tasks 轮询实时打印(分钟级,请耐心等待)。
交互式参数收集(agent 介导,不要在脚本里用 input())
WorkBuddy 的 Skill 是 agent 驱动执行 CLI;在脚本里用 input() 向用户要参数,在 agent 循环里拿不到 stdin 会卡死。正确做法是把参数做成 CLI flag,由 agent 在对话里收集后翻译:
- 生成模式(单选,默认
full):用AskUserQuestion给 2 个选项:
- 全自动模式(full,默认)—— 生成完整标书
- 仅方案模式(schemes_only)—— 只生成方案框架,快(需用户显式选择) - 接收邮箱(确认):默认注册邮箱;若用户要发到别的邮箱,记录该地址后再传
--email。
收集到的答案 → 翻译成 client.py run --mode <x> --email <y>,再执行闭环。这样既能真正"对话式交互选择",又保留非交互/批处理能力。
第三步 · 呈现结果
下载完成后脚本会打印成品路径,用 present_files 把 docx 呈现给用户。
若想中途查看,可用:
python <skill>/scripts/client.py status --project <PROJECT_ID>
python <skill>/scripts/client.py list-outputs --project <PROJECT_ID>
状态机参考(轮询 GET /api/v1/projects/{id}/tasks)
| project_status | 含义 | 技能动作 |
|---|---|---|
| parsing | 解析中 | 继续轮询 |
| confirming | 解析完成待确认 | 调用 confirm-list(auto_start 进入生成) |
| making | 材料生成中 | 继续轮询 |
| building | 标书合成中 | 继续轮询 |
| done | 完成 | 下载成品 |
| failed | 失败 | 提示检查招标文件 |
| quota_paused | 配额不足暂停 | 提示用户去网站充值后 resume |
约束与说明
- 所有
/api/v1/projects/*接口需Authorization: Bearer <JWT>;token 过期时客户端会用 refresh_token 自动刷新一次。 - token 存于技能目录
state/token.json,不要提交到版本库或硬编码进脚本。 - 若公网网关前缀变化,改
client.py顶部API_PREFIX一行即可(当前为/api/v1)。 - 本技能为 P1 MVP:已通过后端
auto-build一站式串联解析→生成→合成→邮件交付(自动确认清单、自动触发合成、自动发邮件);未做精细化编辑、单材料重生成、版本回退等增强(留作 P2)。默认生成模式为full(全自动完整标书),仅需方案框架时显式传--mode schemes_only。 - 调用的是付费 SaaS,非本地免费生成:本技能后端为
https://www.xiaoyi88.cn(小乙投标),生成标书会消耗使用者自己的套餐额度;使用者需自行到该网站注册/购买套餐后才能出标。技能本身不含任何计费逻辑,也不代收费用。 - 能力边界:仅支持 xiaoyi88.cn 这一后端;依赖公网可访问该服务;成品标书中的投标主体名(自动模拟的占位名)需使用者替换为真实公司名。
故障排查
401 未授权:token 失效或 refresh 失败 → 重新走第一步登录。400 用户未注册:手机号未在 xiaoyi88.cn 注册 → 先去网站注册。quota_paused:套餐额度用完 → 网站充值后续作。- 解析/生成失败:检查招标文件是否为有效 docx/pdf,可用
status看详情。
Resources
scripts/client.py:API 客户端 + CLI(auth-init / auth-verify / run / status / list-outputs / download),纯标准库,可直接python client.py --help查看。