-
Notifications
You must be signed in to change notification settings - Fork 9
Description
错误描述
当我本地部署完 aog 后,通过 aog install service_provider 命令创建一个新的 provider 时,并不能使该 provider 生效,甚至还导致了 panic 问题。
复现步骤
- 创建一个新的 provider json 文件
new_provider.json:
{
"provider_name": "my_new_provider",
"service_name": "chat",
"service_source": "local",
"desc": "Local ollama chat/completion",
"api_flavor": "ollama",
"method": "POST",
"url": "http://localhost:16677/api/chat",
"auth_type": "none",
"auth_key": "",
"models": [
"gemma3:1b"
]
}- 执行命令:
./aog.exe install service_provider -f new_provider.json,此时如果观察aog.db文件,可以看到aog_model数据如下:
- 等待 ollama 模型下载完成后,如果此时再次查看
aog.db文件,可以看到aog_model数据如下:
此时对比2,3步骤的截图可以发现,id 变成了 0,service_name 变成了 generate。(
- 继续执行
./aog.exe edit service chat --local_provider my_new_provider,显示成功,此时查看aog.db,可以看到aog_service下 chat service 已经设置成功:
- 最后,通过 curl 命令发起对 aog 的调用:
curl -X POST http://localhost:16688/aog/v0.2/services/chat -X POST -H "Content-Type: application/json" -d "{\"messages\":[{\"role\":\"user\",\"content\":\"why is the sky blue?\"}],\"stream\":false}",此时程序出现了 ❌ panic :
预期结果
调用 curl 命令后,程序能够正常执行
实际结果
程序出现了 panic
Bug 分析
为什么 panic?
直观查看可以发现是代码 internal/schedule/schedule.go 中 dispatch 方法在 263 行出现了数组溢出错误,这是第一个应该修复的地方:
为什么数组长度为0?
至于为什么这里会出现数组长度为0,原因在于 List 方法的实现问题:
在 gorm 中,db.Rows() 方法查询不到结果时,并不会返回 gorm.ErrRecordNotFound, 而是直接返回空结果,这就导致了上面的 panic问题,这是第二个需要修复的地方。
为什么 db 会查询不到?
此处 List 方法查询的是 aog_model 表,查询的是 provider_name = 'my_new_provider' and service_name = 'chat' and status = 'downloaded' 的 model,但从上面【复现步骤-第2步】的结果可以发现,此时 aog_model 表中只有如下数据:
因此查询不到。
为什么最后 db 的结果是 id=0 and service_name = generate?
通过走读上下游代码,发现在 internal/server/model.go 中,拉取完模型文件后,会执行 createRelatedModels 方法,该方法会调用 internal/datastore/sqlite/sqlite.go 中的 Put 方法,该方法的实现个人感觉存在相当大的问题:
- 方法首先通过
Exist方法调用来判断传入的 model 是否在数据库中已经有数据,判断的依据是 model 的Index方法定义的字段值,而Model结构体实现的Index方法,并不能完全保证唯一,这就导致了createRelatedModels方法最终执行的是update操作,而不是insert操作。
Put方法中,针对update操作的实现,并没有充分考虑空值的情况,在 gorm 中,如果使用db.Updates(maps)的方式,如果 map 中 key 对应的 value 为空值,也会直接写到数据库中,因此出现了上面看到的 id 为 0 的情况。
修复
我将在晚些时候提交一个修复的 commit,用来修复上述问题,本地修复后已经能够正常运行,同时兼容原本一并生成 generate service 方式。
效果如下:
