feat(ai): add packages/ai provider layer (Chunk #8)

Self-contained SSE-based provider layer for OpenAI-compatible endpoints
(Ollama/llama.cpp/LM Studio/vLLM), Anthropic, Gemini, and OpenRouter.

- budget.ts: re-export core token-budget engine (countTokens,
  allocateBudget, DEFAULT_BUDGET)
- client.ts: streamCompletion/collectStream/complete with budget
  enforcement via enforceBudget + measureBudget
- discover.ts: auto-detect local providers by probing common /v1/models
- adapters.ts: per-provider param mapping + streaming adapters + factory
- thinking.ts: thinking/reasoning-param normalization per provider
- http.ts: SSE parsing + 429 retry
- errors.ts: BudgetExceededError

35 unit/integration tests pass; typecheck and lint clean.
This commit is contained in:
Schwitzz
2026-10-28 18:59:54 -05:00
parent 5c28a94813
commit 4c4b83bb68
16 changed files with 1795 additions and 0 deletions
+72
View File
@@ -0,0 +1,72 @@
/**
* `@pubscript/ai` — the AI provider layer for PubScript.
*
* A self-contained, SSE-based provider abstraction that talks to any
* OpenAI-compatible endpoint with streaming, thinking/reasoning params, and
* the token-budget engine from `packages/core`. See CHUNK#8.md.
*
* Public API:
* - `streamCompletion`, `collectStream`, `complete` — the completion client.
* - `measureBudget`, `enforceBudget` — budget helpers.
* - `discoverLocalProviders` — local provider discovery.
* - `getProvider` — resolve a provider config into an adapter.
* - `normalizeThinking` — thinking-param mapping.
* - Re-exports of the token budget engine from `packages/core`.
* - All types and error classes.
*/
// Completion client
export {
streamCompletion,
collectStream,
complete,
measureBudget,
enforceBudget,
} from "./client.js";
export type { MeasuredBudget, StreamResult } from "./client.js";
// Provider adapters + factory
export { getProvider } from "./providers/adapters.js";
// Thinking-param mapping
export { normalizeThinking, reasoningBudgetTokens } from "./thinking.js";
// Local provider discovery
export {
discoverLocalProviders,
LOCAL_ENDPOINTS,
} from "./discover.js";
export type { DetectedModel, DetectedProvider } from "./discover.js";
// Token budget engine (re-exported from core)
export {
countTokens,
allocateBudget,
DEFAULT_BUDGET,
} from "./budget.js";
export type { Budget } from "./budget.js";
// Types
export type {
ProviderKind,
ThinkingConfig,
ThinkingEffort,
ProviderConfig,
ResolvedProvider,
Message,
CallOptions,
CompletionUsage,
StreamEventType,
StreamChunk,
CompleteResult,
ProviderAdapter,
} from "./providers/types.js";
// Errors
export {
ProviderError,
ProviderAuthError,
ProviderRateLimitError,
BudgetExceededError,
UnknownProviderError,
} from "./errors.js";