{"repo": "avant-dev-hq/ai-kernel-protocol", "files": {"spec/provider.md": {"01673a4c0820c1af402f310eb08d30b922a4dda9": {"t": 1785674071.2896528, "n": 1688, "h": "5073e029bcbbcc35", "c": "# AKP Provider Abstraction Specification\n**Version:** 0.1.0 · **Section:** 3 of SPEC.md\n\n## Model Tier Resolution\n\n| `AI_PROVIDER` | `fast` | `standard` | `advanced` |\n|---|---|---|---|\n| `anthropic` | `ANTHROPIC_MODEL_FAST` (claude-haiku-4-5) | `ANTHROPIC_MODEL_STANDARD` (claude-sonnet-4-5) | `ANTHROPIC_MODEL_ADVANCED` (claude-opus-4-5) |\n| `mistral` | `MISTRAL_MODEL_FAST` (mistral-small-latest) | `MISTRAL_MODEL_STANDARD` (mistral-large-latest) | `MISTRAL_MODEL_ADVANCED` (mistral-large-latest) |\n| `deepseek` | `DEEPSEEK_MODEL_FAST` (deepseek-chat) | `DEEPSEEK_MODEL_STANDARD` (deepseek-chat) | `DEEPSEEK_MODEL_ADVANCED` (deepseek-reasoner) |\n| `openai` | `OPENAI_MODEL_FAST` (gpt-4o-mini) | `OPENAI_MODEL_STANDARD` (gpt-4o) | `OPENAI_MODEL_ADVANCED` (gpt-4o) |\n\n## Embedding Independence\n\n| `AI_EMBEDDING_PROVIDER` | Default Model | Dimensions |\n|---|---|---|\n| `openai` (default) | `text-embedding-3-small` | 1536 |\n| `mistral` | `mistral-embed` | 1024 |\n\nWhen switching embedding providers, use separate storage tables per dimension.\n\n## Environment Variables\n\n```bash\nAI_PROVIDER=anthropic\nANTHROPIC_API_KEY=sk-ant-...\nANTHROPIC_MODEL_FAST=claude-haiku-4-5\nANTHROPIC_MODEL_STANDARD=claude-sonnet-4-5\nANTHROPIC_MODEL_ADVANCED=claude-opus-4-5\n\nMISTRAL_API_KEY=...\nMISTRAL_MODEL_FAST=mistral-small-latest\nMISTRAL_MODEL_STANDARD=mistral-large-latest\n\nDEEPSEEK_API_KEY=...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL_FAST=deepseek-chat\nDEEPSEEK_MODEL_ADVANCED=deepseek-reasoner\n\nOPENAI_API_KEY=sk-...\nOPENAI_MODEL_FAST=gpt-4o-mini\nOPENAI_MODEL_STANDARD=gpt-4o\n\nAI_EMBEDDING_PROVIDER=openai\nOPENAI_EMBEDDING_MODEL=text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n```\n"}, "e968d29f296ce6d13c0754d180855d3176238e01": {"t": 1785754624.189463, "n": 1688, "h": "5073e029bcbbcc35", "c": "# AKP Provider Abstraction Specification\n**Version:** 0.1.0 · **Section:** 3 of SPEC.md\n\n## Model Tier Resolution\n\n| `AI_PROVIDER` | `fast` | `standard` | `advanced` |\n|---|---|---|---|\n| `anthropic` | `ANTHROPIC_MODEL_FAST` (claude-haiku-4-5) | `ANTHROPIC_MODEL_STANDARD` (claude-sonnet-4-5) | `ANTHROPIC_MODEL_ADVANCED` (claude-opus-4-5) |\n| `mistral` | `MISTRAL_MODEL_FAST` (mistral-small-latest) | `MISTRAL_MODEL_STANDARD` (mistral-large-latest) | `MISTRAL_MODEL_ADVANCED` (mistral-large-latest) |\n| `deepseek` | `DEEPSEEK_MODEL_FAST` (deepseek-chat) | `DEEPSEEK_MODEL_STANDARD` (deepseek-chat) | `DEEPSEEK_MODEL_ADVANCED` (deepseek-reasoner) |\n| `openai` | `OPENAI_MODEL_FAST` (gpt-4o-mini) | `OPENAI_MODEL_STANDARD` (gpt-4o) | `OPENAI_MODEL_ADVANCED` (gpt-4o) |\n\n## Embedding Independence\n\n| `AI_EMBEDDING_PROVIDER` | Default Model | Dimensions |\n|---|---|---|\n| `openai` (default) | `text-embedding-3-small` | 1536 |\n| `mistral` | `mistral-embed` | 1024 |\n\nWhen switching embedding providers, use separate storage tables per dimension.\n\n## Environment Variables\n\n```bash\nAI_PROVIDER=anthropic\nANTHROPIC_API_KEY=sk-ant-...\nANTHROPIC_MODEL_FAST=claude-haiku-4-5\nANTHROPIC_MODEL_STANDARD=claude-sonnet-4-5\nANTHROPIC_MODEL_ADVANCED=claude-opus-4-5\n\nMISTRAL_API_KEY=...\nMISTRAL_MODEL_FAST=mistral-small-latest\nMISTRAL_MODEL_STANDARD=mistral-large-latest\n\nDEEPSEEK_API_KEY=...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL_FAST=deepseek-chat\nDEEPSEEK_MODEL_ADVANCED=deepseek-reasoner\n\nOPENAI_API_KEY=sk-...\nOPENAI_MODEL_FAST=gpt-4o-mini\nOPENAI_MODEL_STANDARD=gpt-4o\n\nAI_EMBEDDING_PROVIDER=openai\nOPENAI_EMBEDDING_MODEL=text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n```\n"}, "44b0e09b3e8328d8604afec7c0881edcfe702935": {"t": 1785754625.613874, "n": 2409, "h": "61681675b7cecb0c", "c": "# AKP Provider Abstraction Specification\n\n**Version:** 0.1.0 · **Section:** 3 of SPEC.md\n\n## Overview\n\nThe Provider Abstraction primitive enables AKP implementations to serve any LLM provider through a single interface. The active provider is determined at runtime via `AI_PROVIDER`.\n\n## Model Tier Resolution\n\n| `AI_PROVIDER` | `fast` | `standard` | `advanced` |\n|---|---|---|---|\n| `anthropic` | `ANTHROPIC_MODEL_FAST` (claude-haiku-4-5) | `ANTHROPIC_MODEL_STANDARD` (claude-sonnet-4-5) | `ANTHROPIC_MODEL_ADVANCED` (claude-opus-4-5) |\n| `mistral` | `MISTRAL_MODEL_FAST` (mistral-small-latest) | `MISTRAL_MODEL_STANDARD` (mistral-large-latest) | `MISTRAL_MODEL_ADVANCED` (mistral-large-latest) |\n| `deepseek` | `DEEPSEEK_MODEL_FAST` (deepseek-chat) | `DEEPSEEK_MODEL_STANDARD` (deepseek-chat) | `DEEPSEEK_MODEL_ADVANCED` (deepseek-reasoner) |\n| `openai` | `OPENAI_MODEL_FAST` (gpt-4o-mini) | `OPENAI_MODEL_STANDARD` (gpt-4o) | `OPENAI_MODEL_ADVANCED` (gpt-4o) |\n\n## Embedding Independence\n\n`AI_EMBEDDING_PROVIDER` configures embeddings separately from inference.\n\n| `AI_EMBEDDING_PROVIDER` | Default Model | Dimensions |\n|---|---|---|\n| `openai` (default) | `text-embedding-3-small` | 1536 |\n| `mistral` | `mistral-embed` | 1024 |\n\nWhen switching embedding providers, the vector dimension changes. Implementations MUST use separate storage tables per dimension to prevent type errors.\n\n## Full Environment Variable Reference\n\n```bash\n# Core\nAI_PROVIDER=anthropic # anthropic|mistral|deepseek|openai\n\n# Anthropic\nANTHROPIC_API_KEY=sk-ant-...\nANTHROPIC_MODEL_FAST=claude-haiku-4-5\nANTHROPIC_MODEL_STANDARD=claude-sonnet-4-5\nANTHROPIC_MODEL_ADVANCED=claude-opus-4-5\n\n# Mistral\nMISTRAL_API_KEY=...\nMISTRAL_MODEL_FAST=mistral-small-latest\nMISTRAL_MODEL_STANDARD=mistral-large-latest\nMISTRAL_MODEL_ADVANCED=mistral-large-latest\n\n# Deepseek (OpenAI-compatible)\nDEEPSEEK_API_KEY=...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL_FAST=deepseek-chat\nDEEPSEEK_MODEL_STANDARD=deepseek-chat\nDEEPSEEK_MODEL_ADVANCED=deepseek-reasoner\n\n# OpenAI\nOPENAI_API_KEY=sk-...\nOPENAI_MODEL_FAST=gpt-4o-mini\nOPENAI_MODEL_STANDARD=gpt-4o\nOPENAI_MODEL_ADVANCED=gpt-4o\n\n# Embeddings\nAI_EMBEDDING_PROVIDER=openai # openai|mistral\nOPENAI_EMBEDDING_MODEL=text-embedding-3-small\nMISTRAL_EMBEDDING_MODEL=mistral-embed\nEMBEDDING_DIMENSIONS=1536 # 1536 (OpenAI) | 1024 (Mistral)\n```\n"}}, "src/lib/provider.ts": {"01673a4c0820c1af402f310eb08d30b922a4dda9": {"t": 1785745596.7200654, "n": 2384, "h": "98fa7a25e9966a64", "c": "import { anthropic } from '@ai-sdk/anthropic';\nimport { mistral } from '@ai-sdk/mistral';\nimport { createOpenAI } from '@ai-sdk/openai';\nexport type SupportedProvider = 'anthropic'|'mistral'|'deepseek'|'openai';\nexport interface ModelTier { fast: ReturnType; standard: ReturnType; advanced: ReturnType; }\nexport function getModelTier(override?: string): ModelTier {\n const p = (override ?? process.env.AI_PROVIDER ?? 'anthropic') as SupportedProvider;\n if (p==='anthropic') return { fast:anthropic(process.env.ANTHROPIC_MODEL_FAST??'claude-haiku-4-5'), standard:anthropic(process.env.ANTHROPIC_MODEL_STANDARD??'claude-sonnet-4-5'), advanced:anthropic(process.env.ANTHROPIC_MODEL_ADVANCED??'claude-opus-4-5') } as unknown as ModelTier;\n if (p==='mistral') return { fast:mistral(process.env.MISTRAL_MODEL_FAST??'mistral-small-latest'), standard:mistral(process.env.MISTRAL_MODEL_STANDARD??'mistral-large-latest'), advanced:mistral(process.env.MISTRAL_MODEL_ADVANCED??'mistral-large-latest') } as unknown as ModelTier;\n if (p==='deepseek') { const ds=createOpenAI({baseURL:process.env.DEEPSEEK_BASE_URL??'https://api.deepseek.com/v1',apiKey:process.env.DEEPSEEK_API_KEY??'',name:'deepseek'}); return { fast:ds(process.env.DEEPSEEK_MODEL_FAST??'deepseek-chat'), standard:ds(process.env.DEEPSEEK_MODEL_STANDARD??'deepseek-chat'), advanced:ds(process.env.DEEPSEEK_MODEL_ADVANCED??'deepseek-reasoner') } as unknown as ModelTier; }\n if (p==='openai') { const oai=createOpenAI({apiKey:process.env.OPENAI_API_KEY??''}); return { fast:oai(process.env.OPENAI_MODEL_FAST??'gpt-4o-mini'), standard:oai(process.env.OPENAI_MODEL_STANDARD??'gpt-4o'), advanced:oai(process.env.OPENAI_MODEL_ADVANCED??'gpt-4o') } as unknown as ModelTier; }\n throw new Error(`Unsupported AI_PROVIDER: \"${p}\". Valid: anthropic|mistral|deepseek|openai`);\n}\nexport function getEmbeddingModel() {\n if ((process.env.AI_EMBEDDING_PROVIDER??'openai')==='mistral') return mistral.textEmbeddingModel(process.env.MISTRAL_EMBEDDING_MODEL??'mistral-embed');\n return createOpenAI({apiKey:process.env.OPENAI_API_KEY??''}).embedding(process.env.OPENAI_EMBEDDING_MODEL??'text-embedding-3-small');\n}\nexport const getProviderName = () => process.env.AI_PROVIDER ?? 'anthropic';\nexport const getEmbeddingProviderName = () => process.env.AI_EMBEDDING_PROVIDER ?? 'openai';\n"}, "0d047c3ed7aeb78ed37bd9413682bd4b8f9e278a": {"t": 1785754624.8566878, "n": 2384, "h": "98fa7a25e9966a64", "c": "import { anthropic } from '@ai-sdk/anthropic';\nimport { mistral } from '@ai-sdk/mistral';\nimport { createOpenAI } from '@ai-sdk/openai';\nexport type SupportedProvider = 'anthropic'|'mistral'|'deepseek'|'openai';\nexport interface ModelTier { fast: ReturnType; standard: ReturnType; advanced: ReturnType; }\nexport function getModelTier(override?: string): ModelTier {\n const p = (override ?? process.env.AI_PROVIDER ?? 'anthropic') as SupportedProvider;\n if (p==='anthropic') return { fast:anthropic(process.env.ANTHROPIC_MODEL_FAST??'claude-haiku-4-5'), standard:anthropic(process.env.ANTHROPIC_MODEL_STANDARD??'claude-sonnet-4-5'), advanced:anthropic(process.env.ANTHROPIC_MODEL_ADVANCED??'claude-opus-4-5') } as unknown as ModelTier;\n if (p==='mistral') return { fast:mistral(process.env.MISTRAL_MODEL_FAST??'mistral-small-latest'), standard:mistral(process.env.MISTRAL_MODEL_STANDARD??'mistral-large-latest'), advanced:mistral(process.env.MISTRAL_MODEL_ADVANCED??'mistral-large-latest') } as unknown as ModelTier;\n if (p==='deepseek') { const ds=createOpenAI({baseURL:process.env.DEEPSEEK_BASE_URL??'https://api.deepseek.com/v1',apiKey:process.env.DEEPSEEK_API_KEY??'',name:'deepseek'}); return { fast:ds(process.env.DEEPSEEK_MODEL_FAST??'deepseek-chat'), standard:ds(process.env.DEEPSEEK_MODEL_STANDARD??'deepseek-chat'), advanced:ds(process.env.DEEPSEEK_MODEL_ADVANCED??'deepseek-reasoner') } as unknown as ModelTier; }\n if (p==='openai') { const oai=createOpenAI({apiKey:process.env.OPENAI_API_KEY??''}); return { fast:oai(process.env.OPENAI_MODEL_FAST??'gpt-4o-mini'), standard:oai(process.env.OPENAI_MODEL_STANDARD??'gpt-4o'), advanced:oai(process.env.OPENAI_MODEL_ADVANCED??'gpt-4o') } as unknown as ModelTier; }\n throw new Error(`Unsupported AI_PROVIDER: \"${p}\". Valid: anthropic|mistral|deepseek|openai`);\n}\nexport function getEmbeddingModel() {\n if ((process.env.AI_EMBEDDING_PROVIDER??'openai')==='mistral') return mistral.textEmbeddingModel(process.env.MISTRAL_EMBEDDING_MODEL??'mistral-embed');\n return createOpenAI({apiKey:process.env.OPENAI_API_KEY??''}).embedding(process.env.OPENAI_EMBEDDING_MODEL??'text-embedding-3-small');\n}\nexport const getProviderName = () => process.env.AI_PROVIDER ?? 'anthropic';\nexport const getEmbeddingProviderName = () => process.env.AI_EMBEDDING_PROVIDER ?? 'openai';\n"}, "918a706d932f6b6f9915ba04adda0115faec8958": {"t": 1785754626.1388524, "n": 3002, "h": "ab112f7ed129ee09", "c": "/**\n * src/lib/provider.ts\n * H2O Principle: swap AI_PROVIDER env var → entire inference stack changes.\n * Zero code changes anywhere else.\n */\nimport { anthropic } from '@ai-sdk/anthropic';\nimport { mistral } from '@ai-sdk/mistral';\nimport { createOpenAI } from '@ai-sdk/openai';\n\nexport type SupportedProvider = 'anthropic' | 'mistral' | 'deepseek' | 'openai';\n\nexport interface ModelTier {\n fast: ReturnType;\n standard: ReturnType;\n advanced: ReturnType;\n}\n\nexport function getModelTier(override?: string): ModelTier {\n const provider = (override ?? process.env.AI_PROVIDER ?? 'anthropic') as SupportedProvider;\n\n switch (provider) {\n case 'anthropic':\n return {\n fast: anthropic(process.env.ANTHROPIC_MODEL_FAST ?? 'claude-haiku-4-5'),\n standard: anthropic(process.env.ANTHROPIC_MODEL_STANDARD ?? 'claude-sonnet-4-5'),\n advanced: anthropic(process.env.ANTHROPIC_MODEL_ADVANCED ?? 'claude-opus-4-5'),\n } as unknown as ModelTier;\n\n case 'mistral':\n return {\n fast: mistral(process.env.MISTRAL_MODEL_FAST ?? 'mistral-small-latest'),\n standard: mistral(process.env.MISTRAL_MODEL_STANDARD ?? 'mistral-large-latest'),\n advanced: mistral(process.env.MISTRAL_MODEL_ADVANCED ?? 'mistral-large-latest'),\n } as unknown as ModelTier;\n\n case 'deepseek': {\n const ds = createOpenAI({\n baseURL: process.env.DEEPSEEK_BASE_URL ?? 'https://api.deepseek.com/v1',\n apiKey: process.env.DEEPSEEK_API_KEY ?? '',\n name: 'deepseek',\n });\n return {\n fast: ds(process.env.DEEPSEEK_MODEL_FAST ?? 'deepseek-chat'),\n standard: ds(process.env.DEEPSEEK_MODEL_STANDARD ?? 'deepseek-chat'),\n advanced: ds(process.env.DEEPSEEK_MODEL_ADVANCED ?? 'deepseek-reasoner'),\n } as unknown as ModelTier;\n }\n\n case 'openai': {\n const oai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY ?? '' });\n return {\n fast: oai(process.env.OPENAI_MODEL_FAST ?? 'gpt-4o-mini'),\n standard: oai(process.env.OPENAI_MODEL_STANDARD ?? 'gpt-4o'),\n advanced: oai(process.env.OPENAI_MODEL_ADVANCED ?? 'gpt-4o'),\n } as unknown as ModelTier;\n }\n\n default:\n throw new Error(`Unsupported AI_PROVIDER: \"${provider}\". Valid: anthropic | mistral | deepseek | openai`);\n }\n}\n\nexport function getEmbeddingModel() {\n const provider = (process.env.AI_EMBEDDING_PROVIDER ?? 'openai') as SupportedProvider;\n if (provider === 'mistral') {\n return mistral.textEmbeddingModel(process.env.MISTRAL_EMBEDDING_MODEL ?? 'mistral-embed');\n }\n const oai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY ?? '' });\n return oai.embedding(process.env.OPENAI_EMBEDDING_MODEL ?? 'text-embedding-3-small');\n}\n\nexport const getProviderName = () => process.env.AI_PROVIDER ?? 'anthropic';\nexport const getEmbeddingProviderName = () => process.env.AI_EMBEDDING_PROVIDER ?? 'openai';\n"}}, ".env.example": {"01673a4c0820c1af402f310eb08d30b922a4dda9": {"t": 1786068078.1962135, "n": 944, "h": "cbe9446d4db9a0c6", "c": "# One line changes ALL inference — zero code changes\nAI_PROVIDER=anthropic # anthropic | mistral | deepseek | openai\n\nANTHROPIC_API_KEY=sk-ant-...\nANTHROPIC_MODEL_FAST=claude-haiku-4-5\nANTHROPIC_MODEL_STANDARD=claude-sonnet-4-5\nANTHROPIC_MODEL_ADVANCED=claude-opus-4-5\n\nMISTRAL_API_KEY=...\nMISTRAL_MODEL_FAST=mistral-small-latest\nMISTRAL_MODEL_STANDARD=mistral-large-latest\nMISTRAL_MODEL_ADVANCED=mistral-large-latest\n\nDEEPSEEK_API_KEY=...\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\nDEEPSEEK_MODEL_FAST=deepseek-chat\nDEEPSEEK_MODEL_STANDARD=deepseek-chat\nDEEPSEEK_MODEL_ADVANCED=deepseek-reasoner\n\nOPENAI_API_KEY=sk-...\nOPENAI_MODEL_FAST=gpt-4o-mini\nOPENAI_MODEL_STANDARD=gpt-4o\nOPENAI_MODEL_ADVANCED=gpt-4o\n\nAI_EMBEDDING_PROVIDER=openai\nOPENAI_EMBEDDING_MODEL=text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\nDATABASE_URL=postgresql://user:password@host:5432/dbname\n\nPORT=3000\nKERNEL_API_KEY=change-me\nCORS_ORIGINS=http://localhost:3001\n"}}}}