@plumbus/core 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ai/__tests__/ai-service.test.js +1 -0
  3. package/dist/ai/__tests__/ai-service.test.js.map +1 -1
  4. package/dist/ai/__tests__/model-pricing.test.js +45 -1
  5. package/dist/ai/__tests__/model-pricing.test.js.map +1 -1
  6. package/dist/ai/__tests__/provider.test.d.ts.map +1 -1
  7. package/dist/ai/__tests__/provider.test.js +338 -1
  8. package/dist/ai/__tests__/provider.test.js.map +1 -1
  9. package/dist/ai/__tests__/rag-pipeline.test.js +46 -0
  10. package/dist/ai/__tests__/rag-pipeline.test.js.map +1 -1
  11. package/dist/ai/index.d.ts +2 -2
  12. package/dist/ai/index.d.ts.map +1 -1
  13. package/dist/ai/index.js +2 -2
  14. package/dist/ai/index.js.map +1 -1
  15. package/dist/ai/model-pricing.d.ts +24 -1
  16. package/dist/ai/model-pricing.d.ts.map +1 -1
  17. package/dist/ai/model-pricing.js +83 -56
  18. package/dist/ai/model-pricing.js.map +1 -1
  19. package/dist/ai/provider.d.ts +74 -0
  20. package/dist/ai/provider.d.ts.map +1 -1
  21. package/dist/ai/provider.js +135 -1
  22. package/dist/ai/provider.js.map +1 -1
  23. package/dist/ai/rag/pipeline.d.ts +12 -0
  24. package/dist/ai/rag/pipeline.d.ts.map +1 -1
  25. package/dist/ai/rag/pipeline.js +16 -0
  26. package/dist/ai/rag/pipeline.js.map +1 -1
  27. package/dist/flows/__tests__/flow-engine.test.js +76 -0
  28. package/dist/flows/__tests__/flow-engine.test.js.map +1 -1
  29. package/dist/flows/engine.d.ts.map +1 -1
  30. package/dist/flows/engine.js +11 -0
  31. package/dist/flows/engine.js.map +1 -1
  32. package/dist/index.d.ts +2 -2
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +1 -1
  35. package/dist/index.js.map +1 -1
  36. package/dist/worker/__tests__/flow-service-wiring.test.d.ts +2 -0
  37. package/dist/worker/__tests__/flow-service-wiring.test.d.ts.map +1 -0
  38. package/dist/worker/__tests__/flow-service-wiring.test.js +64 -0
  39. package/dist/worker/__tests__/flow-service-wiring.test.js.map +1 -0
  40. package/dist/worker/bootstrap.d.ts.map +1 -1
  41. package/dist/worker/bootstrap.js +8 -0
  42. package/dist/worker/bootstrap.js.map +1 -1
  43. package/package.json +1 -1
package/dist/ai/index.js CHANGED
@@ -11,11 +11,11 @@ export { createCostTracker, } from './cost-tracker.js';
11
11
  // Explainability
12
12
  export { createExplainabilityTracker, } from './explainability.js';
13
13
  // Model pricing
14
- export { calculateModelCost, findModelRate } from './model-pricing.js';
14
+ export { allKnownModels, calculateModelCost, findModelRate, } from './model-pricing.js';
15
15
  // Prompt registry
16
16
  export { PromptRegistry } from './prompt-registry.js';
17
17
  // Provider adapters
18
- export { createAnthropicAdapter, createOpenAIAdapter, createProviderAdapter, } from './provider.js';
18
+ export { createAnthropicAdapter, createOpenAIAdapter, createProviderAdapter, joinAndFilterModels, } from './provider.js';
19
19
  // Provider-side structured output errors
20
20
  export { AIIncompleteOutputError, AIRefusalError } from './refusal.js';
21
21
  // Provider-compatible schema conversion
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,6EAA6E;AAC7E,kFAAkF;AAClF,yCAAyC;AACzC,EAAE;AACF,uFAAuF;AAEvF,aAAa;AACb,OAAO,EACL,eAAe,EACf,oBAAoB,GAIrB,MAAM,iBAAiB,CAAC;AACzB,gBAAgB;AAChB,OAAO,EACL,iBAAiB,GAQlB,MAAM,mBAAmB,CAAC;AAC3B,iBAAiB;AACjB,OAAO,EACL,2BAA2B,GAI5B,MAAM,qBAAqB,CAAC;AAC7B,gBAAgB;AAChB,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAkB,MAAM,oBAAoB,CAAC;AACvF,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,oBAAoB;AACpB,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,GAWtB,MAAM,eAAe,CAAC;AACvB,yCAAyC;AACzC,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACvE,wCAAwC;AACxC,OAAO,EACL,uBAAuB,EACvB,uBAAuB,GAGxB,MAAM,6BAA6B,CAAC;AACrC,eAAe;AACf,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,GASf,MAAM,gBAAgB,CAAC;AACxB,WAAW;AACX,OAAO,EACL,mBAAmB,GAIpB,MAAM,eAAe,CAAC;AACvB,mBAAmB;AACnB,OAAO,EACL,aAAa,EACb,oBAAoB,GAKrB,MAAM,mBAAmB,CAAC;AAC3B,oBAAoB;AACpB,OAAO,EACL,sBAAsB,GAGvB,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,6EAA6E;AAC7E,kFAAkF;AAClF,yCAAyC;AACzC,EAAE;AACF,uFAAuF;AAEvF,aAAa;AACb,OAAO,EACL,eAAe,EACf,oBAAoB,GAIrB,MAAM,iBAAiB,CAAC;AACzB,gBAAgB;AAChB,OAAO,EACL,iBAAiB,GAQlB,MAAM,mBAAmB,CAAC;AAC3B,iBAAiB;AACjB,OAAO,EACL,2BAA2B,GAI5B,MAAM,qBAAqB,CAAC;AAC7B,gBAAgB;AAChB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,aAAa,GAGd,MAAM,oBAAoB,CAAC;AAC5B,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,oBAAoB;AACpB,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,GAapB,MAAM,eAAe,CAAC;AACvB,yCAAyC;AACzC,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACvE,wCAAwC;AACxC,OAAO,EACL,uBAAuB,EACvB,uBAAuB,GAGxB,MAAM,6BAA6B,CAAC;AACrC,eAAe;AACf,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,GASf,MAAM,gBAAgB,CAAC;AACxB,WAAW;AACX,OAAO,EACL,mBAAmB,GAIpB,MAAM,eAAe,CAAC;AACvB,mBAAmB;AACnB,OAAO,EACL,aAAa,EACb,oBAAoB,GAKrB,MAAM,mBAAmB,CAAC;AAC3B,oBAAoB;AACpB,OAAO,EACL,sBAAsB,GAGvB,MAAM,iBAAiB,CAAC"}
@@ -1,8 +1,25 @@
1
+ /**
2
+ * Capability classification for a model. Drives the filter on
3
+ * `AIProviderAdapter.listModels({ kind })`.
4
+ *
5
+ * - `text`: chat / completion / reasoning (called via `complete` / `stream`)
6
+ * - `embedding`: text-embedding models (called via `embed`)
7
+ * - `moderation`: content-moderation classifiers
8
+ * - `image`: image generation
9
+ * - `audio`: speech-to-text / text-to-speech / realtime audio
10
+ */
11
+ export type Kind = 'text' | 'embedding' | 'moderation' | 'image' | 'audio';
1
12
  export interface ModelRate {
2
13
  /** USD per 1M input tokens */
3
14
  inputPerMTok: number;
4
- /** USD per 1M output tokens */
15
+ /** USD per 1M output tokens (0 for embedding / moderation / free models) */
5
16
  outputPerMTok: number;
17
+ /**
18
+ * Capability classification. Optional on the type for backward compat —
19
+ * existing consumers that destructure only the rate fields keep working —
20
+ * but every entry in `MODEL_PRICING` populates it.
21
+ */
22
+ kind?: Kind;
6
23
  }
7
24
  /**
8
25
  * Finds the per-token rate for a model.
@@ -11,6 +28,12 @@ export interface ModelRate {
11
28
  * Returns null for unknown/unsupported models (Ollama, custom).
12
29
  */
13
30
  export declare function findModelRate(model: string): ModelRate | null;
31
+ /**
32
+ * Return all known model rates as an array of `[id, rate]` tuples. Used by
33
+ * `AIProviderAdapter.listModels()` to join live model ids against the pricing
34
+ * catalog. Order is not guaranteed.
35
+ */
36
+ export declare function allKnownModels(): ReadonlyArray<readonly [string, ModelRate]>;
14
37
  /**
15
38
  * Calculate the USD cost for a single AI request based on published per-token rates.
16
39
  *
@@ -1 +1 @@
1
- {"version":3,"file":"model-pricing.d.ts","sourceRoot":"","sources":["../../src/ai/model-pricing.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,SAAS;IACxB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,aAAa,EAAE,MAAM,CAAC;CACvB;AA+DD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAY7D;AAYD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IACR,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GACA,MAAM,CAgCR"}
1
+ {"version":3,"file":"model-pricing.d.ts","sourceRoot":"","sources":["../../src/ai/model-pricing.ts"],"names":[],"mappings":"AAYA;;;;;;;;;GASG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC;AAE3E,MAAM,WAAW,SAAS;IACxB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AA+ED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAY7D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAE5E;AAYD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IACR,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GACA,MAAM,CAgCR"}
@@ -3,67 +3,86 @@
3
3
  // Rates are in USD per 1 million tokens (MTok).
4
4
  // Source: https://developers.openai.com/api/docs/pricing
5
5
  // https://platform.claude.com/docs/en/about-claude/pricing
6
- // Last updated: 2026-03-29
6
+ // Last updated: 2026-05-13
7
7
  //
8
8
  // Unknown models (Ollama, custom endpoints) return cost $0.
9
+ //
10
+ // `kind` is derived from the pricing page's section structure, not from name
11
+ // patterns — see `.agents/skills/update-model-pricing/scripts/fetch-pricing.ts`.
9
12
  const MODEL_PRICING = {
10
13
  // ── OpenAI: Flagship ──
11
- 'gpt-5.4': { inputPerMTok: 2.5, outputPerMTok: 15 },
12
- 'gpt-5.4-mini': { inputPerMTok: 0.75, outputPerMTok: 4.5 },
13
- 'gpt-5.4-nano': { inputPerMTok: 0.2, outputPerMTok: 1.25 },
14
- 'gpt-5.4-pro': { inputPerMTok: 30, outputPerMTok: 180 },
15
- 'gpt-5.2': { inputPerMTok: 1.75, outputPerMTok: 14 },
16
- 'gpt-5.2-pro': { inputPerMTok: 21, outputPerMTok: 168 },
17
- 'gpt-5.1': { inputPerMTok: 1.25, outputPerMTok: 10 },
18
- 'gpt-5': { inputPerMTok: 1.25, outputPerMTok: 10 },
19
- 'gpt-5-mini': { inputPerMTok: 0.25, outputPerMTok: 2 },
20
- 'gpt-5-nano': { inputPerMTok: 0.05, outputPerMTok: 0.4 },
21
- 'gpt-5-pro': { inputPerMTok: 15, outputPerMTok: 120 },
22
- 'gpt-4.1': { inputPerMTok: 2, outputPerMTok: 8 },
23
- 'gpt-4.1-mini': { inputPerMTok: 0.4, outputPerMTok: 1.6 },
24
- 'gpt-4.1-nano': { inputPerMTok: 0.1, outputPerMTok: 0.4 },
25
- 'gpt-4o': { inputPerMTok: 2.5, outputPerMTok: 10 },
26
- 'gpt-4o-2024-05-13': { inputPerMTok: 5, outputPerMTok: 15 },
27
- 'gpt-4o-mini': { inputPerMTok: 0.15, outputPerMTok: 0.6 },
14
+ 'gpt-5.5': { kind: 'text', inputPerMTok: 5, outputPerMTok: 30 },
15
+ 'gpt-5.5-pro': { kind: 'text', inputPerMTok: 30, outputPerMTok: 180 },
16
+ 'gpt-5.4': { kind: 'text', inputPerMTok: 2.5, outputPerMTok: 15 },
17
+ 'gpt-5.4-mini': { kind: 'text', inputPerMTok: 0.75, outputPerMTok: 4.5 },
18
+ 'gpt-5.4-nano': { kind: 'text', inputPerMTok: 0.2, outputPerMTok: 1.25 },
19
+ 'gpt-5.4-pro': { kind: 'text', inputPerMTok: 30, outputPerMTok: 180 },
20
+ 'gpt-5.2': { kind: 'text', inputPerMTok: 1.75, outputPerMTok: 14 },
21
+ 'gpt-5.2-pro': { kind: 'text', inputPerMTok: 21, outputPerMTok: 168 },
22
+ 'gpt-5.1': { kind: 'text', inputPerMTok: 1.25, outputPerMTok: 10 },
23
+ 'gpt-5': { kind: 'text', inputPerMTok: 1.25, outputPerMTok: 10 },
24
+ 'gpt-5-mini': { kind: 'text', inputPerMTok: 0.25, outputPerMTok: 2 },
25
+ 'gpt-5-nano': { kind: 'text', inputPerMTok: 0.05, outputPerMTok: 0.4 },
26
+ 'gpt-5-pro': { kind: 'text', inputPerMTok: 15, outputPerMTok: 120 },
27
+ 'gpt-4.1': { kind: 'text', inputPerMTok: 2, outputPerMTok: 8 },
28
+ 'gpt-4.1-mini': { kind: 'text', inputPerMTok: 0.4, outputPerMTok: 1.6 },
29
+ 'gpt-4.1-nano': { kind: 'text', inputPerMTok: 0.1, outputPerMTok: 0.4 },
30
+ 'gpt-4o': { kind: 'text', inputPerMTok: 2.5, outputPerMTok: 10 },
31
+ 'gpt-4o-2024-05-13': { kind: 'text', inputPerMTok: 5, outputPerMTok: 15 },
32
+ 'gpt-4o-mini': { kind: 'text', inputPerMTok: 0.15, outputPerMTok: 0.6 },
28
33
  // ── OpenAI: Reasoning ──
29
- o1: { inputPerMTok: 15, outputPerMTok: 60 },
30
- 'o1-pro': { inputPerMTok: 150, outputPerMTok: 600 },
31
- 'o1-mini': { inputPerMTok: 1.1, outputPerMTok: 4.4 },
32
- o3: { inputPerMTok: 2, outputPerMTok: 8 },
33
- 'o3-pro': { inputPerMTok: 20, outputPerMTok: 80 },
34
- 'o3-mini': { inputPerMTok: 1.1, outputPerMTok: 4.4 },
35
- 'o4-mini': { inputPerMTok: 1.1, outputPerMTok: 4.4 },
36
- // ── OpenAI: Legacy ──
37
- 'gpt-4-turbo': { inputPerMTok: 10, outputPerMTok: 30 },
38
- 'gpt-4-turbo-2024-04-09': { inputPerMTok: 10, outputPerMTok: 30 },
39
- 'gpt-4-0125-preview': { inputPerMTok: 10, outputPerMTok: 30 },
40
- 'gpt-4-1106-preview': { inputPerMTok: 10, outputPerMTok: 30 },
41
- 'gpt-4-1106-vision-preview': { inputPerMTok: 10, outputPerMTok: 30 },
42
- 'gpt-4-0613': { inputPerMTok: 30, outputPerMTok: 60 },
43
- 'gpt-4-0314': { inputPerMTok: 30, outputPerMTok: 60 },
44
- 'gpt-4': { inputPerMTok: 30, outputPerMTok: 60 },
45
- 'gpt-4-32k': { inputPerMTok: 60, outputPerMTok: 120 },
46
- 'gpt-3.5-turbo': { inputPerMTok: 0.5, outputPerMTok: 1.5 },
47
- 'gpt-3.5-turbo-0125': { inputPerMTok: 0.5, outputPerMTok: 1.5 },
48
- 'gpt-3.5-turbo-1106': { inputPerMTok: 1, outputPerMTok: 2 },
49
- 'gpt-3.5-turbo-0613': { inputPerMTok: 1.5, outputPerMTok: 2 },
50
- 'gpt-3.5-0301': { inputPerMTok: 1.5, outputPerMTok: 2 },
51
- 'gpt-3.5-turbo-instruct': { inputPerMTok: 1.5, outputPerMTok: 2 },
52
- 'gpt-3.5-turbo-16k-0613': { inputPerMTok: 3, outputPerMTok: 4 },
53
- // ── Anthropic: Claude ──
54
- 'claude-opus-4-6': { inputPerMTok: 5, outputPerMTok: 25 },
55
- 'claude-opus-4-5': { inputPerMTok: 5, outputPerMTok: 25 },
56
- 'claude-opus-4-1': { inputPerMTok: 15, outputPerMTok: 75 },
57
- 'claude-opus-4': { inputPerMTok: 15, outputPerMTok: 75 },
58
- 'claude-sonnet-4-6': { inputPerMTok: 3, outputPerMTok: 15 },
59
- 'claude-sonnet-4-5': { inputPerMTok: 3, outputPerMTok: 15 },
60
- 'claude-sonnet-4': { inputPerMTok: 3, outputPerMTok: 15 },
61
- 'claude-3-7-sonnet': { inputPerMTok: 3, outputPerMTok: 15 },
62
- 'claude-3-5-sonnet': { inputPerMTok: 3, outputPerMTok: 15 },
63
- 'claude-haiku-4-5': { inputPerMTok: 1, outputPerMTok: 5 },
64
- 'claude-3-5-haiku': { inputPerMTok: 0.8, outputPerMTok: 4 },
65
- 'claude-3-opus': { inputPerMTok: 15, outputPerMTok: 75 },
66
- 'claude-3-haiku': { inputPerMTok: 0.25, outputPerMTok: 1.25 },
34
+ o1: { kind: 'text', inputPerMTok: 15, outputPerMTok: 60 },
35
+ 'o1-pro': { kind: 'text', inputPerMTok: 150, outputPerMTok: 600 },
36
+ 'o1-mini': { kind: 'text', inputPerMTok: 1.1, outputPerMTok: 4.4 },
37
+ o3: { kind: 'text', inputPerMTok: 2, outputPerMTok: 8 },
38
+ 'o3-pro': { kind: 'text', inputPerMTok: 20, outputPerMTok: 80 },
39
+ 'o3-mini': { kind: 'text', inputPerMTok: 1.1, outputPerMTok: 4.4 },
40
+ 'o4-mini': { kind: 'text', inputPerMTok: 1.1, outputPerMTok: 4.4 },
41
+ // ── OpenAI: Specialized / Deep research / Computer use ──
42
+ 'o3-deep-research': { kind: 'text', inputPerMTok: 10, outputPerMTok: 40 },
43
+ 'o4-mini-deep-research': { kind: 'text', inputPerMTok: 2, outputPerMTok: 8 },
44
+ 'computer-use-preview': { kind: 'text', inputPerMTok: 3, outputPerMTok: 12 },
45
+ // ── OpenAI: Embeddings ──
46
+ 'text-embedding-3-small': { kind: 'embedding', inputPerMTok: 0.02, outputPerMTok: 0 },
47
+ 'text-embedding-3-large': { kind: 'embedding', inputPerMTok: 0.13, outputPerMTok: 0 },
48
+ 'text-embedding-ada-002': { kind: 'embedding', inputPerMTok: 0.1, outputPerMTok: 0 },
49
+ // ── OpenAI: Moderation (free) ──
50
+ 'omni-moderation-latest': { kind: 'moderation', inputPerMTok: 0, outputPerMTok: 0 },
51
+ 'text-moderation-latest': { kind: 'moderation', inputPerMTok: 0, outputPerMTok: 0 },
52
+ // ── OpenAI: Legacy (chat/completion) ──
53
+ 'gpt-4-turbo': { kind: 'text', inputPerMTok: 10, outputPerMTok: 30 },
54
+ 'gpt-4-turbo-2024-04-09': { kind: 'text', inputPerMTok: 10, outputPerMTok: 30 },
55
+ 'gpt-4-0125-preview': { kind: 'text', inputPerMTok: 10, outputPerMTok: 30 },
56
+ 'gpt-4-1106-preview': { kind: 'text', inputPerMTok: 10, outputPerMTok: 30 },
57
+ 'gpt-4-1106-vision-preview': { kind: 'text', inputPerMTok: 10, outputPerMTok: 30 },
58
+ 'gpt-4-0613': { kind: 'text', inputPerMTok: 30, outputPerMTok: 60 },
59
+ 'gpt-4-0314': { kind: 'text', inputPerMTok: 30, outputPerMTok: 60 },
60
+ 'gpt-4': { kind: 'text', inputPerMTok: 30, outputPerMTok: 60 },
61
+ 'gpt-4-32k': { kind: 'text', inputPerMTok: 60, outputPerMTok: 120 },
62
+ 'gpt-3.5-turbo': { kind: 'text', inputPerMTok: 0.5, outputPerMTok: 1.5 },
63
+ 'gpt-3.5-turbo-0125': { kind: 'text', inputPerMTok: 0.5, outputPerMTok: 1.5 },
64
+ 'gpt-3.5-turbo-1106': { kind: 'text', inputPerMTok: 1, outputPerMTok: 2 },
65
+ 'gpt-3.5-turbo-0613': { kind: 'text', inputPerMTok: 1.5, outputPerMTok: 2 },
66
+ 'gpt-3.5-0301': { kind: 'text', inputPerMTok: 1.5, outputPerMTok: 2 },
67
+ 'gpt-3.5-turbo-instruct': { kind: 'text', inputPerMTok: 1.5, outputPerMTok: 2 },
68
+ 'gpt-3.5-turbo-16k-0613': { kind: 'text', inputPerMTok: 3, outputPerMTok: 4 },
69
+ 'davinci-002': { kind: 'text', inputPerMTok: 2, outputPerMTok: 2 },
70
+ 'babbage-002': { kind: 'text', inputPerMTok: 0.4, outputPerMTok: 0.4 },
71
+ // ── Anthropic: Claude (all text — no embedding API) ──
72
+ 'claude-opus-4-7': { kind: 'text', inputPerMTok: 5, outputPerMTok: 25 },
73
+ 'claude-opus-4-6': { kind: 'text', inputPerMTok: 5, outputPerMTok: 25 },
74
+ 'claude-opus-4-5': { kind: 'text', inputPerMTok: 5, outputPerMTok: 25 },
75
+ 'claude-opus-4-1': { kind: 'text', inputPerMTok: 15, outputPerMTok: 75 },
76
+ 'claude-opus-4': { kind: 'text', inputPerMTok: 15, outputPerMTok: 75 },
77
+ 'claude-sonnet-4-6': { kind: 'text', inputPerMTok: 3, outputPerMTok: 15 },
78
+ 'claude-sonnet-4-5': { kind: 'text', inputPerMTok: 3, outputPerMTok: 15 },
79
+ 'claude-sonnet-4': { kind: 'text', inputPerMTok: 3, outputPerMTok: 15 },
80
+ 'claude-3-7-sonnet': { kind: 'text', inputPerMTok: 3, outputPerMTok: 15 },
81
+ 'claude-3-5-sonnet': { kind: 'text', inputPerMTok: 3, outputPerMTok: 15 },
82
+ 'claude-haiku-4-5': { kind: 'text', inputPerMTok: 1, outputPerMTok: 5 },
83
+ 'claude-3-5-haiku': { kind: 'text', inputPerMTok: 0.8, outputPerMTok: 4 },
84
+ 'claude-3-opus': { kind: 'text', inputPerMTok: 15, outputPerMTok: 75 },
85
+ 'claude-3-haiku': { kind: 'text', inputPerMTok: 0.25, outputPerMTok: 1.25 },
67
86
  };
68
87
  /**
69
88
  * Finds the per-token rate for a model.
@@ -84,6 +103,14 @@ export function findModelRate(model) {
84
103
  }
85
104
  return null;
86
105
  }
106
+ /**
107
+ * Return all known model rates as an array of `[id, rate]` tuples. Used by
108
+ * `AIProviderAdapter.listModels()` to join live model ids against the pricing
109
+ * catalog. Order is not guaranteed.
110
+ */
111
+ export function allKnownModels() {
112
+ return Object.entries(MODEL_PRICING);
113
+ }
87
114
  /** Models subject to Anthropic's long context premium (>200K input tokens). */
88
115
  const LONG_CONTEXT_PREMIUM_MODELS = new Set(['claude-sonnet-4', 'claude-sonnet-4-5']);
89
116
  /** Check if a model (after date-stripping) qualifies for long context premium. */
@@ -1 +1 @@
1
- {"version":3,"file":"model-pricing.js","sourceRoot":"","sources":["../../src/ai/model-pricing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-pricing.js","sourceRoot":"","sources":["../../src/ai/model-pricing.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { AIProviderConfig } from '../types/config.js';
2
+ import { type Kind } from './model-pricing.js';
2
3
  /**
3
4
  * A single chat-history turn. Used for native multi-turn requests where the
4
5
  * model should see real conversation flow (assistant + user alternation).
@@ -95,6 +96,49 @@ export interface EmbeddingResponse {
95
96
  usage: {
96
97
  totalTokens: number;
97
98
  };
99
+ /**
100
+ * USD cost computed from the pricing catalog using `usage.totalTokens` against
101
+ * the model's input rate (embeddings are input-only). `0` for unknown models
102
+ * — same convention as completion-side cost. Optional so that external
103
+ * `AIProviderAdapter` implementations written before this field existed still
104
+ * satisfy the interface; consumers reading `cost` should treat `undefined` as
105
+ * "unknown" (typically by coalescing to `0`).
106
+ */
107
+ cost?: number;
108
+ }
109
+ /**
110
+ * A single model entry returned by `AIProviderAdapter.listModels()`.
111
+ * The id is whatever the provider's `/v1/models` returns; pricing and `kind`
112
+ * are joined from the framework's pricing catalog. Models not in the catalog
113
+ * surface as `kind: 'unknown'` with `null` prices.
114
+ */
115
+ export interface ProviderModel {
116
+ /** API identifier (the value to pass as `model` in requests). */
117
+ id: string;
118
+ /** Adapter name (e.g. "openai", "anthropic", or a custom adapter's name). */
119
+ provider: string;
120
+ /** Capability classification, from the pricing catalog. `'unknown'` if not in the catalog. */
121
+ kind: Kind | 'unknown';
122
+ /** USD per 1M input tokens, or `null` if the model is not in the catalog. */
123
+ inputPerMTok: number | null;
124
+ /** USD per 1M output tokens, or `null` if the model is not in the catalog. */
125
+ outputPerMTok: number | null;
126
+ /** Provider-supplied human-readable label (Anthropic exposes this; OpenAI doesn't). */
127
+ displayName?: string;
128
+ /** ISO-8601 creation timestamp when the provider exposes one. */
129
+ createdAt?: string;
130
+ /** Owner/team (OpenAI exposes this; Anthropic doesn't). */
131
+ ownedBy?: string;
132
+ }
133
+ /**
134
+ * Optional filter passed to `AIProviderAdapter.listModels()`. `kind` accepts a
135
+ * single Kind or an array. When unset, all models are returned (including
136
+ * unknown ones). When set against an official endpoint, unknown-kind models
137
+ * are excluded; against a custom endpoint they are included alongside the
138
+ * filtered matches (see adapter docs).
139
+ */
140
+ export interface ListModelsFilter {
141
+ kind?: Kind | Kind[];
98
142
  }
99
143
  export interface AIProviderAdapter {
100
144
  readonly name: string;
@@ -104,7 +148,37 @@ export interface AIProviderAdapter {
104
148
  stream(request: ProviderRequest): AsyncIterable<ProviderStreamEvent>;
105
149
  /** Generate embeddings for texts */
106
150
  embed(request: EmbeddingRequest): Promise<EmbeddingResponse>;
151
+ /**
152
+ * List models the provider exposes for this account, joined against the
153
+ * framework's pricing catalog. Optional — custom adapters that don't
154
+ * implement it still satisfy the interface.
155
+ *
156
+ * Filtering rule (see docs for full details):
157
+ * - No filter → all models, including unknown-kind entries.
158
+ * - Filter + official endpoint → only matching kinds; unknowns excluded.
159
+ * - Filter + custom endpoint → matching kinds **plus** all unknowns.
160
+ *
161
+ * On network error / 404 / unsupported endpoint, returns `[]` and emits
162
+ * one `console.warn`; does not throw.
163
+ */
164
+ listModels?(filter?: ListModelsFilter): Promise<ProviderModel[]>;
107
165
  }
166
+ /**
167
+ * Shared logic used by adapter `listModels` implementations: join a list of
168
+ * provider-supplied model entries against the pricing catalog, then apply
169
+ * the kind filter respecting the official-endpoint rule.
170
+ */
171
+ export declare function joinAndFilterModels(args: {
172
+ provider: string;
173
+ entries: Array<{
174
+ id: string;
175
+ displayName?: string;
176
+ createdAt?: string;
177
+ ownedBy?: string;
178
+ }>;
179
+ filter: ListModelsFilter | undefined;
180
+ isOfficial: boolean;
181
+ }): ProviderModel[];
108
182
  export declare class ProviderAPIError extends Error {
109
183
  readonly providerName: string;
110
184
  readonly statusCode?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  // ── AI Provider Adapter Interface ──
2
2
  // Abstract interface for AI provider adapters (OpenAI, Anthropic, etc.)
3
+ import { allKnownModels, calculateModelCost } from './model-pricing.js';
3
4
  import { AIIncompleteOutputError, AIRefusalError } from './refusal.js';
4
5
  /** Compose a request's optional user signal with a timeout, returning a single AbortSignal. */
5
6
  export function combineRequestSignals(userSignal, timeoutMs) {
@@ -8,6 +9,48 @@ export function combineRequestSignals(userSignal, timeoutMs) {
8
9
  return timeoutSignal;
9
10
  return AbortSignal.any([userSignal, timeoutSignal]);
10
11
  }
12
+ /**
13
+ * Shared logic used by adapter `listModels` implementations: join a list of
14
+ * provider-supplied model entries against the pricing catalog, then apply
15
+ * the kind filter respecting the official-endpoint rule.
16
+ */
17
+ export function joinAndFilterModels(args) {
18
+ const catalog = new Map(allKnownModels()
19
+ .filter(([, rate]) => rate.kind != null)
20
+ .map(([id, rate]) => [
21
+ id,
22
+ {
23
+ kind: rate.kind,
24
+ inputPerMTok: rate.inputPerMTok,
25
+ outputPerMTok: rate.outputPerMTok,
26
+ },
27
+ ]));
28
+ const joined = args.entries.map((e) => {
29
+ const cat = catalog.get(e.id);
30
+ const model = {
31
+ id: e.id,
32
+ provider: args.provider,
33
+ kind: cat?.kind ?? 'unknown',
34
+ inputPerMTok: cat?.inputPerMTok ?? null,
35
+ outputPerMTok: cat?.outputPerMTok ?? null,
36
+ };
37
+ if (e.displayName != null)
38
+ model.displayName = e.displayName;
39
+ if (e.createdAt != null)
40
+ model.createdAt = e.createdAt;
41
+ if (e.ownedBy != null)
42
+ model.ownedBy = e.ownedBy;
43
+ return model;
44
+ });
45
+ if (!args.filter?.kind)
46
+ return joined;
47
+ const allowedKinds = new Set(Array.isArray(args.filter.kind) ? args.filter.kind : [args.filter.kind]);
48
+ return joined.filter((m) => {
49
+ if (m.kind === 'unknown')
50
+ return !args.isOfficial;
51
+ return allowedKinds.has(m.kind);
52
+ });
53
+ }
11
54
  export class ProviderAPIError extends Error {
12
55
  providerName;
13
56
  statusCode;
@@ -352,12 +395,49 @@ export function createOpenAIAdapter(config) {
352
395
  }),
353
396
  });
354
397
  const data = (await resp.json());
398
+ const totalTokens = data.usage.total_tokens;
355
399
  return {
356
400
  embeddings: data.data.map((d) => d.embedding),
357
401
  model: data.model,
358
- usage: { totalTokens: data.usage.total_tokens },
402
+ usage: { totalTokens },
403
+ cost: calculateModelCost(totalTokens, 0, data.model),
359
404
  };
360
405
  },
406
+ async listModels(filter) {
407
+ const isOfficial = baseUrl === 'https://api.openai.com/v1';
408
+ try {
409
+ const resp = await fetch(`${baseUrl}/models`, {
410
+ method: 'GET',
411
+ headers: { Authorization: `Bearer ${config.apiKey}` },
412
+ signal: AbortSignal.timeout(defaultTimeout),
413
+ });
414
+ if (!resp.ok) {
415
+ console.warn(`[plumbus] OpenAI listModels: ${baseUrl}/models returned ${resp.status} ${resp.statusText}; returning empty list`);
416
+ return [];
417
+ }
418
+ const data = (await resp.json());
419
+ if (!Array.isArray(data.data)) {
420
+ console.warn(`[plumbus] OpenAI listModels: ${baseUrl}/models returned unexpected response shape; returning empty list`);
421
+ return [];
422
+ }
423
+ const entries = data.data.map((m) => {
424
+ const e = { id: m.id };
425
+ if (typeof m.created === 'number') {
426
+ e.createdAt = new Date(m.created * 1000).toISOString();
427
+ }
428
+ if (typeof m.owned_by === 'string') {
429
+ e.ownedBy = m.owned_by;
430
+ }
431
+ return e;
432
+ });
433
+ return joinAndFilterModels({ provider: 'openai', entries, filter, isOfficial });
434
+ }
435
+ catch (err) {
436
+ const msg = err instanceof Error ? err.message : String(err);
437
+ console.warn(`[plumbus] OpenAI listModels: ${baseUrl}/models failed (${msg}); returning empty list`);
438
+ return [];
439
+ }
440
+ },
361
441
  };
362
442
  }
363
443
  export function createAnthropicAdapter(config) {
@@ -490,6 +570,60 @@ export function createAnthropicAdapter(config) {
490
570
  // Users should pair with an embedding-capable provider for RAG
491
571
  throw new Error('Anthropic does not provide an embedding API. Use an OpenAI-compatible provider for embeddings.');
492
572
  },
573
+ async listModels(filter) {
574
+ const isOfficial = baseUrl === 'https://api.anthropic.com/v1';
575
+ const entries = [];
576
+ let afterId;
577
+ try {
578
+ // Anthropic /models is paginated via `has_more` / `last_id` + `after_id` query param.
579
+ // Cap iterations defensively so a misbehaving API doesn't loop forever.
580
+ for (let page = 0; page < 20; page++) {
581
+ const url = new URL(`${baseUrl}/models`);
582
+ url.searchParams.set('limit', '100');
583
+ if (afterId)
584
+ url.searchParams.set('after_id', afterId);
585
+ const resp = await fetch(url, {
586
+ method: 'GET',
587
+ headers: {
588
+ 'x-api-key': config.apiKey,
589
+ 'anthropic-version': '2023-06-01',
590
+ },
591
+ signal: AbortSignal.timeout(defaultTimeout),
592
+ });
593
+ if (!resp.ok) {
594
+ console.warn(`[plumbus] Anthropic listModels: ${url} returned ${resp.status} ${resp.statusText}; returning ${entries.length === 0 ? 'empty' : 'partial'} list`);
595
+ if (entries.length === 0)
596
+ return [];
597
+ break;
598
+ }
599
+ const data = (await resp.json());
600
+ if (!Array.isArray(data.data)) {
601
+ console.warn(`[plumbus] Anthropic listModels: ${url} returned unexpected response shape; returning ${entries.length === 0 ? 'empty' : 'partial'} list`);
602
+ if (entries.length === 0)
603
+ return [];
604
+ break;
605
+ }
606
+ for (const m of data.data) {
607
+ const e = { id: m.id };
608
+ if (typeof m.display_name === 'string')
609
+ e.displayName = m.display_name;
610
+ if (typeof m.created_at === 'string')
611
+ e.createdAt = m.created_at;
612
+ entries.push(e);
613
+ }
614
+ if (!data.has_more || !data.last_id)
615
+ break;
616
+ afterId = data.last_id;
617
+ }
618
+ }
619
+ catch (err) {
620
+ const msg = err instanceof Error ? err.message : String(err);
621
+ console.warn(`[plumbus] Anthropic listModels: ${baseUrl}/models failed (${msg}); returning ${entries.length === 0 ? 'empty' : 'partial'} list`);
622
+ if (entries.length === 0)
623
+ return [];
624
+ }
625
+ return joinAndFilterModels({ provider: 'anthropic', entries, filter, isOfficial });
626
+ },
493
627
  };
494
628
  }
495
629
  async function* parseSSEStream(resp, parseChunk) {