Skip to main content

Tiny AI Client

Inspired by tinygrad and simpleaichat, tiny-ai-client is the easiest way to use and switch LLMs with vision and tool usage support. It works because it is tiny, simple and most importantly fun to develop.

I want to change LLMs with ease, while knowing what is happening under the hood. Langchain is cool, but became bloated, complicated there is just too much chaos going on. I want to keep it simple, easy to understand and easy to use. If you want to use a LLM and have an API key, you should not need to read a 1000 lines of code and write response.choices[0].message.content to get the response.

Simple and tiny, that's the goal.

Features:

  • OpenAI
  • Anthropic
  • Async
  • Tool usage
  • Structured output
  • Vision
  • PyPI package tiny-ai-client
  • Gemini (vision, no tools)
  • Ollama (text, no vision, no tools) (you can also pass a custom model_server_url to AI/AsyncAI)
    • To use it, model_name='ollama:llama3' or your model name.
  • Groq (text, tools, no vision)
    • To use it model_name='groq:llama-70b-8192' or your model name as in Groq docs.

Roadmap:

  • Gemini tools

Simple

tiny-ai-client is simple and intuitive:

  • Do you want set your model? Just pass the model name.
  • Do you want to change your model? Just change the model name.
  • Want to send a message? msg: str = ai("hello") and say goodbye to parsing a complex json.
  • Do you want to use a tool? Just pass the tool as a function
    • Type hint it with a single argument that inherits from pydantic.BaseModel and just pass the callable. AI will call it and get its results to you if the model wants to.
  • Want to use vision? Just pass a PIL.Image.Image.
  • Video? Just pass a list of PIL.Image.Image.

Tiny

  • tiny-ai-client is very small, its core logic is < 250 lines of code (including comments and docstrings) and ideally won't pass 500. It is and always will be easy to understand, tweak and use.
    • The core logic is in tiny_ai_client/models.py
    • Vision utils are in tiny_ai_client/vision.py
    • Tool usage utils are in tiny_ai_client/tools.py
  • The interfaces are implemented by subclassing tiny_ai_client.models.LLMClientWrapper binding it to a specific LLM provider. This logic might get bigger, but it is isolated in a single file and does not affect the core logic.

Usage

pip install tiny-ai-client

To test, set the following environment variables:

  • OPENAI_API_KEY
  • ANTHROPIC_API_KEY
  • GROQ_API_KEY
  • GOOGLE_API_KEY

Then

To run all examples:

./scripts/run-all-examples.sh

For OpenAI:

from tiny_ai_client import AI, AsyncAI

ai = AI(
    model_name="gpt-4o", system="You are Spock, from Star Trek.", max_new_tokens=128
)
response = ai("What is the meaning of life?")

ai = AsyncAI(
    model_name="gpt-4o", system="You are Spock, from Star Trek.", max_new_tokens=128
)
response = await ai("What is the meaning of life?")

For Anthropic:

from tiny_ai_client import AI, AsyncAI

ai = AI(
    model_name="claude-3-haiku-20240307", system="You are Spock, from Star Trek.", max_new_tokens=128
)
response = ai("What is the meaning of life?")

ai = AsyncAI(
    model_name="claude-3-haiku-20240307", system="You are Spock, from Star Trek.", max_new_tokens=128
)
response = await ai("What is the meaning of life?")

We also support tool usage for both. You can pass as many functions you want as type-hinted functions with a single argument that inherits from pydantic.BaseModel. AI will call the function and get its results to you.

from pydantic import BaseModel, Field

from tiny_ai_client import AI, AsyncAI


class WeatherParams(BaseModel):
    location: str = Field(..., description="The city and state, e.g. San Francisco, CA")
    unit: str = Field(
        "celsius", description="Temperature unit", enum=["celsius", "fahrenheit"]
    )


def get_current_weather(weather: WeatherParams):
    """
    Get the current weather in a given location
    """
    return f"Getting the current weather in {weather.location} in {weather.unit}."

ai = AI(
    model_name="gpt-4o",
    system="You are Spock, from Star Trek.",
    max_new_tokens=32,
    tools=[get_current_weather],
)
response = ai("What is the meaning of life?")
print(f"{response=}")
response = ai("Please get the current weather in celsius for San Francisco.")
print(f"{response=}")
response = ai("Did it work?")
print(f"{response=}")

And vision. Pass a list of PIL.Image.Image (or a single one) and we will handle the rest.

from tiny_ai_client import AI, AsyncAI
from PIL import Image

ai = AI(
    model_name="gpt-4o",
    system="You are Spock, from Star Trek.",
    max_new_tokens=32,
)

response = ai(
    "Who is on the images?",
    images[
        Image.open("assets/kirk.jpg"),
        Image.open("assets/spock.jpg")
    ]
)
print(f"{response=}")

Metadata

Release files for tiny-ai-client 0.0.14

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

Source distribution (sdist)

Source distribution for tiny-ai-client 0.0.14
File Size Uploaded
tiny_ai_client-0.0.14.tar.gz 12.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for tiny-ai-client 0.0.14
File Interpreter ABI Platform
tiny_ai_client-0.0.14-py3-none-any.whl Python 3 none any Details

Total release size: 28.6 kB

Release files / tiny_ai_client-0.0.14.tar.gz

Download URL tiny_ai_client-0.0.14.tar.gz
Size 12.8 kB
Tags Source
SHA-256 checksum
How to use checksums
1a599d9efa652b9768f8c2333f6a855da17590b61b5c36a9bb36fa1c55ba2e44
BLAKE2b-256 checksum
How to use checksums
123a999dd4d39439e4c44f0f4cc21addec804dccf09a51ee14390c3849499a5c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.0.1 CPython/3.12.8

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 27, 2024.

Transparency log

Release files / tiny_ai_client-0.0.14-py3-none-any.whl

Download URL tiny_ai_client-0.0.14-py3-none-any.whl
Size 15.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
87965ed2160d58c68bc1a0100afcc1fd58db774179ce52b68068c1452374186b
BLAKE2b-256 checksum
How to use checksums
17dbbda1f2d1bb7aaca74b662d1a9ed6d1190a6ec98d5df97801ae9fbc78c98e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.0.1 CPython/3.12.8

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 27, 2024.

Transparency log

Release history Release notifications | RSS feed

This release

0.0.14 This release

2 release files

0.0.13

2 release files

0.0.12

2 release files

0.0.9

2 release files

0.0.8

2 release files

0.0.7

2 release files

0.0.6

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

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