English | 中文
一个用于构建智能 agent 系统的强大 Go 框架,彻底改变您创建 AI 应用的方式。构建能够思考、记忆、协作和行动的自主 agent,前所未有地简单。
为什么选择 tRPC-Agent-Go?
SKILL.md 工作流,支持安全执行非常适合构建:
|
|
|
|
|
|
准备好深入了解 tRPC-Agent-Go 了吗?我们的文档涵盖从基础概念到高级技巧的一切,帮助你自信地构建强大的 AI 应用。无论你是 AI agent 新手还是有经验的开发者,都能在其中找到详细指南、实用示例和最佳实践,加速你的开发旅程。
实际演示:[Demo GIF 占位符 - 展示 agent 推理和 tool 使用]
3 个简单步骤开始:
# 1. 克隆和设置
git clone https://github.com/trpc-group/trpc-agent-go.git
cd trpc-agent-go
# 2. 配置您的 LLM
export OPENAI_API_KEY="your-api-key-here"
export OPENAI_BASE_URL="your-base-url-here" # 可选
# 3. 运行您的第一个 agent!
cd examples/runner
go run . -model="gpt-4o-mini" -streaming=true
您将看到:
试着问问:"现在几点了?然后计算 15 * 23 + 100"
package main
import (
"context"
"fmt"
"log"
"trpc.group/trpc-go/trpc-agent-go/agent/llmagent"
"trpc.group/trpc-go/trpc-agent-go/model"
"trpc.group/trpc-go/trpc-agent-go/model/openai"
"trpc.group/trpc-go/trpc-agent-go/runner"
"trpc.group/trpc-go/trpc-agent-go/tool"
"trpc.group/trpc-go/trpc-agent-go/tool/function"
)
func main() {
// Create model.
modelInstance := openai.New("deepseek-chat")
// Create tool.
calculatorTool := function.NewFunctionTool(
calculator,
function.WithName("calculator"),
function.WithDescription("Execute addition, subtraction, multiplication, and division. "+
"Parameters: a, b are numeric values, op takes values add/sub/mul/div; "+
"returns result as the calculation result."),
)
// Enable streaming output.
genConfig := model.GenerationConfig{
Stream: true,
}
// Create Agent.
agent := llmagent.New("assistant",
llmagent.WithModel(modelInstance),
llmagent.WithTools([]tool.Tool{calculatorTool}),
llmagent.WithGenerationConfig(genConfig),
)
// Create Runner.
runner := runner.NewRunner("calculator-app", agent)
// Execute conversation.
ctx := context.Background()
events, err := runner.Run(ctx,
"user-001",
"session-001",
model.NewUserMessage("Calculate what 2+3 equals"),
)
if err != nil {
log.Fatal(err)
}
// Process event stream.
for event := range events {
if event.Object == "chat.completion.chunk" {
fmt.Print(event.Response.Choices[0].Delta.Content)
}
}
fmt.Println()
}
func calculator(ctx context.Context, req calculatorReq) (calculatorRsp, error) {
var result float64
switch req.Op {
case "add", "+":
result = req.A + req.B
case "sub", "-":
result = req.A - req.B
case "mul", "*":
result = req.A * req.B
case "div", "/":
result = req.A / req.B
default:
return calculatorRsp{}, fmt.Errorf("invalid operation: %s", req.Op)
}
return calculatorRsp{Result: result}, nil
}
type calculatorReq struct {
A float64 `json:"A" jsonschema:"description=First integer operand,required"`
B float64 `json:"B" jsonschema:"description=Second integer operand,required"`
Op string `json:"Op" jsonschema:"description=Operation type,enum=add,enum=sub,enum=mul,enum=div,required"`
}
type calculatorRsp struct {
Result float64 `json:"result"`
}
有些场景下,你希望 Agent 按请求创建(例如:不同的提示词、模型、工具集、沙箱实例)。
这时可以让 Runner 在每次 Run(...) 时动态构建一个新的 Agent:
r := runner.NewRunnerWithAgentFactory(
"my-app",
"assistant",
func(ctx context.Context, ro agent.RunOptions) (agent.Agent, error) {
// 通过 ro 构建本次请求使用的 Agent。
a := llmagent.New("assistant",
llmagent.WithInstruction(ro.Instruction),
)
return a, nil
},
)
events, err := r.Run(ctx,
"user-001",
"session-001",
model.NewUserMessage("Hello"),
agent.WithInstruction("You are a helpful assistant."),
)
_ = events
_ = err
如果你希望“中断正在运行的 agent”(停止本次模型调用 / 工具调用),推荐做法是:
取消你传给 Runner.Run 的 context.Context。
特别注意:不要只是在消费事件的 for range 里 break 然后直接返回。
如果你不再读取事件通道,但 agent 还在后台写事件,可能会阻塞并造成 goroutine
泄漏。正确姿势是:先 cancel,再把事件通道读到关闭为止。
把 Ctrl+C 转成 ctx cancel:
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
defer stop()
events, err := r.Run(ctx, userID, sessionID, message)
if err != nil {
return err
}
for range events {
// 一直读到通道关闭:要么 ctx 被取消,要么 run 正常结束。
}
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
events, err := r.Run(ctx, userID, sessionID, message)
if err != nil {
return err
}
go func() {
time.Sleep(2 * time.Second)
cancel()
}()
for range events {
// 一直读到通道关闭。
}
requestID := "req-123"
events, err := r.Run(ctx, userID, sessionID, message,
agent.WithRequestID(requestID),
)
mr := r.(runner.ManagedRunner)
_ = mr.Cancel(requestID)
更完整的说明(包含 detached cancel、resume、以及 AG-UI 的取消路由)见
docs/mkdocs/zh/runner.md 与 docs/mkdocs/zh/agui.md。
examples 目录包含涵盖各主要功能的可运行 Demo。
LLMAgent。event.Event 更新。GraphAgent – 展示如何使用 graph 与 agent/graph 包来构建并执行复杂的、带条件的工作流。展示了如何构建基于图的 agent、安全管理状态、实现条件路由,并通过 Runner 进行编排执行。
多条件扇出路由(一次返回多个分支并行执行):
// 返回多个分支键,分别触发目标节点并行执行。
sg := graph.NewStateGraph(schema)
sg.AddNode("router", func(ctx context.Context, s graph.State) (any, error) {
return nil, nil
})
sg.AddNode("A", func(ctx context.Context, s graph.State) (any, error) {
return graph.State{"a": 1}, nil
})
sg.AddNode("B", func(ctx context.Context, s graph.State) (any, error) {
return graph.State{"b": 1}, nil
})
sg.SetEntryPoint("router")
sg.AddMultiConditionalEdges(
"router",
func(ctx context.Context, s graph.State) ([]string, error) {
return []string{"goA", "goB"}, nil
},
map[string]string{"goA": "A", "goB": "B"}, // 可用 PathMap 或 Ends
)
sg.SetFinishPoint("A").SetFinishPoint("B")
SKILL.md 规范的文件夹,可附带 docs/scripts。skill_load、skill_list_docs、skill_select_docs、skill_run(在隔离工作空间里执行命令)。skill_run 尽量只用于执行所选 Skill 文档里要求的命令,而不是用于通用的 Shell 探查。示例:openclaw
其他值得关注的示例:
关于使用详情,请参阅各示例文件夹中的 README.md。
架构图
关键包:
| Package | 职责 |
|---|---|
agent | 核心执行单元,负责处理用户输入并生成响应。 |
runner | agent 执行器,负责管理执行流程并连接 Session/Memory Service 能力。 |
model | 支持多种 LLM 模型(OpenAI、DeepSeek 等)。 |
tool | 提供多种工具能力(Function、MCP、DuckDuckGo 等)。 |
session | 管理用户会话状态与事件。 |
memory | 记录用户长期记忆与个性化信息。 |
knowledge | 实现 RAG 知识检索能力。 |
planner | 提供 agent 的规划与推理能力。 |
artifact | 存储并读取工具/agent 产出的版本化文件(图片、报告等)。 |
skill | 管理并执行以 SKILL.md 定义的可复用 Agent Skills。 |
event | 定义 Runner 与各类服务使用的事件结构与流式载荷。 |
evaluation | 提供 EvalSet/Metric 驱动的评测框架并管理评测结果。 |
server | 提供 Gateway、AG-UI、A2A 等 HTTP 服务端能力。 |
telemetry | OpenTelemetry 的 tracing/metrics 采集与接入。 |
对于大多数应用,你不需要自己实现 agent.Agent 接口。框架已经提供了若干可直接使用的 agent,你可以像搭积木一样组合:
| Agent | 目的 |
|---|---|
LLMAgent | 将 LLM chat-completion 模型封装为一个 agent。 |
ChainAgent | 依次顺序执行子 agent。 |
ParallelAgent | 并发执行子 agent 并合并输出。 |
CycleAgent | 围绕 planner + executor 循环,直到收到停止信号。 |
// 1. 创建一个基础的 LLM agent。
base := llmagent.New(
"assistant",
llmagent.WithModel(openai.New("gpt-4o-mini")),
)
// 2. 创建第二个具有不同指令的 LLM agent。
translator := llmagent.New(
"translator",
llmagent.WithInstruction("Translate everything to French"),
llmagent.WithModel(openai.New("gpt-3.5-turbo")),
)
// 3. 将它们组合成一个 chain。
pipeline := chainagent.New(
"pipeline",
chainagent.WithSubAgents([]agent.Agent{base, translator}),
)
// 4. 通过 runner 运行以获得会话与 telemetry。
run := runner.NewRunner("demo-app", pipeline)
events, _ := run.Run(ctx, "user-1", "sess-1",
model.NewUserMessage("Hello!"))
for ev := range events { /* ... */ }
组合式 API 允许你将 chain、cycle 或 parallel 进行嵌套,从而在无需底层管线处理的情况下构建复杂工作流。
我们热爱贡献!加入我们不断壮大的开发者社区,共同构建 AI agent 的未来。
# Fork 并克隆仓库
git clone https://github.com/YOUR_USERNAME/trpc-agent-go.git
cd trpc-agent-go
# 运行测试确保一切正常
go test ./...
go vet ./...
# 进行您的更改并提交 PR!
请阅读 CONTRIBUTING.md 了解详细指南和编码标准。
特别感谢腾讯各业务单元,包括腾讯元宝、腾讯视频、腾讯新闻、IMA 和 QQ 音乐的宝贵支持和生产环境验证推动框架发展
感谢优秀的开源框架如 ADK、Agno、CrewAI、AutoGen 等的启发。站在巨人的肩膀上!
遵循 Apache 2.0 许可证 - 详见 LICENSE 文件。