Skip to main content
Change the base URL. Add the X-Majordomo-Key header. Nothing else.

OpenAI SDK

from openai import OpenAI

client = OpenAI(
    base_url="https://gateway.gomajordomo.com/v1",
    api_key="your-openai-api-key",
    default_headers={"X-Majordomo-Key": "mdm_sk_your_key_here"},
)

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Hello!"}],
)
Streaming works unchanged — the gateway proxies the SSE stream transparently.

Anthropic SDK

import anthropic

client = anthropic.Anthropic(
    base_url="https://gateway.gomajordomo.com",
    api_key="your-anthropic-api-key",
)

response = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello!"}],
    extra_headers={"X-Majordomo-Key": "mdm_sk_your_key_here"},
)
Prompt caching tokens (cache_read_input_tokens, cache_creation_input_tokens) are tracked and priced separately.

Pydantic AI

majordomo-frameworks provides adapters for routing Pydantic AI agents through the gateway.
pip install majordomo-frameworks[pydantic-ai]
Set environment variables:
MAJORDOMO_GATEWAY_URL=https://gateway.gomajordomo.com
MAJORDOMO_API_KEY=mdm_sk_your_key_here
ANTHROPIC_API_KEY=your-anthropic-api-key
from pydantic_ai import Agent
from pydantic_ai.settings import AnthropicModelSettings
from majordomo_frameworks.pydantic_ai import create_model, build_extra_headers

model = create_model("anthropic")
headers = build_extra_headers(feature="document-summarizer", user_id="user_123")
settings = AnthropicModelSettings(extra_headers=headers)

agent = Agent(
    model=model,
    system_prompt="You are a helpful assistant.",
)

result = await agent.run("Summarize this document: ...", model_settings=settings)
GitHub →

majordomo-llm

A unified async Python client for OpenAI, Anthropic, Gemini, and more — with built-in cost tracking, structured output, and multi-provider cascade. Route it through the gateway by passing base_url and default_headers to get_llm_instance.
pip install majordomo-llm
from majordomo_llm import get_llm_instance, LLMCascade

GATEWAY = "https://gateway.gomajordomo.com"
HEADERS = {"X-Majordomo-Key": "mdm_sk_your_key_here"}

# Basic completion
llm = get_llm_instance(
    "anthropic",
    "claude-sonnet-4-20250514",
    base_url=GATEWAY,
    default_headers=HEADERS,
)
response = await llm.get_response("Summarize this document: ...")
print(response.content)
print(f"Cost: ${response.total_cost:.6f}")

# Structured output
from pydantic import BaseModel

class Sentiment(BaseModel):
    label: str
    score: float

result = await llm.get_structured_json_response(
    response_model=Sentiment,
    user_prompt="Analyze: 'This product is excellent'",
)
print(result.content.label)   # "positive"
print(result.content.score)   # 0.95

# Multi-provider cascade — falls back on failure
cascade = LLMCascade(
    [("anthropic", "claude-sonnet-4-20250514"), ("openai", "gpt-4o")],
    base_url=GATEWAY,
    default_headers=HEADERS,
)
response = await cascade.get_response("Hello!")
GitHub →

Metadata tagging

Add any X-Majordomo-* header to tag requests for cost attribution. Works with all SDKs above.
# OpenAI
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[...],
    extra_headers={
        "X-Majordomo-Feature": "document-review",
        "X-Majordomo-Team": "legal",
        "X-Majordomo-User-Id": "user_123",
    },
)

# Anthropic — same pattern, add to extra_headers
response = client.messages.create(
    ...,
    extra_headers={
        "X-Majordomo-Key": "mdm_sk_your_key_here",
        "X-Majordomo-Feature": "contract-analysis",
        "X-Majordomo-Team": "legal",
    },
)
See Cost Attribution for how to query this data.