API 文档

章节+

1. 快速入门

Regunow API 使用 HTTPS、Bearer 身份验证和带版本的前缀 /api/v1。无需账户即可阅读本文档。发起 API 请求需要有效的 Pro 访问权限,并同意现行政策。

  1. 登录 Regunow,在设置 → API 密钥中创建密钥。
  2. 请妥善保存密钥的秘密值。它仅在创建密钥时显示一次。
  3. 设置主机和密钥,然后通过后端或可信的自动化程序发送第一个问题。
cURL · 第一个问题
# Use your Regunow host and a key from Settings → API Keys.
export REGUNOW_BASE_URL="https://YOUR_REGUNOW_HOST"
export REGUNOW_API_KEY="YOUR_API_KEY"

curl --fail-with-body \
  "$REGUNOW_BASE_URL/api/v1/chat/completions" \
  -H "Authorization: Bearer $REGUNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: first-question-001" \
  -d '{
    "messages": [{
      "role": "user",
      "content": "Which EU product-safety obligations apply to a connected consumer device?"
    }],
    "mode": "jurisdiction",
    "jurisdiction": "eu"
  }'

回答位于 output.content。响应还包含来源引用和收取的积分。此请求会消耗积分。每个新问题都应使用新的幂等键。

JavaScript 示例(Node.js)
JavaScript · 服务端请求
// Node.js: set REGUNOW_BASE_URL and REGUNOW_API_KEY in your environment.
// Generate one key per operation; keep it unchanged when retrying that operation.
import { randomUUID } from "node:crypto";

const idempotencyKey = randomUUID();
const response = await fetch(
  process.env.REGUNOW_BASE_URL + "/api/v1/chat/completions",
  {
    method: "POST",
    headers: {
      Authorization: "Bearer " + process.env.REGUNOW_API_KEY,
      "Content-Type": "application/json",
      "Idempotency-Key": idempotencyKey,
    },
    body: JSON.stringify({
      messages: [{ role: "user", content: "Summarize EU product-safety obligations." }],
      mode: "jurisdiction",
      jurisdiction: "eu",
    }),
  },
);

const result = await response.json();
if (!response.ok) {
  throw new Error(result.error.code + ": " + result.error.message);
}
console.log(result.output.content);

2. 身份验证

每次请求都应在 HTTP Authorization 请求头中发送 API 密钥。URL、Cookie 或请求正文中的密钥不会被接受。

HTTP · 身份验证请求头
Authorization: Bearer rgn_live_...

请将密钥保存在环境变量或密钥管理服务中,不要放入浏览器代码、移动应用程序包、公开代码仓库或日志。未启用浏览器跨源访问,请通过自己的服务器发起请求。

被停用、删除或过期的密钥会立即失去身份验证能力。Regunow 只保存秘密值的哈希,因此无法再次显示已有密钥的秘密值。需要时请创建替代密钥。

每次请求都会检查 Pro 权限和政策同意状态。收到 legal_acceptance_required 时,密钥所有者必须登录并打开法律条款确认。API 密钥不能代为同意政策。

3. 模型与选项

GET/api/v1/models

查询支持的模型、力度级别、管辖区域、回答语言和功能。此端点需要身份验证,但不单独收取积分,适合在生成回答前验证密钥。

cURL · 模型目录
curl --fail-with-body \
  "$REGUNOW_BASE_URL/api/v1/models" \
  -H "Authorization: Bearer $REGUNOW_API_KEY"
模型目录字段
字段内容
models模型 ID、名称、默认力度及支持的力度值。
default默认模型与力度选项。
jurisdictions支持的管辖区域标识符及名称。
languages支持的回答语言代码及名称。
capabilities流式输出和文件支持情况,以及文件数量与大小限制。

请使用当前部署的目录返回的值。在管辖区域模式下,省略 model 和 effort 即可使用允许的默认值。若指定,则必须为默认的 Sonnet 4.6 / 高。不含附件时,检索服务管理回答模型;响应中的模型字段描述已验证的选择。

4. 聊天回答生成

POST/api/v1/chat/completions

发送包含 messages 数组的 JSON 正文。默认情况下,API 返回完整的 JSON 回答。将 stream 设为 true 可逐步接收文本。

聊天请求字段
字段默认说明
messages必填1–20 条交替的 user 和 assistant 消息,以 user 结尾。每条均包含 role 和字符串 content。
modefreestylefreestyle 用于灵活的法规研究,jurisdiction 用于受支持的管辖区域研究。
jurisdictionnull管辖区域模式下必填。使用目录中的标识符。在自由模式中必须省略或设为 null。
model目录默认值受支持的模型 ID。管辖区域模式要求使用默认的 Sonnet 选择。
effort模型默认值该模型支持的力度值。管辖区域模式要求高。
web_searchauto / off自由模式支持 auto、on 或 off,默认是 auto。管辖区域模式仅接受 off。
response_languageen目录中的回答语言代码。文档语言不限制回答语言。
streamfalse设为 true 以使用服务器发送事件(SSE)。
file_ids无最多五个不重复的可用文件 UUID,文件必须属于密钥所有者的账户。
JSON · 带附件的自由模式
{
  "messages": [{
    "role": "user",
    "content": "What retention period does this policy specify? Cite the document."
  }],
  "mode": "freestyle",
  "web_search": "off",
  "response_language": "en",
  "file_ids": ["YOUR_FILE_ID"]
}

将 YOUR_FILE_ID 替换为上传成功后返回的 UUID。后续提问应发送相关的用户和助手消息历史,并重新发送所需的 file_ids。API 不会自动记住对话历史或附件。

系统消息和未知字段会被拒绝。此 API 不提供图像生成、报告生成、音频输入或已保存记忆的访问。上传的图像可作为提问输入。

5. 回答与引用

回答生成成功后会返回 object: "regunow.chat.completion"、回答、来源元数据、用量和耗时。以下值仅作示例。

JSON · 聊天回答
{
  "id": "request-uuid",
  "request_id": "request-uuid",
  "object": "regunow.chat.completion",
  "created": 1790812800,
  "model": "jp.anthropic.claude-sonnet-4-6",
  "latency": {
    "time_to_first_token_ms": 2345,
    "time_to_answer_completion_ms": 9876
  },
  "output": {
    "input_files": [],
    "role": "assistant",
    "content": "The complete answer...",
    "finish_reason": "end_turn",
    "citations": [],
    "sources": [],
    "web_search": false
  },
  "usage": {
    "input_tokens": 1234,
    "output_tokens": 456,
    "charged_microcredits": 789000,
    "charged_credits": 0.789
  }
}
  • output.content 包含最终回答正文。引用偏移量以此最终字符串为准;sourceIndexes 标识 output.sources 中的条目。
  • 来源包含标题、文件名、MIME 类型、URI 和检索到的摘录。请在回答旁显示摘录和引用。
  • 来源 URI 是位置标识,可能指向私有存储。只有发布方的公开 URL 才应作为用户可打开的链接。API 不提供法规来源文件的下载或翻译。
  • 使用附件时,output.input_files 标识提供的文件。附件来源具有 file_id;法规和网页来源具有 file_id: null。附件 URI 为 null。
  • 存在输入文件并不证明它支持每项陈述。模型可能省略行内引用,图像或扫描件的摘录也可能为空。

检索服务未提供令牌计数时,其值可能为 null,表示未知而非零。charged_credits 是记录的客户费用。created 是以秒为单位的 Unix 时间戳,延迟值以毫秒为单位。

每个端点响应均含 X-Request-Id 响应头。请保留此标识符以便排查问题。聊天回答和错误 JSON 也包含 request_id。

6. 流式输出

设置 "stream": true。响应使用 text/event-stream。使用 cURL 时添加 -N 可禁用输出缓冲。

cURL · 流式回答
curl --fail-with-body -N \
  "$REGUNOW_BASE_URL/api/v1/chat/completions" \
  -H "Authorization: Bearer $REGUNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: streaming-question-001" \
  -d '{
    "messages": [{"role":"user","content":"Summarize EU product-safety obligations."}],
    "mode": "jurisdiction",
    "jurisdiction": "eu",
    "stream": true
  }'

读取以空行分隔的完整 SSE 事件。一个网络数据块可能包含部分事件或多个事件。收到 choices[0].delta.content 时将其追加。忽略以 : 开头的连接保活注释。

SSE · 事件序列(简略)
data: {"choices":[{"index":0,"delta":{"role":"assistant"},"finish_reason":null}]}

data: {"choices":[{"index":0,"delta":{"content":"The answer begins..."},"finish_reason":null}]}

data: {"choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}

data: {"choices":[],"usage":{"prompt_tokens":1234,"completion_tokens":456,"total_tokens":1690},"regunow":{"output":{},"latency":{},"usage":{"charged_credits":0.789,"charged_microcredits":789000}}}

data: [DONE]

最后的元数据事件包含空的 choices 数组。最终回答、引用和来源位于 regunow.output,耗时位于 regunow.latency,积分位于 regunow.usage。令牌计数使用 usage.prompt_tokens 和 usage.completion_tokens。

检索和引用处理可能造成停顿。在最终元数据到达前,应将文本视为暂定内容。流式输出开始后的错误以 error 对象和随后的 [DONE] 返回;仅有 HTTP 200 并不能确认成功。此前的身份验证或校验失败会返回普通 JSON 错误响应。

已完成操作的重放仍使用 SSE,并以单个文本块返回已保存的回答,同时包含 X-Idempotent-Replayed: true。

7. 文件

上传文档或图像,再将其 ID 附加到聊天请求中。文件共享密钥所有者的文件库和存储配额。文档最大为 10 MiB,图像最大为 5 MiB。

支持的文件格式
类别格式
文档PDF, TXT, CSV, TSV, Markdown, DOC, DOCX, ODT, RTF, XLSX, ODS, PPTX, ODP
图片JPEG, PNG, WebP, GIF

直接上传(推荐)

此三步流程将原始文件字节直接发送到存储,避开应用程序请求正文限制。建议托管集成使用,尤其适用于较大的文件。

POST/api/v1/files/upload-intents

仅发送 name、mime_type 和 bytes(准确的文件大小)。成功后返回 HTTP 201、待处理文件 ID,以及有效期为 300 秒的签名上传 URL。

cURL · 准备上传
curl --fail-with-body \
  "$REGUNOW_BASE_URL/api/v1/files/upload-intents" \
  -H "Authorization: Bearer $REGUNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: policy-intent-001" \
  -d '{"name":"policy.txt","mime_type":"text/plain","bytes":16384}'
JSON · 上传准备响应(部分字段)
{
  "id": "YOUR_FILE_ID",
  "status": "pending",
  "upload_method": "PUT",
  "upload_url": "SIGNED_UPLOAD_URL",
  "upload_headers": {"Content-Type": "text/plain"},
  "expires_in": 300
}

将 FILE_ID 设为返回的 id。使用返回的 upload_method、upload_url 和 upload_headers 上传完全一致的原始字节。请设置准确的 Content-Length。不要向上传 URL 发送 Regunow API 密钥,也不要将签名 URL 写入日志。

cURL · 发送文件字节
# Set UPLOAD_URL from the intent response. Use its returned upload_headers.
# This example assumes policy.txt is exactly 16,384 bytes.
curl --fail-with-body -X PUT "$UPLOAD_URL" \
  -H "Content-Type: text/plain" \
  -H "Content-Length: 16384" \
  --data-binary @./policy.txt

POST/api/v1/files/{fileId}/complete

使用不同的幂等键发送 {}。完成操作会验证字节,并返回 HTTP 200 和可用文件。只有完成成功后,才能在 file_ids 中使用其 ID。

cURL · 完成上传
curl --fail-with-body \
  "$REGUNOW_BASE_URL/api/v1/files/$FILE_ID/complete" \
  -H "Authorization: Bearer $REGUNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: policy-complete-001" \
  -d '{}'

上传 URL 过期后,删除未使用的待处理文件,并用新键准备另一次上传。重放准备请求不会延长 URL 的有效期。如果完成结果不确定,请先查询文件状态。如果仍待处理,请用新的幂等键重试完成;旧键会返回已保存的结果。对已可用文件执行完成操作会返回其元数据。

多部分上传

POST/api/v1/files

较小的文件可通过一个名为 file 的 multipart/form-data 字段发送。请发送原始字节,而非 base64 或远程 URL。托管网关的正文上限可能低于 API 的文件大小限制。

cURL · 多部分上传
curl --fail-with-body \
  "$REGUNOW_BASE_URL/api/v1/files" \
  -H "Authorization: Bearer $REGUNOW_API_KEY" \
  -H "Idempotency-Key: policy-upload-001" \
  -F "file=@./policy.pdf;type=application/pdf"

上传成功后返回 HTTP 201 和可用文件,无需单独调用完成操作。

JSON · 可用文件(示例)
{
  "id": "YOUR_FILE_ID",
  "object": "regunow.file",
  "name": "policy.pdf",
  "mime_type": "application/pdf",
  "category": "file",
  "bytes": 16384,
  "status": "available",
  "created_at": "2026-10-01T00:00:00Z",
  "request_id": "request-uuid",
  "usage": {"charged_microcredits":500,"charged_credits":0.0005}
}

列出、查询和删除文件

文件管理端点
方法端点行为
GET/api/v1/files列出可用文件。limit 默认为 20,接受 1–100。结果包含 data、has_more 和 next_after。下一页请将 next_after 作为 after 传入。
GET/api/v1/files/{fileId}查询文件元数据和状态(待处理、可用或失败)。
DELETE/api/v1/files/{fileId}永久删除文件库中的文件及分析和预览产物。返回 object: "regunow.file.deleted" 和 deleted: true。
cURL · 列出可用文件
curl --fail-with-body \
  "$REGUNOW_BASE_URL/api/v1/files?limit=20" \
  -H "Authorization: Bearer $REGUNOW_API_KEY"

同一账户的密钥可访问该账户文件库中的可用文件。不存在的文件和其他账户的文件都会返回 404。如果应用通过一个账户为多个用户提供服务,请在附加或删除文件前实施自己的用户权限检查。

待处理和失败的上传会占用配额,直到清理成功。超过 24 小时的未完成上传可被清理。可用文件已通过上传验证,但提取在提问时才进行,因此损坏、加密或不可读文档仍可能在分析时失败。

8. 积分与限制

回答生成、上传和删除均记录计量用量。模型目录和文件元数据读取不单独收取积分。文档提取和图像分析通过聊天请求计费。

使用 usage.charged_credits 查看操作费用。1 积分等于 1,000,000 个计费微单位。密钥积分上限与账户积分相互独立,任一不足都可能阻止请求。请在设置 → API 密钥中查看用量并配置上限。

API 限制
限制额度
API 密钥每个账户 25 个
并发回答生成和文件修改每个密钥 10 个
回答生成 JSON 正文192 KiB
每次回答生成的消息数1–20
消息文本每条消息 32,000 字符,总计 64,000 字符
每次回答生成的附件数5 个不同文件
文档大小每个文件 10 MiB
图像大小每个文件 5 MiB
文件库存储与账户文件库共享 5 GiB
幂等键1–120 个可打印 ASCII 字符,不含空格
重放窗口结算后 24 小时

即使每条消息和附件符合 API 限制,模型的上下文和视觉限制仍然适用。密钥预算按每日、每周或每月的滚动周期重置,从密钥创建或前一周期更新时开始计算。

有可用预算时开始的请求可能略微超出密钥的小额剩余预算,因为最终费用在生成后才确定。达到上限后,新的回答生成和文件修改会被阻止。预留机制避免并发请求重复使用同一份可用密钥预算。

9. 安全重试

每次回答生成、上传、上传完成和删除都应发送 Idempotency-Key。它是可选项,但强烈建议使用,以避免连接失败后重复处理和收费。

HTTP · 幂等请求头
Idempotency-Key: a-unique-key-for-this-operation
  • 为每个新操作生成唯一键,并与原始请求一起保存。
  • 使用相同的 API 密钥、幂等键和不变的输入重试。结算后 24 小时内,可重放已保存的状态和响应,无需再次调用提供商,也不再收费。
  • 重放会包含 X-Idempotent-Replayed: true。以不同输入复用键,或首次请求仍在处理时复用键,均返回 409。
  • 缓存结果可能包含错误。同一键可能返回相同失败,而不会重新执行。开始新操作前请先检查结果。
  • 重放窗口过期后,复用键会开始新请求,并可能再次收费。

临时网络故障、速率限制或服务故障应使用指数退避。处理结果不确定的请求时保留相同幂等键。无效输入、过期凭据或积分不足,应先修复原因再重试。

删除文件不会清除重放窗口内已缓存的回答生成或上传响应。删除后重放上传会返回原始响应,但不会重新创建文件。

10. 错误

错误使用固定的 JSON 结构。处理时请查看 error.code,联系支持时保留 request_id 或 X-Request-Id 响应头。

JSON · 错误响应(示例)
{
  "error": {
    "type": "request_error",
    "code": "invalid_request",
    "message": "messages must contain 1 to 20 alternating user/assistant messages, end with a user message, and stay within 64,000 characters."
  },
  "request_id": "request-uuid"
}
HTTP 错误与处理
状态常见代码处理方法
400invalid_request检查 JSON、允许的字段、消息、模型选项和文件 ID。
401invalid_api_key检查 Bearer 请求头,并替换过期、停用或已删除的密钥。
402account_quota_exceeded, api_key_limit_exceeded检查账户积分和密钥积分上限。
403pro_required, legal_acceptance_required恢复 Pro 权限,或让所有者在 Regunow 中同意现行政策。
404file_not_found使用属于密钥所有者账户的文件。
409idempotency_conflict, request_in_progress输入改变时使用新键。若请求仍在处理中,请等待后重试原操作。
413request_too_large减小消息或文件大小。若网关正文上限是原因,请使用直接上传。
415unsupported_media_type使用端点要求的 Content-Type 和未压缩的请求正文。
429concurrency_limit_exceeded, upstream_rate_limited降低并发数,并使用指数退避重试。
502–504upstream_unavailable, upstream_timeout, service_unavailable, usage_settlement_failed临时故障请逐步延长等待时间,并使用相同幂等键重试。已保存的失败可能会被重放。