@postqode/ai
v0.9.0
Published
Unified LLM provider layer for PostQode. 37 built-in provider adapters, streaming + tool-use + pricing + context-window helpers, faux provider for tests, pluggable registry.
Readme
@postqode/ai
Unified LLM provider layer for PostQode. One import gives you a pluggable registry that every agent built on top of it can target.
Internal workspace package — consumed by @postqode/agent, @postqode/coding-agent, @postqode/evals, and the VS Code extension.
What ships
ApiHandlercontract — the interface every provider implements (createMessage,getModel,abort?).- Stream types —
ApiStreamplus thetext/reasoning/tool_calls/usagechunk variants providers emit. - Provider registry —
registerProvider,getProvider,listProviders,unregisterProvider,UnknownProviderError. - 37 built-in providers that self-register on import (Anthropic, Vertex, Bedrock, OpenRouter, OpenAI, OpenAI-Native, OpenAI-Codex, Gemini, Groq, Mistral, DeepSeek, Ollama, LMStudio, Cerebras, Fireworks, Together, Requesty, Moonshot, Doubao, Minimax, Qwen, Qwen-Code, Sambanova, Sapaicore, Dify, Baseten, XAI, ZAi, Nebius, Huggingface, Mistral, Huawei Cloud MaaS, AskSage, LiteLLM, Vercel AI Gateway, PostQode, PostQode Trial).
registerFauxProvider— scripted provider for deterministic tests/evals, no API key required.- Pricing calc —
calculateApiCostAnthropic/calculateApiCostOpenAI/calculateApiCostQwenwith tiered-pricing, cache credits, and thinking-budget overrides. - Model-family helpers —
isAnthropicModelId,isClaude4PlusModelFamily,isGPT5ModelFamily,shouldSkipReasoningForModel, and friends. - Context-window utils —
getContextWindowInfo(api)returns{ contextWindow, maxAllowedSize }with model-specific buffers baked in.
Usage
import { getProvider, registerProvider } from "@postqode/ai"
// Use a built-in — anthropic is registered automatically on import.
const factory = getProvider("anthropic")!
const handler = factory(
{ apiKey, agentModeApiModelId: "claude-sonnet-4-5-20250929", planModeApiModelId: "claude-sonnet-4-5-20250929" },
"agent",
)
// Register a custom provider or override a built-in.
registerProvider("my-custom", (options, mode) => new MyCustomHandler(options))Faux provider (for tests)
import { registerFauxProvider, getProvider } from "@postqode/ai"
registerFauxProvider("test-model", {
turns: [
[
{ type: "text", text: "hello" },
{ type: "usage", inputTokens: 10, outputTokens: 5 },
],
],
})
const api = getProvider("test-model")!({}, "agent")
// Feed this handler to an @postqode/agent Agent for deterministic unit tests.Consumed at build time by the extension's src/core/api/index.ts, which re-exports the contract types and drives dispatch through this registry (zero switch statements).
Sibling packages
@postqode/agent— agent loop + tool execution on top of this package.@postqode/coding-agent— opinionated coding-agent harness.@postqode/evals— real-LLM evaluation harness.
