GAI 是 AI Skill Hub 本期精选Agent工作流之一。综合评分 8.0 分,整体质量较高。我们强烈推荐将其纳入你的 AI 工具库,帮助提升工作效率。
GAI 是一套完整的 AI Agent 自动化工作流方案。通过可视化的节点编排,将复杂的多步骤任务拆解为清晰的自动化流程,实现全程无人值守的智能处理。支持与数百种外部服务和 API 无缝集成,适合构建数据处理管线、业务自动化和 AI 辅助决策系统。
GAI 是一套完整的 AI Agent 自动化工作流方案。通过可视化的节点编排,将复杂的多步骤任务拆解为清晰的自动化流程,实现全程无人值守的智能处理。支持与数百种外部服务和 API 无缝集成,适合构建数据处理管线、业务自动化和 AI 辅助决策系统。
# 方式一:go install(推荐) go install github.com/lace-ai/gai@latest # 方式二:从源码编译 git clone https://github.com/lace-ai/gai cd gai go build -o gai . # 方式三:下载预编译二进制 # 访问 Releases 页面下载对应平台二进制文件 # https://github.com/lace-ai/gai/releases
# 查看帮助 gai --help # 基本运行 gai [options] <input> # 详细使用说明请查阅文档 # https://github.com/lace-ai/gai
# gai 配置说明 # 查看配置选项 gai --config-example > config.yml # 常见配置项 # output_dir: ./output # log_level: info # workers: 4 # 环境变量(覆盖配置文件) export GAI_CONFIG="/path/to/config.yml"
<p><strong>Type-safe, provider-neutral agent runtime for Go.</strong></p> <p>Build streaming, tool-using agents across OpenAI, Anthropic, Gemini, and Mistral without hiding provider-native capabilities.</p>
<p> <a href="https://github.com/lace-ai/gai/blob/main/go.mod"><img alt="Go version" src="https://img.shields.io/github/go-mod/go-version/lace-ai/gai"></a> <a href="https://github.com/lace-ai/gai/actions"><img alt="CI" src="https://github.com/lace-ai/gai/actions/workflows/go.yml/badge.svg"></a> <a href="https://github.com/lace-ai/gai/blob/main/LICENSE"><img alt="MIT license" src="https://img.shields.io/badge/license-MIT-informational.svg"></a> <a href="https://pkg.go.dev/github.com/lace-ai/gai"><img alt="Go reference" src="https://pkg.go.dev/badge/github.com/lace-ai/gai.svg"></a> </p> </div>
GAI is a composable Go runtime for model calls, tools, streaming, context, history, and observability. Shared APIs keep application code provider-neutral, while built-in adapters preserve native tools, structured output, reasoning controls, and message history where supported.
Project status: GAI is pre-v1. It is already usable, but public APIs may still change before the first stable release.
1.26.9 or newerInstall the module in an existing application:
go get github.com/lace-ai/gai
This complete program streams a response from an OpenAI-backed agent:
package main
import (
"context"
"fmt"
"io"
"log"
"os"
"github.com/lace-ai/gai/agent"
"github.com/lace-ai/gai/ai"
"github.com/lace-ai/gai/ai/openai"
"github.com/lace-ai/gai/modelinput"
)
func main() {
if err := run(context.Background()); err != nil {
log.Fatal(err)
}
}
func run(ctx context.Context) error {
provider := openai.New(os.Getenv("OPENAI_API_KEY"), nil)
model, err := provider.Model("gpt-4.1-mini")
if err != nil {
return err
}
if closer, ok := model.(io.Closer); ok {
defer func() {
if err := closer.Close(); err != nil {
log.Printf("close model: %v", err)
}
}()
}
assistant := agent.New(agent.Definition{
Name: "assistant",
Model: model,
Prompt: func(context.Context, agent.RunInput) (modelinput.PromptBuilder, error) {
return modelinput.New(modelinput.Definition{
SystemInstructions: []modelinput.Part{
modelinput.NewTextPart("You are a concise, helpful assistant."),
},
}), nil
},
})
workflow, err := assistant.NewRun(ctx, agent.RunInput{
Prompt: modelinput.PromptInput{
User: ai.TextParts("What is the capital of France?"),
},
})
if err != nil {
log.Fatal(err)
}
for event := range workflow.RunEvents(ctx) {
switch event.Type {
case agent.EventOutput:
if event.Output != nil && event.Output.Kind == agent.OutputText {
fmt.Print(event.Output.Text)
}
}
}
fmt.Println()
_, err = workflow.Wait()
return err
}
Use Workflow.Run(ctx) when only the final result is needed. Use Workflow.RunEvents(ctx) for ordered streaming and call Wait after draining the channel. Both APIs execute the same middleware-aware pipeline. Each workflow is single-use; create a new workflow from the reusable agent definition for each request.
agent is the high-level API: it owns reusable definitions, per-run configuration, workflow lifecycle, middleware, and aggregate results. loop is the canonical low-level execution API and owns tools, tool responses and helpers, selection and transport, ordered events, and iterations. ai owns provider-neutral request, definition, and call types. Use agent for application workflows; use loop directly only when an application deliberately needs mutable execution control.
loop.Loop.Run exposes low-level loop.Event values. Workflow.RunEvents exposes higher-level agent.Event values covering visible output, primary and middleware stages, and one final workflow outcome. Workflow results contain copied loop.Iteration snapshots. Prompt-only tool rendering accepts modelinput.ToolSignature, so context packages do not require executable tools.
A tool has a typed schema and a Go function:
type Tool interface {
Name() string
Description() string
Params() ai.ToolParameters
Function(ctx context.Context, req ai.ToolCall) (string, error)
}
Tool parameters are converted to JSON Schema for provider-native function calling. Models that do not support native tools can use GAI's text tool protocol.
func (t *LookupOrderTool) Params() ai.ToolParameters {
return ai.ToolParameters{
Strict: true,
Properties: []ai.ToolParameter{
{
Name: "order_id",
Type: ai.ToolParameterString,
Description: "The order ID to look up.",
Required: true,
},
},
}
}
func (t *LookupOrderTool) Function(
ctx context.Context,
req ai.ToolCall,
) (string, error) {
var args struct {
OrderID string `json:"order_id"`
}
if err := loop.DecodeToolArgs(req, &args); err != nil {
return "", err
}
return `{"status":"in_transit"}`, nil
}
Use loop.NewTool(name, description, params, handler) to wrap a handler without a custom struct. A non-nil handler error becomes a tool failure the model can read. ToolResultProcessor can transform results before they reach the conversation, events, or loop telemetry.
Attach tools to an agent definition:
support := agent.New(agent.Definition{
Name: "support",
Model: model,
Tools: []loop.Tool{lookupOrderTool},
Prompt: supportPrompt,
})
The loop sends definitions to the model, executes requested calls, appends tool results to the conversation, and continues until the model commits a normal response or the iteration limit is reached. Tools registered with ToolOptions.Terminal complete the primary loop without another model generation. A terminal registration can set AllowNonTerminalCalls to execute mixed batches normally and continue instead.
Use ToolExecution to set concurrency and default handler deadlines, and loop.WithToolOptions for per-tool traits, serial execution, timeouts, or a shared guard. ToolPolicy authorizes before admission; ToolApprovalResolver handles in-process approval. ToolResultProcessor transforms output before it reaches events, conversation history, and loop telemetry. These settings are available on both loop.Loop and agent.Definition, with per-run agent overrides. See tool execution and migration for examples, terminal presentation batches, defaults, approval semantics, ordering, and cancellation guarantees.
Use RunInput.Execution to override an agent's defaults for one run. Omitted fields inherit from Definition.
workflow, err := support.NewRun(ctx, agent.RunInput{
Execution: &agent.ExecutionOverrides{
Tools: []loop.Tool{lookupOrderToolForUser(userID)},
},
})
RunEvents exposes the workflow's ordered, middleware-aware event stream:
for event := range workflow.RunEvents(ctx) {
switch event.Type {
case agent.EventAttemptStart:
// A generation attempt began.
case agent.EventOutput:
// Every EventOutput is externally visible, independent of Source.Index.
render(event.Output)
case agent.EventRetry:
// Roll back output associated with event.AttemptID.
case agent.EventIterationDone:
// One model/tool iteration completed.
case agent.EventStageStart, agent.EventStageFinish:
// Observe primary and middleware-agent lifecycle.
case agent.EventDone:
// The complete workflow finished successfully.
case agent.EventError, agent.EventCanceled:
// Handle terminal failure or cancellation.
}
}
result, err := workflow.Wait()
For non-streaming use, result, err := workflow.Run(ctx) starts and internally drains that same pipeline. Wait is repeatable and concurrency-safe; Result returns a non-blocking defensive snapshot.
Middleware stages run after an upstream agent completes and are suited to tasks such as memory extraction, auditing, formatting, and evaluation.
agent.NewAgentMiddleware adapts another agent with one of three output policies:
PreserveOutput keeps the upstream output and records the stage result.AppendOutput emits accepted stage output after the upstream output.ReplaceOutput replaces the visible output with accepted stage output after a successful stage.Nested attempt and tool lifecycle events stream while an agent-middleware stage runs. Nested EventOutput does not: PreserveOutput suppresses it, while AppendOutput and ReplaceOutput buffer it until the nested run completes and retry/discard outcomes determine which output is accepted. Consequently, a nested attempt's EventIterationDone precedes its accepted EventOutput; that output is emitted before the middleware EventStageFinish.
Use AgentMiddlewareConfig.MapInput to map a typed upstream WorkflowResult into the next agent's RunInput. Use MiddlewareFunc for transformations that do not need another model call.
Middleware is post-processing, not a supervisor or handoff runtime. Tool authorization and approval belong at the tool-execution boundary rather than in workflow middleware.
agent/ Reusable agent definitions, workflows, middleware, and summary agents
ai/ Provider-neutral requests, responses, tools, capabilities, and providers
modelinput/ Prompt construction, rendering, structured input, and messages
modelinput/history/ Persisted history selection and optional summarization
modelinput/tooldefinitions/ Prompt-only tool definitions
context/ Deprecated compatibility packages for the former paths
loop/ Ordered model/tool execution and tool helpers
observability/langfuse/ Optional Langfuse OpenTelemetry exporter setup
testutil/ Mocks and helpers used by tests
高质量的AI工作流框架,易于使用
该工具使用 LGPL-2.1 协议,商用场景请仔细阅读协议条款,必要时咨询法律意见。
AI Skill Hub 为第三方内容聚合平台,本页面信息基于公开数据整理,不对工具功能和质量作任何法律背书。
建议在沙箱或测试环境中充分验证后,再部署至生产环境,并做好必要的安全评估。
⚠️ LGPL 2.1 — 弱 Copyleft,可动态链接到商业软件,但修改库本身须开源。
经综合评估,GAI 在Agent工作流赛道中表现稳健,质量优秀。如果你已有明确的使用需求,可以直接上手体验;如果还在评估阶段,建议对比同类工具后再做决策。
| 原始名称 | gai |
| 原始描述 | 开源AI工作流:🤖 GAI is a flexible Go framework for building agent-style applications on top o。⭐8 · Go |
| Topics | AIGo工作流 |
| GitHub | https://github.com/lace-ai/gai |
| License | LGPL-2.1 |
| 语言 | Go |
收录时间:2026-06-03 · 更新时间:2026-06-05 · License:LGPL-2.1 · AI Skill Hub 不对第三方内容的准确性作法律背书。
选择 Agent 类型,复制安装指令后粘贴到对应客户端