Utilities for orchestrating OpenAI chat, tool calling, search, audio, and images from one helper package.
Project description
Easier OpenAI
Easier OpenAI wraps the official OpenAI Python SDK so you can drive modern assistants, manage tool selection, search files, and work with speech from one helper package -- all with minimal boilerplate.
Features
- High level
Assistantwrapper with conversation memory, tool toggles, and streaming helpers. - Temporary vector store ingestion to ground answers in local notes or documents.
- Text to speech and speech to text bridges designed for quick experiments or internal tooling.
- Built-in helper for defining and executing OpenAI function tools without leaving Python.
- Lazy module loading so
import easier_openaistays fast even as optional helpers expand. - Type hints and comprehensive inline docstrings across the project for easier discovery.
Installation
pip install easier-openai
Optional extras:
pip install "easier-openai[function_tools]" # decorator helpers
pip install "easier-openai[speech_models]" # whisper speech recognition models
Set the OPENAI_API_KEY environment variable or pass api_key directly when instantiating Assistant.
Quick Start
from easier_openai import Assistant
assistant = Assistant(model="gpt-4o-mini", system_prompt="You are concise.")
response_text = assistant.chat("Summarize Rayleigh scattering in one sentence.")
print(response_text)
sped-up video. actual time ~1 min:
https://github.com/user-attachments/assets/8d2340ac-e4ac-4163-8ec0-a7a226b6d1b6
Tool Calling Made Simple
Use Assistant.openai_function to convert regular functions into structured tool definitions and hand them to chat:
from easier_openai import Assistant
assistant = Assistant()
@assistant.openai_function
def look_up_fact(topic: str) -> dict:
"""Return a knowledge base lookup result for the given topic."""
return {"topic": topic}
assistant.chat(
"Tell me about the ozone layer using the fact tool.",
custom_tools=[look_up_fact],
)
Stream Responses with Tools
stream = assistant.chat(
"Summarise launch blockers for the robotics demo",
custom_tools=[look_up_fact],
text_stream=True,
)
for delta in stream:
if delta == "done":
break
print(delta, end="", flush=True)
Ground Responses With Your Files
notes = ["notes/overview.md", "notes/data-sheet.pdf"]
reply = assistant.chat(
"Highlight key risks from the attached docs",
file_search=notes,
tools_required="auto",
)
print(reply)
Speech I/O
Generate audio output directly from assistant responses:
assistant.full_text_to_speech(
"Ship a status update that sounds upbeat",
model="gpt-4o-mini-tts",
voice="alloy",
play=True,
)
full_text_to_speech accepts the same keyword arguments as chat, so you can pass
custom_tools, file_search, or web_search before the reply is spoken.
Or capture short dictated prompts without leaving the terminal:
transcript = assistant.speech_to_text(mode="vad", model="base.en")
print(transcript)
Image Utilities
Openai_Images extends the assistant with helpers that accept URLs, file paths, or base64 payloads and normalise them for the Images API:
from easier_openai import Openai_Images
image_client = Openai_Images("samples/promenade.jpg")
# Generated metadata is stored on image_client.image for re-use in calls.
Configuration Reference
model: Default model used for chat, tool calls, and reasoning workflows. Choosing a realtime model (for examplegpt-4o-realtime-preview) automatically routesAssistant.chatthrough the Realtime API for text-only prompts; installopenai[realtime]to satisfy its websocket dependency. Tool execution and thestreamflag are ignored while a realtime model is active.system_prompt: Injected once per conversation to shape assistant behaviour.reasoning_effortandsummary_length: Fine tune reasoning models via the official API semantics.temperature: Pass through value mapped to OpenAI responses for deterministic vs creative answers.function_call_list: Pre-register decorated tool callables that should accompany everychatrequest.default_conversation: Set toFalseif you prefer to supply conversation IDs manually.mass_update(**kwargs): Bulk update configuration attributes using keyword arguments validated by type hints.
assistant.mass_update(model="gpt-4o-mini", temperature=0.2)
assistant.mass_update(reasoning_effort="high", summary_length="concise")
Developer Notes
- Every public function and class ships with contextual docstrings to make the codebase self-documenting.
- The repository includes unit tests under
tests/that exercise tool-calling flows; run them withpytest. - Generated artifacts in
build/mirror the source package and inherit the same documentation updates. - Issues and pull requests are welcome; please run checks locally before submitting changes.
License
Licensed under the Apache License 2.0.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file easier_openai-7.1.tar.gz.
File metadata
- Download URL: easier_openai-7.1.tar.gz
- Upload date:
- Size: 29.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fd4f6f7849ed0f56830f1ff6411fc2394ab9514e2dda00f7b05449000c15b55f
|
|
| MD5 |
dff3d9cc883061ed1030566d2606ada7
|
|
| BLAKE2b-256 |
4941b652e689258c03db3b1d0c5d5c103490c088c49cc7b94ede5eb9b1315828
|
File details
Details for the file easier_openai-7.1-py3-none-any.whl.
File metadata
- Download URL: easier_openai-7.1-py3-none-any.whl
- Upload date:
- Size: 27.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
de3d58cdaceb10b6e56434ab4d25a948d470da1dc224ce1dc2f915613a2dfcc9
|
|
| MD5 |
9fe076342082713ffef4370990243e51
|
|
| BLAKE2b-256 |
75f65af442eaa47e82161d4f693ef2b7b65e4becfd3a198546b54873be73d065
|