服务端 API 接口文档

LG 开放平台接口文档

更新时间:2026/08/10

LG 开放平台接口文档

注意

本文档为 LG 开放平台 API 接口使用说明,覆盖开放平台提供的全部接口,按功能分组。

每个接口标注:方法、路径、鉴权方式、请求参数、响应结构。

一、服务地址

LG 开放平台服务,接口路径均以服务前缀拼接:

服务基地址用途
LG 开放平台https://lg.jimitu.top角色/会话/消息/渠道/TTS(默认)
注意

完整请求地址 = 服务前缀 + 接口路径,例如:https://lg.jimitu.top/api/open/publishings

二、接口调用一览表

#方法路径说明
1GET/api/open/publishings获取上架列表
2GET/api/open/publishings/{id}获取单个上架详情
3GET/api/open/channels获取硬件渠道列表
4POST/api/open/channels/{id}/bind-device绑定设备到渠道
5DELETE/api/open/channels/{id}/bind-device解绑设备
6GET/api/open/devices/character查询设备绑定的有效角色
7GET/api/open/characters/{id}获取角色实例详情
8PUT/api/open/characters/{id}更新角色实例属性
9DELETE/api/open/characters/{id}删除角色实例
10GET/api/open/sessions获取会话列表
11GET/api/open/sessions/{id}/messages分页获取会话历史消息
12DELETE/api/open/sessions/{id}删除会话及其全部消息
13POST/api/open/sessions/{id}/messages/import批量导入历史消息
14POST/api/open/characters/{id}/tts流式语音合成

合计:14 个在用接口,详见后续章节。

三、统一请求约定

3.1 请求头

所有接口需在请求头中携带以下字段:

Header说明
AuthorizationBearer {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
  }
}

响应解包规则:

3.3 错误处理

所有接口的错误响应遵循统一格式:{ "success": false, "message": "...", "error_code": "..." }

HTTP 状态含义
401API 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 渠道与上架

GET /api/open/publishings 获取上架列表

获取上架列表,含 template_idhardware_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"
}
GET /api/open/channels 获取硬件渠道列表

仅返回已上架渠道。

响应 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

GET /api/open/publishings/{id} 获取单个上架详情

获取单个上架的详细信息。

响应 data

{
  "id": 1,
  "template_id": 10,
  "template_name": "温柔姐姐",
  "publish_name": "温柔姐姐-公开版",
  "interaction_name": "小柔",
  "greeting": "你好呀~",
  "personality": "温柔体贴",
  "background_story": "..."
}

4.2 设备绑定(渠道下绑定外部用户)

POST /api/open/channels/{channel_id}/bind-device 绑定设备到渠道

将硬件设备 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_codeHTTP说明
渠道不存在CHANNEL_NOT_FOUND404指定 channel_id 不存在
渠道非硬件类型CHANNEL_NOT_HARDWARE400渠道类型不是官方/商家硬件
渠道未上架CHANNEL_OFFLINE400渠道状态为下架
令牌无权限CHANNEL_NOT_AUTHORIZED403API Key 未关联该渠道所属上架
设备不存在DEVICE_NOT_FOUND404device_id 在该渠道下不存在
设备 ID 不唯一DEVICE_ID_AMBIGUOUS409渠道内多个同 ID 设备,需补 product_key
角色未绑定DEVICE_CHARACTER_NOT_BOUND409设备在该渠道下没有有效角色绑定
外部用户 ID 重复EXTERNAL_USER_ID_DUPLICATE409同一渠道下已有其他设备绑定该 external_user_id
必填参数缺失400device_id 或 external_user_id 为空
DELETE /api/open/channels/{channel_id}/bind-device 解绑设备

解绑仅清空设备上的外部用户信息,不删除角色绑定或已有聊天记录;但该用户将无法再通过 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_codeHTTP
外部用户 ID 与设备当前绑定不一致EXTERNAL_USER_MISMATCH409
设备未绑定外部用户DEVICE_EXTERNAL_USER_NOT_BOUND409
其余校验同 POST bind-device同左同左
GET /api/open/devices/character 查询设备绑定的有效角色

查询范围仅限当前 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_codeHTTP
缺少设备 IDDEVICE_ID_REQUIRED400
channel_id 格式错误INVALID_CHANNEL_ID400
授权范围内没有有效设备角色绑定DEVICE_CHARACTER_NOT_FOUND404
授权范围内有多个同 ID 设备DEVICE_ID_AMBIGUOUS409

4.3 角色实例 CRUD

GET /api/open/characters/{id} 获取角色实例详情

响应 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 前缀展示。

PUT /api/open/characters/{id} 更新角色实例属性

仅提交变更字段。

请求 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 详情)。

DELETE /api/open/characters/{id} 删除角色实例

响应:{ success: true, message: "Character deleted" }

4.4 会话与消息

GET /api/open/sessions 获取会话列表

合并查询指定用户的 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_idchannel_idpagepage_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_activeis_expired含义默认是否返回
truefalse有效会话,可正常发消息✅ 是
truetrue自动失效,不可发消息❌ 需 include_expired=true
falsefalse手动关闭,不可发消息❌ 需 include_inactive=true
falsetrue关闭且已失效❌ 两个参数均需 true
GET /api/open/sessions/{session_id}/messages 分页获取会话历史消息

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": "..."
}
DELETE /api/open/sessions/{session_id} 删除会话及其全部消息

返回已删除会话 ID 与消息条数。

请求 query:

{ "user_id": "<user_id>" }

响应 data: DeleteSessionResult

{
  "deleted_session_id": 1001,
  "deleted_count": 42
}
POST /api/open/sessions/{session_id}/messages/import 批量导入历史消息

备用功能:可导入设备端产生的对话。

请求 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_idstring外部用户标识
messagesarray消息数组,最多 200 条
messages[].rolestringuserassistant
messages[].contentstring消息内容,空内容会被跳过
messages[].created_atstringISO 8601 时间戳,保留原始时序

4.5 流式 TTS 语音合成

POST /api/open/characters/{id}/tts 流式语音合成

返回音频流(PCM-16 LE 单声道 或 OGG/Opus 容器)。响应头携带采样率与编码格式。

注意

使用场景:该接口用于角色语音试听;音色通过角色配置(tts_voice_id)指定,内置音色清单见下表。

请求 body(TTSRequest):

{
  "text": "要合成的文本",
  "voice_id": "(可选,内置音色名或自定义音色 ID,不传用角色配置)"
}

响应:

  • 响应头:X-Sample-Rate(如 24000)、X-Audio-Codecpcm / opus
  • 响应体:音频二进制流(Transfer-Encoding: chunked

错误响应(error_code):

场景HTTP 状态码error_code
角色未启用 TTS400TTS_NOT_ENABLED
TTS 配置错误(缺少端点/密钥)400TTS_CONFIG_ERROR
角色不存在404CHARACTER_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 需另行开通。