ChatSDK封装

什么是SDK

SDK就是程序员的⼯具箱,Software Develop Kit的缩写,⼀套帮开发者⽅便开发特定功能的⼯具包。
⽐如:

  • 微信⽀付SDK:你只要接⼊SDK,就能在程序中⽀持微信⽀付,不⽤⾃⼰研究⽀付安全、加密、银⾏对接等。
  • 相机SDK:使⽤⼚商提供的SDK,就能让APP调⽤收集摄像头拍照、录像
    SDK中通常包含:
  • 库⽂件:被⼈已经写好的功能,需要实现什么功能直接调⽤即可。
  • API接⼝:告诉你该怎么和平台打交道。
  • ⽂档:说明书,告诉你怎么⽤
  • ⽰例代码:相当于菜谱,照这些就能跑通
  • 调试⼯具:出错时能帮你查问题
    也就是说:SDK就是⼚商打包好的⼀套"现成⼯具+说明书",让开发者可以更快、更安全、更省⼼地在⾃⼰的软件中实现特定功能。
SDK和API的区别
特性 API SDK
概念 一组规则和定义,用于标准化不同软件件的交互方式 包含 API、库、文档、示例代码等的一个全面的工具包
优势 提供与特定服务或系统交互的接口 提供了完整的开发环境和工具
形式 接口文档,比如:RESTful API 一个可本地下载的完整工具库包
关系 SDK 包含 API API 是 SDK 的一部分
选择 如果需要与某个服务进行交互,但不需要开发完整的应用程序 需要开发一个完整的应用程序,并且需要一些列工具和资源来支持开发过程
API就像是菜谱,告诉你需要什么⻝材和步骤。但需要⾃⼰准备锅、灶台、⼑(相当于你⾃⼰要写底层代码)。
SDK则是⼀个⻝材配送盒+菜谱,⾥⾯不仅有意⾯、酱料(库⽂件)、菜谱(API⽂档),甚⾄可能附赠⼀把锅铲和⼀个⼩锅(开发⼯具和⽰例代码)

ChatSDK代码实现

将模型管理和Session管理结合起来,为⽤⼾提供统⼀的使⽤接⼝

接口设计

RESTful API

由于整个和⼤模型交互都是基于HTTP协议,聊天助⼿将来也是浏览器借助HTTP协议和服务器交互,因此本项⽬接⼝采⽤RESTful API⻛格进⾏设计,它是基于HTTP协议的应⽤接⼝设计规划,提供了⼀种通过标准化操作和资源访问模式进⾏客⼾端和服务器通信的⽅式。
REST是Representational State Transfer 的缩写,翻译过来就是表现层状态转移

  • 资源(Resource)
    RESTful API 中的每⼀个对象、实体或数据都被抽象为⼀个资源。例如,⽤⼾、⽂章等都可以
    作为资源。每个资源都通过⼀个唯⼀的(统⼀资源标识符)标识
  • URI(统⼀资源标识)
    URI是⽤于标识资源的地址。 RESTful API 中,通常使⽤(统⼀资源定位符)作为URL URI 。例如:
    /users/123 表⽰ id 为 123 的⽤⼾资源
    /posts/456 表⽰ id 为 456 的⽂章资源
  • HTTP动作(HTTP Methods)
    RESTful API 依赖于 HTTP 协议的常⻅⽅法来对资源进⾏操作,每个 HTTP ⽅法对应不同的操作:
    GET :获取资源
    POST :创建新的资源
    PUT :更新资源
    DELETE :删除资源
  • ⽆状态
    每个请求都是独⽴的,服务器不会保存客⼾端任何会话状态。客⼾端发来的每⼀个请求,都必须包含服务器处理该请求所需的所有信息。
  • 表现层状态转移(Representational State Transfer)
    资源的表现形式可以是 JSON 、 XML 、HTML等格式,通常RESTful API使⽤ JSON 作为数据交换格式,因为它轻量且易于解析。
    请求URL: POST /api/user/id
字段名称 字段类型 字段说明
requestId string 请求 Id
sessionId string 客户端会话 Id
name string 用户名
email string 邮箱
{  
    "requestId" : "string",  
    "sessionId" : "string",  
    "name": "string",  
    "email": "string"  
}

返回响应: 200 OK

字段名称 字段类型 字段说明
requestId string 请求 Id
errorCode integer 错误码;0 - 成功
errorMsg string 错误信息
result object 响应结果
userId string 用户 Id
{  
    "requestId": "string",  
    "errorCode": 0,  
    "errorMsg": "",  
    "result" : {  
        "userId": "string"  
    } 
}
接⼝设计
  • 获取会话列表
    请求URL: GET /api/sessions
    返回响应: 200 OK
字段名称 字段类型 字段说明
success bool 是否成功
message string 结果描述
data array 响应数据(数组,内部包含以下子字段)
id string 会话 id
model string 模型名称
created_at int64_t 创建时间戳
updated_at int64_t 更新时间戳
message_count int 对话次数
first_user_message string 第一条正文消息
{ 
	"success" : "bool", 
	"message" : "string", 
	"data": "array"[ 
		{ 
			"id" : "string", 
			"model" : "string", 
			"created_at" : "int64_t", 
			"updated_at" : "int64_t", 
			"message_count" : "int", 
			"first_user_message" : "string" 
		} 
	] 
}
  • 获取可⽤模型
    请求URL: GET /api/models
    返回响应: 200 OK
字段名称 字段类型 字段说明
success bool 是否成功
message string 结果描述
data array 响应数据(数组,内部包含子字段)
name string 模型名称
desc string 模型描述
{ 
	"success" : "bool", 
	"message" : "string", 
	"data": "array"[ 
		{ 
			"name" : "string", 
			"desc" : "string" 
		} 
	] 
}
  • 创建新会话
    请求URL: POST /api/session
    请求参数:
字段名称 字段类型 字段说明
model string 模型名称
{ 
	"model" : "string" 
}

返回响应: 200 OK

字段名称 字段类型 字段说明
success bool 是否成功
message string 结果描述
data object 响应数据
session_id string 会话 id
model string 模型名称
{ 
	"success": true, 
	"message": "操作成功", 
	"data": { 
		"session_id": "string", 
		"model": "string" 
	} 
}
  • 获取历史消息
    请求URL: GET /api/session/${session_id}/history
    返回响应: 200 OK
字段名 类型 说明 示例
success bool 是否成功 bool
message string 结果描述 string
data array 响应数据 array
id string 消息 id string
role string 消息类型 string
content string 消息正文 string
timestamp int64_t 消息时间戳 (秒级) 0
{ 
	"success": "bool", 
	"message": "string", 
	"data": "array"[ 
		{ 
			"id": "string", 
			"role": "string", 
			"content": "string", 
			"timestamp": 0 
		} 
	] 
}
  • 发送消息-全量返回
    请求URL: POST /api/message
    请求参数:
字段名称 字段类型 字段说明
session_id string 会话 id
message string 消息内容
{ 
	"session_id": "string", 
	"message": "string" 
}

返回响应: 200 OK

字段名称 字段类型 字段说明
success bool 是否成功
message string 结果描述
data object 响应数据
session_id string 会话 id
response string 模型返回
{ 
	"success": "bool", 
	"message": "string", 
	"data": { 
		"session_id": "string", 
		"response": "string" 
	} 
}
  • 发送消息-流式响应
    请求URL: POST /api/message/async
    请求参数:
字段名称 字段类型 字段说明
session_id string 会话 id
message string 消息内容
{ 
	"session_id": "string", 
	"message": "string" 
}

返回响应: 200 OK
流式响应,格式如下

data: 正⽂  
data: 正⽂  
data: 正⽂  
data: [DONE]

删除会话
请求URL:DELETE /api/session/${session_id}
返回响应: 200 OK

字段名称 字段类型 字段说明
success bool 是否成功
message string 结果描述
{ 
	"success": "bool", 
	"message": "string" 
}

ChatSDK.h
![[Pasted image 20260417210929.png]]
![[Pasted image 20260417204749.png]]
![[Pasted image 20260417205637.png]]

common.h
![[Pasted image 20260417203628.png]]

![[Pasted image 20260417202520.png]]

DeepSeekProvider.cpp
![[Pasted image 20260417202649.png]]

GeminiProvider.cpp
![[Pasted image 20260417202800.png]]

ChatGPTProvider.cpp
![[Pasted image 20260417202843.png]]

ChatSDK.cpp
![[Pasted image 20260417205311.png]]
![[Pasted image 20260417202203.png]]
![[Pasted image 20260417205433.png]]
![[Pasted image 20260417205233.png]]
![[Pasted image 20260417205018.png]]
![[Pasted image 20260417205139.png]]
![[Pasted image 20260417205833.png]]
![[Pasted image 20260417205957.png]]
![[Pasted image 20260417210448.png]]
![[Pasted image 20260417210727.png]]
![[Pasted image 20260417210806.png]]

ChatSDK测试

chatSDK.h
![[Pasted image 20260420184935.png]]

testLLM.cpp
![[Pasted image 20260420184430.png]]
![[Pasted image 20260420184744.png]]
![[Pasted image 20260420185019.png]]

CMakeLists.txt
![[Pasted image 20260420185137.png]]

![[Pasted image 20260420185558.png]]

ChatSDK.cpp
![[Pasted image 20260420185621.png]]

![[Pasted image 20260420185643.png]]

![[Pasted image 20260420185744.png]]

编译静态库

在sdk⽬录下创建CMakeLists.txt⽂件
![[Pasted image 20260420194747.png]]
![[Pasted image 20260420193927.png]]

![[Pasted image 20260420194109.png]]

![[Pasted image 20260420195057.png]]

![[Pasted image 20260420195129.png]]

ChatServer

初始化

ChatServer.h
![[Pasted image 20260420202128.png]]
![[Pasted image 20260420203733.png]]

ChatServer.cpp
![[Pasted image 20260420203635.png]]
![[Pasted image 20260420203830.png]]

ChatServer.h
![[Pasted image 20260420204901.png]]

ChatServer.cpp
![[Pasted image 20260421200518.png]]
![[Pasted image 20260420205020.png]]
![[Pasted image 20260420205044.png]]

接口实现

ChatServer.h
![[Pasted image 20260421190912.png]]

ChatServer.cpp
![[Pasted image 20260421190939.png]]

![[Pasted image 20260421191032.png]]
![[Pasted image 20260421185549.png]]

![[Pasted image 20260421191404.png]]
![[Pasted image 20260421190405.png]]

![[Pasted image 20260421190615.png]]

![[Pasted image 20260421191127.png]]

![[Pasted image 20260421191501.png]]
![[Pasted image 20260421191614.png]]

![[Pasted image 20260421192647.png]]
![[Pasted image 20260421192811.png]]

![[Pasted image 20260421195219.png]]
![[Pasted image 20260421195342.png]]

设置路由规则

ChatServer.h
![[Pasted image 20260421195438.png]]

ChatServer.cpp
![[Pasted image 20260421195838.png]]

main方法

![[Pasted image 20260421202037.png]]

1
![[Pasted image 20260421202118.png]]

main.cpp
![[Pasted image 20260421203821.png]]
![[Pasted image 20260421204026.png]]
![[Pasted image 20260421204056.png]]
![[Pasted image 20260421204139.png]]
![[Pasted image 20260421204207.png]]
![[Pasted image 20260421204232.png]]
![[Pasted image 20260421204403.png]]
![[Pasted image 20260421204733.png]]

2
![[Pasted image 20260421204915.png]]

![[Pasted image 20260421205034.png]]

![[Pasted image 20260421205057.png]]

![[Pasted image 20260421205120.png]]

![[Pasted image 20260421205457.png]]

3
![[Pasted image 20260421205625.png]]

![[Pasted image 20260421205728.png]]

![[Pasted image 20260421205753.png]]

![[Pasted image 20260421205829.png]]

![[Pasted image 20260421205900.png]]

4
![[Pasted image 20260421210118.png]]

![[Pasted image 20260421210252.png]]

ChatServer构建

![[Pasted image 20260422182916.png]]

CMakeLists.txt
![[Pasted image 20260422183514.png]]

  • 报错1
    ![[Pasted image 20260422183718.png]]

  • 报错2
    ![[Pasted image 20260422184042.png]]

![[Pasted image 20260422184114.png]]

  • 报错3
    ![[Pasted image 20260422184252.png]]

![[Pasted image 20260422184335.png]]

修改ChatServer.conf
![[Pasted image 20260422184505.png]]

拷贝配置文件到当前目录
![[Pasted image 20260422184551.png]]

  • 报错4
    ChatServer.cpp
    添加初始化日志
    ![[Pasted image 20260422184720.png]]

![[Pasted image 20260422184824.png]]

gdb调试,在48行下断点
![[Pasted image 20260422184938.png]]

![[Pasted image 20260422185045.png]]

chat_sdk没有实例化
ChatServer.cpp
![[Pasted image 20260422185127.png]]

  • 报错5
    服务器对象没有创建
    ![[Pasted image 20260422185234.png]]

ChatServer.cpp
![[Pasted image 20260422185415.png]]

  • 报错6
    ![[Pasted image 20260422185509.png]]

ChatServer.cpp65行下断点
![[Pasted image 20260422185643.png]]

删除指定模型抛异常
![[Pasted image 20260422185745.png]]

![[Pasted image 20260422185927.png]]

之前的路径参数session_id真实在发送请求时,/api/session/session_时间戳_00000001
此处的正则格式不对,因此在程序运行,进行正则匹配时报异常
(.*)匹配一个或多个字符

接口测试

![[Pasted image 20260422190403.png]]

![[Pasted image 20260422190427.png]]

  • 获取可用模型
    ![[Pasted image 20260422190514.png]]

  • 创建新会话
    ![[Pasted image 20260422190620.png]]

![[Pasted image 20260422190706.png]]

![[Pasted image 20260422190651.png]]

  • 获取会话列表
    ![[Pasted image 20260422190743.png]]

  • 删除会话
    ![[Pasted image 20260422190826.png]]

再获取会话列表
![[Pasted image 20260422190850.png]]

  • 全量返回
    ![[Pasted image 20260422191106.png]]
    ![[Pasted image 20260422191222.png]]

  • 获取会话历史消息
    ![[Pasted image 20260422191252.png]]

报错
![[Pasted image 20260422191331.png]]

DataManager.cpp
![[Pasted image 20260422191606.png]]

之前写错了,SQL语句执行完成之后,如果成功,会返回SQLITE_DONE
![[Pasted image 20260422191935.png]]

![[Pasted image 20260422192035.png]]

  • 流式响应
    ![[Pasted image 20260422192203.png]]

ChatServer.cpp
![[Pasted image 20260422192340.png]]

如果为true,流式响应会立刻关闭
![[Pasted image 20260422193621.png]]

消息一次性显现,不是一点点显现
ChatServer.cpp
![[Pasted image 20260422193735.png]]

表示内容以流式方式传输
![[Pasted image 20260422193829.png]]

  • GPT
    ![[Pasted image 20260422194008.png]]

![[Pasted image 20260422194033.png]]

  • Gemini
    ![[Pasted image 20260422194118.png]]

  • Ollama
    ![[Pasted image 20260422194334.png]]

一直回复空
![[Pasted image 20260422194347.png]]

没找到模型
![[Pasted image 20260422194406.png]]

模型名字没有输入正确
![[Pasted image 20260422194446.png]]

前端生成

提示词

假设你是⼀个具有⼗年前端开发经验的资深⼯程师,请帮我按照如下要求实现⼀个前端⻚⾯。
我实现了⼀个智能聊天助⼿的服务器,服务器地址是192.168.100.238,端⼝是8080。
服务端代码以及所有接⼝均进⾏了严格的测试,没有问题。
服务器提供以下功能:

  1. 获取所有会话列表
  2. 获取可⽤模型
  3. 创建新会话
  4. 获取会话历史消息
  5. 发送消息 - 流式响应
  6. 删除会话
    接⼝的请求和响应参数以json格式组织,接⼝具体定义如下:
  7. 获取会话列表
    请求URL:GET /api/sessions
    返回响应:200 OK

结合以上内容帮我⽣成⼀个前端⻚⾯,类似于deepseek的⽹⻚聊天助⼿,⻚⾯要求如下:

  1. 前端⻚⾯的html、JavaScript、css等代码分开存放
  2. ⻚⾯左上⻆有⼀个AIChat图标,图标之后跟 “AI聊天助⼿” 的⽂本,⽂本之后紧跟⼀个按钮,按钮上⽂本为"新建对话",点击按钮之后,会创建新会话。
  3. ⻚⾯左侧栏为历史会话列表,每条会话信息展⽰:会话更改时间、会话第⼀条消息、模型名称、以及删除会话按钮,按钮⽂本为"…",点击删除按钮会删除该会话,同步删除服务器上session_id的会话
  4. ⽹⻚右侧默认为⼀个图标,图标下是⼀段⽂本,“选择⼀个历史对话继续,或创建新的对话,开启您的AI之旅”,⽂本下是⼀个按钮,按钮⽂本是"新建对话", 点击按钮会创建新会话
  5. 点击新建对话按钮,要弹出⼀个⽆边框窗⼝,窗⼝内部以⽹格⽅式展⽰所⽀持的模型,⽀持所有模型在会话中以单选按钮展⽰且包含模型描述,⽤⼾需要选择本次会话的模型,选择好之后点击确定按钮,本次会话就创建完成,模型选择窗⼝关闭;点击取消按钮则不创建会话,模型选择窗⼝也⾃动关闭。注意:每次只能选择⼀个模型
  6. 会话创建成功之后,主⻚⾯85%⾼度为聊天消息显⽰区域,消息展⽰区域左侧展⽰模型消息,右侧展⽰⽤⼾消息,每条消息下⽅紧跟消息收发时间
  7. 消息显⽰区域下⽅为⽤⼾输⼊问题的编辑框,在未输⼊⽂本时,框内提⽰"请输⼊您的消息…(Enter发送,Shift+Enter换⾏)",⽤⼾输⼊⽂本后提⽰消失,消息编辑框右侧为发送按钮,按钮下显⽰⽤⼾消息⽂本总字数/输⼊⽂本最⼤限制(最⼤限制2000字)
  8. 从服务器获取到index.html之后,客⼾端需⾃动到服务器获取会话列表,将会话列表信息显⽰在⻚⾯左侧
  9. 点击⻚⾯左上⻆和右侧偏下位置"新建对话"按钮时,需要到服务器获取⽀持的模型列表,⽤⼾选择模型并点击确定按钮之后,创建新会话,将该会话加⼊⻚⾯左侧,开始新⼀轮会话
  10. 对于流式消息,服务器返回的是标准SSE格式,⽐如:
    data: ⽂本数据\n\n
    data: ⽂本数据\n\n
    data: [DONE]
    对服务器返回的流式数据以markdown格式解析,代码放到代码块中语法⾼亮显⽰,代码⽀持⼀键复制注意:服务器返回的流式数据可能会较多,避免数据过⻓⽽导致界⾯变形或者乱码
  11. 要求整个⻚⾯协调美观,颜⾊搭配舒适
生成

![[Pasted image 20260422195850.png]]

![[Pasted image 20260422200258.png]]

![[Pasted image 20260422200342.png]]

![[Pasted image 20260422200425.png]]

  • 修改1
    ![[Pasted image 20260422200707.png]]

![[Pasted image 20260422200842.png]]

![[Pasted image 20260422201052.png]]

  • 修改2
    ![[Pasted image 20260422201149.png]]

流式响应有问题
![[Pasted image 20260422201420.png]]

![[Pasted image 20260422201539.png]]

![[Pasted image 20260422201557.png]]

有非法日期

  • 修改3
    ![[Pasted image 20260422201704.png]]

![[Pasted image 20260422202833.png]]

未知时间
![[Pasted image 20260422203215.png]]

![[Pasted image 20260422203644.png]]

在SessionManager.cpp中设置消息时间戳
![[Pasted image 20260422203537.png]]

  • 修改4
    还是未知时间
    ![[Pasted image 20260422203850.png]]

SessionManager.cpp
![[Pasted image 20260422204512.png]]

修改了SDK,应该编译SDK文件,在编译服务器
![[Pasted image 20260422204827.png]]

选择全部接受,trae对代码的修改会保留下来
全部拒绝,模型对代码的修改会全部丢弃
![[Pasted image 20260422205309.png]]

![[Pasted image 20260422205233.png]]

Markdown格式解析

![[Pasted image 20260423092435.png]]

![[Pasted image 20260423092525.png]]

![[Pasted image 20260423092702.png]]

![[Pasted image 20260423093013.png]]

  • 修改1
    页面无法滑动
    ![[Pasted image 20260423093233.png]]

  • 修改2
    消息发送失败
    ![[Pasted image 20260423093959.png]]

  • 修改3
    代码不支持一键复制和语法高亮,还有配色方案需要修改
    ![[Pasted image 20260423094648.png]]

  • 修改4
    端口连接异常
    ![[Pasted image 20260423095947.png]]

![[Pasted image 20260423100208.png]]

  • 修改5
    unicode转化以及界面变形问题
    ![[Pasted image 20260423100407.png]]

![[Pasted image 20260423100630.png]]

  • 修改6
    把滚动条去掉,代码块无法复制
    ![[Pasted image 20260423100753.png]]

  • 修改7
    代码块一键复制问题
    ![[Pasted image 20260423101104.png]]

![[Pasted image 20260423101502.png]]

![[Pasted image 20260423101636.png]]

复制成功

SessionManager线程安全问题

STL当中的容器不是线程安全的
SessionManager.cpp
用锁把对STL当中的操作给包起来
![[Pasted image 20260422205929.png]]

![[Pasted image 20260422205819.png]]

或者使用lock_guard
![[Pasted image 20260422210129.png]]

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐