Skip to main content

Client

Struct Client 

Source
pub struct Client { /* private fields */ }

Implementations§

Source§

impl Client

Source

pub fn new(api_key: &str) -> Client

Examples found in repository?
examples/chat_example.rs (line 6)
5async fn main() {
6    let client = openai_rust::Client::new(&std::env::var("OPENAI_API_KEY").unwrap());
7    let args = openai_rust::chat::ChatArguments::new(
8        "gpt-3.5-turbo",
9        vec![openai_rust::chat::Message {
10            role: "user".to_owned(),
11            content: "Hello GPT!".to_owned(),
12        }],
13    );
14    let res = client.create_chat(args, None).await.unwrap();
15    println!("{}", res);
16}
More examples
Hide additional examples
examples/chat_stream_example.rs (line 8)
7async fn main() {
8    let client = openai_rust::Client::new(&std::env::var("OPENAI_API_KEY").unwrap());
9    let args = openai_rust::chat::ChatArguments::new(
10        "gpt-3.5-turbo",
11        vec![openai_rust::chat::Message {
12            role: "user".to_owned(),
13            content: "Hello GPT!".to_owned(),
14        }],
15    );
16    let mut res = client.create_chat_stream(args, None).await.unwrap();
17    while let Some(chunk) = res.next().await {
18        print!("{}", chunk.unwrap());
19        std::io::stdout().flush().unwrap();
20    }
21}
Source

pub fn new_with_client(api_key: &str, req_client: Client) -> Client

Source

pub fn new_with_base_url(api_key: &str, base_url: &str) -> Client

Source

pub fn new_with_client_and_base_url( api_key: &str, req_client: Client, base_url: &str, ) -> Client

Source

pub async fn read_and_parse_json<T: DeserializeOwned>( res: Response, error_context: &str, ) -> Result<T, Error>

Read the response body as text and deserialize it as JSON, surfacing the HTTP status and the raw body in the error when either step fails.

This is the path that create_chat and the other create_* methods use for the success branch. Routing everything through a single helper guarantees that callers never see a bare “error decoding response body” from reqwest without context, which previously made it impossible to tell whether a 200 response was actually a non-UTF-8 binary blob, a truncated stream, or some other transport-level failure.

Source

pub async fn list_models( &self, opt_url_path: Option<String>, ) -> Result<Vec<Model>, Error>

Source

pub async fn create_chat( &self, args: ChatArguments, opt_url_path: Option<String>, ) -> Result<ChatCompletion, Error>

Examples found in repository?
examples/chat_example.rs (line 14)
5async fn main() {
6    let client = openai_rust::Client::new(&std::env::var("OPENAI_API_KEY").unwrap());
7    let args = openai_rust::chat::ChatArguments::new(
8        "gpt-3.5-turbo",
9        vec![openai_rust::chat::Message {
10            role: "user".to_owned(),
11            content: "Hello GPT!".to_owned(),
12        }],
13    );
14    let res = client.create_chat(args, None).await.unwrap();
15    println!("{}", res);
16}
Source

pub async fn create_chat_stream( &self, args: ChatArguments, opt_url_path: Option<String>, ) -> Result<ChatCompletionChunkStream>

Examples found in repository?
examples/chat_stream_example.rs (line 16)
7async fn main() {
8    let client = openai_rust::Client::new(&std::env::var("OPENAI_API_KEY").unwrap());
9    let args = openai_rust::chat::ChatArguments::new(
10        "gpt-3.5-turbo",
11        vec![openai_rust::chat::Message {
12            role: "user".to_owned(),
13            content: "Hello GPT!".to_owned(),
14        }],
15    );
16    let mut res = client.create_chat_stream(args, None).await.unwrap();
17    while let Some(chunk) = res.next().await {
18        print!("{}", chunk.unwrap());
19        std::io::stdout().flush().unwrap();
20    }
21}
Source

pub async fn create_completion( &self, args: CompletionArguments, opt_url_path: Option<String>, ) -> Result<CompletionResponse>

Source

pub async fn create_embeddings( &self, args: EmbeddingsArguments, opt_url_path: Option<String>, ) -> Result<EmbeddingsResponse>

Source

pub async fn create_image_old( &self, args: ImageArguments, opt_url_path: Option<String>, ) -> Result<Vec<String>>

Source

pub async fn create_image( &self, args: ImageArguments, opt_url_path: Option<String>, ) -> Result<Vec<String>>

Source

pub async fn create_responses( &self, args: ResponsesArguments, opt_url_path: Option<String>, ) -> Result<ResponsesCompletion, Error>

Create a response using xAI’s Responses API with agentic tool calling.

This method calls the /v1/responses endpoint which supports server-side tools like web_search, x_search, code_execution, and more.

§Arguments
  • args - The ResponsesArguments containing model, input messages, and tools
  • opt_url_path - Optional URL path override (defaults to /v1/responses)
§Example
use openai_rust2::chat::{ResponsesArguments, ResponsesMessage, GrokTool};
use openai_rust2::Client;

async fn example() -> anyhow::Result<()> {
    let client = Client::new_with_base_url("your-api-key", "https://api.x.ai/v1");
    let args = ResponsesArguments::new(
        "grok-4-1-fast-reasoning",
        vec![ResponsesMessage {
            role: "user".to_string(),
            content: "What is the current Bitcoin price?".to_string(),
        }],
    ).with_tools(vec![GrokTool::web_search()]);

    let response = client.create_responses(args, None).await?;
    println!("{}", response.get_text_content());
    Ok(())
}
Source

pub async fn create_openai_responses( &self, args: OpenAIResponsesArguments, opt_url_path: Option<String>, ) -> Result<ResponsesCompletion, Error>

Create a response using OpenAI’s Responses API with agentic tool calling.

This method calls the /v1/responses endpoint which supports server-side tools like web_search, file_search, and code_interpreter.

Supported models: gpt-5, gpt-4o, and other models with tool support.

§Arguments
  • args - The OpenAIResponsesArguments containing model, input messages, and tools
  • opt_url_path - Optional URL path override (defaults to /v1/responses)
§Example
use openai_rust2::chat::{OpenAIResponsesArguments, ResponsesMessage, OpenAITool};
use openai_rust2::Client;

async fn example() -> anyhow::Result<()> {
    let client = Client::new("your-openai-api-key");
    let args = OpenAIResponsesArguments::new(
        "gpt-5",
        vec![ResponsesMessage {
            role: "user".to_string(),
            content: "What are the latest developments in AI?".to_string(),
        }],
    ).with_tools(vec![OpenAITool::web_search()]);

    let response = client.create_openai_responses(args, None).await?;
    println!("{}", response.get_text_content());
    Ok(())
}

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more