rig_core/providers/xai/
client.rs1use crate::client::{self, BearerAuth, DebugExt, Provider};
2use crate::providers::openai::responses_api::{
3 ResponsesProviderExt, ResponsesToolDefinition, SystemInstructionsPlacement,
4};
5
6#[derive(Debug, Default, Clone, Copy)]
7pub struct XAiExt;
8#[derive(Debug, Default, Clone, Copy)]
9pub struct XAiExtBuilder;
10
11type XAiApiKey = BearerAuth;
12
13pub type Client<H = reqwest::Client> = client::Client<XAiExt, H>;
14pub type ClientBuilder<H = crate::markers::Missing> =
15 client::ClientBuilder<XAiExtBuilder, XAiApiKey, H>;
16
17const XAI_BASE_URL: &str = "https://api.x.ai";
18
19impl Provider for XAiExt {
20 type Builder = XAiExtBuilder;
21
22 const VERIFY_PATH: &'static str = "/v1/api-key";
23}
24
25impl ResponsesProviderExt for XAiExt {
26 const PROVIDER_NAME: &'static str = "xai";
27 const RESPONSES_PATH: &'static str = "/v1/responses";
28 const EMITS_COMPLETE_TOOL_CALLS_IMMEDIATELY: bool = true;
29 const USES_2XX_ERROR_ENVELOPE: bool = true;
30 const COMPOSES_NATIVE_OUTPUT_WITH_TOOLS: bool = false;
31
32 fn system_instructions_placement(&self) -> SystemInstructionsPlacement {
33 SystemInstructionsPlacement::InputSystemMessages
34 }
35
36 fn create_responses_request(
37 &self,
38 model: String,
39 request: crate::completion::CompletionRequest,
40 default_tools: &[ResponsesToolDefinition],
41 strict_tools: bool,
42 _system_instructions_placement: SystemInstructionsPlacement,
43 stream: bool,
44 ) -> Result<(String, serde_json::Value), crate::completion::CompletionError> {
45 super::api::create_completion_request(model, request, default_tools, strict_tools, stream)
46 }
47}
48
49client::impl_capabilities!(
50 XAiExt,
51 completion = super::completion::CompletionModel<H>,
52 image_generation = super::image_generation::ImageGenerationModel<H>,
53 audio_generation = super::audio_generation::AudioGenerationModel<H>,
54);
55
56impl DebugExt for XAiExt {}
57
58client::impl_default_provider_builder!(
59 XAiExtBuilder => XAiExt,
60 api_key = XAiApiKey,
61 base_url = XAI_BASE_URL,
62);
63
64client::impl_provider_client!(Client, input = String, api_key_env = "XAI_API_KEY");
65#[cfg(test)]
66mod tests {
67 #[test]
68 fn test_client_initialization() {
69 let _client_from_builder = crate::providers::xai::Client::builder()
70 .api_key("dummy-key")
71 .build()
72 .expect("Client::builder() failed");
73 }
74}