ai.matey.utils 0.2.2 → 0.4.0

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/CHANGELOG.md +61 -0
  2. package/dist/cjs/embeddings.js +153 -0
  3. package/dist/cjs/embeddings.js.map +1 -0
  4. package/dist/cjs/index.js +9 -0
  5. package/dist/cjs/index.js.map +1 -1
  6. package/dist/cjs/model-registry-data.js +725 -0
  7. package/dist/cjs/model-registry-data.js.map +1 -0
  8. package/dist/cjs/model-registry.js +175 -0
  9. package/dist/cjs/model-registry.js.map +1 -0
  10. package/dist/cjs/streaming.js +61 -1
  11. package/dist/cjs/streaming.js.map +1 -1
  12. package/dist/cjs/structured-output.js +17 -5
  13. package/dist/cjs/structured-output.js.map +1 -1
  14. package/dist/cjs/tools.js +218 -0
  15. package/dist/cjs/tools.js.map +1 -0
  16. package/dist/esm/embeddings.js +145 -0
  17. package/dist/esm/embeddings.js.map +1 -0
  18. package/dist/esm/index.js +7 -0
  19. package/dist/esm/index.js.map +1 -1
  20. package/dist/esm/model-registry-data.js +722 -0
  21. package/dist/esm/model-registry-data.js.map +1 -0
  22. package/dist/esm/model-registry.js +162 -0
  23. package/dist/esm/model-registry.js.map +1 -0
  24. package/dist/esm/streaming.js +61 -1
  25. package/dist/esm/streaming.js.map +1 -1
  26. package/dist/esm/structured-output.js +17 -5
  27. package/dist/esm/structured-output.js.map +1 -1
  28. package/dist/esm/tools.js +211 -0
  29. package/dist/esm/tools.js.map +1 -0
  30. package/dist/types/embeddings.d.ts +80 -0
  31. package/dist/types/embeddings.d.ts.map +1 -0
  32. package/dist/types/index.d.ts +4 -0
  33. package/dist/types/index.d.ts.map +1 -1
  34. package/dist/types/model-registry-data.d.ts +23 -0
  35. package/dist/types/model-registry-data.d.ts.map +1 -0
  36. package/dist/types/model-registry.d.ts +80 -0
  37. package/dist/types/model-registry.d.ts.map +1 -0
  38. package/dist/types/streaming.d.ts +18 -0
  39. package/dist/types/streaming.d.ts.map +1 -1
  40. package/dist/types/structured-output.d.ts.map +1 -1
  41. package/dist/types/tools.d.ts +70 -0
  42. package/dist/types/tools.d.ts.map +1 -0
  43. package/package.json +1 -1
package/CHANGELOG.md ADDED
@@ -0,0 +1,61 @@
1
+ # ai.matey.utils
2
+
3
+ ## 0.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - d9e1489: July 2026 provider refresh. DeepSeek: V4 generation (`deepseek-v4-flash`/`deepseek-v4-pro`, 1M
8
+ context, 384K output) with image input enabled — the adapter now advertises `multiModal` and
9
+ defaults to `deepseek-v4-flash`; `deepseek-chat`/`deepseek-reasoner` marked deprecated (provider
10
+ retires them 2026-07-24). Registry adds `claude-sonnet-5` (1M context), `gemini-3.5-flash`,
11
+ `gemini-3.1-pro-preview`, `grok-4.3`, `grok-4.20` variants, and `grok-build-0.1`; capability
12
+ inference recognizes the claude-5 and deepseek-v4 families; xAI default model updated off the
13
+ retired `grok-beta`.
14
+
15
+ ## 0.3.0
16
+
17
+ ### Minor Changes
18
+
19
+ - dae4d01: Embeddings support: `bridge.embed()` / `router.embed()` with batch chunking, dimension
20
+ normalization, and an embed middleware chain; provider implementations for OpenAI, Mistral,
21
+ Gemini, Cohere, Ollama, Together, Fireworks, DeepInfra, NVIDIA, and LM Studio; caching and
22
+ cost-tracking embedding middleware.
23
+ - 2912b7d: Introduce a shared, data-driven model registry in `ai.matey.utils` as the single source of truth
24
+ for model metadata (pricing, context windows, capabilities, quality/latency). The registry ships
25
+ with a mid-2026 seed (GPT-5.x/o-series, Claude 4.x, Gemini 2.5/3, Grok, current Mistral/DeepSeek,
26
+ plus embedding models) and is runtime-extensible via `registerModels()` / `overrideModelPricing()`,
27
+ with alias and longest-prefix fallback so new dated snapshots of known families still resolve.
28
+
29
+ `ai.matey.core`'s model-pricing API is now a thin delegate over the registry (no API break; legacy
30
+ models keep their prices, marked `deprecated`). Capability inference recognizes current families.
31
+ Cost-tracking middleware consults the registry before provider-level defaults. `useTokenCount`
32
+ consults the registry for context windows. Backend default models updated:
33
+ `claude-3-haiku-20240307` → `claude-sonnet-4-5-20250929` (Anthropic), `gpt-3.5-turbo` →
34
+ `gpt-5-mini` (OpenAI) — note this changes behavior for requests that omit a model. `estimateCost()`
35
+ on both backends now prices the actual requested model. Refreshed `deepseek-chat` pricing.
36
+
37
+ - b7e2312: Tool-calling helpers (`extractToolCalls`, `createToolResultMessage`, `validateToolArgs`, ...)
38
+ and an agentic loop: `bridge.runTools({ prompt, tools })` executes model-requested tools and
39
+ feeds results back until completion. `bridge.executeIR()` exposes the IR pipeline directly.
40
+ - 58ebc03: Streaming tool-call support end-to-end. OpenAI and Anthropic backends now emit `tool_use` IR chunks
41
+ for streamed tool-call deltas (previously dropped with a console warning) and assemble complete
42
+ `ToolUseContent` blocks on the final `done` chunk. The Anthropic backend reports the real
43
+ provider stop reason (previously fabricated, e.g. `max_tokens` streams reported `stop`) and
44
+ captures usage from every `message_delta`. The OpenAI backend folds the trailing
45
+ `stream_options.include_usage` chunk into the done chunk. Frontend adapters re-emit tool deltas in
46
+ native formats (OpenAI index-based `tool_calls` deltas; Anthropic `content_block_start`/
47
+ `input_json_delta` events — the leading text block is now opened lazily so tool-only streams do not
48
+ fabricate an empty text block). `StreamAccumulator` assembles streamed tool calls.
49
+
50
+ Note: when tools are streamed, the done chunk's `message.content` is now a structured
51
+ `MessageContent[]` (text + tool_use blocks) rather than a plain string, and finish reasons are now
52
+ truthful (`tool_calls`/`length` where `stop` was previously reported).
53
+
54
+ ### Patch Changes
55
+
56
+ - Updated dependencies [dae4d01]
57
+ - Updated dependencies [e7df1d0]
58
+ - Updated dependencies [2912b7d]
59
+ - Updated dependencies [78731bb]
60
+ - Updated dependencies [b7e2312]
61
+ - ai.matey.types@0.3.0
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ /**
3
+ * Embedding Utilities
4
+ *
5
+ * Shared helpers for embedding support: batch chunking, dimension
6
+ * normalization, similarity, capability detection, and OpenAI wire-format
7
+ * conversion (used by the HTTP layer's /v1/embeddings route).
8
+ *
9
+ * @module
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.supportsEmbeddings = supportsEmbeddings;
13
+ exports.chunkEmbedInputs = chunkEmbedInputs;
14
+ exports.normalizeDimensions = normalizeDimensions;
15
+ exports.cosineSimilarity = cosineSimilarity;
16
+ exports.openaiEmbedRequestToIR = openaiEmbedRequestToIR;
17
+ exports.irToOpenAIEmbedResponse = irToOpenAIEmbedResponse;
18
+ // ============================================================================
19
+ // Capability Detection
20
+ // ============================================================================
21
+ /**
22
+ * Type guard: does this backend implement embeddings?
23
+ */
24
+ function supportsEmbeddings(adapter) {
25
+ // An inherited embed() can be explicitly opted out of via the capability
26
+ // flag (e.g. providers subclassing the OpenAI adapter without an
27
+ // embeddings endpoint set `capabilities.embeddings: false`)
28
+ return typeof adapter.embed === 'function' && adapter.metadata.capabilities.embeddings !== false;
29
+ }
30
+ // ============================================================================
31
+ // Batch Chunking
32
+ // ============================================================================
33
+ /**
34
+ * Split embedding inputs into provider-sized batches.
35
+ *
36
+ * @param inputs - Input strings
37
+ * @param options - maxBatchSize: max inputs per request; maxTokensPerBatch:
38
+ * optional token budget per batch using estimateTokens (default ~4 chars
39
+ * per token)
40
+ * @returns Batches in original order
41
+ */
42
+ function chunkEmbedInputs(inputs, options) {
43
+ const { maxBatchSize, maxTokensPerBatch, estimateTokens } = options;
44
+ const tokensOf = estimateTokens ?? ((text) => Math.ceil(text.length / 4));
45
+ const batches = [];
46
+ let current = [];
47
+ let currentTokens = 0;
48
+ for (const input of inputs) {
49
+ const inputTokens = maxTokensPerBatch ? tokensOf(input) : 0;
50
+ const wouldOverflow = current.length >= maxBatchSize ||
51
+ (maxTokensPerBatch !== undefined &&
52
+ current.length > 0 &&
53
+ currentTokens + inputTokens > maxTokensPerBatch);
54
+ if (wouldOverflow) {
55
+ batches.push(current);
56
+ current = [];
57
+ currentTokens = 0;
58
+ }
59
+ current.push(input);
60
+ currentTokens += inputTokens;
61
+ }
62
+ if (current.length > 0) {
63
+ batches.push(current);
64
+ }
65
+ return batches;
66
+ }
67
+ // ============================================================================
68
+ // Dimension Normalization
69
+ // ============================================================================
70
+ /**
71
+ * Normalize a vector to a target dimensionality.
72
+ *
73
+ * - `truncate` (default): drop trailing components and re-normalize to unit
74
+ * length (valid for Matryoshka-trained models; approximate otherwise)
75
+ * - `pad`: zero-pad to the target length
76
+ *
77
+ * @param vector - Source vector
78
+ * @param dimensions - Target dimensionality
79
+ * @param strategy - 'truncate' | 'pad'
80
+ */
81
+ function normalizeDimensions(vector, dimensions, strategy = 'truncate') {
82
+ if (vector.length === dimensions) {
83
+ return [...vector];
84
+ }
85
+ if (vector.length > dimensions) {
86
+ const truncated = vector.slice(0, dimensions);
87
+ const norm = Math.sqrt(truncated.reduce((sum, value) => sum + value * value, 0));
88
+ return norm === 0 ? truncated : truncated.map((value) => value / norm);
89
+ }
90
+ if (strategy === 'pad') {
91
+ return [...vector, ...new Array(dimensions - vector.length).fill(0)];
92
+ }
93
+ // Truncate strategy with a shorter source: return as-is (cannot invent data)
94
+ return [...vector];
95
+ }
96
+ /**
97
+ * Cosine similarity between two vectors (also the seed primitive for
98
+ * semantic caching).
99
+ */
100
+ function cosineSimilarity(a, b) {
101
+ if (a.length !== b.length) {
102
+ throw new Error(`Vector length mismatch: ${a.length} vs ${b.length}`);
103
+ }
104
+ let dot = 0;
105
+ let normA = 0;
106
+ let normB = 0;
107
+ for (let i = 0; i < a.length; i++) {
108
+ const x = a[i];
109
+ const y = b[i];
110
+ dot += x * y;
111
+ normA += x * x;
112
+ normB += y * y;
113
+ }
114
+ const denominator = Math.sqrt(normA) * Math.sqrt(normB);
115
+ return denominator === 0 ? 0 : dot / denominator;
116
+ }
117
+ /**
118
+ * Convert an OpenAI-format embeddings request body to IR.
119
+ */
120
+ function openaiEmbedRequestToIR(body) {
121
+ return {
122
+ input: body.input,
123
+ parameters: {
124
+ model: body.model,
125
+ dimensions: body.dimensions,
126
+ user: body.user,
127
+ },
128
+ metadata: {
129
+ requestId: crypto.randomUUID(),
130
+ timestamp: Date.now(),
131
+ provenance: { frontend: 'openai-embed' },
132
+ },
133
+ };
134
+ }
135
+ /**
136
+ * Convert an IR embedding response to the OpenAI wire format.
137
+ */
138
+ function irToOpenAIEmbedResponse(response) {
139
+ return {
140
+ object: 'list',
141
+ data: response.embeddings.map((embedding) => ({
142
+ object: 'embedding',
143
+ index: embedding.index,
144
+ embedding: [...embedding.vector],
145
+ })),
146
+ model: response.model,
147
+ usage: {
148
+ prompt_tokens: response.usage?.promptTokens ?? 0,
149
+ total_tokens: response.usage?.totalTokens ?? 0,
150
+ },
151
+ };
152
+ }
153
+ //# sourceMappingURL=embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/embeddings.ts"],"names":[],"mappings":"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"}
package/dist/cjs/index.js CHANGED
@@ -21,6 +21,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
21
21
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
22
22
  };
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.MODEL_REGISTRY_SEED = void 0;
24
25
  // Validation utilities
25
26
  __exportStar(require("./validation.js"), exports);
26
27
  // System message utilities
@@ -37,6 +38,14 @@ __exportStar(require("./warnings.js"), exports);
37
38
  __exportStar(require("./conversation-history.js"), exports);
38
39
  // Model cache utilities
39
40
  __exportStar(require("./model-cache.js"), exports);
41
+ // Embedding utilities
42
+ __exportStar(require("./embeddings.js"), exports);
43
+ // Tool-calling helpers
44
+ __exportStar(require("./tools.js"), exports);
45
+ // Model registry (pricing, context windows, capabilities)
46
+ __exportStar(require("./model-registry.js"), exports);
47
+ var model_registry_data_js_1 = require("./model-registry-data.js");
48
+ Object.defineProperty(exports, "MODEL_REGISTRY_SEED", { enumerable: true, get: function () { return model_registry_data_js_1.MODEL_REGISTRY_SEED; } });
40
49
  // Structured output utilities (Zod integration)
41
50
  __exportStar(require("./structured-output.js"), exports);
42
51
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;AAEH,uBAAuB;AACvB,kDAAgC;AAEhC,2BAA2B;AAC3B,sDAAoC;AAEpC,oCAAoC;AACpC,4DAA0C;AAE1C,sBAAsB;AACtB,iDAA+B;AAE/B,sCAAsC;AACtC,uDAAqC;AAErC,oBAAoB;AACpB,gDAA8B;AAE9B,iCAAiC;AACjC,4DAA0C;AAE1C,wBAAwB;AACxB,mDAAiC;AAEjC,gDAAgD;AAChD,yDAAuC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;AAEH,uBAAuB;AACvB,kDAAgC;AAEhC,2BAA2B;AAC3B,sDAAoC;AAEpC,oCAAoC;AACpC,4DAA0C;AAE1C,sBAAsB;AACtB,iDAA+B;AAE/B,sCAAsC;AACtC,uDAAqC;AAErC,oBAAoB;AACpB,gDAA8B;AAE9B,iCAAiC;AACjC,4DAA0C;AAE1C,wBAAwB;AACxB,mDAAiC;AAEjC,sBAAsB;AACtB,kDAAgC;AAEhC,uBAAuB;AACvB,6CAA2B;AAE3B,0DAA0D;AAC1D,sDAAoC;AACpC,mEAA+D;AAAtD,6HAAA,mBAAmB,OAAA;AAE5B,gDAAgD;AAChD,yDAAuC"}