Skip to content

Go SDK

轻量级 Go SDK,封装 Superagent 基座核心能力,大幅降低使用门槛。

快速开始

安装

bash
go get github.com/superagent-ai/superagent-base/sdk

最简用法

go
package main

import (
    "context"
    "fmt"
    "log"

    "github.com/superagent-ai/superagent-base/sdk"
)

func main() {
    agent, err := sdk.LoadAgent("configs/agents/research-agent.yaml")
    if err != nil {
        log.Fatal(err)
    }

    result, err := agent.ChatSync(context.Background(), "", "什么是量子计算?")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(result)
}

Runtime 管理

go
rt, err := sdk.NewRuntime(
    sdk.WithAgentsDir("configs/agents"),
    sdk.WithModel(sdk.ModelRuntimeConfig{
        BaseURL: "http://localhost:8000/v1",
        APIKey:  "sk-xxx",
    }),
    sdk.WithRedis("localhost:6379", ""),
)
if err != nil {
    log.Fatal(err)
}
defer rt.Shutdown()

agent, ok := rt.GetAgent("research-agent")
if !ok {
    log.Fatal("agent not found")
}

流式对话

go
ch, err := agent.Chat(ctx, "session-1", "Hello")
if err != nil {
    log.Fatal(err)
}

for chunk := range ch {
    fmt.Print(chunk)
}
fmt.Println()

工具注册

go
import "github.com/superagent-ai/superagent-base/sdk/tool"

registry := tool.NewRegistry()

registry.Register(tool.New("web_search", "Search the web", func(ctx context.Context, args map[string]any) (map[string]any, error) {
    query := args["query"].(string)
    return map[string]any{"results": []string{"Result for: " + query}}, nil
}))

registry.Register(tool.New("calculate", "Calculate math", func(ctx context.Context, args map[string]any) (map[string]any, error) {
    return map[string]any{"result": "42"}, nil
}))

工具中间件

go
import (
    "time"
    "github.com/superagent-ai/superagent-base/sdk/tool"
)

chain := tool.Chain(
    tool.RetryMiddleware(3, time.Second),
    tool.TimeoutMiddleware(30 * time.Second),
    tool.LogMiddleware(func(name string, args map[string]any, err error) {
        log.Printf("Tool %s called: %v (err: %v)", name, args, err)
    }),
)

MCP 集成

go
import "github.com/superagent-ai/superagent-base/sdk/mcp"

registry := mcp.NewRegistry()

err := registry.Connect(ctx, mcp.ServerConfig{
    Name:      "filesystem",
    Transport: "stdio",
    Command:   "npx",
    Args:      []string{"-y", "@modelcontextprotocol/server-filesystem", "/tmp"},
})
if err != nil {
    log.Fatal(err)
}

client, ok := registry.GetClient("filesystem")
if ok {
    tools, _ := client.ListTools(ctx)
    fmt.Printf("MCP tools: %v\n", tools)
}

技能系统

go
import (
    "time"
    "github.com/superagent-ai/superagent-base/sdk/skill"
)

invoker := skill.NewLocalInvoker()
manager := skill.NewManager(invoker)

manager.RegisterLocal(skill.SkillMeta{
    Name:        "datetime",
    Version:     "1.0.0",
    Description: "Get current date/time",
}, func(ctx context.Context, input map[string]any) (map[string]any, error) {
    return map[string]any{"date": time.Now().Format(time.RFC3339)}, nil
})

result, err := manager.Invoke(ctx, "datetime", map[string]any{})

记忆系统

go
import "github.com/superagent-ai/superagent-base/sdk/memory"

mem := memory.NewBuiltin()

err := mem.AddMessage(ctx, "session-1", memory.Message{
    Role:    "user",
    Content: "Hello",
})

msgs, err := mem.GetMessages(ctx, "session-1", 10)

模型路由

go
import "github.com/superagent-ai/superagent-base/sdk/model"

registry := model.NewRegistry()

registry.Register(model.Config{
    Name:     "openai",
    Provider: "openai",
    BaseURL:  "https://api.openai.com/v1",
    APIKey:   "sk-xxx",
    ModelID:  "gpt-4o",
})

registry.Register(model.Config{
    Name:     "deepseek",
    Provider: "deepseek",
    BaseURL:  "https://api.deepseek.com/v1",
    APIKey:   "sk-xxx",
    ModelID:  "deepseek-r1",
})

router := model.NewRouter(registry)
cfg, ok := router.Resolve("gpt-4o")

完整示例

go
package main

import (
    "context"
    "fmt"
    "log"
    "time"

    "github.com/superagent-ai/superagent-base/sdk"
    "github.com/superagent-ai/superagent-base/sdk/tool"
)

func main() {
    // 注册工具
    registry := tool.NewRegistry()
    registry.Register(tool.New("web_search", "Search the web", func(ctx context.Context, args map[string]any) (map[string]any, error) {
        query := args["query"].(string)
        return map[string]any{"results": []string{"Result for: " + query}}, nil
    }))

    // 创建 Runtime
    rt, err := sdk.NewRuntime(
        sdk.WithAgentsDir("configs/agents"),
        sdk.WithModel(sdk.ModelRuntimeConfig{
            BaseURL: "http://localhost:8000/v1",
            APIKey:  "sk-xxx",
        }),
    )
    if err != nil {
        log.Fatal(err)
    }
    defer rt.Shutdown()

    // 获取 Agent
    agent, ok := rt.GetAgent("research-agent")
    if !ok {
        log.Fatal("agent not found")
    }

    // 流式对话
    ch, err := agent.Chat(context.Background(), "session-1", "什么是量子计算?")
    if err != nil {
        log.Fatal(err)
    }

    for chunk := range ch {
        fmt.Print(chunk)
    }
    fmt.Println()
}

API 参考

sdk 包

函数/类型说明
LoadAgent(path)从 YAML 文件加载 Agent
NewRuntime(opts...)创建 Runtime 实例
WithAgentsDir(dir)设置 Agent 目录
WithModel(cfg)设置模型配置
WithRedis(addr, pwd)设置 Redis 连接
AgentAgent 接口
AgentDefinitionAgent 定义结构

Agent 接口

方法说明
Name()获取 Agent 名称
Description()获取描述
Chat(ctx, sessionID, message)流式对话
ChatSync(ctx, sessionID, message)同步对话
GetDefinition()获取定义

tool 包

函数/类型说明
New(name, desc, fn)创建工具
NewRegistry()创建工具注册表
Chain(mws...)组合中间件
RetryMiddleware(n, backoff)重试中间件
TimeoutMiddleware(timeout)超时中间件

mcp 包

函数/类型说明
NewRegistry()创建 MCP 注册表
Connect(ctx, cfg)连接 MCP 服务器
GetClient(name)获取客户端
ListServers()列出服务器

skill 包

函数/类型说明
NewLocalInvoker()创建本地调用器
NewManager(invoker)创建技能管理器
RegisterLocal(meta, fn)注册本地技能
Invoke(ctx, name, input)调用技能

memory 包

函数/类型说明
NewBuiltin()创建内置记忆
GetMessages(ctx, sessionID, limit)获取消息
AddMessage(ctx, sessionID, msg)添加消息
Clear(ctx, sessionID)清空记忆

model 包

函数/类型说明
NewRegistry()创建模型注册表
Register(cfg)注册模型
NewRouter(registry)创建路由器
Resolve(modelID)解析模型

Released under the Apache 2.0 License.