名字来源于:《战神》游戏以希腊神话为背景,讲述奎托斯(Kratos)由凡人成为战神并展开弑神屠杀的冒险经历,Blades 是奎托斯的标志性武器。
在人工智能浪潮席卷全球的今天,大型语言模型(LLM)正在重塑软件开发的边界。然而,对于广大的 Go 开发者而言,一个普遍的痛点是:主流的 LLM 应用框架(如 LangChain)大多基于 Python,这使得在以 Go 为主要技术栈的团队中开发 Agent 应用变得不那么"原生"和高效。
为了解决这个挑战,今天我带着我的新作品来了,它就是 Blades ! Blades 是一个专为 Go 语言设计的、用于构建 AI Agent 应用的现代化框架。目处于初期阶段,当前已支持自定义模型、工具、记忆体、中间件等功能,适用于多轮对话、链式推理和结构化输出等场景。它保持着 Kratos 一贯的设计美学,结合 Go 语言的特性,提供了灵活且高效的 AI Agent 解决方案。

- Go Idiomatic:完全依照 Go 的思维方式构建,代码风格、使用体验都让 Go 开发者感到亲切。
- 使用简单:通过简洁的代码生命,定义 AI Agent,实现需求快速交付,让复杂的逻辑变得清晰、易于管理和维护。
- 中间件生态:借鉴 Kratos 的中间件设计理念,无论是 Observability、Guardrails,都可以方便的集成到 AI Agent。
- 高度可扩展:通过统一的接口和可插拔的组件,实现高度的解耦和可扩展性,方便集成不同的 LLM 模型和外部工具。
架构
当前 Blades 主要由以下模块组成:
- Agent (智能体):执行任务的核心单元,可以调用模型和工具。
- Prompt (提示词):用于与 LLM 交互的模板化文本,支持动态变量替换和复杂的上下文构建。
- Chain (链):将多个 Agent 或其他 Chain 串联起来,形成复杂的工作流。
- ModelProvider (模型):可插拔的 LLM 接口,您可以轻松切换和集成不同的语言模型服务(如 OpenAI 等)。
- Tool (工具):Agent 可以使用的外部能力,例如调用 API、查询数据库、访问文件系统等。
- Memory (记忆):为 Agent 提供短期或长期的记忆能力,实现具备上下文的连续对话。
- Middleware (中间件):类似于 Web 框架中的中间件,可以实现对 Agent 的横切面控制。
核心接口
其中 Runner 是 Blades 框架中最核心的接口,它定义了所有可执行组件的基本行为。
go
// Runner represents an entity that can process prompts and generate responses.
type Runner interface {
// Run 执行一个同步的、非流式的操作,返回一个完整的 Generation 结果。
Run(context.Context, *Prompt, ...ModelOption) (*Generation, error)
// RunStream 执行一个异步的、流式的操作,返回一个 Streamer,用于逐步接收 Generation 结果。
RunStream(context.Context, *Prompt, ...ModelOption) (Streamer[*Generation], error)
}
其设计旨在提供一个统一的执行范式,通过 Run 和 RunStream 方法,实现了框架内各种功能模块的解耦、标准化和高度可组合性 。Agent、Chain、ModelProvider 等组件都实现了此接口,从而统一了它们的执行逻辑,使得不同组件能够像乐高积木一样灵活组合,构建复杂的 AI Agent。

ModelProvider
ModelProvider 是 Blades 框架与底层大语言模型(LLM)进行交互的核心抽象层。其设计目标在于通过统一的接口实现解耦和扩展性,使得框架核心逻辑与特定模型(如 OpenAI, DeepSeek, Gemini 等)的实现细节分离。

其他模块设计,不再一一赘述,可以阅读代码,了解细节。
动手做一个电影推荐 Agent
下面我们通过一个简单的例子,来展示如何使用 Blades 构建一个电影推荐 Agent。这个 Agent 会推荐一个中国明星,并列出他/她主演过的电影。
go
package main
import (
"context"
"log"
"github.com/go-kratos/blades"
"github.com/go-kratos/blades/contrib/openai"
)
func main() {
agent := blades.NewAgent(
"Template Agent",
blades.WithModel("qwen-plus"),
blades.WithProvider(openai.NewChatProvider()),
)
// Define templates and params
params := map[string]any{
"actor": "成龙",
"movies": "10",
}
// Build prompt using the template builder
// Note: Use exported methods when calling from another package.
prompt, err := blades.NewPromptTemplate().
System("你是一个电影电视剧推荐大师,根据用户信息进行推荐 {{.movies}} 作品。", params).
User("请为我推荐 {{.actor}} 的电影,请按照"标题(年份)、类型/风格 、推荐理由"的格式输出。", params).
Build()
if err != nil {
log.Fatal(err)
}
log.Println("Generated Prompt:", prompt.String())
// Run the agent with the templated prompt
result, err := agent.Run(context.Background(), prompt)
if err != nil {
log.Fatal(err)
}
log.Println(result.AsText())
}
执行程序后,你会得到类似如下的输出:
shell
2025/09/25 22:12:34 Generated Prompt: [Text: 你是一个电影电视剧推荐大师,根据用户信息进行推荐 10 作品。)][Text: 请为我推荐 成龙 的电影,请按照"标题(年份)、类型/风格 、推荐理由"的格式输出。)]
2025/09/25 22:12:34 Processing message: system [{你是一个电影电视剧推荐大师,根据用户信息进行推荐 10 作品。}]
2025/09/25 22:12:34 Processing message: user [{请为我推荐 成龙 的电影,请按照"标题(年份)、类型/风格 、推荐理由"的格式输出。}]
2025/09/25 22:13:00 当然可以!以下是10部成龙的经典电影推荐,涵盖动作、喜剧、冒险等多种风格,展现他独特的"功夫喜剧"魅力与特技表演:
1. **《警察故事》(1985)**
- 类型/风格:警匪 / 动作 / 犯罪
- 推荐理由:被誉为成龙最具代表性的作品之一,高难度实拍动作场面震撼影史,商场追击戏成为经典,充分展现其拼命三郎的敬业精神。
2. **《A计划》(1983)**
- 类型/风格:动作 / 喜剧 / 冒险
- 推荐理由:融合维多利亚时代背景与惊险钟楼跳伞戏,动作设计极具创意,幽默与紧张并存,是早期动作喜剧的巅峰之作。
....
说在最后
邀请所有 Go 开发者和 AI 爱好者访问我们的 GitHub 仓库,亲自体验 Blades 带来的开发乐趣。
- GitHub 仓库: github.com/go-kratos/b...
给项目一个 ⭐️ Star,探索 examples 目录下的更多用法,或者直接上手构建您的第一个 Go LLM 应用吧!
项目当前处于初期阶段,持续迭代中,期待反馈、建议和贡献