Route on constraints, then price

Build a deterministic routing decision that rejects incompatible deployments before optimizing cost.

What you will build

A router that separates hard constraints from preferences. Hard constraints decide eligibility; price and preferred providers only rank the eligible set.

1. Express the routing policy

TypeScript
type RoutingPolicy = {
  model: string;
  regions: string[];
  minimumContextTokens: number;
  requirePricing: boolean;
  capabilities: Record<string, "supported" | "conditional">;
  preferredProviders: string[];
};

const policy: RoutingPolicy = {
  model: "anthropic/claude-haiku-4.5",
  regions: ["eu", "global"],
  minimumContextTokens: 200_000,
  requirePricing: true,
  capabilities: {
    tool_calling: "supported",
    structured_output: "conditional",
  },
  preferredProviders: ["anthropic", "aws-bedrock"],
};

2. Filter hard constraints

TypeScript
const deployments = await allm.deployments.list({
  model: policy.model,
  lifecycle_status: "available",
  has_pricing: policy.requirePricing,
});

const eligible = deployments.data.filter((candidate) => {
  if (!policy.regions.includes(candidate.region)) return false;
  if (candidate.context_tokens === null) return false;
  if (candidate.context_tokens < policy.minimumContextTokens) return false;

  return Object.entries(policy.capabilities).every(([name, required]) => {
    const actual = candidate.capabilities[name]?.status;
    return required === "supported"
      ? actual === "supported"
      : actual === "supported" || actual === "conditional";
  });
});

3. Rank only eligible deployments

TypeScript
const ranked = await allm.deployments.compare({
  deploymentIds: eligible.map(({ id }) => id),
  inputTokens: 120_000,
  outputTokens: 12_000,
  cachedInputTokens: 80_000,
  requires: policy.capabilities,
});

const preferenceRank = new Map(
  policy.preferredProviders.map((provider, index) => [provider, index])
);

const selected = ranked.data.toSorted((left, right) => {
  const leftPreference = preferenceRank.get(left.deployment.provider_id) ?? 999;
  const rightPreference = preferenceRank.get(right.deployment.provider_id) ?? 999;
  return leftPreference - rightPreference ||
    Number(left.pricing.total_usd) - Number(right.pricing.total_usd);
})[0];

Preference ordering is a product choice

The API comparison is sorted by quote price. If provider preference, latency, data residency, or quality matters more, apply that ordering explicitly after compatibility filtering.

4. Persist an auditable decision

JSON
{
  "policy": "support-agent-eu-v3",
  "selected_deployment": "dep_anthropic_claude_haiku_4_5_messages_global",
  "eligible_count": 3,
  "representative_usage": {
    "input_tokens": 120000,
    "cached_input_tokens": 80000,
    "output_tokens": 12000
  },
  "quoted_total_usd": "0.112000",
  "decided_at": "2026-07-17T08:15:00Z"
}

No-match behavior

An empty set is a normal policy result, not an API outage. Choose an explicit product behavior: block the workflow, request human approval, relax one named constraint, or use a separately reviewed emergency policy. Never silently drop a capability requirement.