gproxy-protocol 3.0.0-alpha.0

GPROXY v3 protocol model: operation taxonomy, wire kinds, and the OperationSpec registry
Documentation
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(transparent)]
pub struct InferenceGeo(pub String);

impl InferenceGeo {
    pub fn new(value: impl Into<String>) -> Self {
        Self(value.into())
    }

    pub fn as_str(&self) -> &str {
        &self.0
    }

    pub fn into_inner(self) -> String {
        self.0
    }
}

macro_rules! extensible_string_enum {
    ($outer:ident, $known:ident { $($variant:ident => $wire:literal),+ $(,)? }) => {
        #[derive(Debug, Clone, PartialEq, Eq, Serialize)]
        #[serde(untagged)]
        #[non_exhaustive]
        pub enum $outer {
            Known($known),
            Unknown(String),
        }

        // Manual Deserialize: a known-variant miss falls back to `Unknown`
        // without ever formatting an unknown-variant error (see
        // `protocol::extensible`).
        impl<'de> serde::Deserialize<'de> for $outer {
            fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
                crate::claude::extensible::deserialize_extensible(d, Self::Known, Self::Unknown)
            }
        }

        #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
        #[non_exhaustive]
        pub enum $known {
            $(
                #[serde(rename = $wire)]
                $variant,
            )+
        }
    };
}

extensible_string_enum!(ClaudeModel, ClaudeModelKnown {
    ClaudeSonnet5 => "claude-sonnet-5", ClaudeFable51 => "claude-fable-5-1",
    ClaudeMythos51 => "claude-mythos-5-1", ClaudeFable5 => "claude-fable-5",
    ClaudeMythos5 => "claude-mythos-5", ClaudeOpus5 => "claude-opus-5",
    ClaudeOpus48 => "claude-opus-4-8", ClaudeOpus47 => "claude-opus-4-7",
    ClaudeMythosPreview => "claude-mythos-preview", ClaudeOpus46 => "claude-opus-4-6",
    ClaudeSonnet46 => "claude-sonnet-4-6", ClaudeHaiku45 => "claude-haiku-4-5",
    ClaudeHaiku4520251001 => "claude-haiku-4-5-20251001", ClaudeOpus45 => "claude-opus-4-5",
    ClaudeOpus4520251101 => "claude-opus-4-5-20251101", ClaudeSonnet45 => "claude-sonnet-4-5",
    ClaudeSonnet4520250929 => "claude-sonnet-4-5-20250929", ClaudeOpus41 => "claude-opus-4-1",
    ClaudeOpus4120250805 => "claude-opus-4-1-20250805", ClaudeOpus40 => "claude-opus-4-0",
    ClaudeOpus420250514 => "claude-opus-4-20250514", ClaudeSonnet40 => "claude-sonnet-4-0",
    ClaudeSonnet420250514 => "claude-sonnet-4-20250514", Claude3Haiku20240307 => "claude-3-haiku-20240307",
});

impl From<String> for ClaudeModel {
    fn from(value: String) -> Self {
        Self::Unknown(value)
    }
}

extensible_string_enum!(AnthropicBeta, AnthropicBetaKnown {
    MessageBatches20240924 => "message-batches-2024-09-24",
    PromptCaching20240731 => "prompt-caching-2024-07-31",
    ComputerUse20241022 => "computer-use-2024-10-22",
    ComputerUse20250124 => "computer-use-2025-01-24",
    Pdfs20240925 => "pdfs-2024-09-25",
    TokenCounting20241101 => "token-counting-2024-11-01",
    TokenEfficientTools20250219 => "token-efficient-tools-2025-02-19",
    Output128k20250219 => "output-128k-2025-02-19",
    FilesApi20250414 => "files-api-2025-04-14",
    McpClient20250404 => "mcp-client-2025-04-04",
    McpClient20251120 => "mcp-client-2025-11-20",
    DevFullThinking20250514 => "dev-full-thinking-2025-05-14",
    InterleavedThinking20250514 => "interleaved-thinking-2025-05-14",
    CodeExecution20250522 => "code-execution-2025-05-22",
    ExtendedCacheTtl20250411 => "extended-cache-ttl-2025-04-11",
    Context1m20250807 => "context-1m-2025-08-07",
    ContextManagement20250627 => "context-management-2025-06-27",
    ModelContextWindowExceeded20250826 => "model-context-window-exceeded-2025-08-26",
    Skills20251002 => "skills-2025-10-02",
    FastMode20260201 => "fast-mode-2026-02-01",
    Output300k20260324 => "output-300k-2026-03-24",
    UserProfiles20260324 => "user-profiles-2026-03-24",
    AdvisorTool20260301 => "advisor-tool-2026-03-01",
    ManagedAgents20260401 => "managed-agents-2026-04-01",
    CacheDiagnosis20260407 => "cache-diagnosis-2026-04-07",
    ThinkingTokenCount20260513 => "thinking-token-count-2026-05-13",
    ServerSideFallback20260601 => "server-side-fallback-2026-06-01",
    ServerSideFallback20260701 => "server-side-fallback-2026-07-01",
    FallbackCredit20260601 => "fallback-credit-2026-06-01",
    FallbackCredit20260701 => "fallback-credit-2026-07-01",
    MidConversationToolChanges20260701 => "mid-conversation-tool-changes-2026-07-01",
    AgentMemory20260722 => "agent-memory-2026-07-22",
    MidConversationOutputConfig20260701 => "mid-conversation-output-config-2026-07-01",
    ThinkingBindingControls20260801 => "thinking-binding-controls-2026-08-01",
    ThinkingDisplayUpdates20260818 => "thinking-display-updates-2026-08-18",
    MidConversationSystemClearAt20260821 => "mid-conversation-system-clear-at-2026-08-21",
});

extensible_string_enum!(MessageRole, MessageRoleKnown { User => "user", Assistant => "assistant", System => "system" });
extensible_string_enum!(AssistantRole, AssistantRoleKnown { Assistant => "assistant" });
extensible_string_enum!(StopReason, StopReasonKnown {
    EndTurn => "end_turn", MaxTokens => "max_tokens", StopSequence => "stop_sequence",
    ToolUse => "tool_use", PauseTurn => "pause_turn", Compaction => "compaction",
    Refusal => "refusal", ModelContextWindowExceeded => "model_context_window_exceeded",
});
extensible_string_enum!(RequestServiceTier, RequestServiceTierKnown { Auto => "auto", StandardOnly => "standard_only" });
extensible_string_enum!(UsageServiceTier, UsageServiceTierKnown { Standard => "standard", Priority => "priority", Batch => "batch" });
extensible_string_enum!(Speed, SpeedKnown { Standard => "standard", Fast => "fast" });
extensible_string_enum!(CacheTtl, CacheTtlKnown { FiveMinutes => "5m", OneHour => "1h" });
extensible_string_enum!(ThinkingDisplay, ThinkingDisplayKnown { Summarized => "summarized", Omitted => "omitted", Updates => "updates" });
extensible_string_enum!(MessageClearAt, MessageClearAtKnown { NextUserMessage => "next_user_message", Never => "never" });
extensible_string_enum!(ThinkingPrefixMismatchBehavior, ThinkingPrefixMismatchBehaviorKnown { Error => "error", DropBlock => "drop_block" });
extensible_string_enum!(ThinkingDroppedReason, ThinkingDroppedReasonKnown {
    ModelBindingMismatch => "model_binding_mismatch",
    PrefixBindingMismatch => "prefix_binding_mismatch",
    OrganizationBindingMismatch => "organization_binding_mismatch",
    EndUserBindingMismatch => "end_user_binding_mismatch",
});
extensible_string_enum!(OutputEffort, OutputEffortKnown { Low => "low", Medium => "medium", High => "high", XHigh => "xhigh", Max => "max" });
extensible_string_enum!(ServerToolUseName, ServerToolUseNameKnown {
    Advisor => "advisor", WebSearch => "web_search", WebFetch => "web_fetch",
    CodeExecution => "code_execution", BashCodeExecution => "bash_code_execution",
    TextEditorCodeExecution => "text_editor_code_execution",
    ToolSearchToolRegex => "tool_search_tool_regex", ToolSearchToolBm25 => "tool_search_tool_bm25",
});
extensible_string_enum!(ToolType, ToolTypeKnown {
    Custom => "custom", Bash20241022 => "bash_20241022", Bash20250124 => "bash_20250124",
    CodeExecution20250522 => "code_execution_20250522", CodeExecution20250825 => "code_execution_20250825",
    CodeExecution20260120 => "code_execution_20260120", CodeExecution20260521 => "code_execution_20260521",
    Computer20241022 => "computer_20241022",
    Computer20250124 => "computer_20250124", Computer20251124 => "computer_20251124",
    Memory20250818 => "memory_20250818", TextEditor20241022 => "text_editor_20241022",
    TextEditor20250124 => "text_editor_20250124", TextEditor20250429 => "text_editor_20250429",
    TextEditor20250728 => "text_editor_20250728", WebSearch20250305 => "web_search_20250305",
    WebSearch20260209 => "web_search_20260209", WebSearch20260318 => "web_search_20260318",
    WebFetch20250910 => "web_fetch_20250910",
    WebFetch20260209 => "web_fetch_20260209", WebFetch20260309 => "web_fetch_20260309",
    WebFetch20260318 => "web_fetch_20260318",
    Advisor20260301 => "advisor_20260301", ToolSearchBm2520251119 => "tool_search_tool_bm25_20251119",
    ToolSearchBm25 => "tool_search_tool_bm25", ToolSearchRegex20251119 => "tool_search_tool_regex_20251119",
    ToolSearchRegex => "tool_search_tool_regex", McpToolset => "mcp_toolset",
});
extensible_string_enum!(CitationType, CitationTypeKnown {
    CharLocation => "char_location", PageLocation => "page_location",
    ContentBlockLocation => "content_block_location", WebSearchResultLocation => "web_search_result_location",
    SearchResultLocation => "search_result_location",
});
extensible_string_enum!(MessageObjectType, MessageObjectTypeKnown { Message => "message" });
extensible_string_enum!(ModelObjectType, ModelObjectTypeKnown { Model => "model" });
extensible_string_enum!(FileObjectType, FileObjectTypeKnown { File => "file" });
extensible_string_enum!(DeletedFileObjectType, DeletedFileObjectTypeKnown { FileDeleted => "file_deleted" });
extensible_string_enum!(SkillObjectType, SkillObjectTypeKnown { Skill => "skill" });
extensible_string_enum!(DeletedSkillObjectType, DeletedSkillObjectTypeKnown { SkillDeleted => "skill_deleted" });
extensible_string_enum!(SkillVersionObjectType, SkillVersionObjectTypeKnown { SkillVersion => "skill_version" });
extensible_string_enum!(DeletedSkillVersionObjectType, DeletedSkillVersionObjectTypeKnown { SkillVersionDeleted => "skill_version_deleted" });
extensible_string_enum!(SkillSourceType, SkillSourceTypeKnown {
    Custom => "custom", Anthropic => "anthropic", AnthropicExample => "anthropic_example",
    Plugin => "plugin",
});
extensible_string_enum!(JsonSchemaObjectType, JsonSchemaObjectTypeKnown { Object => "object" });
extensible_string_enum!(JsonSchemaFormatType, JsonSchemaFormatTypeKnown { JsonSchema => "json_schema" });
extensible_string_enum!(McpServerType, McpServerTypeKnown { Url => "url" });
extensible_string_enum!(TaskBudgetType, TaskBudgetTypeKnown { Tokens => "tokens" });
extensible_string_enum!(SkillType, SkillTypeKnown { Anthropic => "anthropic", Custom => "custom" });
extensible_string_enum!(IterationUsageType, IterationUsageTypeKnown { Message => "message", Compaction => "compaction", AdvisorMessage => "advisor_message", FallbackMessage => "fallback_message" });
extensible_string_enum!(ContextEditType, ContextEditTypeKnown {
    ClearToolUses20250919 => "clear_tool_uses_20250919",
    ClearThinking20251015 => "clear_thinking_20251015",
    Compact20260112 => "compact_20260112",
});
extensible_string_enum!(ResponseInclusion, ResponseInclusionKnown { Full => "full", Excluded => "excluded" });