1macro_rules! string_id {
8 (
9 $(#[$meta:meta])*
10 $name:ident { $( $ctor:ident => $value:literal ),* $(,)? }
11 ) => {
12 $(#[$meta])*
13 #[derive(
14 Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord,
15 serde::Serialize, serde::Deserialize,
16 )]
17 #[serde(transparent)]
18 pub struct $name(String);
19
20 impl $name {
21 $(
22 #[doc = concat!("The well-known `", $value, "` value.")]
23 pub fn $ctor() -> Self {
24 Self(String::from($value))
25 }
26 )*
27
28 pub fn as_str(&self) -> &str {
30 &self.0
31 }
32 }
33
34 impl AsRef<str> for $name {
35 fn as_ref(&self) -> &str {
36 &self.0
37 }
38 }
39
40 impl From<&str> for $name {
41 fn from(value: &str) -> Self {
42 Self(value.to_owned())
43 }
44 }
45
46 impl From<String> for $name {
47 fn from(value: String) -> Self {
48 Self(value)
49 }
50 }
51
52 impl From<$name> for String {
53 fn from(value: $name) -> Self {
54 value.0
55 }
56 }
57
58 impl std::fmt::Display for $name {
59 fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
60 formatter.write_str(&self.0)
61 }
62 }
63 };
64}
65
66string_id! {
67 Modality {
69 unknown => "unknown",
70 text => "text",
71 image => "image",
72 speech => "speech",
73 audio => "audio",
74 video => "video",
75 vision => "vision",
76 embedding => "embedding",
77 }
78}
79
80string_id! {
81 Capability {
83 chat => "chat",
84 complete => "complete",
85 embed => "embed",
86 see => "see",
87 image => "image",
88 speak => "speak",
89 transcribe => "transcribe",
90 tools => "tools",
91 judge => "judge",
92 }
93}
94
95string_id! {
96 SourceKind {
98 ollama => "ollama",
99 huggingface_cache => "huggingface-cache",
100 lm_studio => "lm-studio",
101 builtin => "builtin",
102 endpoint => "endpoint",
103 file => "file",
104 folder => "folder",
105 }
106}
107
108string_id! {
109 RuntimeId {
111 llama_cpp => "llama-cpp",
112 whisper_cpp => "whisper-cpp",
113 ollama => "ollama",
114 mlx_swift => "mlx-swift",
115 apple_foundation => "apple-foundation",
116 openai_endpoint => "generic:openai-server",
117 mflux => "python:mflux",
118 diffusers => "python:diffusers",
119 mlx_lm => "python:mlx-lm",
120 mlx_audio => "python:mlx-audio",
121 mlx_vlm => "python:mlx-vlm",
122 embeddings => "python:embeddings",
123 comfy_ui => "comfyui",
124 a1111 => "a1111",
125 }
126}
127
128#[derive(
130 Debug, Clone, Copy, PartialEq, Eq, Hash, Default, serde::Serialize, serde::Deserialize,
131)]
132#[serde(rename_all = "lowercase")]
133pub enum ExecutionMode {
134 Stream,
136 Job,
138 #[default]
140 Sync,
141}
142
143impl ExecutionMode {
144 pub fn as_str(&self) -> &'static str {
146 match self {
147 ExecutionMode::Stream => "stream",
148 ExecutionMode::Job => "job",
149 ExecutionMode::Sync => "sync",
150 }
151 }
152}
153
154#[derive(
156 Debug, Clone, Copy, PartialEq, Eq, Hash, Default, serde::Serialize, serde::Deserialize,
157)]
158#[serde(rename_all = "kebab-case")]
159pub enum RunTier {
160 Native,
162 Managed,
164 Remote,
166 #[default]
168 RecipeNeeded,
169}
170
171#[derive(
173 Debug, Clone, Copy, PartialEq, Eq, Hash, Default, serde::Serialize, serde::Deserialize,
174)]
175#[serde(rename_all = "lowercase")]
176pub enum ModelState {
177 Ready,
179 #[default]
181 Unresolved,
182 Missing,
184}
185
186impl ModelState {
187 pub fn as_str(&self) -> &'static str {
189 match self {
190 ModelState::Ready => "ready",
191 ModelState::Unresolved => "unresolved",
192 ModelState::Missing => "missing",
193 }
194 }
195}
196
197pub struct BidPreference;
200
201impl BidPreference {
202 pub const LLAMA_CPP: i64 = 10;
204 pub const WHISPER_CPP: i64 = 10;
206 pub const ENDPOINT: i64 = 10;
208 pub const MLX_VLM: i64 = 14;
210 pub const MLX_SWIFT: i64 = 15;
212 pub const APPLE_FOUNDATION: i64 = 15;
214 pub const OLLAMA: i64 = 20;
216 pub const MFLUX: i64 = 25;
218 pub const DIFFUSERS: i64 = 26;
220 pub const COMFY_UI: i64 = 27;
222 pub const A1111: i64 = 28;
224 pub const MLX_AUDIO: i64 = 30;
226 pub const EMBEDDINGS: i64 = 32;
228 pub const MLX_LM: i64 = 40;
230 pub const MANIFEST: i64 = 100;
232}