企业级 AI 智能体中台:.NET 10 做后端,Vue 3 做管理后台,知识库、技能、记忆、额度都在界面上配。
An enterprise AI-agent platform on .NET 10 — RAG, skills, memory, multi-tenancy and scheduled tasks, with a Vue admin console.
Note
NetCoreKevin 面向「要在企业内网里落一个 AI 助手 / SaaS 智能体中台」的场景:多租户、登录鉴权、权限点、审计日志、定时任务、模型接入这些地基已经铺好,你只需要接自己的业务数据和业务系统。
把「企业里的 AI 助手」拆开,需要的东西其实就四样:
- 后端:
App/WebApi。.NET 10 + EF Core 10 + MySQL,按 Domain / Application / RepositorieRps / WebApi 四层拆分,API 带 v1、v2 版本。 - AI 能力:
Kevin/kevin.Module。kevin.AI.AgentFramework 基于 Microsoft Agent Framework,kevin.RAG 负责切分、向量化与重排,都在同一个进程里,不用额外起 Python 服务。 - 管理后台:
vue/kevin.web.vue。Vue 3 + Ant Design Vue,租户、用户、角色、智能体、知识库、技能、任务、API Key 全在界面上配。 - 底座:25 个可插拔模块——权限、缓存、消息队列、分布式锁、SignalR、Hangfire、对象存储、短信、邮件、代码生成器。
它不是脚手架 demo:装好依赖、跑完迁移就能登录后台,有菜单、有权限、有定时任务、有审计日志。
- 提示词 / 模型 / 参数:每个智能体单独配置,对话模型与向量模型分开选,温度、上下文裁剪都能调。
- 技能动态加载:技能是
SKILL.md+ 脚本(.py/.ps1/.sh),后台能新建、在线编辑、随时启停,改完不用重新编译。 - 知识库(RAG):上传文档自动切分写入 Qdrant,检索结果过一遍
qwen3-rerank重排再喂给模型。 - 记忆:按「租户 + 智能体 + 用户」三维隔离存在 Qdrant,是否使用记忆挂在智能体开关上。
- 多智能体协同:主智能体可以把子任务派给其他智能体执行。
- 上下文压缩:按配置阈值压缩历史消息,长期使用不会越聊越慢、越聊越贵。
- 联网搜索:接入火山引擎豆包搜索,模型需要新信息时自己去查。
- 全模态:图片理解、语音转写(阿里 ASR)、文生图(生成后自动上传 OSS)。
- 一库多租户:共享库按
TenantId隔离,接口层强制过滤,不用每个租户一套库。 - RBAC 权限:菜单与 API 两个维度,权限点跟角色走;调试期可以用
IsOpenPermission一把关掉。 - 额度与审计:每用户每月 Token 额度由定时任务颁发、请求时扣减;审计日志、慢查询告警、分环境文件日志都内置。
- 对外集成:腾讯云 / 阿里云 / 七牛三种对象存储,腾讯与阿里短信,钉钉消息,RabbitMQ / CAP 消息总线,Consul 服务发现,SignalR 实时推送。
- OpenAI 协议兼容接口:
GET /v1/models、POST /v1/chat/completions(支持 stream)。Cherry Studio、Dify、自研客户端只要配一个sk-开头的 Key 就能接进来;Key 在后台按用户和租户发放,权限校验、工具调用、聊天记录落库与网页端完全一致。 - MCP:
App/WebApiMcp提供 MCP 服务端,配置里也支持把现有 HTTP 接口包装成 MCP 工具,或把外部 MCP 服务接成智能体工具。
- 25 个可插拔模块:每个能力一个 csproj,通过
IModuleInitializer/IModuleConfigTasks自行注册,加能力不用改入口文件。 - 代码生成器:按实体一键生成仓储接口、仓储实现、服务接口、服务实现与控制器。
- 测试:xUnit 单元测试 + 集成测试,共享测试基础设施。
- 容器化:
docker compose up -d --build一键拉起前端 + 后端 + MySQL + Redis + Qdrant;App/WebApi/Dockerfile、vue/kevin.web.vue/Dockerfile也可单独构建镜像。
| 动态管理 | 智能体配置 | 对话交互 |
|---|---|---|
![]() |
![]() |
![]() |
| 多智能体动态配置 | 压缩策略配置 | 对话交互 |
|---|---|---|
![]() |
![]() |
![]() |
| 界面管理 | 在线编辑 | 动态配置 |
|---|---|---|
![]() |
![]() |
![]() |
| 知识库管理 | 文档上传 | 智能问答 |
|---|---|---|
![]() |
![]() |
![]() |
| 技能列表 | 技能配置 | 技能执行 |
|---|---|---|
![]() |
![]() |
![]() |
| 任务列表 | 任务配置 | 执行记录 |
|---|---|---|
![]() |
![]() |
![]() |
| 用户管理 | 角色管理 | 权限管理 | 系统关键日志 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
flowchart LR
subgraph FE["Vue 3 管理后台"]
UI["用户 / 租户 / 权限<br/>智能体 · 知识库 · 技能 · 任务"]
end
subgraph API["App.WebApi(.NET 10)"]
C["Controller v1 / v2<br/>JWT · 权限 · 全局异常"]
A["Application<br/>业务编排"]
D["Domain<br/>实体 / 接口契约"]
R["RepositorieRps<br/>EF Core 仓储"]
end
subgraph AI["AI 能力层(同进程)"]
AG["AgentFramework<br/>对话 · 技能 · 记忆"]
RG["RAG<br/>切分 · 向量化 · 重排"]
SK["Skill 脚本<br/>py · ps1 · sh"]
end
subgraph INFRA["基础设施"]
M[("MySQL")]
RD[("Redis")]
Q[("Qdrant")]
MQ["RabbitMQ / CAP"]
HF["Hangfire"]
CS["Consul"]
end
LLM["模型服务:任意 OpenAI 协议兼容<br/>(OpenAI · 智谱 · DeepSeek · Ollama)<br/>豆包搜索 · 阿里 ASR / Rerank"]
UI <-->|"REST / SignalR"| C
C --> A
A --> D
A --> R
R --> M
A --- AI
AG --> LLM
RG --> Q
A --- RD
A --- MQ
A --- HF
A --- CS
各层通过自己的 ModuleInitializer 暴露注册逻辑,由上层统一调用完成 DI 装配:WebApi 只负责启动与管道,业务契约留在 Domain,实现落在 Application 与 RepositorieRps。
| 路径 | 内容 |
|---|---|
App/ |
业务应用:Domain、Application、RepositorieRps、WebApi、WebApiMcp |
Kevin/ |
框架核心:EF Core(含慢查询拦截器)、Web 基础组件、25 个可插拔模块 |
vue/kevin.web.vue/ |
Vue 3 + Ant Design Vue 管理后台 |
Test/ |
xUnit 单元测试、集成测试、共享测试基础设施 |
Doc/ |
截图与文档资源 |
InitData/ |
logo(svg + png)与省市区镇等初始化数据 |
不想在本机装 .NET SDK、Node、MySQL、Redis?一条命令把 前端 + 后端 + MySQL + Redis + Qdrant 全套拉起来。
| 项 | 要求 |
|---|---|
| Docker | 20.10+,需带 docker compose v2(Docker Desktop 自带) |
| 内存 | 建议 8GB 以上(前端 webpack 构建 + MySQL 比较吃内存) |
| 磁盘 | 约 6GB(.NET SDK 基础镜像比较大) |
git clone https://gitee.com/netkevin-li/NetCoreKevin.git
cd NetCoreKevin
docker compose up -d --build这就是全部步骤。首次执行会构建前后端镜像并拉取依赖,视网络情况 10~30 分钟;之后再启动只需几秒。
镜像已构建过、只想起服务时:
# 启动全部服务
docker compose up -d
# 停止(数据卷保留,不会丢数据)
docker compose down| 服务 | 地址 |
|---|---|
| 管理后台(前端) | http://localhost:8080 |
| API / Swagger | http://localhost:19901/swagger |
| Hangfire 面板 | http://localhost:19901/pchangfire |
| Qdrant 控制台 | http://localhost:16333/dashboard |
| MySQL | 127.0.0.1:13306,库 kevin_app |
| Redis | 127.0.0.1:16379 |
默认账号 admin / 123456,租户 1000。
Note
宿主机端口默认避开了本地开发常用端口(3306 / 6379 / 9901),可以和本机已装的 MySQL、Redis、VS 调试中的后端同时运行。
- 自动建表:
api容器启动时执行 EF Core 迁移(DB_AUTO_MIGRATE=true),自动创建全部业务表并写入种子数据,不用手动Update-Database;后续升级代码也会自动增量迁移。 - 数据持久化:MySQL、Redis、Qdrant 数据与上传文件(
/KevinFlies)、log4net 日志(Log)都落在 named volume 里,docker compose down不会丢。 - 前后端同源:前端容器内 Nginx 直接把
/api、/KevinFlies、/VarApi反代到api:8080(含 SSE / SignalR 所需的长连接配置),所以不存在跨域问题。
所有可调项都在 .env 里,仓库提供了一份示例:
# Windows PowerShell
Copy-Item .env.example .env
# Linux / macOS
cp .env.example .env编辑 .env,常改的几个:
WEB_PORT=8080 # 前端入口
API_PORT=19901 # 后端 / Swagger
MYSQL_PORT=13306
REDIS_PORT=16379
MYSQL_ROOT_PASSWORD=admin123
REDIS_PASSWORD=123456
DB_AUTO_MIGRATE=true # 设为 false 则启动时不自动迁移
TAG=latest # 镜像 tag,便于升级回滚改完重新执行 docker compose up -d 生效。
Warning
MySQL 密码只在数据卷首次初始化时生效。已经启动过再改 MYSQL_ROOT_PASSWORD,容器会用旧密码,需要 docker compose down -v 清空数据重来(会丢库),或进容器手动改账号。
RabbitMQ 是懒加载的,不启动也不影响主流程;需要消息队列时加 --profile mq:
docker compose --profile mq up -d管理台 http://localhost:15672,默认 admin / admin,vhost /app_webapi。
docker compose ps # 查看各服务状态
docker compose logs -f api # 跟踪后端日志
docker compose logs -f web # 跟踪 Nginx 日志
docker compose up -d --build api # 只重建并重启后端
docker compose up -d --build web # 只重建并重启前端
docker compose restart api # 重启后端
docker compose down # 停止全部(保留数据)
docker compose down -v # 停止并删除数据卷(清库,慎用)| 现象 | 处理 |
|---|---|
port is already allocated |
宿主机端口被占用,改 .env 里对应端口后 docker compose up -d |
| 基础镜像拉不动 / 超时 | 配置 Docker 镜像加速,或在 .env 里用 MYSQL_IMAGE / REDIS_IMAGE / QDRANT_IMAGE 指定可用镜像站地址 |
前端 npm install 很慢 |
默认走 npmmirror,可 NPM_REGISTRY=https://registry.npmjs.org 切换 |
api 一直重启 |
docker compose logs api 看原因;多为连不上 MySQL 或迁移失败 |
| 想重新初始化数据库 | docker compose down -v 再 docker compose up -d |
Important
不要给 api 容器设置 ASPNETCORE_ENVIRONMENT=Production:框架的 EnvironmentConfigHelper 只识别 Development / Test / 空值,空值即读取 appsettings.json 作为正式环境配置。
以上是容器化部署。如果要在本机做二次开发、调试后端代码,按下面步骤本地运行。
| 项 | 说明 |
|---|---|
| .NET SDK | 10.0+ |
| Node.js | 16+,只跑管理后台时需要 |
| MySQL | 8.0+,建议 utf8mb4 |
| Redis | 7.0+,缓存、Hangfire、SignalR 都用它 |
| Qdrant | 1.7+,知识库与记忆功能需要 |
| 模型服务 | 任意 OpenAI 协议兼容服务——OpenAI / 智谱 / DeepSeek / 通义等云端 API,或 Ollama 等本地部署,有一个即可 |
git clone https://gitee.com/netkevin-li/NetCoreKevin.git
cd NetCoreKevin
dotnet restoreGitHub 镜像:https://github.com/junkai-li/NetCoreKevin
编辑 App/WebApi/appsettings.json:
{
"ConnectionStrings": {
"dbConnection": "server=127.0.0.1;port=3306;database=kevin_app;user id=root;password=admin123",
"redisConnection": "127.0.0.1:6379,DefaultDatabase=0,password=123456"
}
}同一个文件里还有 Hangfire、Consul、对象存储、模型服务等配置,按需覆盖;appsettings.Development.json 会覆盖同名项。
Visual Studio 的程序包管理控制台,默认项目选 Kevin.EntityFrameworkCore,启动项目选 App.WebApi:
Update-Database或者用 CLI:
dotnet ef database update --project Kevin/Kevin.EntityFrameworkCore --startup-project App/WebApiTip
仓库里已经带了历次迁移记录,全新库直接 Update-Database 即可。只有改了实体才需要先 Add-Migration "你的改动" 再更新。
dotnet run --project App/WebApilaunchSettings.json 里已经指定 ASPNETCORE_ENVIRONMENT=Development 与 http://localhost:9901。
cd vue/kevin.web.vue
npm install
npm run serve开发服务器已把 /VarApi 反向代理到 http://localhost:9901,不需要额外配跨域。
| 服务 | 地址 |
|---|---|
| API | http://localhost:9901 |
| Swagger | http://localhost:9901/swagger |
| Hangfire 面板 | http://localhost:9901/pchangfire |
| 管理后台 | http://localhost:8080 |
Hangfire 面板默认走 Basic Auth,账号密码取 appsettings.json 的 HangfireSetting.userSetting(默认 admin / admin)。
| 用户名 | 密码 | 租户 |
|---|---|---|
| admin | 123456 | 1000 |
Warning
以上都是本地开发默认值。上线前请替换数据库密码、Jwt.Key、Hangfire 账号,以及 AESInfo 的 Key / IV——Key 与 IV 必须是 16/24/32 与 16 字节,且一旦变更,历史密文将无法解密。
docker run -d --name qdrant -p 6333:6333 -v qdrant_storage:/qdrant/storage qdrant/qdrantQdrantClientSetting 默认指向 localhost,本机跑的话不用改。
Tip
用 Docker Compose 一键部署时 Qdrant 已经包含在内,后端通过 QdrantClientSetting__Url=qdrant(只填主机名,端口默认 6334)走 gRPC 直连,不需要本节操作。
向量模型与对话模型在后台「模型管理」里配,也可以直接改 appsettings.json。模型接入走 OpenAI 协议:只要服务商提供 OpenAI 兼容接口,填好地址、模型名和 Key 就能用——OpenAI、智谱、DeepSeek、通义、Kimi、vLLM、Ollama 都在支持范围内。下面以智谱和 Ollama 为例:
云端服务(以智谱为例,注册地址;换成其它 OpenAI 兼容服务的地址和 Key 即可):
{
"OllamaApiSetting": {
"Url": "https://open.bigmodel.cn/api/paas/v4/embeddings",
"DefaultModel": "embedding-3",
"ApiKey": "your-api-key"
}
}Ollama(本地,原生接口不传 ApiKey):
{
"OllamaApiSetting": {
"Url": "http://localhost:11434/api/embeddings",
"DefaultModel": "qwen3:4b"
}
}重排模型走 AliRerankApiSetting(默认 qwen3-rerank),不配也能用,只是检索结果不做二次排序。
- 登录后台,进入模型管理,配置对话模型与向量模型。
- 新建知识库,选择向量模型(维度需与
QdrantClientSetting.MemoryEmbeddingSize一致,默认 2048),上传文档等待向量化完成。 - 新建智能体:选对话模型,绑知识库,按需勾选技能与记忆。
- 新建对话,开始聊。
- 支持 macOS、Windows、Linux 与 Docker 部署,官方下载:https://ollama.com/download
- 硬件建议:4 核以上 CPU、16GB 以上内存、足够的磁盘空间;想跑大模型或微调再上 NVIDIA GPU。
- 拉一个能跑得动的小模型先试:
ollama run qwen3:4b然后在后台把对话模型的地址指向 http://localhost:11434。
Hangfire 存储当前默认使用内存(AddKevinHangfireMemoryStorage),Redis 存储的注册代码已保留,可在 ServiceConfiguration 中切换。
继承 IModuleConfigTasks 实现 ConfigTasks,任务会在启动时自动注册,并且可以直接调用应用服务:
/// <summary>
/// AIKmssTasks 配置任务设置
/// </summary>
public class AIKmssModuleConfigTasks : IModuleConfigTasks
{
/// <summary>
/// 配置任务
/// </summary>
public Task<bool> ConfigTasks(IRecurringJobManager recurringJobManager)
{
recurringJobManager.AddOrUpdate<IAIKmssService>(
recurringJobId: "每5分钟检测是否有AI文档知识库需要处理", // 唯一 ID,后续修改或删除都用它
(s) => s.ProcessKmssVectorData(default),
"0 0/5 0/1 * * ? ",
new RecurringJobOptions
{
TimeZone = TimeZoneInfo.Local, // 指定时区,默认 UTC
}
);
return Task.FromResult(true);
}
}kevin.abp.core/
├── App/ # 业务应用
│ ├── Application/ # 应用服务层
│ ├── Domain/ # 领域层
│ ├── RepositorieRps/ # 仓储实现
│ ├── AppShare/ # 跨层共享 DTO
│ ├── WebApi/ # API 入口
│ └── WebApiMcp/ # MCP 服务端
├── Kevin/ # 框架核心
│ ├── Application/ # 核心服务(含 AI)
│ ├── Domain/ # 核心领域模型
│ ├── Kevin.EntityFrameworkCore/ # EF Core 实现(含慢查询拦截器、迁移)
│ ├── Kevin.Web.Basics/ # Web 基础组件(控制器、全局过滤器)
│ ├── RepositorieRps/ # 核心仓储实现
│ ├── kevin.Share/ # 共享 DTO、枚举、常量
│ └── kevin.Module/ # 可插拔模块(25 个)
│ ├── kevin.AI.AgentFramework/ # 智能体框架
│ ├── Kevin.RAG/ # 检索增强(Qdrant / Ollama / Rerank)
│ ├── Kevin.Authentication.Jwt/ # JWT 认证
│ ├── kevin.Permission/ # RBAC 权限
│ ├── kevin.Cache/ # 缓存
│ ├── Kevin.Hangfire/ # 任务调度
│ ├── Kevin.SignalR/ # 实时通信
│ ├── kevin.Cap/ · kevin.RabbitMQ/ # 消息总线
│ ├── Kevin.SMS/ · Kevin.Email/ · kevin.FileStorage/
│ ├── kevin.DistributedLock/ · Kevin.SnowflakeId/
│ └── ... # ASR、Consul、代码生成器等
├── Test/ # 测试套件
│ ├── Kevin.Web.Test/ # 单元测试(xUnit)
│ ├── Kvin.Integration.Tests/ # 集成测试
│ └── Testing.Shared/ # 共享测试基础设施
├── vue/kevin.web.vue/ # 管理后台(Vue 3 + Ant Design Vue)
├── Doc/ # 文档与截图
└── InitData/ # 初始化数据
| 模块 | 功能 | 状态 |
|---|---|---|
| 用户 / 角色 / 权限 | 用户 CRUD、角色 CRUD、菜单与 API 权限点 | ✅ |
| 多租户 | 一库多租户、租户级数据隔离 | ✅ |
| AI 智能体 | 智能对话、工具调用、多智能体协同、上下文压缩 | ✅ |
| 知识库 | 文档上传、切分向量化、RAG 检索与重排 | ✅ |
| 技能(Skill) | 在线编辑、动态启停、脚本执行、地址白名单校验 | ✅ |
| 记忆 | 租户 + 智能体 + 用户三维隔离 | ✅ |
| 多模态 | 图片理解、语音转写、文生图 | ✅ |
| OpenAI 兼容 | /v1/models、/v1/chat/completions、Key 管理 |
✅ |
| 任务调度 | Hangfire 定时任务与面板 | ✅ |
| Token 额度 | 月度额度颁发、请求扣减 | ✅ |
| 文件存储 | 腾讯云 / 阿里云 / 七牛 | ✅ |
| 消息服务 | 钉钉消息、站内 SignalR 推送 | ✅ |
- 项目 Wiki:快速开始——
.qoder/repowiki/zh/content/下覆盖架构设计、核心模块、开发指南、API 接口、数据库设计、部署运维 - 系统文档:SYSTEM_DOCUMENTATION.md
- 教学专栏:CSDN
- 二次开发教程:基于 NetCoreKevin 新建项目
| 微信 | 交流群 |
|---|---|
![]() |
MIT License,详见 LICENSE。
欢迎提 Issue 和 PR。仓库还在持续迭代,改动会优先进入 master 分支。
版本:v1.1(代码审查治理版) 维护者:NetCoreKevin 开发团队
























