@anvia/core 0.5.0 → 0.6.1

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 (55) hide show
  1. package/README.md +68 -0
  2. package/dist/agent/index.d.ts +10 -10
  3. package/dist/agent/index.js +6 -5
  4. package/dist/{agent-CWGuTdMJ.d.ts → agent-MQdfhE7y.d.ts} +3 -3
  5. package/dist/audio-generation/index.d.ts +1 -1
  6. package/dist/{chunk-Z7HY4WU7.js → chunk-2SSND6H4.js} +4 -4
  7. package/dist/{chunk-S7EOE6EC.js → chunk-AER5FGPK.js} +2 -2
  8. package/dist/{chunk-365W6FJD.js → chunk-GNNNJZ2P.js} +4 -4
  9. package/dist/{chunk-P425B6GR.js → chunk-I47EHI45.js} +13 -19
  10. package/dist/chunk-I47EHI45.js.map +1 -0
  11. package/dist/{chunk-DUP7FMAF.js → chunk-SHHSMV7O.js} +2 -2
  12. package/dist/chunk-WQKHFADH.js +12 -0
  13. package/dist/chunk-WQKHFADH.js.map +1 -0
  14. package/dist/{chunk-ORLEOXD7.js → chunk-YLN6QF5S.js} +4 -4
  15. package/dist/{chunk-6GJDBBDC.js → chunk-ZQQYFVO5.js} +124 -1
  16. package/dist/chunk-ZQQYFVO5.js.map +1 -0
  17. package/dist/completion/index.d.ts +5 -2
  18. package/dist/completion/index.js +8 -1
  19. package/dist/create-completion-B7-k4LsF.d.ts +36 -0
  20. package/dist/evals/index.d.ts +5 -5
  21. package/dist/evals/index.js +7 -6
  22. package/dist/evals/index.js.map +1 -1
  23. package/dist/extractor/index.d.ts +4 -4
  24. package/dist/extractor/index.js +7 -6
  25. package/dist/image-generation/index.d.ts +1 -1
  26. package/dist/index.d.ts +8 -7
  27. package/dist/index.js +16 -7
  28. package/dist/internal/agent.d.ts +4 -4
  29. package/dist/internal/agent.js +5 -4
  30. package/dist/loaders/index.d.ts +1 -1
  31. package/dist/mcp/index.d.ts +4 -4
  32. package/dist/memory/index.d.ts +1 -1
  33. package/dist/{middleware-qfm1EFKK.d.ts → middleware-D6Wu0AcC.d.ts} +2 -2
  34. package/dist/observability/index.d.ts +2 -2
  35. package/dist/pipeline/index.d.ts +4 -4
  36. package/dist/skills/index.d.ts +4 -4
  37. package/dist/skills/index.js +4 -3
  38. package/dist/{think-tool-ByArsrxe.d.ts → think-tool-DTDGH1Q1.d.ts} +1 -1
  39. package/dist/tool/index.d.ts +4 -4
  40. package/dist/tool/index.js +3 -2
  41. package/dist/{tool-C3ciF-VG.d.ts → tool-OU7OZS0t.d.ts} +1 -1
  42. package/dist/transcription/index.d.ts +1 -1
  43. package/dist/{types-T9rlOIUc.d.ts → types-Bpjngcxq.d.ts} +1 -1
  44. package/dist/{types-UhcgW8Fo.d.ts → types-DXkaLs4s.d.ts} +2 -2
  45. package/dist/{types-C54aNoCd.d.ts → types-_boSLqrx.d.ts} +4 -1
  46. package/dist/vector-store/index.d.ts +2 -2
  47. package/dist/vector-store/index.js +2 -1
  48. package/package.json +1 -1
  49. package/dist/chunk-6GJDBBDC.js.map +0 -1
  50. package/dist/chunk-P425B6GR.js.map +0 -1
  51. /package/dist/{chunk-Z7HY4WU7.js.map → chunk-2SSND6H4.js.map} +0 -0
  52. /package/dist/{chunk-S7EOE6EC.js.map → chunk-AER5FGPK.js.map} +0 -0
  53. /package/dist/{chunk-365W6FJD.js.map → chunk-GNNNJZ2P.js.map} +0 -0
  54. /package/dist/{chunk-DUP7FMAF.js.map → chunk-SHHSMV7O.js.map} +0 -0
  55. /package/dist/{chunk-ORLEOXD7.js.map → chunk-YLN6QF5S.js.map} +0 -0
package/README.md CHANGED
@@ -47,6 +47,74 @@ const response = await agent.prompt("What is happening with order A123?").send()
47
47
  console.log(response.output);
48
48
  ```
49
49
 
50
+ ## Direct Completions
51
+
52
+ Use `createCompletion` when you want a single provider call without agent turns, memory, or
53
+ tool execution:
54
+
55
+ ```ts
56
+ import { createCompletion } from "@anvia/core";
57
+ import { OpenAIClient } from "@anvia/openai";
58
+
59
+ const model = new OpenAIClient({ apiKey }).completionModel("gpt-5");
60
+
61
+ const result = await createCompletion(model, {
62
+ input: "Summarize Anvia in one sentence.",
63
+ instructions: "Answer clearly and concisely.",
64
+ });
65
+
66
+ console.log(result.text);
67
+ ```
68
+
69
+ Use `messages` when you already own the transcript. If `input` is also provided, it is appended as
70
+ the final message:
71
+
72
+ ```ts
73
+ import { Message, createCompletion } from "@anvia/core";
74
+
75
+ const result = await createCompletion(model, {
76
+ messages: [
77
+ Message.system("You are concise."),
78
+ Message.user("Explain Anvia."),
79
+ ],
80
+ maxTokens: 300,
81
+ params: {
82
+ reasoning: { effort: "low" },
83
+ },
84
+ });
85
+ ```
86
+
87
+ Use `createCompletionStream` to receive raw completion stream events from the model:
88
+
89
+ ```ts
90
+ import { createCompletionStream } from "@anvia/core";
91
+
92
+ for await (const event of createCompletionStream(model, {
93
+ input: "Write a short launch note.",
94
+ })) {
95
+ if (event.type === "text_delta") process.stdout.write(event.delta);
96
+ }
97
+ ```
98
+
99
+ Use `createParsedCompletion` when you want a direct completion to return schema-validated data:
100
+
101
+ ```ts
102
+ import { createParsedCompletion } from "@anvia/core";
103
+ import { z } from "zod";
104
+
105
+ const eventSchema = z.object({
106
+ name: z.string(),
107
+ date: z.string(),
108
+ });
109
+
110
+ const event = await createParsedCompletion(model, {
111
+ schema: eventSchema,
112
+ input: "Alice and Bob are going to a science fair on Friday.",
113
+ });
114
+
115
+ console.log(event.data);
116
+ ```
117
+
50
118
  ## Prompts and Memory
51
119
 
52
120
  Use a plain prompt for stateless calls:
@@ -1,20 +1,20 @@
1
- import { k as ToolSearchDocument, l as ToolSet, A as AgentMiddleware, e as ToolMiddleware } from '../middleware-qfm1EFKK.js';
2
- export { C as CompletionRequestMiddlewareArgs, a as CompletionRequestMiddlewareResult, b as CompletionResponseMiddlewareArgs, c as CompletionResponseMiddlewareResult, T as ToolInputMiddlewareArgs, d as ToolInputMiddlewareResult, f as ToolOutputMiddlewareArgs, g as ToolOutputMiddlewareResult, h as ToolResultMiddlewareArgs, i as createMiddleware, j as createToolMiddleware } from '../middleware-qfm1EFKK.js';
3
- import { D as DynamicContextOptions, f as DynamicToolOptions, g as PromptHook, h as AgentEventStore, i as AgentEventStoreOptions, e as Agent } from '../agent-CWGuTdMJ.js';
4
- export { A as AgentChildStreamEvent, j as AgentEventAppendInput, k as AgentEventRecord, l as AgentEventStoreInclude, a as AgentStreamEvent, C as CompletionCallHookArgs, m as CompletionErrorHookArgs, n as CompletionResponseHookArgs, H as HookAction, o as HookResult, P as PromptResponse, R as RunControl, p as RunEndHookArgs, q as RunErrorHookArgs, u as RunStartHookArgs, T as ToolApprovalRequestOptions, v as ToolCallControl, w as ToolCallHookAction, x as ToolCallHookArgs, y as ToolCallHookResult, z as ToolErrorHookArgs, B as ToolHookArgs, E as ToolResultHookArgs, F as TurnEndHookArgs, G as TurnStartHookArgs, c as cancelPrompt, b as createHook, r as requestToolApproval, d as runControl, s as skipTool, t as toolCallControl } from '../agent-CWGuTdMJ.js';
5
- import { C as CompletionModel, e as JsonValue, m as ToolChoice, M as Message } from '../types-C54aNoCd.js';
6
- import { a as McpServer } from '../types-UhcgW8Fo.js';
1
+ import { k as ToolSearchDocument, l as ToolSet, A as AgentMiddleware, e as ToolMiddleware } from '../middleware-D6Wu0AcC.js';
2
+ export { C as CompletionRequestMiddlewareArgs, a as CompletionRequestMiddlewareResult, b as CompletionResponseMiddlewareArgs, c as CompletionResponseMiddlewareResult, T as ToolInputMiddlewareArgs, d as ToolInputMiddlewareResult, f as ToolOutputMiddlewareArgs, g as ToolOutputMiddlewareResult, h as ToolResultMiddlewareArgs, i as createMiddleware, j as createToolMiddleware } from '../middleware-D6Wu0AcC.js';
3
+ import { D as DynamicContextOptions, f as DynamicToolOptions, g as PromptHook, h as AgentEventStore, i as AgentEventStoreOptions, e as Agent } from '../agent-MQdfhE7y.js';
4
+ export { A as AgentChildStreamEvent, j as AgentEventAppendInput, k as AgentEventRecord, l as AgentEventStoreInclude, a as AgentStreamEvent, C as CompletionCallHookArgs, m as CompletionErrorHookArgs, n as CompletionResponseHookArgs, H as HookAction, o as HookResult, P as PromptResponse, R as RunControl, p as RunEndHookArgs, q as RunErrorHookArgs, u as RunStartHookArgs, T as ToolApprovalRequestOptions, v as ToolCallControl, w as ToolCallHookAction, x as ToolCallHookArgs, y as ToolCallHookResult, z as ToolErrorHookArgs, B as ToolHookArgs, E as ToolResultHookArgs, F as TurnEndHookArgs, G as TurnStartHookArgs, c as cancelPrompt, b as createHook, r as requestToolApproval, d as runControl, s as skipTool, t as toolCallControl } from '../agent-MQdfhE7y.js';
5
+ import { Z as ZodSchema } from '../zod-schema-C7F4clpm.js';
6
+ import { C as CompletionModel, e as JsonValue, n as ToolChoice, M as Message } from '../types-_boSLqrx.js';
7
+ import { a as McpServer } from '../types-DXkaLs4s.js';
7
8
  import { MemoryStore, MemoryOptions } from '../memory/index.js';
8
9
  import { AgentObserver, ObserveOptions } from '../observability/index.js';
9
- import { Z as ZodSchema } from '../zod-schema-C7F4clpm.js';
10
- import { a as SkillSet } from '../types-T9rlOIUc.js';
11
- import { A as AnyTool } from '../tool-C3ciF-VG.js';
10
+ import { a as SkillSet } from '../types-Bpjngcxq.js';
11
+ import { A as AnyTool } from '../tool-OU7OZS0t.js';
12
12
  import { VectorSearchIndex } from '../vector-store/index.js';
13
13
  import '../types-IB2e9u5M.js';
14
+ import 'zod';
14
15
  import '@modelcontextprotocol/sdk/client/sse.js';
15
16
  import '@modelcontextprotocol/sdk/client/stdio.js';
16
17
  import '@modelcontextprotocol/sdk/client/streamableHttp.js';
17
- import 'zod';
18
18
 
19
19
  declare class AgentBuilder<M extends CompletionModel = CompletionModel> {
20
20
  private readonly completionModel;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  AgentBuilder
3
- } from "../chunk-365W6FJD.js";
3
+ } from "../chunk-GNNNJZ2P.js";
4
4
  import {
5
5
  MaxTurnsError,
6
6
  PromptCancelledError,
@@ -10,16 +10,17 @@ import {
10
10
  runControl,
11
11
  skipTool,
12
12
  toolCallControl
13
- } from "../chunk-ORLEOXD7.js";
13
+ } from "../chunk-YLN6QF5S.js";
14
14
  import "../chunk-XUUY2L2D.js";
15
15
  import "../chunk-XXT2UCAR.js";
16
16
  import "../chunk-YK4WAAS4.js";
17
17
  import {
18
18
  createMiddleware,
19
19
  createToolMiddleware
20
- } from "../chunk-S7EOE6EC.js";
21
- import "../chunk-P425B6GR.js";
22
- import "../chunk-6GJDBBDC.js";
20
+ } from "../chunk-AER5FGPK.js";
21
+ import "../chunk-I47EHI45.js";
22
+ import "../chunk-ZQQYFVO5.js";
23
+ import "../chunk-WQKHFADH.js";
23
24
  import "../chunk-EFGX3EX5.js";
24
25
  import "../chunk-OIMLU4SF.js";
25
26
  export {
@@ -1,8 +1,8 @@
1
- import { M as Message, U as Usage, c as CompletionResponse, j as ToolResultContent, C as CompletionModel, t as ReasoningContentType, f as ToolCall, D as Document, e as JsonValue, m as ToolChoice, J as JsonObject } from './types-C54aNoCd.js';
1
+ import { M as Message, U as Usage, c as CompletionResponse, k as ToolResultContent, C as CompletionModel, v as ReasoningContentType, f as ToolCall, D as Document, e as JsonValue, n as ToolChoice, J as JsonObject } from './types-_boSLqrx.js';
2
2
  import { MemoryContext, MemoryRegistration, SessionOptions } from './memory/index.js';
3
3
  import { AgentTraceOptions, AgentTraceInfo, AgentObserverRegistration } from './observability/index.js';
4
- import { A as AgentMiddleware, e as ToolMiddleware, l as ToolSet, k as ToolSearchDocument } from './middleware-qfm1EFKK.js';
5
- import { T as Tool, A as AnyTool, c as ToolCallContext, N as NormalizedToolOutput } from './tool-C3ciF-VG.js';
4
+ import { A as AgentMiddleware, e as ToolMiddleware, l as ToolSet, k as ToolSearchDocument } from './middleware-D6Wu0AcC.js';
5
+ import { T as Tool, A as AnyTool, c as ToolCallContext, N as NormalizedToolOutput } from './tool-OU7OZS0t.js';
6
6
  import { VectorFilter, VectorSearchResult, VectorSearchIndex } from './vector-store/index.js';
7
7
 
8
8
  type HookAction = {
@@ -1,4 +1,4 @@
1
- import { e as JsonValue } from '../types-C54aNoCd.js';
1
+ import { e as JsonValue } from '../types-_boSLqrx.js';
2
2
 
3
3
  type AudioGenerationRequest = {
4
4
  text: string;
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  AgentBuilder
3
- } from "./chunk-365W6FJD.js";
3
+ } from "./chunk-GNNNJZ2P.js";
4
4
  import {
5
5
  createTool
6
- } from "./chunk-P425B6GR.js";
6
+ } from "./chunk-I47EHI45.js";
7
7
  import {
8
8
  CompletionCapabilityError,
9
9
  CompletionRequestBuilder,
10
10
  Message,
11
11
  Usage
12
- } from "./chunk-6GJDBBDC.js";
12
+ } from "./chunk-ZQQYFVO5.js";
13
13
 
14
14
  // src/extractor/extractor.ts
15
15
  var SUBMIT_TOOL_NAME = "submit";
@@ -139,4 +139,4 @@ export {
139
139
  Extractor,
140
140
  ExtractorBuilder
141
141
  };
142
- //# sourceMappingURL=chunk-Z7HY4WU7.js.map
142
+ //# sourceMappingURL=chunk-2SSND6H4.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  InMemoryVectorStore,
3
3
  createTool
4
- } from "./chunk-P425B6GR.js";
4
+ } from "./chunk-I47EHI45.js";
5
5
  import {
6
6
  embedDocuments
7
7
  } from "./chunk-EFGX3EX5.js";
@@ -241,4 +241,4 @@ export {
241
241
  createToolMiddleware,
242
242
  createThinkTool
243
243
  };
244
- //# sourceMappingURL=chunk-S7EOE6EC.js.map
244
+ //# sourceMappingURL=chunk-AER5FGPK.js.map
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  Agent,
3
3
  normalizeAgentId
4
- } from "./chunk-ORLEOXD7.js";
4
+ } from "./chunk-YLN6QF5S.js";
5
5
  import {
6
6
  resolveMemoryOptions
7
7
  } from "./chunk-XXT2UCAR.js";
8
8
  import {
9
9
  ToolSet
10
- } from "./chunk-S7EOE6EC.js";
10
+ } from "./chunk-AER5FGPK.js";
11
11
  import {
12
12
  toProviderJsonSchema
13
- } from "./chunk-P425B6GR.js";
13
+ } from "./chunk-WQKHFADH.js";
14
14
 
15
15
  // src/agent/builder.ts
16
16
  var AgentBuilder = class {
@@ -197,4 +197,4 @@ var AgentBuilder = class {
197
197
  export {
198
198
  AgentBuilder
199
199
  };
200
- //# sourceMappingURL=chunk-365W6FJD.js.map
200
+ //# sourceMappingURL=chunk-GNNNJZ2P.js.map
@@ -1,18 +1,13 @@
1
+ import {
2
+ toProviderJsonSchema
3
+ } from "./chunk-WQKHFADH.js";
1
4
  import {
2
5
  cosineSimilarity,
3
6
  embedText
4
7
  } from "./chunk-EFGX3EX5.js";
5
8
 
6
9
  // src/vector-store/index.ts
7
- import { z as z2 } from "zod";
8
-
9
- // src/schema/zod-schema.ts
10
10
  import { z } from "zod";
11
- function toProviderJsonSchema(schema) {
12
- const jsonSchema = z.toJSONSchema(schema);
13
- const { $schema: _schema, ...providerSchema } = jsonSchema;
14
- return providerSchema;
15
- }
16
11
 
17
12
  // src/tool/create-tool.ts
18
13
  function createTool(options) {
@@ -281,16 +276,16 @@ function createVectorSearchTool(index, options) {
281
276
  return createTool({
282
277
  name: options.name,
283
278
  description: options.description ?? "Search a vector store for documents relevant to the provided query.",
284
- input: z2.object({
285
- query: z2.string().describe("The query string to search for relevant documents."),
286
- topK: z2.number().int().positive().optional().describe("The maximum number of results.")
279
+ input: z.object({
280
+ query: z.string().describe("The query string to search for relevant documents."),
281
+ topK: z.number().int().positive().optional().describe("The maximum number of results.")
287
282
  }),
288
- output: z2.array(
289
- z2.object({
290
- score: z2.number(),
291
- id: z2.string(),
292
- document: z2.any(),
293
- metadata: z2.record(z2.string(), z2.union([z2.string(), z2.number(), z2.boolean(), z2.null()])).optional()
283
+ output: z.array(
284
+ z.object({
285
+ score: z.number(),
286
+ id: z.string(),
287
+ document: z.any(),
288
+ metadata: z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.null()])).optional()
294
289
  })
295
290
  ),
296
291
  execute: ({ query, topK }) => index.search({
@@ -322,11 +317,10 @@ function validateEmbeddingDimension(expectedDimension, embedding, id) {
322
317
  }
323
318
 
324
319
  export {
325
- toProviderJsonSchema,
326
320
  createTool,
327
321
  vectorFilter,
328
322
  InMemoryVectorStore,
329
323
  InMemoryVectorIndex,
330
324
  createVectorSearchTool
331
325
  };
332
- //# sourceMappingURL=chunk-P425B6GR.js.map
326
+ //# sourceMappingURL=chunk-I47EHI45.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vector-store/index.ts","../src/tool/create-tool.ts","../src/vector-store/filter.ts","../src/vector-store/lsh.ts"],"sourcesContent":["import { z } from \"zod\";\nimport {\n cosineSimilarity,\n type EmbeddedDocument,\n type Embedding,\n type EmbeddingModel,\n embedText,\n type VectorMetadata,\n} from \"../embeddings\";\nimport { createTool } from \"../tool/create-tool\";\nimport type { Tool } from \"../tool/tool\";\nimport { matchesVectorFilter, type VectorFilter } from \"./filter\";\nimport { LshIndex, type LshOptions } from \"./lsh\";\n\nexport { type VectorFilter, vectorFilter } from \"./filter\";\n\nexport type IndexStrategy = { type: \"bruteForce\" } | LshOptions;\n\nexport type VectorSearchRequest = {\n query: string;\n topK: number;\n threshold?: number | undefined;\n filter?: VectorFilter | undefined;\n};\n\nexport type VectorSearchResult<T = unknown, Metadata extends VectorMetadata = VectorMetadata> = {\n score: number;\n id: string;\n document: T;\n metadata?: Metadata | undefined;\n};\n\nexport type VectorInspectRequest = {\n limit: number;\n cursor?: string | undefined;\n filter?: VectorFilter | undefined;\n};\n\nexport type VectorInspectItem<T = unknown, Metadata extends VectorMetadata = VectorMetadata> = {\n id: string;\n document: T;\n metadata?: Metadata | undefined;\n};\n\nexport type VectorInspectPage<T = unknown, Metadata extends VectorMetadata = VectorMetadata> = {\n items: Array<VectorInspectItem<T, Metadata>>;\n nextCursor?: string | undefined;\n totalCount?: number | undefined;\n};\n\nexport interface VectorSearchIndex<T = unknown, Metadata extends VectorMetadata = VectorMetadata> {\n search(request: VectorSearchRequest): Promise<Array<VectorSearchResult<T, Metadata>>>;\n searchIds(request: VectorSearchRequest): Promise<Array<{ score: number; id: string }>>;\n asTool(options: VectorSearchToolOptions): Tool<{ query: string; topK?: number }, unknown>;\n inspect?(request: VectorInspectRequest): Promise<VectorInspectPage<T, Metadata>>;\n}\n\nexport type VectorSearchToolOptions = {\n name: string;\n description?: string | undefined;\n topK?: number | undefined;\n threshold?: number | undefined;\n filter?: VectorFilter | undefined;\n};\n\ntype StoredDocument<T, Metadata extends VectorMetadata> = EmbeddedDocument<T, Metadata>;\n\nexport class InMemoryVectorStore<T, Metadata extends VectorMetadata = VectorMetadata> {\n private readonly documents = new Map<string, StoredDocument<T, Metadata>>();\n private indexStrategy: IndexStrategy;\n private lshIndex: LshIndex | undefined;\n private embeddingDimension: number | undefined;\n\n constructor(options: { index?: IndexStrategy } = {}) {\n this.indexStrategy = options.index ?? { type: \"bruteForce\" };\n }\n\n static fromDocuments<T, Metadata extends VectorMetadata = VectorMetadata>(\n documents: Array<EmbeddedDocument<T, Metadata>>,\n options: { index?: IndexStrategy } = {},\n ): InMemoryVectorStore<T, Metadata> {\n const store = new InMemoryVectorStore<T, Metadata>(options);\n store.addDocuments(documents);\n return store;\n }\n\n addDocuments(documents: Array<EmbeddedDocument<T, Metadata>>): this {\n this.validateDocumentDimensions(documents);\n for (const document of documents) {\n this.documents.set(document.id, document);\n }\n this.rebuildLshIndex();\n return this;\n }\n\n get(id: string): StoredDocument<T, Metadata> | undefined {\n return this.documents.get(id);\n }\n\n values(): Array<StoredDocument<T, Metadata>> {\n return [...this.documents.values()];\n }\n\n len(): number {\n return this.documents.size;\n }\n\n isEmpty(): boolean {\n return this.documents.size === 0;\n }\n\n index(model: EmbeddingModel): InMemoryVectorIndex<T, Metadata> {\n return new InMemoryVectorIndex(model, this);\n }\n\n candidates(queryEmbedding: Embedding): Array<StoredDocument<T, Metadata>> {\n this.validateQueryDimension(queryEmbedding);\n if (this.indexStrategy.type !== \"lsh\" || this.lshIndex === undefined) {\n return this.values();\n }\n\n const candidateIds = this.lshIndex.query(queryEmbedding.vector);\n if (candidateIds.size === 0) {\n return this.values();\n }\n\n return [...candidateIds].flatMap((id) => {\n const document = this.documents.get(id);\n return document === undefined ? [] : [document];\n });\n }\n\n private rebuildLshIndex(): void {\n if (this.indexStrategy.type !== \"lsh\") {\n this.lshIndex = undefined;\n return;\n }\n\n const firstEmbedding = this.values().flatMap((document) => document.embeddings)[0];\n if (firstEmbedding === undefined) {\n this.lshIndex = undefined;\n return;\n }\n\n const index = new LshIndex(firstEmbedding.vector.length, this.indexStrategy);\n for (const document of this.documents.values()) {\n for (const embedding of document.embeddings) {\n index.insert(document.id, embedding.vector);\n }\n }\n this.lshIndex = index;\n }\n\n private validateDocumentDimensions(documents: Array<EmbeddedDocument<T, Metadata>>): void {\n let dimension = this.embeddingDimension;\n for (const document of documents) {\n for (const embedding of document.embeddings) {\n dimension = validateEmbeddingDimension(dimension, embedding, document.id);\n }\n }\n this.embeddingDimension = dimension;\n }\n\n private validateQueryDimension(queryEmbedding: Embedding): void {\n if (this.embeddingDimension === undefined) {\n return;\n }\n validateEmbeddingDimension(this.embeddingDimension, queryEmbedding, \"query\");\n }\n}\n\nexport class InMemoryVectorIndex<T, Metadata extends VectorMetadata = VectorMetadata>\n implements VectorSearchIndex<T, Metadata>\n{\n constructor(\n private readonly model: EmbeddingModel,\n private readonly store: InMemoryVectorStore<T, Metadata>,\n ) {}\n\n async search(request: VectorSearchRequest): Promise<Array<VectorSearchResult<T, Metadata>>> {\n const queryEmbedding = await embedText(this.model, request.query);\n return this.store\n .candidates(queryEmbedding)\n .filter((document) => matchesVectorFilter(document.metadata, request.filter))\n .flatMap((document) => {\n const score = bestScore(queryEmbedding, document.embeddings);\n if (score === undefined) {\n return [];\n }\n if (request.threshold !== undefined && score < request.threshold) {\n return [];\n }\n return [\n {\n score,\n id: document.id,\n document: document.document,\n ...(document.metadata === undefined ? {} : { metadata: document.metadata }),\n },\n ];\n })\n .sort((left, right) => right.score - left.score)\n .slice(0, Math.max(0, Math.trunc(request.topK)));\n }\n\n async searchIds(request: VectorSearchRequest): Promise<Array<{ score: number; id: string }>> {\n return (await this.search(request)).map(({ score, id }) => ({ score, id }));\n }\n\n async inspect(request: VectorInspectRequest): Promise<VectorInspectPage<T, Metadata>> {\n const limit = Math.max(0, Math.trunc(request.limit));\n const start = Math.max(0, Math.trunc(Number(request.cursor ?? \"0\")));\n const documents = this.store\n .values()\n .filter((document) => matchesVectorFilter(document.metadata, request.filter));\n const page = documents.slice(start, start + limit);\n const nextOffset = start + page.length;\n return {\n items: page.map((document) => ({\n id: document.id,\n document: document.document,\n ...(document.metadata === undefined ? {} : { metadata: document.metadata }),\n })),\n ...(nextOffset < documents.length ? { nextCursor: String(nextOffset) } : {}),\n totalCount: documents.length,\n };\n }\n\n asTool(options: VectorSearchToolOptions): Tool<{ query: string; topK?: number }, unknown> {\n return createVectorSearchTool(this, options);\n }\n}\n\nexport function createVectorSearchTool<T, Metadata extends VectorMetadata>(\n index: VectorSearchIndex<T, Metadata>,\n options: VectorSearchToolOptions,\n): Tool<{ query: string; topK?: number }, Array<VectorSearchResult<T, Metadata>>> {\n return createTool({\n name: options.name,\n description:\n options.description ?? \"Search a vector store for documents relevant to the provided query.\",\n input: z.object({\n query: z.string().describe(\"The query string to search for relevant documents.\"),\n topK: z.number().int().positive().optional().describe(\"The maximum number of results.\"),\n }),\n output: z.array(\n z.object({\n score: z.number(),\n id: z.string(),\n document: z.any(),\n metadata: z\n .record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.null()]))\n .optional(),\n }),\n ),\n execute: ({ query, topK }) =>\n index.search({\n query,\n topK: topK ?? options.topK ?? 5,\n threshold: options.threshold,\n filter: options.filter,\n }),\n }) as Tool<{ query: string; topK?: number }, Array<VectorSearchResult<T, Metadata>>>;\n}\n\nfunction bestScore(queryEmbedding: Embedding, embeddings: Embedding[]): number | undefined {\n let best: number | undefined;\n for (const embedding of embeddings) {\n const score = cosineSimilarity(queryEmbedding.vector, embedding.vector);\n best = best === undefined ? score : Math.max(best, score);\n }\n return best;\n}\n\nfunction validateEmbeddingDimension(\n expectedDimension: number | undefined,\n embedding: Embedding,\n id: string,\n): number {\n if (expectedDimension === undefined) {\n return embedding.vector.length;\n }\n if (embedding.vector.length !== expectedDimension) {\n throw new Error(\n `Vector dimension mismatch: expected ${expectedDimension} dimensions but received ${embedding.vector.length} for ${id}`,\n );\n }\n return expectedDimension;\n}\n","import type { z } from \"zod\";\nimport { toProviderJsonSchema, type ZodSchema } from \"../schema/zod-schema\";\nimport type { Tool, ToolApprovalPolicy, ToolCallContext } from \"./tool\";\n\nexport type CreateToolOptions<\n InputSchema extends ZodSchema,\n OutputSchema extends ZodSchema | undefined = undefined,\n Output = unknown,\n> = {\n name: string;\n description: string;\n input: InputSchema;\n output?: OutputSchema;\n approval?: ToolApprovalPolicy<z.output<InputSchema>>;\n execute(\n args: z.output<InputSchema>,\n context: ToolCallContext,\n ): OutputSchema extends ZodSchema\n ? z.input<OutputSchema> | Promise<z.input<OutputSchema>>\n : Output | Promise<Output>;\n};\n\ntype CreateToolOutput<\n OutputSchema extends ZodSchema | undefined,\n Output,\n> = OutputSchema extends ZodSchema ? z.output<OutputSchema> : Output;\n\nexport function createTool<InputSchema extends ZodSchema, Output = unknown>(\n options: CreateToolOptions<InputSchema, undefined, Output> & { output?: undefined },\n): Tool<z.output<InputSchema>, Output>;\n\nexport function createTool<InputSchema extends ZodSchema, OutputSchema extends ZodSchema>(\n options: CreateToolOptions<InputSchema, OutputSchema>,\n): Tool<z.output<InputSchema>, z.output<OutputSchema>>;\n\nexport function createTool<\n InputSchema extends ZodSchema,\n OutputSchema extends ZodSchema | undefined = undefined,\n Output = unknown,\n>(\n options: CreateToolOptions<InputSchema, OutputSchema, Output>,\n): Tool<z.output<InputSchema>, CreateToolOutput<OutputSchema, Output>> {\n const parameters = toProviderJsonSchema(options.input);\n\n return {\n name: options.name,\n ...(options.approval === undefined ? {} : { approval: options.approval }),\n definition() {\n return {\n name: options.name,\n description: options.description,\n parameters,\n };\n },\n async call(args, context = {}): Promise<CreateToolOutput<OutputSchema, Output>> {\n const parsedArgs = options.input.parse(args);\n const result = await options.execute(parsedArgs, context);\n return (\n options.output === undefined ? result : options.output.parse(result)\n ) as CreateToolOutput<OutputSchema, Output>;\n },\n parseApprovalArgs(args): z.output<InputSchema> {\n return options.input.parse(args);\n },\n };\n}\n","import type { VectorMetadata, VectorMetadataValue } from \"../embeddings\";\n\nexport type VectorFilter =\n | { type: \"eq\"; key: string; value: VectorMetadataValue }\n | { type: \"gt\"; key: string; value: VectorMetadataValue }\n | { type: \"lt\"; key: string; value: VectorMetadataValue }\n | { type: \"and\"; filters: [VectorFilter, VectorFilter] }\n | { type: \"or\"; filters: [VectorFilter, VectorFilter] };\n\nexport const vectorFilter = {\n eq(key: string, value: VectorMetadataValue): VectorFilter {\n return { type: \"eq\", key, value };\n },\n gt(key: string, value: VectorMetadataValue): VectorFilter {\n return { type: \"gt\", key, value };\n },\n lt(key: string, value: VectorMetadataValue): VectorFilter {\n return { type: \"lt\", key, value };\n },\n and(left: VectorFilter, right: VectorFilter): VectorFilter {\n return { type: \"and\", filters: [left, right] };\n },\n or(left: VectorFilter, right: VectorFilter): VectorFilter {\n return { type: \"or\", filters: [left, right] };\n },\n};\n\nexport function matchesVectorFilter(\n metadata: VectorMetadata | undefined,\n filter: VectorFilter | undefined,\n): boolean {\n if (filter === undefined) {\n return true;\n }\n if (metadata === undefined) {\n return false;\n }\n\n switch (filter.type) {\n case \"eq\":\n return metadata[filter.key] === filter.value;\n case \"gt\":\n return compare(metadata[filter.key], filter.value) > 0;\n case \"lt\":\n return compare(metadata[filter.key], filter.value) < 0;\n case \"and\":\n return (\n matchesVectorFilter(metadata, filter.filters[0]) &&\n matchesVectorFilter(metadata, filter.filters[1])\n );\n case \"or\":\n return (\n matchesVectorFilter(metadata, filter.filters[0]) ||\n matchesVectorFilter(metadata, filter.filters[1])\n );\n }\n}\n\nfunction compare(left: VectorMetadataValue | undefined, right: VectorMetadataValue): number {\n if (typeof left === \"number\" && typeof right === \"number\") {\n return left - right;\n }\n if (typeof left === \"string\" && typeof right === \"string\") {\n return left.localeCompare(right);\n }\n if (typeof left === \"boolean\" && typeof right === \"boolean\") {\n return Number(left) - Number(right);\n }\n return 0;\n}\n","export type LshOptions = {\n type: \"lsh\";\n numTables: number;\n numHyperplanes: number;\n seed?: number | undefined;\n};\n\nexport class LshIndex {\n private readonly hyperplanes: number[][];\n private readonly tables: Array<Map<string, Set<string>>>;\n\n constructor(\n dimensions: number,\n private readonly options: LshOptions,\n ) {\n const rng = seededRandom(options.seed ?? 42);\n this.hyperplanes = [];\n for (let index = 0; index < options.numTables * options.numHyperplanes; index += 1) {\n const plane = Array.from({ length: dimensions }, () => rng() * 2 - 1);\n const norm = Math.sqrt(plane.reduce((sum, value) => sum + value ** 2, 0));\n this.hyperplanes.push(norm === 0 ? plane : plane.map((value) => value / norm));\n }\n this.tables = Array.from({ length: options.numTables }, () => new Map());\n }\n\n insert(id: string, vector: number[]): void {\n for (let table = 0; table < this.options.numTables; table += 1) {\n const hash = this.hash(vector, table);\n const bucket = this.tables[table]?.get(hash) ?? new Set<string>();\n bucket.add(id);\n this.tables[table]?.set(hash, bucket);\n }\n }\n\n query(vector: number[]): Set<string> {\n const candidates = new Set<string>();\n for (let table = 0; table < this.options.numTables; table += 1) {\n const hash = this.hash(vector, table);\n for (const id of this.tables[table]?.get(hash) ?? []) {\n candidates.add(id);\n }\n }\n return candidates;\n }\n\n private hash(vector: number[], table: number): string {\n let hash = \"\";\n const start = table * this.options.numHyperplanes;\n for (let offset = 0; offset < this.options.numHyperplanes; offset += 1) {\n const plane = this.hyperplanes[start + offset] as number[];\n const dot = vector.reduce((sum, value, index) => sum + value * (plane[index] ?? 0), 0);\n hash += dot >= 0 ? \"1\" : \"0\";\n }\n return hash;\n }\n}\n\nfunction seededRandom(seed: number): () => number {\n let state = seed >>> 0;\n return () => {\n state = (state * 1664525 + 1013904223) >>> 0;\n return state / 0x100000000;\n };\n}\n"],"mappings":";;;;;;;;;AAAA,SAAS,SAAS;;;ACmCX,SAAS,WAKd,SACqE;AACrE,QAAM,aAAa,qBAAqB,QAAQ,KAAK;AAErD,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,GAAI,QAAQ,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,QAAQ,SAAS;AAAA,IACvE,aAAa;AACX,aAAO;AAAA,QACL,MAAM,QAAQ;AAAA,QACd,aAAa,QAAQ;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAM,KAAK,MAAM,UAAU,CAAC,GAAoD;AAC9E,YAAM,aAAa,QAAQ,MAAM,MAAM,IAAI;AAC3C,YAAM,SAAS,MAAM,QAAQ,QAAQ,YAAY,OAAO;AACxD,aACE,QAAQ,WAAW,SAAY,SAAS,QAAQ,OAAO,MAAM,MAAM;AAAA,IAEvE;AAAA,IACA,kBAAkB,MAA6B;AAC7C,aAAO,QAAQ,MAAM,MAAM,IAAI;AAAA,IACjC;AAAA,EACF;AACF;;;ACxDO,IAAM,eAAe;AAAA,EAC1B,GAAG,KAAa,OAA0C;AACxD,WAAO,EAAE,MAAM,MAAM,KAAK,MAAM;AAAA,EAClC;AAAA,EACA,GAAG,KAAa,OAA0C;AACxD,WAAO,EAAE,MAAM,MAAM,KAAK,MAAM;AAAA,EAClC;AAAA,EACA,GAAG,KAAa,OAA0C;AACxD,WAAO,EAAE,MAAM,MAAM,KAAK,MAAM;AAAA,EAClC;AAAA,EACA,IAAI,MAAoB,OAAmC;AACzD,WAAO,EAAE,MAAM,OAAO,SAAS,CAAC,MAAM,KAAK,EAAE;AAAA,EAC/C;AAAA,EACA,GAAG,MAAoB,OAAmC;AACxD,WAAO,EAAE,MAAM,MAAM,SAAS,CAAC,MAAM,KAAK,EAAE;AAAA,EAC9C;AACF;AAEO,SAAS,oBACd,UACA,QACS;AACT,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AACA,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AAEA,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,SAAS,OAAO,GAAG,MAAM,OAAO;AAAA,IACzC,KAAK;AACH,aAAO,QAAQ,SAAS,OAAO,GAAG,GAAG,OAAO,KAAK,IAAI;AAAA,IACvD,KAAK;AACH,aAAO,QAAQ,SAAS,OAAO,GAAG,GAAG,OAAO,KAAK,IAAI;AAAA,IACvD,KAAK;AACH,aACE,oBAAoB,UAAU,OAAO,QAAQ,CAAC,CAAC,KAC/C,oBAAoB,UAAU,OAAO,QAAQ,CAAC,CAAC;AAAA,IAEnD,KAAK;AACH,aACE,oBAAoB,UAAU,OAAO,QAAQ,CAAC,CAAC,KAC/C,oBAAoB,UAAU,OAAO,QAAQ,CAAC,CAAC;AAAA,EAErD;AACF;AAEA,SAAS,QAAQ,MAAuC,OAAoC;AAC1F,MAAI,OAAO,SAAS,YAAY,OAAO,UAAU,UAAU;AACzD,WAAO,OAAO;AAAA,EAChB;AACA,MAAI,OAAO,SAAS,YAAY,OAAO,UAAU,UAAU;AACzD,WAAO,KAAK,cAAc,KAAK;AAAA,EACjC;AACA,MAAI,OAAO,SAAS,aAAa,OAAO,UAAU,WAAW;AAC3D,WAAO,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,EACpC;AACA,SAAO;AACT;;;AC9DO,IAAM,WAAN,MAAe;AAAA,EAIpB,YACE,YACiB,SACjB;AADiB;AAEjB,UAAM,MAAM,aAAa,QAAQ,QAAQ,EAAE;AAC3C,SAAK,cAAc,CAAC;AACpB,aAAS,QAAQ,GAAG,QAAQ,QAAQ,YAAY,QAAQ,gBAAgB,SAAS,GAAG;AAClF,YAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,WAAW,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC;AACpE,YAAM,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC,KAAK,UAAU,MAAM,SAAS,GAAG,CAAC,CAAC;AACxE,WAAK,YAAY,KAAK,SAAS,IAAI,QAAQ,MAAM,IAAI,CAAC,UAAU,QAAQ,IAAI,CAAC;AAAA,IAC/E;AACA,SAAK,SAAS,MAAM,KAAK,EAAE,QAAQ,QAAQ,UAAU,GAAG,MAAM,oBAAI,IAAI,CAAC;AAAA,EACzE;AAAA,EAVmB;AAAA,EALF;AAAA,EACA;AAAA,EAgBjB,OAAO,IAAY,QAAwB;AACzC,aAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,WAAW,SAAS,GAAG;AAC9D,YAAM,OAAO,KAAK,KAAK,QAAQ,KAAK;AACpC,YAAM,SAAS,KAAK,OAAO,KAAK,GAAG,IAAI,IAAI,KAAK,oBAAI,IAAY;AAChE,aAAO,IAAI,EAAE;AACb,WAAK,OAAO,KAAK,GAAG,IAAI,MAAM,MAAM;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAM,QAA+B;AACnC,UAAM,aAAa,oBAAI,IAAY;AACnC,aAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,WAAW,SAAS,GAAG;AAC9D,YAAM,OAAO,KAAK,KAAK,QAAQ,KAAK;AACpC,iBAAW,MAAM,KAAK,OAAO,KAAK,GAAG,IAAI,IAAI,KAAK,CAAC,GAAG;AACpD,mBAAW,IAAI,EAAE;AAAA,MACnB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,KAAK,QAAkB,OAAuB;AACpD,QAAI,OAAO;AACX,UAAM,QAAQ,QAAQ,KAAK,QAAQ;AACnC,aAAS,SAAS,GAAG,SAAS,KAAK,QAAQ,gBAAgB,UAAU,GAAG;AACtE,YAAM,QAAQ,KAAK,YAAY,QAAQ,MAAM;AAC7C,YAAM,MAAM,OAAO,OAAO,CAAC,KAAK,OAAO,UAAU,MAAM,SAAS,MAAM,KAAK,KAAK,IAAI,CAAC;AACrF,cAAQ,OAAO,IAAI,MAAM;AAAA,IAC3B;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,aAAa,MAA4B;AAChD,MAAI,QAAQ,SAAS;AACrB,SAAO,MAAM;AACX,YAAS,QAAQ,UAAU,eAAgB;AAC3C,WAAO,QAAQ;AAAA,EACjB;AACF;;;AHIO,IAAM,sBAAN,MAAM,qBAAyE;AAAA,EACnE,YAAY,oBAAI,IAAyC;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,UAAqC,CAAC,GAAG;AACnD,SAAK,gBAAgB,QAAQ,SAAS,EAAE,MAAM,aAAa;AAAA,EAC7D;AAAA,EAEA,OAAO,cACL,WACA,UAAqC,CAAC,GACJ;AAClC,UAAM,QAAQ,IAAI,qBAAiC,OAAO;AAC1D,UAAM,aAAa,SAAS;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,WAAuD;AAClE,SAAK,2BAA2B,SAAS;AACzC,eAAW,YAAY,WAAW;AAChC,WAAK,UAAU,IAAI,SAAS,IAAI,QAAQ;AAAA,IAC1C;AACA,SAAK,gBAAgB;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,IAAqD;AACvD,WAAO,KAAK,UAAU,IAAI,EAAE;AAAA,EAC9B;AAAA,EAEA,SAA6C;AAC3C,WAAO,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC;AAAA,EACpC;AAAA,EAEA,MAAc;AACZ,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,UAAmB;AACjB,WAAO,KAAK,UAAU,SAAS;AAAA,EACjC;AAAA,EAEA,MAAM,OAAyD;AAC7D,WAAO,IAAI,oBAAoB,OAAO,IAAI;AAAA,EAC5C;AAAA,EAEA,WAAW,gBAA+D;AACxE,SAAK,uBAAuB,cAAc;AAC1C,QAAI,KAAK,cAAc,SAAS,SAAS,KAAK,aAAa,QAAW;AACpE,aAAO,KAAK,OAAO;AAAA,IACrB;AAEA,UAAM,eAAe,KAAK,SAAS,MAAM,eAAe,MAAM;AAC9D,QAAI,aAAa,SAAS,GAAG;AAC3B,aAAO,KAAK,OAAO;AAAA,IACrB;AAEA,WAAO,CAAC,GAAG,YAAY,EAAE,QAAQ,CAAC,OAAO;AACvC,YAAM,WAAW,KAAK,UAAU,IAAI,EAAE;AACtC,aAAO,aAAa,SAAY,CAAC,IAAI,CAAC,QAAQ;AAAA,IAChD,CAAC;AAAA,EACH;AAAA,EAEQ,kBAAwB;AAC9B,QAAI,KAAK,cAAc,SAAS,OAAO;AACrC,WAAK,WAAW;AAChB;AAAA,IACF;AAEA,UAAM,iBAAiB,KAAK,OAAO,EAAE,QAAQ,CAAC,aAAa,SAAS,UAAU,EAAE,CAAC;AACjF,QAAI,mBAAmB,QAAW;AAChC,WAAK,WAAW;AAChB;AAAA,IACF;AAEA,UAAM,QAAQ,IAAI,SAAS,eAAe,OAAO,QAAQ,KAAK,aAAa;AAC3E,eAAW,YAAY,KAAK,UAAU,OAAO,GAAG;AAC9C,iBAAW,aAAa,SAAS,YAAY;AAC3C,cAAM,OAAO,SAAS,IAAI,UAAU,MAAM;AAAA,MAC5C;AAAA,IACF;AACA,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,2BAA2B,WAAuD;AACxF,QAAI,YAAY,KAAK;AACrB,eAAW,YAAY,WAAW;AAChC,iBAAW,aAAa,SAAS,YAAY;AAC3C,oBAAY,2BAA2B,WAAW,WAAW,SAAS,EAAE;AAAA,MAC1E;AAAA,IACF;AACA,SAAK,qBAAqB;AAAA,EAC5B;AAAA,EAEQ,uBAAuB,gBAAiC;AAC9D,QAAI,KAAK,uBAAuB,QAAW;AACzC;AAAA,IACF;AACA,+BAA2B,KAAK,oBAAoB,gBAAgB,OAAO;AAAA,EAC7E;AACF;AAEO,IAAM,sBAAN,MAEP;AAAA,EACE,YACmB,OACA,OACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAGnB,MAAM,OAAO,SAA+E;AAC1F,UAAM,iBAAiB,MAAM,UAAU,KAAK,OAAO,QAAQ,KAAK;AAChE,WAAO,KAAK,MACT,WAAW,cAAc,EACzB,OAAO,CAAC,aAAa,oBAAoB,SAAS,UAAU,QAAQ,MAAM,CAAC,EAC3E,QAAQ,CAAC,aAAa;AACrB,YAAM,QAAQ,UAAU,gBAAgB,SAAS,UAAU;AAC3D,UAAI,UAAU,QAAW;AACvB,eAAO,CAAC;AAAA,MACV;AACA,UAAI,QAAQ,cAAc,UAAa,QAAQ,QAAQ,WAAW;AAChE,eAAO,CAAC;AAAA,MACV;AACA,aAAO;AAAA,QACL;AAAA,UACE;AAAA,UACA,IAAI,SAAS;AAAA,UACb,UAAU,SAAS;AAAA,UACnB,GAAI,SAAS,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,SAAS,SAAS;AAAA,QAC3E;AAAA,MACF;AAAA,IACF,CAAC,EACA,KAAK,CAAC,MAAM,UAAU,MAAM,QAAQ,KAAK,KAAK,EAC9C,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,IAAI,CAAC,CAAC;AAAA,EACnD;AAAA,EAEA,MAAM,UAAU,SAA6E;AAC3F,YAAQ,MAAM,KAAK,OAAO,OAAO,GAAG,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,GAAG,EAAE;AAAA,EAC5E;AAAA,EAEA,MAAM,QAAQ,SAAwE;AACpF,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,KAAK,CAAC;AACnD,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,QAAQ,UAAU,GAAG,CAAC,CAAC;AACnE,UAAM,YAAY,KAAK,MACpB,OAAO,EACP,OAAO,CAAC,aAAa,oBAAoB,SAAS,UAAU,QAAQ,MAAM,CAAC;AAC9E,UAAM,OAAO,UAAU,MAAM,OAAO,QAAQ,KAAK;AACjD,UAAM,aAAa,QAAQ,KAAK;AAChC,WAAO;AAAA,MACL,OAAO,KAAK,IAAI,CAAC,cAAc;AAAA,QAC7B,IAAI,SAAS;AAAA,QACb,UAAU,SAAS;AAAA,QACnB,GAAI,SAAS,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,SAAS,SAAS;AAAA,MAC3E,EAAE;AAAA,MACF,GAAI,aAAa,UAAU,SAAS,EAAE,YAAY,OAAO,UAAU,EAAE,IAAI,CAAC;AAAA,MAC1E,YAAY,UAAU;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,OAAO,SAAmF;AACxF,WAAO,uBAAuB,MAAM,OAAO;AAAA,EAC7C;AACF;AAEO,SAAS,uBACd,OACA,SACgF;AAChF,SAAO,WAAW;AAAA,IAChB,MAAM,QAAQ;AAAA,IACd,aACE,QAAQ,eAAe;AAAA,IACzB,OAAO,EAAE,OAAO;AAAA,MACd,OAAO,EAAE,OAAO,EAAE,SAAS,oDAAoD;AAAA,MAC/E,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,gCAAgC;AAAA,IACxF,CAAC;AAAA,IACD,QAAQ,EAAE;AAAA,MACR,EAAE,OAAO;AAAA,QACP,OAAO,EAAE,OAAO;AAAA,QAChB,IAAI,EAAE,OAAO;AAAA,QACb,UAAU,EAAE,IAAI;AAAA,QAChB,UAAU,EACP,OAAO,EAAE,OAAO,GAAG,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,GAAG,EAAE,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAC3E,SAAS;AAAA,MACd,CAAC;AAAA,IACH;AAAA,IACA,SAAS,CAAC,EAAE,OAAO,KAAK,MACtB,MAAM,OAAO;AAAA,MACX;AAAA,MACA,MAAM,QAAQ,QAAQ,QAAQ;AAAA,MAC9B,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACL,CAAC;AACH;AAEA,SAAS,UAAU,gBAA2B,YAA6C;AACzF,MAAI;AACJ,aAAW,aAAa,YAAY;AAClC,UAAM,QAAQ,iBAAiB,eAAe,QAAQ,UAAU,MAAM;AACtE,WAAO,SAAS,SAAY,QAAQ,KAAK,IAAI,MAAM,KAAK;AAAA,EAC1D;AACA,SAAO;AACT;AAEA,SAAS,2BACP,mBACA,WACA,IACQ;AACR,MAAI,sBAAsB,QAAW;AACnC,WAAO,UAAU,OAAO;AAAA,EAC1B;AACA,MAAI,UAAU,OAAO,WAAW,mBAAmB;AACjD,UAAM,IAAI;AAAA,MACR,uCAAuC,iBAAiB,4BAA4B,UAAU,OAAO,MAAM,QAAQ,EAAE;AAAA,IACvH;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-YK4WAAS4.js";
4
4
  import {
5
5
  createTool
6
- } from "./chunk-P425B6GR.js";
6
+ } from "./chunk-I47EHI45.js";
7
7
 
8
8
  // src/skills/instructions.ts
9
9
  function skillInstructions(skills) {
@@ -395,4 +395,4 @@ export {
395
395
  SkillValidationError,
396
396
  skill
397
397
  };
398
- //# sourceMappingURL=chunk-DUP7FMAF.js.map
398
+ //# sourceMappingURL=chunk-SHHSMV7O.js.map
@@ -0,0 +1,12 @@
1
+ // src/schema/zod-schema.ts
2
+ import { z } from "zod";
3
+ function toProviderJsonSchema(schema) {
4
+ const jsonSchema = z.toJSONSchema(schema);
5
+ const { $schema: _schema, ...providerSchema } = jsonSchema;
6
+ return providerSchema;
7
+ }
8
+
9
+ export {
10
+ toProviderJsonSchema
11
+ };
12
+ //# sourceMappingURL=chunk-WQKHFADH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema/zod-schema.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { JsonObject } from \"../completion/index\";\n\nexport type ZodSchema<T = unknown> = z.ZodType<T>;\n\nexport function toProviderJsonSchema(schema: z.ZodType): JsonObject {\n const jsonSchema = z.toJSONSchema(schema) as JsonObject;\n const { $schema: _schema, ...providerSchema } = jsonSchema;\n return providerSchema;\n}\n"],"mappings":";AAAA,SAAS,SAAS;AAKX,SAAS,qBAAqB,QAA+B;AAClE,QAAM,aAAa,EAAE,aAAa,MAAM;AACxC,QAAM,EAAE,SAAS,SAAS,GAAG,eAAe,IAAI;AAChD,SAAO;AACT;","names":[]}
@@ -7,10 +7,10 @@ import {
7
7
  import {
8
8
  ToolSet,
9
9
  toolResultContentToText
10
- } from "./chunk-S7EOE6EC.js";
10
+ } from "./chunk-AER5FGPK.js";
11
11
  import {
12
12
  createTool
13
- } from "./chunk-P425B6GR.js";
13
+ } from "./chunk-I47EHI45.js";
14
14
  import {
15
15
  CompletionRequestBuilder,
16
16
  Message,
@@ -18,7 +18,7 @@ import {
18
18
  Usage,
19
19
  assertCompletionRequestSupported,
20
20
  textFromAssistantContent
21
- } from "./chunk-6GJDBBDC.js";
21
+ } from "./chunk-ZQQYFVO5.js";
22
22
  import {
23
23
  mapWithConcurrency
24
24
  } from "./chunk-OIMLU4SF.js";
@@ -1752,4 +1752,4 @@ export {
1752
1752
  Agent,
1753
1753
  AgentSession
1754
1754
  };
1755
- //# sourceMappingURL=chunk-ORLEOXD7.js.map
1755
+ //# sourceMappingURL=chunk-YLN6QF5S.js.map
@@ -1,3 +1,7 @@
1
+ import {
2
+ toProviderJsonSchema
3
+ } from "./chunk-WQKHFADH.js";
4
+
1
5
  // src/completion/types.ts
2
6
  var UserContent = {
3
7
  text(text) {
@@ -42,6 +46,31 @@ var ToolContent = {
42
46
  return callId === void 0 ? { type: "tool_result", id, content: normalized } : { type: "tool_result", id, callId, content: normalized };
43
47
  }
44
48
  };
49
+ function serializeToolResultOutput(output) {
50
+ if (typeof output === "string") {
51
+ return output;
52
+ }
53
+ try {
54
+ const serialized = JSON.stringify(output);
55
+ return serialized === void 0 ? String(output) : serialized;
56
+ } catch {
57
+ return String(output);
58
+ }
59
+ }
60
+ function isToolResultContentArray(value) {
61
+ return Array.isArray(value) && value.length > 0 && value.every((item) => {
62
+ if (typeof item !== "object" || item === null || !("type" in item)) {
63
+ return false;
64
+ }
65
+ if (item.type === "text") {
66
+ return "text" in item && typeof item.text === "string";
67
+ }
68
+ if (item.type === "image") {
69
+ return "data" in item && typeof item.data === "string" && (!("mediaType" in item) || item.mediaType === void 0 || typeof item.mediaType === "string");
70
+ }
71
+ return false;
72
+ });
73
+ }
45
74
  var AssistantContent = {
46
75
  text(text) {
47
76
  return { type: "text", text };
@@ -123,6 +152,10 @@ var Message = {
123
152
  role: "tool",
124
153
  content: Array.isArray(content) ? content : [content]
125
154
  };
155
+ },
156
+ toolResult(id, output, options = {}) {
157
+ const content = isToolResultContentArray(output) ? output : serializeToolResultOutput(output);
158
+ return Message.tool(ToolContent.toolResult(id, content, options.callId));
126
159
  }
127
160
  };
128
161
  var Usage = {
@@ -189,6 +222,93 @@ function requestHasFileDocumentInput(request) {
189
222
  );
190
223
  }
191
224
 
225
+ // src/completion/create-completion.ts
226
+ function createCompletion(model, options) {
227
+ return sendCompletion(model, options);
228
+ }
229
+ function createCompletionStream(model, options) {
230
+ const request = toCompletionRequest(options);
231
+ if (!isStreamingCompletionModel(model) || !model.capabilities.streaming) {
232
+ throw new Error("This completion model does not support streaming");
233
+ }
234
+ assertCompletionRequestSupported(model, request, { streaming: true });
235
+ return model.streamCompletion(request);
236
+ }
237
+ async function createParsedCompletion(model, options) {
238
+ const { schema, ...completionOptions } = options;
239
+ const request = toCompletionRequest(
240
+ {
241
+ ...completionOptions,
242
+ outputSchema: toProviderJsonSchema(schema)
243
+ },
244
+ "createParsedCompletion"
245
+ );
246
+ assertCompletionRequestSupported(model, request);
247
+ const response = await model.completion(request);
248
+ const text = textFromAssistantContent(response.choice);
249
+ return {
250
+ data: parseCompletionData(text, schema),
251
+ text,
252
+ content: response.choice,
253
+ usage: response.usage,
254
+ response
255
+ };
256
+ }
257
+ async function sendCompletion(model, options) {
258
+ const request = toCompletionRequest(options);
259
+ assertCompletionRequestSupported(model, request);
260
+ const response = await model.completion(request);
261
+ return {
262
+ text: textFromAssistantContent(response.choice),
263
+ content: response.choice,
264
+ usage: response.usage,
265
+ response
266
+ };
267
+ }
268
+ function toCompletionRequest(options, helperName = "createCompletion") {
269
+ const chatHistory = [...options.messages ?? [], ...messagesFromInput(options.input)];
270
+ if (chatHistory.length === 0) {
271
+ throw new Error(`${helperName} requires input or messages.`);
272
+ }
273
+ const request = {
274
+ chatHistory,
275
+ documents: [...options.documents ?? []],
276
+ tools: [...options.tools ?? []]
277
+ };
278
+ if (options.instructions !== void 0 && options.instructions.length > 0) {
279
+ request.instructions = options.instructions;
280
+ }
281
+ if (options.temperature !== void 0) request.temperature = options.temperature;
282
+ if (options.maxTokens !== void 0) request.maxTokens = options.maxTokens;
283
+ if (options.toolChoice !== void 0) request.toolChoice = options.toolChoice;
284
+ if (options.outputSchema !== void 0) request.outputSchema = options.outputSchema;
285
+ if (options.params !== void 0) request.additionalParams = options.params;
286
+ return request;
287
+ }
288
+ function messagesFromInput(input) {
289
+ if (input === void 0) {
290
+ return [];
291
+ }
292
+ if (typeof input === "string") {
293
+ return [Message.user(input)];
294
+ }
295
+ return Array.isArray(input) ? [...input] : [input];
296
+ }
297
+ function isStreamingCompletionModel(model) {
298
+ return typeof model.streamCompletion === "function";
299
+ }
300
+ function parseCompletionData(text, schema) {
301
+ let json;
302
+ try {
303
+ json = JSON.parse(text);
304
+ } catch (error) {
305
+ throw new Error("createParsedCompletion expected the model response to be valid JSON.", {
306
+ cause: error
307
+ });
308
+ }
309
+ return schema.parse(json);
310
+ }
311
+
192
312
  // src/completion/documents.ts
193
313
  function normalizeDocuments(documents) {
194
314
  if (documents.length === 0) {
@@ -317,8 +437,11 @@ export {
317
437
  CompletionCapabilityError,
318
438
  assertCompletionRequestSupported,
319
439
  textFromAssistantContent,
440
+ createCompletion,
441
+ createCompletionStream,
442
+ createParsedCompletion,
320
443
  normalizeDocuments,
321
444
  formatDocument,
322
445
  CompletionRequestBuilder
323
446
  };
324
- //# sourceMappingURL=chunk-6GJDBBDC.js.map
447
+ //# sourceMappingURL=chunk-ZQQYFVO5.js.map