LG 开放平台接口文档
LG 开放平台接口文档
本文档为 LG 开放平台 API 接口使用说明,覆盖开放平台提供的全部接口,按功能分组。
每个接口标注:方法、路径、鉴权方式、请求参数、响应结构。
一、服务地址
LG 开放平台服务,接口路径均以服务前缀拼接:
| 服务 | 基地址 | 用途 |
|---|---|---|
| LG 开放平台 | https://lg.jimitu.top | 角色/会话/消息/渠道/TTS(默认) |
完整请求地址 = 服务前缀 + 接口路径,例如:https://lg.jimitu.top/api/open/publishings。
二、接口调用一览表
| # | 方法 | 路径 | 说明 |
|---|---|---|---|
| 1 | GET | /api/open/publishings | 获取上架列表 |
| 2 | GET | /api/open/publishings/{id} | 获取单个上架详情 |
| 3 | GET | /api/open/channels | 获取硬件渠道列表 |
| 4 | POST | /api/open/channels/{id}/bind-device | 绑定设备到渠道 |
| 5 | DELETE | /api/open/channels/{id}/bind-device | 解绑设备 |
| 6 | GET | /api/open/devices/character | 查询设备绑定的有效角色 |
| 7 | GET | /api/open/characters/{id} | 获取角色实例详情 |
| 8 | PUT | /api/open/characters/{id} | 更新角色实例属性 |
| 9 | DELETE | /api/open/characters/{id} | 删除角色实例 |
| 10 | GET | /api/open/sessions | 获取会话列表 |
| 11 | GET | /api/open/sessions/{id}/messages | 分页获取会话历史消息 |
| 12 | DELETE | /api/open/sessions/{id} | 删除会话及其全部消息 |
| 13 | POST | /api/open/sessions/{id}/messages/import | 批量导入历史消息 |
| 14 | POST | /api/open/characters/{id}/tts | 流式语音合成 |
合计:14 个在用接口,详见后续章节。
三、统一请求约定
3.1 请求头
所有接口需在请求头中携带以下字段:
| Header | 说明 |
|---|---|
Authorization | Bearer {API Key},接口鉴权 |
X-Device-Id | 设备 ID,所有请求均需携带 |
X-User-Id | 用户 ID(格式 cm_xxx),与 X-Device-Id 配合使用:设备会话归属该用户 |
Content-Type | 默认 application/json |
请求示例(curl):
# 查询上架列表
curl -X GET "https://lg.jimitu.top/api/open/publishings" \
-H "Authorization: Bearer <your_api_key>" \
-H "X-Device-Id: <device_id>" \
-H "X-User-Id: <user_id>"
<your_api_key> 为 API Key(调用方申请);<device_id> 为设备 ID;X-User-Id 为平台分配的用户 ID,未分配用户时可省略(设备会话仍可查询)。
3.2 统一响应格式
标准 ApiResponse<T>:
{
"success": true,
"data": T,
"message": "(失败时)错误说明",
"error_code": "(失败时)错误码",
"pagination": { /* 分页响应时附带 */ }
}
分页响应(保留完整对象,含 pagination):
{
"data": [ ... ],
"pagination": {
"current_page": 1,
"total_pages": 3,
"total_count": 58,
"has_next": true,
"has_previous": false
}
}
响应解包规则:
success: true且无pagination→ 取data字段success: true且有pagination→ 返回完整对象(含pagination)success: false→ 业务错误,含message与error_code- 无
success字段 → 直接返回 body 或 body.data
3.3 错误处理
所有接口的错误响应遵循统一格式:{ "success": false, "message": "...", "error_code": "..." }。
| HTTP 状态 | 含义 |
|---|---|
| 401 | API Key 无效或已过期 |
| 403 | 无权限访问该资源 |
| 400 | 请求参数错误 |
| 404 | 资源不存在(业务级,含 error_code 字段) |
| 409 | 设备 ID 需消歧、角色未绑定或外部用户 ID 已被占用(设备接口) |
| 500 | 服务器内部错误 |
普通请求超时 30s;SSE/音频流接口为长连接,超时 300s。
四、LG 开放平台 API(设备管控)
基地址:https://lg.jimitu.top
鉴权:Authorization: Bearer {API Key} + X-Device-Id + X-User-Id
请求示例(curl):
# 创建角色实例
curl -X POST "https://lg.jimitu.top/api/open/characters" \
-H "Authorization: Bearer <your_api_key>" \
-H "X-Device-Id: <device_id>" \
-H "X-User-Id: <user_id>" \
-H "Content-Type: application/json" \
-d '{"template_id":10,"user_id":"<user_id>","user_nickname":"用户昵称"}'
# 查询设备绑定的有效角色
curl -X GET "https://lg.jimitu.top/api/open/devices/character?device_id=<device_id>&channel_id=100" \
-H "Authorization: Bearer <your_api_key>" \
-H "X-Device-Id: <device_id>" \
-H "X-User-Id: <user_id>"
4.1 渠道与上架
获取上架列表,含 template_id 与 hardware_channels。设备绑定时需要 template_id 创建角色实例,channel_id 用于绑定路径。
响应 data: Publishing[]:
{
"id": 1,
"template_id": 10,
"template_name": "默认模版",
"publish_name": "chirpy 初代",
"publish_logo": "https://...",
"interaction_name": "自由对话",
"publish_game_url": "https://...",
"template_info": {
"description": "...",
"basic_personality": "...",
"gender": "female",
"catchphrase": "...",
"background": "...",
"creator_name": "官方",
"source": "官方"
},
"hardware_channels": [
{
"channel_id": 100,
"channel_type": "official_hardware",
"channel_type_display": "官方硬件",
"hardware_type": "AI玩偶",
"status": "online"
}
],
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-01T00:00:00Z"
}
仅返回已上架渠道。
响应 data: Channel[]:
{
"channel_id": 100,
"publish_name": "chirpy 初代",
"channel_type": "official_hardware",
"channel_type_display": "官方硬件",
"hardware_type": "AI玩偶",
"status": "online",
"publishing_id": 1,
"template_id": 10,
"created_at": "...",
"updated_at": "..."
}
绑定/查询设备前建议先确认渠道状态:渠道不存在时返回 CHANNEL_NOT_FOUND,渠道已下架时返回 CHANNEL_OFFLINE。
获取单个上架的详细信息。
响应 data:
{
"id": 1,
"template_id": 10,
"template_name": "温柔姐姐",
"publish_name": "温柔姐姐-公开版",
"interaction_name": "小柔",
"greeting": "你好呀~",
"personality": "温柔体贴",
"background_story": "..."
}
4.2 设备绑定(渠道下绑定外部用户)
将硬件设备 ID 与外部用户 ID 关联,设备通过网关聊天时使用绑定用户身份。
user_id 与 device_id 配合:绑定后,设备端产生的会话归属该用户(external_user_id),用户可通过 user_id(+ device_id 过滤)查询设备会话。解绑后该用户无法再查询对应硬件会话。
请求 body:
{
"device_id": "123456",
"product_key": "(可选,渠道内重复设备 ID 时必填)",
"external_user_id": "<user_id>",
"external_user_nickname": "(可选)用户昵称"
}
响应 data: BindDeviceResult:
{
"device_id": "123456",
"product_key": "...",
"channel_id": 100,
"binding_id": 999,
"character_id": 555,
"external_user_id": "<user_id>",
"external_user_nickname": "..."
}
校验规则(错误码):
| 校验项 | error_code | HTTP | 说明 |
|---|---|---|---|
| 渠道不存在 | CHANNEL_NOT_FOUND | 404 | 指定 channel_id 不存在 |
| 渠道非硬件类型 | CHANNEL_NOT_HARDWARE | 400 | 渠道类型不是官方/商家硬件 |
| 渠道未上架 | CHANNEL_OFFLINE | 400 | 渠道状态为下架 |
| 令牌无权限 | CHANNEL_NOT_AUTHORIZED | 403 | API Key 未关联该渠道所属上架 |
| 设备不存在 | DEVICE_NOT_FOUND | 404 | device_id 在该渠道下不存在 |
| 设备 ID 不唯一 | DEVICE_ID_AMBIGUOUS | 409 | 渠道内多个同 ID 设备,需补 product_key |
| 角色未绑定 | DEVICE_CHARACTER_NOT_BOUND | 409 | 设备在该渠道下没有有效角色绑定 |
| 外部用户 ID 重复 | EXTERNAL_USER_ID_DUPLICATE | 409 | 同一渠道下已有其他设备绑定该 external_user_id |
| 必填参数缺失 | — | 400 | device_id 或 external_user_id 为空 |
解绑仅清空设备上的外部用户信息,不删除角色绑定或已有聊天记录;但该用户将无法再通过 Open API 查询对应硬件会话。
请求 body:
{
"device_id": "123456",
"product_key": "(可选,消歧用)",
"external_user_id": "<user_id>" // 必须与设备当前绑定的外部用户 ID 一致
}
响应 data: UnbindDeviceResult:
{
"device_id": "123456",
"product_key": "...",
"channel_id": 100,
"binding_id": 999,
"character_id": 555,
"external_user_id": "<user_id>",
"external_user_nickname": "...",
"unbound": true
}
校验错误码:
| 场景 | error_code | HTTP |
|---|---|---|
| 外部用户 ID 与设备当前绑定不一致 | EXTERNAL_USER_MISMATCH | 409 |
| 设备未绑定外部用户 | DEVICE_EXTERNAL_USER_NOT_BOUND | 409 |
| 其余校验同 POST bind-device | 同左 | 同左 |
查询范围仅限当前 API Key 已关联且处于上架状态的硬件渠道。
请求 query:
{
"device_id": "123456",
"channel_id": 100, // 可选,消歧
"product_key": "..." // 可选,消歧
}
响应 data: DeviceCharacterResult:
{
"device_id": "123456",
"product_key": "...",
"channel_id": 100,
"binding_id": 999,
"character_id": 555,
"template_publishing_id": 1,
"external_user_id": "<user_id>", // 未绑定时空串
"external_user_nickname": "..." // 未绑定时空串
}
查询约束(错误码):
| 场景 | error_code | HTTP |
|---|---|---|
| 缺少设备 ID | DEVICE_ID_REQUIRED | 400 |
| channel_id 格式错误 | INVALID_CHANNEL_ID | 400 |
| 授权范围内没有有效设备角色绑定 | DEVICE_CHARACTER_NOT_FOUND | 404 |
| 授权范围内有多个同 ID 设备 | DEVICE_ID_AMBIGUOUS | 409 |
4.3 角色实例 CRUD
响应 data: CharacterDetail:
{
"id": 555,
"template_id": 10,
"name": "小叽",
"description": "...",
"basic_personality": "...",
"personality": "...",
"gender": "female",
"age_stage": "adult", // young / adult / old
"background": "...",
"background_story": "...",
"greeting": "你好呀!",
"avatar": "/path/to/avatar.png",
"catchphrase": "...",
"rag_enabled": false,
"memory_enabled": true,
"tts_enabled": true,
"tts_voice_id": "qwen-xxx",
"tts_audio_codec": "pcm", // pcm 或 opus
"recommendation_enabled": false,
"vision_enabled": false,
"created_at": "...",
"updated_at": "..."
}
avatar 为相对路径时,前端拼接 API_BASE_URL 前缀展示。
仅提交变更字段。
请求 body(Partial<CharacterUpdate>,全可选):
{
"name": "...",
"description": "...",
"avatar": "...",
"basic_personality": "...",
"personality": "...",
"background": "...",
"background_story": "...",
"greeting": "...",
"gender": "...",
"age_stage": "...",
"catchphrase": "...",
"rag_enabled": false,
"memory_enabled": true,
"tts_enabled": true,
"tts_voice_id": "...",
"tts_audio_codec": "pcm",
"recommendation_enabled": false,
"vision_enabled": false
}
响应 data: CharacterDetail(同 GET 详情)。
响应:{ success: true, message: "Character deleted" }
4.4 会话与消息
合并查询指定用户的 Open API 与已授权绑定设备会话,默认只返回有效会话。
user_id 与 device_id 配合:user_id 限定会话归属用户(含该用户绑定的设备会话),device_id 可进一步限定到具体设备;两者配合即可查询某用户某设备的会话与消息。
请求 query:
{
"user_id": "<user_id>", // 必填
"character_id": 555, // 可选
"session_source": "all", // all(默认)/ open_api / device
"channel_id": 100, // 可选,仅筛选指定渠道硬件会话
"device_id": "123456", // 可选
"product_key": "...", // 可选
"include_expired": false, // true 时含自动失效会话
"include_inactive": false, // true 时含手动关闭会话
"page": 1,
"page_size": 20 // 默认 20,最大 100
}
character_id、channel_id、page、page_size 格式错误或超分页上限 → 400 INVALID_QUERY_PARAMETER。
响应(分页,保留完整对象):
{
"data": [
{
"id": 1001,
"name": "open_api_小叽_<user_id>", // 自动生成:open_api_{角色名}_{user_id}
"session_source": "device", // open_api=APP会话 / device=硬件网关会话
"character_id": 555,
"character_name": "小叽",
"user_id": "<user_id>",
"publishing_id": 1, // 硬件会话有;APP 会话为 null
"channel_id": 100, // 同上
"device_id": "123456", // 同上
"product_key": "...", // 同上
"is_active": true, // false=已手动关闭
"is_expired": false, // true=已自动失效(>24h 或 >5000 条)
"message_count": 42,
"last_message_at": "2026-01-01T12:00:00Z",
"expired_at": null,
"created_at": "...",
"updated_at": "..."
}
],
"pagination": { "current_page": 1, "total_pages": 3, "total_count": 58, "has_next": true, "has_previous": false },
"last_message_at": "..."
}
会话状态说明:
| is_active | is_expired | 含义 | 默认是否返回 |
|---|---|---|---|
| true | false | 有效会话,可正常发消息 | ✅ 是 |
| true | true | 自动失效,不可发消息 | ❌ 需 include_expired=true |
| false | false | 手动关闭,不可发消息 | ❌ 需 include_inactive=true |
| false | true | 关闭且已失效 | ❌ 两个参数均需 true |
API 默认按时间正序返回(旧→新)。
请求 query:
{
"user_id": "<user_id>",
"page": 1,
"page_size": 50
}
响应(分页):
{
"data": [
{
"id": 9001,
"chat_session_id": 1001,
"character_id": 555, // 用户消息时为 null
"content": "你好",
"message_type": "text",
"is_user": true,
"created_at": "2026-01-01T12:00:00Z"
}
],
"pagination": { "current_page": 1, "total_pages": 3, "total_count": 58, "has_next": true, "has_previous": false },
"last_message_at": "..."
}
返回已删除会话 ID 与消息条数。
请求 query:
{ "user_id": "<user_id>" }
响应 data: DeleteSessionResult:
{
"deleted_session_id": 1001,
"deleted_count": 42
}
备用功能:可导入设备端产生的对话。
请求 body:
{
"user_id": "<user_id>",
"messages": [
{ "role": "user", "content": "你好", "created_at": "(可选)" },
{ "role": "assistant", "content": "你好呀!", "created_at": "(可选)" }
]
}
响应 data: ImportMessagesResult:
{
"imported_count": 2,
"session_id": 1001
}
字段说明:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| user_id | string | 是 | 外部用户标识 |
| messages | array | 是 | 消息数组,最多 200 条 |
| messages[].role | string | 是 | user 或 assistant |
| messages[].content | string | 是 | 消息内容,空内容会被跳过 |
| messages[].created_at | string | 否 | ISO 8601 时间戳,保留原始时序 |
4.5 流式 TTS 语音合成
返回音频流(PCM-16 LE 单声道 或 OGG/Opus 容器)。响应头携带采样率与编码格式。
使用场景:该接口用于角色语音试听;音色通过角色配置(tts_voice_id)指定,内置音色清单见下表。
请求 body(TTSRequest):
{
"text": "要合成的文本",
"voice_id": "(可选,内置音色名或自定义音色 ID,不传用角色配置)"
}
响应:
- 响应头:
X-Sample-Rate(如24000)、X-Audio-Codec(pcm/opus) - 响应体:音频二进制流(
Transfer-Encoding: chunked)
错误响应(error_code):
| 场景 | HTTP 状态码 | error_code |
|---|---|---|
| 角色未启用 TTS | 400 | TTS_NOT_ENABLED |
| TTS 配置错误(缺少端点/密钥) | 400 | TTS_CONFIG_ERROR |
| 角色不存在 | 404 | CHARACTER_NOT_FOUND |
| 令牌无权限 | 403 | — |
语音优先级:请求 voice_id > 角色 settings.tts.voiceId > 默认 af_maple。
内置音色清单(普通话,voice_id 取值):
| voice_id | 中文名 | 性别 | 描述 |
|---|---|---|---|
| Cherry | 芊悦 | 女 | 阳光积极、亲切自然小姐姐 |
| Serena | 苏瑶 | 女 | 温柔小姐姐 |
| Ethan | 晨煦 | 男 | 标准普通话带部分北方口音,阳光温暖活力朝气 |
| Chelsie | 千雪 | 女 | 二次元虚拟女友 |
| Momo | 茉兔 | 女 | 撒娇搞怪,逗你开心 |
| Vivian | 十三 | 女 | 拽拽的、可爱的小暴躁 |
| Moon | 月白 | 男 | 率性帅气 |
| Maia | 四月 | 女 | 知性与温柔的碰撞 |
| Kai | 凯 | 男 | 耳朵的一场SPA |
| Nofish | 不吃鱼 | 男 | 不会翘舌音的设计师 |
| Bella | 萌宝 | 女 | 喝酒不打醉拳的小萝莉 |
| Jennifer | 詹妮弗 | 女 | 品牌级、电影质感般美语女声 |
| Ryan | 甜茶 | 男 | 节奏拉满,戏感炸裂,真实与张力共舞 |
| Katerina | 卡捷琳娜 | 女 | 御姐音色,韵律回味十足 |
| Aiden | 艾登 | 男 | 精通厨艺的美语大男孩 |
| Eldric Sage | 沧明子 | 男 | 沉稳睿智的老者,沧桑如松却心明如镜 |
| Mia | 乖小妹 | 女 | 温顺如春水,乖巧如初雪 |
| Mochi | 沙小弥 | 男 | 聪明伶俐的小大人,童真未泯却早慧如禅 |
| Bellona | 燕铮莺 | 女 | 声音洪亮吐字清晰,金戈铁马入梦来 |
| Vincent | 田叔 | 男 | 独特的沙哑烟嗓,一开口便道尽千军万马 |
| Bunny | 萌小姬 | 女 | "萌属性"爆棚的小萝莉 |
| Neil | 阿闻 | 男 | 最专业的新闻主持人 |
| Elias | 墨讲师 | 女 | 学科严谨与叙事技巧兼具的女讲师 |
| Arthur | 徐大爷 | 男 | 被岁月和旱烟浸泡过的质朴嗓音 |
| Nini | 邻家妹妹 | 女 | 糯米糍一样又软又黏的嗓音 |
| Seren | 小婉 | 女 | 温和舒缓的声线,助你更快入睡 |
| Pip | 顽屁小孩 | 男 | 调皮捣蛋却充满童真 |
| Stella | 少女阿月 | 女 | 甜到发腻的迷糊少女音,"代表月亮消灭你" |
音色清单为当前开放范围,后续可能调整;方言/小语种音色暂不支持。自定义音色 ID 需另行开通。