Providers

AgentKavach supports OpenAI, Anthropic, Google, and Mistral out of the box. The same guard.create() method works across all providers.

OpenAI #

Standard Call

python
from agentkavach import AgentKavach, Budget

guard = AgentKavach(
    provider="openai",
    api_key="cg_...",
    llm_key="sk-...",
    budget=Budget.daily(50),
)

response = guard.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Hello!"}],
)

Native Namespace

If you prefer the OpenAI-native calling convention, AgentKavach exposes it directly:

python
response = guard.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Hello!"}],
)

Streaming

python
stream = guard.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Write a poem"}],
    stream=True,
)

for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="")

Supported Models

gpt-4o, gpt-4o-mini, gpt-4-turbo, gpt-4, gpt-3.5-turbo, o1, o1-mini, o3-mini, o3, o4-mini, gpt-4.1, gpt-4.1-mini, gpt-4.1-nano, gpt-4.5-preview, codex-mini

ℹ️ Local token counting

Token counting is local via tiktoken (~0.1ms). No API call required.

Anthropic #

Standard Call

python
from agentkavach import AgentKavach, Budget

guard = AgentKavach(
    provider="anthropic",
    api_key="cg_...",
    llm_key="sk-ant-...",
    budget=Budget.daily(50),
)

response = guard.create(
    model="claude-sonnet-4-20250514",
    messages=[{"role": "user", "content": "Summarize this report"}],
    max_tokens=1024,
)

Native Namespace

python
response = guard.messages.create(
    model="claude-sonnet-4-20250514",
    messages=[{"role": "user", "content": "Summarize this report"}],
    max_tokens=1024,
)

⚠️ max_tokens required

Anthropic requires the max_tokens parameter on every call. Omitting it will raise an error.

Supported Models

claude-opus-4-0, claude-opus-4-6, claude-sonnet-4-0, claude-sonnet-4-6, claude-3-5-sonnet-20241022, claude-3-5-haiku-20241022, claude-3-opus-20240229, claude-3-haiku-20240307, claude-haiku-4-5

Model Aliases

AliasResolves To
claude-opusclaude-opus-4-6
claude-sonnetclaude-sonnet-4-6
claude-haikuclaude-haiku-4-5

ℹ️ Token counting

Anthropic token counting uses an API call (~100-200ms).

Google #

Standard Call

python
from agentkavach import AgentKavach, Budget

guard = AgentKavach(
    provider="google",
    api_key="cg_...",
    llm_key="AIza...",
    budget=Budget.monthly(300),
)

response = guard.create(
    model="gemini-2.0-flash",
    contents="Generate a project outline",
)

Native Namespace

python
response = guard.generate_content(
    model="gemini-2.0-flash",
    contents="Generate a project outline",
)

⚠️ contents, not messages

Google uses contents instead of messages. Using the wrong parameter name will raise an error.

Supported Models

gemini-2.0-flash, gemini-1.5-pro, gemini-1.5-flash, gemini-2.5-pro, gemini-2.5-flash

Model Aliases

AliasResolves To
gemini-progemini-2.5-pro
gemini-flashgemini-2.5-flash

ℹ️ Token counting

Google token counting uses an API call (~100-200ms).

Mistral #

Standard Call

python
from agentkavach import AgentKavach, Budget

guard = AgentKavach(
    provider="mistral",
    api_key="cg_...",
    llm_key="your-mistral-api-key",
    budget=Budget.daily(50),
)

response = guard.create(
    model="mistral-large-latest",
    messages=[{"role": "user", "content": "Hello!"}],
)

Native Namespace

Mistral uses an OpenAI-compatible format. The native namespace maps to client.chat.complete():

python
response = guard.chat.complete(
    model="mistral-large-latest",
    messages=[{"role": "user", "content": "Hello!"}],
)

Streaming

python
stream = guard.create(
    model="mistral-large-latest",
    messages=[{"role": "user", "content": "Write a poem"}],
    stream=True,
)

for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="")

Supported Models

mistral-large-latest, mistral-large-2411, mistral-small-latest, mistral-small-2503, codestral-latest, pixtral-large-latest, ministral-8b-latest, mistral-embed

Model Aliases

AliasResolves To
mistral-largemistral-large-2411
mistral-smallmistral-small-2503
codestralcodestral-latest
pixtral-largepixtral-large-latest
ministral-8bministral-8b-latest

ℹ️ Token counting

Mistral token counting is local via tiktoken (~0.1ms). No API call required.

Cross-Provider Comparison #

FeatureOpenAIAnthropicGoogleMistral
Parameter namemessagesmessagescontentsmessages
Namespaceguard.chat.completions.create()guard.messages.create()guard.generate_content()guard.chat.complete()
Unified APIguard.create()guard.create()guard.create()guard.create()
Token countingLocal (~0.1ms)API call (~150ms)API call (~150ms)Local (~0.1ms)
Streamingstream=Truestream=Truestream=Truestream=True
LLM key env varOPENAI_API_KEYANTHROPIC_API_KEYGOOGLE_API_KEYMISTRAL_API_KEY