pub mod client;
pub mod completion;
pub mod embeddings;
pub mod streaming;
pub use client::{ApiErrorResponse, ApiResponse, Client};
pub use completion::CompletionModel;
pub use embeddings::{EmbeddingModel, ImageEmbeddingModel};
pub const COMMAND_A_PLUS_05_2026: &str = "command-a-plus-05-2026";
pub const COMMAND_A_03_2025: &str = "command-a-03-2025";
pub const COMMAND_A_REASONING_08_2025: &str = "command-a-reasoning-08-2025";
pub const COMMAND_A_VISION_07_2025: &str = "command-a-vision-07-2025";
pub const COMMAND_A_TRANSLATE_08_2025: &str = "command-a-translate-08-2025";
pub const COMMAND_R7B_12_2024: &str = "command-r7b-12-2024";
pub const COMMAND_R_PLUS_08_2024: &str = "command-r-plus-08-2024";
pub const COMMAND_R_08_2024: &str = "command-r-08-2024";
#[deprecated(
note = "Cohere removed `command-r-plus` on 2025-09-15; requests using it fail. \
Use `COMMAND_R_PLUS_08_2024`, `COMMAND_A_03_2025`, or `COMMAND_A_PLUS_05_2026` instead."
)]
pub const COMMAND_R_PLUS: &str = "command-r-plus";
#[deprecated(
note = "Cohere removed `command-r` on 2025-09-15; requests using it fail. \
Use `COMMAND_R_08_2024`, `COMMAND_A_03_2025`, or `COMMAND_A_PLUS_05_2026` instead."
)]
pub const COMMAND_R: &str = "command-r";
#[deprecated(
note = "Cohere removed `command` on 2025-09-15; requests using it fail. \
Use `COMMAND_R_08_2024`, `COMMAND_A_03_2025`, or `COMMAND_A_PLUS_05_2026` instead."
)]
pub const COMMAND: &str = "command";
#[deprecated(
note = "`command-nightly` still resolves but is absent from Cohere's published model \
catalogue, so it carries no compatibility or availability guarantee. \
Use `COMMAND_A_03_2025` or `COMMAND_A_PLUS_05_2026` instead."
)]
pub const COMMAND_NIGHTLY: &str = "command-nightly";
#[deprecated(
note = "Cohere removed `command-light` on 2025-09-15; requests using it fail. \
Use `COMMAND_R7B_12_2024` or `COMMAND_A_03_2025` instead."
)]
pub const COMMAND_LIGHT: &str = "command-light";
#[deprecated(
note = "Cohere no longer serves `command-light-nightly`; requests using it return 404. \
Use `COMMAND_R7B_12_2024` or `COMMAND_A_03_2025` instead."
)]
pub const COMMAND_LIGHT_NIGHTLY: &str = "command-light-nightly";
pub const EMBED_V4: &str = "embed-v4.0";
pub const EMBED_ENGLISH_V3: &str = "embed-english-v3.0";
pub const EMBED_ENGLISH_LIGHT_V3: &str = "embed-english-light-v3.0";
pub const EMBED_MULTILINGUAL_V3: &str = "embed-multilingual-v3.0";
pub const EMBED_MULTILINGUAL_LIGHT_V3: &str = "embed-multilingual-light-v3.0";
pub(crate) fn model_dimensions_from_identifier(identifier: &str) -> Option<usize> {
match identifier {
EMBED_V4 => Some(1_536),
EMBED_ENGLISH_V3 | EMBED_MULTILINGUAL_V3 => Some(1_024),
EMBED_ENGLISH_LIGHT_V3 | EMBED_MULTILINGUAL_LIGHT_V3 => Some(384),
_ => None,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn embedding_dimensions_cover_every_live_embed_model() {
assert_eq!(model_dimensions_from_identifier(EMBED_V4), Some(1_536));
assert_eq!(
model_dimensions_from_identifier(EMBED_ENGLISH_V3),
Some(1_024)
);
assert_eq!(
model_dimensions_from_identifier(EMBED_MULTILINGUAL_V3),
Some(1_024)
);
assert_eq!(
model_dimensions_from_identifier(EMBED_ENGLISH_LIGHT_V3),
Some(384)
);
assert_eq!(
model_dimensions_from_identifier(EMBED_MULTILINGUAL_LIGHT_V3),
Some(384)
);
assert_eq!(model_dimensions_from_identifier("embed-unknown"), None);
}
}