use crate::client::ZaiClient;
#[derive(Clone)]
pub struct Services {
pub(super) client: ZaiClient,
}
impl Services {
pub(super) fn new(client: ZaiClient) -> Self {
Self { client }
}
pub fn client(&self) -> &ZaiClient {
&self.client
}
pub fn chat(&self) -> ChatService {
ChatService { svc: self.clone() }
}
pub fn images(&self) -> ImagesService {
ImagesService { svc: self.clone() }
}
pub fn videos(&self) -> VideosService {
VideosService { svc: self.clone() }
}
pub fn audio(&self) -> AudioService {
AudioService { svc: self.clone() }
}
pub fn embeddings(&self) -> EmbeddingsService {
EmbeddingsService { svc: self.clone() }
}
pub fn rerank(&self) -> RerankService {
RerankService { svc: self.clone() }
}
pub fn tokenizer(&self) -> TokenizerService {
TokenizerService { svc: self.clone() }
}
pub fn moderation(&self) -> ModerationService {
ModerationService { svc: self.clone() }
}
pub fn files(&self) -> FilesService {
FilesService { svc: self.clone() }
}
pub fn batches(&self) -> BatchesService {
BatchesService { svc: self.clone() }
}
pub fn knowledge(&self) -> KnowledgeService {
KnowledgeService { svc: self.clone() }
}
pub fn agents(&self) -> AgentsService {
AgentsService { svc: self.clone() }
}
pub fn tools(&self) -> ToolsService {
ToolsService { svc: self.clone() }
}
pub fn assistants(&self) -> AssistantsService {
AssistantsService { svc: self.clone() }
}
pub fn applications(&self) -> ApplicationsService {
ApplicationsService { svc: self.clone() }
}
pub fn tasks(&self) -> TasksService {
TasksService { svc: self.clone() }
}
pub fn zrag(&self) -> ZragService {
ZragService { svc: self.clone() }
}
pub fn usage(&self) -> UsageService {
UsageService { svc: self.clone() }
}
}
macro_rules! facade {
($name:ident, $doc:expr) => {
#[doc = $doc]
#[derive(Clone)]
pub struct $name {
pub(super) svc: Services,
}
impl $name {
pub fn client(&self) -> &ZaiClient {
self.svc.client()
}
}
};
}
facade!(ChatService, "Chat completions service facade.");
facade!(ImagesService, "Image generation service facade.");
facade!(VideosService, "Video generation service facade.");
facade!(AudioService, "Audio (ASR/TTS/voice) service facade.");
facade!(EmbeddingsService, "Embeddings service facade.");
facade!(RerankService, "Rerank service facade.");
facade!(TokenizerService, "Tokenizer service facade.");
facade!(ModerationService, "Moderation service facade.");
facade!(FilesService, "Files service facade.");
facade!(BatchesService, "Batches service facade.");
facade!(KnowledgeService, "Knowledge-base service facade.");
facade!(AgentsService, "Agent v1 service facade.");
facade!(
ToolsService,
"Tools (web search / layout / reader) service facade."
);
facade!(AssistantsService, "Assistant service facade.");
facade!(ApplicationsService, "LLM-application service facade.");
facade!(TasksService, "Async-task service facade.");
facade!(ZragService, "Zrag service facade.");
facade!(UsageService, "Coding-plan usage service facade.");
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn facades_are_zero_cost_and_share_inner() {
let client = ZaiClient::builder("abcdefghij.0123456789abcdef")
.build()
.unwrap();
let mut handles = Vec::new();
for _ in 0..1000 {
handles.push(client.services().chat());
}
assert_eq!(handles.len(), 1000);
assert_eq!(format!("{:?}", client.secret()), "[REDACTED]");
}
}