跳到主要内容

Web API:接口约定与系统状态


title: JuanNiang-Neo Web API 文档

Base URL: http://localhost:8090/api/v1 Content-Type: application/json(上传文件为 multipart/form-data

统一响应格式

所有接口返回 FinalResponse

{ "status": 0, "info": "OK", "data": <任意类型或 null> }
字段类型说明
statusuint0=成功,非 0=错误码
infostring状态描述(成功为 "OK",失败为错误信息)
dataany业务数据;失败时可为 null{"error_detail": "..."}

注意:逻辑错误也使用 HTTP 200,全部以信封中的 status 判定结果。

错误码表

Code说明
0成功
40001参数格式错误(BindJSONErr)
40002用户名或密码错误
40003token 生成失败
40004用户不存在
40005原密码错误
40006密码更新失败
40007无效的 QQ 号
40008adapter 未初始化
40009provider 不存在
40010MCP 服务器不存在
40011Session 不存在
40012缺少上传文件
40013临时文件创建失败
40014文件写入失败
40015无效的 ZIP 文件
40016无效的 ACL ID
40017onebot11 适配器配置更新失败
40018Skill 不存在
40019Prompt 不存在
40020Tool 不存在
40021Plugin 不存在
40022插件加载失败
40023ChatArea 不存在
40024Memory 配置不存在
40025adapter 配置不存在
40026T2I 配置不存在
40027Sandbox 配置不存在
40028系统插件不允许删除或停用
40029系统提示词不允许修改或删除
40030内置工具运行时常驻,不支持启停
40031无效的回复策略
40032相关性阈值非法 / 判断失败策略只能是 drop 或 reply
40033知识内容不能为空
40034图片大小不能超过 1.5MB
40035不支持的图片格式(仅支持 jpg/png/gif/webp)
40036图片不存在
40037文件夹已存在
40038文件夹不存在
40039表情不存在
40040标签已存在
40041标签不存在
40042该图床图片已被其他表情引用
40043摸鱼日历配置不存在
40044定时消息任务不存在
40045插件名不合法(仅允许字母/数字/下划线/连字符)
40046插件包包含非法路径(疑似 zip-slip 攻击)
40047系统内置标签不可删除
50000服务器内部错误

认证

POST /login 和根路径下的 GET /health 外,所有接口需要 Authorization: Bearer <token> 头。Token 由 POST /login 获取。 系统初始化时默认账号 admin / Admin123,首次启动后请尽快通过 POST /change-password 修改。

JWT_SECRET 用于 HMAC 签名;Token 有效期 72 小时(internal/api/middleware/auth.go)。


通用数据类型

类型JSON 形式说明
JSONMap{"k":"v"}map[string]any(GORM jsonb)
JSONSlice["a","b"][]string(GORM jsonb)
time.TimeRFC3339 字符串"2026-07-20T12:00:00Z"

枚举类型

  • ModelType: text_model | image_model | embedding_model
  • PromptType: system | personality | customsystem 保留给系统锁定提示词,禁止新建)
  • AreaType: private | group
  • ACLScope: chat | tool | mcp当前仅 chat 生效tool/mcp 为历史保留)
  • ACLPermission: allow | deny
  • ACLTargetType: all | listlistuser_ids 才有效)
  • ReplyStrategy: never_reply | at_only | always | relevance

ACL 语义(当前仅聊天黑名单):无规则=允许所有;仅 deny 规则生效(all=禁止所有人、list=禁止指定 user_ids);allow 规则不再生效;Admins 列表中的用户绕过 ACL。


1. 认证

POST /login

管理员登录,返回 JWT。

Body LoginReq:

字段类型必填说明
usernamestring用户名
passwordstring明文密码

data TokenResp:

字段类型说明
tokenstringJWT,放入后续 Authorization: Bearer <token>
curl -X POST http://localhost:8090/api/v1/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"Admin123"}'
# {"status":0,"info":"OK","data":{"token":"eyJhbGciOi..."}}

POST /change-password

修改当前登录用户密码。

Body ChangePasswordReq: old_password string、new_password string(均必填)。 data null


2. 健康检查

GET /health

不在 /api/v1 前缀下,无需认证)服务存活检查。

{"status":"ok"}

3. Overview

GET /overview

返回系统全局概览(资源计数 + 系统状态 + T2I/Sandbox 健康)。

data OverviewResp: chat_area_countmcp_countadapter_count(固定 1)、plugin_countprovider_countskill_countsession_counttotal_token_usage int64、cpu_countgoroutine_nummem_alloc_bytesmem_sys_bytesmem_heap_inuse_bytes uint64、go_versiont2i_activet2i_healthysandbox_activesandbox_healthy bool。

GET /overview/daily-token-usage

近 N 天每日 Token 用量(折线图数据点)。

Query类型默认说明
daysint7天数,范围 1–30

data DailyTokenUsageResp[]: date string(YYYY-MM-DD)、token_count int64。


4. 日志

日志由 internal/logging Hub 维护,环形缓冲区保留最近 250 条。

GET /logs

返回最近 250 条,最新排在最前

data LogEntryResp[]: time time、level string、message string、attrs map。

GET /logs/stream

SSE 实时日志流。text/event-stream

  • 先按时间顺序发送最近 250 条历史
  • 再订阅 Hub 实时推送;每 15 秒发送一次 keepalive 心跳
  • 客户端断开或服务停止时退出

事件:

event: log
data: {"time":"2026-07-20T12:00:00Z","level":"INFO","message":"...","attrs":{}}
const es = new EventSource('/api/v1/logs/stream', {
headers: { Authorization: 'Bearer ' + token }
});
es.addEventListener('log', (e) => {
const entry = JSON.parse(e.data);
console.log(entry.time, entry.level, entry.message);
});

附:前端 SPA 静态服务

后端复用 Hertz 引擎同端口(:8090)服务前端 SPA:

请求路径模式行为
/api/v1/<已注册路由>Hertz 路由,JWT 鉴权(除 /login
/health内联健康检查(root,无需鉴权)
/api/*(未命中)标准信封 404:{"status":40400,"info":"资源不存在","data":null}
其它任何路径文件存在→serve 文件;不存在→回退 index.html
前端未构建(index.html 缺失)200 + 引导提示页("请先构建前端")

实现:internal/web/web.go::SPAHandler(webDir),在 engine.New 中通过 h.NoRoute(...) 注册;不嵌入二进制,磁盘上 WEB_DIR(默认 web/dist)为准;开发期 Vite :3000 代理 /api:8090,Go 的 fallback 不会被触发。