pub struct OpenAIProtocolChatDriver { /* private fields */ }Expand description
OpenAI Protocol Chat Driver
Base implementation of ChatDriver for OpenAI-compatible APIs.
Supports streaming responses and tool calls.
Rate limit handling: On 429 errors, automatically retries with exponential
backoff, respecting x-ratelimit-reset-* and retry-after headers.
This is the base protocol driver used in examples and for OpenAI-compatible endpoints.
For production use with OpenAI, consider using OpenAIChatDriver from the everruns-openai crate.
§Example
use everruns_core::OpenAIProtocolChatDriver;
let driver = OpenAIProtocolChatDriver::new("your-api-key");
// or with custom endpoint
let driver = OpenAIProtocolChatDriver::with_base_url("your-api-key", "https://api.example.com/v1/chat/completions");
// or with custom retry config
let driver = OpenAIProtocolChatDriver::new("your-api-key")
.with_retry_config(LlmRetryConfig::aggressive());Implementations§
Source§impl OpenAIProtocolChatDriver
impl OpenAIProtocolChatDriver
Sourcepub fn new(api_key: impl Into<String>) -> OpenAIProtocolChatDriver
pub fn new(api_key: impl Into<String>) -> OpenAIProtocolChatDriver
Create a new driver with the given API key
Sourcepub fn with_base_url(
api_key: impl Into<String>,
api_url: impl Into<String>,
) -> OpenAIProtocolChatDriver
pub fn with_base_url( api_key: impl Into<String>, api_url: impl Into<String>, ) -> OpenAIProtocolChatDriver
Create a new driver with a custom API URL (for OpenAI-compatible APIs)
Sourcepub fn with_retry_config(
self,
config: LlmRetryConfig,
) -> OpenAIProtocolChatDriver
pub fn with_retry_config( self, config: LlmRetryConfig, ) -> OpenAIProtocolChatDriver
Configure retry behavior for rate limit errors
Sourcepub fn with_auth_provider(
self,
provider: Arc<dyn AuthHeaderProvider>,
) -> OpenAIProtocolChatDriver
pub fn with_auth_provider( self, provider: Arc<dyn AuthHeaderProvider>, ) -> OpenAIProtocolChatDriver
Set a pluggable AuthHeaderProvider that overrides the default
api-key / bearer auth. Used for OAuth bearer tokens (e.g. Entra ID).
Trait Implementations§
Source§impl ChatDriver for OpenAIProtocolChatDriver
impl ChatDriver for OpenAIProtocolChatDriver
Source§fn supports_parallel_tool_calls(&self, _model: &str) -> bool
fn supports_parallel_tool_calls(&self, _model: &str) -> bool
OpenAI-compatible Chat Completions accept the top-level
parallel_tool_calls boolean, so the preference maps directly onto the
wire for every model served through this protocol.
Source§fn chat_completion_stream<'life0, 'life1, 'async_trait>(
&'life0 self,
messages: Vec<LlmMessage>,
config: &'life1 LlmCallConfig,
) -> Pin<Box<dyn Future<Output = Result<Pin<Box<dyn Stream<Item = Result<LlmStreamEvent, AgentLoopError>> + Send>>, AgentLoopError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
OpenAIProtocolChatDriver: 'async_trait,
fn chat_completion_stream<'life0, 'life1, 'async_trait>(
&'life0 self,
messages: Vec<LlmMessage>,
config: &'life1 LlmCallConfig,
) -> Pin<Box<dyn Future<Output = Result<Pin<Box<dyn Stream<Item = Result<LlmStreamEvent, AgentLoopError>> + Send>>, AgentLoopError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
OpenAIProtocolChatDriver: 'async_trait,
Source§fn chat_completion<'life0, 'life1, 'async_trait>(
&'life0 self,
messages: Vec<LlmMessage>,
config: &'life1 LlmCallConfig,
) -> Pin<Box<dyn Future<Output = Result<LlmResponse, AgentLoopError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
fn chat_completion<'life0, 'life1, 'async_trait>(
&'life0 self,
messages: Vec<LlmMessage>,
config: &'life1 LlmCallConfig,
) -> Pin<Box<dyn Future<Output = Result<LlmResponse, AgentLoopError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
Source§fn list_models<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Option<Vec<DiscoveredModel>>, AgentLoopError>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn list_models<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Option<Vec<DiscoveredModel>>, AgentLoopError>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn supports_compact(&self) -> bool
fn supports_compact(&self) -> bool
Source§fn supports_stateful_responses(&self) -> bool
fn supports_stateful_responses(&self) -> bool
previous_response_id. Read moreSource§fn compact<'life0, 'async_trait>(
&'life0 self,
_request: CompactRequest,
) -> Pin<Box<dyn Future<Output = Result<Option<CompactResponse>, AgentLoopError>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn compact<'life0, 'async_trait>(
&'life0 self,
_request: CompactRequest,
) -> Pin<Box<dyn Future<Output = Result<Option<CompactResponse>, AgentLoopError>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§impl Clone for OpenAIProtocolChatDriver
impl Clone for OpenAIProtocolChatDriver
Source§fn clone(&self) -> OpenAIProtocolChatDriver
fn clone(&self) -> OpenAIProtocolChatDriver
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl !RefUnwindSafe for OpenAIProtocolChatDriver
impl !UnwindSafe for OpenAIProtocolChatDriver
impl Freeze for OpenAIProtocolChatDriver
impl Send for OpenAIProtocolChatDriver
impl Sync for OpenAIProtocolChatDriver
impl Unpin for OpenAIProtocolChatDriver
impl UnsafeUnpin for OpenAIProtocolChatDriver
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request