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();
// Endpoint and authentication are configured on a runtime Provider.
// Retry policy remains a wire-protocol concern.
let driver = OpenAIProtocolChatDriver::new()
.with_retry_config(LlmRetryConfig::aggressive());Implementations§
Source§impl OpenAIProtocolChatDriver
impl OpenAIProtocolChatDriver
Sourcepub fn new() -> OpenAIProtocolChatDriver
pub fn new() -> OpenAIProtocolChatDriver
Create a wire-only OpenAI Chat Completions protocol driver.
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
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, 'life2, 'async_trait>(
&'life0 self,
endpoint: &'life1 ProviderEndpoint,
messages: Vec<LlmMessage>,
config: &'life2 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,
'life2: 'async_trait,
OpenAIProtocolChatDriver: 'async_trait,
fn chat_completion_stream<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
endpoint: &'life1 ProviderEndpoint,
messages: Vec<LlmMessage>,
config: &'life2 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,
'life2: 'async_trait,
OpenAIProtocolChatDriver: 'async_trait,
Call the LLM with streaming response
Source§fn chat_completion<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
endpoint: &'life1 ProviderEndpoint,
messages: Vec<LlmMessage>,
config: &'life2 LlmCallConfig,
) -> Pin<Box<dyn Future<Output = Result<LlmResponse, AgentLoopError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Self: 'async_trait,
fn chat_completion<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
endpoint: &'life1 ProviderEndpoint,
messages: Vec<LlmMessage>,
config: &'life2 LlmCallConfig,
) -> Pin<Box<dyn Future<Output = Result<LlmResponse, AgentLoopError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Self: 'async_trait,
Call the LLM without streaming (convenience method)
Source§fn list_models<'life0, 'life1, 'async_trait>(
&'life0 self,
_endpoint: &'life1 ProviderEndpoint,
) -> Pin<Box<dyn Future<Output = Result<Option<Vec<DiscoveredModel>>, AgentLoopError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
fn list_models<'life0, 'life1, 'async_trait>(
&'life0 self,
_endpoint: &'life1 ProviderEndpoint,
) -> Pin<Box<dyn Future<Output = Result<Option<Vec<DiscoveredModel>>, AgentLoopError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
List available models from the provider Read more
Source§fn supports_compact(&self) -> bool
fn supports_compact(&self) -> bool
Check if this driver supports the compact endpoint Read more
Source§fn supports_stateful_responses(&self) -> bool
fn supports_stateful_responses(&self) -> bool
Whether this driver persists Responses API state and can resolve tool
calls that are reachable only through
previous_response_id. Read moreSource§fn effective_context_window(&self, _model: &str) -> Option<usize>
fn effective_context_window(&self, _model: &str) -> Option<usize>
Effective context window for
model, when the driver has authoritative
model metadata that is not represented by Everruns’ built-in profiles. Read moreSource§fn compact<'life0, 'life1, 'async_trait>(
&'life0 self,
_endpoint: &'life1 ProviderEndpoint,
_request: CompactRequest,
) -> Pin<Box<dyn Future<Output = Result<Option<CompactResponse>, AgentLoopError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
fn compact<'life0, 'life1, 'async_trait>(
&'life0 self,
_endpoint: &'life1 ProviderEndpoint,
_request: CompactRequest,
) -> Pin<Box<dyn Future<Output = Result<Option<CompactResponse>, AgentLoopError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
Compact a conversation to reduce context size Read more
Source§impl Clone for OpenAIProtocolChatDriver
impl Clone for OpenAIProtocolChatDriver
Source§fn clone(&self) -> OpenAIProtocolChatDriver
fn clone(&self) -> OpenAIProtocolChatDriver
Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for OpenAIProtocolChatDriver
impl Debug for OpenAIProtocolChatDriver
Source§impl Default for OpenAIProtocolChatDriver
impl Default for OpenAIProtocolChatDriver
Source§fn default() -> OpenAIProtocolChatDriver
fn default() -> OpenAIProtocolChatDriver
Returns the “default value” for a type. Read more
Auto 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
Mutably borrows from an owned value. Read more
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> ⓘ
Converts
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> ⓘ
Converts
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>
Wrap the input message
T in a tonic::Request