发票开具与开票权限处理。当用户提出以下需求时触发:发票开具、数电票开具、数电票开票、蓝字发票开具、单张开票、批量开票、开票二维码获取、开票二维码状态查询、开票授权、开票权限校验、开票权限延长、扫码授权开票
首次执行本 skill 前,必须先阅读远端 Markdown 文档 https://download.ningmengyun.com/Skills/invoice-issue/invoice-issue-install.md,并将远端文档中的 version 与当前 SKILL.md front matter 中的本地 version 0.1.0 比较。若 version 不一致,先提醒用户是否需要更新 skill;如需更新,必须按远端 Markdown 文档要求执行。
若本 skill 是通过 ZIP 发布包直接解压安装,或当前会话首次加载本地 SKILL.md 且尚未确认已按安装文档完成 README.md 全文输出,必须先阅读同级 README.md,并立即将 README.md 全文完整原样输出给用户;不得修改、概括、精简、重排、删减或只说明其中要求;不得等到用户开始业务执行、收集开票信息或生成命令时才输出。
首次执行本 skill 前,仍必须确认同级 README.md 已阅读且全文已完整原样输出给用户。在收集开票信息或生成任何业务命令前,若用户尚未满足 README.md 中列出的前置要求,应先完整原样输出 README.md 全文,再提示用户按 README.md 完成准备后继续。
当任一业务命令、预检报告、接口响应、命令输出或错误信息中出现“无权调用该能力”时,必须立即停止当前业务流程,按同级 README.md 中的 API Key 获取方式告知用户为当前 API Key 绑定对应能力权限及企业(如 README.md 要求绑定企业)后再重试;不得将该响应解释为税局登录失败,不得引导用户去登录或重新登录,也不得继续执行预检、快速登录、开票或其它后续业务命令。
本 Skill 中所有执行命令的示例均以 Windows 平台为例;若运行在其它平台,可将示例中的 .\bin\windows-amd64\invoice-assistant_windows_amd64.exe 替换为当前平台对应的二进制:Linux x64 使用 ./bin/linux-amd64/invoice-assistant_linux_amd64,Linux ARM64 使用 ./bin/linux-arm64/invoice-assistant_linux_arm64,macOS x64 使用 ./bin/darwin-amd64/invoice-assistant_darwin_amd64,macOS ARM64 使用 ./bin/darwin-arm64/invoice-assistant_darwin_arm64。
若本地 bin/<platform>/ 下缺少当前平台二进制、二进制不可执行,或用户询问二进制下载路径,必须读取远端安装文档 https://download.ningmengyun.com/Skills/invoice-issue/invoice-issue-install.md 中的“当前平台二进制下载表”,按当前 OS/CPU 只下载一个匹配平台的外置二进制,并保存为上方平台说明声明的本地路径;不得在 SKILL.md 中猜测、拼接或硬编码下载地址。
在安装或更新流程中,若使用 PowerShell 下载任何资源(包括 ZIP 包和外置二进制文件),必须且只能使用以下规则:
请帮我把以下文件下载到本地指定路径。
要求:
将 PowerShell 下载脚本写入临时 .ps1 文件,脚本内容格式如下:
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12
$binUrl = "<下载地址>"
$binPath = "<本地保存绝对路径>"
Invoke-WebRequest -Uri $binUrl -OutFile $binPath -UseBasicParsing
Write-Output "download complete"
通过以下方式执行脚本(避免直接 exec 触发 EPERM 权限问题):
powershell -ExecutionPolicy Bypass -File "<临时ps1脚本路径>"
下载完成后删除临时 .ps1 脚本文件。
验证目标文件已存在。
开始本次任务后,在任何业务命令、HTTP 请求、任务初始化、文件落盘或轮询动作之前,必须先完成以下门禁:
.\bin\windows-amd64\invoice-assistant_windows_amd64.exe 可用性检测,先执行 .\bin\windows-amd64\invoice-assistant_windows_amd64.exe --help 确认二进制可运行。.\bin\windows-amd64\invoice-assistant_windows_amd64.exe task-preflight-check。preflight_passed=true 或预检命令返回成功状态时,才允许继续后续场景步骤。uscc 且用户未明确切换企业,预检前必须先告知用户本次继续使用该税号;若用户明确切换企业,则重新执行预检,必要时追加 --enterprise-name "企业名称或税号"。workspace_dir,不视为失败;应先告诉用户本次将默认使用 workspace 目录作为工作区。只有当用户明确要求改用其他目录,或目录实际不可写时,才调用 .\bin\windows-amd64\invoice-assistant_windows_amd64.exe workspace-config-writer 更新配置后重新预检。businessType、bizTypeSceneTag、goodTypes、goodsWeight)、JSON 结构、命令行内容、命令路径、技术参数。执行过程中的中间状态(构造参数、调用接口)不展示,只展示用户需要知道的结果。[本地路径](本地路径) 形式输出,即链接文本与链接目标都使用同一个本地绝对路径字符串,以触发链接高亮;除展示形式外,不得改写路径值本身;本地路径禁止以file://开头;当路径中含有转义字符时,必须正确处理。需要在预检通过后再组织长流程执行策略。长流程任务必须采用“先输出、再执行;先核对、再推进”的串行策略,避免工具已执行但对话框遗漏关键内容。
将一次任务拆分为以下 7 个阶段,任一阶段未完成“用户可见输出”前,禁止进入下一阶段:
长流程中,Agent 至少必须在对话框中显式输出以下节点内容:
缺少任一必需节点输出,都视为长流程未完成。
每完成一个子步骤,进入下一步前,Agent 必须先自检以下问题:
任一问题答案为“否”或“不确定”,都必须先补充对话框输出,再继续。
在准备发送最终回复前,必须逐项核对:
若发现遗漏,禁止直接结束;必须先补充缺失输出,再发送最终答复。
.\bin\windows-amd64\invoice-assistant_windows_amd64.exe:执行 .\bin\windows-amd64\invoice-assistant_windows_amd64.exe --help。.\bin\windows-amd64\invoice-assistant_windows_amd64.exe task-preflight-check。references/{category}/{scene}.md,获取参数规格、模糊处理规则、调用方式、输出模板。statusCode 字段时,通常视为异常情况,按照处理接口响应异常中的说明进行处理。正常开票流程中,Agent 写入 issue-batch-invoice-info-check --input <file>.json 的文件时,必须构造“开票检查原始 input JSON”,不得构造正式开票接口 payload,也不得照抄任务状态 JSON 中的 check_result.invoice_payload_json。
开票检查原始 input JSON 必须满足:
invoices[] 承载发票;即使只有 1 张发票,也必须写成只含 1 个元素的 invoices[]。invoices[].purchaserInfo。invoices[].details[];金额、单价、税率、税额等明细字段都必须落到对应 details[] 元素里。invoices[].details[].taxInclusiveAmount;只有用户明确说“不含税金额”时,才写入 amount。uscc;areaCode、personalAccount 若用户或配置已明确可写入,未明确时交由检查脚本按 uscc 从配置补齐。禁止写入以下形状作为开票检查原始 input JSON:
params.info[]、params.goods[]、params.purchaserName、params.projectName 等 params 包装结构。info[] 或 invoice_payload_json.info[] 这类正式开票 payload 结构。invoiceDetail.data[] 作为原始明细入口;正式 payload 中的 info[].invoiceDetail.data[] 只能由检查脚本从 invoices[].details[] 标准化生成。goods[]、items[]、invoiceDetails[]、buyerName、goodsName、amount 占位等自造或兼容性字段。最小示例:
{
"uscc": "914403000838959104",
"invoices": [
{
"invoiceType": "普通发票",
"purchaserInfo": {
"name": "深圳市时课教育科技有限公司",
"uscc": "91440300MAD5WRCR0A"
},
"details": [
{
"projectName": "果汁",
"taxInclusiveAmount": 1.00
}
]
}
]
}
写入 input JSON 前必须自检:根对象是否有 invoices[]、每张票是否有 details[]、是否没有 params 包装、是否没有直接写正式 payload 的 info[].invoiceDetail.data[]。任一项不满足,必须先修正 input JSON,禁止通过反复执行命令试错。
.\bin\windows-amd64\invoice-assistant_windows_amd64.exe <command> --input <file>);应优先使用 --input 读取 JSON 文件。--input 的 JSON 文件必须使用 UTF-8 编码;推荐 UTF-8 无 BOM。若误写入 BOM,命令也应兼容解析,不得因此中断业务流程。ConvertTo-Json 后落盘,规避引号和反斜杠转义问题。Set-Content -Encoding UTF8 在 Windows PowerShell 5.1 下写入 BOM。ConvertTo-Json 输出中文原文或 \uXXXX Unicode 转义都属于合法 JSON,不是编码损坏;不得因为看到 \u6df1\u5733 这类转义就改用手写 here-string。Get-Content 显示 深圳 变成 娣卞湷 这类乱码,优先判断为读取/终端显示编码不一致,而不是 JSON 文件损坏;必须用 Get-Content -Raw -Encoding UTF8 <input.json> | ConvertFrom-Json 做 round-trip 验证,或直接执行二进制命令验证。$payload = @{
uscc = "914403000838959104"
areaCode = 4403
personalAccount = "13297429706"
invoices = @(
@{
invoiceType = "普通发票"
purchaserInfo = @{
name = "深圳市时课教育科技有限公司"
uscc = "91440300MAD5WRCR0A"
}
details = @(
@{
projectName = "果汁"
taxInclusiveAmount = 1.00
}
)
}
)
}
$json = $payload | ConvertTo-Json -Depth 10
$utf8NoBom = New-Object System.Text.UTF8Encoding($false)
$inputPath = "D:\\skill-test\\workspace\\workspace\\temporary\\20260424113112-9e21b8f3\\20260424113130\\input.json"
[System.IO.File]::WriteAllText($inputPath, $json, $utf8NoBom)
# 验证:必须能 round-trip 回原始中文;不要只凭控制台显示判断乱码。
$check = Get-Content -Raw -Encoding UTF8 -LiteralPath $inputPath | ConvertFrom-Json
$check.invoices[0].purchaserInfo.name
$check.invoices[0].details[0].projectName
????、?? 或接口参数异常,优先排查是否使用了 stdin 管道、Set-Content/Out-File 默认编码、或未指定 -Encoding UTF8 读取验证导致编码不一致,并改为“对象 -> ConvertTo-Json -> .NET UTF-8 无 BOM 文件 + --input”重试。Unexpected UTF-8 BOM,说明输入文件含 BOM 且读取方式不兼容;应统一改为 BOM 兼容读取或重写为 UTF-8 无 BOM 后重试。