llm11

Migrating an existing app

Your request format does not change. This page is about everything around that, which is the part that actually takes an afternoon.

Step 1

Change the base URL behind a flag

Put the swap behind whatever flag mechanism you already have, so rolling back is a config change rather than a deploy. The rest of the client stays as it is.

python

from openai import OpenAI

client = OpenAI(
    base_url=(
        "https://llm11.com/v1" if settings.USE_LLM11 else "https://api.openai.com/v1"
    ),
    api_key=settings.LLM11_KEY if settings.USE_LLM11 else settings.OPENAI_KEY,
)

# Unchanged from here down.
res = client.chat.completions.create(model="auto", messages=messages)
answer = res.choices[0].message.content

modelis accepted and recorded, but triage chooses which model actually answers. If you need a specific model on a specific path, set that path’s project baseline instead of hard-coding it at the call site.

Step 2

Set the baseline to what you run today

The baseline is the denominator in every savings figure the product shows you. Set it to the model your application is on right now, before the migration, or the numbers will compare against something you were never paying for.

Step 3

Dual-run on a slice of traffic first

Send somewhere between one and ten per cent through and leave it for a few days. What you are looking for is not the savings number, it is the escalation rate: that is the signal telling you whether the cheaper model is actually coping with your workload.

python

use_llm11 = hash(request_id) % 100 < settings.LLM11_PERCENT

# Log the receipt alongside your own outcome signal so the two
# can be joined later. The request id is the join key.
if use_llm11:
    log.info(
        "llm_call",
        llm11_request_id=res.id,
        verdict=res.model_extra["_llm11"]["verdict"],
        escalated=res.model_extra["_llm11"]["escalated"],
    )

Step 4

Read the first week honestly

Three numbers matter, and only one of them is the one on the marketing page.

  • Escalation rate.High means triage is routing too cheap for your traffic. Raise the project’s criticality floor and it will start reaching for a better model sooner.
  • Added latency. Triage is fast. Groundedness adds a scoring call. Cross-model adds a whole completion. If your p95 moves more than you can live with, the criticality floor is the dial.
  • Your own quality signal. Whatever you already track, ticket reopens, edit rate, thumbs-down. Our verdict is evidence, not proof, and a migration judged only on our own metric is a migration judged by the vendor.

Step 5

Know how to get out

Flip the flag back. There is no data to export before you can leave and no format lock-in to unwind, because your prompts and responses were never stored unless you explicitly turned retention on for a project. Receipts stay available for your plan’s retention window, and the REST API will hand you all of them.

curl

curl "https://llm11.com/api/v1/requests?projectId=$PROJECT_ID" \
  -H "Authorization: Bearer $LLM11_KEY"

What does not carry across

  • Streaming. Not implemented. If your UI streams tokens, keep that path on your current provider until it is.
  • Provider-side prompt caching. Routing away from the model you were caching against loses the cache hit. That cost is real, it is the one that sank at least one well-documented routing project, and we do not yet measure it. Until we do, the receipt reports it as unmeasured instead of quietly leaving it out of the savings figure.
  • Tool and function calling. Passed through, but not yet verified by any rung. The checks run on text answers.

Weighing this against another tool? The comparison pages say where each one is the better answer.