Skip to main content

DrekAI

A modern, async-first Python wrapper for OpenAI-compatible LLM APIs with built-in tool/function calling support.

Works with OpenAI, Gemini (via proxy), and any OpenAI-compatible endpoint.


✨ Features

  • Async-native – built on httpx / openai async client
  • Tool use – define Python functions as AI-callable tools with automatic parameter injection
  • Streaming – stream responses token-by-token with a simple callback
  • Sandboxed parameters – keep secrets invisible to the LLM while still passing them to tools
  • Multi-turn chats – first-class conversation history management
  • Image support – send local files, URLs, or base64 images inline
  • Thinking / reasoning – support for extended-thinking models with effort control
  • Gemini compatibility – automatic tool-call shimming for Gemini models behind OpenAI proxies

📦 Installation

pip install drekai

Or install from source:

git clone https://github.com/drek124/drekai.git
cd drekai
pip install .

🚀 Quick Start

import asyncio
from drekai import Model, Chatbot

# 1. Define a model endpoint
model = Model("gpt-4o", "https://api.openai.com/v1", api_key="sk-...")

# 2. Create a chatbot
bot = Chatbot(
    name="Helper",
    system_prompt="You are a helpful assistant.",
    parent_model=model,
    temperature=0.7,
)

async def main():
    # One-shot generation
    response = await bot.generate_text("Hello!")
    print(response.choices[0].message.content)

    # Multi-turn chat
    chat = bot.start_chat()
    r1 = await chat.generate_reply("What's the weather in Tokyo?")
    r2 = await chat.generate_reply("And in London?")
    print(r2.choices[0].message.content)

asyncio.run(main())

🛠️ Tool Use

from drekai import Model, Chatbot
from drekai.tools import Tool, ToolParameter

model = Model("gpt-4o", "https://api.openai.com/v1", api_key="sk-...")
bot = Chatbot("Assistant", "You are a helpful assistant.", model)

async def get_weather(city: str) -> str:
    """Get the current weather for a city."""
    # In a real app, call a weather API here
    return f"The weather in {city} is sunny, 25°C."

tools = [
    Tool(
        "get_weather",
        [ToolParameter("city", "City name", type=str)],
        callback=get_weather,
    )
]

async def main():
    chat = bot.start_chat()
    response = await chat.generate_reply(
        "What's the weather in Paris?",
        tools=tools,
    )
    print(response.choices[0].message.content)

asyncio.run(main())

Sandboxed Parameters

Keep secrets like user IDs invisible to the LLM:

async def get_friends(user, limit: int = 50) -> str:
    """Fetch the user's friends list."""
    return str(user.get_friends(limit=limit))

tools = [
    Tool(
        "get_friends",
        [ToolParameter("limit", "Max friends to return", required=False, type=int)],
        callback=get_friends,
        sandbox_params=["user"],  # hidden from the LLM
    )
]

await chat.generate_reply(
    "Who are my friends?",
    tools=tools,
    sandbox_params={"user": current_user},  # injected at call time
)

🖼️ Images

from drekai.messaging import Image

# Local file
await chat.generate_reply(
    "Describe this image.",
    items=[Image("/path/to/photo.jpg")],
)

# URL
await chat.generate_reply(
    "Describe this image.",
    items=[Image("https://example.com/photo.jpg")],
)

# Base64
await chat.generate_reply(
    "Describe this image.",
    items=[Image(base64_data, b64=True)],
)

📖 API Reference

Model(model_id, base_url, *, api_key)

Root model representing an API endpoint.

Chatbot(name, system_prompt, parent_model, *, api_key, temperature, thinking, reasoning_effort)

A named chatbot built on a model.

Chat

Created via chatbot.start_chat(). Manages conversation history.

Method Description
generate_reply(...) Generate the next response
add_message_to_context(content, role) Manually add a message
clear() Reset history (keeps system prompt)
delete_first_message(role) Remove first message with given role
stop_live_generation() Stop an active stream mid-generation

ChatSettings(max_tokens, show_tool_error_type)

Per-chat configuration.

Tool(name, params, callback, sandbox_params)

An AI-callable function.

ToolParameter(name, description, type, required)

Describes a tool parameter.

MessageItem / Image

Chat message attachments.


🧪 Development

# Clone and install in editable mode with dev deps
git clone https://github.com/drek124/drekai.git
cd drekai
pip install -e ".[dev]"

# Lint
ruff check .

# Type check
mypy .

# Test
pytest

📄 License

MIT License. See LICENSE for details.

Release files for drekai 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for drekai 0.1.0
File Size Uploaded
drekai-0.1.0.tar.gz 9.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for drekai 0.1.0
File Interpreter ABI Platform
drekai-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 29.1 kB

Release files / drekai-0.1.0.tar.gz

Download URL drekai-0.1.0.tar.gz
Size 9.7 kB
Tags Source
SHA-256 checksum
How to use checksums
fdc6842d3e435e0093167ed298ff5b74b72d2f641b25487b8b7bb1266a53da3b
BLAKE2b-256 checksum
How to use checksums
4ffdd2c34b8c41af1b9bcdb9e6bd456573dd7e75b3a4ce2fc430c89d7d26495c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

Release files / drekai-0.1.0-py3-none-any.whl

Download URL drekai-0.1.0-py3-none-any.whl
Size 19.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3f78027ddb0e917a652b0b16ee6bbc19cc4d027527186bae5fa382bb2244a9f4
BLAKE2b-256 checksum
How to use checksums
70ddc1ad705ca5f0244bbcf011c794b6b27fe94513a4813466c0d299410414f3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

Release history Release notifications | RSS feed

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page