// Package examples_test provides runnable examples for flyto-agent. // // All examples require a real API key to execute. // Run a specific example: go test -v -run ExampleBasic ./examples/ package examples_test import ( "context" "fmt" "os" "time" "git.flytoex.net/yuanwei/flyto-agent/pkg/config" "git.flytoex.net/yuanwei/flyto-agent/pkg/engine" "git.flytoex.net/yuanwei/flyto-agent/pkg/execenv" "git.flytoex.net/yuanwei/flyto-agent/pkg/pricing" "git.flytoex.net/yuanwei/flyto-agent/pkg/providers/anthropic" ) // Example_basic demonstrates starting an agent in minimal form. func Example_basic() { agent, err := engine.New(&engine.Config{ Model: "claude-sonnet-4-6", Provider: anthropic.New(anthropic.Config{ APIKey: os.Getenv("ANTHROPIC_API_KEY"), }), Cwd: ".", Executor: execenv.DefaultExecutor{}, Tools: []string{"Bash", "Read", "Edit", "Glob", "Grep"}, }) if err != nil { fmt.Fprintln(os.Stderr, "error:", err) return } defer agent.Close() for event := range agent.Run(context.Background(), "查看当前目录结构") { switch e := event.(type) { case *engine.TextDeltaEvent: fmt.Print(e.Text) case *engine.ToolUseEvent: fmt.Printf("\n🔧 %s\n", e.ToolName) case *engine.DoneEvent: fmt.Printf("\n--- done: %d turns $%.4f ---\n", e.TurnCount, e.TotalCostUSD) case *engine.ErrorEvent: fmt.Fprintln(os.Stderr, "error:", e.Err) } } } // Example_withPricing demonstrates full integration: provider / pricing / tools / cost tracking. func Example_withPricing() { registry := config.NewModelRegistry() if n, err := pricing.LoadAndRegister(registry); err != nil { fmt.Fprintf(os.Stderr, "warning: pricing unavailable: %v\n", err) } else { fmt.Fprintf(os.Stderr, "loaded pricing for %d models\n", n) } agent, err := engine.New(&engine.Config{ Provider: anthropic.New(anthropic.Config{ APIKey: os.Getenv("ANTHROPIC_API_KEY"), BaseURL: os.Getenv("ANTHROPIC_BASE_URL"), EnableCaching: true, }), Model: "claude-sonnet-4-6", Cwd: ".", Executor: execenv.DefaultExecutor{}, Tools: []string{"Bash", "Read", "Glob", "Grep"}, Models: registry, MaxTurns: 20, MaxBudgetUSD: 0.50, SystemPrompt: "你是一个简洁的代码探索助手,回答精准。", }) if err != nil { fmt.Fprintln(os.Stderr, "fatal:", err) return } defer agent.Close() ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) defer cancel() var toolCalls int start := time.Now() for event := range agent.Run(ctx, "用 Glob 找出当前目录下所有 .go 文件,告诉我数量") { switch e := event.(type) { case *engine.TextDeltaEvent: fmt.Print(e.Text) case *engine.ToolUseEvent: fmt.Printf("\n🔧 %s\n", e.ToolName) toolCalls++ case *engine.WarningEvent: fmt.Fprintf(os.Stderr, "⚠️ [%s] %s\n", e.Code, e.Message) case *engine.ErrorEvent: fmt.Fprintln(os.Stderr, "error:", e.Err) case *engine.DoneEvent: fmt.Printf("\n--- done: %d turns %v $%.4f %d tool calls ---\n", e.TurnCount, time.Since(start).Round(time.Millisecond), e.TotalCostUSD, toolCalls) } } }