Documentation
¶
Overview ¶
Package core provides the Anthropic API client and core conversation functionality. ABOUTME: HTTP client for Anthropic Messages API ABOUTME: Handles authentication, request formatting, and response parsing
Package core provides the Anthropic API client and core conversation functionality. ABOUTME: Configuration loading with multi-source precedence support ABOUTME: Handles env vars, .env files, YAML config, and defaults via Viper
Package core provides the Anthropic API client and core conversation functionality. ABOUTME: Application-wide constants and default values ABOUTME: Centralizes magic strings and configuration defaults
Package core provides the Anthropic API client and core conversation functionality. ABOUTME: Image loading and encoding for vision API support ABOUTME: Handles file validation, size limits, and base64 encoding
Package core provides the Anthropic API client and core conversation functionality. ABOUTME: SSE streaming support for Anthropic API ABOUTME: Parses server-sent events, accumulates deltas, yields chunks
Index ¶
- Constants
- Variables
- func EncodeImage(data []byte, _ string) string
- type Client
- type ClientOption
- type Config
- type Content
- type ContentBlock
- type Delta
- type ImageSource
- type Message
- type MessageRequest
- type MessageResponse
- type StreamAccumulator
- type StreamChunk
- type ToolDefinition
- type ToolUse
- type Usage
Constants ¶
const DefaultModel = "claude-sonnet-4-5-20250929"
DefaultModel is the default AI model to use when none is specified
const ( // MaxImageSize is the maximum allowed image file size (5MB) // This matches Claude API limits MaxImageSize = 5 * 1024 * 1024 )
Variables ¶
var ( Version = "dev" Commit = "unknown" Date = "unknown" )
Build information - set via ldflags at build time
Functions ¶
func EncodeImage ¶
EncodeImage encodes image data to base64
Types ¶
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client is the Anthropic API client
func NewClient ¶
func NewClient(apiKey string, opts ...ClientOption) *Client
NewClient creates a new API client
func (*Client) CreateMessage ¶
func (c *Client) CreateMessage(ctx context.Context, req MessageRequest) (*MessageResponse, error)
CreateMessage sends a message to the API
func (*Client) CreateMessageStream ¶
func (c *Client) CreateMessageStream(ctx context.Context, req MessageRequest) (<-chan *StreamChunk, error)
CreateMessageStream sends a streaming request and returns a channel of chunks
type ClientOption ¶
type ClientOption func(*Client)
ClientOption configures a Client
func WithHTTPClient ¶
func WithHTTPClient(client *http.Client) ClientOption
WithHTTPClient sets a custom HTTP client
type Config ¶
type Config struct {
APIKey string `mapstructure:"api_key"`
Provider string `mapstructure:"provider"`
Model string `mapstructure:"model"`
DefaultTools []string `mapstructure:"default_tools"`
PermissionMode string `mapstructure:"permission_mode"`
Theme string `mapstructure:"theme"`
Hooks hooks.HooksConfig `mapstructure:"hooks"`
}
Config holds application configuration
func LoadConfig ¶
LoadConfig loads configuration from multiple sources Priority (highest to lowest): 1. Environment variables (JEFF_*) 2. .env file (current directory) 3. ~/.jeff/config.yaml 4. Defaults
type Content ¶
type Content struct {
Type string `json:"type"` // "text" or "tool_use"
Text string `json:"text,omitempty"`
ID string `json:"id,omitempty"`
Name string `json:"name,omitempty"`
Input map[string]interface{} `json:"input,omitempty"`
}
Content represents a content block in the response
type ContentBlock ¶
type ContentBlock struct {
Type string `json:"type"` // "text", "image", "tool_use", or "tool_result"
Text string `json:"text,omitempty"` // For text blocks
Source *ImageSource `json:"source,omitempty"` // For image blocks
ID string `json:"id,omitempty"` // For tool_use and tool_result blocks
Name string `json:"name,omitempty"` // For tool_use blocks
Input map[string]interface{} `json:"input"` // For tool_use blocks (required by API, even if empty)
ToolUseID string `json:"tool_use_id,omitempty"` // For tool_result blocks (ID field above is for tool_use)
Content string `json:"content,omitempty"` // For tool_result blocks
}
ContentBlock represents a single block of content (text, image, tool_use, or tool_result)
func NewImageBlock ¶
func NewImageBlock(source *ImageSource) ContentBlock
NewImageBlock creates an image content block
func NewTextBlock ¶
func NewTextBlock(text string) ContentBlock
NewTextBlock creates a text content block
func NewToolResultBlock ¶
func NewToolResultBlock(toolUseID string, content string) ContentBlock
NewToolResultBlock creates a tool_result content block
func (ContentBlock) MarshalJSON ¶ added in v0.3.0
func (cb ContentBlock) MarshalJSON() ([]byte, error)
MarshalJSON implements custom JSON marshalling for ContentBlock This ensures fields are only included for appropriate block types
type Delta ¶
type Delta struct {
Type string `json:"type"`
Text string `json:"text,omitempty"`
PartialJSON string `json:"partial_json,omitempty"` // For input_json_delta
StopReason string `json:"stop_reason,omitempty"` // For message_delta
StopSequence string `json:"stop_sequence,omitempty"` // For message_delta
}
Delta represents incremental content in streaming
type ImageSource ¶
type ImageSource struct {
Type string `json:"type"` // Always "base64"
MediaType string `json:"media_type"` // e.g., "image/png"
Data string `json:"data"` // Base64 encoded image data
}
ImageSource represents an image for vision API
func LoadImage ¶
func LoadImage(path string) (*ImageSource, error)
LoadImage loads an image from a file path and returns an ImageSource Returns error if file doesn't exist, is too large, or has unsupported format
type Message ¶
type Message struct {
ID string `json:"id,omitempty"`
Role string `json:"role"` // "user", "assistant", "system"
Content string `json:"-"` // Internal field, not directly serialized
ContentBlock []ContentBlock `json:"-"` // Internal field, not directly serialized
ToolCalls []ToolUse `json:"tool_calls,omitempty"`
CreatedAt *time.Time `json:"created_at,omitempty"`
}
Message represents a single message in a conversation
func (Message) MarshalJSON ¶
MarshalJSON implements custom JSON marshalling for Message This handles the Claude API requirement that 'content' can be either a string or an array
func (*Message) UnmarshalJSON ¶
UnmarshalJSON implements custom JSON unmarshalling for Message
type MessageRequest ¶
type MessageRequest struct {
Model string `json:"model"`
Messages []Message `json:"messages"`
MaxTokens int `json:"max_tokens"`
Stream bool `json:"stream,omitempty"`
Tools []ToolDefinition `json:"tools,omitempty"`
System string `json:"system,omitempty"`
}
MessageRequest is sent to the API
type MessageResponse ¶
type MessageResponse struct {
ID string `json:"id"`
Type string `json:"type"`
Role string `json:"role"`
Content []Content `json:"content"`
Model string `json:"model"`
StopReason string `json:"stop_reason,omitempty"`
Usage Usage `json:"usage"`
}
MessageResponse is received from the API
func (*MessageResponse) GetTextContent ¶
func (r *MessageResponse) GetTextContent() string
GetTextContent extracts text content from response
type StreamAccumulator ¶
type StreamAccumulator struct {
// contains filtered or unexported fields
}
StreamAccumulator accumulates text deltas from streaming chunks
func NewStreamAccumulator ¶
func NewStreamAccumulator() *StreamAccumulator
NewStreamAccumulator creates a new accumulator
func (*StreamAccumulator) Add ¶
func (a *StreamAccumulator) Add(chunk *StreamChunk)
Add accumulates a chunk's text delta
func (*StreamAccumulator) GetText ¶
func (a *StreamAccumulator) GetText() string
GetText returns the accumulated text
func (*StreamAccumulator) Reset ¶
func (a *StreamAccumulator) Reset()
Reset clears the accumulated text
type StreamChunk ¶
type StreamChunk struct {
Type string `json:"type"`
Delta *Delta `json:"delta,omitempty"`
Content *Content `json:"content,omitempty"`
ContentBlock *Content `json:"content_block,omitempty"` // For content_block_start events
Index int `json:"index,omitempty"` // Content block index
Usage *Usage `json:"usage,omitempty"`
Done bool `json:"-"`
}
StreamChunk represents a chunk in streaming response
func ParseSSEChunk ¶
func ParseSSEChunk(data string) (*StreamChunk, error)
ParseSSEChunk parses a single SSE data line into a StreamChunk
type ToolDefinition ¶
type ToolDefinition struct {
Name string `json:"name"`
Description string `json:"description"`
InputSchema map[string]interface{} `json:"input_schema"`
}
ToolDefinition defines a tool's schema