一个基于多模态向量模型及视觉多模态模型构建的图片搜索引擎&管理系统,实现精准的以文搜文,文搜图、以图搜图多种智能检索方式。An image search engine management system built upon multimodal vector models and visual multimodal models, implementing multiple intelligent search methods including precise text-to-text, text-to-image, and image-to-image retrieval.
TypeScript
105
189 commits
updated Oct 7, 2026
SmartImager 是一个现代化的智能图片搜索与管理系统,采用 Next.js 全栈 + 独立推理服务 架构:业务层(前端页面、REST API、本地 SQLite)运行在 Next.js 中,向量编码、向量检索与图像分析由独立的 Python 推理服务承担。系统集成向量语义检索、以图搜图、模糊检索与对话式 AI 推荐,默认内置多模态/文本统一向量模型为 Jina Embeddings v4(替代原 Jina CLIP V2),提供更高质量的语义表示。

SmartImager 按一体化部署设计:业务层与 AI 计算默认跑在同一台机器,本地 SQLite 直接读写,开箱即用。
整套系统分四层。展示层是前端 7 页面(首页 / 图片库 / 上传 / 搜索 / 标签 / 设置 / 404)。业务层是 Next.js 全栈,/api/v1/* 即后端接口,配本地 SQLite 存图片元数据、会话与标签。AI 推理层是 Python 推理服务(:8100),持有 jina-embeddings-v4 编码模型、sqlite-vec 向量库与 glm 视觉模型,提供编码、向量检索与图像分析能力。
在一体机部署下,业务层与 AI 推理层同机运行,业务层通过进程内调用直连推理层。当需要 GPU、大内存等专用算力时,架构原生支持把整个 AI 推理层卸载到第二台机器(通过 HTTP :8100 通信),业务层无需改动代码,只需修改推理服务地址即可。
基于对话的多轮图片智能检索与推荐:
conversation_id 绑定会话历史,消息按时间正序存取rewrite_start / assistant_delta / complete / errorconversation_id 绑定上下文主要接口:
| 功能 | 方法 | 路径 |
|---|---|---|
| 创建会话 | POST | /api/v1/ai/conversations/create |
| 列出会话 | GET | /api/v1/ai/conversations |
| 删除会话 | DELETE | /api/v1/ai/conversations/{conversation_id} |
| 获取会话消息 | GET | /api/v1/ai/conversations/{conversation_id}/messages |
| 对话式推荐(一次性) | POST | /api/v1/ai/recommend/chat |
| 对话式推荐(SSE流) | POST | /api/v1/ai/recommend/chat/stream |
请求示例(流式推荐,端口以启动日志为准;Next.js 全栈默认 :9187):
curl -N -X POST http://localhost:9187/api/v1/ai/recommend/chat/stream \
-H "Content-Type: application/json" \
-d '{
"conversation_id": "demo-session-1",
"query": "给我找一些蓝色天空下的城市建筑照片",
"vector_targets": ["title_vector", "desc_vector", "image_vector"],
"limit": 12
}'
SSE 返回关键事件(示例):
event: rewrite_start
data: {"message":"start","conversation_id":"demo-session-1"}
event: assistant_delta
data: {"delta":"正在为你检索相关图片..."}
event: complete
data: {"image_ids":[12,8,5,...],"assistant_text":"已为你找到...","images_brief":[...]}
前端可基于事件类型实时渲染“AI思考中 / 追加回答 / 展示图片结果”等状态,带来顺滑的交互体验。
| 界面总览 | 原版本 |
![]() | ![]() |
| 首页 | 图片库 | 图片详情 |
![]() | ![]() | ![]() |
| 上传图片 | 智能搜索 | 标签管理 |
![]() | ![]() | ![]() |
| 标签筛选 | 系统设置 | |
![]() | ![]() |
conversation_id 绑定会话历史)+ 多路向量召回migrate_embeddings.py,支持自动探测维度 / 新旧维度差异判定 / 原子切换 *_vectors 虚表 / 缓存目录安全替换,并在完成后自动更新主配置的 MODEL_PATH 与 EMBEDDING_DIMENSION。当你需要将当前使用的向量模型(例如从 Jina CLIP V2 升级为 Jina Embeddings v4,或切换到任意其他本地 / HuggingFace 模型)并重新生成图片 / 标题 / 描述三类向量时,可使用根目录脚本:
python migrate_embeddings.py # 使用默认配置
python migrate_embeddings.py --resume # 中断后续传
关键特性:
*_vectors_new(维度变更才建新表,完成后原子切换)model_migrations 表记录进度,可断点续传*_old,便于回滚 / 清理运行前务必:停止推理服务并备份数据库文件(详见 docs/model_migration.md)。
注意:迁移脚本默认读取
backend/config/files/migration.yaml。旧backend/已归档至Smartlmager-suite/archive/backend-fastapi-legacy/,运行前需用--config显式指定配置文件路径,或将所需配置复制到可访问位置。
更多细节、配置字段与回滚策略参见:docs/model_migration.md。
SmartImager 支持一体化部署:业务层(Next.js 全栈)与 AI 推理层(Python 推理服务)既可同机运行,也可把推理层卸载到另一台算力机。下文按「业务层 + 推理层」两部分说明,两者独立启动。
业务层已全部迁至 Next.js,前端页面、REST API、本地 SQLite 都在其中。
# 1. 进入 Next.js 应用目录
cd app
# 2. 安装依赖(注意:本机 NODE_ENV 为 production 时必须显式覆盖,否则 devDependencies 不安装)
NODE_ENV=development npm install
# 3. 启动开发服务器(npm run dev:脚本内置 NODE_ENV 覆盖、端口 9187 与 --webpack,
# Turbopack 在请求编译阶段会无限等待,故固定用 webpack)
npm run dev
启动后访问 http://localhost:9187。
推理服务需另行启动(见方式二),否则上传分析、向量搜索等 AI 功能不可用,页面会给出降级提示。
推理服务持有 jina-embeddings-v4 模型、sqlite-vec 向量库与 glm 视觉模型,通过 HTTP(:8100)向上提供能力。
# 推理服务可运行在本机或远程算力机(如 dgx-spark)
# 环境准备、模型加载、.env 配置、vec0.so 驱动适配、启动命令等
# 详见 docs/推理服务独立-拆分设计.md
推理服务提供以下接口(:8100):
| 功能 | 方法 | 路径 |
|---|---|---|
| 健康检查 | GET | /health |
| 文本/图片编码 | POST | /encode |
| 向量写入 | POST | /vectors/add |
| 向量检索 | POST | /vectors/search |
| 向量统计 | GET | /vectors/stats |
| 图像分析 | POST | /analyze |
curl http://localhost:9187 应返回首页 HTMLcurl http://<推理服务主机>:8100/health 应返回 {"status":"ok","model_loaded":true,...}:9187,通过 npx next dev --port 指定:8100,通过推理服务侧环境变量 INFERENCE_PORT 指定http://<远程主机>:8100,具体目标见 app/src/lib/inference.ts 与 app/.env.env(VECTOR_DB_PATH、VECTOR_DB_DRIVER、MODEL_PATH 等)配置,与 Next.js 解耦两个独立节点,通过 HTTP 通信:
app/)/api/v1/* 即后端接口前端 7 页面:首页、图片库、上传、搜索、标签、设置、404。
/encode、/vectors/*、/analyze 向上提供能力,可单独重启.env 自加载,与业务层解耦SmartImager/
├── app/ # Next.js 全栈(前端 + 业务 API + 本地 SQLite)
│ ├── src/
│ │ ├── app/ # 页面与路由
│ │ │ ├── page.tsx # 首页
│ │ │ ├── images/ # 图片库
│ │ │ ├── upload/ # 上传
│ │ │ ├── search/ # 搜索
│ │ │ ├── tags/ # 标签
│ │ │ ├── settings/ # 设置
│ │ │ ├── not-found.tsx # 404
│ │ │ └── api/v1/ # 业务 API Route Handlers
│ │ │ ├── images/ # 图片 CRUD / 上传 / 导出 / 文件服务
│ │ │ ├── tags/ # 标签
│ │ │ ├── search/ # 相似搜索
│ │ │ ├── system/ # 系统状态 / 配置
│ │ │ └── ai/ # 会话 + 对话式推荐(SSE)
│ │ ├── components/ # UI 组件(layout / ui / ai / GalleryImageCard 等)
│ │ ├── lib/ # db.ts(better-sqlite3)、inference.ts(推理服务客户端)
│ │ └── services/ # api.ts、chatService.ts、searchClient.ts
│ ├── data/ # 本地 SQLite(smartimager.db)与上传图片
│ ├── next.config.js # serverExternalPackages + API 代理 rewrites
│ ├── tailwind.config.cjs # Tailwind 配置(CommonJS,因 package.json 为 ES module)
│ ├── MIGRATION-NOTES.md # 迁移范式与状态记录
│ └── package.json # Next.js 16 + React 19 + TypeScript
├── assets/ # Logo 等静态资源
├── docs/ # 架构图、截图、设计文档
│ ├── 架构图.png / 架构图.dot # 系统架构图(源文件为 Graphviz DOT,dot 渲染导出)
│ ├── screenshots/ # 界面截图
│ └── 推理服务独立-拆分设计.md # 推理服务拆分方案
├── inference_service/ # AI 推理层(jina-embeddings-v4 编码 / sqlite-vec 向量库 / GLM 视觉分析,:8100)
├── assets/ # Logo 等静态资源
├── docs/ # 架构图、截图、设计文档
│ ├── 架构图.png / 架构图.dot # 系统架构图(源文件为 Graphviz DOT,dot 渲染导出)
│ ├── screenshots/ # 界面截图
│ └── 推理服务独立-拆分设计.md # 推理服务拆分方案
└── README.md # 项目说明
旧的
frontend/(React + Ant Design)与backend/(FastAPI)已移出本仓库,归档至同级Smartlmager-suite/archive/,需要时从该处取回。
9187(默认),通过 npx next dev --port 指定8100(默认),通过环境变量 INFERENCE_PORT 指定Next.js 侧(app/.env 或环境变量):
| 变量 | 默认值 | 说明 |
|---|---|---|
INFERENCE_SERVICE_URL | http://192.168.1.170:8100 | 推理服务地址 |
DB_PATH | app/data/smartimager.db | 本地 SQLite 路径 |
推理服务侧(inference_service/.env,自加载):
| 变量 | 说明 |
|---|---|
MODEL_PATH | jina-embeddings-v4 模型快照路径 |
VECTOR_DB_DRIVER | sqlite-vec vec0.so 驱动路径 |
GLM_API_KEY | 智谱 API Key(glm-4.6v-flash 视觉 / glm-4.7-flash 文本) |
OPENAI_API_BASE | 智谱 OpenAI 兼容端点 |
VISION_MODEL / CHAT_MODEL | 视觉 / 文本模型名 |
VECTOR_DB_PATH(向量数据库文件路径)与INFERENCE_PORT在启动命令中以环境变量传入,未写入.env。
通过系统设置页面可以实时监控:
流式端点只发送事件:rewrite_start、assistant_delta(多次)、complete、error;最终图片结果聚合在 complete 中返回。
本项目采用 Apache License 2.0 许可证。
一个基于多模态向量模型及视觉多模态模型构建的图片搜索引擎&管理系统,实现精准的以文搜文,文搜图、以图搜图多种智能检索方式。An image search engine management system built upon multimodal vector models and visual multimodal models, implementing multiple intelligent search methods including precise text-to-text, text-to-image, and image-to-image retrieval.
TypeScript
105
189 commits
updated Oct 7, 2026
SmartImager 是一个现代化的智能图片搜索与管理系统,采用 Next.js 全栈 + 独立推理服务 架构:业务层(前端页面、REST API、本地 SQLite)运行在 Next.js 中,向量编码、向量检索与图像分析由独立的 Python 推理服务承担。系统集成向量语义检索、以图搜图、模糊检索与对话式 AI 推荐,默认内置多模态/文本统一向量模型为 Jina Embeddings v4(替代原 Jina CLIP V2),提供更高质量的语义表示。

SmartImager 按一体化部署设计:业务层与 AI 计算默认跑在同一台机器,本地 SQLite 直接读写,开箱即用。
整套系统分四层。展示层是前端 7 页面(首页 / 图片库 / 上传 / 搜索 / 标签 / 设置 / 404)。业务层是 Next.js 全栈,/api/v1/* 即后端接口,配本地 SQLite 存图片元数据、会话与标签。AI 推理层是 Python 推理服务(:8100),持有 jina-embeddings-v4 编码模型、sqlite-vec 向量库与 glm 视觉模型,提供编码、向量检索与图像分析能力。
在一体机部署下,业务层与 AI 推理层同机运行,业务层通过进程内调用直连推理层。当需要 GPU、大内存等专用算力时,架构原生支持把整个 AI 推理层卸载到第二台机器(通过 HTTP :8100 通信),业务层无需改动代码,只需修改推理服务地址即可。
基于对话的多轮图片智能检索与推荐:
conversation_id 绑定会话历史,消息按时间正序存取rewrite_start / assistant_delta / complete / errorconversation_id 绑定上下文主要接口:
| 功能 | 方法 | 路径 |
|---|---|---|
| 创建会话 | POST | /api/v1/ai/conversations/create |
| 列出会话 | GET | /api/v1/ai/conversations |
| 删除会话 | DELETE | /api/v1/ai/conversations/{conversation_id} |
| 获取会话消息 | GET | /api/v1/ai/conversations/{conversation_id}/messages |
| 对话式推荐(一次性) | POST | /api/v1/ai/recommend/chat |
| 对话式推荐(SSE流) | POST | /api/v1/ai/recommend/chat/stream |
请求示例(流式推荐,端口以启动日志为准;Next.js 全栈默认 :9187):
curl -N -X POST http://localhost:9187/api/v1/ai/recommend/chat/stream \
-H "Content-Type: application/json" \
-d '{
"conversation_id": "demo-session-1",
"query": "给我找一些蓝色天空下的城市建筑照片",
"vector_targets": ["title_vector", "desc_vector", "image_vector"],
"limit": 12
}'
SSE 返回关键事件(示例):
event: rewrite_start
data: {"message":"start","conversation_id":"demo-session-1"}
event: assistant_delta
data: {"delta":"正在为你检索相关图片..."}
event: complete
data: {"image_ids":[12,8,5,...],"assistant_text":"已为你找到...","images_brief":[...]}
前端可基于事件类型实时渲染“AI思考中 / 追加回答 / 展示图片结果”等状态,带来顺滑的交互体验。
| 界面总览 | 原版本 |
![]() | ![]() |
| 首页 | 图片库 | 图片详情 |
![]() | ![]() | ![]() |
| 上传图片 | 智能搜索 | 标签管理 |
![]() | ![]() | ![]() |
| 标签筛选 | 系统设置 | |
![]() | ![]() |
conversation_id 绑定会话历史)+ 多路向量召回migrate_embeddings.py,支持自动探测维度 / 新旧维度差异判定 / 原子切换 *_vectors 虚表 / 缓存目录安全替换,并在完成后自动更新主配置的 MODEL_PATH 与 EMBEDDING_DIMENSION。当你需要将当前使用的向量模型(例如从 Jina CLIP V2 升级为 Jina Embeddings v4,或切换到任意其他本地 / HuggingFace 模型)并重新生成图片 / 标题 / 描述三类向量时,可使用根目录脚本:
python migrate_embeddings.py # 使用默认配置
python migrate_embeddings.py --resume # 中断后续传
关键特性:
*_vectors_new(维度变更才建新表,完成后原子切换)model_migrations 表记录进度,可断点续传*_old,便于回滚 / 清理运行前务必:停止推理服务并备份数据库文件(详见 docs/model_migration.md)。
注意:迁移脚本默认读取
backend/config/files/migration.yaml。旧backend/已归档至Smartlmager-suite/archive/backend-fastapi-legacy/,运行前需用--config显式指定配置文件路径,或将所需配置复制到可访问位置。
更多细节、配置字段与回滚策略参见:docs/model_migration.md。
SmartImager 支持一体化部署:业务层(Next.js 全栈)与 AI 推理层(Python 推理服务)既可同机运行,也可把推理层卸载到另一台算力机。下文按「业务层 + 推理层」两部分说明,两者独立启动。
业务层已全部迁至 Next.js,前端页面、REST API、本地 SQLite 都在其中。
# 1. 进入 Next.js 应用目录
cd app
# 2. 安装依赖(注意:本机 NODE_ENV 为 production 时必须显式覆盖,否则 devDependencies 不安装)
NODE_ENV=development npm install
# 3. 启动开发服务器(npm run dev:脚本内置 NODE_ENV 覆盖、端口 9187 与 --webpack,
# Turbopack 在请求编译阶段会无限等待,故固定用 webpack)
npm run dev
启动后访问 http://localhost:9187。
推理服务需另行启动(见方式二),否则上传分析、向量搜索等 AI 功能不可用,页面会给出降级提示。
推理服务持有 jina-embeddings-v4 模型、sqlite-vec 向量库与 glm 视觉模型,通过 HTTP(:8100)向上提供能力。
# 推理服务可运行在本机或远程算力机(如 dgx-spark)
# 环境准备、模型加载、.env 配置、vec0.so 驱动适配、启动命令等
# 详见 docs/推理服务独立-拆分设计.md
推理服务提供以下接口(:8100):
| 功能 | 方法 | 路径 |
|---|---|---|
| 健康检查 | GET | /health |
| 文本/图片编码 | POST | /encode |
| 向量写入 | POST | /vectors/add |
| 向量检索 | POST | /vectors/search |
| 向量统计 | GET | /vectors/stats |
| 图像分析 | POST | /analyze |
curl http://localhost:9187 应返回首页 HTMLcurl http://<推理服务主机>:8100/health 应返回 {"status":"ok","model_loaded":true,...}:9187,通过 npx next dev --port 指定:8100,通过推理服务侧环境变量 INFERENCE_PORT 指定http://<远程主机>:8100,具体目标见 app/src/lib/inference.ts 与 app/.env.env(VECTOR_DB_PATH、VECTOR_DB_DRIVER、MODEL_PATH 等)配置,与 Next.js 解耦两个独立节点,通过 HTTP 通信:
app/)/api/v1/* 即后端接口前端 7 页面:首页、图片库、上传、搜索、标签、设置、404。
/encode、/vectors/*、/analyze 向上提供能力,可单独重启.env 自加载,与业务层解耦SmartImager/
├── app/ # Next.js 全栈(前端 + 业务 API + 本地 SQLite)
│ ├── src/
│ │ ├── app/ # 页面与路由
│ │ │ ├── page.tsx # 首页
│ │ │ ├── images/ # 图片库
│ │ │ ├── upload/ # 上传
│ │ │ ├── search/ # 搜索
│ │ │ ├── tags/ # 标签
│ │ │ ├── settings/ # 设置
│ │ │ ├── not-found.tsx # 404
│ │ │ └── api/v1/ # 业务 API Route Handlers
│ │ │ ├── images/ # 图片 CRUD / 上传 / 导出 / 文件服务
│ │ │ ├── tags/ # 标签
│ │ │ ├── search/ # 相似搜索
│ │ │ ├── system/ # 系统状态 / 配置
│ │ │ └── ai/ # 会话 + 对话式推荐(SSE)
│ │ ├── components/ # UI 组件(layout / ui / ai / GalleryImageCard 等)
│ │ ├── lib/ # db.ts(better-sqlite3)、inference.ts(推理服务客户端)
│ │ └── services/ # api.ts、chatService.ts、searchClient.ts
│ ├── data/ # 本地 SQLite(smartimager.db)与上传图片
│ ├── next.config.js # serverExternalPackages + API 代理 rewrites
│ ├── tailwind.config.cjs # Tailwind 配置(CommonJS,因 package.json 为 ES module)
│ ├── MIGRATION-NOTES.md # 迁移范式与状态记录
│ └── package.json # Next.js 16 + React 19 + TypeScript
├── assets/ # Logo 等静态资源
├── docs/ # 架构图、截图、设计文档
│ ├── 架构图.png / 架构图.dot # 系统架构图(源文件为 Graphviz DOT,dot 渲染导出)
│ ├── screenshots/ # 界面截图
│ └── 推理服务独立-拆分设计.md # 推理服务拆分方案
├── inference_service/ # AI 推理层(jina-embeddings-v4 编码 / sqlite-vec 向量库 / GLM 视觉分析,:8100)
├── assets/ # Logo 等静态资源
├── docs/ # 架构图、截图、设计文档
│ ├── 架构图.png / 架构图.dot # 系统架构图(源文件为 Graphviz DOT,dot 渲染导出)
│ ├── screenshots/ # 界面截图
│ └── 推理服务独立-拆分设计.md # 推理服务拆分方案
└── README.md # 项目说明
旧的
frontend/(React + Ant Design)与backend/(FastAPI)已移出本仓库,归档至同级Smartlmager-suite/archive/,需要时从该处取回。
9187(默认),通过 npx next dev --port 指定8100(默认),通过环境变量 INFERENCE_PORT 指定Next.js 侧(app/.env 或环境变量):
| 变量 | 默认值 | 说明 |
|---|---|---|
INFERENCE_SERVICE_URL | http://192.168.1.170:8100 | 推理服务地址 |
DB_PATH | app/data/smartimager.db | 本地 SQLite 路径 |
推理服务侧(inference_service/.env,自加载):
| 变量 | 说明 |
|---|---|
MODEL_PATH | jina-embeddings-v4 模型快照路径 |
VECTOR_DB_DRIVER | sqlite-vec vec0.so 驱动路径 |
GLM_API_KEY | 智谱 API Key(glm-4.6v-flash 视觉 / glm-4.7-flash 文本) |
OPENAI_API_BASE | 智谱 OpenAI 兼容端点 |
VISION_MODEL / CHAT_MODEL | 视觉 / 文本模型名 |
VECTOR_DB_PATH(向量数据库文件路径)与INFERENCE_PORT在启动命令中以环境变量传入,未写入.env。
通过系统设置页面可以实时监控:
流式端点只发送事件:rewrite_start、assistant_delta(多次)、complete、error;最终图片结果聚合在 complete 中返回。
本项目采用 Apache License 2.0 许可证。