3e491df445
Phase 0 of the LLM model registry productionization pipeline:
- non-blocking sync-prices:check job wired into pr_checks.yml
- OTEL counter llm_missing_model_enrichment{gen_ai_system, has_provider_cost}
emitted from enrichCreatableEvents when the registry is loaded but a span
can't be priced
Phase 1 schema + registry wiring (additive, no breaking changes):
- New LlmModel columns: resolvedAt, needsReview, releaseDate, deprecationDate,
knowledgeCutoff, supportsStructuredOutput, supportsParallelToolCalls,
supportsStreamingToolCalls
- ModelPricingRegistry.loadFromDatabase filters needsReview=true rows so
auto-priced and freshly-synced rows stay out of the live registry until
admin approval
- New LlmRegistryPubSub service on channel llm-registry:reload so webapp
replicas pick up DB changes within seconds (5-min periodic reload kept as
backstop)
- llmPricingRegistry subscribes on boot; publishLlmRegistryReload() exposed
for admin routes + future cloud-repo trigger.dev tasks
- Admin API (create/update/delete/reload/seed) and admin UI routes now
publish on the channel after mutations and accept the widened source enum
(langfuse, auto, research, provider-api) + the new review/metadata fields
Co-Authored-By: Eric Allam <eallam@icloud.com>