everruns_openai/lib.rs
1//! OpenAI provider drivers for Everruns.
2//!
3//! `everruns-openai` is part of the [Everruns](https://everruns.com)
4//! ecosystem. It implements the [`ChatDriver`] contract from `everruns-core` and
5//! registers OpenAI providers into a [`DriverRegistry`].
6//!
7//! The crate exposes two drivers:
8//!
9//! - [`OpenAIChatDriver`], the recommended Responses API driver.
10//! - [`OpenAICompletionsChatDriver`], a Chat Completions compatibility driver.
11//!
12//! OpenRouter lives in the separate `everruns-openrouter` crate.
13//!
14//! # Registering the Driver
15//!
16//! ```
17//! use everruns_provider::DriverRegistry;
18//! use everruns_openai::register_driver;
19//!
20//! let mut registry = DriverRegistry::new();
21//! register_driver(&mut registry);
22//! ```
23//!
24//! # Embedded Agent Example
25//!
26//! ```ignore
27//! use everruns_provider::{
28//! CapabilityRegistry, CredentialProvider, DriverRegistry, DriverId, EnvCredentialProvider,
29//! ResolvedModel, PlatformDefinition,
30//! };
31//! use everruns_runtime::InProcessRuntimeBuilder;
32//!
33//! let mut drivers = DriverRegistry::new();
34//! everruns_openai::register_driver(&mut drivers);
35//!
36//! // Standalone/dev: resolve credentials through the injectable env provider.
37//! // Driver code never reads the environment itself (see specs/llm-drivers.md).
38//! let creds = EnvCredentialProvider
39//! .resolve(&DriverId::OpenAI)
40//! .expect("OPENAI_API_KEY not set");
41//!
42//! let platform = PlatformDefinition::new(CapabilityRegistry::new(), drivers);
43//! let runtime = InProcessRuntimeBuilder::new()
44//! .platform_definition(platform)
45//! .default_model(ResolvedModel {
46//! model: "gpt-5.4-mini".into(),
47//! provider_type: DriverId::OpenAI,
48//! api_key: creds.api_key,
49//! base_url: creds.base_url,
50//! })
51//! .single_session(|s| {
52//! s.harness("assistant", "You are a helpful assistant.")
53//! .agent("openai-agent", "Answer clearly and concisely.")
54//! })
55//! .build()
56//! .await?;
57//!
58//! let session_id = runtime.default_session_id().expect("single_session id");
59//! let result = runtime.run_text_turn(session_id, "Write a one-line status update.").await?;
60//! println!("{}", result.response);
61//! # Ok::<(), Box<dyn std::error::Error>>(())
62//! ```
63
64mod driver;
65pub(crate) mod embeddings;
66mod types;
67
68#[cfg(test)]
69mod tests;
70
71pub use driver::{OpenAIChatDriver, OpenAICompletionsChatDriver, register_driver};
72pub use embeddings::OpenAIEmbeddingsDriver;
73pub use types::{
74 ChatMessage, ChatRequest, CompletionMetadata, LlmConfig, LlmStreamEvent, MessageRole,
75};
76
77// Re-export core types for convenience
78pub use everruns_provider::driver_registry::{ChatDriver, DriverRegistry};