Appearance
Ollama Node
ollama-node 是一个 Node.js 后端项目,主要负责 AI 对话服务接入、模型分发、用户鉴权、文件处理和后台业务接口输出。
项目定位
- 面向 AI 对话产品的后端服务
- 承载模型调用、接口聚合和业务数据管理
- 作为前端聊天项目和后台系统的服务支撑层
核心能力
- 模型能力:支持本地 Ollama、OpenAI 兼容协议、Gemini 等模型接入与分发
- 对话能力:提供聊天、会话、模型、RAG 相关接口
- 用户能力:提供登录、注册、权限、角色和菜单等后台常见接口
- 文件能力:支持文件记录、对象存储和图片处理相关能力
技术栈
- Node.js
- Express
- MongoDB
- Mongoose
- JWT
- Axios
适合承载的场景
- AI 对话后端
- 多模型统一接入层
- 带权限体系的业务 API 服务
- 聊天前端配套服务端项目
技术亮点
1. 大模型分发层做了清晰解耦
- 模型能力不是写死在接口里,而是拆成“注册表 + 解析器 + 分发器 + handler”
- 新增模型时,通常只需要补模型注册信息和对应 handler
- 文本模型、图像模型、视频模型走的是统一入口,但内部执行链路彼此独立
2. 同时兼容多种模型协议
- 本地 Ollama 走本地服务协议
- OpenAI、DeepSeek、部分 Gemini 能力走 OpenAI 兼容协议
- Gemini 原生思考链和图像能力又单独走原生协议处理
- 这意味着后端不是简单代理,而是做了一层真正的协议适配
3. 图文上下文做了模型感知处理
- 不是所有模型都直接接收同一份消息结构
- 服务端会先判断当前模型是否支持 vision
- 对支持视觉的模型,再把 Markdown 图片转换成不同协议需要的结构
- 对不支持视觉的模型,会在入口阶段直接拦掉图片上下文,避免无效请求
4. SSE 输出做了统一事件协议
- 服务端没有把不同模型的流直接原样透传给前端
- 而是统一整理成
content、reasoning、progress、image、loading、error、done等事件 - 这样前端只需要认这一套协议,就能兼容多模型流式输出
5. 对话、会话、权限是完整串起来的
- 聊天请求会先校验当前会话是否属于当前用户
- 会话和消息分别落表,便于历史记录和后续扩展
- 菜单、角色、管理员初始化也做了单独接口,具备中后台系统基础能力
6. 图片结果做了对象存储归一化
- 模型返回的图片结果不会长期以内联 base64 方式保留
- 服务端会把结果上传到对象存储,再回写成可访问地址
- 这样更适合历史消息存储和前端渲染
技术难点
1. 模型协议差异非常大
- 同样是“聊天接口”,不同模型返回的数据结构、流式格式、图像输入方式都不同
- 后端现在已经做了统一收口,但这块仍然是维护成本最高的区域之一
2. 图文上下文需要按模型动态转换
- OpenAI 兼容协议和 Gemini 原生协议对图片输入格式完全不同
- 有的模型吃
image_url - 有的模型需要把远程图片先下载,再转成 base64 再发送
- 这部分不是普通 CRUD 代码,技术含量比较高
3. 流式输出不只是“把文本吐出去”
- 不同模型的流式事件边界并不统一
- 有的返回文本增量
- 有的返回思考链
- 有的还带图片和进度事件
- 要统一成前端能稳定消费的 SSE 协议,服务端做了额外的解析和重组
4. 鉴权和权限只是基础版完整,不是最终形态
- 当前 JWT、角色、菜单、管理员初始化这条链路已经可用
- 但如果继续往更复杂的企业权限体系演进,还会涉及按钮级权限、资源级权限和更细粒度的 RBAC/ABAC
项目特点
- 多模型统一接入与分发
- OpenAI 兼容协议与本地 Ollama 并行支持
- 图文上下文按模型能力动态转换
- SSE 统一事件协议
- 会话、消息、权限、菜单一体化后端能力
扩展方向
- 短信验证码登录
- 模型注册表扩展
- 图片生成与图片处理链路
- RAG 相关接口接入