#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
pub enum OperationGroup {
Models,
CountTokens,
Memories,
GenerateContent,
Compact,
Conversation,
Embeddings,
Images,
Audio,
Video,
Files,
Search,
Rerank,
Realtime,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
pub enum Operation {
ListModels,
GetModel,
CountTokens,
SummarizeMemory,
GenerateContent,
StreamGenerateContent,
GuardianReview,
GuardianClassify,
CompactContent,
CreateConversation,
CreateEmbedding,
BatchCreateEmbedding,
Rerank,
WebSearch,
CreateImage,
EditImage,
CreateSpeech,
CreateTranscription,
CreateTranslation,
CreateFile,
ListFiles,
RetrieveFile,
RetrieveFileContent,
DeleteFile,
CreateVideo,
RetrieveVideo,
ListVideos,
DeleteVideo,
DownloadVideoContent,
RemixVideo,
CreateVideoCharacter,
GetVideoCharacter,
EditVideo,
ExtendVideo,
CreateRealtimeCall,
ConnectRealtime,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
pub enum WireFamily {
OpenAi,
Claude,
Gemini,
}
impl WireFamily {
pub const fn id(self) -> &'static str {
match self {
Self::OpenAi => "openai",
Self::Claude => "claude",
Self::Gemini => "gemini",
}
}
pub fn from_id(value: &str) -> Option<Self> {
Some(match value {
"openai" => Self::OpenAi,
"claude" => Self::Claude,
"gemini" => Self::Gemini,
_ => return None,
})
}
pub const fn client_markers(self) -> &'static [&'static str] {
match self {
Self::Claude => &["x-api-key", "anthropic-version", "anthropic-beta"],
Self::OpenAi | Self::Gemini => &[],
}
}
}
impl ContentGenerationKind {
pub const fn id(self) -> &'static str {
match self {
Self::OpenAiChat => "openai_chat",
Self::OpenAiResponses => "openai_responses",
Self::OpenAiResponsesWebSocket => "openai_responses_websocket",
Self::ClaudeMessages => "claude_messages",
Self::GeminiGenerateContent => "gemini_generate_content",
}
}
pub fn from_id(value: &str) -> Option<Self> {
Some(match value {
"openai_chat" => Self::OpenAiChat,
"openai_responses" => Self::OpenAiResponses,
"openai_responses_websocket" => Self::OpenAiResponsesWebSocket,
"claude_messages" => Self::ClaudeMessages,
"gemini_generate_content" => Self::GeminiGenerateContent,
_ => return None,
})
}
}
impl OperationKind {
pub const fn id(self) -> &'static str {
match self {
Self::ContentGeneration(kind) => kind.id(),
Self::Family(family) => family.id(),
}
}
pub fn from_id(value: &str) -> Option<Self> {
ContentGenerationKind::from_id(value)
.map(Self::ContentGeneration)
.or_else(|| WireFamily::from_id(value).map(Self::Family))
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
pub enum ContentGenerationKind {
OpenAiChat,
OpenAiResponses,
OpenAiResponsesWebSocket,
ClaudeMessages,
GeminiGenerateContent,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
pub enum OperationKind {
ContentGeneration(ContentGenerationKind),
Family(WireFamily),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct OperationKey {
operation: Operation,
kind: OperationKind,
}
impl OperationKey {
pub const fn content(operation: Operation, kind: ContentGenerationKind) -> Self {
assert!(
operation.is_content_generation(),
"content kind used with non-content operation"
);
Self {
operation,
kind: OperationKind::ContentGeneration(kind),
}
}
pub const fn family(operation: Operation, family: WireFamily) -> Self {
assert!(
!operation.is_content_generation(),
"wire family used with content operation"
);
Self {
operation,
kind: OperationKind::Family(family),
}
}
pub const fn try_new(
operation: Operation,
kind: OperationKind,
) -> Result<Self, OperationKeyError> {
let consistent = matches!(kind, OperationKind::ContentGeneration(_))
== operation.is_content_generation();
if consistent {
Ok(Self { operation, kind })
} else {
Err(OperationKeyError { operation, kind })
}
}
pub const fn operation(self) -> Operation {
self.operation
}
pub const fn kind(self) -> OperationKind {
self.kind
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub struct OperationKeyError {
pub operation: Operation,
pub kind: OperationKind,
}
impl std::fmt::Display for OperationKeyError {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
formatter,
"operation {:?} is inconsistent with kind {:?}",
self.operation, self.kind
)
}
}
impl std::error::Error for OperationKeyError {}
impl OperationGroup {
pub const fn id(self) -> &'static str {
use OperationGroup::*;
match self {
Models => "models",
CountTokens => "count_tokens",
Memories => "memories",
GenerateContent => "generate_content",
Compact => "compact",
Conversation => "conversation",
Embeddings => "embeddings",
Images => "images",
Audio => "audio",
Video => "video",
Files => "files",
Search => "search",
Rerank => "rerank",
Realtime => "realtime",
}
}
}
impl Operation {
pub const fn is_content_generation(self) -> bool {
matches!(
self,
Self::GenerateContent
| Self::StreamGenerateContent
| Self::GuardianReview
| Self::GuardianClassify
)
}
pub const fn id(self) -> &'static str {
use Operation::*;
match self {
ListModels => "list_models",
GetModel => "get_model",
CountTokens => "count_tokens",
SummarizeMemory => "summarize_memory",
GenerateContent => "generate_content",
StreamGenerateContent => "stream_generate_content",
GuardianReview => "guardian_review",
GuardianClassify => "guardian_classify",
CompactContent => "compact_content",
CreateConversation => "create_conversation",
CreateEmbedding => "create_embedding",
BatchCreateEmbedding => "batch_create_embedding",
Rerank => "rerank",
WebSearch => "web_search",
CreateImage => "create_image",
EditImage => "edit_image",
CreateSpeech => "create_speech",
CreateTranscription => "create_transcription",
CreateTranslation => "create_translation",
CreateFile => "create_file",
ListFiles => "list_files",
RetrieveFile => "retrieve_file",
RetrieveFileContent => "retrieve_file_content",
DeleteFile => "delete_file",
CreateVideo => "create_video",
RetrieveVideo => "retrieve_video",
ListVideos => "list_videos",
DeleteVideo => "delete_video",
DownloadVideoContent => "download_video_content",
RemixVideo => "remix_video",
CreateVideoCharacter => "create_video_character",
GetVideoCharacter => "get_video_character",
EditVideo => "edit_video",
ExtendVideo => "extend_video",
CreateRealtimeCall => "create_realtime_call",
ConnectRealtime => "connect_realtime",
}
}
pub fn from_id(value: &str) -> Option<Self> {
use Operation::*;
Some(match value {
"list_models" => ListModels,
"get_model" => GetModel,
"count_tokens" => CountTokens,
"summarize_memory" => SummarizeMemory,
"generate_content" => GenerateContent,
"stream_generate_content" => StreamGenerateContent,
"guardian_review" => GuardianReview,
"guardian_classify" => GuardianClassify,
"compact_content" => CompactContent,
"create_conversation" => CreateConversation,
"create_embedding" => CreateEmbedding,
"batch_create_embedding" => BatchCreateEmbedding,
"rerank" => Rerank,
"web_search" => WebSearch,
"create_image" => CreateImage,
"edit_image" => EditImage,
"create_speech" => CreateSpeech,
"create_transcription" => CreateTranscription,
"create_translation" => CreateTranslation,
"create_file" => CreateFile,
"list_files" => ListFiles,
"retrieve_file" => RetrieveFile,
"retrieve_file_content" => RetrieveFileContent,
"delete_file" => DeleteFile,
"create_video" => CreateVideo,
"retrieve_video" => RetrieveVideo,
"list_videos" => ListVideos,
"delete_video" => DeleteVideo,
"download_video_content" => DownloadVideoContent,
"remix_video" => RemixVideo,
"create_video_character" => CreateVideoCharacter,
"get_video_character" => GetVideoCharacter,
"edit_video" => EditVideo,
"extend_video" => ExtendVideo,
"create_realtime_call" => CreateRealtimeCall,
"connect_realtime" => ConnectRealtime,
_ => return None,
})
}
pub const fn group(self) -> OperationGroup {
use Operation::*;
match self {
ListModels | GetModel => OperationGroup::Models,
CountTokens => OperationGroup::CountTokens,
SummarizeMemory => OperationGroup::Memories,
GenerateContent | StreamGenerateContent | GuardianReview | GuardianClassify => {
OperationGroup::GenerateContent
}
CompactContent => OperationGroup::Compact,
CreateConversation => OperationGroup::Conversation,
CreateEmbedding | BatchCreateEmbedding => OperationGroup::Embeddings,
Rerank => OperationGroup::Rerank,
WebSearch => OperationGroup::Search,
CreateImage | EditImage => OperationGroup::Images,
CreateSpeech | CreateTranscription | CreateTranslation => OperationGroup::Audio,
CreateFile | ListFiles | RetrieveFile | RetrieveFileContent | DeleteFile => {
OperationGroup::Files
}
CreateVideo | RetrieveVideo | ListVideos | DeleteVideo | DownloadVideoContent
| RemixVideo | CreateVideoCharacter | GetVideoCharacter | EditVideo | ExtendVideo => {
OperationGroup::Video
}
CreateRealtimeCall | ConnectRealtime => OperationGroup::Realtime,
}
}
}