Skip to main content
The ABV Gateway provides an OpenAI-compatible API that routes requests to multiple LLM providers (OpenAI, Anthropic, Google)

Basic Chat Completion

from abvdev import ABV

abv = ABV(api_key="sk-abv-...")

response = abv.gateway.complete_chat(
    provider="openai",
    model="gpt-4o-mini",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "What is machine learning?"}
    ],
    temperature=0.7,
    max_tokens=500
)

print(response.choices[0].message.content)

Switch Providers

Use the same code with different providers by changing provider and model.
# OpenAI
openai_response = abv.gateway.complete_chat(
    provider="openai",
    model="gpt-4o",
    messages=messages
)

# Anthropic
anthropic_response = abv.gateway.complete_chat(
    provider="anthropic",
    model="claude-sonnet-4-20250514",
    messages=messages
)

# Google Gemini
gemini_response = abv.gateway.complete_chat(
    provider="gemini",
    model="gemini-1.5-pro",
    messages=messages
)

Streaming Responses

stream = abv.gateway.complete_chat_stream(
    provider="openai",
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "Write a haiku about coding"}]
)

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

Gateway with Tracing Context

Combine gateway calls with tracing for full observability.
from abvdev import ABV, observe

abv = ABV(api_key="sk-abv-...")

@observe()
def chat_with_user(user_id: str, message: str):
    # Update trace context
    abv.update_current_trace(
        user_id=user_id,
        tags=["chat", "production"]
    )

    # Gateway call is automatically traced as a generation
    response = abv.gateway.complete_chat(
        provider="openai",
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": message}]
    )

    return response.choices[0].message.content

result = chat_with_user("user-123", "Hello!")

Cost Tracking

Gateway calls automatically track token usage and costs. Access via the trace.
from abvdev import ABV, observe

abv = ABV(api_key="sk-abv-...")

@observe(name="cost-tracked-call", as_type="generation")
def generate_with_cost_tracking(prompt: str):
    response = abv.gateway.complete_chat(
        provider="openai",
        model="gpt-4o",
        messages=[{"role": "user", "content": prompt}]
    )

    # Usage is automatically captured in the trace
    # View in ABV UI: token counts, latency, and estimated cost
    return response.choices[0].message.content

# After execution, check the ABV dashboard for:
# - Input/output tokens
# - Model used
# - Estimated cost in USD
# - Time to first token (streaming)
# - Total latency

Model Parameters

Full OpenAI-compatible parameter support.
response = abv.gateway.complete_chat(
    provider="openai",
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "Generate creative options"}],
    temperature=0.9,       # Creativity (0-2)
    max_tokens=1000,       # Response length limit
    top_p=0.95,            # Nucleus sampling
    frequency_penalty=0.5, # Reduce repetition
    presence_penalty=0.5,  # Encourage new topics
    stop=["\n\n"],         # Stop sequences
    n=3,                   # Number of completions
)

for i, choice in enumerate(response.choices):
    print(f"Option {i+1}: {choice.message.content}")

Provider Fallback Pattern

Implement fallback logic when a provider fails.
from abvdev import ABV, observe

abv = ABV(api_key="sk-abv-...")

PROVIDERS = [
    {"provider": "openai", "model": "gpt-4o-mini"},
    {"provider": "anthropic", "model": "claude-sonnet-4-20250514"},
    {"provider": "gemini", "model": "gemini-1.5-flash"},
]

@observe(name="llm-with-fallback")
def generate_with_fallback(messages: list):
    for config in PROVIDERS:
        try:
            response = abv.gateway.complete_chat(
                provider=config["provider"],
                model=config["model"],
                messages=messages
            )
            return response.choices[0].message.content
        except Exception as e:
            abv.update_current_span(
                level="WARNING",
                status_message=f"{config['provider']} failed: {e}"
            )
            continue

    raise Exception("All providers failed")

result = generate_with_fallback([{"role": "user", "content": "Hello"}])

Using Managed Prompts with Gateway

Fetch prompts from ABV and use them with the gateway.
from abvdev import ABV

abv = ABV(api_key="sk-abv-...")

# Fetch managed prompt
prompt = abv.get_prompt("customer-support-v2")

# Compile with variables
messages = prompt.compile(
    customer_name="Alice",
    issue="billing question"
)

# Use with gateway
response = abv.gateway.complete_chat(
    provider="openai",
    model=prompt.config.get("model", "gpt-4o-mini"),
    messages=messages,
    temperature=prompt.config.get("temperature", 0.7)
)