Skip to content

Bug: aog install service_provider 无法正确生效问题 #12

@xiao-ming9

Description

@xiao-ming9

错误描述

当我本地部署完 aog 后,通过 aog install service_provider 命令创建一个新的 provider 时,并不能使该 provider 生效,甚至还导致了 panic 问题。

复现步骤

  1. 创建一个新的 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"
  ]
}
  1. 执行命令: ./aog.exe install service_provider -f new_provider.json,此时如果观察 aog.db 文件,可以看到 aog_model 数据如下:
Image
  1. 等待 ollama 模型下载完成后,如果此时再次查看 aog.db 文件,可以看到 aog_model 数据如下:
Image

此时对比2,3步骤的截图可以发现,id 变成了 0,service_name 变成了 generate。(⚠️这里引入了严重的问题,后续分析指出)

  1. 继续执行 ./aog.exe edit service chat --local_provider my_new_provider,显示成功,此时查看 aog.db,可以看到 aog_service 下 chat service 已经设置成功:
Image
  1. 最后,通过 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 :
Image

预期结果

调用 curl 命令后,程序能够正常执行

实际结果

程序出现了 panic

Bug 分析

为什么 panic?

直观查看可以发现是代码 internal/schedule/schedule.godispatch 方法在 263 行出现了数组溢出错误,这是第一个应该修复的地方

Image

为什么数组长度为0?

至于为什么这里会出现数组长度为0,原因在于 List 方法的实现问题:

Image

在 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 表中只有如下数据:

Image

因此查询不到。

为什么最后 db 的结果是 id=0 and service_name = generate?

通过走读上下游代码,发现在 internal/server/model.go 中,拉取完模型文件后,会执行 createRelatedModels 方法,该方法会调用 internal/datastore/sqlite/sqlite.go 中的 Put 方法,该方法的实现个人感觉存在相当大的问题:

  1. 方法首先通过 Exist 方法调用来判断传入的 model 是否在数据库中已经有数据,判断的依据是 model 的 Index 方法定义的字段值,而 Model 结构体实现的 Index 方法,并不能完全保证唯一,这就导致了 createRelatedModels 方法最终执行的是 update 操作,而不是 insert 操作。
Image
  1. Put 方法中,针对 update 操作的实现,并没有充分考虑空值的情况,在 gorm 中,如果使用 db.Updates(maps) 的方式,如果 map 中 key 对应的 value 为空值,也会直接写到数据库中,因此出现了上面看到的 id 为 0 的情况。

修复

我将在晚些时候提交一个修复的 commit,用来修复上述问题,本地修复后已经能够正常运行,同时兼容原本一并生成 generate service 方式。
效果如下:

Image Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions