micro/go-micro
GitHub: micro/go-micro
Go Micro 是一个面向 Go 语言的智能体框架兼微服务框架,将 AI agent 的运行时能力(工具、记忆、规划、委托、guardrails)与分布式服务架构融为一体。
Stars: 22841 | Forks: 2406
# Go Micro [](https://pkg.go.dev/go-micro.dev/v6?tab=doc) [](https://goreportcard.com/report/github.com/go-micro/go-micro)
Go Micro 是一个面向 Go 的 **agent harness**(智能体框架)和服务框架。
harness 是指 agent 周围的 runtime:它可以调用的工具、保留的记忆、限制它的 guardrails、触发它的 workflow、它依赖的服务,以及其他 agent 用来与它通信的协议。
Go Micro 以 Go 代码的形式为你提供 harness。构建一个 agent,它就能获得模型、记忆、工具、规划、委托、guardrails 和服务发现;它可以通过 [MCP](https://modelcontextprotocol.io/) 和 [A2A](https://a2a-protocol.org) 访问。编写服务,每个 endpoint 都会成为一个可被 AI 调用的工具。使用 durable flows 来编排确定性的部分。Agent、服务和 workflow 共享同一个 runtime,因为 agent 本身就是一个分布式系统,构建一个 agent 就是在构建一个服务。
## 商业支持
在生产环境中运行 Go Micro,或者基于它进行开发并需要帮助?你可以直接从维护者那里获取付费的**支持、咨询、培训和 retainers**——这也是维持项目维护的资金来源。请查看 [**支持**](SUPPORT.md) 了解具体级别,或者[提交请求](https://github.com/micro/go-micro/issues/new?template=commercial_support.md)。
## 目录
- [快速开始](#quick-start)
- [为什么需要 Agent Harness](#why-an-agent-harness)
- [编写服务](#writing-services)
- [构建 Agent](#building-agents) — [规划与委托](#plan--delegate), [可插拔](#batteries-included-pluggable), [付费工具 (x402)](#paid-tools-x402), [A2A](#reachable-by-other-agents-a2a)
- [功能特性](#features)
- [CLI](#cli)
- [多服务项目](#multi-service-projects)
- [数据模型](#data-model)
- [AI 提供商](#ai-providers)
- [示例](#examples)
- [商业支持](#commercial-support)
- [文档](#docs)
## 快速开始
安装 CLI:
```
# 二进制文件(无需 Go)
curl -fsSL https://go-micro.dev/install.sh | sh
# 或者使用 Go
go install go-micro.dev/v6/cmd/micro@v6
```
### 最快的方式 —— 无需 API key
初始化一个服务,运行它,并调用它:
```
micro new helloworld
cd helloworld
micro run
```
然后在另一个终端中运行:
```
curl -X POST http://localhost:8080/api/helloworld/Helloworld.Call \
-H 'Content-Type: application/json' -d '{"name":"World"}'
```
### 通过 prompt 生成 —— 使用 LLM key
设置 provider key,描述你想要的功能,AI 就会设计服务、编写 handler、编译并启动它们:
```
export ANTHROPIC_API_KEY=sk-ant-... # or OPENAI_API_KEY, GEMINI_API_KEY, ...
micro run --prompt "a task management system with categories" --provider anthropic
```
AI 会设计架构,你进行审查,然后它会生成包含真实业务逻辑的 handler,编译它们并启动:
```
Services:
● task — Task management with status tracking
● project — Project organization
Generate? [Y/n]
Micro
Services:
● task
● project
Agents:
◆ agent
```
接着可以从控制台与你的服务对话:
```
> Create a project called Launch, then add three tasks to it
→ project_Project_Create({"name":"Launch"})
← {"record":{"id":"p1..."},"success":true}
→ task_Task_Create({"title":"Design specs","project_id":"p1..."})
→ task_Task_Create({"title":"Write code","project_id":"p1..."})
→ task_Task_Create({"title":"Ship it","project_id":"p1..."})
Created project Launch and added three tasks to it.
```
当你需要目前尚不具备的能力时,agent 会在对话过程中生成一个新服务:
```
> I need to track shipping. Create a shipment for order 123 to London.
⚡ generating shipping service...
✓ shipping
→ shipping_Shipping_Create({"order_id":"123","destination":"London"})
← {"record":{"id":"xyz...","status":"pending"}}
Created shipment for order 123 going to London.
```
你可以随时手动编辑生成的代码——重新运行时会保留你的更改。[阅读更多](https://go-micro.dev/blog/13)。
## 为什么需要 Agent Harness
第一波 agent 框架帮助开发者将模型放入一个循环中。下一个问题是如何操作这个循环:将其连接到真实工具,界定其影响范围,保存状态,将工作路由给专家,从故障中恢复,观察发生了什么,以及允许其他 agent 调用它。这就是 harness 的工作。
Go Micro 给出的答案是,让这个 harness 成为你已经在部署的同一个东西:
- **工具即服务** —— endpoint 元数据会自动成为工具的 schema;由 RPC 执行调用。
- **Agent 即服务** —— 它们会进行注册、发现、负载均衡,并暴露 `Agent.Chat`。
- **Workflow 即持久化代码路径** —— 当路径已知时使用 workflow;当路径未知时分发给 agent。
- **安全防护在执行时生效** —— `MaxSteps`、`LoopLimit`、`ApproveTool` 和工具包装器会在动作发生的地方运行。
- **内置互操作性** —— 使用 MCP 连接工具,使用 A2A 连接 agent,使用 x402 处理付费工具。
当你的 agent 需要操作一个系统,而不仅仅是回答 prompt 时,请使用 Go Micro。
## 编写服务
在底层,服务就是一个带有方法的结构体。文档注释和 `@example` 标签会自动成为 AI agent 的工具描述。
```
package main
import (
"context"
"go-micro.dev/v6"
)
type Request struct {
Name string `json:"name"`
}
type Response struct {
Message string `json:"message"`
}
type Say struct{}
// Hello greets a person by name.
// @example {"name": "Alice"}
func (h *Say) Hello(ctx context.Context, req *Request, rsp *Response) error {
rsp.Message = "Hello " + req.Name
return nil
}
func main() {
service := micro.NewService("greeter")
service.Handle(new(Say))
service.Run()
}
```
运行它,一切都可以访问——REST、gRPC、MCP、agent playground:
```
micro run
# Dashboard: http://localhost:8080
# API: http://localhost:8080/api/{service}/{method}
# Agent: http://localhost:8080/agent
# MCP Tools: http://localhost:8080/mcp/tools
```
你也可以从模板初始化一个服务:
```
micro new helloworld
micro new contacts --template crud
```
## 构建 Agent
Agent 是一个内部包含 LLM 的服务。它具有由 proto 定义的 `Agent.Chat` RPC endpoint,会在 registry 中注册,并且可以像任何服务一样被调用:
```
agent := micro.NewAgent("task-mgr",
micro.AgentServices("task", "project"),
micro.AgentPrompt("You manage tasks and projects. You understand deadlines and priorities."),
micro.AgentProvider("anthropic"),
)
agent.Run()
```
agent 从 registry 中发现其服务,将其工具限定在这些服务的 endpoint 中,并在 store 中维护对话记忆。它会注册自身,以便 `micro chat` 和其他 agent 能够找到它。
```
// Programmatic interaction
resp, _ := agent.Ask(ctx, "What tasks are overdue?")
fmt.Println(resp.Reply)
```
多个 agent 通过 RPC 协同工作——每个都是一个带有 `Agent.Chat` endpoint 的服务。`micro chat` 会将请求路由到正确的 agent。
```
micro agent list # list registered agents
micro call task-mgr Agent.Chat '{"message": "What tasks are overdue?"}'
```
### 规划与委托
每个 agent 都会获得两个内置的 harness 能力,这些能力以工具的形式暴露出来——无需额外设置或单独的 graph runtime:
- **`plan`** —— 对于多步骤任务,agent 会在其由 store 支持的记忆中记录一个有序的计划,并在多轮对话中保持清晰的思路。
- **`delegate`** —— agent 将一个独立的子任务交给另一个 agent。如果已注册的 agent 已经拥有相关的服务,交接过程就会通过 RPC 发送给该 agent;否则,会为该子任务创建一个专注的、短暂的子 agent,并拥有其独立的上下文。
这使得智能分布化:一个 agent 不需要知道*如何*做所有事情,只需要知道*谁*知道怎么做。参见 [examples/agent-plan-delegate](examples/agent-plan-delegate/)。
```
// A sub-agent is just an agent — created with New, talked to with Ask.
// delegate-first: reuse a registered agent, or spin up a focused one.
resp, _ := agent.Ask(ctx, "Plan the launch, create the tasks, and have comms notify the owner.")
```
### 内置功能且支持插拔
正如服务由可插拔的抽象层(registry、broker、store)组合而成一样,agent 也是由**模型**、**记忆**和**工具**组合而成的——开箱即用提供合理的默认值,每一个都可以替换。
```
agent := micro.NewAgent("assistant",
micro.AgentProvider("anthropic"), // model — swap the provider
micro.AgentMemory(micro.NewInMemory(50)), // memory — default is store-backed & durable
micro.AgentTool("weather", "Get the weather for a city",
map[string]any{"city": map[string]any{"type": "string"}},
func(ctx context.Context, in map[string]any) (string, error) {
return getWeather(in["city"].(string)) // tools beyond your services — any function
}),
micro.AgentMaxSteps(8), // guardrails
)
```
**记忆**默认是持久化且由 store 支持的(Postgres、NATS KV 或 file),因此 agent 在重启后可以从上次中断的地方继续——或者你也可以通过 `AgentMemory` 提供自己的实现。**工具**默认就是你的服务,此外还可以是你通过 `AgentTool` 注册的任何函数。
### 付费工具 (x402)
每个 endpoint 都是一个可被 AI 调用的工具——而且它可以是一个*付费*工具。Go Micro 支持 [x402](https://x402.org),即面向 agent 的 HTTP 402 支付标准,因此一个工具可以要求支付稳定币,而 agent 可以自主完成结算。这是一个可选功能,并且框架本身不携带任何加密货币:验证过程被委托给一个可插拔的 facilitator(Coinbase、Alchemy、自行托管),因此 Base 和 Solana 只是不同的 facilitator 而已。
```
# 在 MCP 网关对工具调用收费(除非您设置了收款地址,否则默认关闭)
micro mcp serve --x402_pay_to 0xYourAddress --x402_network solana --x402_amount 10000
# 通过配置文件设置每工具金额
micro mcp serve --x402_config x402.json
```
请参阅 [支付 (x402) 指南](internal/website/docs/guides/x402-payments.md)。
### 可被其他 agent 访问 (A2A)
在 Go Micro 系统内部,agent 之间通过 RPC 进行通信。为了使它们能被*其他*框架上的 agent 访问,Go Micro 支持 [Agent2Agent (A2A) 协议](https://a2a-protocol.org)。A2A gateway 从 registry 发现你的 agent,并利用其元数据为每个 agent 生成一个 Agent Card——就像 MCP gateway 从服务 endpoint 派生出工具一样——并将传入的 A2A 任务转换为 agent 的 `Agent.Chat` RPC。无需为每个 agent 编写代码:注册一个 agent 后,即可通过 A2A 访问它。
```
micro a2a serve --address :4000 # gateway: expose every registered agent over A2A
micro a2a list # agents and their Agent Card URLs
```
或者完全跳过 gateway——一个 agent 可以直接作为其自身的 A2A endpoint 提供服务,在进程内处理任务:
```
micro.NewAgent("task-mgr", micro.AgentServices("task"), micro.AgentA2A(":4000"))
```
这是双向工作的。要调用另一个框架上的 agent,`a2a.Client` 会被接入到交接工作的两个地方:`flow.A2A(url)` 作为一个 workflow 步骤(即跨框架的 `Dispatch`),以及从 agent 内部 `delegate` 到一个 `http(s)` URL。
MCP 将你的服务作为工具暴露出来;而 A2A 将你的 agent 作为 agent 暴露出来。请参阅 [A2A 指南](internal/website/docs/guides/a2a-protocol.md)。
## 功能特性
### AI
| 功能 | 详情 |
|---------|---------|
| Agent | `micro.NewAgent()` —— 管理服务的智能层 |
| 规划与委托 | 内置 agent 工具 —— 规划多步骤工作,将子任务委托给其他 agent |
| 可插拔记忆 | 默认提供由 store 支持的持久化对话记忆;可通过 `AgentMemory` 替换 |
| 自定义工具 | `AgentTool` —— 除了现有的服务外,还可以将任何函数作为工具提供给 agent |
| Guardrails | `MaxSteps`(按次数停止)、`LoopLimit`(停止无进展的重复调用)、`ApproveTool`(human-in-the-loop) |
| 工具中间件 | `AgentWrapTool` —— 封装工具的执行过程,用于日志记录、指标收集或重试(类似于 client/server 包装器) |
| Workflow | `micro.NewFlow()` —— 事件驱动;支持单一步骤、有序的持久化步骤,或触发某个 agent |
| 持久化执行 | 带有 checkpoint 的 flow 步骤能在崩溃后存活,并从停止的地方恢复;默认由 store 支持,且后端可插拔 |
| MCP gateway | 每个 endpoint 会自动成为 AI 工具 |
| A2A gateway | 每个 agent 都可以通过 Agent2Agent 协议访问;card 从 registry 中生成(`micro a2a`) |
| 支付 (x402) | 通过 x402 标准为工具启用可选的按次调用支付;支持可插拔的 facilitator (Base, Solana, …) |
| 7 个 LLM provider | Anthropic, OpenAI, Gemini, Groq, Mistral, Together, Atlas Cloud |
| 交互式控制台 | `micro run` 包含一个用于与服务对话的聊天控制台 |
| 服务生成 | `micro run --prompt` —— 描述一个系统,即可获得运行中的服务 |
### 框架
| 功能 | 详情 |
|---------|---------|
| 服务注册中心 | mDNS (默认), Consul, etcd |
| RPC client/server | gRPC transport,负载均衡,流式处理 |
| Pub/sub 事件 | NATS, RabbitMQ, HTTP broker |
| Key-value store | File (bbolt), Postgres, NATS KV |
| 类型化模型层 | CRUD + 查询,支持 SQLite/Postgres 后端 |
| 一切皆可替换 | 所有抽象都是 Go 接口 |
### 开发者体验与部署
| 功能 | 详情 |
|---------|---------|
| 热重载 | `micro run` 监控文件变动,并在更改时重新构建 |
| 模板 | `micro new --template crud/pubsub/api` |
| 一键部署 | `micro deploy user@server` —— 通过 SSH + systemd,无需 Docker |
## CLI
| 命令 | 用途 |
|---------|---------|
| `micro run --prompt "..."` | 生成服务和 agent,并启动带有交互式控制台的程序 |
| `micro run` | 开发模式:热重载、gateway、交互式控制台 |
| `micro run -d` | 后台模式(无控制台) |
| `micro chat` | 独立聊天(在不使用 micro run 时) |
| `micro agent list` | 列出已注册的 agent |
| `micro new myservice` | 初始化一个服务 |
| `micro call service endpoint '{}'` | 从 CLI 调用服务或 agent |
| `micro build` | 编译生产环境二进制文件 |
| `micro deploy user@server` | 通过 SSH + systemd 进行部署 |
## 多服务项目
同时运行多个服务:
```
users := micro.NewService("users", micro.Address(":9001"))
orders := micro.NewService("orders", micro.Address(":9002"))
users.Handle(new(Users))
orders.Handle(new(Orders))
g := micro.NewGroup(users, orders)
g.Run()
```
或者使用 `micro.mu` 配置文件:
```
service users
path ./users
service orders
path ./orders
depends users
```
## 数据模型
具备 CRUD 和查询功能的类型化持久化存储:
```
type User struct {
ID string `json:"id" model:"key"`
Name string `json:"name"`
Email string `json:"email" model:"index"`
}
db := service.Model()
db.Register(&User{})
db.Create(ctx, &User{ID: "1", Name: "Alice", Email: "alice@example.com"})
var results []*User
db.List(ctx, &results, model.Where("email", "alice@example.com"))
```
后端:memory(默认)、SQLite、Postgres。
## AI 提供商
只需更改一处 import 即可切换 provider——各处接口保持一致:
| Provider | 默认模型 |
|----------|---------------|
| Anthropic | `claude-sonnet-4-20250514` |
| OpenAI | `gpt-4o` |
| Google Gemini | `gemini-2.5-flash` |
| Groq | `llama-3.3-70b-versatile` |
| Mistral | `mistral-large-latest` |
| Together AI | `Llama-3.3-70B-Instruct-Turbo` |
| Atlas Cloud | `llama-3.3-70b` |
```
m := ai.New("anthropic", ai.WithAPIKey(key))
resp, _ := m.Generate(ctx, &ai.Request{Prompt: "hello"})
```
## 示例
- [hello-world](examples/hello-world/) —— 基 RPC 服务
- [multi-service](examples/multi-service/) —— 单个二进制文件中的多个服务
- [mcp](examples/mcp/) —— 与 AI agent 的 MCP 集成
- [agent-plan-delegate](examples/agent-plan-delegate/) —— Agent 规划和多 agent 委托
- [grpc-interop](examples/grpc-interop/) —— 从任何 gRPC client 调用 go-micro
查看[所有示例](examples/README.md)。
## 文档
- [入门指南](internal/website/docs/getting-started.md)
- [AI 集成](internal/website/docs/ai-integration.md)
- [Agent 与 Workflow](internal/website/docs/guides/agents-and-workflows.md)
- [Agent 设计](internal/docs/AGENT_DESIGN.md)
- [规划与委托](internal/website/docs/guides/plan-delegate.md)
- [Agent Guardrails](internal/website/docs/guides/agent-guardrails.md)
- [支付 (x402)](internal/website/docs/guides/x402-payments.md)
- [MCP 与 AI Agent](internal/website/docs/mcp.md)
- [数据模型](internal/website/docs/model.md)
- [部署](internal/website/docs/deployment.md)
- [插件](internal/website/docs/plugins.md)
包参考文档:https://pkg.go.dev/go-micro.dev/v6
标签:A2A协议, AI智能体, EVTX分析, Go, MCP, Prisma Cloud, Python工具, Ruby工具, 分布式系统, 响应大小分析, 微服务框架, 日志审计, 测试用例