Spaces:
Paused
Paused
| package model | |
| import "encoding/json" | |
| // AnthropicRequest represents a request to the Anthropic Messages API | |
| type AnthropicRequest struct { | |
| Model string `json:"model"` | |
| MaxTokens int `json:"max_tokens"` | |
| System interface{} `json:"system,omitempty"` // string or []AnthropicContentBlock | |
| Messages []AnthropicMessage `json:"messages"` | |
| Tools []AnthropicTool `json:"tools,omitempty"` | |
| ToolChoice interface{} `json:"tool_choice,omitempty"` | |
| Stream bool `json:"stream"` | |
| Thinking *AnthropicThinking `json:"thinking,omitempty"` | |
| } | |
| // AnthropicThinking controls thinking/reasoning behavior | |
| type AnthropicThinking struct { | |
| Type string `json:"type"` // "enabled" or "disabled" | |
| BudgetTokens int `json:"budget_tokens,omitempty"` | |
| } | |
| // AnthropicMessage represents a message in Anthropic format | |
| type AnthropicMessage struct { | |
| Role string `json:"role"` | |
| Content interface{} `json:"content"` // string or []AnthropicContentBlock | |
| } | |
| // ParseContent extracts text content from an Anthropic message. | |
| // Content can be a plain string or an array of content blocks. | |
| func (m *AnthropicMessage) ParseContent() (text string, blocks []AnthropicContentBlock) { | |
| switch c := m.Content.(type) { | |
| case string: | |
| return c, nil | |
| case []interface{}: | |
| for _, item := range c { | |
| raw, err := json.Marshal(item) | |
| if err != nil { | |
| continue | |
| } | |
| var block AnthropicContentBlock | |
| if err := json.Unmarshal(raw, &block); err != nil { | |
| continue | |
| } | |
| blocks = append(blocks, block) | |
| if block.Type == "text" { | |
| text += block.Text | |
| } | |
| } | |
| } | |
| return text, blocks | |
| } | |
| // AnthropicContentBlock represents a content block in Anthropic messages | |
| type AnthropicContentBlock struct { | |
| Type string `json:"type"` | |
| // text block | |
| Text string `json:"text,omitempty"` | |
| // thinking block | |
| Thinking string `json:"thinking,omitempty"` | |
| // tool_use block | |
| ID string `json:"id,omitempty"` | |
| Name string `json:"name,omitempty"` | |
| Input json.RawMessage `json:"input,omitempty"` | |
| // tool_result block | |
| ToolUseID string `json:"tool_use_id,omitempty"` | |
| Content interface{} `json:"content,omitempty"` // string or []AnthropicContentBlock | |
| IsError bool `json:"is_error,omitempty"` | |
| // image block | |
| Source *AnthropicImageSource `json:"source,omitempty"` | |
| } | |
| // AnthropicImageSource for base64 image content | |
| type AnthropicImageSource struct { | |
| Type string `json:"type"` // "base64" | |
| MediaType string `json:"media_type"` // "image/png" etc | |
| Data string `json:"data"` | |
| } | |
| // AnthropicTool represents a tool definition in Anthropic format | |
| type AnthropicTool struct { | |
| Name string `json:"name"` | |
| Description string `json:"description,omitempty"` | |
| InputSchema interface{} `json:"input_schema"` | |
| } | |
| // AnthropicResponse represents a non-streaming response | |
| type AnthropicResponse struct { | |
| ID string `json:"id"` | |
| Type string `json:"type"` // "message" | |
| Role string `json:"role"` // "assistant" | |
| Content []AnthropicContentBlock `json:"content"` | |
| Model string `json:"model"` | |
| StopReason string `json:"stop_reason"` // "end_turn", "tool_use", "max_tokens" | |
| StopSequence *string `json:"stop_sequence"` | |
| Usage AnthropicUsage `json:"usage"` | |
| } | |
| // AnthropicUsage tracks token usage | |
| type AnthropicUsage struct { | |
| InputTokens int `json:"input_tokens"` | |
| OutputTokens int `json:"output_tokens"` | |
| } | |
| // Streaming event types | |
| // AnthropicStreamEvent wraps all SSE event data | |
| type AnthropicStreamEvent struct { | |
| Type string `json:"type"` | |
| } | |
| // AnthropicMessageStart is the message_start event | |
| type AnthropicMessageStart struct { | |
| Type string `json:"type"` // "message_start" | |
| Message AnthropicResponse `json:"message"` | |
| } | |
| // AnthropicContentBlockStart is the content_block_start event | |
| type AnthropicContentBlockStart struct { | |
| Type string `json:"type"` // "content_block_start" | |
| Index int `json:"index"` | |
| ContentBlock AnthropicContentBlock `json:"content_block"` | |
| } | |
| // AnthropicContentBlockDelta is the content_block_delta event | |
| type AnthropicContentBlockDelta struct { | |
| Type string `json:"type"` // "content_block_delta" | |
| Index int `json:"index"` | |
| Delta AnthropicContentBlockDelta2 `json:"delta"` | |
| } | |
| // AnthropicContentBlockDelta2 is the delta payload within content_block_delta | |
| type AnthropicContentBlockDelta2 struct { | |
| Type string `json:"type"` // "text_delta", "thinking_delta", "input_json_delta" | |
| Text string `json:"text,omitempty"` // for text_delta | |
| Thinking string `json:"thinking,omitempty"` // for thinking_delta | |
| PartialJSON string `json:"partial_json,omitempty"` // for input_json_delta | |
| } | |
| // AnthropicContentBlockStop is the content_block_stop event | |
| type AnthropicContentBlockStop struct { | |
| Type string `json:"type"` // "content_block_stop" | |
| Index int `json:"index"` | |
| } | |
| // AnthropicMessageDelta is the message_delta event | |
| type AnthropicMessageDelta struct { | |
| Type string `json:"type"` // "message_delta" | |
| Delta struct { | |
| StopReason string `json:"stop_reason"` | |
| StopSequence *string `json:"stop_sequence"` | |
| } `json:"delta"` | |
| Usage AnthropicUsage `json:"usage"` | |
| } | |
| // AnthropicMessageStop is the message_stop event | |
| type AnthropicMessageStop struct { | |
| Type string `json:"type"` // "message_stop" | |
| } | |