REST API
上报接口
仅提供 POST /api/conversations/ 用于客户端上报对话记录。数据查看与管理操作请在控制台登录后进行,不通过 API 暴露。
鉴权
上报接口接受 JSON 请求体(Content-Type: application/json)。
| 调用方 | 方法 | 凭证 |
|---|---|---|
| 客户端上报 | POST |
当前未启用上传凭证。生产环境建议配置 CONVERSATION_UPLOAD_TOKEN
|
单次请求体不超过 2097152 字节;同一 IP 每小时最多上报 60 次。
POST
/api/conversations/
创建一条采集记录。conversation 必须是对话 JSON 文本的 Base64。服务端解码为 UTF-8 文本、校验 JSON,并保存为文件。成功返回 201。
Request body
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
conversation | string (Base64) | 是 | 将对话 JSON 序列化为 UTF-8 文本后再做 Base64。解码后须为对象或数组 |
conversation_id | string | 否 | 客户端侧对话 ID |
title | string | 否 | 标题;缺省时按首条用户消息生成 |
feedback | string | 否 | 用户反馈 |
rating | integer | 否 | 1–5 |
tags | array / string | 否 | 标签数组,或逗号分隔字符串 |
user | object | 否 | id、name、email、extra |
client | object | 否 | app_version、os、device |
Response 201
{
"ok": true,
"id": "ef9a1071-b810-48bc-ab30-c6b8b59c8b5c",
"title": "帮我总结这次会议",
"message_count": 2,
"created_at": "2026-08-28T15:00:48.657940+00:00"
}
错误码
| HTTP | 含义 | 示例 |
|---|---|---|
| 400 | 请求体不合法 | 缺少 Base64 对话、解码失败,或评分不在 1–5 |
| 401 | 未授权 | 上传凭证错误 |
| 405 | 方法不允许 | 使用 GET / PATCH 等非 POST 方法 |
| 429 | 频率限制 | 同一 IP 上报过于频繁 |
{
"ok": false,
"error": "缺少 conversation 字段"
}
调用示例
curl 上报
# conversation 为对话 JSON 的 Base64
curl -X POST https://kekehui.top/api/conversations/ \
-H "Content-Type: application/json" \
-d "{
\"conversation\": \"eyJyb2xlIjoidXNlciJ9\",
\"feedback\": \"结构完整,细节不足\",
\"rating\": 4,
\"user\": {\"id\": \"u_1001\", \"name\": \"analyst\"},
\"client\": {\"app_version\": \"1.2.0\", \"os\": \"Windows 10\"}
}"
Python 上报
import base64
import json
import urllib.request
messages = [
{"role": "user", "content": "帮我写一份周报"},
{"role": "assistant", "content": "好的,这是提纲。"},
]
conversation = base64.b64encode(
json.dumps(messages, ensure_ascii=False).encode("utf-8")
).decode("ascii")
payload = {
"conversation": conversation,
"feedback": "未按给定格式输出",
"rating": 2,
"user": {"id": "u_123", "name": "analyst"},
"client": {"app_version": "1.0.0", "os": "Windows 10"},
}
req = urllib.request.Request(
"https://kekehui.top/api/conversations/",
data=json.dumps(payload, ensure_ascii=False).encode("utf-8"),
headers={"Content-Type": "application/json"},
method="POST",
)
with urllib.request.urlopen(req) as resp:
print(resp.read().decode("utf-8"))