Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions pi/models.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package pi

import "belaykit"

// PricingForModel returns the token pricing for a given model ID.
// Pi supports many providers; this covers common models. Returns
// Claude Sonnet pricing as the default for unknown models.
func PricingForModel(model string) belaykit.ModelPricing {
switch model {
// Anthropic
case "claude-opus-4-6":
return belaykit.ModelPricing{InputPerMTok: 5, OutputPerMTok: 25}
case "claude-sonnet-4-20250514", "claude-sonnet-4-5-20250929":
return belaykit.ModelPricing{InputPerMTok: 3, OutputPerMTok: 15}
case "claude-haiku-4-5-20251001":
return belaykit.ModelPricing{InputPerMTok: 1, OutputPerMTok: 5}
// OpenAI
case "gpt-4o":
return belaykit.ModelPricing{InputPerMTok: 2.5, OutputPerMTok: 10}
case "gpt-4o-mini":
return belaykit.ModelPricing{InputPerMTok: 0.15, OutputPerMTok: 0.6}
case "o3":
return belaykit.ModelPricing{InputPerMTok: 10, OutputPerMTok: 40}
// Google
case "gemini-2.5-pro":
return belaykit.ModelPricing{InputPerMTok: 1.25, OutputPerMTok: 10}
case "gemini-2.5-flash":
return belaykit.ModelPricing{InputPerMTok: 0.15, OutputPerMTok: 0.6}
default:
return belaykit.ModelPricing{InputPerMTok: 3, OutputPerMTok: 15}
}
}

// ContextWindowForModel returns the context window size in tokens for a given
// model ID. Returns 200,000 as the default for unknown models.
func ContextWindowForModel(model string) int {
switch model {
case "gpt-4o", "gpt-4o-mini":
return 128_000
case "o3":
return 200_000
case "gemini-2.5-pro", "gemini-2.5-flash":
return 1_000_000
default:
return 200_000
}
}
83 changes: 83 additions & 0 deletions pi/options.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package pi

import "belaykit"

// ClientOption configures a Client.
type ClientOption func(*Client)

// WithExecutable sets the path to the pi CLI binary.
func WithExecutable(path string) ClientOption {
return func(c *Client) {
c.executable = path
}
}

// WithDefaultModel sets the default model for all runs. Supports pi's
// provider/id format (e.g. "anthropic/claude-sonnet-4-20250514") and
// optional thinking suffix (e.g. "sonnet:high").
func WithDefaultModel(model string) ClientOption {
return func(c *Client) {
c.defaultModel = model
}
}

// WithDefaultProvider sets the default provider for all runs (e.g. "anthropic",
// "openai", "google"). Can be omitted if the model string uses provider/id format.
func WithDefaultProvider(provider string) ClientOption {
return func(c *Client) {
c.defaultProvider = provider
}
}

// WithDefaultThinking sets the default thinking level for all runs.
// Valid levels: "off", "minimal", "low", "medium", "high", "xhigh".
func WithDefaultThinking(level string) ClientOption {
return func(c *Client) {
c.defaultThinking = level
}
}

// WithDefaultEventHandler sets the default event handler for all runs.
func WithDefaultEventHandler(h belaykit.EventHandler) ClientOption {
return func(c *Client) {
c.eventHandler = h
}
}

// WithObservability sets the observability provider for tracing and completion
// recording. When set, Run automatically calls RecordCompletion on the provider
// with data extracted from agent_end messages.
func WithObservability(provider belaykit.ObservabilityProvider) ClientOption {
return func(c *Client) {
c.observability = provider
}
}

// WithTools sets the built-in tools to enable (e.g. "read", "bash", "edit", "write").
// By default pi enables read, bash, edit, write.
func WithTools(tools ...string) ClientOption {
return func(c *Client) {
c.tools = tools
}
}

// WithNoTools disables all built-in tools. Extension tools still work.
func WithNoTools() ClientOption {
return func(c *Client) {
c.noTools = true
}
}

// WithExtension adds an extension to load (path, npm, or git source).
func WithExtension(source string) ClientOption {
return func(c *Client) {
c.extensions = append(c.extensions, source)
}
}

// WithWorkDir sets the working directory for the pi process.
func WithWorkDir(dir string) ClientOption {
return func(c *Client) {
c.workDir = dir
}
}
Loading