DEV Community

Sergey Inozemtsev
Sergey Inozemtsev

Posted on

Unifying 3 LLM APIs in Python: OpenAI, Anthropic & Google with one SDK

A year ago, I released the first version of LLM API Adapter — a lightweight SDK that unified OpenAI, Anthropic, and Google APIs under one interface.

It got 7 ⭐ on GitHub and valuable feedback from early users.

That was enough motivation to take it to the next level.


What changed in the new version

The new version (v0.2.2) is now:

  • SDK-free — it talks directly to provider APIs, no external dependencies.
  • Unified — one chat() interface for all models (OpenAI, Anthropic, Google).
  • Transparent — automatic token and cost tracking.
  • Resilient — consistent error taxonomy across providers (auth, rate, timeout, token limits).
  • Tested — 98% unit test coverage.

Example: chat with any LLM

from llm_api_adapter.universal_adapter import UniversalLLMAPIAdapter adapter = UniversalLLMAPIAdapter(provider="openai", model="gpt-5") response = adapter.chat([ {"role": "system", "content": "Be concise."}, {"role": "user", "content": "Explain how LLM adapters work."}, ]) print(response.content) 
Enter fullscreen mode Exit fullscreen mode

Switching models is as simple as changing two parameters:

adapter = UniversalLLMAPIAdapter(provider="anthropic", model="claude-sonnet-4-5") # or adapter = UniversalLLMAPIAdapter(provider="google", model="gemini-2.5-pro") 
Enter fullscreen mode Exit fullscreen mode

Token & cost tracking example

Every response now includes full token and cost accounting — no manual math needed.

from llm_api_adapter.universal_adapter import UniversalLLMAPIAdapter google = UniversalLLMAPIAdapter( organization="google", model="gemini-2.5-pro", api_key=google_api_key ) response = google.chat(**chat_params) print(response.usage.input_tokens, "tokens", f"({response.cost_input} {response.currency})") print(response.usage.output_tokens, "tokens", f"({response.cost_output} {response.currency})") print(response.usage.total_tokens, "tokens", f"({response.cost_total} {response.currency})") 
Enter fullscreen mode Exit fullscreen mode

Output:

512 tokens (0.00025 USD) 137 tokens (0.00010 USD) 649 tokens (0.00035 USD) 
Enter fullscreen mode Exit fullscreen mode

Why I built this

Working with multiple LLMs used to mean rewriting the same code — again and again.

Each SDK had its own method names, parameter names, and error classes.

So I built a unified interface that abstracts those details.

One adapter — one consistent experience.


Join the project

You can try it now:

pip install llm-api-adapter 
Enter fullscreen mode Exit fullscreen mode

Docs & examples: github.com/Inozem/llm_api_adapter

If you like the idea — ⭐ star it or share feedback in Issues.

Top comments (0)