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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions