1. 快速入门
Regunow API 使用 HTTPS、Bearer 身份验证和带版本的前缀 /api/v1。无需账户即可阅读本文档。发起 API 请求需要有效的 Pro 访问权限,并同意现行政策。
- 登录 Regunow,在设置 → API 密钥中创建密钥。
- 请妥善保存密钥的秘密值。它仅在创建密钥时显示一次。
- 设置主机和密钥,然后通过后端或可信的自动化程序发送第一个问题。
# 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)
// 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 或请求正文中的密钥不会被接受。
Authorization: Bearer rgn_live_...请将密钥保存在环境变量或密钥管理服务中,不要放入浏览器代码、移动应用程序包、公开代码仓库或日志。未启用浏览器跨源访问,请通过自己的服务器发起请求。
被停用、删除或过期的密钥会立即失去身份验证能力。Regunow 只保存秘密值的哈希,因此无法再次显示已有密钥的秘密值。需要时请创建替代密钥。
每次请求都会检查 Pro 权限和政策同意状态。收到 legal_acceptance_required 时,密钥所有者必须登录并打开法律条款确认。API 密钥不能代为同意政策。
3. 模型与选项
GET/api/v1/models
查询支持的模型、力度级别、管辖区域、回答语言和功能。此端点需要身份验证,但不单独收取积分,适合在生成回答前验证密钥。
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。 |
mode | freestyle | freestyle 用于灵活的法规研究,jurisdiction 用于受支持的管辖区域研究。 |
jurisdiction | null | 管辖区域模式下必填。使用目录中的标识符。在自由模式中必须省略或设为 null。 |
model | 目录默认值 | 受支持的模型 ID。管辖区域模式要求使用默认的 Sonnet 选择。 |
effort | 模型默认值 | 该模型支持的力度值。管辖区域模式要求高。 |
web_search | auto / off | 自由模式支持 auto、on 或 off,默认是 auto。管辖区域模式仅接受 off。 |
response_language | en | 目录中的回答语言代码。文档语言不限制回答语言。 |
stream | false | 设为 true 以使用服务器发送事件(SSE)。 |
file_ids | 无 | 最多五个不重复的可用文件 UUID,文件必须属于密钥所有者的账户。 |
{
"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"、回答、来源元数据、用量和耗时。以下值仅作示例。
{
"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 --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 时将其追加。忽略以 : 开头的连接保活注释。
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 --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}'{
"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 写入日志。
# 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.txtPOST/api/v1/files/{fileId}/complete
使用不同的幂等键发送 {}。完成操作会验证字节,并返回 HTTP 200 和可用文件。只有完成成功后,才能在 file_ids 中使用其 ID。
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 --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 和可用文件,无需单独调用完成操作。
{
"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 --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 密钥 | 每个账户 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。它是可选项,但强烈建议使用,以避免连接失败后重复处理和收费。
Idempotency-Key: a-unique-key-for-this-operation- 为每个新操作生成唯一键,并与原始请求一起保存。
- 使用相同的 API 密钥、幂等键和不变的输入重试。结算后 24 小时内,可重放已保存的状态和响应,无需再次调用提供商,也不再收费。
- 重放会包含
X-Idempotent-Replayed: true。以不同输入复用键,或首次请求仍在处理时复用键,均返回 409。 - 缓存结果可能包含错误。同一键可能返回相同失败,而不会重新执行。开始新操作前请先检查结果。
- 重放窗口过期后,复用键会开始新请求,并可能再次收费。
临时网络故障、速率限制或服务故障应使用指数退避。处理结果不确定的请求时保留相同幂等键。无效输入、过期凭据或积分不足,应先修复原因再重试。
删除文件不会清除重放窗口内已缓存的回答生成或上传响应。删除后重放上传会返回原始响应,但不会重新创建文件。
10. 错误
错误使用固定的 JSON 结构。处理时请查看 error.code,联系支持时保留 request_id 或 X-Request-Id 响应头。
{
"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"
}| 状态 | 常见代码 | 处理方法 |
|---|---|---|
| 400 | invalid_request | 检查 JSON、允许的字段、消息、模型选项和文件 ID。 |
| 401 | invalid_api_key | 检查 Bearer 请求头,并替换过期、停用或已删除的密钥。 |
| 402 | account_quota_exceeded, api_key_limit_exceeded | 检查账户积分和密钥积分上限。 |
| 403 | pro_required, legal_acceptance_required | 恢复 Pro 权限,或让所有者在 Regunow 中同意现行政策。 |
| 404 | file_not_found | 使用属于密钥所有者账户的文件。 |
| 409 | idempotency_conflict, request_in_progress | 输入改变时使用新键。若请求仍在处理中,请等待后重试原操作。 |
| 413 | request_too_large | 减小消息或文件大小。若网关正文上限是原因,请使用直接上传。 |
| 415 | unsupported_media_type | 使用端点要求的 Content-Type 和未压缩的请求正文。 |
| 429 | concurrency_limit_exceeded, upstream_rate_limited | 降低并发数,并使用指数退避重试。 |
| 502–504 | upstream_unavailable, upstream_timeout, service_unavailable, usage_settlement_failed | 临时故障请逐步延长等待时间,并使用相同幂等键重试。已保存的失败可能会被重放。 |
