cue-overseas-compliance — 企业出海合规套件
帮律所律师、出海企业法务与合规、想做出海业务的老板把企业出海前、中、后的法律合规排查压到分钟级:从"这个合作方能不能碰"的制裁/出口管制筛查,到"这个法域有什么规则"的跨境法规调研,再到"怎么落地"的 ODI 备案、目的国准入与海外客户背调。后端调用 Cue 平台制裁名单、出口管制清单、海关提单、境外工商登记、司法裁判、监管文件、法条原文与多法域判例等公开数据,多源交叉验证,每条结论带可点击来源链接。
核心命题:一次覆盖出海合规的 12 个维度,一个入口,风险一个不漏。 不是"AI 说的",是"数据源说的"——公开数据覆盖不到的维度标注"公开数据不足"而非编造或跳过。
本 skill 是 12 个合规搭子的路由套件:用户问什么,就路由到对应的搭子跑深度研究。12 个搭子按四大合规域组织,见下方决策树。
第一层:边界层
适用范围
- 跨境合作/交易前的制裁与出口管制筛查(合作方、关联方、清单列名、美国管制全景)
- 跨境法规调研、中外法律对比、境外诉讼判例检索
- 目标行业反倾销/反补贴/保障措施等贸易救济动态跟踪
- 出海落地:ODI 备案核实、目的地国营商准入、海外客户背调
- 药企/医药跨境业务的监管适用边界
不适合
- 国内企业尽调(走企业信用尽调 / 企业信用尽调场景)
- 实时行情查询、二级市场选股
- 个人征信、需要私有数据(银行流水/内账/未公开合同)的场景
工具面硬边界
仅覆盖公开数据源。主体内部的采购决策、未公开合同、账期往来等拿不到的,报告标注"需人工补充"。不编造主体的私有商业信息。
第二层:身份层
12 个搭子对应 12 种合规诉求,Agent 按用户意图路由到一个搭子(语义相近时列候选让用户确认,不擅自决定):
| 合规域 | 搭子(角色) | 触发信号 | |---|---|---| | 制裁与出口管制 | 跨境制裁与海外执法筛查 | "查查这个合作方有没有制裁/海外执法记录" | | 制裁与出口管制 | 关联方制裁暴露核查 | "从股权穿透查 XX 的关联方有没有被制裁" | | 制裁与出口管制 | 制裁与出口管制暴露筛查 | "XX 被列入哪些制裁/出口管制清单、次级制裁敞口" | | 制裁与出口管制 | 美国管制风险全景核查 | "XX 在美国的 CFIUS/ICTS/UFLPA/1260H 管制风险全景" | | 跨境法规与诉讼 | 跨境法规调研 | "查 XX 国/法域的法规原文与适用条款" | | 跨境法规与诉讼 | 中外法律对比 | "XX 议题中美/多法域规则有什么异同" | | 跨境法规与诉讼 | 境外诉讼案例库 | "XX 主题在主要法域有哪些判例/监管案例" | | 跨境法规与诉讼 | 药企跨境合规全球监管 | "药企/医药跨境业务的监管适用边界" | | 贸易救济 | 贸易救济与出口合规 | "某行业反倾销/反补贴调查与涉案企业税率" | | 出海落地与背调 | 出海企业资质尽调底稿 | "XX 企业的 ODI 备案/海外实体/出海资质" | | 出海落地与背调 | 目的地国营商准入扫描 | "进 XX 国做生意要注意什么(准入/审批/税务)" | | 出海落地与背调 | 海外客户背调与风险排查 | "背调 XX 海外客户/买家的工商与涉诉记录" |
同一套数据工具箱,不同搭子调用的数据源组合与报告结构不同。
第三层:质量标准层
每个搭子的交付必须达到以下标准才算合格,不达标不能交付:
- 每条结论必须有可点击来源链接 — 不能出现"据公开信息""市场普遍认为"等无锚表述
- 命中/结论必须有证据锚点 — 制裁命中落到具体名单与条目,判例落到具体案号,税率落到具体调查案号,不能空推
- 主体必须精确 — 报告标题含目标主体全称(企业名/法域/行业),不张冠李戴
- 公开数据不足必须显式标注 — 拿不到的维度标"公开数据不足 / 需人工补充",不跳过、不编造
- 结论可回查 — 每条结论的出处可点开复核,来源名可读(不出现内部证据编号)
- 合规但进攻性 — 提供风险研判与落地建议,但不主张规避监管、不编造主体负面事实
第四层:工作流层
单搭子模式(默认)
用户问题明确指向某个合规域/搭子时,直接路由到对应搭子跑。不需要串接多个搭子。
多搭子串接(按需)
仅当用户诉求横跨多个合规域时(如"先背调这个海外客户,再查目的地国准入"),按顺序逐个跑,每个单独确认 credits、单独交付,不自动串。
每搭子满意度闭环
每份报告展示完毕后:
这份报告满意吗?
- 满意,结束
- 不满意,补充信息重跑(调整主体/补充线索)
- 不满意,换个搭子(引导到语义相近的其他搭子)
用户选 2/3 时不再重复确认 credits(同一问题回退重跑不额外计费感),但需确认新参数后再跑。
第五层:硬规则层
- 每次跑前显式确认 credits — 哪怕用户说"直接跑",也确认一次
- 不自动选主体/搭子 — 主体名称含糊时必须澄清;语义相近的多个搭子列 ≤2 候选让用户确认,不擅自决定
- 不编造主体私有信息 — 采购决策、未公开合同、账期往来等公开数据拿不到的一律标"需人工补充"
- 结论必须带来源链接 — 公开数据覆盖不到的维度标"公开数据不足",不跳过、不杜撰
- 不在 agent 侧重写后端推理逻辑 — 清单比对规则、信源权重、报告结构是后端 search_plan 的活
- 合规红线不越 — 提供风险研判,但不指导规避监管、不编造主体负面事实
- 保留 conversation_id — 每次跑完告知用户可在 cuecue.cn 工作台回看
第六层:反模式层
以下为 AI 在出海合规研究中最容易犯的错误,必须主动避免:
| 反模式 | 错误表现 | 正确做法 | |---|---|---| | 制裁命中空推 | 说"XX 有制裁风险"却不给具体名单/条目 | 落到具体名单(OFAC SDN/BIS Entity List/欧盟)与条目编号 | | 法域张冠李戴 | 把美国规则套到欧盟、把中国规则套到东南亚 | 按目标法域取原文,标注法域与生效时间 | | 判例时效错乱 | 引用已废止/被推翻的判例,或 5 年前的监管公告 | 判例标注判决日期与是否被推翻,监管动态优先近 1 年 | | 主体混淆 | 同名企业、关联主体混为一谈 | 用统一社会信用代码/注册号/国家区分主体,穿透股权核实关联 | | 税率/条款过期 | 反倾销税率用旧调查期数据 | 标注调查案号、终裁日期,提示是否有日落复审/行政复审 | | 公开数据不足硬编 | 非上市主体财务拿不到,硬给一个数 | 明确标注"公开数据不足",用间接推演并标置信度 | | 把营销稿当事实 | 采信企业官网自吹的合规声明 | 以官方名单/监管文件/司法裁判为事实源,营销稿仅作背景 |
第七层:输出模式层
| 输出模式 | 适用场景 | 交付内容 | |---|---|---| | 完整合规底稿(默认) | 用户要做合规判断 | 对应搭子的完整结构化报告,每条含来源链接 | | 速览卡 | 快速决策/会议前 | 仅:核心风险信号 + 一句话结论 + 关键命中 | | 证据清单 | 用户要可复核的引用 | 仅:结论 + 对应来源链接清单,逐条可点开 | | 对比表 | 多法域/多主体对比 | 仅:横向对比矩阵 + 差异结论 |
Agent 根据用户指令自动选择,不需用户显式指定。
第八层:验收层
交付前 agent 必须对照此 checklist 逐项自检:
- [ ] 每条结论是否有可点击来源链接?
- [ ] 制裁/清单命中是否落到具体名单与条目编号?
- [ ] 法域是否标注清楚、法条/判例是否标注日期与生效状态?
- [ ] 主体是否精确(全称 + 统一社会信用代码/注册号区分同名)?
- [ ] 公开数据覆盖不到的维度是否显式标注"公开数据不足"?
- [ ] 有没有编造主体私有信息?
- [ ] 报告标题是否包含目标主体全称?
- [ ] conversation_id 是否已告知用户?
参考库层
scripts/cue_api.py— Cue API 调用封装(chat_stream / replay / search_templates / load_config)- 12 个搭子的 template_id 在 metadata 中(本 SKILL.md 即参考)
能做什么(从 12 个搭子提取的能力面)
域一:制裁与出口管制(4 个搭子)
| 搭子 | 做什么 | |---|---| | 跨境制裁与海外执法筛查 | 跨境合作前核查对方海外合规记录:制裁名单、海外监管披露、经纪合规与执法记录,产出可逐条回查的合规证据底稿 | | 关联方制裁暴露核查 | 从股权穿透扩出关联主体集,逐个核查 OFAC/欧盟/新加坡制裁名单,产出主体-关系-命中-来源的暴露底稿 | | 制裁与出口管制暴露筛查 | 核查主体及关联方是否被美国(OFAC/BIS 实体清单/涉军)及欧盟、新加坡制裁与出口管制清单列名,研判次级制裁敞口 | | 美国管制风险全景核查 | 核查中国企业的美国管制风险全景(CFIUS/ICTS/UFLPA/1260H/BIS/SEC/FDA/FINRA) |
域二:跨境法规与诉讼(4 个搭子)
| 搭子 | 做什么 | |---|---| | 跨境法规调研 | 定向检索目标司法辖区法律法规原文与核心条款,提炼立法背景与适用边界,结论附原始出处 | | 中外法律对比 | 围绕一个法律议题横跨多法域取法条原文与文献做比较法分析,产出带出处的法律研究底稿 | | 境外诉讼案例库 | 围绕一个主题检索主要法域公开判例与监管公告,归纳诉因、判决倾向与对中国主体的合规启示 | | 药企跨境合规全球监管动向 | 以正式法律文本/官方名单/监管文件拆解涉外监管对合同、采购、供应链的适用边界(药企向) |
域三:贸易救济(1 个搭子)
| 搭子 | 做什么 | |---|---| | 贸易救济与出口合规 | 跟踪目标行业反倾销/反补贴/保障措施调查动态,映射涉案企业与税率变化,识别出口合规风险(实体清单/碳关税/供应链溯源) |
域四:出海落地与背调(3 个搭子)
| 搭子 | 做什么 | |---|---| | 出海企业资质尽调底稿 | ODI 备案核实、海外实体关系梳理、海关 AEO 与海外涉诉筛查,产出可回查的出海资质底稿 | | 目的地国营商准入扫描 | 扫一遍目的地国外商投资准入:负面清单、敏感行业审批、税务/劳动/数据合规要点,产出落地底稿 | | 海外客户背调与风险排查 | 支持欧美及一带一路国家官方工商登记署、海关提单与涉诉黑名单的自动化背调(外贸/出海风控/跨境销售) |
准备:API key 一次性配置
- 打开 https://cuecue.cn/api-key(需注册 Cue 账号,手机号直接注册)
- 创建一个 API key(格式
sk...),复制 - 设置环境变量:
export CUE_API_KEY=sk...
或写入 ~/.cue/config.json:
{ "api_key": "sk...", "base": "https://cuecue.cn/api" }
可选:export CUE_API_BASE=https://cuecue.cn/api(覆盖默认 API 地址)。
关于 Credits
Cue 新用户每天有 10 个免费积分,跑一次合规研究约 5-15 credits。每次跑之前 agent 显式确认,不跑不扣费。可在 cuecue.cn 工作台核对余额。
Credits 耗尽时:提示用户"今日免费积分已用完,可到 cuecue.cn 购买更多积分,或明天再来"。
决策树(agent 怎么响应用户)
用户说什么 → 走哪个搭子
──────────────────────────────────────────────────────────────────────────────────
"查查 XX 合作方有没有制裁/出口管制/海外执法记录" → 跨境制裁与海外执法筛查
"从股权穿透查 XX 的关联方有没有被制裁" → 关联方制裁暴露核查
"XX 被列入哪些制裁/出口管制清单、次级制裁敞口" → 制裁与出口管制暴露筛查
"XX 在美国的 CFIUS/ICTS/UFLPA/1260H 管制风险全景" → 美国管制风险全景核查
"查 XX 国/法域的法规原文与适用条款" → 跨境法规调研
"XX 议题中美/多法域规则有什么异同" → 中外法律对比
"XX 主题在主要法域有哪些判例/监管案例" → 境外诉讼案例库
"药企/医药跨境业务的监管适用边界" → 药企跨境合规全球监管动向
"某行业反倾销/反补贴调查与涉案企业税率" → 贸易救济与出口合规
"XX 企业的 ODI 备案/海外实体/出海资质" → 出海企业资质尽调底稿
"进 XX 国做生意要注意什么(准入/审批/税务)" → 目的地国营商准入扫描
"背调 XX 海外客户/买家的工商与涉诉记录" → 海外客户背调与风险排查
语义相近的多个搭子(如多个制裁类搭子) → 列 ≤2 候选让用户确认,不擅自决定
"XX 公司授信风险"(国内尽调诉求) → 拒绝,引导到企业信用尽调场景
"XX 股票能买吗"(二级选股) → 拒绝,引导到权益投资相关工具
使用示例
例1 — 合作方制裁筛查:
用户:"跟美国那边一个供应商合作前,先查查它有没有制裁记录" Agent:确认主体全称与国别 → 确认 credits → 跑「跨境制裁与海外执法筛查」→ 交付可逐条回查的合规证据底稿
例2 — 美国管制全景:
用户:"这家芯片公司在美国有哪些管制风险暴露(CFIUS/实体清单)" Agent:确认 credits → 跑「美国管制风险全景核查」→ 交付 CFIUS/ICTS/UFLPA/1260H/BIS 全景底稿
例3 — 目的国准入:
用户:"进越南做生意要注意哪些准入/审批/税务合规" Agent:确认 credits → 跑「目的地国营商准入扫描」→ 交付负面清单/敏感行业/税务/数据合规底稿
例4 — 海外客户背调:
用户:"这个迪拜客户靠不靠谱,帮我查一下工商和涉诉" Agent:确认主体 → 确认 credits → 跑「海外客户背调与风险排查」→ 交付工商登记/海关提单/涉诉黑名单背调报告
主流程
通用 chat_stream 封装
12 个搭子使用同一个 scripts/cue_api.py,仅 template_id 不同:
import sys, uuid, json
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent / "scripts"))
from cue_api import chat_stream, replay, CueAPIError
TEMPLATES = {
"sanctions_screening": "template_JPc18q", # 跨境制裁与海外执法筛查
"related_party_sanctions":"template_HAVVGt", # 关联方制裁暴露核查
"export_control": "template_T0tYXn", # 制裁与出口管制暴露筛查
"us_regulatory_panorama": "template_yFf07L", # 美国管制风险全景核查
"trade_remedy": "template_8Uoizn", # 贸易救济与出口合规
"cross_border_law": "template_OMHlsO", # 跨境法规调研
"comparative_law": "template_jbjaEU", # 中外法律对比
"overseas_litigation": "template_YvrDHp", # 境外诉讼案例库
"pharma_compliance": "template_ArDIi8", # 药企跨境合规全球监管动向
"odi_qualification": "template_x4Jycf", # 出海企业资质尽调底稿
"market_entry": "template_oqJOlc", # 目的地国营商准入扫描
"overseas_customer_dd": "template_Iu2Qxq", # 海外客户背调与风险排查
}
def run_buddy(key: str, user_query: str):
template_id = TEMPLATES[key]
payload = {
"messages": [{"role": "user", "content": user_query}],
"conversation_id": f"cue-compliance-{uuid.uuid4().hex[:12]}",
"chat_id": uuid.uuid4().hex,
"template_id": template_id,
"need_analysis": False,
"need_confirm": False,
"need_underlying": False,
"need_recommend": False,
}
report_pieces = []
reporter_started = False
try:
for event, data in chat_stream(payload, max_seconds=900):
if event == "start_of_agent":
try:
d = json.loads(data)
agent_name = d.get("data", {}).get("agent_name", "") or d.get("agent_name", "")
if agent_name == "reporter":
reporter_started = True
except json.JSONDecodeError:
pass
elif event == "end_of_agent":
try:
d = json.loads(data)
agent_name = d.get("data", {}).get("agent_name", "") or d.get("agent_name", "")
if agent_name == "reporter":
reporter_started = False
except json.JSONDecodeError:
pass
elif event == "message" and reporter_started:
try:
d = json.loads(data)
delta = d.get("data", {}).get("delta", {})
content = delta.get("content", "")
if content:
report_pieces.append(content)
print(content, end="", flush=True)
except json.JSONDecodeError:
pass
except CueAPIError as e:
print(f"\n[错误] {e.user_hint()}")
# Empty report fallback (不扣 credits)
if not report_pieces:
reporter_started = False
for event, data in replay(payload["conversation_id"], max_seconds=600):
if event == "start_of_agent":
try:
d = json.loads(data)
agent_name = d.get("data", {}).get("agent_name", "") or d.get("agent_name", "")
if agent_name == "reporter":
reporter_started = True
except json.JSONDecodeError:
pass
elif event == "end_of_agent":
try:
d = json.loads(data)
agent_name = d.get("data", {}).get("agent_name", "") or d.get("agent_name", "")
if agent_name == "reporter":
reporter_started = False
except json.JSONDecodeError:
pass
elif event == "message" and reporter_started:
try:
d = json.loads(data)
delta = d.get("data", {}).get("delta", {})
content = delta.get("content", "")
if content:
report_pieces.append(content)
print(content, end="", flush=True)
except json.JSONDecodeError:
pass
if not report_pieces:
print(f"报告生成失败(后端可能超时)。已保存 conversation_id: {payload['conversation_id']},可在 cuecue.cn 工作台查看或稍后重试。")
return "".join(report_pieces)
max_seconds 调参:单个搭子通常 5-10 分钟,max_seconds=900 足够;多搭子串接勿设过短——后端有 60 分钟硬超时,client 端等待不要短于后端。
边界处理
| 场景 | 处理方式 | |---|---| | 主体名称模糊 | 列出候选,让用户确认(区分同名企业用注册号/国别) | | 语义相近多个搭子 | 列 ≤2 候选让用户确认,不擅自决定 | | 主体在公开数据无记录 | 提示"公开数据中未找到该主体,请核实名称/国别",建议先核实主体 | | 网络超时 | 提示检查网络/VPN,给 conversation_id 供后续 replay | | 空报告(后端生成失败) | 用 replay 兜底;再空则提示用户到 cuecue.cn 工作台查看 | | Credits 耗尽 | 提示"今日免费积分已用完,可购买或明天再来" | | 模板 404 | 提示"搭子模板未找到,请联系 Cue 管理员" | | 用户要求私有数据场景 | 拒绝执行,说明 Cue 仅覆盖公开数据 | | 用户粘贴 sk- 开头的 API key | 提醒去 cuecue.cn/api-key 立即轮换 |
安全规则
- API key 绝不出现在输出/日志/提交的代码中
- 用户不慎粘贴
sk...→ 提醒轮换 - 用户提供的本地材料只在 agent 上下文使用,绝不上传到 Cue 服务端
- 报告中出现的主体名称、金额仅为查询结果,skill 本身不存储
脚本到模块映射
| 函数 | 用途 | 示例 |
|---|---|---|
| chat_stream(payload, max_seconds) | 流式调用 Cue,迭代 (event, data) | for event, data in chat_stream(payload, max_seconds=900) |
| replay(conversation_id, max_seconds) | 重放已完成 conversation(空报告兜底,不扣 credits) | for event, data in replay(conv_id) |
| search_templates(keyword) | 按关键词搜索搭子模板 | search_templates("制裁") |
| load_config() | 读取 API key 和 base URL 配置 | api_key, base = load_config() |
兼容性
| Platform | 状态 | 调用方式 |
|---|---|---|
| Claude Code | ✅ 已验证 | 把 skill 目录放入 ~/.claude/skills/,Skill 工具自动加载 |
| Codex CLI | ✅ 已验证 | 按 codex skill 约定加载 SKILL.md + scripts/ |
| WorkBuddy | 待验证 | 放入 ~/.workbuddy/skills/ |
| Cursor | 待验证 | 放入 .cursor/skills/ |
| Gemini CLI | 待验证 | gemini extensions install |
scripts/ 用 Python 3.10+ stdlib,任何能跑 Python 的环境都通。
参考
- Cue 平台:https://cuecue.cn
- Playbook 页面:https://cuecue.cn/playbook
- API Key 管理:https://cuecue.cn/api-key
- 12 个搭子的 template_id 见本文件 metadata 与「主流程」TEMPLATES 字典
Scan to join WeChat group