Skip to main content

rig_core/providers/xai/
client.rs

1use 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}