windlass.providers.llm.openai¶
openai
¶
OpenAI chat-completions adapter.
Covers OpenAI proper and every OpenAI-compatible endpoint — Azure OpenAI,
vLLM, LM Studio, OpenRouter, Together — by pointing base_url at them.
Install with::
pip install "windlass[openai]"
Example
from windlass import Windlass # doctest: +SKIP llm = Windlass.llm("openai", model="gpt-4o-mini") # doctest: +SKIP llm.complete("Say hi").content # doctest: +SKIP 'Hi!'
OpenAILLM
¶
OpenAILLM(
model: str = "",
*,
api_key: str | None = None,
base_url: str | None = None,
organization: str | None = None,
max_retries: int = 0,
default_headers: dict[str, str] | None = None,
**config: Any
)
Bases: LLM
Chat completions via the official openai SDK.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
model
|
str
|
Model id, e.g. |
''
|
api_key
|
str | None
|
Credential. Falls back to |
None
|
base_url
|
str | None
|
Endpoint override for compatible gateways. |
None
|
organization
|
str | None
|
OpenAI organization id. |
None
|
max_retries
|
int
|
SDK-level retries. Windlass applies its own policy on top, so this defaults to 0 to avoid multiplying the two. |
0
|
default_headers
|
dict[str, str] | None
|
Extra headers sent with every request. |
None
|
**config
|
Any
|
Forwarded to :class: |
{}
|
Raises:
| Type | Description |
|---|---|
MissingDependencyError
|
When |
AuthenticationError
|
When no API key can be found. |
Performance
One shared AsyncOpenAI client per instance keeps the HTTP connection
pool warm; construct the LLM once and reuse it.
Source code in src\windlass\providers\llm\openai.py
default_model
classmethod
¶
native
¶
Return the underlying openai.AsyncOpenAI client (Level 3 access).
Example
client = llm.native() # doctest: +SKIP await client.images.generate(prompt="a cat") # doctest: +SKIP
Source code in src\windlass\providers\llm\openai.py
agenerate
async
¶
agenerate(
messages: list[Message], *, tools: list[dict[str, Any]] | None = None, **kwargs: Any
) -> Completion
Request one chat completion.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
messages
|
list[Message]
|
The conversation. |
required |
tools
|
list[dict[str, Any]] | None
|
OpenAI-format tool definitions. |
None
|
**kwargs
|
Any
|
Request overrides ( |
{}
|
Returns:
| Type | Description |
|---|---|
Completion
|
The completion, with the SDK response on |
Raises:
| Type | Description |
|---|---|
AuthenticationError
|
Invalid credentials. |
RateLimitError
|
Quota or rate limit hit. |
ProviderTimeoutError
|
The request timed out. |
ProviderError
|
Any other API failure. |
Source code in src\windlass\providers\llm\openai.py
astream_generate
async
¶
astream_generate(
messages: list[Message], *, tools: list[dict[str, Any]] | None = None, **kwargs: Any
) -> AsyncIterator[StreamEvent]
Stream a chat completion.
Tool calls arrive fragmented across chunks; they are reassembled here and
emitted as complete :class:~windlass.core.types.ToolCall objects.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
messages
|
list[Message]
|
The conversation. |
required |
tools
|
list[dict[str, Any]] | None
|
OpenAI-format tool definitions. |
None
|
**kwargs
|
Any
|
Request overrides. |
{}
|
Yields:
| Type | Description |
|---|---|
AsyncIterator[StreamEvent]
|
Text deltas, then completed tool calls, then |
Source code in src\windlass\providers\llm\openai.py
to_openai_messages
¶
Translate Windlass messages into the OpenAI wire format.
Shared by every OpenAI-compatible adapter (Groq, Ollama, local gateways), so the mapping lives in exactly one place.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
messages
|
list[Message]
|
The conversation. |
required |
Returns:
| Type | Description |
|---|---|
list[dict[str, Any]]
|
Message dicts in OpenAI's schema. |
Example
from windlass.core.types import Message to_openai_messages([Message.user("hi")]) [{'role': 'user', 'content': 'hi'}]
Source code in src\windlass\providers\llm\openai.py
translate_openai_error
¶
Map an openai SDK exception onto the Windlass hierarchy.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
exc
|
BaseException
|
The raised exception. |
required |
sdk
|
Any
|
The imported |
required |
Returns:
| Type | Description |
|---|---|
ProviderError
|
The matching :class: |