
个人主页艾莉丝努力练剑❄专栏传送门《C语言》《数据结构与算法》《C/C干货分享学习过程记录》《Linux操作系统编程详解》《笔试/面试常见算法从基础到进阶》《Python干货分享》⭐️为天地立心为生民立命为往圣继绝学为万世开太平 艾莉丝的简介文章目录1 ~ ChatSDK 整体介绍1.1 项目概述1.2 支持模型列表1.3 核心能力2 ~ ChatSDK 获取、编译与安装2.1 获取源码2.2 源码目录结构2.3 编译安装流程2.4 安装后系统路径3 ~ SDK 内部类架构与 UML 关系3.1 对外入口类 ChatSDK3.2 核心组件说明3.2.1 LLMManager3.2.2 SessionManager 会话管理器3.2.3 DataManager3.2.4 Session Message3.2.5 LLMProvider抽象基类 / 接口3.2.6 Config 配置体系4 ~ ChatSDK API 使用说明4.1 工程接入4.1.1 头文件引入4.1.2 CMake 链接配置4.2 ChatSDK 公开成员函数4.3 完整可运行示例DeepSeek 流式对话命令行 Demo5 ~ SDK 设计思路总结结尾1 ~ ChatSDK 整体介绍1.1 项目概述ChatSDK 是基于 C 实现的大模型接入静态库编译产物为静态库libai_chat_sdk.a。项目源码仓库https://gitee.com/zhibite-edu/ai-model-acess-tech1.2 支持模型列表云端模型deepseek‑chatgpt‑4o‑minigemini‑2.0‑flash本地 Ollama 模型deepseek‑r1:1.5b1.3 核心能力支持多轮对话同时提供全量消息、流式消息两种消息返回模式会话管理新建会话、获取会话列表、获取会话历史消息、删除会话基于 SQLite 完成会话数据持久化存储2 ~ ChatSDK 获取、编译与安装2.1 获取源码gitclone https://gitee.com/zhibite-edu/ai-model-acess-dev.git2.2 源码目录结构sdk ├── CMakeLists.txt ├── include#头文件目录│ ├── ChatGPTProvider.h │ ├── chat_sdk.h │ ├── common.h │ ├── dataManager.h │ ├── DeepSeekProvider.h │ ├── GeminiProvider.h │ ├── ILLMProvider.h │ ├── LLManager.h │ ├── session_manager.h │ └── util │ └── my_logger.h ├── src#实现源码│ ├── ChatGPTProvider.cpp │ ├── chat_sdk.cpp │ ├── DataManager.cpp │ ├── DeepSeekProvider.cpp │ ├── GeminiProvider.cpp │ ├── LLMManager.cpp │ ├── OllamaDeepSeekProvider.cpp │ ├── session_manager.cpp │ └── util │ └── my_logger.cpp └── build#编译输出目录手动创建2.3 编译安装流程#1. 创建并进入编译目录mkdirbuildcdbuild#2. cmake构建生成静态库libai_chat_sdk.acmake..#3. 系统级安装sudomakeinstall2.4 安装后系统路径静态库/usr/local/lib/libai_chat_sdk.a头文件/usr/local/include/ai_chat_sdk/3 ~ SDK 内部类架构与 UML 关系UML 图例约定实心菱形箭头组合关系箭头指向类为被包含成员箭羽端类持有对方作为成员变量空心三角箭头继承关系子类指向父类虚线箭头依赖关系一个类在方法 / 参数中使用另一个类3.1 对外入口类 ChatSDK使用者仅需操作ChatSDK该类通过组合关系聚合所有内部功能组件屏蔽底层复杂实现。组合成员SessionManager、LLMManager、Config配置对象。3.2 核心组件说明3.2.1 LLMManager负责大模型整体调度管理大模型实例初始化向大模型发送消息获取模型名称、模型描述检测模型可用性内部持有LLMProvider抽象接口对象不直接实现网络请求逻辑。3.2.2 SessionManager 会话管理器内部维护多组Session会话对象每个Session包含多条Message消息。成员变量包含DataManager对象完成会话持久化。核心接口更新会话时间戳获取全部会话 ID 列表删除指定会话清空全部会话获取会话总数量内部自动生成 sessionId、messageId3.2.3 DataManager负责会话、消息数据的 SQLite 持久化存储完成内存会话对象与磁盘数据库读写。3.2.4 Session MessageSession一次聊天会话唯一标识为 sessionId。Message单条消息结构体存储用户 / 助手对话内容LLMProvider依赖 Message将历史消息传递给大模型接口实现多轮上下文。3.2.5 LLMProvider抽象基类 / 接口抽象接口类定义统一大模型调用接口不实现具体业务逻辑。子类实现继承 LLMProviderDeepSeekProviderdeepseek‑chat 云端模型实现ChatGPTProvidergpt‑4o‑mini 云端模型实现GeminiProvidergemini‑2.0‑flash 云端模型实现OllamaDeepSeekProviderOllama 本地模型实现3.2.6 Config 配置体系基类Config两种子类继承自 ConfigApiConfig云端 API 模型配置存储 api_key、temperature、max_tokens、model_name 等参数OllamaConfigOllama 本地模型配置存储本地服务地址、模型名称等参数ChatSDK以组合关系持有 Config 对象。4 ~ ChatSDK API 使用说明4.1 工程接入4.1.1 头文件引入#includeai_chat_sdk/chat_sdk.h4.1.2 CMake 链接配置target_link_libraries(你的项目目标 PRIVATE ai_chat_sdk)4.2 ChatSDK 公开成员函数函数签名功能说明参数说明返回值bool initModels(const std::vectorstd::shared_ptrConfig configs)批量初始化模型configs多个模型配置智能指针集合初始化成功 true失败 falsestd::string createSession(const std::string modelName)为指定模型创建全新会话modelName已初始化的模型名称返回会话 sessionId 字符串std::shared_ptrSession getSession(const std::string sessionId)获取指定会话对象sessionId会话唯一 ID会话智能指针std::vectorstd::string getSessionlist()获取全部会话 ID 列表无所有 sessionId 集合std::vectorModelInfo getAvailableModels()获取所有可用模型信息无模型信息结构体数组bool deleteSession(const std::string sessionId)删除指定会话sessionId待删除会话 ID删除成功 truestd::string sendMessage(const std::string sessionId, const std::string message)非流式发送消息等待模型全部生成完成返回完整结果sessionId 会话 IDmessage 用户输入文本完整助手回复字符串std::string sendMessageStream(const std::string sessionId, const std::string message, std::functionvoid(const std::string,bool) callback)流式消息发送模型分片输出回调逐段接收内容sessionId 会话 IDmessage 输入callback 回调第一个参数分片文本第二个 bool 标记是否流式结束完整助手回复字符串补充相关结构体定义参考头文件sdk/include/common.h4.3 完整可运行示例DeepSeek 流式对话命令行 Demo#includeiostream#includestring#includecstdio#includememory#includeai_chat_sdk/chat_sdk.h#includeai_chat_sdk/util/my_logger.h/** * brief 封装流式消息发送交互函数 * param chatSDK ChatSDK实例引用 * param sessionId 当前会话ID */voidsendMessageStreamDemo(ai_chat_sdk::ChatSDKchatSDK,conststd::stringsessionId){std::cout\n------发送消息------std::endl;std::coutuser消息;std::string message;//读取整行用户输入std::getline(std::cin,message);std::cout------发送消息完成------std::endl;//调用流式消息接口传入回调处理分片输出chatSDK.sendMessageStream(sessionId,message,[](conststd::stringresponse,booldone){std::coutassistant消息:response;if(done){std::cout\n------接收完成------\n;}});}intmain(intargc,char*argv[]){//初始化日志系统输出到stdout日志等级infobite::Logger::init_logger(aiChatServer,stdout,spdlog::level::info);//实例化SDK对象ai_chat_sdk::ChatSDK chatSDK;//构建DeepSeek云端模型配置ai_chat_sdk::ApiConfig deepseekConfig;//从环境变量读取api_key运行前需export deepseek_apikey你的密钥deepseekConfig.api_keystd::getenv(deepseek_apikey);deepseekConfig.temperature0.7;deepseekConfig.max_tokens2048;deepseekConfig.model_namedeepseek-chat;//组装配置集合std::vectorstd::shared_ptrai_chat_sdk::Configconfigs;configs.push_back(std::make_sharedai_chat_sdk::ApiConfig(deepseekConfig));//初始化模型chatSDK.initModels(configs);//创建会话std::cout\n------创建会话--------std::endl;std::string sessionIdchatSDK.createSession(deepseek-chat);std::cout创建会话成功,会话ID:sessionIdstd::endl;intuserOp1;while(true){std::cout\n-------1.send message | 0.exit---------std::endl;std::cinuserOp;if(userOp0){break;}//吸收cin遗留换行符避免getline读取空字符串getchar();sendMessageStreamDemo(chatSDK,sessionId);}return0;}5 ~ SDK 设计思路总结将编译完成的静态库配合头文件、CMake 脚本、使用文档托管至代码仓库降低第三方使用者接入成本。外观模式ChatSDK作为外观入口隔离内部复杂的会话管理、模型适配、持久化逻辑。面向接口编程LLMProvider抽象接口隔离不同大模型的差异新增模型只需要新增子类实现上层调用无需修改。会话与持久化分离业务会话内存对象与 SQLite 磁盘存储解耦。同时支持云端 API 模型、本地 Ollama 模型兼容一次性全量应答、流式分片应答两种交互模式。结尾uu们本文的内容到这里就全部结束了艾莉丝在这里再次感谢您的阅读艾莉丝努力练剑C/C Linux 底层探索者 | 一个正在努力练剑的技术博主【关注】跟随我一起深耕技术领域见证每一次成长。❤️【点赞】让优质内容被更多人看见让知识传递更有力量。⭐【收藏】把核心知识点存好在需要时随时查、随时用。【评论】分享你的经验或疑问评论区一起交流避坑不要忘记给博主“一键四连”哦“今日练剑达成”“技术之路难免有困惑但同行的人会让前进更有方向。”结语希望对学习Linux相关内容的uu有所帮助不要忘记给博主“一键四连”哦往期回顾【AI大模型接入SDK】ChatSDKCMake构建静态库完整实现博主在这里放了一只小狗大家看完了摸摸小狗放松一下吧૮₍ ˶ ˊ ᴥ ˋ˶₎ა