Skip to main content

Drop-in replacement for the OpenAI/Anthropic/Google/DeepSeek SDKs — routes through TOLVYN for cost attribution, budget enforcement, and audit logging.

Project description

tolvyn

Drop-in replacement for openai and anthropic. One line change. Every AI call metered, attributed, and governed.

PyPI version License: MIT

10,000 free requests forever. No credit card.

Install

pip install tolvyn

Python 3.9 or later required.

For Google support:

pip install "tolvyn[google]"

Quick start

# Before
from openai import OpenAI
client = OpenAI()

# After — one line change
from tolvyn import OpenAI
client = OpenAI(
    tolvyn_api_key="tlv_live_...",
    team="backend",
    service="summariser",
)

# Everything else stays the same
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Hello"}],
)

All three providers

from tolvyn import OpenAI, Anthropic, Google

# OpenAI
oai = OpenAI(
    tolvyn_api_key="tlv_live_...",
    openai_api_key="sk-...",            # optional — enables fail-open fallback
)

# Anthropic
anth = Anthropic(
    tolvyn_api_key="tlv_live_...",
    anthropic_api_key="sk-ant-...",     # optional — enables fail-open fallback
)

# Google (requires the [google] extra)
goog = Google(tolvyn_api_key="tlv_live_...")
model = goog.GenerativeModel("gemini-1.5-flash")

Async

AsyncOpenAI and AsyncAnthropic mirror the sync classes:

import asyncio
from tolvyn import AsyncOpenAI, AsyncAnthropic

async def main():
    openai_client = AsyncOpenAI(tolvyn_api_key="tlv_live_...")
    anth_client = AsyncAnthropic(tolvyn_api_key="tlv_live_...")

    openai_resp, anth_resp = await asyncio.gather(
        openai_client.chat.completions.create(
            model="gpt-4o",
            messages=[{"role": "user", "content": "Hello"}],
        ),
        anth_client.messages.create(
            model="claude-haiku-4-5",
            max_tokens=1024,
            messages=[{"role": "user", "content": "Hello"}],
        ),
    )

asyncio.run(main())

There is no AsyncGoogle class — Google's SDK uses process-global configuration, so async calls go through the same Google instance via generate_content_async.

Attribution headers

Set any combination of these on construction; the SDK sends them as X-Tolvyn-* headers automatically:

client = OpenAI(
    tolvyn_api_key="tlv_live_...",
    team="backend",
    service="invoice-summarizer",
    feature="summarize",
    agent="claude-code",
    user="alice@company.com",
    end_customer="acme-corp",
)

The TOLVYN proxy strips all six headers before forwarding the request upstream — they never reach OpenAI/Anthropic/Google.

Fail-open behavior

If TOLVYN's proxy is unreachable, the SDK automatically retries the request directly against the provider (requires openai_api_key / anthropic_api_key to be set). Disable with fail_open=False.

Triggers on: httpx.ConnectError, ConnectTimeout, ReadTimeout, WriteTimeout, RemoteProtocolError, and HTTP 503 from the proxy. Does NOT trigger on: 4xx errors (auth failures, rate limits, bad requests).

Requests that fail open bypass the proxy and are not metered for that call.

Google limitations

The Google class accepts fail_open for API parity but fail-open is not yet supported for Google due to an upstream google-generativeai SDK limitation (no httpx transport hook). The SDK emits a UserWarning when fail_open=True is passed to Google so callers know it won't trigger. Pass fail_open=False to silence.

google-generativeai also uses process-global configuration via genai.configure(). Creating a second Google instance in the same process overwrites the first's config — the SDK emits a UserWarning in that case. Use one Google per process.

Environment variables

Variable Required Description
TOLVYN_API_KEY Yes (unless tolvyn_api_key is passed) Your TOLVYN API key (tlv_live_...)
OPENAI_API_KEY For fail-open Fallback OpenAI key
ANTHROPIC_API_KEY For fail-open Fallback Anthropic key
GOOGLE_API_KEY Reserved Accepted but currently unused (see Google limitations)
TOLVYN_PROXY_URL No Override proxy URL
export TOLVYN_API_KEY="tlv_live_..."
export OPENAI_API_KEY="sk-..."
from tolvyn import OpenAI
client = OpenAI()   # picks up TOLVYN_API_KEY automatically

API keys

  • Production keys start with tlv_live_
  • Test keys start with tlv_test_ (use these in CI / staging)
  • Get your key at app.tolvyn.io → API Keys
  • Provider keys (OpenAI / Anthropic / Google) go in the dashboard under Account → Provider Keys — never in code. They are stored encrypted server-side.

Changelog

github.com/tolvyn/tolvyn-cli/releases

Links

Feedback

founder@tolvyn.io — we read every message.


© 2026 TOLVYN. MIT licensed.

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

tolvyn-0.1.8.tar.gz (13.3 kB view details)

Uploaded Source

Built Distribution

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

tolvyn-0.1.8-py3-none-any.whl (11.4 kB view details)

Uploaded Python 3

File details

Details for the file tolvyn-0.1.8.tar.gz.

File metadata

  • Download URL: tolvyn-0.1.8.tar.gz
  • Upload date:
  • Size: 13.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for tolvyn-0.1.8.tar.gz
Algorithm Hash digest
SHA256 a90a11c3ee70489a81143f65141160e67b27d695d781daae07f7a2044a9e2203
MD5 667ce71c8f229c058d629f4498be5f71
BLAKE2b-256 678d20ea9a2647e6e755103bbc428425d56db1210cbd7700a272e69adc62634f

See more details on using hashes here.

File details

Details for the file tolvyn-0.1.8-py3-none-any.whl.

File metadata

  • Download URL: tolvyn-0.1.8-py3-none-any.whl
  • Upload date:
  • Size: 11.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for tolvyn-0.1.8-py3-none-any.whl
Algorithm Hash digest
SHA256 4ed795bb51cc7df6f1f04d6b327d8d811b6a9d40da56be43a1ece93cc42852c5
MD5 261b07bf4544956f4a0550742af9a1f6
BLAKE2b-256 64cabc55513f67f148da7fb2a9a9f5abc8e5cc2b80e9ddfdb525ee7e393479bf

See more details on using hashes here.

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