{"schemaVersion":1,"id":"https://lucioduran.com/projects/ai-model-routing-policy","url":"https://lucioduran.com/projects/ai-model-routing-policy","title":"AI Model Routing Policy","description":"Routing between FLAN-T5-small and base with development-only fitting, held-out evaluation, measured router cost and injected local outages. Includes its negative result.","language":"en","datePublished":"2026-10-22","dateModified":"2026-10-22","contentFormat":"text/markdown","content":"[Projects](<https://lucioduran.com/projects>) / AI Model Routing Policy\n\n# AI Model Routing Policy\n\nRouting between FLAN-T5-small and base with development-only fitting, held-out evaluation, measured router cost and injected local outages. Includes its negative result.\n\nAuthor: [Lucio Durán](<https://lucioduran.com/>) · Python 3.11.13 · License: [MIT](<https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/LICENSE>)\n\nPage published: 2026-10-22 · Page updated: 2026-10-22\n\n[Repository](<https://github.com/lucioduran/ai-model-routing-policy>) · [Original evidence](<https://raw.githubusercontent.com/lucioduran/ai-model-routing-policy/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/results/eval/report.json>) · [Release v0.1.0](<https://github.com/lucioduran/ai-model-routing-policy/releases/tag/v0.1.0>)\n\n## Problem and relevance to agents\n\nAdding a router does not automatically make inference more efficient than one model. Its overhead, failed attempts and task-level quality losses must be counted.\n\nThe comparison holds tasks fixed and exposes decisions, fallback and unavailable outcomes. It supports deciding whether routing complexity is justified by measured results.\n\n## Architecture\n\n1. **Development-fitted policy.** 16 tasks fit a per-type lookup table using accuracy minus 0.02 times mean inference seconds. Held-out evaluation has 24 tasks; gold labels never reach the router.\n2. **Four strategies.** Compare always-small, always-base, a fixed 120-character selector and the fitted policy. Both revision-pinned models remain resident.\n3. **Fallback and accounting.** Only a typed unavailable error triggers the second adapter. Overhead, failed attempts, tokens, loading, warmup and policy fitting are recorded separately.\n\n- [Design and methodology](<https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/docs/design.md>)\n\n## What this demonstrates\n\n- Policy fitting separated from held-out evaluation with explicit baselines.\n- Routing cost and task-level quality degradation accounting.\n- Controlled fallback, explicit both-unavailable failure and analysis of a negative result.\n\n## Published results\n\n16 development and 24 evaluation tasks across sentiment, extraction, arithmetic and logic. Local FLAN-T5-small and base ran on Intel Xeon W-3223 with two threads.\n\nRequest time includes routing, dispatch, failed attempts and inference. Loading, warmup and fitting are separately reported outside that table. Outages are immediate exceptions injected into owned local adapters.\n\n### Comparison without injected failures\n\n| Strategy | Correct | Total time (s) | Router total (ms) | Generated tokens |\n| --- | --- | --- | --- | --- |\n| Always small | 12/24 | 4.006823 | 0.021426 | 229 |\n| Always base | 12/24 | 8.376350 | 0.020290 | 214 |\n| Length selector | 12/24 | 4.359402 | 0.035640 | 229 |\n| Fitted policy | 12/24 | 4.401570 | 0.044034 | 229 |\n\n### Fallback with fitted policy\n\n| Injected unavailability | Correct | Unavailable | Total time (s) |\n| --- | --- | --- | --- |\n| Small down | 12/24 | 0 | 9.149960 |\n| Base down | 12/24 | 0 | 3.981469 |\n| Both down | 0/24 | 24 | 0.000176 |\n\nAll four strategies reached 12/24. The fitted router was slower than always-small with no quality gain. All failed six extraction and six arithmetic tasks: zero relative degradation can conceal poor absolute quality.\n\nDevelopment inference took 3.600025 s and policy fitting took 0.124500 ms. Full evaluation wall time was 41.797864 s, including setup, four strategies, outage scenarios and evidence recording. [Original evidence](<https://raw.githubusercontent.com/lucioduran/ai-model-routing-policy/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/results/eval/report.json>).\n\n## Reproduce\n\nReplay uses Python 3.11 and the standard library without model downloads. Neural reproduction requires pinned dependencies and public snapshots of both models.\n\nPOSIX commands omit the author-specific coordinator. Run one measurement at a time, keeping development and evaluation in fresh directories connected through --dev.\n\n### Replay saved evidence\n\n```\ngit clone https://github.com/lucioduran/ai-model-routing-policy.git\ncd ai-model-routing-policy\ngit checkout 1e891db0bfc7c6ad77a1baae3b93f5a76a558435\npython -m routing verify --split dev --output results/dev\npython -m routing verify --split eval --dev results/dev --output results/eval\n```\n\n### Repeat the local measurement\n\n```\npython3.11 -m venv .venv\n. .venv/bin/activate\npython -m pip install -r requirements-local.lock\npython -m routing download\nOMP_NUM_THREADS=2 MKL_NUM_THREADS=2 python -m routing run --split dev --output build/dev\nOMP_NUM_THREADS=2 MKL_NUM_THREADS=2 python -m routing run --split eval --dev build/dev --output build/eval\npython -m routing verify --split eval --dev build/dev --output build/eval\n```\n\n## Scope and limitations\n\n- Forty synthetic tasks and one run do not establish production savings. Task families overlap across splits and there was no independent human review.\n- The caller supplies task types; no intent-classification cost is measured. The policy penalizes latency without enforcing a hard quality guarantee.\n- Immediate exceptions do not model network failures, timeouts or remote retry costs. Two resident models also do not represent memory-pressure deployments.\n- Paid API cost: USD 0. Measured CPU time is neither energy nor a bill. Request-level timings exclude loading and warmup.\n\n- [AI orchestration and model selection](<https://lucioduran.com/blog/semantic-kernel-langchain-ai-orchestration>)\n\n## Sources and revision\n\nValues on this page come from the linked report. They are not live measurements. The report records the executed revision; the reviewed revision includes the subsequent publication of that report.\n\n- Reviewed revision: [` 1e891db0bfc7c6ad77a1baae3b93f5a76a558435 `](<https://github.com/lucioduran/ai-model-routing-policy/commit/1e891db0bfc7c6ad77a1baae3b93f5a76a558435>)\n- Revision recorded by the experiment: [` ae4081c9097561b40652b5c2f2680cba37660af2 `](<https://github.com/lucioduran/ai-model-routing-policy/commit/ae4081c9097561b40652b5c2f2680cba37660af2>)\n- Report timestamp (UTC): 2026-10-21T23:08:03.603602+00:00\n- Release published: [v0.1.0](<https://github.com/lucioduran/ai-model-routing-policy/releases/tag/v0.1.0>) · 2026-10-21T23:11:21Z\n\n- [README and usage](<https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/README.md>)\n- [Original evidence](<https://raw.githubusercontent.com/lucioduran/ai-model-routing-policy/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/results/eval/report.json>)\n- [Original responses and traces](<https://raw.githubusercontent.com/lucioduran/ai-model-routing-policy/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/results/eval/records.json>)\n- [Development evidence](<https://raw.githubusercontent.com/lucioduran/ai-model-routing-policy/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/results/dev/report.json>)\n- [Fitted policy](<https://raw.githubusercontent.com/lucioduran/ai-model-routing-policy/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/results/dev/policy.json>)\n- [Design and methodology](<https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/docs/design.md>)\n- [Data and provenance](<https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/data/README.md>)\n- [Models, revisions and licenses](<https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/docs/model-notices.md>)\n- [Measured environment dependencies](<https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/requirements-local.lock>)\n- [MIT license](<https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/LICENSE>)","headings":[{"level":1,"text":"AI Model Routing Policy","url":"https://lucioduran.com/projects/ai-model-routing-policy#title"},{"level":2,"text":"Problem and relevance to agents","url":"https://lucioduran.com/projects/ai-model-routing-policy#problem"},{"level":2,"text":"Architecture","url":"https://lucioduran.com/projects/ai-model-routing-policy#architecture"},{"level":2,"text":"What this demonstrates","url":"https://lucioduran.com/projects/ai-model-routing-policy#demonstrates"},{"level":2,"text":"Published results","url":"https://lucioduran.com/projects/ai-model-routing-policy#results"},{"level":3,"text":"Comparison without injected failures","url":"https://lucioduran.com/projects/ai-model-routing-policy#results-routing"},{"level":3,"text":"Fallback with fitted policy","url":"https://lucioduran.com/projects/ai-model-routing-policy#results-outages"},{"level":2,"text":"Reproduce","url":"https://lucioduran.com/projects/ai-model-routing-policy#reproduce"},{"level":3,"text":"Replay saved evidence","url":"https://lucioduran.com/projects/ai-model-routing-policy#reproduce-replay"},{"level":3,"text":"Repeat the local measurement","url":"https://lucioduran.com/projects/ai-model-routing-policy#reproduce-inference"},{"level":2,"text":"Scope and limitations","url":"https://lucioduran.com/projects/ai-model-routing-policy#scope"},{"level":2,"text":"Sources and revision","url":"https://lucioduran.com/projects/ai-model-routing-policy#sources"}],"sections":[{"heading":"AI Model Routing Policy","level":1,"url":"https://lucioduran.com/projects/ai-model-routing-policy","content":"[Projects](<https://lucioduran.com/projects>) / AI Model Routing Policy"},{"heading":"AI Model Routing Policy","level":1,"url":"https://lucioduran.com/projects/ai-model-routing-policy#title","content":"Routing between FLAN-T5-small and base with development-only fitting, held-out evaluation, measured router cost and injected local outages. Includes its negative result.\n\nAuthor: [Lucio Durán](<https://lucioduran.com/>) · Python 3.11.13 · License: [MIT](<https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/LICENSE>)\n\nPage published: 2026-10-22 · Page updated: 2026-10-22\n\n[Repository](<https://github.com/lucioduran/ai-model-routing-policy>) · [Original evidence](<https://raw.githubusercontent.com/lucioduran/ai-model-routing-policy/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/results/eval/report.json>) · [Release v0.1.0](<https://github.com/lucioduran/ai-model-routing-policy/releases/tag/v0.1.0>)"},{"heading":"Problem and relevance to agents","level":2,"url":"https://lucioduran.com/projects/ai-model-routing-policy#problem","content":"Adding a router does not automatically make inference more efficient than one model. Its overhead, failed attempts and task-level quality losses must be counted.\n\nThe comparison holds tasks fixed and exposes decisions, fallback and unavailable outcomes. It supports deciding whether routing complexity is justified by measured results."},{"heading":"Architecture","level":2,"url":"https://lucioduran.com/projects/ai-model-routing-policy#architecture","content":"1. **Development-fitted policy.** 16 tasks fit a per-type lookup table using accuracy minus 0.02 times mean inference seconds. Held-out evaluation has 24 tasks; gold labels never reach the router.\n2. **Four strategies.** Compare always-small, always-base, a fixed 120-character selector and the fitted policy. Both revision-pinned models remain resident.\n3. **Fallback and accounting.** Only a typed unavailable error triggers the second adapter. Overhead, failed attempts, tokens, loading, warmup and policy fitting are recorded separately.\n\n- [Design and methodology](<https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/docs/design.md>)"},{"heading":"What this demonstrates","level":2,"url":"https://lucioduran.com/projects/ai-model-routing-policy#demonstrates","content":"- Policy fitting separated from held-out evaluation with explicit baselines.\n- Routing cost and task-level quality degradation accounting.\n- Controlled fallback, explicit both-unavailable failure and analysis of a negative result."},{"heading":"Published results","level":2,"url":"https://lucioduran.com/projects/ai-model-routing-policy#results","content":"16 development and 24 evaluation tasks across sentiment, extraction, arithmetic and logic. Local FLAN-T5-small and base ran on Intel Xeon W-3223 with two threads.\n\nRequest time includes routing, dispatch, failed attempts and inference. Loading, warmup and fitting are separately reported outside that table. Outages are immediate exceptions injected into owned local adapters."},{"heading":"Comparison without injected failures","level":3,"url":"https://lucioduran.com/projects/ai-model-routing-policy#results-routing","content":"| Strategy | Correct | Total time (s) | Router total (ms) | Generated tokens |\n| --- | --- | --- | --- | --- |\n| Always small | 12/24 | 4.006823 | 0.021426 | 229 |\n| Always base | 12/24 | 8.376350 | 0.020290 | 214 |\n| Length selector | 12/24 | 4.359402 | 0.035640 | 229 |\n| Fitted policy | 12/24 | 4.401570 | 0.044034 | 229 |"},{"heading":"Fallback with fitted policy","level":3,"url":"https://lucioduran.com/projects/ai-model-routing-policy#results-outages","content":"| Injected unavailability | Correct | Unavailable | Total time (s) |\n| --- | --- | --- | --- |\n| Small down | 12/24 | 0 | 9.149960 |\n| Base down | 12/24 | 0 | 3.981469 |\n| Both down | 0/24 | 24 | 0.000176 |\n\nAll four strategies reached 12/24. The fitted router was slower than always-small with no quality gain. All failed six extraction and six arithmetic tasks: zero relative degradation can conceal poor absolute quality.\n\nDevelopment inference took 3.600025 s and policy fitting took 0.124500 ms. Full evaluation wall time was 41.797864 s, including setup, four strategies, outage scenarios and evidence recording. [Original evidence](<https://raw.githubusercontent.com/lucioduran/ai-model-routing-policy/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/results/eval/report.json>)."},{"heading":"Reproduce","level":2,"url":"https://lucioduran.com/projects/ai-model-routing-policy#reproduce","content":"Replay uses Python 3.11 and the standard library without model downloads. Neural reproduction requires pinned dependencies and public snapshots of both models.\n\nPOSIX commands omit the author-specific coordinator. Run one measurement at a time, keeping development and evaluation in fresh directories connected through --dev."},{"heading":"Replay saved evidence","level":3,"url":"https://lucioduran.com/projects/ai-model-routing-policy#reproduce-replay","content":"```\ngit clone https://github.com/lucioduran/ai-model-routing-policy.git\ncd ai-model-routing-policy\ngit checkout 1e891db0bfc7c6ad77a1baae3b93f5a76a558435\npython -m routing verify --split dev --output results/dev\npython -m routing verify --split eval --dev results/dev --output results/eval\n```"},{"heading":"Repeat the local measurement","level":3,"url":"https://lucioduran.com/projects/ai-model-routing-policy#reproduce-inference","content":"```\npython3.11 -m venv .venv\n. .venv/bin/activate\npython -m pip install -r requirements-local.lock\npython -m routing download\nOMP_NUM_THREADS=2 MKL_NUM_THREADS=2 python -m routing run --split dev --output build/dev\nOMP_NUM_THREADS=2 MKL_NUM_THREADS=2 python -m routing run --split eval --dev build/dev --output build/eval\npython -m routing verify --split eval --dev build/dev --output build/eval\n```"},{"heading":"Scope and limitations","level":2,"url":"https://lucioduran.com/projects/ai-model-routing-policy#scope","content":"- Forty synthetic tasks and one run do not establish production savings. Task families overlap across splits and there was no independent human review.\n- The caller supplies task types; no intent-classification cost is measured. The policy penalizes latency without enforcing a hard quality guarantee.\n- Immediate exceptions do not model network failures, timeouts or remote retry costs. Two resident models also do not represent memory-pressure deployments.\n- Paid API cost: USD 0. Measured CPU time is neither energy nor a bill. Request-level timings exclude loading and warmup.\n\n- [AI orchestration and model selection](<https://lucioduran.com/blog/semantic-kernel-langchain-ai-orchestration>)"},{"heading":"Sources and revision","level":2,"url":"https://lucioduran.com/projects/ai-model-routing-policy#sources","content":"Values on this page come from the linked report. They are not live measurements. The report records the executed revision; the reviewed revision includes the subsequent publication of that report.\n\n- Reviewed revision: [` 1e891db0bfc7c6ad77a1baae3b93f5a76a558435 `](<https://github.com/lucioduran/ai-model-routing-policy/commit/1e891db0bfc7c6ad77a1baae3b93f5a76a558435>)\n- Revision recorded by the experiment: [` ae4081c9097561b40652b5c2f2680cba37660af2 `](<https://github.com/lucioduran/ai-model-routing-policy/commit/ae4081c9097561b40652b5c2f2680cba37660af2>)\n- Report timestamp (UTC): 2026-10-21T23:08:03.603602+00:00\n- Release published: [v0.1.0](<https://github.com/lucioduran/ai-model-routing-policy/releases/tag/v0.1.0>) · 2026-10-21T23:11:21Z\n\n- [README and usage](<https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/README.md>)\n- [Original evidence](<https://raw.githubusercontent.com/lucioduran/ai-model-routing-policy/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/results/eval/report.json>)\n- [Original responses and traces](<https://raw.githubusercontent.com/lucioduran/ai-model-routing-policy/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/results/eval/records.json>)\n- [Development evidence](<https://raw.githubusercontent.com/lucioduran/ai-model-routing-policy/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/results/dev/report.json>)\n- [Fitted policy](<https://raw.githubusercontent.com/lucioduran/ai-model-routing-policy/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/results/dev/policy.json>)\n- [Design and methodology](<https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/docs/design.md>)\n- [Data and provenance](<https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/data/README.md>)\n- [Models, revisions and licenses](<https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/docs/model-notices.md>)\n- [Measured environment dependencies](<https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/requirements-local.lock>)\n- [MIT license](<https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/LICENSE>)"}],"links":[{"text":"Projects","url":"https://lucioduran.com/projects"},{"text":"Lucio Durán","url":"https://lucioduran.com/"},{"text":"MIT","url":"https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/LICENSE"},{"text":"Repository","url":"https://github.com/lucioduran/ai-model-routing-policy"},{"text":"Original evidence","url":"https://raw.githubusercontent.com/lucioduran/ai-model-routing-policy/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/results/eval/report.json"},{"text":"Release v0.1.0","url":"https://github.com/lucioduran/ai-model-routing-policy/releases/tag/v0.1.0"},{"text":"Design and methodology","url":"https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/docs/design.md"},{"text":"AI orchestration and model selection","url":"https://lucioduran.com/blog/semantic-kernel-langchain-ai-orchestration"},{"text":"1e891db0bfc7c6ad77a1baae3b93f5a76a558435","url":"https://github.com/lucioduran/ai-model-routing-policy/commit/1e891db0bfc7c6ad77a1baae3b93f5a76a558435"},{"text":"ae4081c9097561b40652b5c2f2680cba37660af2","url":"https://github.com/lucioduran/ai-model-routing-policy/commit/ae4081c9097561b40652b5c2f2680cba37660af2"},{"text":"v0.1.0","url":"https://github.com/lucioduran/ai-model-routing-policy/releases/tag/v0.1.0"},{"text":"README and usage","url":"https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/README.md"},{"text":"Original responses and traces","url":"https://raw.githubusercontent.com/lucioduran/ai-model-routing-policy/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/results/eval/records.json"},{"text":"Development evidence","url":"https://raw.githubusercontent.com/lucioduran/ai-model-routing-policy/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/results/dev/report.json"},{"text":"Fitted policy","url":"https://raw.githubusercontent.com/lucioduran/ai-model-routing-policy/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/results/dev/policy.json"},{"text":"Data and provenance","url":"https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/data/README.md"},{"text":"Models, revisions and licenses","url":"https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/docs/model-notices.md"},{"text":"Measured environment dependencies","url":"https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/requirements-local.lock"},{"text":"MIT license","url":"https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/LICENSE"}],"structuredData":[{"@context":"https://schema.org","@graph":[{"@type":"Person","@id":"https://lucioduran.com/#person","name":"Lucio Durán","url":"https://lucioduran.com/"},{"@type":"WebSite","@id":"https://lucioduran.com/#website","url":"https://lucioduran.com/","name":"Lucio Durán","inLanguage":["en","es"],"publisher":{"@id":"https://lucioduran.com/#person"}},{"@type":"WebPage","@id":"https://lucioduran.com/projects/ai-model-routing-policy#page","url":"https://lucioduran.com/projects/ai-model-routing-policy","name":"AI Model Routing Policy","description":"Routing between FLAN-T5-small and base with development-only fitting, held-out evaluation, measured router cost and injected local outages. Includes its negative result.","inLanguage":"en","author":{"@id":"https://lucioduran.com/#person"},"publisher":{"@id":"https://lucioduran.com/#person"},"isPartOf":{"@id":"https://lucioduran.com/#website"},"isAccessibleForFree":true,"mainEntity":{"@id":"https://lucioduran.com/projects/ai-model-routing-policy#software"},"datePublished":"2026-10-22","dateModified":"2026-10-22","breadcrumb":{"@id":"https://lucioduran.com/projects/ai-model-routing-policy#breadcrumb"}},{"@type":"SoftwareSourceCode","@id":"https://lucioduran.com/projects/ai-model-routing-policy#software","name":"AI Model Routing Policy","description":"Routing between FLAN-T5-small and base with development-only fitting, held-out evaluation, measured router cost and injected local outages. Includes its negative result.","url":"https://lucioduran.com/projects/ai-model-routing-policy","codeRepository":"https://github.com/lucioduran/ai-model-routing-policy","programmingLanguage":"Python","runtimePlatform":"Python 3.11.13","license":"https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/LICENSE","version":"v0.1.0","identifier":{"@type":"PropertyValue","propertyID":"git-commit","value":"1e891db0bfc7c6ad77a1baae3b93f5a76a558435"},"author":{"@type":"Person","@id":"https://lucioduran.com/#person","name":"Lucio Durán","url":"https://lucioduran.com"},"isAccessibleForFree":true,"citation":["https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/README.md","https://raw.githubusercontent.com/lucioduran/ai-model-routing-policy/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/results/eval/report.json","https://raw.githubusercontent.com/lucioduran/ai-model-routing-policy/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/results/eval/records.json","https://raw.githubusercontent.com/lucioduran/ai-model-routing-policy/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/results/dev/report.json","https://raw.githubusercontent.com/lucioduran/ai-model-routing-policy/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/results/dev/policy.json","https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/docs/design.md","https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/data/README.md","https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/docs/model-notices.md","https://github.com/lucioduran/ai-model-routing-policy/blob/1e891db0bfc7c6ad77a1baae3b93f5a76a558435/requirements-local.lock","https://github.com/lucioduran/ai-model-routing-policy/releases/tag/v0.1.0"],"publisher":{"@id":"https://lucioduran.com/#person"},"mainEntityOfPage":{"@id":"https://lucioduran.com/projects/ai-model-routing-policy#page"}},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Projects","item":"https://lucioduran.com/projects"},{"@type":"ListItem","position":2,"name":"AI Model Routing Policy","item":"https://lucioduran.com/projects/ai-model-routing-policy"}],"@id":"https://lucioduran.com/projects/ai-model-routing-policy#breadcrumb"}]}],"contentHash":"b9dd537283b6df011b9cb03754ce0560a165ceb89cb7c1405f21e19102cb5a17","provenance":{"method":"Deterministic serialization of the server-rendered main element","source":"https://lucioduran.com/projects/ai-model-routing-policy","hashAlgorithm":"sha256","hashScope":"JSON document fields before contentHash and provenance","sourceHTMLBytes":47231,"contentBytes":7894}}
