POST https://api.adventists.cn/v2/log_configapi-key(API 密钥)和 org-id(组织 ID)| 模式 | 适用场景 | 关键配置 |
|---|---|---|
| 原始推送 | 自有系统对接,需要完整数据 | 只配置 log_webhook_url |
| 字段映射 | 接入第三方计费平台,只需 token 用量、过滤内容字段 | 配置 log_webhook_template |
| 自定义鉴权 | 下游接口需要 API Key 或 Bearer Token | 配置 log_webhook_headers |
| 配置项 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
log_webhook_url | String | 是 | — | 推送目标 URL。此项为空则 Webhook 功能不启用 |
log_webhook_headers | Map | 否 | {} | 自定义 HTTP 请求头,用于下游接口鉴权或来源标识 |
log_webhook_template | Map | 否 | null | 字段映射与过滤模板。不填则推送原始完整 Payload(含对话内容) |
log_webhook_wrap | Boolean | 否 | true | 是否在 Payload 外包裹 {"type": "...", "data": {...}} |
log_webhook_urlPOST 请求。此字段决定 Webhook 是否启用:delete_webhook)→ 推送立即停止log_webhook_headersContent-Type: application/json,此处配置的 header 会额外追加。| 场景 | 示例 |
|---|---|
| API Key 鉴权 | {"X-API-KEY": "your-secret-key"} |
| Bearer Token 鉴权 | {"Authorization": "Bearer your-token"} |
| 标识推送来源 | {"X-Source": "anyone-v2.5"} |
log_webhook_templateprompt、answer 等对话内容);配置后只有模板内声明的字段才会出现在推送中,未声明的字段全部过滤掉。inputToken、outputToken)inputToken → upstream_tokens)log_webhook_wrap| 值 | 推送格式 | 适用场景 |
|---|---|---|
true(默认) | {"type": "llm_log", "data": {...}} | 推荐。通过 type 字段可区分对话日志与后台任务日志,便于在同一 Endpoint 中分类处理 |
false | 直接推送 data 内容本身(扁平 JSON) | 下游接口不接受嵌套结构、或已通过其他方式区分日志类型时使用 |
| 日志类型(type) | 触发场景 |
|---|---|
llm_log | 用户每轮对话结束 |
dream_log | 后台记忆整理任务完成 |
flush_log | 短期记忆归档任务完成 |
log_webhook_wrap = true(默认)时,推送格式为:{
"type": "llm_log",
"data": {
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"task_id": "task-abc123",
"model_provider": "openai",
"npcid": "4WXDQF5a9c65063e4d4c9389454c3a41812c32",
"timestamp": "1751280000000",
"org_id": "4WXDQF",
"device_id": "1064820010000",
"inputToken": 1850,
"outputToken": 320,
"prompt": "今天天气怎么样?",
"answer": "今天北京天气晴朗,气温25度左右,很适合出去走走呢~",
"thinking": {
"logic": "用户询问天气,属于信息查询类请求...",
"emotion": "语气平和,以轻松方式回应...",
"memory": "暂无相关历史记忆...",
"topic": "话题为天气,可延伸到出行建议...",
"search": "北京天气:晴,25°C,湿度60%"
},
"time_log": {
"first_sentence": {
"function_check": 0.12,
"function_check_token": { "input": 150, "output": 0 },
"quick_response": { "first_token_delay": 0.45, "total_time": 1.2, "input_token": 800, "output_token": 50 },
"function_call": { "first_token_delay": 0, "total_time": 0, "input_token": 0, "output_token": 0 }
},
"think": {
"logic": { "first_token_delay": 0.3, "total_time": 0.8, "input_token": 400, "output_token": 80 },
"emotion": { "first_token_delay": 0.2, "total_time": 0.6, "input_token": 300, "output_token": 60 },
"memory": { "first_token_delay": 0, "total_time": 0, "input_token": 0, "output_token": 0 },
"search": { "first_token_delay": 0, "total_time": 0, "input_token": 0, "output_token": 0 },
"topic": { "first_token_delay": 0.1, "total_time": 0.4, "input_token": 200, "output_token": 50 }
},
"answer": {
"first_token_delay": 0.5,
"total_time": 2.1,
"rounds": [
{ "input_token": 0, "output_token": 80 }
]
},
"intent_classifier": { "time": 0.05, "input_token": 0, "output_token": 0 },
"function_response": { "input_token": 0, "output_token": 0 },
"tool_call_process": { "input_token": 0, "output_token": 0 },
"function_internal": { "input_token": 0, "output_token": 0 }
},
"function_calls": []
}
}| 字段 | 类型 | 说明 |
|---|---|---|
request_id | String | 本次请求唯一标识(UUID) |
task_id | String | 关联任务 ID |
model_provider | String | 模型提供商(如 openai、anthropic) |
npcid | String | NPC 唯一标识 |
timestamp | String | 毫秒级 Unix 时间戳 |
org_id | String | 组织 ID |
device_id | String | 设备/用户 ID |
inputToken | Number | 本次对话全阶段输入 token 总量 |
outputToken | Number | 本次对话全阶段输出 token 总量 |
prompt | String | 用户输入内容 |
answer | String | NPC 最终回答内容 |
thinking | Object | 各思考阶段的推理内容(logic/emotion/memory/search/topic) |
time_log | Object | 各阶段耗时与 token 明细统计 |
function_calls | Array | 本次调用的工具/函数列表 |
shortMemoryToken | Number | 短期记忆 token 数(有值时才出现) |
longMemoryToken | Number | 长期记忆 token 数(有值时才出现) |
skillMemoryToken | Number | 技能记忆 token 数(有值时才出现) |
relationshipToken | Number | 关系记忆 token 数(有值时才出现) |
log_webhook_wrap = false 时,直接推送 data 对象本身,不含外层 type/data 包裹。log_webhook_wrap = true(默认)时,推送格式为:{
"type": "dream_log",
"data": {
"request_id": "550e8400-e29b-41d4-a716-446655440001",
"npcid": "4WXDQF5a9c65063e4d4c9389454c3a41812c32",
"org_id": "4WXDQF",
"timestamp": "1751280060000",
"model": "gpt-4o",
"stage": "diary",
"inputToken": 2100,
"outputToken": 450,
"extra": {
"tool_calls": 3
}
}
}| 字段 | 类型 | 说明 |
|---|---|---|
request_id | String | 唯一请求 ID(UUID) |
npcid | String | NPC 唯一标识 |
org_id | String | 组织 ID |
timestamp | String | 毫秒级 Unix 时间戳 |
model | String | 实际调用的模型名称 |
stage | String | 任务子阶段(如 diary、prior_merge、entity_extract) |
inputToken | Number | 本次调用输入 token 数 |
outputToken | Number | 本次调用输出 token 数 |
extra | Object | 附加信息,可选字段 |
prompt、answer、thinking、time_log 等内容字段。{
"upstream_tokens": "inputToken",
"downstream_tokens": "outputToken"
}const — 固定常量{
"provider_type": { "type": "const", "value": "10" },
"model_name": { "type": "const", "value": "anyone-v2.5" }
}| 参数 | 说明 |
|---|---|
value | 要写入的固定值(任意类型) |
uuid — 随机 UUID{
"record_id": { "type": "uuid" }
}"550e8400-e29b-41d4-a716-446655440000"now — 当前推送时间YYYY-MM-DD HH:MM:SS。{
"push_time": { "type": "now" }
}"2026-06-30 16:00:00"datetime — 时间戳转日期字符串YYYY-MM-DD HH:MM:SS)。{
"send_time": { "type": "datetime", "source": "timestamp" }
}| 参数 | 说明 |
|---|---|
source | 原始 Payload 中的字段名,值须为毫秒级时间戳 |
"2026-06-30 16:00:00"sum — 多字段求和{
"used_tokens": { "type": "sum", "sources": ["inputToken", "outputToken"] }
}| 参数 | 说明 |
|---|---|
sources | 要求和的字段名数组,缺失的字段按 0 计算 |
field — 显式字段引用{
"npc": { "type": "field", "source": "npcid" }
}| 参数 | 说明 |
|---|---|
source | 原始 Payload 中的字段名 |
{
"log_webhook_url": "https://your-system.example.com/api/log"
}{
"type": "llm_log",
"data": {
"request_id": "550e8400-...",
"npcid": "ABCDEF...",
"inputToken": 1850,
"outputToken": 320,
"prompt": "今天天气怎么样?",
"answer": "今天天气晴朗..."
}
}{
"log_webhook_url": "https://api.example.com/tokenUse/",
"log_webhook_wrap": false,
"log_webhook_template": {
"sno": "device_id",
"msisdn": "device_id",
"provider_type": { "type": "const", "value": "10" },
"model_id": { "type": "const", "value": "10-anyone-v2.5" },
"model_name": { "type": "const", "value": "anyone-v2.5" },
"offering_type": { "type": "const", "value": "1" },
"offering_sort": { "type": "const", "value": "2" },
"upstream_tokens": "inputToken",
"downstream_tokens": "outputToken",
"used_tokens": { "type": "sum", "sources": ["inputToken", "outputToken"] },
"send_time": { "type": "datetime", "source": "timestamp" },
"push_time": { "type": "now" }
}
}wrap=false,扁平 JSON){
"sno": "1064820010000",
"msisdn": "1064820010000",
"provider_type": "10",
"model_id": "10-anyone-v2.5",
"model_name": "anyone-v2.5",
"offering_type": "1",
"offering_sort": "2",
"upstream_tokens": 1850,
"downstream_tokens": 320,
"used_tokens": 2170,
"send_time": "2026-06-30 16:00:00",
"push_time": "2026-06-30 16:00:01"
}prompt、answer、thinking、time_log 等字段因未在模板中声明,不会出现在推送数据中。{
"log_webhook_url": "https://secure-api.example.com/webhook/log",
"log_webhook_headers": {
"X-API-KEY": "your-secret-api-key",
"X-Source": "anyone-v2.5"
}
}Content-Type: application/json
X-API-KEY: your-secret-api-key
X-Source: anyone-v2.5POST https://api.adventists.cn/v2/log_configapplication/json| Header | 类型 | 必填 | 说明 |
|---|---|---|---|
api-key | String | 是 | API 密钥 |
org-id | String | 是 | 组织 ID |
Header 名称使用连字符( api-key、org-id),不要使用下划线。
| action | 说明 |
|---|---|
query_webhook | 查询当前 org 的全部 Webhook 配置 |
update_webhook | 更新一个或多个 Webhook 配置字段 |
delete_webhook | 清除 Webhook 配置(禁用推送) |
{
"action": "query_webhook"
}{
"status": "success",
"data": {
"log_webhook_url": "https://your-endpoint.com/log",
"log_webhook_headers": { "X-API-KEY": "your-key" },
"log_webhook_template": null,
"log_webhook_wrap": false
}
}null。{
"action": "update_webhook",
"fields": {
"log_webhook_url": "https://your-endpoint.com/log",
"log_webhook_wrap": false
}
}fields 中只需传需要修改的字段,其余字段保持不变。可修改的字段范围:| 字段 | 类型 | 说明 |
|---|---|---|
log_webhook_url | String | 推送目标 URL。设为空字符串等同于停用推送 |
log_webhook_headers | Object | 随推送附加的 HTTP 请求头,用于鉴权或来源标识。传入 {} 可清除所有自定义 header |
log_webhook_template | Object | 字段映射模板,控制推送哪些字段及字段名格式。传入 null 可恢复为全量推送 |
log_webhook_wrap | Boolean | 是否包裹推送体。true 时外层有 type/data 结构,false 时直接推送扁平数据 |
{
"status": "success",
"data": {
"updated": ["log_webhook_url", "log_webhook_wrap"]
}
}log_webhook_url,禁用 Webhook 推送。其他字段(headers、template)保留但不再生效。{
"action": "delete_webhook"
}{
"status": "success",
"data": {
"message": "Webhook 配置已清除"
}
}| 状态码 | message | 原因 |
|---|---|---|
| 400 | 非法的 action | action 不在支持列表中 |
| 400 | 缺少 fields 字段或格式错误 | update_webhook 未传 fields |
| 400 | 不允许修改的字段: [...] | fields 中包含非白名单字段 |
| 401 | Invalid API KEY or ORG ID | Header 格式不正确 |
| 401 | ORG ID does not exist | org_id 不存在 |
| 401 | Invalid API KEY | api_key 与记录不匹配 |
| 500 | 服务器内部错误 | 写库失败或异常 |
prompt(用户输入)和 answer(NPC 回答)等内容字段。如果 Endpoint 只需要 token 用量数据,建议配置模板,仅映射所需字段(如 inputToken、outputToken),避免推送不必要的内容。wrap=false 和 wrap=true 有什么区别?wrap=true(默认):推送 {"type": "llm_log", "data": {...}},可通过 type 字段区分不同日志类型wrap=false:直接推送 data 内容本身(扁平 JSON),适合下游接口不接受嵌套结构的场景type 字段不同,以及 data 字段更精简(无 prompt/answer/thinking/time_log)。llm_log、dream_log、flush_log 均推送到同一个 URL。如需区分,建议在 Endpoint 中通过 type 字段路由处理。| 情况 | 处理方式 |
|---|---|
| HTTP 推送超时(> 5 秒) | 放弃本次推送,不重试 |
| HTTP 4xx / 5xx 响应 | 记录警告,不重试 |
| 网络异常 | 放弃本次推送,不重试 |
| 模板转换异常 | 跳过本次推送 |