SDK/Go SDK/快速开始
快速开始
更新于: 2026-06-24 15:45:09
本文指导你如何安装并使用扣子罗盘 Go SDK 进行 Trace 数据上报、Prompt 拉取等操作。
扣子罗盘 Go SDK 适用于 Go 1.8 及以上版本。
安装 Go SDK 之前,执行以下命令确认你已安装 1.8 及以上版本的 Go。
# 查看 Go 版本
go version
# 回显信息显示已安装 1.18.10 版本
go version go 1.18.10 darwin/amd64
在使用扣子罗盘 Go SDK 前,确保你已经完成了授权。详情请参考SDK 鉴权。
执行以下命令安装扣子罗盘 Go SDK。
go get github.com/coze-dev/cozeloop-go
默认直接安装最新版本的 SDK。如果你想使用历史版本,单击此处查看历史版本记录和 README。
初始化扣子罗盘 Client 之后,才可以访问 SDK 提供的 API。
初始化时推荐通过环境变量动态获取访问密钥,以免硬编码引发数据安全风险。 设置完成环境变量后,你可以直接访问 SDK API 实现相应功能。
以下示例代码展示了如何使用扣子罗盘 SDK 创建并上报一个 Span。
说明
该示例中使用了 PAT 授权方式,在生产环境中推荐使用安全性更高的 OAuth 授权方式,详情参考配置 OAuth JWT 授权。
import (
"context"
"github.com/coze-dev/cozeloop-go"
)
func main() {
// 设置相关环境变量
// COZELOOP_WORKSPACE_ID=your workspace id
// COZELOOP_API_TOKEN=your token
// 直接调用api
ctx, span := cozeloop.StartSpan(context.Background(), "first_span", "custom")
span.Finish(ctx)
// 程序退出前,需要调用Close方法,否则可能造成trace数据上报丢失。Close后无法再执行任何操作。
cozeloop.Close(ctx)
}
你也可以通过创建 client 进行更多定制化配置。
说明
client 是协程安全的,一般一个进程中仅需要创建一个 client 即可。
import (
"context"
"github.com/coze-dev/cozeloop-go"
)
func main() {
// 设置相关环境变量
// COZELOOP_WORKSPACE_ID=your workspace id
// COZELOOP_API_TOKEN=your token
// 创建client
client, err := cozeloop.NewClient()
if err != nil {
panic(err)
}
// 通过client调用api
ctx, span := client.StartSpan(context.Background(), "first_span", "custom")
span.Finish(ctx)
// 程序退出前,需要调用Close方法,否则可能造成trace数据上报丢失。Close后无法再执行任何操作。
client.Close(ctx)
}
推荐使用 Eino 框架进行 Go 语言 AI 应用的开发。扣子罗盘基于 Eino 的 callback 机制,提供了一键集成能力,能够自动完成 AI 应用的 Trace 数据上报。
go get github.com/cloudwego/eino-ext/callbacks/cozeloop
以下示例代码展示了如何在 Eino 框架中集成扣子罗盘 SDK,通过回调机制自动记录和追踪程序运行状态。
defer 确保程序退出前正确关闭客户端。import (
"context"
ccb "github.com/cloudwego/eino-ext/callbacks/cozeloop"
"github.com/cloudwego/eino/callbacks"
"github.com/coze-dev/cozeloop-go"
)
func main() {
// 设置相关环境变量
// COZELOOP_WORKSPACE_ID=your workspace id
// COZELOOP_API_TOKEN=your token
ctx := context.Background()
client, err := cozeloop.NewClient()
if err != nil {
panic(err)
}
defer client.Close(ctx)
// 在服务 init 时 once 调用
handler := ccb.NewLoopHandler(client)
callbacks.AppendGlobalHandlers(handler)
}
你也可以通过扣子罗盘 SDK 提供的 low-level API,手动完成 Trace 数据的上报。
说明
Low-level API 是更底层的编程接口,提供基础功能的直接访问,需要开发者手动处理更多细节,但能实现更灵活的控制和定制化需求。
在处理用户请求时,建议为每个请求创建一个完整的 Trace 链路:从服务入口处创建 root span,记录用户输入、系统响应和关键业务标识(如请求ID、用户ID等),便于后续进行链路追踪和性能分析。当请求处理完成时,调用 Finish 方法结束追踪。
以下示例代码展示了如何使用扣子罗盘 SDK 创建一个完整的请求追踪链路(Trace)。
import (
"context"
"github.com/coze-dev/cozeloop-go"
)
func handler(ctx context.Context, input string) (string, error) {
// 开启span
ctx, span := cozeloop.StartSpan(ctx, "{your_span_name}", "{your_span_type}")
// 设置用户输入
span.SetInput(ctx, input)
// 设置相关业务id,可以使用Baggage能力将这些id全链路透传,减少重复代码,便于在平台上自由检索
span.SetUserIDBaggage(ctx, "{user_id}")
span.SetMessageIDBaggage(ctx, "{message_id}")
// 执行业务逻辑
output, err := DoSomething(ctx, input)
if err != nil {
// 设置错误信息
span.SetStatusCode(ctx, your_error_code)
span.SetError(ctx, err)
} else {
// 设置系统输出
span.SetOutput(ctx, output)
}
// 如果使用流式返回,记录首Token返回的微秒时间戳,SDK会自动计算首Token耗时
span.SetStartTimeFirstResp(ctx, {start_time_first_resp})
// span上报
span.Finish(ctx)
}
模型调用往往是最关键的节点,在模型调用前后,上报 Model Span。span_type应该使用model,建议使用 spec 公共包中的 ModelInput 和 ModelOutput 记录input和output,以便在平台获得更好的体验。
在进行模型调用时,建议创建专门的 Model Span 来追踪这个关键环节。以下示例代码展示了如何使用扣子罗盘 SDK 创建一个完整的模型调用追踪:
tracespec.VModelSpanType作为类型标识。tracespec.ModelInput记录系统提示词和用户输入。tracespec.ModelOutput记录模型响应。以下是完整的 Model Span 上报示例代码。
import (
"context"
"github.com/coze-dev/cozeloop-go"
"github.com/coze-dev/cozeloop-go/spec/tracespec"
)
var (
// 初始化client,打开prompt trace上报开关
client, _ = cozeloop.NewClient(cozeloop.WithPromptTrace(true))
)
func CallLLM(ctx context.Context, prompt *entity.Prompt) error {
// SpanType使用model
ctx, span := client.StartSpan(ctx, "{your_span_name}", tracespec.VModelSpanType)
defer span.Finish(ctx)
span.SetInput(ctx, tracespec.ModelInput{
Messages: []*tracespec.ModelMessage{
{
Role: tracespec.VRoleSystem,
Content: "{system_prompt}",
},
{
Role: tracespec.VRoleUser,
Content: "{user_prompt}",
},
},
})
// 设置模型提供商和模型名称
span.SetModelProvider(ctx, "{model_provider}")
span.SetModelName(ctx, "{model_name}")
// 关联PromptKey和Version
span.SetPrompt(ctx, *prompt)
// 设置Temperature, MaxTokens等其他参数
span.SetModelCallOptions(ctx, tracespec.ModelCallOption{})
// 使用任意方式调用大模型
// ...
span.SetOutput(ctx, tracespec.ModelOutput{
Choices: []*tracespec.ModelChoice{
{
Message: &tracespec.ModelMessage{
Role: tracespec.VRoleAssistant,
Content: "{model_response}",
},
},
},
})
// 设置InputTokens和OutputTokens,SDK会自动计算TotalTokens
span.SetInputTokens(ctx, {input_tokens})
span.SetOutputTokens(ctx, {output_tokens})
// 如果使用流式返回,记录首Token返回的微秒时间戳,SDK会自动计算首Token耗时
span.SetStartTimeFirstResp(ctx, {start_time_first_resp})
return nil
}
你可以在任何重要的业务节点创建自定义 span,通过设置以下信息进行全面追踪:
这种灵活的追踪方式让您能够根据业务需求,精确监控和分析任何关键流程。
以下示例代码展示了如何创建自定义 Span。
import (
"context"
"github.com/coze-dev/cozeloop-go"
)
var (
// 初始化client,打开prompt trace上报开关
client, _ = cozeloop.NewClient(cozeloop.WithPromptTrace(true))
)
func CustomFunc(ctx context.Context) error {
ctx, span := client.StartSpan(ctx, "{your_span_name}", "{your_span_type}")
span.SetInput(ctx, "{your_input}")
// 设置自定义tag
span.SetTags(ctx, map[string]any{})
// 执行业务逻辑
err := DoSomething()
if err != nil {
span.SetError(ctx, err)
span.SetStatusCode(ctx, {your_error_code})
} else {
span.SetStatusCode(ctx, 0)
}
span.SetOutput(ctx, "{your_output}")
span.Finish(ctx)
return err
}
在使用 SDK 拉取 Prompt 前,需要在扣子罗盘的 Prompt 开发页面获取 Prompt Key 和版本号。
说明
只支持获取已提交的 Prompt 配置。
扣子罗盘 SDK 提供的 Prompt 组件,支持 Prompt 拉取能力。该组件还支持与 Eino 框架无缝集成,为 Eino 框架提供 Prompt 的统一管理和版本控制。
go get github.com/cloudwego/eino-ext/components/prompt/cozeloop
以下示例代码展示了如何通过扣子罗盘 Go SDK 使用 PromptHub 能力。
package main
import (
"context"
"log"
"github.com/cloudwego/eino-ext/components/prompt/cozeloop"
"github.com/cloudwego/eino/compose"
"github.com/cloudwego/eino/schema"
cozeloopgo "github.com/coze-dev/cozeloop-go"
)
func main() {
// Set the following environment variables first:
// COZELOOP_WORKSPACE_ID=your workspace id
// COZELOOP_API_TOKEN=your token (for testing)
// Or use JWT OAuth with:
// COZELOOP_JWT_OAUTH_CLIENT_ID=your client id
// COZELOOP_JWT_OAUTH_PRIVATE_KEY=your private key
// COZELOOP_JWT_OAUTH_PUBLIC_KEY_ID=your public key id
ctx := context.Background()
// Initialize CozeLoop client
client, err := cozeloopgo.NewClient()
if err != nil {
log.Fatalf("Failed to create CozeLoop client: %v", err)
}
defer client.Close(ctx)
// Create PromptHub component
ph, err := cozeloop.NewPromptHub(ctx, &cozeloop.Config{
Key: "your.prompt.key", // Replace with your prompt key
Version: "", // Empty for latest version, or specify like "1.0.0"
CozeLoopClient: client,
})
if err != nil {
log.Fatalf("Failed to create PromptHub: %v", err)
}
// Example 1: Direct usage - Format the prompt with variables
log.Println("=== Example 1: Direct Format ===")
input := map[string]any{
"input": "What is the weather like today?",
// Add other variables your prompt template requires
// For example:
// "user_name": "Alice",
// "context": "some context",
}
messages, err := ph.Format(ctx, input)
if err != nil {
log.Fatalf("Failed to format prompt: %v", err)
}
log.Printf("Formatted prompt messages: %+v\n", messages)
// Example 2: Using with Graph
log.Println("\n=== Example 2: Using with Graph ===")
g := compose.NewGraph[map[string]any, []*schema.Message]()
err = g.AddChatTemplateNode("your_node_key", ph)
if err != nil {
log.Fatalf("Failed to add PromptHub node: %v", err)
}
// Add edges to connect the node from START to END
err = g.AddEdge(compose.START, "your_node_key")
if err != nil {
log.Fatalf("Failed to add edge from START: %v", err)
}
err = g.AddEdge("your_node_key", compose.END)
if err != nil {
log.Fatalf("Failed to add edge to END: %v", err)
}
// Compile the graph
runnable, err := g.Compile(ctx)
if err != nil {
log.Fatalf("Failed to compile graph: %v", err)
}
// Run the graph with the same input
output, err := runnable.Invoke(ctx, input)
if err != nil {
log.Fatalf("Failed to run graph: %v", err)
}
// Print the result
log.Printf("Graph output: %+v\n", output)
}
扣子罗盘 SDK 提供接口来拉取在扣子罗盘中创建并提交的 Prompt。通过 GetPrompt 方法可以获取指定 Key 的 Prompt(支持指定版本),然后使用 PromptFormat 方法完成变量替换。启用 PromptTrace 功能后,SDK 会自动记录 Prompt 的获取和渲染过程,便于后续分析和优化。
以下是 Prompt 上报的示例代码。
import (
"context"
"github.com/coze-dev/cozeloop-go"
"github.com/coze-dev/cozeloop-go/entity"
)
var (
// 初始化client,打开prompt trace上报开关
client, _ = cozeloop.NewClient(cozeloop.WithPromptTrace(true))
)
func GetPrompt(ctx context.Context, params map[string]any) ([]*entity.Message, error) {
// 当version不为空时,将拉取特定版本的prompt
// 当version为空时,将拉取最新版本的prompt
prompt, _ := client.GetPrompt(ctx, cozeloop.GetPromptParam{PromptKey: {promptKey}, Version: {version}})
// 完成prompt中的变量替换
return client.PromptFormat(ctx, prompt, params)
}
扣子罗盘 Go SDK 提供多种授权方式、常见使用方式的示例代码,便于开发者直接参考使用。 更多示例,访问 Github。
|
模块 |
示例文件 |
说明 |
|---|---|---|
|
授权 |
通过个人访问密钥实现授权。 |
|
|
通过 OAuth JWT 方式实现授权。 |
||
|
Prompt |
拉取扣子罗盘空间内的 Prompt,并进行变量替换。 |
|
|
拉取扣子罗盘空间内的使用 Jinja2 模版的 Prompt,并进行变量替换。 |
||
|
拉取扣子罗盘空间内的 Prompt,并注入多模态变量。 |
||
|
Trace |
实现最基本的 Trace 数据上报。 |
|
|
正确设置 span 的父子关系。 |
||
|
实现超大文本上报。 |
||
|
实现多模态数据上报。 |
||
|
实现跨进程 Trace 数据串联。 |
||
|
异常处理 |
处理 SDK 异常。 |
|
|
获取日志 |
修改 SDK 内部打印日志的级别。 |