# CLAUDE.md for go-llm v2 ## Build and Test Commands - Build project: `cd v2 && go build ./...` - Run all tests: `cd v2 && go test ./...` - Run specific test: `cd v2 && go test -v -run ./...` - Tidy dependencies: `cd v2 && go mod tidy` - Vet: `cd v2 && go vet ./...` ## Code Style Guidelines - **Indentation**: Standard Go tabs - **Naming**: `camelCase` for unexported, `PascalCase` for exported - **Error Handling**: Always check and handle errors immediately. Wrap with `fmt.Errorf("%w: ...", err)` - **Imports**: Standard library first, then third-party, then internal packages ## Package Structure - Root package `llm` — public API (Client, Model, Chat, ToolBox, Message types) - `provider/` — Provider interface that backends implement - `openai/`, `anthropic/`, `google/` — Provider implementations - `tools/` — Ready-to-use sample tools (WebSearch, Browser, Exec, ReadFile, WriteFile, HTTP) - `internal/schema/` — JSON Schema generation from Go structs - `internal/imageutil/` — Image compression utilities ## Key Design Decisions 1. Unified `Message` type instead of marker interfaces 2. `map[string]any` JSON Schema (no provider coupling) 3. Tool functions return `(string, error)`, use standard `context.Context` 4. `Chat.Send()` auto-loops tool calls; `Chat.SendRaw()` for manual control 5. MCP one-call connect: `MCPStdioServer(ctx, cmd, args...)` 6. Streaming via pull-based `StreamReader.Next()` 7. Middleware for logging, retry, timeout, usage tracking