Compare commits

...

316 Commits
0.1.0 ... 0.2.2

Author SHA1 Message Date
zeyu xu
0e754b4732 fix 注释 2024-03-19 22:09:50 +08:00
zeyu xu
48a9fcfabf fix 修改样式,提取KMOption 2024-03-19 21:53:49 +08:00
zyxucp
7ae2b9ac3b Merge pull request #33 from ElderJames/feat/chat-file
support embeding files in chat
2024-03-19 21:32:21 +08:00
zeyu xu
a6bfe3c69b Merge branch 'main' of github.com:AIDotNet/AntSK 2024-03-19 20:40:24 +08:00
zeyu xu
6b146f4750 忽略本地目录 2024-03-19 20:40:19 +08:00
zeyu xu
1387e716d1 忽略tmp-memory-vectors/ 2024-03-19 20:39:31 +08:00
James Yeung
fadc350047 support embeding files in chat 2024-03-19 16:39:27 +08:00
zyxucp
8af4994a7d Merge pull request #32 from ElderJames/feat/DashScope
Add DashScope support for Kernal Memory
2024-03-19 15:54:05 +08:00
zyxucp
b505b61bfe fix 增加ask提示词 2024-03-19 15:36:01 +08:00
James Yeung
5d086c9383 Add DashScope support for Kernal Memory
Support DashScope
2024-03-19 13:35:45 +08:00
zeyu xu
dd0e367dc8 fix 增加默认端口5000 2024-03-19 00:06:36 +08:00
zyxucp
7110eea912 fix 修改注释错误 2024-03-18 17:26:40 +08:00
zyxucp
154e67ef98 fix 判断无插件不走function call 2024-03-18 17:17:03 +08:00
zyxucp
4a04423373 add swagger token 2024-03-18 16:04:55 +08:00
zyxucp
470ea50ebb update readme.en 2024-03-17 23:53:47 +08:00
zyxucp
2a30f3f221 fix 修改post提示词 2024-03-17 20:07:53 +08:00
zyxucp
315f58fdba fix 修改api插件 2024-03-17 20:04:48 +08:00
zyxucp
f027682175 add post的Function call 2024-03-17 17:23:50 +08:00
zyxucp
2618dffcd6 fix 修复知识库ID错误导致搜索不到的问题 2024-03-17 15:56:59 +08:00
zyxucp
ee42d5870b fix 增加清空导入插件功能 2024-03-17 12:05:32 +08:00
zyxucp
27500b1e08 fix 修改错误命名空间和类 2024-03-17 11:45:24 +08:00
zyxucp
4d71a98724 fix 修改Function Call注释获取不到的问题 2024-03-17 11:30:02 +08:00
zyxucp
b8ba0ab391 Merge pull request #30 from wmchuang/feature/km_disk
Feature/km disk
Thank you very much for your contribution
2024-03-16 21:24:08 +08:00
王闯
b589612913 feat: 解决disk模式下重启 向量文件读取不到的问题 2024-03-16 17:45:45 +08:00
王闯
ec4b440469 feat: 调整知识库搜索 没结果时直接返回 2024-03-16 17:16:29 +08:00
zyxucp
adbecb3b25 update 更新docker compose 2024-03-16 00:23:16 +08:00
zyxucp
277aacc34d add 动态添加dll 2024-03-15 23:53:53 +08:00
zyxucp
dba98f7968 add 增加上传dll功能 2024-03-15 22:55:23 +08:00
zyxucp
a2b0f3f3c2 add 插件导入 2024-03-15 22:45:36 +08:00
zyxucp
b5e527afdb add 增加函数列表 2024-03-15 22:33:39 +08:00
zyxucp
e84b05a39b fix 修改普通特性 2024-03-15 22:16:07 +08:00
zyxucp
631c563e71 fix 修改为普通特性,避免上传DLL需要引用特殊特性 2024-03-15 22:15:02 +08:00
zyxucp
47b304e46f update 升级SK到1.6.2 2024-03-15 22:08:22 +08:00
zyxucp
27ccfc5e88 add 增加分享使用 2024-03-15 21:57:21 +08:00
zyxucp
69441167d3 fix 修改高度自适应 2024-03-15 21:50:55 +08:00
zyxucp
4b97594217 fix 调整会话总结 2024-03-15 21:15:28 +08:00
zyxucp
9ee601f88c fix 首页调整 2024-03-15 21:12:31 +08:00
zyxucp
75b1a299e3 add 限制移动端屏幕缩放 2024-03-15 21:07:59 +08:00
zyxucp
2613c463a1 Merge branch 'main' of https://github.com/xuzeyu91/AntSK 2024-03-15 14:45:15 +08:00
zyxucp
78e0350d36 add 首页调整 2024-03-15 14:39:13 +08:00
zyxucp
bc2425fc3f Update README.md 2024-03-15 14:18:15 +08:00
zyxucp
3e861bc72f Update README.md 2024-03-15 13:01:35 +08:00
zyxucp
b41c464753 fix 暂时取消星火的会话拆分 2024-03-14 16:58:19 +08:00
zyxucp
2817275091 fix 暂时取消注册时间函数 2024-03-14 12:57:28 +08:00
zyxucp
e76b0cf326 fix 调整目录结构 2024-03-14 12:24:09 +08:00
zyxucp
cf34103e15 update docker-compose.yml 2024-03-14 12:07:17 +08:00
zyxucp
1588fd7d7a add 增加ErrorBoundary全局异常 2024-03-14 11:32:42 +08:00
zyxucp
4507ccde6c margin 2024-03-14 10:03:40 +08:00
zyxucp
73fffd766f fix 修复LLamaSharp给一个默认下载路径 2024-03-14 10:02:15 +08:00
zyxucp
e529146c5b fix 修改LLamaSharp文件夹给一个默认路径 2024-03-14 09:59:51 +08:00
zyxucp
7050e52009 Merge pull request #28 from ElderJames/main
Fix DI and OpenAI function calling
2024-03-13 22:25:45 +08:00
James Yeung
4f3238c4f6 Fix DI and OpenAI function calling 2024-03-13 22:22:22 +08:00
zyxucp
b7d27c5d50 fix 修复bug 2024-03-13 22:11:35 +08:00
zyxucp
fe94aa0564 fix 修复修改自身重复问题 2024-03-13 20:59:14 +08:00
zyxucp
ae60a9aced Merge branch 'main' of https://github.com/xuzeyu91/AntSK 2024-03-13 12:13:56 +08:00
zyxucp
4f686b0871 fix 修复按钮停止不了的问题 2024-03-13 10:23:52 +08:00
zyxucp
c61840b7e8 Update README.md 2024-03-13 10:17:50 +08:00
zyxucp
9adce95367 fix appsettings.json示例 2024-03-13 10:10:52 +08:00
zyxucp
eef943458e fix 模型选择只能选gguf,修复搜索空指针页面 2024-03-13 10:02:00 +08:00
zyxucp
f5c80689d4 add 增加模型列表 自动下载模型 2024-03-13 00:52:46 +08:00
zyxucp
5eaee3130a add 增加模型下载页面 2024-03-13 00:10:30 +08:00
zyxucp
5846473f28 Merge branch 'main' of https://github.com/xuzeyu91/AntSK 2024-03-12 23:20:02 +08:00
zyxucp
94c019b484 Merge pull request #25 from ElderJames/model-download
support model download and file list
2024-03-12 22:51:15 +08:00
zyxucp
7e1140c022 add 增加下载页面 2024-03-12 22:50:06 +08:00
James Yeung
ea9044719a support model download and file list 2024-03-12 22:41:12 +08:00
zyxucp
8a96095448 add 增加模型下载地址 2024-03-12 21:57:34 +08:00
zyxucp
fcc8f8751b add 修改对外接口授权添加Bearer 2024-03-12 21:34:58 +08:00
zyxucp
af09ae7c3e Update docker-compose.simple.yml 2024-03-12 10:22:39 +08:00
zyxucp
e8e6a36d7b Update docker-compose.yml 2024-03-12 10:22:12 +08:00
zyxucp
4f89d54ef0 add mock类型便于测试 2024-03-12 09:57:12 +08:00
zyxucp
2f9e2fb114 fix 增加导入后清空文件列表 2024-03-12 09:33:55 +08:00
zyxucp
b6098024b8 add 更换markdown组件,实现代码高亮 2024-03-12 01:11:48 +08:00
zyxucp
1700131066 add 增加首页点击跳转 2024-03-12 00:31:17 +08:00
zyxucp
189536471a fix 先隐藏星火的KM选择器 2024-03-12 00:15:04 +08:00
zyxucp
f534e0bcc3 fix 修复多文件不能同时导入的bug 2024-03-12 00:12:41 +08:00
zyxucp
e203a18e92 add 增加原生插件调用示例 2024-03-11 23:42:26 +08:00
zyxucp
575a69bf4d add 增加首页,暂时取消本地函数调用 2024-03-11 23:16:23 +08:00
zyxucp
69fd3a0367 fix 修改命名空间 2024-03-11 21:23:07 +08:00
zyxucp
8f7e70298e fix 修改描述错误 2024-03-11 21:16:23 +08:00
zyxucp
0fa3f5a554 fix 移动文件目录 2024-03-11 19:41:51 +08:00
zyxucp
f420012752 fix 移动文件目录 2024-03-11 19:40:15 +08:00
zyxucp
c1ca916549 fix 增加openai模型示例 2024-03-11 19:38:26 +08:00
zyxucp
dfcf2bdc85 fix 取消非空类型 2024-03-11 19:12:47 +08:00
zyxucp
72e7acfb7d 修改写法 2024-03-11 19:09:41 +08:00
zyxucp
9d06c127dc fix 增加注释 2024-03-11 19:08:52 +08:00
zyxucp
0460b388ab fix 修改kernel 和km 每次build的问题,进行缓存 2024-03-11 19:02:17 +08:00
zyxucp
45b84ae898 fix 修改类名 2024-03-11 18:26:26 +08:00
zyxucp
41b1cb6f2d Merge pull request #24 from ElderJames/feat/sparkdesk-func-cal
Add support for the Function Calling of Spark Desk
2024-03-11 18:16:27 +08:00
James Yeung
159aaab38e Add support for the Function Calling of Spark Desk 2024-03-11 18:10:14 +08:00
zyxucp
dc351238f6 Update README.md 2024-03-11 15:13:23 +08:00
zyxucp
e6491b39c6 Update README.md 2024-03-11 15:11:11 +08:00
zyxucp
91b4ed8940 Update README.md 2024-03-11 14:23:16 +08:00
zyxucp
ab99098afd Update README.md 2024-03-11 13:26:41 +08:00
zyxucp
d14ce2faa0 add 增加系统设置管理权限 2024-03-10 21:26:01 +08:00
zyxucp
ca293691a8 fix 修改GpuLayerCount 默认值为10 2024-03-10 17:48:00 +08:00
zyxucp
cf8955b9b6 add 更新AntDesign KernelMemory nuget包版本 2024-03-10 16:31:16 +08:00
zyxucp
512828fdc9 fix 调整星火key和screct的位置 2024-03-10 10:55:44 +08:00
zyxucp
91299a96e7 Merge pull request #22 from ElderJames/main
Add Spark Desk text ceneration support
2024-03-10 09:21:35 +08:00
James Yeung
4876d9e727 fix build 2024-03-10 01:34:18 +08:00
James Yeung
a856f2a0e3 clean 2024-03-10 01:31:21 +08:00
James Yeung
0e8113e7b0 Add Spark Desk text ceneration support 2024-03-10 00:55:33 +08:00
zyxucp
34a953589d Update docker-compose.simple.yml 2024-03-09 23:55:50 +08:00
zyxucp
504ea5a238 Update docker-compose.yml 2024-03-09 23:55:40 +08:00
zyxucp
3b5997fce6 Merge branch 'main' of https://github.com/xuzeyu91/AntSK 2024-03-09 23:43:30 +08:00
zyxucp
7b0f6c3e75 add 增加消息结束后滚动条滚到底部 2024-03-09 23:40:00 +08:00
zyxucp
099b85619c add 增加消息时间的气泡 2024-03-09 23:12:28 +08:00
zyxucp
0129cd3f39 fix 修改头像样式为固定大小 2024-03-09 23:04:09 +08:00
zyxucp
84f3cbf9a9 add 增加消息复制按钮 2024-03-09 22:55:45 +08:00
zyxucp
a7af462a44 add 增加知识库外部使用流式接口 2024-03-09 22:20:05 +08:00
zyxucp
fdca08eb3d fix 抽象KMS结构 2024-03-09 22:09:31 +08:00
zyxucp
c3eeefe9fe fix 抽象sendkms 2024-03-09 21:40:36 +08:00
zyxucp
2f6990320c fix 封装Chat方法 2024-03-09 21:21:32 +08:00
zyxucp
ef83450425 fix 调整名称 2024-03-09 21:12:22 +08:00
zyxucp
f2f10ec9f4 fix 调整项目结构,抽象发送消息接口 2024-03-09 21:10:50 +08:00
zyxucp
7346ff2e78 add 更新图片 2024-03-09 19:35:38 +08:00
zyxucp
1dc274ce82 fix 执行code clear 2024-03-09 19:19:05 +08:00
zyxucp
2be438f9c3 fix 调整项目结构 2024-03-09 19:12:40 +08:00
zyxucp
1f7f51ff1e fix 优化代码 2024-03-09 18:24:17 +08:00
zyxucp
338a7ae083 Update docker-compose.simple.yml 2024-03-09 17:47:30 +08:00
zyxucp
04d7896a92 Update docker-compose.yml 2024-03-09 17:47:17 +08:00
zyxucp
4b8c8c0f96 fix 修改openai azue 和llama 流式不一致的问题 2024-03-09 17:30:11 +08:00
zyxucp
8296476d94 Update docker-compose.simple.yml 2024-03-09 12:40:04 +08:00
zyxucp
38b3fc26ed Update docker-compose.yml 2024-03-09 12:39:48 +08:00
zyxucp
6852b458fa fix 字典修改 2024-03-09 12:15:32 +08:00
zyxucp
cdb41023d4 Merge branch 'main' of https://github.com/xuzeyu91/AntSK 2024-03-09 12:10:05 +08:00
zyxucp
8e00e681f0 fix 修改StreamingTextContent 2024-03-09 12:09:53 +08:00
zyxucp
577d6dd3a6 add 增加异常日志 2024-03-09 12:02:47 +08:00
zyxucp
eeecd15d9e fix 修改StreamingTextContent 2024-03-09 11:59:36 +08:00
zyxucp
e39b26bcc3 更新 README.md 2024-03-09 00:05:20 +08:00
zyxucp
6b5a77f8c1 Update appsettings.json 2024-03-08 23:38:36 +08:00
zyxucp
0dc9736c35 Update docker-compose.simple.yml 2024-03-08 23:18:15 +08:00
zyxucp
bbe2471815 Update docker-compose.yml 2024-03-08 23:17:49 +08:00
zyxucp
bee2c56382 Merge branch 'main' of https://github.com/xuzeyu91/AntSK 2024-03-08 22:29:55 +08:00
zyxucp
b05a4f51b7 add 增加清理聊天记录 2024-03-08 22:22:18 +08:00
zyxucp
608794b600 add 增加描述 2024-03-08 22:08:11 +08:00
zyxucp
ce8829ae69 add 新增知识库修改 2024-03-08 22:04:52 +08:00
zyxucp
1fb27f8d5a add 增加应用配置校验 2024-03-08 21:54:53 +08:00
zyxucp
caf8777290 add 增加模型管理配置 2024-03-08 21:47:51 +08:00
zyxucp
7dacdab2b5 fix 修改LLamaSharp本地调用 2024-03-08 21:12:42 +08:00
zyxucp
f6a8660144 fix 修改KMS删除 2024-03-08 20:25:25 +08:00
zyxucp
1e51631eba add 增加LLamaSharp本地执行 2024-03-08 19:53:13 +08:00
zyxucp
91048dc9c1 add 增加应用和知识库使用配置模型
fix 删除openai配置文件
2024-03-08 18:46:26 +08:00
zyxucp
9f8dc39e2f add 增加会话的模型和知识库模型配置 2024-03-08 17:06:35 +08:00
zyxucp
07aa8f4829 Update README.md 2024-03-08 16:55:13 +08:00
zyxucp
b504615b6d add 增加模型配置 2024-03-08 15:20:57 +08:00
zyxucp
3b1811a5ff add 增加模型配置 2024-03-08 14:50:46 +08:00
zyxucp
71be6d4a5a Merge branch 'main' of https://github.com/xuzeyu91/AntSK 2024-03-08 10:04:01 +08:00
zyxucp
ae04d20a82 add 增加session 登陆记录 2024-03-08 00:48:41 +08:00
zyxucp
2ad3953d3f add session 2024-03-08 00:28:27 +08:00
zyxucp
c536f1d74b Update README.md 2024-03-07 21:46:06 +08:00
zyxucp
d8c1695ac9 Update README.en.md 2024-03-07 21:26:17 +08:00
zyxucp
b39912d08b Merge branch 'main' of https://github.com/xuzeyu91/AntSK 2024-03-07 18:27:26 +08:00
zyxucp
8f5dd08836 Update README.md 2024-03-07 17:52:59 +08:00
zyxucp
6a27e61321 fix 删除appsetting注释 2024-03-07 17:32:59 +08:00
zyxucp
34fa19cf1e fix 修改docker file 2024-03-07 16:46:14 +08:00
zyxucp
a97cc538f6 fix 修改dockerfile路径 2024-03-07 16:37:19 +08:00
zyxucp
45471c9bf4 add 增加精简版docker-compose 2024-03-07 16:29:33 +08:00
zyxucp
7145192988 Merge branch 'feature_appsetting' 2024-03-07 16:24:51 +08:00
zyxucp
0935becf70 fix 增加注释 2024-03-07 16:21:33 +08:00
zyxucp
a155c906b3 fix 修改为异步请求 2024-03-07 16:04:23 +08:00
zyxucp
fa8e82224a fix 导入问题修复 2024-03-07 13:08:26 +08:00
zyxucp
7088e26e09 add 调整项目结构 2024-03-07 12:39:12 +08:00
zyxucp
f471bdb607 fix 变量错误bug修复 2024-03-07 11:59:07 +08:00
zyxucp
0a0bd67834 fix 1 2024-03-07 11:57:36 +08:00
zyxucp
e91f8331de fix 修改忽略本地目录 2024-03-07 11:52:53 +08:00
zyxucp
2e90a7fe90 fix 修改目录增加src 2024-03-07 11:52:09 +08:00
zyxucp
3fb3c5bad5 fix 调整 2024-03-06 23:53:46 +08:00
zyxucp
a6753ee888 add 增加导入后台队列模式 2024-03-06 23:18:41 +08:00
zyxucp
9b04d3a758 add 增加CPU和GPU的选择 2024-03-06 22:21:10 +08:00
zyxucp
68e2b2ff9b fix 修改默认切片数和保存校验 2024-03-06 21:54:52 +08:00
zyxucp
464baa6125 add 修改仓储多库兼容,和注释 2024-03-06 19:22:23 +08:00
zyxucp
78083a0b68 fix 更新配置文件 2024-03-06 19:14:24 +08:00
zyxucp
681e248bdf del 删除不要的历史文件 2024-03-06 19:12:40 +08:00
zyxucp
1ca9493ce9 忽略本地内存配置 2024-03-06 19:09:38 +08:00
zyxucp
5537a8796f 忽略本地内存配置 2024-03-06 19:09:25 +08:00
zyxucp
e2a1ab80b0 删除本地文件 2024-03-06 19:06:48 +08:00
zyxucp
74db9e425f add 支持不同的业务数据库和向量数据库 2024-03-06 19:05:12 +08:00
zyxucp
3e2152a979 fix httpheader 中文异常 2024-03-06 16:09:05 +08:00
zyxucp
930c6c88ae Merge branch 'main' of https://github.com/xuzeyu91/AntSK 2024-03-06 14:44:46 +08:00
zyxucp
24bc276732 fix 处理mysql api实体长度问题 2024-03-06 14:42:02 +08:00
zyxucp
17cab5c51b Update docker-compose.yml 2024-03-06 14:29:40 +08:00
zyxucp
96dbc8e9e6 增加新增字段默认值 2024-03-06 14:20:50 +08:00
zyxucp
56a0d51794 忽略本地db 2024-03-06 14:19:15 +08:00
zyxucp
1cdbd969ba add 增加init api新增表的初始化 2024-03-06 13:36:41 +08:00
zyxucp
d77ece2aa6 Update docker-compose.yml 2024-03-06 12:55:19 +08:00
zyxucp
d4c804c4ac fix 删除不要注释 2024-03-06 12:32:10 +08:00
zyxucp
c3003f8c3a add 增加注释 2024-03-06 12:24:31 +08:00
zyxucp
66a2e45029 fix 修改知识库提示词结构 2024-03-06 12:23:31 +08:00
zyxucp
b0c889c336 fix 优化知识库提示词 2024-03-06 12:03:33 +08:00
zyxucp
f470b1e555 fix 修改bug 2024-03-06 11:48:21 +08:00
zyxucp
4965983ae1 add 修改知识库为流式输出 2024-03-06 11:25:20 +08:00
zyxucp
2f2b4e2f3c Merge branch 'main' of https://github.com/xuzeyu91/AntSK 2024-03-06 10:14:38 +08:00
zyxucp
16c739e37f fix 增加异常处理 2024-03-06 10:05:34 +08:00
zyxucp
f4d51a73cd fix 描述修改 2024-03-06 10:03:40 +08:00
zyxucp
6cc29e4167 fix 处理提示词不包含input的情况 2024-03-05 20:46:20 +08:00
zyxucp
324e1de84f Update README.md 2024-03-05 18:31:11 +08:00
zyxucp
551bdf4802 add 增加知识库切片配置 2024-03-05 14:33:00 +08:00
zyxucp
761d9069f6 add 增加切片设置 2024-03-05 13:41:26 +08:00
zyxucp
7a15b0f444 fix 增加key注释 2024-03-05 09:46:47 +08:00
zyxucp
a185ee4841 add 增加文本格式导入 2024-03-04 22:30:51 +08:00
zyxucp
7213a75212 fix 修改样式 2024-03-04 22:12:03 +08:00
zyxucp
4823977098 add 增加模型下载页 2024-03-04 22:01:37 +08:00
zyxucp
fa74b84ce3 Merge branch 'main' of https://github.com/xuzeyu91/AntSK 2024-03-04 21:44:36 +08:00
zyxucp
7423b23d3c fix 修改总结判定 2024-03-04 21:38:22 +08:00
zyxucp
033ded08c7 fix 修改总结判定条件 2024-03-04 21:36:46 +08:00
zyxucp
6b397c86d2 fix 修改总结判定条件 2024-03-04 21:34:51 +08:00
zyxucp
9730f12c56 Update README.md 2024-03-04 21:10:46 +08:00
zyxucp
92c7a80c2e add 增加docker-compose 2024-03-04 20:46:42 +08:00
zyxucp
64029de11a fix 修改docker file 2024-03-04 17:41:31 +08:00
zyxucp
ae363ebad6 Merge branch 'main' of https://github.com/xuzeyu91/AntSK 2024-03-04 09:58:21 +08:00
zyxucp
7b6478b7f5 fix 修改模型名 2024-03-04 09:57:41 +08:00
zyxucp
aef7f58c6d Merge pull request #12 from xuzeyu91/xuzeyu91-patch-2
Update README.en.md
2024-03-04 00:12:45 +08:00
zyxucp
52450efeb3 Update README.en.md 2024-03-04 00:12:31 +08:00
zyxucp
74d218d2d5 Merge pull request #11 from xuzeyu91/xuzeyu91-patch-1
Update README.md
2024-03-04 00:11:02 +08:00
zyxucp
f4a60b28ec Update README.md 2024-03-04 00:10:45 +08:00
zyxucp
798593bad3 fix 修改删除刷新事件 2024-03-04 00:08:23 +08:00
zyxucp
778e76b00b add 模型删除 2024-03-03 23:57:06 +08:00
zyxucp
55778562ae add 增加模型管理界面 2024-03-03 23:50:40 +08:00
zyxucp
66b5b42952 add 修改首页 2024-03-03 23:17:56 +08:00
zyxucp
3ff8a4f51b add 增加会话使用温度值 2024-03-03 23:00:26 +08:00
zyxucp
b2a46db524 add Temperature 2024-03-03 22:57:48 +08:00
zyxucp
8d66f4f34d Merge branch 'main' of https://github.com/xuzeyu91/AntSK 2024-03-03 22:07:17 +08:00
zyxucp
199b546d56 fix 优化项目 2024-03-03 22:06:26 +08:00
zyxucp
bea6e5ef53 fix 封装kernel 2024-03-03 21:43:28 +08:00
zyxucp
3c17dc9943 add 增加注释 2024-03-03 21:16:56 +08:00
zyxucp
6d693ed340 fix 修改kernel类 2024-03-03 21:14:22 +08:00
zyxucp
f86b7aee95 fix 修改切分符号 2024-03-03 20:39:37 +08:00
zyxucp
fca2d98d51 fix 修改分隔符 2024-03-03 20:38:15 +08:00
zyxucp
2f3d3d7b55 add 增加插件代理 2024-03-03 01:55:55 +08:00
zyxucp
5250817d21 add 插件 2024-03-02 16:50:24 +08:00
zyxucp
6f966590d9 add 增加httpheader 2024-03-02 16:12:25 +08:00
zyxucp
da16cf73c9 fix 格式化代码 2024-03-02 14:41:06 +08:00
zyxucp
999cda2fc2 add API详情 2024-03-02 14:40:38 +08:00
zyxucp
28f5be071a add apilist 2024-03-02 13:51:22 +08:00
zyxucp
4ad8fb69c7 add 增加api列表 2024-03-02 13:42:41 +08:00
zyxucp
2cb5ab7f98 add 增加员工查询搜索 2024-03-02 12:31:25 +08:00
zyxucp
97b87f2adb Update README.en.md 2024-03-02 09:02:23 +08:00
zyxucp
d23c263f9f Update README.md 2024-03-02 09:00:34 +08:00
zyxucp
7f003afa2b Merge pull request #7 from itchangc/main
创建vector插件如果数据库没有则需要提供支持向量的数据库
2024-03-01 16:03:49 +08:00
自动畅
53d52dd17f Update Program.cs
创建vector插件如果数据库没有则需要提供支持向量的数据库
2024-03-01 15:20:55 +08:00
zyxucp
036d57ef05 fix 不知道为什么markdown没有 Content-Type,单独处理一下 2024-03-01 14:38:57 +08:00
zyxucp
b25e429687 fix 修改maxtoken 2024-03-01 12:15:21 +08:00
zyxucp
a3f87bf123 fix 修复维度和maxtoken问题 2024-03-01 12:10:11 +08:00
zyxucp
2cab253c4a fix 修复openai stream接口格式不正确问题 2024-03-01 12:09:27 +08:00
zyxucp
ed119f02e2 fix 修改message实体 2024-02-29 18:28:32 +08:00
zyxucp
f178fc16e9 style 样式调整 2024-02-29 18:23:50 +08:00
zyxucp
e4b2071689 fix SK还原到1.4 2024-02-29 17:49:43 +08:00
zyxucp
146df7ed1d fix 修改SK版本 2024-02-29 17:42:41 +08:00
zyxucp
7e8db0a3f8 add 修改气泡样式 2024-02-29 17:40:43 +08:00
zyxucp
e098922219 fix 修改聊天窗为气泡样式 2024-02-29 17:30:50 +08:00
zyxucp
16ca024c22 Merge branch 'main' into feature_plugin 2024-02-29 13:55:15 +08:00
zyxucp
a886e9dfb3 fix 修复兼容域名的情况 端口为0 2024-02-29 13:54:33 +08:00
zyxucp
5d6114c9ec update 升级SK 至1.5.0 和升级KM 2024-02-29 12:52:44 +08:00
zyxucp
e3b2e1f434 fix 修复没登陆时没有权限的问题 2024-02-29 12:41:50 +08:00
zyxucp
6145347d9b add 增加权限管理 2024-02-29 12:35:03 +08:00
zyxucp
49e694cbdc add 增加非管理员不允许操作系统设置 2024-02-29 12:00:22 +08:00
zyxucp
f860229993 fix 调整Util目录 2024-02-29 10:38:36 +08:00
zyxucp
f5d93baa17 fix 使用默认切片 2024-02-28 18:48:40 +08:00
zyxucp
76f58c43b0 Update README.md 2024-02-28 17:55:48 +08:00
zyxucp
db29fcc867 add 用户个人设置 2024-02-28 17:17:37 +08:00
zyxucp
2f361c23c7 add 修改登陆人名称 2024-02-28 14:50:04 +08:00
zyxucp
4e7ac6eb4b add 增加多用户登陆验证 2024-02-28 14:31:03 +08:00
zyxucp
58bca689c8 add 增加用户新增功能 2024-02-28 14:15:11 +08:00
zyxucp
e1b2aee33c add 新增用户 2024-02-28 13:58:41 +08:00
zyxucp
7a6e8525c5 add 增加用户新增页面 2024-02-28 12:59:12 +08:00
zyxucp
b8db68bed1 add 增加用户列表 2024-02-28 12:38:55 +08:00
zyxucp
1072f47467 fix 修改切片分段 2024-02-28 12:03:31 +08:00
zyxucp
cfb1d858c6 fix 修改文案 2024-02-27 16:00:56 +08:00
zyxucp
8e0e75aee6 fix 修复切片显示bug 2024-02-27 13:14:42 +08:00
zyxucp
1479c942e2 fix 修改维度 2024-02-27 12:57:14 +08:00
zyxucp
63b02b889c fix 修复Embedding格式错误 2024-02-27 12:26:21 +08:00
zyxucp
5a1de0e2cf add 增加Embedding 2024-02-27 11:43:00 +08:00
zyxucp
ad2a402521 add 修改代理增加端口 2024-02-27 09:56:49 +08:00
zyxucp
a14af93afc add 增加LLamaSharp本地模型对接 2024-02-27 01:14:12 +08:00
zyxucp
90630bca1d add 样式修改 2024-02-25 11:24:46 +08:00
zyxucp
bf1db38e2e fix 修改知识库分配查询逻辑 2024-02-22 22:42:08 +08:00
zyxucp
88e23768c6 Merge pull request #5 from LoganChi/patch-1
Update 404.razor
2024-02-22 20:02:07 +08:00
zyxucp
ea8366ca92 Merge pull request #4 from LoganChi/patch-2
Create 404.razor.css
2024-02-22 20:01:55 +08:00
zyxucp
8e1f07415f Merge pull request #3 from LoganChi/patch-3
Update App.razor
2024-02-22 20:00:48 +08:00
LoganChi
0b62e773eb Update App.razor 2024-02-22 15:36:26 +08:00
LoganChi
1c4b1e2d2f Create 404.razor.css
an intersting 404 page
2024-02-22 15:33:46 +08:00
LoganChi
0e53dd3854 Update 404.razor 2024-02-22 15:30:54 +08:00
zyxucp
c2fa13b6ab Merge branch 'main' of https://github.com/xuzeyu91/AntSK 2024-02-22 12:41:21 +08:00
zyxucp
837c9a1444 add 增加配置文件示例 2024-02-22 11:31:55 +08:00
zyxucp
08ec4f6b7e Update README.md 2024-02-21 18:22:08 +08:00
zyxucp
f5a8076da3 fix 修改返回json请求头 2024-02-20 19:17:40 +08:00
zyxucp
cf8c935694 fix 修改API流式输出 2024-02-20 19:15:50 +08:00
zyxucp
67fd7d952a add 增加接口流式输出 2024-02-20 18:45:41 +08:00
zyxucp
b7a3ad6fe7 update 更新SK与KM版本 2024-02-20 15:55:05 +08:00
zyxucp
0dabd2ee58 fix 修复openai地址为IP端口时正则匹配不到的问题 2024-02-20 11:24:31 +08:00
zyxucp
e841fc6282 fix 处理openai地址是IP端口的情况 2024-02-20 11:15:02 +08:00
zyxucp
ab45a46fc0 fix 修复正则匹配不到IP和端口的问题 2024-02-20 11:10:34 +08:00
zyxucp
34c06b1dd1 Merge branch 'feature_openai对外接口' 2024-02-18 23:53:23 +08:00
zyxucp
50415b12c0 add 增加描述 2024-02-18 23:49:30 +08:00
zyxucp
61509154c6 add 增加会话嵌入页面 2024-02-18 23:24:27 +08:00
zyxucp
3d5be56089 Update README.md 2024-02-18 16:02:30 +08:00
zyxucp
a0da9c223b fix 取消api的markdown格式化 2024-02-18 15:52:00 +08:00
zyxucp
172755081f add 新增对外接口 2024-02-18 15:46:21 +08:00
zyxucp
1da43f2cee fix 调整Pro框架Service结构 2024-02-18 14:20:46 +08:00
zyxucp
8b77ea4438 add 增加外部API配置页面 2024-02-18 14:05:15 +08:00
zyxucp
b6039c0da3 Delete AntSK.db 2024-02-18 10:46:05 +08:00
zyxucp
1cda01d5b3 Merge branch 'main' of https://github.com/xuzeyu91/AntSK 2024-02-15 16:43:41 +08:00
zyxucp
6bd2ef4131 add 添加一点延迟,让对话输出更平缓 2024-02-15 16:41:47 +08:00
zyxucp
96e1ca6b34 Update README.en.md 2024-02-15 13:39:39 +08:00
zyxucp
6620a74447 Update README.md 2024-02-15 13:38:46 +08:00
zyxucp
fb7a85b9cf Update README.md 2024-02-15 13:38:25 +08:00
zyxucp
b7532676c5 add 新增系统账号,需要输入账号密码才可访问 2024-02-15 13:34:32 +08:00
zyxucp
8cd6940311 update 修改登陆页 2024-02-15 12:36:52 +08:00
zyxucp
2de851f5b1 fix 如果模板为空给一个默认提示词 2024-02-14 20:55:25 +08:00
zyxucp
e8fd055349 add 增加首页 2024-02-10 00:54:46 +08:00
zyxucp
7b92373f54 fix 提前function让代码更整洁 2024-02-10 00:22:36 +08:00
zyxucp
03b937432f add 增加多轮会话,会话总结 2024-02-10 00:19:56 +08:00
zyxucp
bd9798ad17 fix 处理知识库markdown样式 2024-02-09 23:23:17 +08:00
zyxucp
030abf1059 Merge branch 'main' of https://github.com/xuzeyu91/AntSK 2024-02-09 23:05:30 +08:00
zyxucp
91e633700a add 增加应用标签 2024-02-09 23:03:49 +08:00
zyxucp
6eb034967c add 增加聊天流式输出 2024-02-09 22:49:44 +08:00
307 changed files with 11125 additions and 2306 deletions

13
.gitignore vendored
View File

@@ -330,13 +330,16 @@ ASALocalRun/
*.pdb
# MFractors (Xamarin productivity tool) working folder
.mfractor/
/.semantic-kernel/results/src/ISS.IPSA.AiAgent.Api/plugins/BasePlugin/YesNo
**/bin/
**/obj/
**/.vs/
/Xzy.KnowledgeBase/appsettings.Development.json
/Xzy.KnowledgeBase/XzyAgent.db
/Xzy.KnowledgeBase/AntSK.db
/AntSK/AntSK.db
/AntSK/appsettings.Development.json
/AntSK.db
**/tmp-memory-files/*
**/tmp-memory-vectors/*
/src/AntSK/AntSK.db
/src/AntSK/appsettings.Development.json
/src/AntSK.db
/src/AntSK/llama_models
/src/AntSK/AntSK.xml

View File

@@ -1,22 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<DocumentationFile>AntSK.Domain.xml</DocumentationFile>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AutoMapper" Version="8.1.0" />
<PackageReference Include="MarkdownSharp" Version="2.0.5" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="SqlSugarCore" Version="5.1.4.137" />
<PackageReference Include="System.Data.SQLite.Core" Version="1.0.118" />
<PackageReference Include="Microsoft.SemanticKernel" Version="1.3.0" />
<PackageReference Include="Microsoft.SemanticKernel.Core" Version="1.3.0" />
<PackageReference Include="Microsoft.KernelMemory.Core" Version="0.26.240121.1" />
<PackageReference Include="Microsoft.KernelMemory.MemoryDb.Postgres" Version="0.26.240121.1" />
</ItemGroup>
</Project>

View File

@@ -1,21 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Domain.Dto
{
public class KMFile
{
public string Text { get; set; }
public string Url { get; set; }
public string LastUpdate { get; set; }
public string Schema { get; set; }
public string File { get; set; }
}
}

View File

@@ -1,14 +0,0 @@
using AntSK.Domain.Domain.Dto;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Domain.Interface
{
public interface IKMService
{
Task<List<KMFile>> GetDocumentByFileID(string fileid);
}
}

View File

@@ -1,45 +0,0 @@
using AntSK.Domain.Common.DependencyInjection;
using AntSK.Domain.Domain.Interface;
using Microsoft.KernelMemory;
using AntSK.Domain.Utils;
using AntSK.Domain.Domain.Dto;
namespace AntSK.Domain.Domain.Service
{
[ServiceDescription(typeof(IKMService), ServiceLifetime.Scoped)]
public class KMService(MemoryServerless _memory) : IKMService
{
public async Task<List<KMFile>> GetDocumentByFileID(string fileid)
{
var memories = await _memory.ListIndexesAsync();
var memoryDbs = _memory.Orchestrator.GetMemoryDbs();
List<KMFile> docTextList = new List<KMFile>();
foreach (var memoryIndex in memories)
{
foreach (var memoryDb in memoryDbs)
{
var list = memoryDb.GetListAsync(memoryIndex.Name, null, 100, true);
await foreach (var item in list)
{
if (item.Id.Contains(fileid))
{
KMFile file = new KMFile()
{
Text = item.Payload.FirstOrDefault(p => p.Key == "text").Value.ConvertToString(),
Url= item.Payload.FirstOrDefault(p => p.Key == "url").Value.ConvertToString(),
LastUpdate= item.Payload.FirstOrDefault(p => p.Key == "last_update").Value.ConvertToString(),
Schema = item.Payload.FirstOrDefault(p => p.Key == "schema").Value.ConvertToString(),
File = item.Payload.FirstOrDefault(p => p.Key == "file").Value.ConvertToString(),
};
docTextList.Add(file);
}
}
}
}
return docTextList;
}
}
}

View File

@@ -1,18 +0,0 @@
using AutoMapper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Map
{
public class AutoMapProfile : Profile
{
public AutoMapProfile()
{
}
}
}

View File

@@ -1,53 +0,0 @@
using AutoMapper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Map
{
public static class MapperExtend
{
/// <summary>
/// Entity集合转DTO集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
public static List<T> ToDTOList<T>(this object value)
{
if (value == null)
return new List<T>();
return Mapper.Map<List<T>>(value);
}
/// <summary>
/// Entity转DTO
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
public static T ToDTO<T>(this object value)
{
if (value == null)
return default(T);
return Mapper.Map<T>(value);
}
/// <summary>
/// 给已有对象map,适合update场景如需过滤空值需要在AutoMapProfile 设置
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="self"></param>
/// <param name="result"></param>
/// <returns></returns>
public static T MapTo<T>(this object self, T result)
{
if (self == null)
return default(T);
return (T)Mapper.Map(self, result, self.GetType(), typeof(T));
}
}
}

View File

@@ -1,18 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Model
{
public class MessageInfo
{
public string ID { get; set; } = "";
public string Questions { get; set; } = "";
public string Answers { get; set; } = "";
public string HtmlAnswers { get; set; } = "";
public DateTime CreateTime { get; set; }
}
}

View File

@@ -1,20 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Options
{
public class ConnectionOption
{
/// <summary>
/// sqlite连接字符串
/// </summary>
public static string Sqlite { get; set; }
/// <summary>
/// pg链接字符串
/// </summary>
public static string Postgres { get; set; }
}
}

View File

@@ -1,17 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Options
{
public class OpenAIOption
{
public static string EndPoint { get; set; }
public static string Key { get; set; }
public static string Model { get; set; }
public static string EmbeddingModel { get; set; }
}
}

View File

@@ -1,32 +0,0 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Repositories
{
[SugarTable("Kms")]
public partial class Kmss
{
[SugarColumn(IsPrimaryKey = true)]
public string Id { get; set; }
/// <summary>
/// 图标
/// </summary>
[Required]
public string Icon { get; set; }
/// <summary>
/// 名称
/// </summary>
[Required]
public string Name { get; set; }
/// <summary>
/// 会话模型
/// </summary>
[Required]
public string Describe { get; set; }
}
}

View File

@@ -1,51 +0,0 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AntSK.Domain.Options;
using AntSK.Domain.Utils;
using System.Reflection;
namespace AntSK.Domain.Repositories.Base
{
public class SqlSugarHelper
{
/// <summary>
/// sqlserver连接
/// </summary>
public static SqlSugarScope Sqlite = new SqlSugarScope(new ConnectionConfig()
{
ConnectionString = ConnectionOption.Postgres,
DbType = DbType.PostgreSQL,
InitKeyType = InitKeyType.Attribute,//从特性读取主键和自增列信息
IsAutoCloseConnection = true,
ConfigureExternalServices = new ConfigureExternalServices
{
//注意: 这儿AOP设置不能少
EntityService = (c, p) =>
{
/***高版C#写法***/
//支持string?和string
if (p.IsPrimarykey == false && new NullabilityInfoContext()
.Create(c).WriteState is NullabilityState.Nullable)
{
p.IsNullable = true;
}
}
}
}, Db =>
{
Db.Aop.OnLogExecuting = (sql, pars) =>
{
if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT").ConvertToString() == "Development")
{
Console.WriteLine(sql + "\r\n" +
Sqlite.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
Console.WriteLine();
}
};
});
}
}

View File

@@ -1,55 +0,0 @@
using AntSK.Domain.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace AntSK.Domain.Utils
{
public class OpenAIHttpClientHandler : HttpClientHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
UriBuilder uriBuilder;
Regex regex = new Regex(@"(https?)://([^/]+)/(.*)");
Match match = regex.Match(OpenAIOption.EndPoint);
string xieyi = match.Groups[1].Value;
string host = match.Groups[2].Value;
string route = match.Groups[3].Value;
if (match.Success)
{
switch (request.RequestUri.LocalPath)
{
case "/v1/chat/completions":
//替换代理
uriBuilder = new UriBuilder(request.RequestUri)
{
// 这里是你要修改的 URL
Scheme = $"{xieyi}://{host}/",
Host = host,
Path = route + "v1/chat/completions",
};
request.RequestUri = uriBuilder.Uri;
break;
case "/v1/embeddings":
uriBuilder = new UriBuilder(request.RequestUri)
{
// 这里是你要修改的 URL
Scheme = $"{xieyi}://{host}/",
Host = host,
Path = route + "v1/embeddings",
};
request.RequestUri = uriBuilder.Uri;
break;
}
}
// 接着,调用基类的 SendAsync 方法将你的修改后的请求发出去
HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
return response;
}
}
}

View File

@@ -1,473 +0,0 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>AntSK.Domain</name>
</assembly>
<members>
<member name="T:AntSK.Domain.Common.DependencyInjection.ServiceCollectionExtensions">
<summary>
容器扩展
</summary>
</member>
<member name="M:AntSK.Domain.Common.DependencyInjection.ServiceCollectionExtensions.AddServicesFromAssemblies(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.String[])">
<summary>
从程序集中加载类型并添加到容器中
</summary>
<param name="services">容器</param>
<param name="assemblies">程序集集合</param>
<returns></returns>
</member>
<member name="F:AntSK.Domain.Common.DependencyInjection.ServiceLifetime.Scoped">
<summary>
作用域
</summary>
</member>
<member name="F:AntSK.Domain.Common.DependencyInjection.ServiceLifetime.Singleton">
<summary>
单例
</summary>
</member>
<member name="F:AntSK.Domain.Common.DependencyInjection.ServiceLifetime.Transient">
<summary>
瞬时
</summary>
</member>
<member name="M:AntSK.Domain.Map.MapperExtend.ToDTOList``1(System.Object)">
<summary>
Entity集合转DTO集合
</summary>
<typeparam name="T"></typeparam>
<param name="value"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Map.MapperExtend.ToDTO``1(System.Object)">
<summary>
Entity转DTO
</summary>
<typeparam name="T"></typeparam>
<param name="value"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Map.MapperExtend.MapTo``1(System.Object,``0)">
<summary>
给已有对象map,适合update场景如需过滤空值需要在AutoMapProfile 设置
</summary>
<typeparam name="T"></typeparam>
<param name="self"></param>
<param name="result"></param>
<returns></returns>
</member>
<member name="P:AntSK.Domain.Model.PageList`1.PageIndex">
<summary>
当前页从1开始
</summary>
</member>
<member name="P:AntSK.Domain.Model.PageList`1.PageSize">
<summary>
每页数量
</summary>
</member>
<member name="P:AntSK.Domain.Model.PageList`1.TotalCount">
<summary>
总数
</summary>
</member>
<member name="P:AntSK.Domain.Options.ConnectionOption.Sqlite">
<summary>
sqlite连接字符串
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apps.Name">
<summary>
名称
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apps.Describe">
<summary>
描述
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.KmsDetails.FileName">
<summary>
文件名称
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.KmsDetails.DataCount">
<summary>
数据数量
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.KmsDetails.Status">
<summary>
状态
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.KmsDetails.CreateTime">
<summary>
创建时间
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Kmss.Name">
<summary>
名称
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Kmss.ChatModel">
<summary>
会话模型
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Kmss.EmbeddingModel">
<summary>
向量模型
</summary>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.GetList">
<summary>
获取所有list
</summary>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.GetListAsync">
<summary>
获取所有list-异步
</summary>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.GetList(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
<summary>
根据lambda查询
</summary>
<param name="whereExpression"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.GetListAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
<summary>
根据lambda查询-异步
</summary>
<param name="whereExpression"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.Count(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
<summary>
根据lambda表达式获取数量
</summary>
<param name="whereExpression"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.CountAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
<summary>
根据lambda表达式获取数量-异步
</summary>
<param name="whereExpression"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.GetPageList(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}},SqlSugar.PageModel)">
<summary>
获取分页
</summary>
<param name="whereExpression"></param>
<param name="page"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.GetPageListAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}},SqlSugar.PageModel)">
<summary>
获取分页-异步
</summary>
<param name="whereExpression"></param>
<param name="page"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.GetById(System.Object)">
<summary>
根据id获取实体
</summary>
<param name="id"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.GetByIdAsync(System.Object)">
<summary>
根据id获取实体-异步
</summary>
<param name="id"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.GetSingle(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
<summary>
根据lambda获取单个对象 注意需要确保唯一如果获取到2个会报错这种场景需要使用GetFirst
</summary>
<param name="whereExpression"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.GetSingleAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
<summary>
根据lambda获取单个对象-异步 注意需要确保唯一如果获取到2个会报错这种场景需要使用GetFirst
</summary>
<param name="whereExpression"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.GetFirst(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
<summary>
根据lambda获取单个对象
</summary>
<param name="whereExpression"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.GetFirstAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
<summary>
根据lambda获取单个对象 --异步
</summary>
<param name="whereExpression"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.Insert(`0)">
<summary>
实体插入
</summary>
<param name="obj"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.InsertAsync(`0)">
<summary>
实体插入-异步
</summary>
<param name="obj"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.InsertRange(System.Collections.Generic.List{`0})">
<summary>
批量插入
</summary>
<param name="objs"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.InsertRangeAsync(System.Collections.Generic.List{`0})">
<summary>
批量插入-异步
</summary>
<param name="objs"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.InsertReturnIdentity(`0)">
<summary>
插入返回自增列
</summary>
<param name="obj"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.InsertReturnIdentityAsync(`0)">
<summary>
插入返回自增列-异步
</summary>
<param name="obj"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.InsertReturnBigIdentity(`0)">
<summary>
插入返回longid
</summary>
<param name="obj"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.InsertReturnBigIdentityAsync(`0)">
<summary>
插入返回longid-异步
</summary>
<param name="obj"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.DeleteByIds(System.Object[])">
<summary>
批量删除
</summary>
<param name="ids"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.DeleteByIdsAsync(System.Object[])">
<summary>
批量删除-异步
</summary>
<param name="ids"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.Delete(System.Object)">
<summary>
根据主键删除
</summary>
<param name="id"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.DeleteAsync(System.Object)">
<summary>
根据主键删除-异步
</summary>
<param name="id"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.Delete(`0)">
<summary>
根据实体删除
</summary>
<param name="obj"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.DeleteAsync(`0)">
<summary>
根据实体删除-异步
</summary>
<param name="obj"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.Delete(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
<summary>
根据表达式删除
</summary>
<param name="whereExpression"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.DeleteAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
<summary>
根据表达式删除-异步
</summary>
<param name="whereExpression"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.Update(`0)">
<summary>
更新
</summary>
<param name="obj"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.UpdateAsync(`0)">
<summary>
更新-异步
</summary>
<param name="obj"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.UpdateRange(System.Collections.Generic.List{`0})">
<summary>
批量更新
</summary>
<param name="objs"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.UpdateRangeAsync(System.Collections.Generic.List{`0})">
<summary>
批量更新-异步
</summary>
<param name="objs"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.IsAny(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
<summary>
是否包含元素
</summary>
<param name="whereExpression"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.IsAnyAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
<summary>
是否包含元素-异步
</summary>
<param name="whereExpression"></param>
<returns></returns>
</member>
<member name="F:AntSK.Domain.Repositories.Base.SqlSugarHelper.Sqlite">
<summary>
sqlserver连接
</summary>
</member>
<member name="M:AntSK.Domain.Utils.ConvertUtils.IsNull(System.Object)">
<summary>
判断是否为空为空返回true
</summary>
<param name="data"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.ConvertUtils.IsNotNull(System.Object)">
<summary>
判断是否为空为空返回true
</summary>
<param name="data"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.ConvertUtils.IsNull(System.String)">
<summary>
判断是否为空为空返回true
</summary>
<param name="data"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.ConvertUtils.ConvertToString(System.Object)">
<summary>
将obj类型转换为string
</summary>
<param name="s"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.ConvertUtils.ConvertToInt32(System.Object)">
<summary>
object 转int32
</summary>
<param name="s"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.ConvertUtils.ConvertToInt64(System.Object)">
<summary>
object 转int32
</summary>
<param name="s"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.ConvertUtils.ConvertToDouble(System.Object)">
<summary>
将字符串转double
</summary>
<param name="s"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.ConvertUtils.ConvertToDateTime(System.String)">
<summary>
转换为datetime类型
</summary>
<param name="s"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.ConvertUtils.ConvertToDateTime(System.String,System.String)">
<summary>
转换为datetime类型的格式字符串
</summary>
<param name="s">要转换的对象</param>
<param name="y">格式化字符串</param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.ConvertUtils.ConvertToDecimal(System.Object)">
<summary>
将字符串转换成decimal
</summary>
<param name="s"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.ConvertUtils.DecimalFraction(System.Decimal)">
<summary>
decimal保留2位小数
</summary>
</member>
<member name="M:AntSK.Domain.Utils.ConvertUtils.ReplaceHtml(System.String)">
<summary>
替换html种的特殊字符
</summary>
<param name="s"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.ConvertUtils.StreamToByte(System.IO.Stream)">
<summary>
流转byte
</summary>
<param name="stream"></param>
<returns></returns>
</member>
</members>
</doc>

View File

View File

@@ -1,36 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.8.34330.188
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AntSK", "AntSK\AntSK.csproj", "{9AA5A735-8FB1-4CC5-AB3E-D02B3A3B6682}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AntSK.Domain", "AntSK.Domain\AntSK.Domain.csproj", "{64F17C9A-97C2-46FA-9345-86C5289288AD}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docker", "Docker", "{9F2E193A-5F9D-4C82-B591-CB133EEB59F0}"
ProjectSection(SolutionItems) = preProject
Dockerfile = Dockerfile
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{9AA5A735-8FB1-4CC5-AB3E-D02B3A3B6682}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9AA5A735-8FB1-4CC5-AB3E-D02B3A3B6682}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9AA5A735-8FB1-4CC5-AB3E-D02B3A3B6682}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9AA5A735-8FB1-4CC5-AB3E-D02B3A3B6682}.Release|Any CPU.Build.0 = Release|Any CPU
{64F17C9A-97C2-46FA-9345-86C5289288AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{64F17C9A-97C2-46FA-9345-86C5289288AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{64F17C9A-97C2-46FA-9345-86C5289288AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{64F17C9A-97C2-46FA-9345-86C5289288AD}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {2076B7C9-2E5B-4580-9712-03F0D56BC1AF}
EndGlobalSection
EndGlobal

View File

@@ -1,25 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<DocumentationFile>AntSK.xml</DocumentationFile>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AntDesign.Charts" Version="0.5.1" />
<PackageReference Include="AntDesign.ProLayout" Version="0.17.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
<PackageReference Include="System.Net.Http.Json" Version="8.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\AntSK.Domain\AntSK.Domain.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Pages\Setting\" />
</ItemGroup>
</Project>

View File

@@ -1,27 +0,0 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>AntSK</name>
</assembly>
<members>
<member name="M:AntSK.Controllers.FileController.UploadFile(Microsoft.AspNetCore.Http.IFormFile)">
<summary>
Upload FileName
</summary>
<returns></returns>
</member>
<member name="M:AntSK.Controllers.InitController.InitTable">
<summary>
初始化DB 和表
</summary>
<returns></returns>
</member>
<member name="T:AntSK.Pages.KmsPage.KmsDetail.UrlModel">
<summary>
根据文档ID获取文档
</summary>
<param name="fileid"></param>
<returns></returns>
</member>
</members>
</doc>

View File

@@ -1,13 +0,0 @@
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<CascadingValue Value="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(BasicLayout)" />
</CascadingValue>
</Found>
<NotFound>
<LayoutView Layout="@typeof(BasicLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
<AntContainer />

View File

@@ -1,11 +0,0 @@
@namespace AntSK.Components
@inherits AntDomComponentBase
<Space Class="@ClassMapper.Class" Size="@("24")">
<SpaceItem>
<AvatarDropdown Name="@_currentUser.Name"
Avatar="@_currentUser.Avatar"
MenuItems="@AvatarMenuItems"
OnItemSelected="HandleSelectUser" />
</SpaceItem>
</Space>

View File

@@ -1,50 +0,0 @@
@namespace AntSK
@inherits LayoutComponentBase
<AntDesign.ProLayout.BasicLayout
Logo="@("https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg")"
MenuData="_menuData">
<RightContentRender>
<AntSK.Components.RightContent />
</RightContentRender>
<ChildContent>
@Body
</ChildContent>
<FooterRender>
<FooterView Copyright="2024 许泽宇的技术分享" Links="Links"></FooterView>
</FooterRender>
</AntDesign.ProLayout.BasicLayout>
<SettingDrawer />
@code
{
private MenuDataItem[] _menuData = { };
[Inject] public HttpClient HttpClient { get; set; }
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
_menuData = await HttpClient.GetFromJsonAsync<MenuDataItem[]>("data/menu.json");
}
public LinkItem[] Links { get; set; } =
{
new LinkItem
{
Key = "许泽宇的技术分享",
Title = "许泽宇的技术分享",
Href = "http://studiogpt.cn/",
BlankTarget = true,
},
new LinkItem
{
Key = "github",
Title = (RenderFragment)(@<Icon Type="github" />),
Href = "https://github.com/xuzeyu91/Xzy.AntSK.KnowledgeBase",
BlankTarget = true,
}
};
}

View File

@@ -1,80 +0,0 @@
@namespace AntSK.Pages.AppPage
@using AntSK.Domain.Repositories
@using AntSK.Models
@page "/App/Add"
@page "/App/Add/{AppId}"
<PageContainer Title="新增应用">
<ChildContent>
<Card>
<Form Model="@_appModel"
Style="margin-top: 8px;"
OnFinish="HandleSubmit">
<FormItem Label="知识库名称" LabelCol="_formItemLayout.LabelCol" WrapperCol="_formItemLayout.WrapperCol">
<Input Placeholder="请输入知识库名称" @bind-Value="@context.Name" />
</FormItem>
<FormItem Label="图标" LabelCol="_formItemLayout.LabelCol" WrapperCol="_formItemLayout.WrapperCol">
<Input Placeholder="请输入图标" @bind-Value="@context.Icon" />
<a href="https://antblazor.com/zh-CN/components/icon" target="_blank">图标库</a>
</FormItem>
<FormItem Label="类型" LabelCol="_formItemLayout.LabelCol" WrapperCol="_formItemLayout.WrapperCol">
<RadioGroup @bind-Value="context.Type">
<Radio RadioButton Value="@("chat")">简单对话</Radio>
<Radio RadioButton Value="@("kms")" >知识库</Radio>
</RadioGroup>
</FormItem>
<FormItem Label="描述" LabelCol="_formItemLayout.LabelCol" WrapperCol="_formItemLayout.WrapperCol">
<Input Placeholder="请输入描述" @bind-Value="@context.Describe" />
</FormItem>
@if (@context.Type == "chat")
{
<FormItem Label="提示词" LabelCol="_formItemLayout.LabelCol" WrapperCol="_formItemLayout.WrapperCol">
<TextArea MinRows="4" Placeholder="请输入提示词,用户输入使用{{$input}} 来做占位符" @bind-Value="@context.Prompt" />
</FormItem>
}
@if (@context.Type == "kms")
{
<FormItem Label="知识库" LabelCol="_formItemLayout.LabelCol" WrapperCol="_formItemLayout.WrapperCol">
<Select Mode="multiple"
@bind-Values="kmsIds"
Placeholder="选择知识库"
TItemValue="string"
TItem="string"
Size="@AntSizeLDSType.Default"
>
<SelectOptions>
@foreach (var kms in _kmsList)
{
<SelectOption TItem="string" TItemValue="string" Value="@kms.Id" Label="@kms.Name" />
}
</SelectOptions>
</Select>
</FormItem>
}
<FormItem Label=" " Style="margin-top:32px" WrapperCol="_submitFormLayout.WrapperCol">
<Button Type="primary" HtmlType="submit">
保存
</Button>
<Button OnClick="Back">
返回
</Button>
</FormItem>
@if (!string.IsNullOrEmpty(_errorMsg))
{
<Alert Type="@AlertType.Error"
Message="错误"
Description="@_errorMsg"
ShowIcon="true" />
}
</Form>
</Card>
</ChildContent>
</PageContainer>
<style>
.avatar-uploader > .ant-upload {
width: 128px;
height: 128px;
}
</style>

View File

@@ -1,105 +0,0 @@
using AntDesign;
using Microsoft.AspNetCore.Components;
using AntSK.Domain.Repositories;
using AntSK.Models;
using System.IO;
namespace AntSK.Pages.AppPage
{
public partial class AddApp
{
[Parameter]
public string AppId { get; set; }
[Inject]
protected IApps_Repositories _apps_Repositories { get; set; }
[Inject]
protected IKmss_Repositories _kmss_Repositories { get; set; }
[Inject]
protected NavigationManager NavigationManager { get; set; }
private Apps _appModel = new Apps() ;
IEnumerable <string> kmsIds;
private List<Kmss> _kmsList = new List<Kmss>();
private string _errorMsg { get; set; }
private readonly FormItemLayout _formItemLayout = new FormItemLayout
{
LabelCol = new ColLayoutParam
{
Xs = new EmbeddedProperty { Span = 24 },
Sm = new EmbeddedProperty { Span = 7 },
},
WrapperCol = new ColLayoutParam
{
Xs = new EmbeddedProperty { Span = 24 },
Sm = new EmbeddedProperty { Span = 12 },
Md = new EmbeddedProperty { Span = 10 },
}
};
private readonly FormItemLayout _submitFormLayout = new FormItemLayout
{
WrapperCol = new ColLayoutParam
{
Xs = new EmbeddedProperty { Span = 24, Offset = 0 },
Sm = new EmbeddedProperty { Span = 10, Offset = 7 },
}
};
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
_kmsList = _kmss_Repositories.GetList();
if (!string.IsNullOrEmpty(AppId))
{
//查看
_appModel= _apps_Repositories.GetFirst(p => p.Id == AppId);
kmsIds = _appModel.KmsIdList?.Split(",");
}
}
private void HandleSubmit()
{
if (string.IsNullOrEmpty(AppId))
{
//新增
_appModel.Id = Guid.NewGuid().ToString();
if (_apps_Repositories.IsAny(p => p.Name == _appModel.Name))
{
_errorMsg = "名称已存在!";
return;
}
if (kmsIds != null && kmsIds.Count() > 0)
{
_appModel.KmsIdList = string.Join(",", kmsIds);
}
_apps_Repositories.Insert(_appModel);
}
else {
//修改
if (kmsIds != null && kmsIds.Count() > 0)
{
_appModel.KmsIdList = string.Join(",", kmsIds);
}
_apps_Repositories.Update(_appModel);
}
//NavigationManager.NavigateTo($"/app/detail/{_appModel.Id}");
NavigationManager.NavigateTo($"/applist");
}
private void Back() {
NavigationManager.NavigateTo("/applist");
}
}
}

View File

@@ -1,11 +0,0 @@
@namespace AntSK.Pages.AppPage
@using AntSK.Domain.Repositories
@using System.ComponentModel.DataAnnotations
@page "/App/Detail/{AppID}"
@inject NavigationManager NavigationManager
<h3>AppDetail</h3>
@code {
}

View File

@@ -1,10 +0,0 @@
using Microsoft.AspNetCore.Components;
namespace AntSK.Pages.AppPage
{
public partial class AppDetail
{
[Parameter]
public string AppId { get; set; }
}
}

View File

@@ -1,84 +0,0 @@
@namespace AntSK.Pages.ChatPage
@using AntSK.Domain.Repositories
@using AntSK.Models
@using Microsoft.AspNetCore.Components.Web.Virtualization
@page "/Chat"
@page "/Chat/{AppId}"
<GridRow Gutter="(16, 16)">
<GridCol Span="12">
<Spin Size="large" Tip="请稍等..." Spinning="@(_loading)">
<Card Style="height:800px;overflow: auto;">
<TitleTemplate>
<Icon Type="setting" /> 选择应用
<Select DataSource="@_list"
@bind-Value="@AppId"
DefaultValue="@("lucy")"
ValueProperty="c=>c.Id"
LabelProperty="c=>c.Name"
Style="width:200px">
</Select>
</TitleTemplate>
<Body>
<div id="scrollDiv" style="height: 530px; overflow-y: auto; overflow-x: hidden;">
<GridRow Gutter="(8, 8)">
<Virtualize Items="@(MessageList.OrderByDescending(o => o.CreateTime).ToList())" Context="item">
<GridCol Span="24">
<Card Size="small">
<TitleTemplate>
<Text Strong><Icon Type="bulb" /> @(item.Questions)</Text>
</TitleTemplate>
<Extra>
<Space>
<SpaceItem>
<a style="color: gray;" @onclick="@(() => OnCopyAsync(item))"><Icon Type="copy" /></a>
</SpaceItem>
<SpaceItem>
<a style="color: gray;" @onclick="@(() => OnClearAsync(item.ID))"><Icon Type="rest" /></a>
</SpaceItem>
</Space>
</Extra>
<Body>
@((MarkupString)(item.HtmlAnswers))
</Body>
</Card>
</GridCol>
</Virtualize>
</GridRow>
</div>
<div style="height: 10px;"></div>
<AntDesign.Input @bind-Value="@(_messageInput)" DebounceMilliseconds="@(-1)" Placeholder="输入消息回车发送" OnPressEnter="@(async () => await OnSendAsync())">
<Suffix>
<Button Icon="send" Type="@(ButtonType.Link)" OnClick="@(async () => await OnSendAsync())"></Button>
</Suffix>
</AntDesign.Input>
</Body>
</Card>
</Spin>
</GridCol>
<GridCol Span="12">
<Card Style="height: 800px;overflow: auto;">
<TitleTemplate>
<Icon Type="search" /> 调试结果
</TitleTemplate>
<Extra>
</Extra>
<Body>
<AntList Bordered DataSource="@RelevantSources">
<ChildContent Context="item">
<span> <b>@item.SourceName </b> 相似度:<Text Mark> @item.Relevance</Text></span>
<ListItem>
@item.Text
</ListItem>
</ChildContent>
</AntList>
</Body>
</Card>
</GridCol>
</GridRow>
@code {
}

View File

@@ -1,170 +0,0 @@
using AntDesign;
using AntSK.Domain.Model;
using AntSK.Domain.Repositories;
using AntSK.Domain.Utils;
using Azure.AI.OpenAI;
using Azure.Core;
using MarkdownSharp;
using Microsoft.AspNetCore.Components;
using Microsoft.KernelMemory;
using Microsoft.OpenApi.Models;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using Newtonsoft.Json;
using SqlSugar;
using System;
namespace AntSK.Pages.ChatPage
{
public partial class Chat
{
[Parameter]
public string AppId { get; set; }
[Inject]
protected MessageService? Message { get; set; }
[Inject]
protected IApps_Repositories _apps_Repositories { get; set; }
[Inject]
protected IKmss_Repositories _kmss_Repositories { get; set; }
[Inject]
protected IKmsDetails_Repositories _kmsDetails_Repositories { get; set; }
[Inject]
protected MemoryServerless _memory { get; set; }
[Inject]
protected Kernel _kernel { get; set; }
protected bool _loading = false;
protected List<MessageInfo> MessageList = [];
protected string? _messageInput;
protected string _json = "";
List<RelevantSource> RelevantSources = new List<RelevantSource>();
protected List<Apps> _list = new List<Apps>();
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
_list= _apps_Repositories.GetList();
}
protected async Task OnSendAsync()
{
if (string.IsNullOrWhiteSpace(_messageInput))
{
_ = Message.Info("请输入消息", 2);
return;
}
if (string.IsNullOrWhiteSpace(AppId))
{
_ = Message.Info("请选择应用进行测试", 2);
return;
}
await SendAsync(_messageInput);
_messageInput = "";
}
protected async Task OnCopyAsync(MessageInfo item)
{
await Task.Run(() =>
{
_messageInput = item.Questions;
});
}
protected async Task OnClearAsync(string id)
{
await Task.Run(() =>
{
MessageList = MessageList.Where(w => w.ID != id).ToList();
});
}
protected async Task<bool> SendAsync(string questions)
{
Apps app=_apps_Repositories.GetFirst(p => p.Id == AppId);
switch (app.Type)
{
case "chat":
//普通会话
var promptTemplateFactory = new KernelPromptTemplateFactory();
var promptTemplate = promptTemplateFactory.Create(new PromptTemplateConfig(app.Prompt));
var renderedPrompt = await promptTemplate.RenderAsync(_kernel);
var func = _kernel.CreateFunctionFromPrompt(app.Prompt, new OpenAIPromptExecutionSettings() );
var chatResult = await _kernel.InvokeAsync(func,new KernelArguments() { ["input"]=questions});
if (chatResult.IsNotNull())
{
string answers = chatResult.GetValue<string>();
var markdown = new Markdown();
string htmlAnswers = markdown.Transform(answers);
var info = new MessageInfo()
{
ID = Guid.NewGuid().ToString(),
Questions = questions,
Answers = answers,
HtmlAnswers = htmlAnswers,
CreateTime = DateTime.Now,
};
MessageList.Add(info);
}
break;
case "kms":
//知识库问答
var filters = new List<MemoryFilter>();
var kmsidList = app.KmsIdList.Split(",");
foreach (var kmsid in kmsidList)
{
filters.Add(new MemoryFilter().ByTag("kmsid", kmsid));
}
var kmsResult = await _memory.AskAsync(questions, index: "kms", filters: filters);
if (kmsResult != null)
{
if (!string.IsNullOrEmpty(kmsResult.Result))
{
string answers = kmsResult.Result;
var markdown = new Markdown();
string htmlAnswers = markdown.Transform(answers);
var info = new MessageInfo()
{
ID = Guid.NewGuid().ToString(),
Questions = questions,
Answers = answers,
HtmlAnswers = htmlAnswers,
CreateTime = DateTime.Now,
};
MessageList.Add(info);
}
foreach (var x in kmsResult.RelevantSources)
{
foreach (var xsd in x.Partitions)
{
string sourceName = x.SourceName;
var fileDetail = _kmsDetails_Repositories.GetFirst(p => p.FileGuidName == x.SourceName);
if (fileDetail.IsNotNull())
{
sourceName = fileDetail.FileName;
}
RelevantSources.Add(new RelevantSource() { SourceName = sourceName, Text = xsd.Text, Relevance = xsd.Relevance });
}
}
}
break;
}
return await Task.FromResult(true);
}
}
public class RelevantSource
{
public string SourceName { get; set; }
public string Text { get; set; }
public float Relevance { get; set; }
}
}

View File

@@ -1,10 +0,0 @@
@namespace AntSK.Pages.Exception
@page "/exception/404"
<Result Status="404"
Title="404"
SubTitle="Sorry, the page you visited does not exist.">
<Extra>
<Button Type="primary">Back Home</Button>
</Extra>
</Result>

View File

@@ -1,48 +0,0 @@
@namespace AntSK.Pages.KmsPage
@using AntSK.Domain.Repositories
@using AntSK.Models
@page "/Kms/Add"
@inject IMessageService _message
<PageContainer Title="新增知识库">
<ChildContent>
<Card>
<Form
Model="@_kmsModel"
Style="margin-top: 8px;"
OnFinish="HandleSubmit">
<FormItem Label="知识库名称" LabelCol="_formItemLayout.LabelCol" WrapperCol="_formItemLayout.WrapperCol">
<Input Placeholder="请输入知识库名称" @bind-Value="@context.Name" />
</FormItem>
<FormItem Label="图标" LabelCol="_formItemLayout.LabelCol" WrapperCol="_formItemLayout.WrapperCol">
<Input Placeholder="请输入图标" @bind-Value="@context.Icon" />
<a href="https://antblazor.com/zh-CN/components/icon" target="_blank">图标库</a>
</FormItem>
<FormItem Label="描述" LabelCol="_formItemLayout.LabelCol" WrapperCol="_formItemLayout.WrapperCol">
<Input Placeholder="请输入描述" @bind-Value="@context.Describe" />
</FormItem>
<FormItem Label=" " Style="margin-top:32px" WrapperCol="_submitFormLayout.WrapperCol">
<Button Type="primary" HtmlType="submit">
保存
</Button>
</FormItem>
@if ( !string.IsNullOrEmpty(_errorMsg))
{
<Alert Type="@AlertType.Error"
Message="错误"
Description="@_errorMsg"
ShowIcon="true"
/>
}
</Form>
</Card>
</ChildContent>
</PageContainer>
<style>
.avatar-uploader > .ant-upload {
width: 128px;
height: 128px;
}
</style>

View File

@@ -1,60 +0,0 @@
using AntDesign;
using Microsoft.AspNetCore.Components;
using AntSK.Domain.Repositories;
using AntSK.Models;
using System.IO;
namespace AntSK.Pages.KmsPage
{
public partial class AddKms
{
[Inject]
protected IKmss_Repositories _kmss_Repositories { get; set; }
[Inject]
protected NavigationManager NavigationManager { get; set; }
private string _errorMsg { get; set; }
private readonly Kmss _kmsModel = new Kmss() ;
private readonly FormItemLayout _formItemLayout = new FormItemLayout
{
LabelCol = new ColLayoutParam
{
Xs = new EmbeddedProperty { Span = 24 },
Sm = new EmbeddedProperty { Span = 7 },
},
WrapperCol = new ColLayoutParam
{
Xs = new EmbeddedProperty { Span = 24 },
Sm = new EmbeddedProperty { Span = 12 },
Md = new EmbeddedProperty { Span = 10 },
}
};
private readonly FormItemLayout _submitFormLayout = new FormItemLayout
{
WrapperCol = new ColLayoutParam
{
Xs = new EmbeddedProperty { Span = 24, Offset = 0 },
Sm = new EmbeddedProperty { Span = 10, Offset = 7 },
}
};
private void HandleSubmit()
{
_kmsModel.Id = Guid.NewGuid().ToString();
if (_kmss_Repositories.IsAny(p => p.Name == _kmsModel.Name))
{
_errorMsg = "名称已存在!";
return;
}
_kmss_Repositories.Insert(_kmsModel);
NavigationManager.NavigateTo("/kmslist");
}
}
}

View File

@@ -1,59 +0,0 @@
@namespace AntSK.Pages.User
@layout UserLayout
@page "/user/login"
<div class="main__b__0">
<div class="login">
<Form Model="@_model" OnFinish="HandleSubmit">
<Tabs ActiveKey="@context.LoginType">
<TabPane Key="1" Tab="Account Login">
<FormItem>
<AntDesign.Input Placeholder="Username: admin or user" Size="large" @bind-Value="@context.UserName">
<Prefix><Icon Type="user" /></Prefix>
</AntDesign.Input>
</FormItem>
<FormItem>
<AntDesign.Input Placeholder="Password: ant.design" Size="large" @bind-Value="@context.Password" Type="password">
<Prefix><Icon Type="lock" /></Prefix>
</AntDesign.Input>
</FormItem>
</TabPane>
<TabPane Key="2" Tab="Mobile Login">
<FormItem>
<AntDesign.Input Placeholder="Phone Number" Size="large" @bind-Value="@context.Mobile">
<Prefix><Icon Type="mobile" /></Prefix>
</AntDesign.Input>
</FormItem>
<FormItem>
<Row Gutter="8">
<AntDesign.Col Span="16">
<AntDesign.Input Placeholder="Verification code" Size="large" @bind-Value="@context.Captcha">
<Prefix><Icon Type="mail" /></Prefix>
</AntDesign.Input>
</AntDesign.Col>
<AntDesign.Col Span="8">
<Button Size="large" Block OnClick="GetCaptcha">Verify</Button>
</AntDesign.Col>
</Row>
</FormItem>
</TabPane>
</Tabs>
<div>
<Checkbox Checked="@context.AutoLogin">
Auto Login
</Checkbox>
<a style="float: right;">
Forgot Password
</a>
</div>
<Button Type="primary" HtmlType="submit" Class="submit" Size="large" Block>Log in </Button>
<div class="other">
Other Login Methods
<Icon Class="icon" Type="alipay-circle" />
<Icon Class="icon" Type="taobao-circle" />
<Icon Class="icon" Type="weibo-circle" />
<a class="register" href="/user/register">Register Account</a>
</div>
</Form>
</div>
</div>

View File

@@ -1,36 +0,0 @@
using AntDesign;
using Microsoft.AspNetCore.Components;
using System.Threading.Tasks;
using AntSK.Models;
using AntSK.Services;
namespace AntSK.Pages.User
{
public partial class Login
{
private readonly LoginParamsType _model = new LoginParamsType();
[Inject] public NavigationManager NavigationManager { get; set; }
[Inject] public IAccountService AccountService { get; set; }
[Inject] public MessageService Message { get; set; }
public void HandleSubmit()
{
if (_model.UserName == "admin" && _model.Password == "ant.design")
{
NavigationManager.NavigateTo("/");
return;
}
if (_model.UserName == "user" && _model.Password == "ant.design") NavigationManager.NavigateTo("/");
}
public async Task GetCaptcha()
{
var captcha = await AccountService.GetCaptchaAsync(_model.Mobile);
await Message.Success($"Verification code validated successfully! The verification code is: {captcha}");
}
}
}

View File

@@ -1,30 +0,0 @@
@page "/"
@namespace AntSK.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{
Layout = null;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>AntSK</title>
<base href="~/" />
<link href="_content/AntDesign/css/ant-design-blazor.css" rel="stylesheet" />
<link href="_content/AntDesign.ProLayout/css/ant-design-pro-layout-blazor.css" rel="stylesheet" />
<link href="./css/site.css" rel="stylesheet" />
<link href="AntSK.styles.css" rel="stylesheet" />
</head>
<body>
<app>
<component type="typeof(App)" render-mode="Server" />
</app>
<script type="text/javascript" src="@("https://unpkg.com/@antv/g2plot@2.4.17/dist/g2plot.min.js")"></script>
<script src="_content/AntDesign/js/ant-design-blazor.js"></script>
<script src="_content/AntDesign.Charts/ant-design-charts-blazor.js"></script>
<script src="_framework/blazor.server.js"></script>
</body>
</html>

View File

@@ -1,14 +0,0 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>AntSK</name>
</assembly>
<members>
<member name="M:AntSK.Controllers.InitController.InitTable">
<summary>
初始化DB 和表
</summary>
<returns></returns>
</member>
</members>
</doc>

View File

@@ -1,26 +0,0 @@
[
{
"path": "/chat",
"name": "聊天",
"key": "chat",
"icon": "wechat"
},
{
"path": "/applist",
"name": "应用",
"key": "app",
"icon": "windows"
},
{
"path": "/kmslist",
"name": "知识库",
"key": "kms",
"icon": "database"
},
{
"path": "/setting",
"name": "设置",
"key": "setting",
"icon": "setting"
}
]

View File

@@ -1,13 +1,25 @@
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
# Build stage
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
# Copy csproj and restore as distinct layers
COPY ["src/AntSK/AntSK.csproj", "AntSK/"]
RUN dotnet restore "AntSK/AntSK.csproj"
# Copy everything else and build
COPY src/ .
WORKDIR "/src/AntSK"
RUN dotnet build "AntSK.csproj" -c Release -o /app/build
RUN dotnet publish "AntSK.csproj" -c Release -o /app/publish
# Runtime stage
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /service
EXPOSE 5000
WORKDIR /app
COPY ["AntSK/bin/Release/net8.0/publish", "publish"]
WORKDIR /app/publish
FROM base AS final
WORKDIR /app
COPY --from=build /app/publish .
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
ENTRYPOINT ["dotnet", "AntSK.dll"]
ENTRYPOINT ["dotnet", "AntSK.dll"]

View File

@@ -1,39 +1,42 @@
[简体中文](./README.md) | English
# AntSK
## Based on AI knowledge base/agent created by Net8+AntBlazor+SemanticKernel
## An AI knowledge base/intelligent agent built with .Net 8+AntBlazor+SemanticKernel
## Core functions
## Core Features
- **Semantic Kernel**: It uses advanced natural language processing technology to accurately understand, process and respond to complex semantic queries, and provides users with accurate information retrieval and recommendation services.
- **Semantic Kernel**: Utilizes advanced natural language processing technologies to accurately understand, process, and respond to complex semantic queries, providing users with precise information retrieval and recommendation services.
- **Kernel Memory**: It has the ability to continuously learn and store knowledge points. AntSK has a long-term memory function to accumulate experience and provide a more personalized interactive experience.
- **Kernel Memory**: Capable of continuous learning and knowledge storage, AntSK has a long-term memory function, accumulating experience to offer more personalized interaction experiences.
- **Knowledge base**: Knowledge base documents can be created by importing knowledge base documents (Word, PDF, Excel, Txt, Markdown, Json, PPT) and other forms.
- **Knowledge base**: Import knowledge into the database through documents (Word, PDF, Excel, Txt, Markdown, Json, PPT) and manage knowledge base documents.
- **API plug-in system**: an open API plug-in system that allows third-party developers or service providers to easily integrate their services into AntSK and continuously enhance application functions.
- **GPTs Generation**The platform supports the creation of personalized GPT models, try building your own GPT model.
- **Online search**: AntSK can obtain the latest information in real time to ensure that the information received by users is always the most timely and relevant.
- **API Interface Release**: Internal functions are provided as APIs for developers to integrate AntSK into other applications, enhancing application intelligence.
- **GPTs generation**: This platform supports the creation of personalized GPT models and attempts to build your own GPT models.
- **API Plugin System**: An open API plugin system allows third-party developers or service providers to easily integrate their services into AntSK, continuously enhancing application functions.
- **.Net Plugin System**: An open dll plugin system allows third-party developers or service providers to integrate their business functions into AntSK by generating dlls with the standard format codes, continuously enhancing application functions.
- **API interface publishing**: internal functions are provided externally in the form of API, so that developers can easily translate Xzy AntSK KnowledgeBase is integrated into other applications to enhance application intelligence.
- **Internet Search**: AntSK can retrieve the latest information in real-time, ensuring that the information users receive is always timely and relevant.
- **Model management**: Adapts and manages different models from various manufacturers. It also supports offline running of models in 'gguf' format supported by llama.cpp.
- **National Information Creation**: AntSK supports domestic models and databases, and can operate under information creation conditions.
@@ -41,11 +44,11 @@
AntSK is applicable to a variety of business scenarios, such as:
AntSK is suitable for various business scenarios, such as:
- Enterprise level knowledge management system
- Corporate knowledge management systems
- Automatic customer service and chat robot
- Automated customer service and chatbots
- Enterprise Search Engine
@@ -55,7 +58,7 @@ AntSK is applicable to a variety of business scenarios, such as:
- Education and online learning platform
- Other interesting AI Apps
- Other interesting AI applications
@@ -113,47 +116,122 @@ Let's see the effect
## How do I get started?
Here I am using Postgres as a data and vector store, because the Semantic Kernel and Kernel Memory both support it, though you can switch to others.
The model by default supports local models in 'gguf' format from openai, azure openai, and llama. If you need to use other models, you can integrate them using the one-api.
Here I use Postgres as data storage and vector storage, because both the Semantic Kernel and Kernel Memory support it. Of course, you can switch to other ones.
The login configuration in the configuration file is the default account and password.
The model supports openai by default. If you need to use azure openai and need to adjust the dependency injection of SK, you can also use one api for integration.
The following configuration files are needed:
The following configuration files need to be configured
## Using Docker Compose
A appsettings.json for the pg version and a simplified version (Sqlite+disk) docker-compose.simple.yml are provided.
Download docker-compose.yml from the project root directory, then place the configuration file appsettings.json in the same directory,
The pg image has already been prepared. You can modify the default account and password in the docker-compose.yml, and then your appsettings.json database connection needs to be consistent.
Then you can enter the directory and execute
```
docker compose up - d
```
to start AntSK.
How to mount local models and model download directories in docker
```
# Non-host version, does not use local proxy
version: '3.8'
services:
antsk:
container_name: antsk
image: registry.cn-hangzhou.aliyuncs.com/xuzeyu91/antsk:v0.2.1
ports:
- 5000:5000
networks:
- antsk
depends_on:
- antskpg
restart: always
environment:
- ASPNETCORE_URLS=http://*:5000
volumes:
- ./appsettings.json:/app/appsettings.json # local configuration file must be placed in the same directory
- D://model:/app/model
networks:
antsk:
```
Using this as an example, the meaning is to mount the local folder D://model from Windows into the container /app/model. If so, your appsettings.json model directory should be configured as
```
model/xxx.gguf
```
Some meanings of the configuration file
// (The rest of the information is omitted as it's unnecessary for the translation example context.)
Solving the missing style issue:
Execute under AntSK/src/AntSK:
```
dotnet clean
dotnet build
dotnet publish "AntSK.csproj"
```
Then go to AntSK/src/AntSK/bin/Release/net8.0/publish
```
dotnet AntSK.dll
```
```
"ConnectionStrings":{
"Postgres": "Host=; Port=; Database=antsk; Username=; Password="
},
"OpenAIOption":{
"EndPoint": "",
"Key": "",
"Model": "",
"Embedding Model": """""
},
Postgres:{
"ConnectionString": "Host=; Port=; Database=antsk; Username=; Password=",
"TableNamePrefix": "km -"
{
"DBConnection": {
"DbType": "Sqlite",
"ConnectionStrings": "Data Source=AntSK.db;"
},
"KernelMemory": {
"VectorDb": "Disk",
"ConnectionString": "Host=;Port=;Database=antsk;Username=;Password=",
"TableNamePrefix": "km-"
},
"LLamaSharp": {
"RunType": "GPU",
"Chat": "D:\\Code\\AI\\AntBlazor\\model\\qwen1_5-1_8b-chat-q8_0.gguf",
"Embedding": "D:\\Code\\AI\\AntBlazor\\model\\qwen1_5-1_8b-chat-q8_0.gguf",
"FileDirectory": "D:\\Code\\AI\\AntBlazor\\model\\"
},
"Login": {
"User": "admin",
"Password": "xuzeyu"
},
"BackgroundTaskBroker": {
"ImportKMSTask": {
"WorkerCount": 1
}
}
}
```
I use CodeFirst mode. As long as the database link is configured, the table structure is automatically created
```
//Supports multiple databases, including SqlSugar, MySql, SqlServer, Sqlite, Oracle, PostgreSQL, Dm, Kdbndp, Oscar, MySqlConnector, Access, OpenGaussian, QuestDB, HG, ClickHouse, GBase, Odbc, OceanBaseForOracle, TDengine, GaussDB, OceanBase, Tidb, Vastbase, PolarDB, Custom
DBConnection DbType
//Connection string, corresponding strings need to be used according to different DB types
DBConnection ConnectionStrings
//The type of vector storage supports Postgres Disk Memory, where Postgres requires the configuration of ConnectionString
KernelMemory VectorDb
//The running mode used by the local model is GUP CPU. If using an online API, you can freely use one
LLamaSharp RunType
//The model path of the local session model should pay attention to distinguishing between Linux and Windows drive letters
LLamaSharp Chat
//The model path of the local vector model should pay attention to distinguishing between Linux and Windows drive letters
LLamaSharp Embedding
//Default administrator account password
Login
//The number of threads for importing asynchronous processing can be higher when using online APIs. Local models suggest 1, otherwise memory overflow and crash may occur
BackgroundTaskBroker ImportKMSTask WorkerCount
```
To learn more or start using**AntSK**, you can follow my public account and join the exchange group.

132
README.md
View File

@@ -10,13 +10,19 @@
- **知识库**通过文档Word、PDF、Excel、Txt、Markdown、Json、PPT等形式导入知识库可以进行知识库文档。
- **GPTs 生成**此平台支持创建个性化的GPT模型尝试构建您自己的GPT模型。
- **API接口发布**将内部功能以API的形式对外提供便于开发者将AntSK 集成进其他应用,增强应用智慧。
- **API插件系统**开放式API插件系统允许第三方开发者或服务商轻松将其服务集成到AntSK不断增强应用功能。
- **.Net插件系统**开放式dll插件系统允许第三方开发者或服务商轻松将其业务功能通过标准格式的代码生成dll后集成到AntSK不断增强应用功能。
- **联网搜索**AntSK实时获取最新信息确保用户接受到的资料总是最及时、最相关的。
- **GPTs 生成**此平台支持创建个性化的GPT模型尝试构建您自己的GPT模型。
- **模型管理**适配和管理集成不同厂商的不同模型。并且支持llama.cpp所支持的gguf类型的模型离线运行
- **API接口发布**将内部功能以API的形式对外提供便于开发者将Xzy.AntSK.KnowledgeBase 集成进其他应用,增强应用智慧。
- **国产信创**AntSK支持国产模型和国产数据库可以在信创条件下运行
## 应用场景
@@ -60,24 +66,123 @@ AntSK 适用于多种业务场景,例如:
## 如何开始?
在这里我使用的是Postgres 作为数据存储和向量存储因为Semantic Kernel和Kernel Memory都支持他当然你也可以换成其他的。
模型默认支持openai,如果需要使用azure openai需要调整SK的依赖注入也可以使用one-api进行集成。
模型默认支持openai、azure openai 和llama支持的gguf本地模型,如果需要使用其他模型可以使用one-api进行集成。
配置文件中的Login配置是默认的登陆账号和密码
需要配置如下的配置文件
## 使用docker-compose
提供了pg版本 **appsettings.json** 和 简化版本Sqlite+disk **docker-compose.simple.yml**
从项目根目录下载**docker-compose.yml**,然后把配置文件**appsettings.json**和它放在统一目录,
这里已经把pg的镜像做好了。在docker-compose.yml中可以修改默认账号密码然后你的**appsettings.json**的数据库连接需要保持一致。
然后你可以进入到目录后执行
```
"ConnectionStrings": {
"Postgres": "Host=;Port=;Database=antsk;Username=;Password="
docker-compose up -d
```
来启动AntSK
## 如何在docker中挂载本地模型和模型下载的目录
```
# 非 host 版本, 不使用本机代理
version: '3.8'
services:
antsk:
container_name: antsk
image: registry.cn-hangzhou.aliyuncs.com/xuzeyu91/antsk:v0.1.5
ports:
- 5000:5000
networks:
- antsk
depends_on:
- antskpg
restart: always
environment:
- ASPNETCORE_URLS=http://*:5000
volumes:
- ./appsettings.json:/app/appsettings.json # 本地配置文件 需要放在同级目录
- D://model:/app/model
networks:
antsk:
```
以这个为示例意思是把windows本地D://model的文件夹挂载进 容器内/app/model 如果是这样你的appsettings.json中的模型地址应该配置为
```
model/xxx.gguf
```
## 配置文件的一些含义
```
{
"DBConnection": {
"DbType": "Sqlite",
"ConnectionStrings": "Data Source=AntSK.db;"
},
"OpenAIOption": {
"EndPoint": "",
"Key": "",
"Model": "",
"EmbeddingModel": ""
},
"Postgres": {
"KernelMemory": {
"VectorDb": "Disk",
"ConnectionString": "Host=;Port=;Database=antsk;Username=;Password=",
"TableNamePrefix": "km-"
},
"LLamaSharp": {
"RunType": "GPU",
"Chat": "D:\\Code\\AI\\AntBlazor\\model\\qwen1_5-1_8b-chat-q8_0.gguf",
"Embedding": "D:\\Code\\AI\\AntBlazor\\model\\qwen1_5-1_8b-chat-q8_0.gguf",
"FileDirectory": "D:\\Code\\AI\\AntBlazor\\model\\"
},
"Login": {
"User": "admin",
"Password": "xuzeyu"
},
"BackgroundTaskBroker": {
"ImportKMSTask": {
"WorkerCount": 1
}
}
}
```
我使用的是CodeFirst模式只要配置好数据库链接表结构是自动创建的
```
//支持多种数据库具体可以查看SqlSugarMySqlSqlServerSqliteOraclePostgreSQLDmKdbndpOscarMySqlConnectorAccessOpenGaussQuestDBHGClickHouseGBaseOdbcOceanBaseForOracleTDengineGaussDBOceanBaseTidbVastbasePolarDBCustom
DBConnection.DbType
//连接字符串需要根据不同DB类型用对应的字符串
DBConnection.ConnectionStrings
//向量存储的类型,支持 Postgres Disk Memory 其中Postgres需要配置 ConnectionString
KernelMemory.VectorDb
//本地模型使用的运行方式 GUP CPU ,如果用在线API 这个随意使用一个即可
LLamaSharp.RunType
//本地会话模型的模型路径 注意区分linux和windows盘符不同
LLamaSharp.Chat
//本地向量模型的模型路径 注意区分linux和windows盘符不同
LLamaSharp.Embedding
//本地模型路径用于在选择llama时可以快速选择目录下的模型以及保存下载的模型
LLamaSharp.FileDirectory
//默认管理员账号密码
Login
//导入异步处理的线程数使用在线API可以高一点本地模型建议1 否则容易内存溢出崩掉
BackgroundTaskBroker.ImportKMSTask.WorkerCount
```
## 找不到样式问题解决:
AntSK/src/AntSK下执行:
```
dotnet clean
dotnet build
dotnet publish "AntSK.csproj"
```
再去AntSK/src/AntSK/bin/Release/net8.0/publish下
```
dotnet AntSK.dll
```
然后启动就有样式了
DB我使用的是CodeFirst模式只要配置好数据库链接表结构是自动创建的
想了解更多信息或开始使用 **AntSK**,可以关注我的公众号以及加入交流群。
@@ -89,3 +194,4 @@ AntSK 适用于多种业务场景,例如:
---
我们对您在**AntSK**的兴趣表示感谢,并期待与您携手共创智能化的未来!

17
docker-compose.simple.yml Normal file
View File

@@ -0,0 +1,17 @@
# 非 host 版本, 不使用本机代理
version: '3.8'
services:
antsk:
container_name: antsk
image: registry.cn-hangzhou.aliyuncs.com/xuzeyu91/antsk:v0.2.1
ports:
- 5000:5000
networks:
- antsk
restart: always
environment:
- ASPNETCORE_URLS=http://*:5000
volumes:
- ./appsettings.json:/app/appsettings.json # 本地配置文件 需要放在同级目录
networks:
antsk:

34
docker-compose.yml Normal file
View File

@@ -0,0 +1,34 @@
# 非 host 版本, 不使用本机代理
version: '3.8'
services:
antskpg:
image: registry.cn-hangzhou.aliyuncs.com/xuzeyu91/pg:v0.5.0
container_name: antskpg
restart: always
ports: # 生产环境建议不要暴露
- 5432:5432
networks:
- antsk
environment:
# 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果
- POSTGRES_USER=username
- POSTGRES_PASSWORD=password
- POSTGRES_DB=antsk
volumes:
- ./pg/data:/var/lib/postgresql/data
antsk:
container_name: antsk
image: registry.cn-hangzhou.aliyuncs.com/xuzeyu91/antsk:v0.2.1
ports:
- 5000:5000
networks:
- antsk
depends_on:
- antskpg
restart: always
environment:
- ASPNETCORE_URLS=http://*:5000
volumes:
- ./appsettings.json:/app/appsettings.json # 本地配置文件 需要放在同级目录
networks:
antsk:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 KiB

After

Width:  |  Height:  |  Size: 170 KiB

View File

@@ -0,0 +1,41 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<DocumentationFile>AntSK.Domain.xml</DocumentationFile>
<NoWarn>CA1050,CA1707,CA2007,VSTHRD111,CS1591,RCS1110,CA5394,SKEXP0001,SKEXP0002,SKEXP0003,SKEXP0004,SKEXP0010,SKEXP0011,,SKEXP0012,SKEXP0020,SKEXP0021,SKEXP0022,SKEXP0023,SKEXP0024,SKEXP0025,SKEXP0026,SKEXP0027,SKEXP0028,SKEXP0029,SKEXP0030,SKEXP0031,SKEXP0032,SKEXP0040,SKEXP0041,SKEXP0042,SKEXP0050,SKEXP0051,SKEXP0052,SKEXP0053,SKEXP0054,SKEXP0055,SKEXP0060,SKEXP0061,SKEXP0101,SKEXP0102</NoWarn>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AntDesign.Charts" Version="0.5.1" />
<PackageReference Include="AntDesign.ProLayout" Version="0.18.0" />
<PackageReference Include="AutoMapper" Version="8.1.0" />
<PackageReference Include="BCrypt.Net-Next" Version="4.0.3" />
<PackageReference Include="Markdig" Version="0.36.2" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="SqlSugarCore" Version="5.1.4.145" />
<PackageReference Include="System.Data.SQLite.Core" Version="1.0.118" />
<PackageReference Include="RestSharp" Version="110.2.0" />
<PackageReference Include="Microsoft.SemanticKernel" Version="1.6.2" />
<PackageReference Include="Microsoft.SemanticKernel.Core" Version="1.6.2" />
<PackageReference Include="Microsoft.SemanticKernel.Plugins.Core" Version="1.6.2-alpha" />
<PackageReference Include="Microsoft.KernelMemory.Core" Version="0.34.240313.1" />
<PackageReference Include="Microsoft.KernelMemory.MemoryDb.Postgres" Version="0.34.240313.1" />
<PackageReference Include="LLamaSharp" Version="0.10.0" />
<PackageReference Include="LLamaSharp.Backend.Cpu" Version="0.10.0" />
<PackageReference Include="LLamaSharp.Backend.Cuda12" Version="0.10.0" />
<PackageReference Include="LLamaSharp.kernel-memory" Version="0.10.0" />
<PackageReference Include="LLamaSharp.semantic-kernel" Version="0.10.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\AntSk.LLM\AntSK.LLM.csproj" />
<ProjectReference Include="..\MiddleWare\AntSK.BackgroundTask\AntSK.BackgroundTask.csproj" />
</ItemGroup>
</Project>

View File

@@ -32,7 +32,7 @@
瞬时
</summary>
</member>
<member name="M:AntSK.Domain.Map.MapperExtend.ToDTOList``1(System.Object)">
<member name="M:AntSK.Domain.Common.Map.MapperExtend.ToDTOList``1(System.Object)">
<summary>
Entity集合转DTO集合
</summary>
@@ -40,7 +40,7 @@
<param name="value"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Map.MapperExtend.ToDTO``1(System.Object)">
<member name="M:AntSK.Domain.Common.Map.MapperExtend.ToDTO``1(System.Object)">
<summary>
Entity转DTO
</summary>
@@ -48,40 +48,164 @@
<param name="value"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Map.MapperExtend.MapTo``1(System.Object,``0)">
<member name="T:AntSK.Domain.Domain.Model.Enum.AIType">
<summary>
给已有对象map,适合update场景如需过滤空值需要在AutoMapProfile 设置
AI类型
</summary>
<typeparam name="T"></typeparam>
<param name="self"></param>
<param name="result"></param>
<returns></returns>
</member>
<member name="P:AntSK.Domain.Model.PageList`1.PageIndex">
<member name="T:AntSK.Domain.Domain.Model.Enum.AIModelType">
<summary>
模型类型
</summary>
</member>
<member name="P:AntSK.Domain.Domain.Model.MessageInfo.IsSend">
<summary>
发送是true 接收是false
</summary>
</member>
<member name="P:AntSK.Domain.Domain.Model.PageList`1.PageIndex">
<summary>
当前页从1开始
</summary>
</member>
<member name="P:AntSK.Domain.Model.PageList`1.PageSize">
<member name="P:AntSK.Domain.Domain.Model.PageList`1.PageSize">
<summary>
每页数量
</summary>
</member>
<member name="P:AntSK.Domain.Model.PageList`1.TotalCount">
<member name="P:AntSK.Domain.Domain.Model.PageList`1.TotalCount">
<summary>
总数
</summary>
</member>
<member name="P:AntSK.Domain.Options.ConnectionOption.Sqlite">
<member name="F:AntSK.Domain.Domain.Other.LLamaConfig.dicLLamaWeights">
<summary>
避免模型重复加载,本地缓存
</summary>
</member>
<member name="M:AntSK.Domain.Domain.Service.ChatService.SendChatByAppAsync(AntSK.Domain.Repositories.Apps,System.String,System.String)">
<summary>
发送消息
</summary>
<param name="app"></param>
<param name="questions"></param>
<param name="history"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Domain.Service.FunctionService.SearchMarkedMethods">
<summary>
查询程序集中的方法委托后续利用Source Generators生成
</summary>
</member>
<member name="M:AntSK.Domain.Domain.Service.KernelService.GetKernelByApp(AntSK.Domain.Repositories.Apps)">
<summary>
获取kernel实例依赖注入不好按每个用户去Import不同的插件所以每次new一个新的kernel
</summary>
<param name="modelId"></param>
<param name="apiKey"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Domain.Service.KernelService.ImportFunctionsByApp(AntSK.Domain.Repositories.Apps,Microsoft.SemanticKernel.Kernel)">
<summary>
根据app配置的插件导入插件
</summary>
<param name="app"></param>
<param name="_kernel"></param>
</member>
<member name="M:AntSK.Domain.Domain.Service.KernelService.ImportApiFunction(AntSK.Domain.Repositories.Apps,System.Collections.Generic.List{Microsoft.SemanticKernel.KernelFunction})">
<summary>
导入API插件
</summary>
<param name="app"></param>
<param name="functions"></param>
</member>
<member name="M:AntSK.Domain.Domain.Service.KernelService.ImportNativeFunction(AntSK.Domain.Repositories.Apps,System.Collections.Generic.List{Microsoft.SemanticKernel.KernelFunction})">
<summary>
导入原生插件
</summary>
<param name="app"></param>
<param name="functions"></param>
</member>
<member name="M:AntSK.Domain.Domain.Service.KernelService.RegisterPluginsWithKernel(Microsoft.SemanticKernel.Kernel)">
<summary>
注册默认插件
</summary>
<param name="kernel"></param>
</member>
<member name="M:AntSK.Domain.Domain.Service.KernelService.HistorySummarize(Microsoft.SemanticKernel.Kernel,System.String,System.String)">
<summary>
会话总结
</summary>
<param name="_kernel"></param>
<param name="questions"></param>
<param name="history"></param>
<returns></returns>
</member>
<member name="P:AntSK.Domain.Options.DBConnectionOption.DbType">
<summary>
sqlite连接字符串
</summary>
</member>
<member name="P:AntSK.Domain.Options.ConnectionOption.Postgres">
<member name="P:AntSK.Domain.Options.DBConnectionOption.ConnectionStrings">
<summary>
pg链接字符串
</summary>
</member>
<member name="P:AntSK.Domain.Options.KernelMemoryOption.VectorDb">
<summary>
向量库
</summary>
</member>
<member name="P:AntSK.Domain.Options.KernelMemoryOption.ConnectionString">
<summary>
连接字符串
</summary>
</member>
<member name="P:AntSK.Domain.Options.KernelMemoryOption.TableNamePrefix">
<summary>
表前缀
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apis.Name">
<summary>
接口名称
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apis.Describe">
<summary>
接口描述
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apis.Url">
<summary>
接口地址
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apis.Method">
<summary>
请求方法
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apis.Query">
<summary>
QueryString参数
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apis.JsonBody">
<summary>
jsonBody 实体
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apis.InputPrompt">
<summary>
入参提示词
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apis.OutputPrompt">
<summary>
返回提示词
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apps.Name">
<summary>
名称
@@ -92,16 +216,61 @@
描述
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apps.Icon">
<summary>
图标
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apps.Type">
<summary>
类型
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apps.ChatModelID">
<summary>
会话模型ID
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apps.EmbeddingModelID">
<summary>
Embedding 模型Id
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apps.Temperature">
<summary>
温度
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apps.Prompt">
<summary>
提示词
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apps.ApiFunctionList">
<summary>
插件列表
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apps.NativeFunctionList">
<summary>
本地函数列表
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apps.KmsIdList">
<summary>
知识库ID列表
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Apps.SecretKey">
<summary>
API调用秘钥
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Funs.Path">
<summary>
接口描述
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.KmsDetails.FileName">
<summary>
文件名称
@@ -127,6 +296,11 @@
创建时间
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.KmsDetails.Status">
<summary>
状态
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Kmss.Icon">
<summary>
图标
@@ -142,6 +316,31 @@
会话模型
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Kmss.ChatModelID">
<summary>
会话模型ID
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Kmss.EmbeddingModelID">
<summary>
向量模型ID
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Kmss.MaxTokensPerParagraph">
<summary>
每个段落的最大标记数。
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Kmss.MaxTokensPerLine">
<summary>
每行,也就是每句话的最大标记数
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Kmss.OverlappingTokens">
<summary>
段落之间重叠标记的数量。
</summary>
</member>
<member name="M:AntSK.Domain.Repositories.Base.Repository`1.GetList">
<summary>
获取所有list
@@ -394,11 +593,66 @@
<param name="whereExpression"></param>
<returns></returns>
</member>
<member name="F:AntSK.Domain.Repositories.Base.SqlSugarHelper.Sqlite">
<member name="M:AntSK.Domain.Repositories.Base.SqlSugarHelper.SqlScope">
<summary>
sqlserver连接
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.AIModels.AIType">
<summary>
AI类型
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.AIModels.AIModelType">
<summary>
模型类型
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.AIModels.EndPoint">
<summary>
模型地址
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.AIModels.ModelName">
<summary>
模型名称
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.AIModels.ModelKey">
<summary>
模型秘钥
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.AIModels.ModelDescription">
<summary>
部署名azure需要使用
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Users.No">
<summary>
工号,用于登陆
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Users.Password">
<summary>
密码
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Users.Name">
<summary>
名称
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Users.Describe">
<summary>
备注
</summary>
</member>
<member name="P:AntSK.Domain.Repositories.Users.MenuRole">
<summary>
菜单权限
</summary>
</member>
<member name="M:AntSK.Domain.Utils.ConvertUtils.IsNull(System.Object)">
<summary>
判断是否为空为空返回true
@@ -489,5 +743,143 @@
<param name="stream"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.ConvertUtils.ToQueryString(System.Collections.Generic.Dictionary{System.String,System.String})">
<summary>
json参数转化querystring参数
</summary>
<param name="parameters"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.RepoFiles.SamplePluginsPath">
<summary>
Scan the local folders from the repo, looking for "samples/plugins" folder.
</summary>
<returns>The full path to samples/plugins</returns>
</member>
<member name="T:AntSK.Domain.Utils.XmlCommentHelper">
<summary>
注释辅助类
</summary>
</member>
<member name="M:AntSK.Domain.Utils.XmlCommentHelper.LoadAll">
<summary>
从当前dll文件中加载所有的xml文件
</summary>
</member>
<member name="M:AntSK.Domain.Utils.XmlCommentHelper.LoadXml(System.String[])">
<summary>
从xml中加载
</summary>
<param name="xmls"></param>
</member>
<member name="M:AntSK.Domain.Utils.XmlCommentHelper.Load(System.String[])">
<summary>
从文件中加载
</summary>
<param name="xmlFiles"></param>
</member>
<member name="M:AntSK.Domain.Utils.XmlCommentHelper.Load(System.IO.Stream[])">
<summary>
从流中加载
</summary>
<param name="streams"></param>
</member>
<member name="M:AntSK.Domain.Utils.XmlCommentHelper.GetTypeComment(System.Type,System.String,System.Boolean)">
<summary>
读取类型中的注释
</summary>
<param name="type">类型</param>
<param name="xPath">注释路径</param>
<param name="humanize">可读性优化(比如去掉xml标记)</param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.XmlCommentHelper.GetFieldOrPropertyComment(System.Reflection.MemberInfo,System.String,System.Boolean)">
<summary>
读取字段或者属性的注释
</summary>
<param name="fieldOrPropertyInfo">字段或者属性</param>
<param name="xPath">注释路径</param>
<param name="humanize">可读性优化(比如去掉xml标记)</param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.XmlCommentHelper.GetMethodComment(System.Reflection.MethodInfo,System.String,System.Boolean)">
<summary>
读取方法中的注释
</summary>
<param name="methodInfo">方法</param>
<param name="xPath">注释路径</param>
<param name="humanize">可读性优化(比如去掉xml标记)</param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.XmlCommentHelper.GetMethodReturnComment(System.Reflection.MethodInfo,System.Boolean)">
<summary>
读取方法中的返回值注释
</summary>
<param name="methodInfo">方法</param>
<param name="humanize">可读性优化(比如去掉xml标记)</param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.XmlCommentHelper.GetParameterComment(System.Reflection.ParameterInfo,System.Boolean)">
<summary>
读取参数的注释
</summary>
<param name="parameterInfo">参数</param>
<param name="humanize">可读性优化(比如去掉xml标记)</param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.XmlCommentHelper.GetParameterComments(System.Reflection.MethodInfo,System.Boolean)">
<summary>
读取方法的所有参数的注释
</summary>
<param name="methodInfo">方法</param>
<param name="humanize">可读性优化(比如去掉xml标记)</param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.XmlCommentHelper.GetComment(System.String,System.String,System.Boolean)">
<summary>
读取指定名称节点的注释
</summary>
<param name="name">节点名称</param>
<param name="xPath">注释路径</param>
<param name="humanize">可读性优化(比如去掉xml标记)</param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.XmlCommentHelper.GetSummary(System.String,System.Boolean)">
<summary>
读取指定节点的summary注释
</summary>
<param name="name">节点名称</param>
<param name="humanize">可读性优化(比如去掉xml标记)</param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.XmlCommentHelper.GetExample(System.String,System.Boolean)">
<summary>
读取指定节点的example注释
</summary>
<param name="name">节点名称</param>
<param name="humanize">可读性优化(比如去掉xml标记)</param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.XmlCommentHelper.GetMemberNameForMethod(System.Reflection.MethodInfo)">
<summary>
获取方法的节点名称
</summary>
<param name="method"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.XmlCommentHelper.GetMemberNameForType(System.Type)">
<summary>
获取类型的节点名称
</summary>
<param name="type"></param>
<returns></returns>
</member>
<member name="M:AntSK.Domain.Utils.XmlCommentHelper.GetMemberNameForFieldOrProperty(System.Reflection.MemberInfo)">
<summary>
获取字段或者属性的节点名称
</summary>
<param name="fieldOrPropertyInfo"></param>
<returns></returns>
</member>
</members>
</doc>

View File

@@ -0,0 +1,8 @@
namespace AntSK.Domain.Common
{
[AttributeUsage(AttributeTargets.Method)]
public class AntSkFunctionAttribute : Attribute
{
// 自定义的ActionAttribute
}
}

View File

@@ -1,10 +1,5 @@
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Common.DependencyInjection
{

View File

@@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Common.DependencyInjection
namespace AntSK.Domain.Common.DependencyInjection
{
public class ServiceDescriptionAttribute : Attribute
{

View File

@@ -0,0 +1,12 @@
using AutoMapper;
namespace AntSK.Domain.Common.Map
{
public class AutoMapProfile : Profile
{
public AutoMapProfile()
{
//CreateMap<PMP_BizCase_Main_Max, BizcaseQueryDTO>();
}
}
}

View File

@@ -0,0 +1,32 @@
namespace AntSK.Domain.Common.Map
{
public static class MapperExtend
{
/// <summary>
/// Entity集合转DTO集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
public static List<T> ToDTOList<T>(this object value)
{
if (value == null)
return new List<T>();
return AutoMapper.Mapper.Map<List<T>>(value);
}
/// <summary>
/// Entity转DTO
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
public static T ToDTO<T>(this object value)
{
if (value == null)
return default(T);
return AutoMapper.Mapper.Map<T>(value);
}
}
}

View File

@@ -1,12 +1,7 @@
using AutoMapper;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Map
namespace AntSK.Domain.Common.Map
{
public static class MapperRegister
{
@@ -16,7 +11,6 @@ namespace AntSK.Domain.Map
{
cfg.CreateMissingTypeMaps = true;
cfg.ValidateInlineMaps = false;
cfg.ShouldMapMethod = m => false;
cfg.AddProfile<AutoMapProfile>();
});
@@ -27,7 +21,6 @@ namespace AntSK.Domain.Map
{
cfg.CreateMissingTypeMaps = true;
cfg.ValidateInlineMaps = false;
cfg.ShouldMapMethod = m => false;
cfg.AddProfile<AutoMapProfile>();
});
}

View File

@@ -0,0 +1,18 @@
using AntSK.Domain.Domain.Model.Dto;
using AntSK.Domain.Repositories;
using Microsoft.SemanticKernel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Domain.Interface
{
public interface IChatService
{
IAsyncEnumerable<StreamingKernelContent> SendChatByAppAsync(Apps app, string questions, string history);
IAsyncEnumerable<StreamingKernelContent> SendKmsByAppAsync(Apps app, string questions, string history, string filePath, List<RelevantSource> relevantSources = null);
}
}

View File

@@ -0,0 +1,9 @@
using RestSharp;
namespace AntSK.Domain.Domain.Interface
{
public interface IHttpService
{
Task<RestResponse> PostAsync(string url, Object jsonBody);
}
}

View File

@@ -0,0 +1,9 @@
using AntSK.Domain.Domain.Model;
namespace AntSK.Domain.Domain.Interface
{
public interface IImportKMSService
{
void ImportKMSTask(ImportKMSTaskReq req);
}
}

View File

@@ -0,0 +1,24 @@
using AntDesign;
using AntSK.Domain.Domain.Model.Dto;
using AntSK.Domain.Repositories;
using Microsoft.KernelMemory;
namespace AntSK.Domain.Domain.Interface
{
public interface IKMService
{
MemoryServerless GetMemory(Apps app);
MemoryServerless GetMemoryByKMS(string kmsID, SearchClientConfig searchClientConfig = null);
Task<List<KMFile>> GetDocumentByFileID(string kmsId, string fileId);
Task<List<RelevantSource>> GetRelevantSourceList(string kmsIdListStr, string msg);
List<UploadFileItem> FileList { get; }
bool BeforeUpload(UploadFileItem file);
void OnSingleCompleted(UploadInfo fileinfo);
}
}

View File

@@ -0,0 +1,12 @@
using AntSK.Domain.Repositories;
using Microsoft.SemanticKernel;
namespace AntSK.Domain.Domain.Interface
{
public interface IKernelService
{
Kernel GetKernelByApp(Apps app);
void ImportFunctionsByApp(Apps app, Kernel _kernel);
Task<string> HistorySummarize(Kernel _kernel, string questions, string history);
}
}

View File

@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Domain.Model.Constant
{
public class KmsConstantcs
{
public const string KmsIdTag = "kmsid";
public const string KmsIndex = "kms";
public const string KmsSearchNull="知识库未搜索到相关内容";
}
}

View File

@@ -0,0 +1,14 @@
namespace AntSK.Domain.Domain.Model.Dto
{
public class KMFile
{
public string DocumentId { get; set; }
public string Text { get; set; }
public string? Url { get; set; }
public string LastUpdate { get; set; }
public string File { get; set; }
}
}

View File

@@ -0,0 +1,21 @@
namespace AntSK.Domain.Domain.Model.Dto.OpenAPI
{
public class OpenAIModel
{
public bool stream { get; set; } = false;
public List<OpenAIMessage> messages { get; set; }
}
public class OpenAIMessage
{
public string role { get; set; }
public string content { get; set; }
}
public class OpenAIEmbeddingModel
{
public List<string> input { get; set; }
}
}

View File

@@ -0,0 +1,66 @@
using Newtonsoft.Json;
namespace AntSK.Domain.Domain.Model.Dto.OpenAPI
{
public class OpenAIResult
{
public string id { get; set; } = Guid.NewGuid().ToString();
[JsonProperty("object")]
public string obj { get; set; } = "chat.completion";
public List<ChoicesModel> choices { get; set; }
public long created { get; set; }
}
public class ChoicesModel
{
public string finish_reason { get; set; } = "stop";
public int index { get; set; } = 0;
public OpenAIMessage message { get; set; }
}
public class OpenAIEmbeddingResult
{
[JsonProperty("object")]
public string obj { get; set; } = "list";
public string model { get; set; } = "ada";
public UsageModel usage { get; set; } = new UsageModel();
public List<DataModel> data { get; set; } = new List<DataModel>() { new DataModel() };
}
public class UsageModel
{
public long prompt_tokens { get; set; } = 0;
public long total_tokens { get; set; } = 0;
}
public class DataModel
{
[JsonProperty("object")]
public string obj { get; set; } = "embedding";
public int index { get; set; } = 0;
public List<float> embedding { get; set; }
}
public class OpenAIStreamResult
{
public string id { get; set; } = Guid.NewGuid().ToString();
[JsonProperty("object")]
public string obj { get; set; } = "chat.completion";
public List<StreamChoicesModel> choices { get; set; }
public long created { get; set; }
}
public class StreamChoicesModel
{
public int index { get; set; } = 0;
public OpenAIMessage delta { get; set; }
}
}

View File

@@ -0,0 +1,16 @@

namespace AntSK.Domain.Domain.Model.Dto
{
public class RelevantSource
{
public string SourceName { get; set; }
public string Text { get; set; }
public float Relevance { get; set; }
public override string ToString()
{
return $"[file:{SourceName};Relevance:{(Relevance * 100):F2}%]:{Text}";
}
}
}

View File

@@ -0,0 +1,37 @@
using System.ComponentModel.DataAnnotations;
namespace AntSK.Domain.Domain.Model.Enum
{
/// <summary>
/// AI类型
/// </summary>
public enum AIType
{
[Display(Name = "Open AI")]
OpenAI = 1,
[Display(Name = "Azure Open AI")]
AzureOpenAI = 2,
[Display(Name = "LLama本地模型")]
LLamaSharp = 3,
[Display(Name = "星火大模型")]
SparkDesk = 4,
[Display(Name = "灵积大模型")]
DashScope = 5,
[Display(Name = "模拟输出")]
Mock = 100,
}
/// <summary>
/// 模型类型
/// </summary>
public enum AIModelType
{
Chat = 1,
Embedding = 2,
}
}

View File

@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Domain.Model.Enum
{
public enum AppType
{
chat = 1,
kms = 2
}
}

View File

@@ -0,0 +1,8 @@
namespace AntSK.Domain.Domain.Model.Enum
{
public enum HttpMethodType
{
Get = 1,
Post = 2,
}
}

View File

@@ -0,0 +1,9 @@
namespace AntSK.Domain.Domain.Model.Enum
{
public enum ImportKmsStatus
{
Loadding = 0,
Success = 1,
Fail = 2
}
}

View File

@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Domain.Model.Fun
{
public class FunDto
{
public string Name { get; set; }
public string Description { get; set; }
public FunType FunType { get; set; }
}
public enum FunType
{
System=1,
Import=2
}
}

View File

@@ -0,0 +1,34 @@
using AntSK.Domain.Repositories;
namespace AntSK.Domain.Domain.Model
{
public class ImportKMSTaskDTO
{
public ImportType ImportType { get; set; }
public string KmsId { get; set; }
public string Url { get; set; } = "";
public string Text { get; set; } = "";
public string FilePath { get; set; } = "";
public string FileName { get; set; } = "";
}
public class ImportKMSTaskReq : ImportKMSTaskDTO
{
public KmsDetails KmsDetail { get; set; } = new KmsDetails();
}
public enum ImportType
{
File = 1,
Url = 2,
Text = 3
}
}

View File

@@ -0,0 +1,20 @@
namespace AntSK.Domain.Domain.Model
{
public class MessageInfo
{
public string ID { get; set; } = "";
public string Context { get; set; } = "";
public string HtmlAnswers { get; set; } = "";
/// <summary>
/// 发送是true 接收是false
/// </summary>
public bool IsSend { get; set; } = false;
public DateTime CreateTime { get; set; }
public string? FilePath { get; set; }
public string? FileName { get; set; }
}
}

View File

@@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Model
namespace AntSK.Domain.Domain.Model
{
public class PageList<T>
{

View File

@@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Domain.Model.hfmirror
{
public class HfModel
{
public List<HfModels> models { get; set; }
public int numItemsPerPage { get; set; }
public int numTotalItems { get; set; }
public int pageIndex { get; set; }
}
public class HfModels
{
public string Author { get; set; }
public HfAuthorData AuthorData { get; set; }
public int Downloads { get; set; }
public bool Gated { get; set; }
public string Id { get; set; }
public DateTime LastModified { get; set; }
public int Likes { get; set; }
public string PipelineTag { get; set; }
public bool Private { get; set; }
public string RepoType { get; set; }
public bool IsLikedByUser { get; set; }
}
public class HfAuthorData
{
public string AvatarUrl { get; set; }
public string Fullname { get; set; }
public string Name { get; set; }
public string Type { get; set; }
public bool IsHf { get; set; }
public bool IsEnterprise { get; set; }
}
}

View File

@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Domain.Model.hfmirror
{
public class HfModelDetail
{
public string Name { get; set; }
public string Size { get; set; }
public string Path { get; set; }
public string Time { get; set; }
}
}

View File

@@ -0,0 +1,41 @@
using AntSK.BackgroundTask;
using AntSK.Domain.Domain.Interface;
using AntSK.Domain.Domain.Model;
using Microsoft.Extensions.DependencyInjection;
namespace AntSK.Domain.Domain.Other
{
public class BackGroundTaskHandler : IBackgroundTaskHandler<ImportKMSTaskReq>
{
private readonly IServiceScopeFactory _scopeFactory;
public BackGroundTaskHandler(IServiceScopeFactory scopeFactory)
{
_scopeFactory = scopeFactory;
}
public async Task ExecuteAsync(ImportKMSTaskReq item)
{
using (var scope = _scopeFactory.CreateScope())
{
Console.WriteLine("ExecuteAsync.开始执行后台任务");
var importKMSService = scope.ServiceProvider.GetRequiredService<IImportKMSService>();
//不能使用异步
importKMSService.ImportKMSTask(item);
Console.WriteLine("ExecuteAsync.后台任务执行完成");
}
}
public Task OnFailed()
{
return Task.CompletedTask;
}
public Task OnSuccess()
{
return Task.CompletedTask;
}
}
}

View File

@@ -0,0 +1,44 @@
using LLama;
using LLama.Common;
using LLamaSharp.KernelMemory;
namespace AntSK.Domain.Domain.Other
{
public static class LLamaConfig
{
static object lockobj = new object();
/// <summary>
/// 避免模型重复加载,本地缓存
/// </summary>
static Dictionary<string, (LLamaWeights, ModelParams)> dicLLamaWeights = new Dictionary<string, (LLamaWeights, ModelParams)>();
public static (LLamaWeights, ModelParams) GetLLamaConfig(string modelPath, LLamaSharpConfig config = null)
{
lock (lockobj)
{
if (dicLLamaWeights.ContainsKey(modelPath))
{
return dicLLamaWeights.GetValueOrDefault(modelPath);
}
else
{
InferenceParams infParams = new() { AntiPrompts = ["\n\n"] };
LLamaSharpConfig lsConfig = new(modelPath) { DefaultInferenceParams = infParams };
if (config != null)
{
lsConfig = config;
}
var parameters = new ModelParams(lsConfig.ModelPath)
{
ContextSize = lsConfig?.ContextSize ?? 2048,
Seed = lsConfig?.Seed ?? 0,
GpuLayerCount = lsConfig?.GpuLayerCount ?? 10,
EmbeddingMode = true
};
var weights = LLamaWeights.LoadFromFile(parameters);
dicLLamaWeights.Add(modelPath, (weights, parameters));
return (weights, parameters);
}
}
}
}
}

View File

@@ -0,0 +1,102 @@
using AntSK.Domain.Common.DependencyInjection;
using AntSK.Domain.Domain.Interface;
using AntSK.Domain.Repositories;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using Microsoft.SemanticKernel;
using System.Text;
using AntSK.Domain.Utils;
using AntSK.Domain.Domain.Model.Dto;
using AntSK.Domain.Domain.Model.Constant;
using DocumentFormat.OpenXml.Drawing;
using System.Reflection.Metadata;
using Microsoft.KernelMemory;
using System.Collections.Generic;
using Markdig;
namespace AntSK.Domain.Domain.Service
{
[ServiceDescription(typeof(IChatService), ServiceLifetime.Scoped)]
public class ChatService(
IKernelService _kernelService,
IKMService _kMService,
IKmsDetails_Repositories _kmsDetails_Repositories
) : IChatService
{
/// <summary>
/// 发送消息
/// </summary>
/// <param name="app"></param>
/// <param name="questions"></param>
/// <param name="history"></param>
/// <returns></returns>
public async IAsyncEnumerable<StreamingKernelContent> SendChatByAppAsync(Apps app, string questions, string history)
{
if (string.IsNullOrEmpty(app.Prompt) || !app.Prompt.Contains("{{$input}}"))
{
//如果模板为空,给默认提示词
app.Prompt = app.Prompt.ConvertToString() + "{{$input}}";
}
var _kernel = _kernelService.GetKernelByApp(app);
var temperature = app.Temperature / 100;//存的是0~100需要缩小
OpenAIPromptExecutionSettings settings = new() { Temperature = temperature };
if (!string.IsNullOrEmpty(app.ApiFunctionList) || !string.IsNullOrEmpty(app.NativeFunctionList))//这里还需要加上本地插件的
{
_kernelService.ImportFunctionsByApp(app, _kernel);
settings.ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions;
}
var func = _kernel.CreateFunctionFromPrompt(app.Prompt, settings);
var chatResult = _kernel.InvokeStreamingAsync(function: func, arguments: new KernelArguments() { ["input"] = $"{history}{Environment.NewLine} user:{questions}" });
await foreach (var content in chatResult)
{
yield return content;
}
}
public async IAsyncEnumerable<StreamingKernelContent> SendKmsByAppAsync(Apps app, string questions, string history, string filePath, List<RelevantSource> relevantSources = null)
{
var relevantSourceList = await _kMService.GetRelevantSourceList(app.KmsIdList, questions);
var _kernel = _kernelService.GetKernelByApp(app);
if (!string.IsNullOrWhiteSpace(filePath))
{
var memory = _kMService.GetMemory(app);
var fileId = Guid.NewGuid().ToString();
var result = await memory.ImportDocumentAsync(new Microsoft.KernelMemory.Document(fileId).AddFile(filePath)
.AddTag(KmsConstantcs.KmsIdTag, app.Id)
, index: KmsConstantcs.KmsIndex);
var filters = new MemoryFilter().ByTag(KmsConstantcs.KmsIdTag, app.Id);
var searchResult = await memory.SearchAsync(questions, index: KmsConstantcs.KmsIndex, filters: [filters]);
relevantSourceList.AddRange(searchResult.Results.SelectMany(item => item.Partitions.Select(part => new RelevantSource()
{
SourceName = item.SourceName,
Text = Markdown.ToHtml(part.Text),
Relevance = part.Relevance
})));
}
var dataMsg = new StringBuilder();
if (relevantSourceList.Any())
{
relevantSources?.AddRange(relevantSourceList);
foreach (var item in relevantSources)
{
dataMsg.AppendLine(item.ToString());
}
KernelFunction jsonFun = _kernel.Plugins.GetFunction("KMSPlugin", "Ask");
var chatResult = _kernel.InvokeStreamingAsync(function: jsonFun,
arguments: new KernelArguments() { ["doc"] = dataMsg, ["history"] = history, ["questions"] = questions });
await foreach (var content in chatResult)
{
yield return content;
}
}
else
{
yield return new StreamingTextContent(KmsConstantcs.KmsSearchNull);
}
}
}
}

View File

@@ -0,0 +1,122 @@
using System.ComponentModel;
using System.Reflection;
using System.Runtime.Loader;
using System.Xml;
using AntSK.Domain.Common;
using AntSK.Domain.Utils;
using System.Text.RegularExpressions;
using Microsoft.SemanticKernel;
using HtmlAgilityPack;
using System.Collections.Generic;
namespace AntSK.Domain.Domain.Service
{
public class FunctionService
{
private readonly Dictionary<string, MethodInfo> _methodCache;
private readonly Dictionary<string, (string Description, (Type ParameterType, string Description) ReturnType, (string ParameterName, Type ParameterType, string Description)[] Parameters)> _methodInfos;
private readonly IServiceProvider _serviceProvider;
private Assembly[] _assemblies;
private readonly AssemblyLoadContext loadContext;
public FunctionService(IServiceProvider serviceProvider, Assembly[] assemblies)
{
_methodCache = [];
_methodInfos = [];
_serviceProvider = serviceProvider;
_assemblies = assemblies;
loadContext = new AssemblyLoadContext("AntSKLoadContext", true);
}
public Dictionary<string, MethodInfo> Functions => _methodCache;
public Dictionary<string, (string Description, (Type ParameterType, string Description) ReturnType, (string ParameterName, Type ParameterType, string Description)[] Parameters)> MethodInfos => _methodInfos;
/// <summary>
/// 查询程序集中的方法委托后续利用Source Generators生成
/// </summary>
public void SearchMarkedMethods()
{
var markedMethods = new List<MethodInfo>();
_methodCache.Clear();
_methodInfos.Clear();
foreach (var assembly in _assemblies)
{
// 从缓存中获取标记了ActionAttribute的方法
foreach (var type in assembly.GetTypes())
{
markedMethods.AddRange(type.GetMethods().Where(m =>
{
DescriptionAttribute da = (DescriptionAttribute)m.GetCustomAttributes(typeof(DescriptionAttribute), true).FirstOrDefault();
return da != null && da.Description.Contains( "AntSK");
}));
}
}
//动态加载部分
var loadedAssemblies = loadContext.Assemblies.ToList();
foreach (var assembly in loadedAssemblies)
{
// 从缓存中获取标记了ActionAttribute的方法
foreach (var type in assembly.GetTypes())
{
markedMethods.AddRange(type.GetMethods().Where(m =>
{
DescriptionAttribute da = (DescriptionAttribute)m.GetCustomAttributes(typeof(DescriptionAttribute), true).FirstOrDefault();
return da != null && da.Description.Contains("AntSK");
}));
}
}
// 构建方法调用
foreach (var method in markedMethods)
{
var key = $"{method.DeclaringType.Assembly.GetName().Name}_{method.DeclaringType.Name}_{method.Name}";
string pattern = "[^a-zA-Z0-9_]";
// 使用 '-' 替换非ASCII的正则表达式的字符
key = Regex.Replace(key, pattern, "_");
_methodCache.TryAdd(key, method);
var description= method.GetCustomAttribute<DescriptionAttribute>().Description.ConvertToString().Replace("AntSK:","");
var returnType = method.ReturnParameter.GetCustomAttribute<DescriptionAttribute>().Description.ConvertToString();
var parameters = method.GetParameters().Select(x => (x.Name, x.ParameterType,x.GetCustomAttribute<DescriptionAttribute>()?.Description)).ToArray();
// 假设 _methodInfos 是一个已经定义好的字典,用来保存方法的相关信息
_methodInfos.TryAdd(key, (description, (method.ReflectedType, returnType), parameters));
}
}
public void FuncLoad(string pluginPath)
{
try
{
if (File.Exists(pluginPath))
{
string directory = Path.GetDirectoryName(pluginPath);
string fileName = Path.GetFileName(pluginPath);
var resolver = new AssemblyDependencyResolver(directory);
// Create a custom AssemblyLoadContext
loadContext.Resolving += (context, assemblyName) =>
{
string assemblyPath = resolver.ResolveAssemblyToPath(assemblyName);
if (assemblyPath != null)
{
return context.LoadFromAssemblyPath(assemblyPath);
}
return null;
};
// Load your assembly
Assembly pluginAssembly = loadContext.LoadFromAssemblyPath(pluginPath);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + " ---- " + ex.StackTrace);
}
}
}
}

View File

@@ -0,0 +1,21 @@
using AntSK.Domain.Common.DependencyInjection;
using AntSK.Domain.Domain.Interface;
using Newtonsoft.Json;
using RestSharp;
namespace AntSK.Domain.Domain.Service
{
[ServiceDescription(typeof(IHttpService), ServiceLifetime.Scoped)]
public class HttpService : IHttpService
{
public async Task<RestResponse> PostAsync(string url, Object jsonBody)
{
RestClient client = new RestClient();
RestRequest request = new RestRequest(url, Method.Post);
string josn = JsonConvert.SerializeObject(jsonBody);
request.AddJsonBody(jsonBody);
var result = await client.ExecuteAsync(request);
return result;
}
}
}

View File

@@ -0,0 +1,81 @@
using AntSK.Domain.Common.DependencyInjection;
using AntSK.Domain.Domain.Interface;
using AntSK.Domain.Domain.Model;
using AntSK.Domain.Domain.Model.Constant;
using AntSK.Domain.Repositories;
using Microsoft.KernelMemory;
namespace AntSK.Domain.Domain.Service
{
[ServiceDescription(typeof(IImportKMSService), ServiceLifetime.Scoped)]
public class ImportKMSService(
IKMService _kMService,
IKmsDetails_Repositories _kmsDetails_Repositories,
IKmss_Repositories _kmss_Repositories
) : IImportKMSService
{
public void ImportKMSTask(ImportKMSTaskReq req)
{
try
{
var km = _kmss_Repositories.GetFirst(p => p.Id == req.KmsId);
var _memory = _kMService.GetMemoryByKMS(km.Id);
string fileid = req.KmsDetail.Id;
switch (req.ImportType)
{
case ImportType.File:
//导入文件
{
var importResult = _memory.ImportDocumentAsync(new Document(fileid)
.AddFile(req.FilePath)
.AddTag(KmsConstantcs.KmsIdTag, req.KmsId)
, index: KmsConstantcs.KmsIndex).Result;
//查询文档数量
var docTextList = _kMService.GetDocumentByFileID(km.Id, fileid).Result;
string fileGuidName = Path.GetFileName(req.FilePath);
req.KmsDetail.FileName = req.FileName;
req.KmsDetail.FileGuidName = fileGuidName;
req.KmsDetail.DataCount = docTextList.Count;
}
break;
case ImportType.Url:
{
//导入url
var importResult = _memory.ImportWebPageAsync(req.Url, fileid, new TagCollection() { { KmsConstantcs.KmsIdTag, req.KmsId } }
, index: KmsConstantcs.KmsIndex).Result;
//查询文档数量
var docTextList = _kMService.GetDocumentByFileID(km.Id, fileid).Result;
req.KmsDetail.Url = req.Url;
req.KmsDetail.DataCount = docTextList.Count;
}
break;
case ImportType.Text:
//导入文本
{
var importResult = _memory.ImportTextAsync(req.Text, fileid, new TagCollection() { { KmsConstantcs.KmsIdTag, req.KmsId } }
, index: KmsConstantcs.KmsIndex).Result;
//查询文档数量
var docTextList = _kMService.GetDocumentByFileID(km.Id, fileid).Result;
req.KmsDetail.Url = req.Url;
req.KmsDetail.DataCount = docTextList.Count;
}
break;
}
req.KmsDetail.Status = Model.Enum.ImportKmsStatus.Success;
_kmsDetails_Repositories.Update(req.KmsDetail);
//_kmsDetails_Repositories.GetList(p => p.KmsId == req.KmsId);
Console.WriteLine("后台导入任务成功:" + req.KmsDetail.DataCount);
}
catch (Exception ex)
{
req.KmsDetail.Status = Model.Enum.ImportKmsStatus.Fail;
_kmsDetails_Repositories.Update(req.KmsDetail);
Console.WriteLine("后台导入任务异常:" + ex.Message);
}
}
}
}

View File

@@ -0,0 +1,325 @@
using AntDesign;
using AntSK.Domain.Common.DependencyInjection;
using AntSK.Domain.Domain.Interface;
using AntSK.Domain.Domain.Model.Constant;
using AntSK.Domain.Domain.Model.Dto;
using AntSK.Domain.Domain.Other;
using AntSK.Domain.Options;
using AntSK.Domain.Repositories;
using AntSK.Domain.Utils;
using DocumentFormat.OpenXml.Drawing.Diagrams;
using LLama;
using LLamaSharp.KernelMemory;
using Markdig;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Configuration;
using Microsoft.KernelMemory;
using Microsoft.KernelMemory.Configuration;
using Microsoft.KernelMemory.FileSystem.DevTools;
using Microsoft.KernelMemory.MemoryStorage;
using Microsoft.KernelMemory.MemoryStorage.DevTools;
using Microsoft.KernelMemory.Postgres;
namespace AntSK.Domain.Domain.Service
{
[ServiceDescription(typeof(IKMService), ServiceLifetime.Scoped)]
public class KMService(
IKmss_Repositories _kmss_Repositories,
IAIModels_Repositories _aIModels_Repositories,
IMessageService? _message
) : IKMService
{
private MemoryServerless _memory;
private List<UploadFileItem> _fileList = [];
public List<UploadFileItem> FileList => _fileList;
public MemoryServerless GetMemory(Apps app)
{
var chatModel = _aIModels_Repositories.GetFirst(p => p.Id == app.ChatModelID);
var embedModel = _aIModels_Repositories.GetFirst(p => p.Id == app.EmbeddingModelID);
var chatHttpClient = OpenAIHttpClientHandlerUtil.GetHttpClient(chatModel.EndPoint);
var embeddingHttpClient = OpenAIHttpClientHandlerUtil.GetHttpClient(embedModel.EndPoint);
var searchClientConfig = new SearchClientConfig
{
MaxAskPromptSize = 2048,
MaxMatchesCount = 3,
AnswerTokens = 1000,
EmptyAnswer = KmsConstantcs.KmsSearchNull
};
var memoryBuild = new KernelMemoryBuilder()
.WithSearchClientConfig(searchClientConfig)
//.WithCustomTextPartitioningOptions(new TextPartitioningOptions
//{
// MaxTokensPerLine = app.MaxTokensPerLine,
// MaxTokensPerParagraph = kms.MaxTokensPerParagraph,
// OverlappingTokens = kms.OverlappingTokens
//})
;
//加载会话模型
WithTextGenerationByAIType(memoryBuild, chatModel, chatHttpClient);
//加载向量模型
WithTextEmbeddingGenerationByAIType(memoryBuild, embedModel, embeddingHttpClient);
//加载向量库
WithMemoryDbByVectorDB(memoryBuild);
_memory = memoryBuild.Build<MemoryServerless>();
return _memory;
}
public MemoryServerless GetMemoryByKMS(string kmsID, SearchClientConfig searchClientConfig = null)
{
//if (_memory.IsNull())
{
//获取KMS配置
var kms = _kmss_Repositories.GetFirst(p => p.Id == kmsID);
var chatModel = _aIModels_Repositories.GetFirst(p => p.Id == kms.ChatModelID);
var embedModel = _aIModels_Repositories.GetFirst(p => p.Id == kms.EmbeddingModelID);
//http代理
var chatHttpClient = OpenAIHttpClientHandlerUtil.GetHttpClient(chatModel.EndPoint);
var embeddingHttpClient = OpenAIHttpClientHandlerUtil.GetHttpClient(embedModel.EndPoint);
//搜索配置
if (searchClientConfig.IsNull())
{
searchClientConfig = new SearchClientConfig
{
MaxAskPromptSize = 2048,
MaxMatchesCount = 3,
AnswerTokens = 1000,
EmptyAnswer = KmsConstantcs.KmsSearchNull
};
}
var memoryBuild = new KernelMemoryBuilder()
.WithSearchClientConfig(searchClientConfig)
.WithCustomTextPartitioningOptions(new TextPartitioningOptions
{
MaxTokensPerLine = kms.MaxTokensPerLine,
MaxTokensPerParagraph = kms.MaxTokensPerParagraph,
OverlappingTokens = kms.OverlappingTokens
});
//加载会话模型
WithTextGenerationByAIType(memoryBuild, chatModel, chatHttpClient);
//加载向量模型
WithTextEmbeddingGenerationByAIType(memoryBuild, embedModel, embeddingHttpClient);
//加载向量库
WithMemoryDbByVectorDB(memoryBuild);
_memory = memoryBuild.Build<MemoryServerless>();
return _memory;
}
//else {
// return _memory;
//}
}
private void WithTextEmbeddingGenerationByAIType(IKernelMemoryBuilder memory, AIModels embedModel,
HttpClient embeddingHttpClient)
{
switch (embedModel.AIType)
{
case Model.Enum.AIType.OpenAI:
memory.WithOpenAITextEmbeddingGeneration(new OpenAIConfig()
{
APIKey = embedModel.ModelKey,
EmbeddingModel = embedModel.ModelName
}, null, false, embeddingHttpClient);
break;
case Model.Enum.AIType.AzureOpenAI:
memory.WithAzureOpenAITextEmbeddingGeneration(new AzureOpenAIConfig()
{
APIKey = embedModel.ModelKey,
Deployment = embedModel.ModelName.ConvertToString(),
Endpoint = embedModel.EndPoint.ConvertToString(),
Auth = AzureOpenAIConfig.AuthTypes.APIKey,
APIType = AzureOpenAIConfig.APITypes.EmbeddingGeneration,
});
break;
case Model.Enum.AIType.LLamaSharp:
var (weights, parameters) = LLamaConfig.GetLLamaConfig(embedModel.ModelName);
var embedder = new LLamaEmbedder(weights, parameters);
memory.WithLLamaSharpTextEmbeddingGeneration(new LLamaSharpTextEmbeddingGenerator(embedder));
break;
case Model.Enum.AIType.DashScope:
memory.WithDashScopeDefaults(embedModel.ModelKey);
break;
}
}
private void WithTextGenerationByAIType(IKernelMemoryBuilder memory, AIModels chatModel,
HttpClient chatHttpClient)
{
switch (chatModel.AIType)
{
case Model.Enum.AIType.OpenAI:
memory.WithOpenAITextGeneration(new OpenAIConfig()
{
APIKey = chatModel.ModelKey,
TextModel = chatModel.ModelName
}, null, chatHttpClient);
break;
case Model.Enum.AIType.AzureOpenAI:
memory.WithAzureOpenAITextGeneration(new AzureOpenAIConfig()
{
APIKey = chatModel.ModelKey,
Deployment = chatModel.ModelName.ConvertToString(),
Endpoint = chatModel.EndPoint.ConvertToString(),
Auth = AzureOpenAIConfig.AuthTypes.APIKey,
APIType = AzureOpenAIConfig.APITypes.TextCompletion,
});
break;
case Model.Enum.AIType.LLamaSharp:
var (weights, parameters) = LLamaConfig.GetLLamaConfig(chatModel.ModelName);
var context = weights.CreateContext(parameters);
var executor = new StatelessExecutor(weights, parameters);
memory.WithLLamaSharpTextGeneration(new LlamaSharpTextGenerator(weights, context, executor));
break;
case Model.Enum.AIType.DashScope:
memory.WithDashScopeTextGeneration(new Cnblogs.KernelMemory.AI.DashScope.DashScopeConfig
{
ApiKey = chatModel.ModelKey,
});
break;
}
}
private void WithMemoryDbByVectorDB(IKernelMemoryBuilder memory)
{
string VectorDb = KernelMemoryOption.VectorDb.ConvertToString();
string ConnectionString = KernelMemoryOption.ConnectionString.ConvertToString();
string TableNamePrefix = KernelMemoryOption.TableNamePrefix.ConvertToString();
switch (VectorDb)
{
case "Postgres":
memory.WithPostgresMemoryDb(new PostgresConfig()
{
ConnectionString = ConnectionString,
TableNamePrefix = TableNamePrefix
});
break;
case "Disk":
memory.WithSimpleVectorDb(new SimpleVectorDbConfig()
{
StorageType = FileSystemTypes.Disk,
});
break;
case "Memory":
memory.WithSimpleVectorDb(new SimpleVectorDbConfig()
{
StorageType = FileSystemTypes.Volatile
});
break;
}
}
public async Task<List<KMFile>> GetDocumentByFileID(string kmsId, string fileId)
{
var memory = GetMemoryByKMS(kmsId);
var memories = await memory.ListIndexesAsync();
var memoryDbs = memory.Orchestrator.GetMemoryDbs();
var docTextList = new List<KMFile>();
foreach (var memoryIndex in memories)
{
foreach (var memoryDb in memoryDbs)
{
var items = await memoryDb.GetListAsync(memoryIndex.Name, new List<MemoryFilter>() { new MemoryFilter().ByDocument(fileId) }, 100, true).ToListAsync();
docTextList.AddRange(items.Select(item => new KMFile()
{
DocumentId = item.GetDocumentId(),
Text = item.GetPartitionText(),
Url = item.GetWebPageUrl(),
LastUpdate = item.GetLastUpdate().LocalDateTime.ToString("yyyy-MM-dd HH:mm:ss"),
File = item.GetFileName()
}));
}
}
return docTextList;
}
public async Task<List<RelevantSource>> GetRelevantSourceList(string kmsIdListStr, string msg)
{
var result = new List<RelevantSource>();
if (string.IsNullOrWhiteSpace(kmsIdListStr))
return result;
var kmsIdList = kmsIdListStr.Split(",");
if (!kmsIdList.Any()) return result;
var memory = GetMemoryByKMS(kmsIdList.FirstOrDefault()!);
var filters = kmsIdList.Select(kmsId => new MemoryFilter().ByTag(KmsConstantcs.KmsIdTag, kmsId)).ToList();
var searchResult = await memory.SearchAsync(msg, index: KmsConstantcs.KmsIndex, filters: filters);
if (!searchResult.NoResult)
{
foreach (var item in searchResult.Results)
{
result.AddRange(item.Partitions.Select(part => new RelevantSource()
{
SourceName = item.SourceName,
Text = Markdown.ToHtml(part.Text),
Relevance = part.Relevance
}));
}
}
return result;
}
public bool BeforeUpload(UploadFileItem file)
{
List<string> types = new List<string>() {
"text/plain",
"application/msword",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"application/vnd.ms-excel",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"application/vnd.ms-powerpoint",
"application/vnd.openxmlformats-officedocument.presentationml.presentation",
"application/pdf",
"application/json",
"text/x-markdown",
"text/markdown"
};
string[] exceptExts = [".md", ".pdf"];
var validTypes = types.Contains(file.Type) || exceptExts.Contains(file.Ext);
if (!validTypes && file.Ext != ".md")
{
_message.Error("文件格式错误,请重新选择!");
}
var IsLt500K = file.Size < 1024 * 1024 * 100;
if (!IsLt500K)
{
_message.Error("文件需不大于100MB!");
}
return validTypes && IsLt500K;
}
public void OnSingleCompleted(UploadInfo fileinfo)
{
if (fileinfo.File.State == UploadState.Success)
{
//文件列表
_fileList.Add(new UploadFileItem()
{
FileName = fileinfo.File.FileName,
Url = fileinfo.File.Url = fileinfo.File.Response
});
}
}
}
}

View File

@@ -0,0 +1,286 @@
using AntSK.LLM.SparkDesk;
using AntSK.Domain.Common.DependencyInjection;
using AntSK.Domain.Domain.Interface;
using AntSK.Domain.Domain.Other;
using AntSK.Domain.Repositories;
using AntSK.Domain.Utils;
using LLama;
using LLamaSharp.SemanticKernel.TextCompletion;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Plugins.Core;
using Microsoft.SemanticKernel.TextGeneration;
using RestSharp;
using System;
using ServiceLifetime = AntSK.Domain.Common.DependencyInjection.ServiceLifetime;
using AntSK.LLM.Mock;
using AntSK.Domain.Domain.Model.Enum;
using System.Reflection;
using DocumentFormat.OpenXml.Drawing;
namespace AntSK.Domain.Domain.Service
{
[ServiceDescription(typeof(IKernelService), ServiceLifetime.Scoped)]
public class KernelService : IKernelService
{
private readonly IApis_Repositories _apis_Repositories;
private readonly IAIModels_Repositories _aIModels_Repositories;
private readonly FunctionService _functionService;
private readonly IServiceProvider _serviceProvider;
private Kernel _kernel;
public KernelService(
IApis_Repositories apis_Repositories,
IAIModels_Repositories aIModels_Repositories,
FunctionService functionService,
IServiceProvider serviceProvider)
{
_apis_Repositories = apis_Repositories;
_aIModels_Repositories = aIModels_Repositories;
_functionService = functionService;
_serviceProvider = serviceProvider;
}
/// <summary>
/// 获取kernel实例依赖注入不好按每个用户去Import不同的插件所以每次new一个新的kernel
/// </summary>
/// <param name="modelId"></param>
/// <param name="apiKey"></param>
/// <returns></returns>
public Kernel GetKernelByApp(Apps app)
{
//if (_kernel.IsNull())
{
var chatModel = _aIModels_Repositories.GetFirst(p => p.Id == app.ChatModelID);
var chatHttpClient = OpenAIHttpClientHandlerUtil.GetHttpClient(chatModel.EndPoint);
var builder = Kernel.CreateBuilder();
WithTextGenerationByAIType(builder, app, chatModel, chatHttpClient);
_kernel = builder.Build();
RegisterPluginsWithKernel(_kernel);
return _kernel;
}
//else
//{
// return _kernel;
//}
}
private void WithTextGenerationByAIType(IKernelBuilder builder, Apps app, AIModels chatModel, HttpClient chatHttpClient)
{
switch (chatModel.AIType)
{
case Model.Enum.AIType.OpenAI:
builder.AddOpenAIChatCompletion(
modelId: chatModel.ModelName,
apiKey: chatModel.ModelKey,
httpClient: chatHttpClient);
break;
case Model.Enum.AIType.AzureOpenAI:
builder.AddAzureOpenAIChatCompletion(
deploymentName: chatModel.ModelName,
apiKey: chatModel.ModelKey,
endpoint: chatModel.EndPoint
);
break;
case Model.Enum.AIType.LLamaSharp:
var (weights, parameters) = LLamaConfig.GetLLamaConfig(chatModel.ModelName);
var ex = new StatelessExecutor(weights, parameters);
builder.Services.AddKeyedSingleton<ITextGenerationService>("local-llama", new LLamaSharpTextCompletion(ex));
break;
case Model.Enum.AIType.SparkDesk:
var options = new SparkDeskOptions { AppId = chatModel.EndPoint, ApiSecret = chatModel.ModelKey, ApiKey = chatModel.ModelName, ModelVersion = Sdcb.SparkDesk.ModelVersion.V3_5 };
builder.Services.AddKeyedSingleton<ITextGenerationService>("spark-desk", new SparkDeskTextCompletion(options, app.Id));
break;
case Model.Enum.AIType.DashScope:
builder.Services.AddDashScopeChatCompletion(chatModel.ModelKey, chatModel.ModelName);
break;
case Model.Enum.AIType.Mock:
builder.Services.AddKeyedSingleton<ITextGenerationService>("mock", new MockTextCompletion());
break;
}
}
/// <summary>
/// 根据app配置的插件导入插件
/// </summary>
/// <param name="app"></param>
/// <param name="_kernel"></param>
public void ImportFunctionsByApp(Apps app, Kernel _kernel)
{
//插件不能重复注册,否则会异常
if (_kernel.Plugins.Any(p => p.Name == "AntSkFunctions"))
{
return;
}
List<KernelFunction> functions = new List<KernelFunction>();
//API插件
ImportApiFunction(app, functions);
//本地函数插件
ImportNativeFunction(app, functions);
_kernel.ImportPluginFromFunctions("AntSkFunctions", functions);
}
/// <summary>
/// 导入API插件
/// </summary>
/// <param name="app"></param>
/// <param name="functions"></param>
private void ImportApiFunction(Apps app, List<KernelFunction> functions)
{
if (!string.IsNullOrWhiteSpace(app.ApiFunctionList))
{
//开启自动插件调用
var apiIdList = app.ApiFunctionList.Split(",");
var apiList = _apis_Repositories.GetList(p => apiIdList.Contains(p.Id));
foreach (var api in apiList)
{
var returnType = new KernelReturnParameterMetadata() { Description = api.OutputPrompt };
switch (api.Method)
{
case HttpMethodType.Get:
var getParametes = new List<KernelParameterMetadata>() {
new KernelParameterMetadata("jsonbody"){
Name="json参数字符串",
ParameterType=typeof(string),
Description=$"需要根据背景文档:{Environment.NewLine}{api.InputPrompt} {Environment.NewLine}提取出对应的json格式字符串参考如下格式:{Environment.NewLine}{api.Query}"
}
};
functions.Add(_kernel.CreateFunctionFromMethod((string jsonbody) =>
{
try
{
//将json 转换为query参数
var queryString = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonbody);
RestClient client = new RestClient();
RestRequest request = new RestRequest(api.Url, Method.Get);
foreach (var header in api.Header.ConvertToString().Split("\n"))
{
var headerArray = header.Split(":");
if (headerArray.Length == 2)
{
request.AddHeader(headerArray[0], headerArray[1]);
}
}
//这里应该还要处理一次参数提取,等后面再迭代
foreach (var q in queryString)
{
request.AddQueryParameter(q.Key, q.Value);
}
var result = client.Execute(request);
return result.Content;
}
catch (System.Exception ex)
{
return "调用失败:" + ex.Message;
}
}, api.Name, api.Describe, getParametes, returnType));
break;
case HttpMethodType.Post:
//处理json body
var postParametes = new List<KernelParameterMetadata>() {
new KernelParameterMetadata("jsonbody"){
Name="json参数字符串",
ParameterType=typeof(string),
Description=$"需要根据背景文档:{Environment.NewLine}{api.InputPrompt} {Environment.NewLine}提取出对应的json格式字符串参考如下格式:{Environment.NewLine}{api.JsonBody}"
}
};
functions.Add(_kernel.CreateFunctionFromMethod((string jsonBody) =>
{
try
{
Console.WriteLine(jsonBody);
RestClient client = new RestClient();
RestRequest request = new RestRequest(api.Url, Method.Post);
foreach (var header in api.Header.ConvertToString().Split("\n"))
{
var headerArray = header.Split(":");
if (headerArray.Length == 2)
{
request.AddHeader(headerArray[0], headerArray[1]);
}
}
//这里应该还要处理一次参数提取,等后面再迭代
request.AddJsonBody(jsonBody.ConvertToString());
var result = client.Execute(request);
return result.Content;
}
catch (System.Exception ex)
{
return "调用失败:" + ex.Message;
}
}, api.Name, api.Describe, postParametes, returnType));
break;
}
}
}
}
/// <summary>
/// 导入原生插件
/// </summary>
/// <param name="app"></param>
/// <param name="functions"></param>
private void ImportNativeFunction(Apps app, List<KernelFunction> functions)
{
if (!string.IsNullOrWhiteSpace(app.NativeFunctionList))//需要添加判断应用是否开启了本地函数插件
{
var nativeIdList = app.NativeFunctionList.Split(",");
_functionService.SearchMarkedMethods();
using var scope = _serviceProvider.CreateScope();
foreach (var func in _functionService.Functions)
{
if (nativeIdList.Contains(func.Key))
{
var methodInfo = _functionService.MethodInfos[func.Key];
var parameters = methodInfo.Parameters.Select(x => new KernelParameterMetadata(x.ParameterName) { ParameterType = x.ParameterType, Description = x.Description });
var returnType = new KernelReturnParameterMetadata() { ParameterType = methodInfo.ReturnType.ParameterType, Description = methodInfo.ReturnType.Description };
var target = ActivatorUtilities.CreateInstance(scope.ServiceProvider, func.Value.DeclaringType);
functions.Add(_kernel.CreateFunctionFromMethod(func.Value, target, func.Key, methodInfo.Description, parameters, returnType));
}
}
}
}
/// <summary>
/// 注册默认插件
/// </summary>
/// <param name="kernel"></param>
private void RegisterPluginsWithKernel(Kernel kernel)
{
kernel.ImportPluginFromObject(new ConversationSummaryPlugin(), "ConversationSummaryPlugin");
//kernel.ImportPluginFromObject(new TimePlugin(), "TimePlugin");
kernel.ImportPluginFromPromptDirectory(System.IO.Path.Combine(RepoFiles.SamplePluginsPath(), "KMSPlugin"));
}
/// <summary>
/// 会话总结
/// </summary>
/// <param name="_kernel"></param>
/// <param name="questions"></param>
/// <param name="history"></param>
/// <returns></returns>
public async Task<string> HistorySummarize(Kernel _kernel, string questions, string history)
{
KernelFunction sunFun = _kernel.Plugins.GetFunction("ConversationSummaryPlugin", "SummarizeConversation");
var summary = await _kernel.InvokeAsync(sunFun, new() { ["input"] = $"内容是:{history.ToString()} {Environment.NewLine} 请注意用中文总结" });
string his = summary.GetValue<string>();
var msg = $"history{Environment.NewLine}{history.ToString()}{Environment.NewLine} user{questions}{Environment.NewLine}"; ;
return msg;
}
}
}

View File

@@ -0,0 +1,14 @@
namespace AntSK.Domain.Options
{
public class DBConnectionOption
{
/// <summary>
/// sqlite连接字符串
/// </summary>
public static string DbType { get; set; }
/// <summary>
/// pg链接字符串
/// </summary>
public static string ConnectionStrings { get; set; }
}
}

View File

@@ -0,0 +1,18 @@
namespace AntSK.Domain.Options
{
public class KernelMemoryOption
{
/// <summary>
/// 向量库
/// </summary>
public static string VectorDb { get; set; }
/// <summary>
/// 连接字符串
/// </summary>
public static string ConnectionString { get; set; }
/// <summary>
/// 表前缀
/// </summary>
public static string TableNamePrefix { get; set; }
}
}

View File

@@ -0,0 +1,12 @@
namespace AntSK.Domain.Options
{
public class LLamaSharpOption
{
public static string RunType { get; set; }
public static string Chat { get; set; }
public static string Embedding { get; set; }
public static string FileDirectory { get; set; } = Directory.GetCurrentDirectory();
}
}

View File

@@ -0,0 +1,9 @@
namespace AntSK.Domain.Options
{
public class LoginOption
{
public static string User { get; set; }
public static string Password { get; set; }
}
}

View File

@@ -0,0 +1,62 @@
using AntSK.Domain.Domain.Model.Enum;
using SqlSugar;
using System.ComponentModel.DataAnnotations;
namespace AntSK.Domain.Repositories
{
[SugarTable("Apis")]
public partial class Apis
{
[SugarColumn(IsPrimaryKey = true)]
public string Id { get; set; }
/// <summary>
/// 接口名称
/// </summary>
[Required]
public string Name { get; set; }
/// <summary>
/// 接口描述
/// </summary>
[Required]
public string Describe { get; set; }
/// <summary>
/// 接口地址
/// </summary>
[Required]
public string Url { get; set; }
/// <summary>
/// 请求方法
/// </summary>
[Required]
public HttpMethodType Method { get; set; }
[SugarColumn(ColumnDataType = "varchar(1000)")]
public string? Header { get; set; }
/// <summary>
/// QueryString参数
/// </summary>
[SugarColumn(ColumnDataType = "varchar(1000)")]
public string? Query { get; set; }
/// <summary>
/// jsonBody 实体
/// </summary>
[SugarColumn(ColumnDataType = "varchar(7000)")]
public string? JsonBody { get; set; }
/// <summary>
/// 入参提示词
/// </summary>
[Required]
[SugarColumn(ColumnDataType = "varchar(1500)")]
public string InputPrompt { get; set; }
/// <summary>
/// 返回提示词
/// </summary>
[Required]
[SugarColumn(ColumnDataType = "varchar(1500)")]
public string OutputPrompt { get; set; }
}
}

View File

@@ -0,0 +1,11 @@

using AntSK.Domain.Common.DependencyInjection;
using AntSK.Domain.Repositories.Base;
namespace AntSK.Domain.Repositories
{
[ServiceDescription(typeof(IApis_Repositories), ServiceLifetime.Scoped)]
public class Apis_Repositories : Repository<Apis>, IApis_Repositories
{
}
}

View File

@@ -0,0 +1,8 @@
using AntSK.Domain.Repositories.Base;
namespace AntSK.Domain.Repositories
{
public interface IApis_Repositories : IRepository<Apis>
{
}
}

View File

@@ -0,0 +1,80 @@
using SqlSugar;
using System.ComponentModel.DataAnnotations;
namespace AntSK.Domain.Repositories
{
[SugarTable("Apps")]
public partial class Apps
{
[SugarColumn(IsPrimaryKey = true)]
public string Id { get; set; }
/// <summary>
/// 名称
/// </summary>
[Required]
public string Name { get; set; }
/// <summary>
/// 描述
/// </summary>
[Required]
public string Describe { get; set; }
/// <summary>
/// 图标
/// </summary>
[Required]
public string Icon { get; set; }
/// <summary>
/// 类型
/// </summary>
[Required]
public string Type { get; set; }
/// <summary>
/// 会话模型ID
/// </summary>
[Required]
public string? ChatModelID { get; set; }
/// <summary>
/// Embedding 模型Id
/// </summary>
public string? EmbeddingModelID { get; set; }
/// <summary>
/// 温度
/// </summary>
[SugarColumn(DefaultValue = "70")]
public double Temperature { get; set; } = 70f;
/// <summary>
/// 提示词
/// </summary>
public string? Prompt { get; set; }
/// <summary>
/// 插件列表
/// </summary>
[SugarColumn(ColumnDataType = "varchar(1000)")]
public string? ApiFunctionList { get; set; }
/// <summary>
/// 本地函数列表
/// </summary>
[SugarColumn(ColumnDataType = "varchar(1000)")]
public string? NativeFunctionList { get; set; }
/// <summary>
/// 知识库ID列表
/// </summary>
public string? KmsIdList { get; set; }
/// <summary>
/// API调用秘钥
/// </summary>
public string? SecretKey { get; set; }
}
}

View File

@@ -1,11 +1,6 @@

using AntSK.Domain.Repositories.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AntSK.Domain.Common.DependencyInjection;
using AntSK.Domain.Repositories.Base;
namespace AntSK.Domain.Repositories
{

View File

@@ -1,9 +1,4 @@
using AntSK.Domain.Repositories.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Repositories
{

View File

@@ -0,0 +1,20 @@
using AntSK.Domain.Domain.Model.Enum;
using SqlSugar;
using System.ComponentModel.DataAnnotations;
namespace AntSK.Domain.Repositories
{
[SugarTable("Funs")]
public partial class Funs
{
[SugarColumn(IsPrimaryKey = true)]
public string Id { get; set; }
/// <summary>
/// 接口描述
/// </summary>
[Required]
public string Path { get; set; }
}
}

View File

@@ -0,0 +1,11 @@

using AntSK.Domain.Common.DependencyInjection;
using AntSK.Domain.Repositories.Base;
namespace AntSK.Domain.Repositories
{
[ServiceDescription(typeof(IFuns_Repositories), ServiceLifetime.Scoped)]
public class Funs_Repositories : Repository<Funs>, IFuns_Repositories
{
}
}

View File

@@ -0,0 +1,8 @@
using AntSK.Domain.Repositories.Base;
namespace AntSK.Domain.Repositories
{
public interface IFuns_Repositories : IRepository<Funs>
{
}
}

View File

@@ -1,9 +1,4 @@
using AntSK.Domain.Repositories.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Repositories
{

View File

@@ -0,0 +1,60 @@
using SqlSugar;
using System.ComponentModel.DataAnnotations;
namespace AntSK.Domain.Repositories
{
[SugarTable("Kms")]
public partial class Kmss
{
[SugarColumn(IsPrimaryKey = true)]
public string Id { get; set; }
/// <summary>
/// 图标
/// </summary>
[Required]
public string Icon { get; set; }
/// <summary>
/// 名称
/// </summary>
[Required]
public string Name { get; set; }
/// <summary>
/// 会话模型
/// </summary>
[Required]
public string Describe { get; set; }
/// <summary>
/// 会话模型ID
/// </summary>
[Required]
public string? ChatModelID { get; set; }
/// <summary>
/// 向量模型ID
/// </summary>
[Required]
public string? EmbeddingModelID { get; set; }
/// <summary>
/// 每个段落的最大标记数。
/// </summary>
[SugarColumn(DefaultValue = "299")]
public int MaxTokensPerParagraph { get; set; } = 299;
/// <summary>
/// 每行,也就是每句话的最大标记数
/// </summary>
[SugarColumn(DefaultValue = "99")]
public int MaxTokensPerLine { get; set; } = 99;
/// <summary>
/// 段落之间重叠标记的数量。
/// </summary>
[SugarColumn(DefaultValue = "49")]
public int OverlappingTokens { get; set; } = 49;
}
}

View File

@@ -1,11 +1,6 @@

using AntSK.Domain.Repositories.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AntSK.Domain.Common.DependencyInjection;
using AntSK.Domain.Repositories.Base;
namespace AntSK.Domain.Repositories
{

View File

@@ -1,9 +1,4 @@
using AntSK.Domain.Repositories.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntSK.Domain.Repositories
{

View File

@@ -1,9 +1,5 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AntSK.Domain.Domain.Model.Enum;
using SqlSugar;
namespace AntSK.Domain.Repositories
{
@@ -32,9 +28,14 @@ namespace AntSK.Domain.Repositories
/// </summary>
public int? DataCount { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 状态
/// </summary>
public ImportKmsStatus? Status { get; set; } = ImportKmsStatus.Loadding;
}
}

Some files were not shown because too many files have changed in this diff Show More