Skip to main content

A unified Python SDK for querying AI models from multiple providers

Project description

ai-query

A unified Python SDK for querying AI models from multiple providers with a consistent interface.

Installation

uv add ai-query
# or
pip install ai-query

Quick Start

import asyncio
from ai_query import generate_text, openai

async def main():
    result = await generate_text(
        model=openai("gpt-4o"),
        prompt="What is the capital of France?"
    )
    print(result.text)

asyncio.run(main())

Streaming

from ai_query import stream_text, google

async def main():
    result = stream_text(
        model=google("gemini-2.0-flash"),
        prompt="Write a short story."
    )

    async for chunk in result.text_stream:
        print(chunk, end="", flush=True)

    usage = await result.usage
    print(f"\nTokens: {usage.total_tokens}")

Tool Calling

Define tools and let the model use them automatically. The library handles the execution loop.

from ai_query import generate_text, google, tool, step_count_is

# Define tools
weather_tool = tool(
    description="Get the current weather for a location",
    parameters={
        "type": "object",
        "properties": {
            "location": {"type": "string", "description": "City name"}
        },
        "required": ["location"]
    },
    execute=lambda location: {"temp": 72, "condition": "sunny"}
)

calculator_tool = tool(
    description="Perform math calculations",
    parameters={
        "type": "object",
        "properties": {
            "expression": {"type": "string", "description": "Math expression"}
        },
        "required": ["expression"]
    },
    execute=lambda expression: {"result": eval(expression)}
)

async def main():
    result = await generate_text(
        model=google("gemini-2.0-flash"),
        prompt="What's the weather in Paris? Also, what is 25 * 4?",
        tools={
            "weather": weather_tool,
            "calculator": calculator_tool
        },
        stop_when=step_count_is(5),  # Max 5 model calls
    )
    print(result.text)
    print(f"Steps: {len(result.response['steps'])}")

Stop Conditions

Control when the tool execution loop stops:

from ai_query import step_count_is, has_tool_call

# Stop after N model calls
stop_when=step_count_is(5)

# Stop when a specific tool is called
stop_when=has_tool_call("final_answer")

# Multiple conditions (stops when any is true)
stop_when=[step_count_is(10), has_tool_call("done")]

Step Callbacks

Monitor and react to each step in the execution loop with on_step_start and on_step_finish.

from ai_query import generate_text, google, StepStartEvent, StepFinishEvent

def on_start(event: StepStartEvent):
    print(f"Step {event.step_number} starting...")
    print(f"  Messages: {len(event.messages)}")
    # event.messages can be modified before the model call

def on_finish(event: StepFinishEvent):
    print(f"Step {event.step_number} finished")

    # Current step details
    if event.step.tool_calls:
        for tc in event.step.tool_calls:
            print(f"  Called: {tc.name}({tc.arguments})")
    if event.step.tool_results:
        for tr in event.step.tool_results:
            print(f"  Result: {tr.result}")

    # Accumulated state
    print(f"  Total tokens: {event.usage.total_tokens}")
    print(f"  Text so far: {event.text[:50]}...")

result = await generate_text(
    model=google("gemini-2.0-flash"),
    prompt="What's the weather in Tokyo?",
    tools={"weather": weather_tool},
    on_step_start=on_start,
    on_step_finish=on_finish,
)

StepStartEvent

Field Type Description
step_number int 1-indexed step number
messages list[Message] Conversation history (modifiable)
tools ToolSet | None Available tools

StepFinishEvent

Field Type Description
step_number int 1-indexed step number
step StepResult Current step (text, tool_calls, tool_results)
text str Accumulated text from all steps
usage Usage Accumulated token usage
steps list[StepResult] All completed steps

Both callbacks support sync and async functions.

Providers

Built-in support for:

  • OpenAI: openai("gpt-4o") - uses OPENAI_API_KEY
  • Anthropic: anthropic("claude-sonnet-4-20250514") - uses ANTHROPIC_API_KEY
  • Google: google("gemini-2.0-flash") - uses GOOGLE_API_KEY

Pass API keys directly if needed:

model = google("gemini-2.0-flash", api_key="your_key")

Provider Options

Pass provider-specific parameters:

result = await generate_text(
    model=google("gemini-2.0-flash"),
    prompt="Tell me a story",
    provider_options={
        "google": {
            "safety_settings": {"HARM_CATEGORY_VIOLENCE": "BLOCK_NONE"}
        }
    }
)

Examples

See the examples/ folder for agent implementations

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ai_query-1.0.0.tar.gz (71.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ai_query-1.0.0-py3-none-any.whl (27.3 kB view details)

Uploaded Python 3

File details

Details for the file ai_query-1.0.0.tar.gz.

File metadata

  • Download URL: ai_query-1.0.0.tar.gz
  • Upload date:
  • Size: 71.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ai_query-1.0.0.tar.gz
Algorithm Hash digest
SHA256 edc147814cad2468656017146ed3437ff2b695d26b3b8f4012af3871d0476682
MD5 b42340408d7d7b93808869254acbb0d4
BLAKE2b-256 a5b872c696d6defd273f281c5dcbe30e48313c24e4bd7756a74f3363f2ec1595

See more details on using hashes here.

Provenance

The following attestation bundles were made for ai_query-1.0.0.tar.gz:

Publisher: release.yml on Abdulmumin1/ai-query

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ai_query-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: ai_query-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 27.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ai_query-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 975a0450b5e1639ef290e5e5e14501570d2daeeb93458135ebd47c0bbcfbf808
MD5 d2d8990582fd5bf9dc1d2d3e2bb460c3
BLAKE2b-256 cd2110e99c3f670a60f98a812401a57ab6847b2d3125c10f4d3f213664c525f6

See more details on using hashes here.

Provenance

The following attestation bundles were made for ai_query-1.0.0-py3-none-any.whl:

Publisher: release.yml on Abdulmumin1/ai-query

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page