Some checks failed
Build & Sign Wraith / Build Windows + Sign (push) Has been cancelled
- OAuth PKCE flow for Max subscription auth (no API key needed) - Claude API client with SSE streaming (Messages API v1) - 16 tool definitions: terminal, SFTP, RDP, session management - Tool dispatch router mapping to existing Wraith services - Conversation manager with SQLite persistence - Terminal output ring buffer for AI context - RDP screenshot encoder (RGBA → JPEG with downscaling) - Wired into Wails app as AIService Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
76 lines
2.3 KiB
Go
76 lines
2.3 KiB
Go
package ai
|
|
|
|
import (
|
|
"encoding/json"
|
|
"time"
|
|
)
|
|
|
|
// Message represents a single message in a conversation with Claude.
|
|
type Message struct {
|
|
Role string `json:"role"` // "user" or "assistant"
|
|
Content []ContentBlock `json:"content"` // one or more content blocks
|
|
}
|
|
|
|
// ContentBlock is a polymorphic block within a Message.
|
|
// Only one of the content fields will be populated depending on Type.
|
|
type ContentBlock struct {
|
|
Type string `json:"type"` // "text", "image", "tool_use", "tool_result"
|
|
|
|
// text
|
|
Text string `json:"text,omitempty"`
|
|
|
|
// image (base64 source)
|
|
Source *ImageSource `json:"source,omitempty"`
|
|
|
|
// tool_use
|
|
ID string `json:"id,omitempty"`
|
|
Name string `json:"name,omitempty"`
|
|
Input json.RawMessage `json:"input,omitempty"`
|
|
|
|
// tool_result
|
|
ToolUseID string `json:"tool_use_id,omitempty"`
|
|
Content []ContentBlock `json:"content,omitempty"`
|
|
IsError bool `json:"is_error,omitempty"`
|
|
}
|
|
|
|
// ImageSource holds a base64-encoded image for vision requests.
|
|
type ImageSource struct {
|
|
Type string `json:"type"` // "base64"
|
|
MediaType string `json:"media_type"` // "image/jpeg", "image/png", etc.
|
|
Data string `json:"data"` // base64-encoded image data
|
|
}
|
|
|
|
// Tool describes a tool available to the model.
|
|
type Tool struct {
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
InputSchema json.RawMessage `json:"input_schema"`
|
|
}
|
|
|
|
// StreamEvent represents a single event from the SSE stream.
|
|
type StreamEvent struct {
|
|
Type string `json:"type"` // "text_delta", "tool_use_start", "tool_use_delta", "tool_result", "done", "error"
|
|
Data string `json:"data"` // event payload
|
|
|
|
// Populated for tool_use_start events
|
|
ToolName string `json:"tool_name,omitempty"`
|
|
ToolID string `json:"tool_id,omitempty"`
|
|
ToolInput string `json:"tool_input,omitempty"`
|
|
}
|
|
|
|
// Usage tracks token consumption for a request.
|
|
type Usage struct {
|
|
InputTokens int `json:"input_tokens"`
|
|
OutputTokens int `json:"output_tokens"`
|
|
}
|
|
|
|
// ConversationSummary is a lightweight view of a conversation for listing.
|
|
type ConversationSummary struct {
|
|
ID string `json:"id"`
|
|
Title string `json:"title"`
|
|
Model string `json:"model"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
TokensIn int `json:"tokensIn"`
|
|
TokensOut int `json:"tokensOut"`
|
|
}
|