Skip to content

getTools() ignores toolsOrder, causing non-deterministic tools/list response order #109

Description

@kfaia

工具列表顺序确实不稳定,每次请求的工具顺序都不一样!对大模型 prefix 缓存命中率有影响
根因:manager_tools.go 第 148 行 for _, registeredTool := range m.tools 直接遍历 map,顺序随机。而 SDK 自己定义的 toolsOrder []string(第 39 行,注释写着 "Track insertion order of tools")在 getTools() 中完全没有被使用。

修复:把 getTools() 改为按 toolsOrder 遍历即可:
func (m *toolManager) getTools() []*Tool {
m.mu.RLock()
defer m.mu.RUnlock()

tools := make([]*Tool, 0, len(m.toolsOrder))
for _, name := range m.toolsOrder {
    if rt, ok := m.tools[name]; ok && rt != nil && rt.Tool != nil {
        tools = append(tools, rt.Tool)
    }
}
return tools

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    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