<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://blog.hikaripublic.xyz/</id>
  <title type="text">HiKaRi Blog</title>
  <subtitle type="text">AI API 接入、成本与工程实践</subtitle>
  <updated>2026-10-25T00:00:00.000Z</updated>
  <author><name>HiKaRi Blog</name></author>
  <link rel="alternate" href="https://blog.hikaripublic.xyz/"/>
  <link rel="self" href="https://blog.hikaripublic.xyz/atom.xml"/>
  <generator uri="https://github.com/CuteLeaf/Firefly">Firefly v6.16.8</generator>
    <entry>
      <id>https://blog.hikaripublic.xyz/posts/start-here/</id>
      <title type="text">从这里开始：HiKaRi API 接入与阅读路线图</title>
      <published>2026-10-25T00:00:00.000Z</published>
      <updated>2026-10-25T00:00:00.000Z</updated>
      <author><name>HiKaRi Blog</name></author>
      <link rel="alternate" href="https://blog.hikaripublic.xyz/posts/start-here/"/>
      <summary type="text">第一次接入、排查报错、选择渠道或开展团队项目，从对应入口开始。先验证最小请求，再扩大使用。</summary>
      <content type="html"><![CDATA[<p>HiKaRi Blog 围绕一件事展开：把 AI API 接好、用稳、算清楚。第一次来，可以按你的任务选择一条路线，不必从头读完所有文章。</p>
<section><h2>第一次调用 API<a href="#第一次调用-api"><span>#</span></a></h2><ol>
<li>到 <a href="https://hikariapi.xyz/register?utm_source=hikari_blog&amp;utm_medium=referral&amp;utm_campaign=launch&amp;utm_content=start-here" target="_blank">HiKaRi 主站注册</a>，完成站内要求的邮箱验证。</li>
<li>登录后确认可用资金，在 API Key 页面创建密钥、选择实际需要的分组。</li>
<li>在模型广场复制该 Key 有权使用的精确模型名。模型广场当前需要登录；教程提及的型号不代表你的分组已开放。</li>
<li>阅读 <a href="/posts/base-url-and-api-key/">地址与密钥怎么填</a>，再用 <a href="/posts/python-first-api-call/">Python 最小请求</a> 验证一条短文本。</li>
<li>最小请求成功后，再配置客户端、开启流式输出，最后接入长上下文、工具或媒体任务。</li>
</ol><p>不要同时修改模型、线路和客户端配置。一次只改变一个变量，问题才容易定位。</p></section>
<section><h2>已经接入，但遇到问题<a href="#已经接入但遇到问题"><span>#</span></a></h2>

<table><thead><tr><th>现象</th><th>从哪里开始</th></tr></thead><tbody><tr><td>401、403、404、429</td><td><a href="/posts/api-errors-401-429/">HTTP 错误排查</a></td></tr><tr><td>请求成功，但不逐字显示</td><td><a href="/posts/streaming-and-sse/">流式输出与缓冲</a></td></tr><tr><td>终端能用，客户端不能用</td><td><a href="/posts/client-setup-checklist/">客户端配置清单</a></td></tr><tr><td>超时后不知道是否重发</td><td><a href="/posts/retry-and-idempotency/">重试与幂等</a></td></tr><tr><td>视频完成却不能下载</td><td><a href="/posts/image-video-workflow/">图片与视频任务流程</a></td></tr></tbody></table><p>问题仍未解决时，到 <a href="/guestbook/">联系与交流</a> 查看需要提供的脱敏信息。不要发送完整 API Key。</p></section>
<section><h2>正在选型或核算成本<a href="#正在选型或核算成本"><span>#</span></a></h2><p>先读 <a href="/posts/channel-selection/">渠道来源与服务边界</a>，再看 <a href="/posts/token-cost-explained/">Token 成本怎么算</a> 和 <a href="/posts/model-evaluation/">模型评测怎么做</a>。本博客不维护第二份实时价目表，价格、权限与实际计费以主站当前信息为准。</p><p>团队采购可以从 <a href="/posts/team-onboarding-and-invoices/">团队接入与开票</a> 开始；合成数据和蒸馏项目请先看 <a href="/posts/distillation-data-quality/">数据质量与验收</a>。</p></section>
<section><h2>HiKaRi 提供什么<a href="#hikari-提供什么"><span>#</span></a></h2><p>HiKaRi 以不掺水、明示渠道来源、明确价格为服务定位，提供多模型 API 接入，并承接团队对接、开票及授权数据项目。具体协议、型号、并发与交付范围需要逐项核对，不在博客中作无限额或永久可用承诺。</p><ul>
<li><a href="https://hikariapi.xyz/docs/overview" target="_blank">API 文档</a>：实际请求格式和支持范围。</li>
<li><a href="https://hikariapi.xyz/resources" target="_blank">服务说明</a>：渠道、费用、团队与开票入口。</li>
<li><a href="https://hikariimg.xyz/" target="_blank">生图站</a>：需要图形界面时的图片生成入口。</li>
</ul><p>文章中的计算例子会标明假设；示例代码不代表已对每个模型进行付费测试。你可以先用一条低成本请求核对，再按自己的任务逐步扩大。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.hikaripublic.xyz/posts/api-errors-401-429/</id>
      <title type="text">AI API 返回 401、403、404、429：按顺序排查</title>
      <published>2026-10-25T00:00:00.000Z</published>
      <updated>2026-10-25T00:00:00.000Z</updated>
      <author><name>HiKaRi Blog</name></author>
      <link rel="alternate" href="https://blog.hikaripublic.xyz/posts/api-errors-401-429/"/>
      <summary type="text">从认证、权限、路径、参数和限流逐步缩小范围，附可用于沟通的脱敏问题模板。</summary>
      <content type="html"><![CDATA[<p>报错先记录发生时间、HTTP 状态和响应中的具体错误。不要同时切换供应商、线路、模型、Key 后再判断哪个设置有效。</p>
<section><h2>先看状态，再看具体错误<a href="#先看状态再看具体错误"><span>#</span></a></h2>

<table><thead><tr><th>状态或现象</th><th>优先检查</th><th>下一步</th></tr></thead><tbody><tr><td>400 / 422</td><td>字段名、类型、参数组合和模型限制</td><td>按响应指出的字段修正，先去掉非必需参数</td></tr><tr><td>401</td><td>本站 Key、认证 Header、前后空白或过期凭据</td><td>在本机重新复制有效 Key，检查客户端读取来源</td></tr><tr><td>403</td><td>Key 与分组权限、资金、模型开放状态</td><td>核对实际授权，不能靠新建 Key 绕过</td></tr><tr><td>404</td><td>endpoint、重复 <code>/v1</code>、模型或任务归属</td><td>比对实际路径，任务使用有权限的身份查询</td></tr><tr><td>409</td><td>幂等键内容变化或任务状态冲突</td><td>保留原业务与任务号，按错误说明继续处理</td></tr><tr><td>429</td><td>请求速率、并发或上游容量</td><td>降低并发，尊重 <code>Retry-After</code>，避免同步重试</td></tr><tr><td>5xx / 连接超时</td><td>服务、上游与网络，以及请求是否已受理</td><td>先查记录；媒体任务优先续查原 ID</td></tr></tbody></table><p>状态码只是入口，不同协议可能返回更具体的错误类型。正文是 HTML 时，检查是否访问了网页、被代理改写或经过了登录跳转，不能直接当 JSON 解析。</p></section>
<section><h2>用最小请求做对照<a href="#用最小请求做对照"><span>#</span></a></h2><ol>
<li>先查询当前 Key 的模型目录。</li>
<li>使用客户端相同的地址、Key 和模型，发一条无附件、无工具的短文本。</li>
<li>目录请求失败，先解决认证和权限；短文本成功后，再逐步加回高级参数。</li>
<li>终端成功、客户端失败，按 <a href="/posts/client-setup-checklist/">客户端清单</a> 比较配置来源。</li>
</ol><p>调用目录不是完整生成测试；短文本也不能证明长上下文、图片或工具能力全部可用。</p></section>
<section><h2>超时后不要立刻重发<a href="#超时后不要立刻重发"><span>#</span></a></h2><p>连接在途中断开，客户端无法据此证明服务端没有受理。尤其图片、视频、工具执行可能存在成本或副作用。已有任务 ID 就续查，没有 ID 则保留原业务号、幂等键和时间，先核对记录。详见 <a href="/posts/retry-and-idempotency/">重试与幂等</a>。</p></section>
<section><h2>提交问题时可以照这个模板<a href="#提交问题时可以照这个模板"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>时间与时区：</span></div></div><div><div><div>2</div></div><div><span>客户端及版本：</span></div></div><div><div><div>3</div></div><div><span>运行环境：Windows / WSL / Docker / 远端</span></div></div><div><div><div>4</div></div><div><span>请求路径：只写路径，不附凭据</span></div></div><div><div><div>5</div></div><div><span>模型与分组：</span></div></div><div><div><div>6</div></div><div><span>HTTP 状态与脱敏错误：</span></div></div><div><div><div>7</div></div><div><span>任务 ID 或请求记录编号：</span></div></div><div><div><div>8</div></div><div><span>已验证的最小请求结果：</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>通过 <a href="/guestbook/">联系与交流</a> 找运营方核对。不要提交完整 Key、Cookie、私有素材链接或客户原始数据。</p><p>依据：<a href="https://hikariapi.xyz/docs/troubleshooting" target="_blank">HiKaRi 常见错误</a>。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.hikaripublic.xyz/posts/base-url-and-api-key/</id>
      <title type="text">Base URL、API Key 和模型名分别怎么填？</title>
      <published>2026-10-25T00:00:00.000Z</published>
      <updated>2026-10-25T00:00:00.000Z</updated>
      <author><name>HiKaRi Blog</name></author>
      <link rel="alternate" href="https://blog.hikaripublic.xyz/posts/base-url-and-api-key/"/>
      <summary type="text">区分站点地址、协议路径、Key 权限和精确模型名，避免 /v1/v1 与客户端认证配置错误。</summary>
      <content type="html"><![CDATA[<p>一次 API 请求至少包含四个独立信息：发往哪里、使用什么协议、由哪个 Key 认证、调用哪个模型。把它们分开检查，比反复换 Key 更有效。</p>
<section><h2>按客户端的拼接规则填写地址<a href="#按客户端的拼接规则填写地址"><span>#</span></a></h2>

<table><thead><tr><th>使用方式</th><th>HiKaRi 地址</th><th>谁追加接口路径</th></tr></thead><tbody><tr><td>需要填写 OpenAI 兼容 Base URL 的客户端</td><td><code>https://hikariapi.xyz/v1</code></td><td>客户端通常追加 <code>/chat/completions</code> 或 <code>/responses</code></td></tr><tr><td>Claude Code 或 Anthropic 风格客户端</td><td><code>https://hikariapi.xyz</code></td><td>客户端通常追加 <code>/v1/messages</code></td></tr><tr><td>自己编写原始 HTTP 请求</td><td><code>https://hikariapi.xyz</code></td><td>代码中写完整的 <code>/v1/...</code> 路径</td></tr></tbody></table><p>“通常”需要结合客户端的说明确认。有的输入框要求完整 endpoint，有的只接受站点根地址。最终请求日志比输入框标签更有判断价值。</p><p>如果返回路径是 <code>/v1/v1/chat/completions</code>，说明版本前缀重复；如果请求发到了 <code>/chat/completions</code>，则可能缺少 <code>/v1</code>。站内“API Key → 使用”提供了已配置线路时，优先使用该入口给出的说明。</p></section>
<section><h2>Key 是服务凭据，不是网页登录密码<a href="#key-是服务凭据不是网页登录密码"><span>#</span></a></h2><p>在 API Key 页面创建本站密钥，按应用分别管理。不要把上游官方平台 Key、网页登录密码或订阅账号 Cookie 填到本站 API Key 输入框。</p><p>分开 Key 有助于限额、轮换与排错，但创建更多 Key 不会凭空增加账号并发。Key 绑定分组、用户权限和可用资金仍会影响请求能否通过。</p></section>
<section><h2>模型名以目录为准<a href="#模型名以目录为准"><span>#</span></a></h2><p>从当前 Key 的目录或模型广场复制模型 ID，不要按印象拼写。版本、大小写、前后缀和媒体分辨率后缀可能影响路由。</p><p>先查询目录的 Bash 示例：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>export</span><span> </span><span>API_KEY</span><span>=</span><span>'在本机填写本站密钥'</span></div></div><div><div><div>2</div></div><div><span>curl</span><span> </span><span>--fail-with-body</span><span> </span><span>'https://hikariapi.xyz/v1/models'</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>  </span><span>-H</span><span> </span><span>"Authorization: Bearer </span><span>$API_KEY</span><span>"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>Windows PowerShell 使用 <code>curl.exe</code>，或按 <a href="/posts/python-first-api-call/">Python 教程</a> 请求，避免旧版 PowerShell 中 <code>curl</code> 别名造成参数混淆。不要把终端里填过的密钥截图发给别人。</p><p>目录列出名称，不等于声明该模型支持所有参数。工具调用、图片输入、结构化输出和思考档位需要单独核对。</p></section>
<section><h2>按这个顺序验收<a href="#按这个顺序验收"><span>#</span></a></h2><p>先查模型，再发短文本，然后开启流式，最后测试高级能力。若失败，保留请求路径和 HTTP 状态，按 <a href="/posts/api-errors-401-429/">报错清单</a> 排查。</p><p>依据：<a href="https://hikariapi.xyz/docs/overview" target="_blank">HiKaRi 开始使用</a>、<a href="https://hikariapi.xyz/docs/text-api" target="_blank">文字 API</a>。实时配置以主站文档为准。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.hikaripublic.xyz/posts/channel-selection/</id>
      <title type="text">选择 API 中转渠道：除了单价，还要核对哪些信息？</title>
      <published>2026-10-25T00:00:00.000Z</published>
      <updated>2026-10-25T00:00:00.000Z</updated>
      <author><name>HiKaRi Blog</name></author>
      <link rel="alternate" href="https://blog.hikaripublic.xyz/posts/channel-selection/"/>
      <summary type="text">把渠道来源、模型身份、协议能力、价格单位与验收记录放在同一张检查表中。</summary>
      <content type="html"><![CDATA[<p>HiKaRi 的定位是不掺水、明示渠道、明确价格。对使用者而言，透明应当表现为可以核对的信息：实际买到哪种服务、支持哪些参数、按什么单位收费，以及出现问题后如何核对。</p>
<section><h2>先问清渠道来源<a href="#先问清渠道来源"><span>#</span></a></h2><p>不同渠道可能采用不同的采购和接入方式，能力与限制也会不同。查看主站标注的渠道信息，针对你的用途确认来源类型、支持协议、使用限制和可用资金方式。不要仅凭“官方”“直连”等名称推断拥有某种授权或服务等级。</p><p>团队采购如果需要更具体的来源材料，应在试点前沟通。博客不会用一个统一标签替代每条渠道的实际说明。</p></section>
<section><h2>模型名称与能力需要分开核对<a href="#模型名称与能力需要分开核对"><span>#</span></a></h2>

<table><thead><tr><th>核对项</th><th>建议记录</th></tr></thead><tbody><tr><td>精确模型 ID</td><td>包含版本、后缀，记录核对日期</td></tr><tr><td>协议</td><td>Chat、Responses、Messages 或其他实际支持方式</td></tr><tr><td>高级参数</td><td>工具调用、图片、输出格式和思考档位</td></tr><tr><td>限制</td><td>上下文、最大输出、并发、文件与素材要求</td></tr><tr><td>价格</td><td>单位、输入输出、缓存、分组倍率与资金折扣</td></tr><tr><td>交付</td><td>错误追踪、媒体下载、文件保留与支持入口</td></tr></tbody></table><p>模型自述“我是什么模型”、语气相似或一道题的答案，都不足以单独证明模型身份。更合理的验收是核对渠道披露、协议行为和有代表性的固定任务，同时保留可复现参数。</p></section>
<section><h2>低价要放进任务成本里看<a href="#低价要放进任务成本里看"><span>#</span></a></h2><p>假设渠道 A 的单次价格更低，但需要多次重试才能得到可用输出，最终成本可能更高。比较时把失败、返工、延迟和维护时间一起记录。相关方法见 <a href="/posts/model-evaluation/">模型评测</a> 和 <a href="/posts/token-cost-explained/">Token 费用</a>。</p><p>本文不发布未经同条件测试的“全网最低”或“绝对优于某站”结论，也不把一次短请求成功写成长期稳定性证明。</p></section>
<section><h2>如何查看 HiKaRi 当前信息<a href="#如何查看-hikari-当前信息"><span>#</span></a></h2><p>到 <a href="https://hikariapi.xyz/resources/channels" target="_blank">服务与渠道说明</a> 了解原则，登录 <a href="https://hikariapi.xyz/model-plaza?utm_source=hikari_blog&amp;utm_medium=referral&amp;utm_campaign=launch&amp;utm_content=channel-selection" target="_blank">模型广场</a> 核对当前模型、渠道与价格。大型任务先做小样本验收，再决定是否扩大。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.hikaripublic.xyz/posts/client-setup-checklist/</id>
      <title type="text">客户端接入检查清单：终端能用，为什么应用里不能用？</title>
      <published>2026-10-25T00:00:00.000Z</published>
      <updated>2026-10-25T00:00:00.000Z</updated>
      <author><name>HiKaRi Blog</name></author>
      <link rel="alternate" href="https://blog.hikaripublic.xyz/posts/client-setup-checklist/"/>
      <summary type="text">从协议选择、配置来源、模型能力和运行环境排查客户端接入，不把改地址视为万能兼容。</summary>
      <content type="html"><![CDATA[<p>终端最小请求成功，证明这组地址、认证和请求体在当时能完成调用。客户端仍然失败，通常需要比较它实际发送的请求，而不是继续重建 Key。</p>
<section><h2>先确认协议<a href="#先确认协议"><span>#</span></a></h2><p>Chat Completions、Responses、Anthropic Messages、Gemini 风格接口的字段和事件不同。客户端只写着“自定义供应商”，不代表它支持所有协议。</p>

<table><thead><tr><th>核对项</th><th>需要确认的事实</th></tr></thead><tbody><tr><td>供应商类型</td><td>客户端实际选择的协议，是否与分组一致</td></tr><tr><td>地址</td><td>要求根地址、带 <code>/v1</code> 的地址还是完整 endpoint</td></tr><tr><td>模型</td><td>API ID 与显示名称是否分开，是否存在客户端别名</td></tr><tr><td>高级能力</td><td>工具调用、图片、结构化输出是否真的被该模型支持</td></tr><tr><td>认证</td><td>客户端是否仍读取旧环境变量或旧供应商的 Key</td></tr></tbody></table><p>完整请求路径应与 <a href="/posts/base-url-and-api-key/">地址说明</a> 对照。不要将三个接口的请求体互相混用。</p></section>
<section><h2>配置要写在真正运行程序的位置<a href="#配置要写在真正运行程序的位置"><span>#</span></a></h2><p>Windows 桌面应用、WSL、Docker、远程 SSH 扩展可能读取不同的环境变量和配置文件。改了本机文件，但程序运行在远端，设置不会自动过去。</p><p>保存后检查客户端显示的供应商和模型。必要时按客户端文档重开进程，让它重新读取环境变量。不要把重装应用当成第一步。</p></section>
<section><h2>再比较最小请求与完整会话<a href="#再比较最小请求与完整会话"><span>#</span></a></h2><p>先建一个不带历史、不带工具、不带图片的新会话。如果短文本成功，旧会话失败，逐项加入历史、工具和附件，找出触发差异的部分。上下文过长、附件格式不支持和函数参数不兼容，都可能只在完整会话出现。</p><p>流式出问题时，检查 <a href="/posts/streaming-and-sse/">SSE 与缓冲</a>；工具失败时，保留脱敏的工具定义和响应片段，不能用“普通聊天能回复”证明工具协议完整兼容。</p></section>
<section><h2>使用对应的站内教程<a href="#使用对应的站内教程"><span>#</span></a></h2><ul>
<li><a href="https://hikariapi.xyz/docs/clients" target="_blank">聊天客户端与编辑器</a></li>
<li><a href="https://hikariapi.xyz/docs/cc-switch" target="_blank">CC Switch</a></li>
<li><a href="https://hikariapi.xyz/docs/claude-code" target="_blank">Claude Code</a></li>
<li><a href="https://hikariapi.xyz/docs/codex" target="_blank">Codex</a></li>
</ul><p>这些链接指向 HiKaRi 的接入说明。客户端版本和渠道能力会变化，应在实际使用的版本上验证；博客不承诺所有历史版本都兼容。</p><p>需要协助时，在 <a href="/guestbook/">联系页</a> 提交客户端版本、运行环境、实际路径、模型和错误码。请删除 Header 中的 Key、Cookie 与会话令牌。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.hikaripublic.xyz/posts/distillation-data-quality/</id>
      <title type="text">蒸馏与合成数据项目：先确定授权、质量标准和验收集</title>
      <published>2026-10-25T00:00:00.000Z</published>
      <updated>2026-10-25T00:00:00.000Z</updated>
      <author><name>HiKaRi Blog</name></author>
      <link rel="alternate" href="https://blog.hikaripublic.xyz/posts/distillation-data-quality/"/>
      <summary type="text">把数据权利、上游使用条件、任务设计、去重与验收拆开，避免花钱生成大量无法使用的训练样本。</summary>
      <content type="html"><![CDATA[<p>HiKaRi 可沟通蒸馏及合成数据项目。能调用模型只说明接口可用，不自动代表你获得了将输出用于任何训练、转售或商业项目的权利。项目应先核对数据授权、上游条件与交付目的，再安排生成。</p>
<section><h2>先写出一页项目说明<a href="#先写出一页项目说明"><span>#</span></a></h2><p>明确目标任务、最终使用场景、学生模型、输入来源、输出用途、数量与预算。逐项核对素材权利、隐私处理、上游条款及输出使用限制；无法确认的渠道不应默认用于训练项目。</p><p>有些任务用检索、提示词或规则就能满足要求，未必需要训练。先建立基线，确认蒸馏能解决的具体问题，避免把数据数量当成项目效果。</p></section>
<section><h2>小样本先定标准<a href="#小样本先定标准"><span>#</span></a></h2><p>先做少量人工可完整检查的样本，明确输入输出结构和合格条件。比如客服分类应检查类别定义和困难样本；代码任务应运行隔离测试；结构化抽取应验证 Schema、事实来源和缺失字段处理。</p><p>不能仅凭模型自评“正确”入库。为常见错误建立标签，例如事实错误、格式错误、答非所问、信息不足却编造、敏感字段未处理。把失败原因反馈给任务设计，而不是只增加生成量。</p></section>
<section><h2>数据集至少保留哪些字段<a href="#数据集至少保留哪些字段"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sample_id、任务类型、输入来源标识、生成模型与渠道</span></div></div><div><div><div>2</div></div><div><span>提示词版本、参数、生成时间、用量与费用</span></div></div><div><div><div>3</div></div><div><span>校验结果、人工审核状态、淘汰原因、数据版本</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>上述是字段建议，不是声称本站提供现成标注平台。密钥不能进入样本；敏感原文和授权证据应独立受控管理，只给必要人员访问。</p></section>
<section><h2>去重、切分与污染检查<a href="#去重切分与污染检查"><span>#</span></a></h2><p>先按来源或业务实体划分训练、验证和测试，避免同一问题的轻微改写同时落入训练集和测试集。除了完全重复，还要检查近似重复和模板化回答；少量措辞变化不等于新知识。</p><p>测试集应在大规模生成前固定并控制访问。不要把测试答案再作为训练示例；涉及公开基准时，记录可能的数据重叠，谨慎解释成绩提升。</p></section>
<section><h2>验收看学生模型的结果<a href="#验收看学生模型的结果"><span>#</span></a></h2><p>交付数量、格式通过率、人工抽样结果、重复率和成本只是数据验收的一部分。项目效果还需在固定测试集上比较学生模型训练前后表现，记录训练设置和随机性；不能承诺生成某个数量就必然提升多少。</p><p>分批生产，每批设置质量门槛、费用上限和异常停止条件。保留可追溯版本，方便回滚有问题的批次。可参考 <a href="/posts/token-cost-explained/">成本计算</a> 和 <a href="/posts/model-evaluation/">模型评测</a>。</p></section>
<section><h2>如何沟通项目<a href="#如何沟通项目"><span>#</span></a></h2><p>通过 <a href="https://hikariapi.xyz/resources/distillation" target="_blank">蒸馏服务说明</a> 了解对接入口，再按 <a href="/guestbook/">联系页面</a> 提供任务、授权情况、输出结构、质量标准与预算。不要在首次公开咨询中上传整套私有数据；先确定保密、处理和交付边界，再提供最小必要样本。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.hikaripublic.xyz/posts/image-video-workflow/</id>
      <title type="text">图片与视频 API 接入：创建、查询、结算与保存成品</title>
      <published>2026-10-25T00:00:00.000Z</published>
      <updated>2026-10-25T00:00:00.000Z</updated>
      <author><name>HiKaRi Blog</name></author>
      <link rel="alternate" href="https://blog.hikaripublic.xyz/posts/image-video-workflow/"/>
      <summary type="text">图片和视频不要套用同一套同步请求假设；视频任务需分别核对生成、结算和存储状态。</summary>
      <content type="html"><![CDATA[<p>想先体验图片生成，可以打开 <a href="https://hikariimg.xyz/" target="_blank">HiKaRi 生图站</a>；要集成到产品中，再按 <a href="https://hikariapi.xyz/docs/images" target="_blank">图片文档</a> 和 <a href="https://hikariapi.xyz/docs/video" target="_blank">视频文档</a> 对接。图形界面的操作成功，不代表所有 API 模型的参数都相同。</p>
<section><h2>图片：先确认输出形式<a href="#图片先确认输出形式"><span>#</span></a></h2><p>选择模型后，逐项核对生成或编辑接口、支持尺寸、张数、输入格式和计费方式。不同模型可能有各自约束，尤其不能将一个模型的质量枚举直接复制到另一个模型。</p><p>返回结果可能是临时 URL 或编码内容，应依据真实响应解析。若要长期使用，及时将成品保存到自己的受控存储；不要假定返回链接永久有效。需要编辑原图时，只上传有权使用且适合交给相关服务处理的文件。</p></section>
<section><h2>视频：把提交和完成拆开<a href="#视频把提交和完成拆开"><span>#</span></a></h2><ol>
<li>阅读所选模型的专页，准备它接受的请求体。</li>
<li>使用 <code>POST /v1/videos</code> 创建任务，按文档携带幂等键。</li>
<li>保存返回的任务 ID，并用 <code>GET /v1/videos/{id}</code> 查询进度。</li>
<li>生成完成后继续检查结算与成品状态。</li>
<li>使用带 Bearer 鉴权的 <code>GET /v1/videos/{id}/content</code> 下载成品，保存到自有存储。</li>
</ol><p>提交示例不在本文硬编码某个模型和参数，以免误导不同视频渠道的接入。创建接口的兼容别名及具体请求字段以当前文档为准。</p></section>
<section><h2>三类状态分别看<a href="#三类状态分别看"><span>#</span></a></h2>

<table><thead><tr><th>维度</th><th>文档中的状态示例</th><th>应用要做什么</th></tr></thead><tbody><tr><td>生成</td><td><code>queued</code>、<code>in_progress</code>、<code>completed</code>、<code>failed</code></td><td>排队或处理中继续查询；失败保留错误信息</td></tr><tr><td>结算</td><td><code>settled</code>、<code>review_required</code></td><td>需要复核时不要把账单当成已最终确认</td></tr><tr><td>成品</td><td><code>stored</code>、<code>expired</code></td><td>确认可下载并在过期前保存，过期后不能假设还能恢复</td></tr></tbody></table><p>文档提及默认视频有效期，但业务应始终以响应中的 <code>expires_at</code> 为准，不能把固定 24 小时写成对所有任务的永久规则。已经完成的生成也可能因为文件过期而无法下载。</p></section>
<section><h2>查询与下载的工程细节<a href="#查询与下载的工程细节"><span>#</span></a></h2><p>查询应有间隔、退避和总时限，避免每秒无上限轮询。将任务 ID 关联到实际用户订单，页面刷新后恢复查询，而不是重新提交生成。</p><p><code>/content</code> 需要 Bearer 鉴权，直接放进不带请求头的普通浏览器链接可能失败。应用后端应在验证用户权限后下载或转存，不要为方便展示把 API Key 拼到 URL、前端源码或日志中。</p><p>下载时检查 HTTP 状态与内容类型，避免把错误 JSON 保存为视频文件。网络断开时，先判断任务状态，再决定重试下载或查询；不要重复创建。相关原则见 <a href="/posts/retry-and-idempotency/">重试与幂等</a>。</p><p>上线前用少量任务走完整条链路：成功、失败、超时恢复、过期、结算待复核。按 <a href="/posts/token-cost-explained/">成本台账</a> 同时记录任务规格与最终费用。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.hikaripublic.xyz/posts/model-evaluation/</id>
      <title type="text">如何评测模型与 API 渠道：用自己的任务建立验收表</title>
      <published>2026-10-25T00:00:00.000Z</published>
      <updated>2026-10-25T00:00:00.000Z</updated>
      <author><name>HiKaRi Blog</name></author>
      <link rel="alternate" href="https://blog.hikaripublic.xyz/posts/model-evaluation/"/>
      <summary type="text">从固定样本、盲评、时延到每个合格结果的成本，建立可重复的小规模选型流程。</summary>
      <content type="html"><![CDATA[<p>一次回答漂亮，不能说明某个模型适合你的业务。公开榜单适合缩小范围，最终选型应使用自己的输入分布和验收标准。本文给出评测流程，没有虚构模型成绩或渠道跑分。</p>
<section><h2>先确定不能妥协的条件<a href="#先确定不能妥协的条件"><span>#</span></a></h2><p>列出协议、上下文、工具调用、结构化输出、媒体输入、响应时间和预算要求。精确到实际需要的能力，例如“输出能通过这份 JSON Schema”，比“支持 JSON”更容易验收。</p><p>查看 <a href="https://hikariapi.xyz/resources/channels" target="_blank">渠道说明</a>，确认模型身份、来源标签、权限与计费。客户端有某个开关，不代表所有渠道都支持该参数。</p></section>
<section><h2>用小样本覆盖真实困难<a href="#用小样本覆盖真实困难"><span>#</span></a></h2><p>初次可以整理 30～50 条有代表性的样本，覆盖高频任务、长输入、歧义、缺失信息和必须拒答的边界。这个数量用于发现明显问题，不足以证明极低故障率；关键业务需要扩大样本并持续观察。</p><p>样本应来自你有权使用的数据，去掉身份信息与密钥。将调试集和最终验收集分开，避免不断修改提示词后只在同一批题目上取得好成绩。</p></section>
<section><h2>冻结变量并记录版本<a href="#冻结变量并记录版本"><span>#</span></a></h2><p>对同一轮测试，固定提示词、工具定义、输出约束与可共同支持的参数。记录模型 ID、渠道、日期、参数和客户端版本。不同协议无法完全对齐时，把差异写入结果，不要装作严格等价。</p><p>部分模型具有随机性，抽取一部分样本重复运行，观察一致性；不要只挑最好的一次。轮换测试顺序，减少特定时段网络负载造成的偏差。</p></section>
<section><h2>一张可以直接使用的验收表<a href="#一张可以直接使用的验收表"><span>#</span></a></h2>

<table><thead><tr><th>维度</th><th>如何判定</th></tr></thead><tbody><tr><td>任务正确性</td><td>与参考答案、业务规则或人工评分标准比较</td></tr><tr><td>格式遵守</td><td>用解析器或 Schema 校验，记录是否能直接进入下游</td></tr><tr><td>工具调用</td><td>检查工具名、参数、执行顺序与最终结果</td></tr><tr><td>首段时延</td><td>从发起请求到第一个有效内容片段，区别于连接建立</td></tr><tr><td>总耗时</td><td>到最终输出或任务完成；报告中位数及高分位</td></tr><tr><td>稳定性</td><td>记录错误、超时、拒绝与重复执行，保留分母</td></tr><tr><td>成本</td><td>汇总全部尝试费用，再除以合格结果数量</td></tr></tbody></table><p>能自动检查的先自动检查；主观质量去掉模型标签后交叉评分。若使用另一个模型评分，抽样人工复核，并记录评分模型的偏好与成本。</p></section>
<section><h2>如何写出可信结论<a href="#如何写出可信结论"><span>#</span></a></h2><p>结论应写成“在这批任务、这组参数和这个时间段，A 的格式通过率更高”，并附样本数量。不要从 20 条样本推导“永不降智”或“99.99% 稳定”。输出风格、速度或某个冷知识的变化，也不能单独证明模型被替换。</p><p>上线时先用小流量，保留回退路径；扩容前再做受控并发测试，并与运营方确认并发和额度。团队沟通字段见 <a href="/posts/team-onboarding-and-invoices/">团队接入</a>，成本口径见 <a href="/posts/token-cost-explained/">费用计算</a>。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.hikaripublic.xyz/posts/python-first-api-call/</id>
      <title type="text">用 Python 标准库完成第一次 HiKaRi API 调用</title>
      <published>2026-10-25T00:00:00.000Z</published>
      <updated>2026-10-25T00:00:00.000Z</updated>
      <author><name>HiKaRi Blog</name></author>
      <link rel="alternate" href="https://blog.hikaripublic.xyz/posts/python-first-api-call/"/>
      <summary type="text">无需安装 SDK，先查询 Key 可用模型，再向支持 Chat Completions 的分组发送最小请求。</summary>
      <content type="html"><![CDATA[<p>下面用 Python 3 标准库验证 OpenAI 兼容的 Chat Completions 接口。你需要一个有可用资金、绑定了相应分组的 HiKaRi Key，以及该分组支持的精确模型 ID。仅支持其他协议的模型不能直接套用这段请求体。</p>
<section><h2>先在本机设置环境变量<a href="#先在本机设置环境变量"><span>#</span></a></h2><p>Windows PowerShell：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>$env:API_KEY</span><span><span> </span><span>=</span><span> </span></span><span>Read-Host</span><span> </span><span>'输入本站 API Key'</span></div></div><div><div><div>2</div></div><div><span>$env:MODEL_ID</span><span><span> </span><span>=</span><span> </span></span><span>Read-Host</span><span> </span><span>'输入模型广场中的精确模型 ID'</span></div></div><div><div><div>3</div></div><div><span>python first_call.py</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>macOS、Linux 或 Git Bash：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>read</span><span> </span><span>-s</span><span> </span><span>-p</span><span> </span><span>'API Key: '</span><span> </span><span>API_KEY</span><span>; </span><span>echo</span></div></div><div><div><div>2</div></div><div><span>export</span><span> </span><span>API_KEY</span></div></div><div><div><div>3</div></div><div><span>read</span><span> </span><span>-p</span><span> </span><span>'精确模型 ID: '</span><span> </span><span>MODEL_ID</span></div></div><div><div><div>4</div></div><div><span>export</span><span> </span><span>MODEL_ID</span></div></div><div><div><div>5</div></div><div><span>python3</span><span> </span><span>first_call.py</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>示例中的交互输入用于本机验证。共享电脑或生产环境应使用自己的密钥管理方式；不要将 Key 写入 Git 仓库、前端代码或公开笔记。</p></section>
<section><h2>保存为 first_call.py<a href="#保存为-first_callpy"><span>#</span></a></h2><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> json</span></div></div><div><div><div>2</div></div><div><span>import</span><span> os</span></div></div><div><div><div>3</div></div><div><span>import</span><span> urllib.error</span></div></div><div><div><div>4</div></div><div><span>import</span><span> urllib.request</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span><span>base </span><span>=</span><span> </span></span><span>"https://hikariapi.xyz"</span></div></div><div><div><div>7</div></div><div><span><span>key </span><span>=</span><span> os.environ[</span></span><span>"API_KEY"</span><span><span>].</span><span>strip</span><span>()</span></span></div></div><div><div><div>8</div></div><div><span><span>model </span><span>=</span><span> os.environ[</span></span><span>"MODEL_ID"</span><span><span>].</span><span>strip</span><span>()</span></span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>def</span><span> </span><span>request</span><span>(</span><span>path</span><span>,</span><span><span> </span><span>payload</span></span><span>=</span><span>None</span><span>):</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>headers </span><span>=</span><span> {</span><span>"Authorization"</span><span>: </span><span>"Bearer "</span><span><span> </span><span>+</span><span> key}</span></span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>data </span><span>=</span><span> </span><span>None</span></div></div><div><div><div>13</div></div><div><span>    </span><span>if</span><span> payload </span><span>is</span><span> </span><span>not</span><span> </span><span>None</span><span>:</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>headers[</span><span>"Content-Type"</span><span><span>] </span><span>=</span><span> </span></span><span>"application/json"</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>data </span><span>=</span><span> json.</span><span>dumps</span><span>(payload).</span><span>encode</span><span>(</span><span>"utf-8"</span><span>)</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>req </span><span>=</span><span> urllib.request.</span><span>Request</span><span>(base </span><span>+</span><span> path, </span><span>data</span><span><span>=</span><span>data, </span></span><span>headers</span><span><span>=</span><span>headers)</span></span></div></div><div><div><div>17</div></div><div><span>    </span><span>with</span><span><span> urllib.request.</span><span>urlopen</span><span>(req, </span></span><span>timeout</span><span>=</span><span>120</span><span>) </span><span>as</span><span> response:</span></div></div><div><div><div>18</div></div><div><span>        </span><span>return</span><span><span> json.</span><span>load</span><span>(response)</span></span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>try</span><span>:</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>catalog </span><span>=</span><span> </span><span>request</span><span>(</span><span>"/v1/models"</span><span>)</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>ids </span><span>=</span><span> [item[</span><span>"id"</span><span>] </span><span>for</span><span> item </span><span>in</span><span> catalog[</span><span>"data"</span><span>]]</span></div></div><div><div><div>23</div></div><div><span>    </span><span>if</span><span> model </span><span>not</span><span> </span><span>in</span><span> ids:</span></div></div><div><div><div>24</div></div><div><span>        </span><span>raise</span><span> </span><span>SystemExit</span><span>(</span><span>"模型不在此 Key 的目录中，请先核对分组与精确名称。"</span><span>)</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>result </span><span>=</span><span> </span><span>request</span><span>(</span><span>"/v1/chat/completions"</span><span>, {</span></div></div><div><div><div>26</div></div><div><span>        </span><span>"model"</span><span>: model,</span></div></div><div><div><div>27</div></div><div><span>        </span><span>"messages"</span><span>: [{</span><span>"role"</span><span>: </span><span>"user"</span><span>, </span><span>"content"</span><span>: </span><span>"只回复 OK"</span><span>}],</span></div></div><div><div><div>28</div></div><div><span>        </span><span>"stream"</span><span>: </span><span>False</span><span>,</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>})</span></div></div><div><div><div>30</div></div><div><span>    </span><span>print</span><span>(result[</span><span>"choices"</span><span>][</span><span>0</span><span>][</span><span>"message"</span><span>][</span><span>"content"</span><span>])</span></div></div><div><div><div>31</div></div><div><span>    </span><span>print</span><span>(</span><span>"usage:"</span><span><span>, json.</span><span>dumps</span><span>(result.</span><span>get</span><span>(</span></span><span>"usage"</span><span>), </span><span>ensure_ascii</span><span>=</span><span>False</span><span>))</span></div></div><div><div><div>32</div></div><div><span>except</span><span> urllib.error.HTTPError </span><span>as</span><span> error:</span></div></div><div><div><div>33</div></div><div><span>    </span><span>print</span><span>(</span><span>"HTTP 状态："</span><span>, error.code)</span></div></div><div><div><div>34</div></div><div><span>    </span><span>print</span><span>(</span><span>"响应内容请在本机查看，分享前移除凭据和私人数据："</span><span>)</span></div></div><div><div><div>35</div></div><div><span>    </span><span>print</span><span><span>(error.</span><span>read</span><span>().</span><span>decode</span><span>(</span></span><span>"utf-8"</span><span>, </span><span>errors</span><span>=</span><span>"replace"</span><span>))</span></div></div><div><div><div>36</div></div><div><span>    </span><span>raise</span><span> </span><span>SystemExit</span><span>(</span><span>1</span><span>)</span></div></div><div><div><div>37</div></div><div><span>except</span><span> urllib.error.URLError </span><span>as</span><span> error:</span></div></div><div><div><div>38</div></div><div><span>    </span><span>raise</span><span> </span><span>SystemExit</span><span>(</span><span>"网络请求失败；检查本机 DNS、代理、网络，并核对用量后决定是否重发。"</span><span>) </span><span>from</span><span> error</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>如何判断成功<a href="#如何判断成功"><span>#</span></a></h2><p>先确认目录请求成功，再看生成结果和主站用量记录。输出未必严格等于 <code>OK</code>；自然语言遵循程度不是网络连通性的唯一判据。模型返回高级内容块或拒绝信息时，也要检查对应协议说明。</p><p><code>usage</code> 是接口报告的用量，不应只用回答字数推测成本。完整账单还需核对实际分组、计费模型及倍率。</p><p>这段程序不自动重试生成请求：网络超时不证明服务端没有处理。排错见 <a href="/posts/api-errors-401-429/">HTTP 状态码</a>，后续接入见 <a href="/posts/client-setup-checklist/">客户端检查清单</a>。</p><p>参考：<a href="https://hikariapi.xyz/docs/text-api" target="_blank">本站文字 API</a>、<a href="https://docs.python.org/3/library/urllib.request.html" target="_blank">Python urllib.request</a>。代码依据协议编写；本文没有使用客户 Key 或发起付费模型调用。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.hikaripublic.xyz/posts/retry-and-idempotency/</id>
      <title type="text">API 超时后能直接重试吗？先分清失败与结果未知</title>
      <published>2026-10-25T00:00:00.000Z</published>
      <updated>2026-10-25T00:00:00.000Z</updated>
      <author><name>HiKaRi Blog</name></author>
      <link rel="alternate" href="https://blog.hikaripublic.xyz/posts/retry-and-idempotency/"/>
      <summary type="text">区分连接失败、处理中断和业务失败；视频创建复用同一幂等键，避免重复任务与费用。</summary>
      <content type="html"><![CDATA[<p>客户端超时只表示它没有在期限内拿到完整结果。请求可能尚未送达，也可能已经被接收、生成甚至结算。对会创建任务或产生费用的请求，“看不到结果”应先进入结果未知状态。</p>
<section><h2>按操作决定处理方法<a href="#按操作决定处理方法"><span>#</span></a></h2>

<table><thead><tr><th>操作或现象</th><th>建议</th></tr></thead><tbody><tr><td>查询模型、查询已知任务 ID</td><td>可以有限重试，遵循限流并设置总时限</td></tr><tr><td>401、403、参数校验失败</td><td>修正配置或权限；重复原请求通常无效</td></tr><tr><td>429</td><td>检查余额、并发与错误正文；按实际规则退避</td></tr><tr><td>创建任务后连接断开</td><td>先查业务记录、任务 ID 和用量，避免直接创建第二个任务</td></tr><tr><td>流式输出已经收到一部分</td><td>保存已接收部分和请求 ID；重新生成属于新的尝试</td></tr></tbody></table><p>对允许重试的操作，可使用带随机抖动的指数退避，同时限制次数、单次超时和总体时间。若服务端提供有效的 <code>Retry-After</code>，按其指示等待。不要让 SDK、代理、队列消费者三层各自重试，导致次数相乘。</p></section>
<section><h2>HiKaRi 视频创建的幂等规则<a href="#hikari-视频创建的幂等规则"><span>#</span></a></h2><p>依据 <a href="https://hikariapi.xyz/docs/video" target="_blank">视频文档</a>，创建视频使用 <code>POST /v1/videos</code>，也提供 <code>/v1/videos/generations</code> 兼容入口。对同一个业务动作，在第一次提交前生成并持久化 <code>Idempotency-Key</code>，它应是 1～128 个 ASCII 字符。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>业务 ID → 幂等键 → 提交请求 → 保存任务 ID → 查询任务 → 保存成品</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>例如使用 Python 的 <code>uuid.uuid4().hex</code> 生成键。<strong>相同业务、相同请求体、相同 Key 凭据的安全重发使用同一幂等键</strong>；不要每次网络重试生成新键。修改模型、提示词等请求内容应视作新的业务版本，不能强行复用旧键。</p><p>请求头示意：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Authorization</span><span>:</span><span> </span><span>Bearer &lt;你的 API Key&gt;</span></div></div><div><div><div>2</div></div><div><span>Content-Type</span><span>:</span><span> </span><span>application/json</span></div></div><div><div><div>3</div></div><div><span>Idempotency-Key</span><span>:</span><span> </span><span>&lt;已持久化的本次业务幂等键&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这里描述的是视频文档明确提供的规则，不意味着文字、图片或所有第三方接口都自动支持相同幂等行为。幂等有效范围与冲突响应以实际文档和接口为准，不承诺永久去重。</p></section>
<section><h2>任务队列怎么存状态<a href="#任务队列怎么存状态"><span>#</span></a></h2><p>在业务库中为一次用户动作建立唯一记录，保存请求摘要、幂等键、任务 ID、最近一次查询时间和最终状态。消费者重启后从这条记录恢复，先查后续进度。</p><p>若提交后未拿到任务 ID，保留“结果未知”，使用同一幂等规则核对，不直接宣告失败并自动另起任务。长时间无法确定时携带脱敏记录联系支持。</p><p>媒体生成完成、结算确认和成品存储是不同状态，详见 <a href="/posts/image-video-workflow/">图片与视频流程</a>。短期重试不能代替业务对账；最终应核对已创建任务与费用，排除重复执行。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.hikaripublic.xyz/posts/streaming-and-sse/</id>
      <title type="text">流式输出不逐字显示？检查 SSE、缓冲和事件解析</title>
      <published>2026-10-25T00:00:00.000Z</published>
      <updated>2026-10-25T00:00:00.000Z</updated>
      <author><name>HiKaRi Blog</name></author>
      <link rel="alternate" href="https://blog.hikaripublic.xyz/posts/streaming-and-sse/"/>
      <summary type="text">区分首包等待、服务端事件、代理缓冲和前端渲染，避免把整个流当成单个 JSON。</summary>
      <content type="html"><![CDATA[<p>开启 <code>stream</code> 后，响应通常是连续到达的事件，而不是一次性返回的完整 JSON。请求成功但全部文字最后一起出现，需要沿“上游生成 → 代理转发 → 客户端读取 → UI 渲染”逐段检查。</p>
<section><h2>先分清两个时间<a href="#先分清两个时间"><span>#</span></a></h2><p><strong>首个有效输出时间</strong>反映用户什么时候开始看到内容；<strong>总完成时间</strong>反映整次请求多久结束。有的模型先进行内部推理，开始输出较晚；这和代理把已生成内容攒住再发不是同一个问题。</p><p>不要只看平均总耗时。比较相同任务时，记录首次有效输出、完成时间、输出数量和失败比例，才有可比性。</p></section>
<section><h2>检查协议与解析方式<a href="#检查协议与解析方式"><span>#</span></a></h2><ol>
<li>请求体确认使用了目标接口支持的 <code>stream: true</code>。</li>
<li>读取响应的 Content-Type 和实际事件；不要对整个 SSE 响应直接执行 <code>response.json()</code>。</li>
<li>使用对应协议的事件解析器。Chat、Responses 和 Messages 的事件类型不能混用。</li>
<li>网络数据块不等于事件边界，也不等于一个字或一个完整 Token。解析器需要缓冲未完成的行与事件。</li>
</ol><p>用 curl 排查时可加 <code>-N</code> 关闭本地输出缓冲，并保持其他参数与原请求一致。Bash 例子：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>curl</span><span> </span><span>-N</span><span> </span><span>--fail-with-body</span><span> </span><span>'https://hikariapi.xyz/v1/chat/completions'</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>-H</span><span> </span><span>"Authorization: Bearer </span><span>$API_KEY</span><span>"</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>  </span><span>-H</span><span> </span><span>'Content-Type: application/json'</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>  </span><span>-d</span><span> </span><span>"{</span><span>\"</span><span>model</span><span>\"</span><span>:</span><span>\"</span><span>$MODEL_ID</span><span>\"</span><span>,</span><span>\"</span><span>messages</span><span>\"</span><span>:[{</span><span>\"</span><span>role</span><span>\"</span><span>:</span><span>\"</span><span>user</span><span>\"</span><span>,</span><span>\"</span><span>content</span><span>\"</span><span>:</span><span>\"</span><span>用三句话说明什么是 API</span><span>\"</span><span>}],</span><span>\"</span><span>stream</span><span>\"</span><span>:true}"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>先在本机设置本站 Key 和支持该协议的精确模型 ID。该例子用于连通性检查，不保证所有模型产生相同分块节奏。</p></section>
<section><h2>curl 正常而网页集中出现<a href="#curl-正常而网页集中出现"><span>#</span></a></h2><p>检查自建反代是否开启响应缓冲、应用是否先读完整个响应才返回，以及前端是否只在结束事件后更新状态。把流先转成完整字符串，再展示给页面，自然不会逐段显示。</p><p>如果只在某个网络环境发生，继续比较代理、VPN、网关和远程开发环境。不要直接调整主站配置，先定位自己能控制的那一层。</p></section>
<section><h2>流中断怎么办<a href="#流中断怎么办"><span>#</span></a></h2><p>记录最后收到的事件和错误，并核对主站用量。已经生成一部分内容的请求，不能把中断简单当作“完全没有执行”。涉及工具动作的应用还需要按业务 ID 防止重复执行。</p><p>参考：<a href="https://hikariapi.xyz/docs/text-api" target="_blank">HiKaRi 文字 API 的流式说明</a>。后续阅读：<a href="/posts/retry-and-idempotency/">重试与幂等</a>。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.hikaripublic.xyz/posts/team-onboarding-and-invoices/</id>
      <title type="text">团队接入与开票：开始前把技术、费用和交付边界讲清楚</title>
      <published>2026-10-25T00:00:00.000Z</published>
      <updated>2026-10-25T00:00:00.000Z</updated>
      <author><name>HiKaRi Blog</name></author>
      <link rel="alternate" href="https://blog.hikaripublic.xyz/posts/team-onboarding-and-invoices/"/>
      <summary type="text">团队采购的需求清单、Key 隔离、验收步骤和开票沟通字段，帮助从个人试用过渡到正式项目。</summary>
      <content type="html"><![CDATA[<p>HiKaRi 可对接团队使用与开票需求。团队采购前，应先确认技术可行性、费用口径和交付边界，再扩大预算。具体套餐、额度、发票项目、税务信息与服务约定通过主站沟通确认，本文不代替合同或订单。</p>
<section><h2>一次说明白的需求清单<a href="#一次说明白的需求清单"><span>#</span></a></h2>

<table><thead><tr><th>事项</th><th>建议提供的信息</th></tr></thead><tbody><tr><td>业务场景</td><td>内部助手、开发工具、媒体生成或授权研究任务</td></tr><tr><td>模型与协议</td><td>需要的精确型号、Chat / Responses / Messages 等协议</td></tr><tr><td>流量</td><td>预计日用量、峰值并发、输入输出长度、上线时间</td></tr><tr><td>功能</td><td>工具、结构化输出、长上下文、图片或视频等必要能力</td></tr><tr><td>预算</td><td>试用预算、月度预算、预算告警和停止条件</td></tr><tr><td>对账与开票</td><td>采购主体、对账周期、发票需求与接收方式</td></tr><tr><td>数据要求</td><td>数据类别、处理限制、日志及保留要求</td></tr></tbody></table><p>用量不确定时，先给范围并安排小样本试用。不要将“支持主流模型”解释成所有型号、全部参数和任意并发均已向每个 Key 开放。</p></section>
<section><h2>Key 与环境隔离<a href="#key-与环境隔离"><span>#</span></a></h2><p>开发、测试、生产使用独立密钥，按项目和责任人分配，禁止多人共享个人 Key。预算和权限能力以实际控制台为准，不能假设任何管理功能已默认开启。</p><p>密钥只放后端或受控的秘密管理服务；人员变更及时轮换。日志保留请求 ID、模型、状态和用量即可定位大部分问题，不应默认收集完整敏感输入。</p></section>
<section><h2>先验收，再迁移<a href="#先验收再迁移"><span>#</span></a></h2><p>先完成一条真实工作流，验证必需参数、格式、错误恢复与账单。然后做受控小流量迁移，再按双方确认的额度扩容。质量验收表可参照 <a href="/posts/model-evaluation/">模型评测</a>，超时恢复参照 <a href="/posts/retry-and-idempotency/">重试与幂等</a>。</p><p>保留配置版本和回退路径。如果有特定响应时间、保障窗口或专属资源要求，应在采购前书面确认，不能从博客宣传推导出 SLA。</p></section>
<section><h2>开票前核对哪些信息<a href="#开票前核对哪些信息"><span>#</span></a></h2><p>先通过 <a href="https://hikariapi.xyz/resources/invoicing" target="_blank">开票说明</a> 和站内实际流程核对可开票订单及金额，再按要求提供抬头、税号、发票类型和接收信息。公司财务可能另有项目名称或合同要求，应提前沟通；不要把税号、个人地址或订单凭证发到公开群聊。</p><p>未核实前不要假设任何充值都能按同一种发票类型、时限和项目开具。退款、折扣、已开票订单等特殊情形以双方确认及实际规则为准。</p></section>
<section><h2>现在可以从哪里开始<a href="#现在可以从哪里开始"><span>#</span></a></h2><p>阅读 <a href="https://hikariapi.xyz/resources/teams" target="_blank">团队对接说明</a>，到 <a href="https://hikariapi.xyz/?utm_source=hikari_blog&amp;utm_medium=referral&amp;utm_campaign=teams&amp;utm_content=team-guide" target="_blank">HiKaRi 主站</a> 核对服务并发起沟通。通知与交流 QQ 群为 <strong>1107270061</strong>；进群先说明需求类别，涉及采购资料请与经核实的运营人员私下对接，不在群中公开敏感信息。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.hikaripublic.xyz/posts/token-cost-explained/</id>
      <title type="text">AI API 成本怎么算：Token、缓存、图片与视频分开核对</title>
      <published>2026-10-25T00:00:00.000Z</published>
      <updated>2026-10-25T00:00:00.000Z</updated>
      <author><name>HiKaRi Blog</name></author>
      <link rel="alternate" href="https://blog.hikaripublic.xyz/posts/token-cost-explained/"/>
      <summary type="text">用一份明确标注假设的账单例子，区分输入、输出、缓存和媒体任务费用，避免只比较模型标价。</summary>
      <content type="html"><![CDATA[<p>选择 API 时，先比较完成同一件事花多少钱。每百万 Token 的价格只是其中一项；输出长度、失败重做、缓存命中和质量验收都会影响最终成本。</p>
<section><h2>先确认计费口径<a href="#先确认计费口径"><span>#</span></a></h2><p>文字调用通常需要分别核对输入、输出及缓存相关字段。不同渠道对缓存读取、缓存写入的展示与收费方式可能不同，不能把所有缓存 Token 都当成免费，也不能把已经包含在输入总量中的 Token 重复计算。</p><p>在 <a href="https://hikariapi.xyz/resources/pricing" target="_blank">主站价格说明</a> 和 <a href="https://hikariapi.xyz/docs/billing" target="_blank">计费文档</a> 中确认：</p><ol>
<li>使用的是哪个分组、渠道、精确模型与计费模型。</li>
<li>单位是元、账户余额单位还是其他单位，是否存在分组倍率。</li>
<li>输入、输出、缓存分别如何计价，用量字段之间是否存在包含关系。</li>
<li>图片按张还是按 Token，视频按任务还是按秒，哪些参数改变价格。</li>
</ol></section>
<section><h2>一次文字调用的假设例子<a href="#一次文字调用的假设例子"><span>#</span></a></h2><p><strong>以下数字只演示计算，不是 HiKaRi 报价。</strong> 假设输入单价为每百万 Token 2 元，输出为每百万 Token 8 元；本次没有缓存，输入 10,000 Token，输出 2,000 Token，没有额外倍率。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>输入费用 = 10,000 ÷ 1,000,000 × 2 = 0.020 元</span></div></div><div><div><div>2</div></div><div><span>输出费用 =  2,000 ÷ 1,000,000 × 8 = 0.016 元</span></div></div><div><div><div>3</div></div><div><span>本次合计 = 0.036 元</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>若 1,000 次调用完全相同，理论合计为 36 元。实际任务长度不一，应从用量记录汇总，不能拿一条短提示词的费用直接代表整批数据。</p><p>有缓存时，先按渠道文档拆出可计费部分，再套入相应单价。长对话反复携带历史消息会增加输入；工具返回的内容也可能进入后续上下文。中文字数与 Token 数没有固定换算比例。</p></section>
<section><h2>衡量“每个合格结果”的费用<a href="#衡量每个合格结果的费用"><span>#</span></a></h2><p>假设方案 A 每次 0.02 元，100 次中 70 次通过；方案 B 每次 0.03 元，100 次中 95 次通过。未计人工复核时：</p>

<table><thead><tr><th>假设方案</th><th>总调用费</th><th>合格结果</th><th>每个合格结果费用</th></tr></thead><tbody><tr><td>A</td><td>2 元</td><td>70</td><td>约 0.0286 元</td></tr><tr><td>B</td><td>3 元</td><td>95</td><td>约 0.0316 元</td></tr></tbody></table><p>A 在这组假设里仍便宜，但差距已经缩小。再加入人工改写时间，结论可能变化。评估方法见 <a href="/posts/model-evaluation/">模型与渠道评测</a>。</p></section>
<section><h2>图片与视频另建账目<a href="#图片与视频另建账目"><span>#</span></a></h2><p>图片记录尺寸、质量、数量和编辑输入；视频记录时长、分辨率、是否带音频以及实际结算状态。不要仅看任务进入 <code>completed</code> 就认定所有计费和存储步骤都结束。</p><p>媒体任务的提交、查询与下载要分开记录。网络异常后重复创建任务，可能带来第二笔费用，参见 <a href="/posts/retry-and-idempotency/">重试与幂等</a> 和 <a href="/posts/image-video-workflow/">媒体任务流程</a>。</p></section>
<section><h2>最低限度的成本台账<a href="#最低限度的成本台账"><span>#</span></a></h2><p>每条业务记录保存时间、内部业务 ID、请求或任务 ID、模型、渠道、用量、结算金额、成功状态、人工验收结果。不要把完整提示词和用户隐私默认写入通用日志。</p><p>先跑小样本，估算平均值与高分位费用，给批任务设预算和停止条件。发现异常长输出、重复任务或渠道切换时及时复核；博客不维护另一份可能过期的实时价格表。</p></section>]]></content>
    </entry>
</feed>
