@anvia/core 0.1.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.
- package/README.md +101 -0
- package/dist/agent/index.d.ts +70 -0
- package/dist/agent/index.js +31 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent-C6h6YrRU.d.ts +218 -0
- package/dist/audio-generation/index.d.ts +32 -0
- package/dist/audio-generation/index.js +9 -0
- package/dist/audio-generation/index.js.map +1 -0
- package/dist/chunk-7QI6ZAFI.js +61 -0
- package/dist/chunk-7QI6ZAFI.js.map +1 -0
- package/dist/chunk-A7VDIZQN.js +145 -0
- package/dist/chunk-A7VDIZQN.js.map +1 -0
- package/dist/chunk-B24Q2ZYM.js +43 -0
- package/dist/chunk-B24Q2ZYM.js.map +1 -0
- package/dist/chunk-B4QHQN5K.js +37 -0
- package/dist/chunk-B4QHQN5K.js.map +1 -0
- package/dist/chunk-CP47FBJV.js +324 -0
- package/dist/chunk-CP47FBJV.js.map +1 -0
- package/dist/chunk-FI2BTRT5.js +86 -0
- package/dist/chunk-FI2BTRT5.js.map +1 -0
- package/dist/chunk-GNWMOSNR.js +113 -0
- package/dist/chunk-GNWMOSNR.js.map +1 -0
- package/dist/chunk-I77SDTFE.js +43 -0
- package/dist/chunk-I77SDTFE.js.map +1 -0
- package/dist/chunk-IA76K5UX.js +142 -0
- package/dist/chunk-IA76K5UX.js.map +1 -0
- package/dist/chunk-IQBY2GCF.js +1207 -0
- package/dist/chunk-IQBY2GCF.js.map +1 -0
- package/dist/chunk-KSIY7KJA.js +387 -0
- package/dist/chunk-KSIY7KJA.js.map +1 -0
- package/dist/chunk-LMBOJMNB.js +304 -0
- package/dist/chunk-LMBOJMNB.js.map +1 -0
- package/dist/chunk-S55WOHX5.js +9 -0
- package/dist/chunk-S55WOHX5.js.map +1 -0
- package/dist/chunk-SRGJPXKT.js +256 -0
- package/dist/chunk-SRGJPXKT.js.map +1 -0
- package/dist/chunk-WZTPK5HV.js +125 -0
- package/dist/chunk-WZTPK5HV.js.map +1 -0
- package/dist/chunk-X6FBOU2P.js +96 -0
- package/dist/chunk-X6FBOU2P.js.map +1 -0
- package/dist/chunk-XUUY2L2D.js +42 -0
- package/dist/chunk-XUUY2L2D.js.map +1 -0
- package/dist/completion/index.d.ts +36 -0
- package/dist/completion/index.js +29 -0
- package/dist/completion/index.js.map +1 -0
- package/dist/embeddings/index.d.ts +34 -0
- package/dist/embeddings/index.js +23 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/evals/index.d.ts +153 -0
- package/dist/evals/index.js +30 -0
- package/dist/evals/index.js.map +1 -0
- package/dist/extractor/index.d.ts +45 -0
- package/dist/extractor/index.js +19 -0
- package/dist/extractor/index.js.map +1 -0
- package/dist/image-generation/index.d.ts +37 -0
- package/dist/image-generation/index.js +9 -0
- package/dist/image-generation/index.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +183 -0
- package/dist/index.js.map +1 -0
- package/dist/loaders/index.d.ts +82 -0
- package/dist/loaders/index.js +287 -0
- package/dist/loaders/index.js.map +1 -0
- package/dist/mcp/index.d.ts +15 -0
- package/dist/mcp/index.js +9 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/observability/index.d.ts +93 -0
- package/dist/observability/index.js +7 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/pipeline/index.d.ts +51 -0
- package/dist/pipeline/index.js +9 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/skills/index.d.ts +12 -0
- package/dist/skills/index.js +16 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/streaming/index.d.ts +6 -0
- package/dist/streaming/index.js +7 -0
- package/dist/streaming/index.js.map +1 -0
- package/dist/tool/index.d.ts +42 -0
- package/dist/tool/index.js +33 -0
- package/dist/tool/index.js.map +1 -0
- package/dist/tool-DhuBQ3yb.d.ts +35 -0
- package/dist/transcription/index.d.ts +35 -0
- package/dist/transcription/index.js +9 -0
- package/dist/transcription/index.js.map +1 -0
- package/dist/types-B5B8Sdl4.d.ts +64 -0
- package/dist/types-BrxLd7ay.d.ts +250 -0
- package/dist/types-HvopERm0.d.ts +30 -0
- package/dist/vector-store/index.d.ts +111 -0
- package/dist/vector-store/index.js +15 -0
- package/dist/vector-store/index.js.map +1 -0
- package/dist/zod-schema-DJTEgQBq.d.ts +40 -0
- package/package.json +102 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/embeddings/index.ts"],"sourcesContent":["export type Embedding = {\n document: string;\n vector: number[];\n};\n\nexport interface EmbeddingModel {\n readonly dimensions?: number | undefined;\n readonly maxBatchSize?: number | undefined;\n embedTexts(texts: string[]): Promise<Embedding[]>;\n}\n\nexport type EmbeddedDocument<T, Metadata extends VectorMetadata = VectorMetadata> = {\n id: string;\n document: T;\n metadata?: Metadata | undefined;\n embeddings: Embedding[];\n};\n\nexport type VectorMetadataValue = string | number | boolean | null;\nexport type VectorMetadata = Record<string, VectorMetadataValue>;\n\nexport type EmbedDocumentsOptions<T, Metadata extends VectorMetadata = VectorMetadata> = {\n id?: ((document: T, index: number) => string) | undefined;\n content(document: T, index: number): string | string[];\n metadata?: ((document: T, index: number) => Metadata | undefined) | undefined;\n concurrency?: number | undefined;\n};\n\nexport async function embedText(model: EmbeddingModel, text: string): Promise<Embedding> {\n const embeddings = await embedTexts(model, [text]);\n const embedding = embeddings[0];\n if (embedding === undefined) {\n throw new Error(\"Embedding model returned no embeddings\");\n }\n return embedding;\n}\n\nexport async function embedTexts(model: EmbeddingModel, texts: string[]): Promise<Embedding[]> {\n if (texts.length === 0) {\n return [];\n }\n\n const maxBatchSize = Math.max(1, Math.trunc(model.maxBatchSize ?? texts.length));\n const batches: string[][] = [];\n for (let index = 0; index < texts.length; index += maxBatchSize) {\n batches.push(texts.slice(index, index + maxBatchSize));\n }\n\n const results = await mapWithConcurrency(batches, 1, (batch) => model.embedTexts(batch));\n const embeddings = results.flat();\n if (embeddings.length !== texts.length) {\n throw new Error(\n `Embedding model returned ${embeddings.length} embeddings for ${texts.length} texts`,\n );\n }\n return embeddings;\n}\n\nexport async function embedDocuments<T, Metadata extends VectorMetadata = VectorMetadata>(\n model: EmbeddingModel,\n documents: T[],\n options: EmbedDocumentsOptions<T, Metadata>,\n): Promise<Array<EmbeddedDocument<T, Metadata>>> {\n const prepared = documents.map((document, index) => {\n const content = options.content(document, index);\n const texts = Array.isArray(content) ? content : [content];\n return {\n id: options.id?.(document, index) ?? `doc${index}`,\n document,\n metadata: options.metadata?.(document, index),\n texts,\n };\n });\n\n const flatTexts = prepared.flatMap((item, documentIndex) =>\n item.texts.map((text) => ({ documentIndex, text })),\n );\n const embeddings = await mapWithConcurrency(\n chunk(flatTexts, Math.max(1, Math.trunc(model.maxBatchSize ?? (flatTexts.length || 1)))),\n Math.max(1, Math.trunc(options.concurrency ?? 1)),\n async (batch) => {\n const batchEmbeddings = await model.embedTexts(batch.map((item) => item.text));\n if (batchEmbeddings.length !== batch.length) {\n throw new Error(\n `Embedding model returned ${batchEmbeddings.length} embeddings for ${batch.length} texts`,\n );\n }\n return batch.map((item, index) => ({\n documentIndex: item.documentIndex,\n embedding: batchEmbeddings[index] as Embedding,\n }));\n },\n );\n\n const byDocument = new Map<number, Embedding[]>();\n for (const item of embeddings.flat()) {\n const list = byDocument.get(item.documentIndex) ?? [];\n list.push(item.embedding);\n byDocument.set(item.documentIndex, list);\n }\n\n return prepared.map((item, index) => ({\n id: item.id,\n document: item.document,\n ...(item.metadata === undefined ? {} : { metadata: item.metadata }),\n embeddings: byDocument.get(index) ?? [],\n }));\n}\n\nexport function dotProduct(left: number[], right: number[]): number {\n assertSameDimensions(left, right);\n return left.reduce((sum, value, index) => sum + value * (right[index] as number), 0);\n}\n\nexport function cosineSimilarity(left: number[], right: number[]): number {\n assertSameDimensions(left, right);\n const leftMagnitude = magnitude(left);\n const rightMagnitude = magnitude(right);\n if (leftMagnitude === 0 || rightMagnitude === 0) {\n return 0;\n }\n return dotProduct(left, right) / (leftMagnitude * rightMagnitude);\n}\n\nexport function angularDistance(left: number[], right: number[]): number {\n const similarity = Math.max(-1, Math.min(1, cosineSimilarity(left, right)));\n return Math.acos(similarity) / Math.PI;\n}\n\nexport function euclideanDistance(left: number[], right: number[]): number {\n assertSameDimensions(left, right);\n return Math.sqrt(\n left.reduce((sum, value, index) => sum + (value - (right[index] as number)) ** 2, 0),\n );\n}\n\nexport function manhattanDistance(left: number[], right: number[]): number {\n assertSameDimensions(left, right);\n return left.reduce((sum, value, index) => sum + Math.abs(value - (right[index] as number)), 0);\n}\n\nexport function chebyshevDistance(left: number[], right: number[]): number {\n assertSameDimensions(left, right);\n return left.reduce(\n (max, value, index) => Math.max(max, Math.abs(value - (right[index] as number))),\n 0,\n );\n}\n\nfunction magnitude(vector: number[]): number {\n return Math.sqrt(vector.reduce((sum, value) => sum + value ** 2, 0));\n}\n\nfunction assertSameDimensions(left: number[], right: number[]): void {\n if (left.length !== right.length) {\n throw new Error(`Vector dimension mismatch: ${left.length} !== ${right.length}`);\n }\n}\n\nfunction chunk<T>(items: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let index = 0; index < items.length; index += size) {\n chunks.push(items.slice(index, index + size));\n }\n return chunks;\n}\n\nasync function mapWithConcurrency<T, R>(\n items: T[],\n concurrency: number,\n mapper: (item: T) => Promise<R>,\n): Promise<R[]> {\n const results = new Array<R>(items.length);\n let next = 0;\n\n async function worker(): Promise<void> {\n while (next < items.length) {\n const index = next;\n next += 1;\n results[index] = await mapper(items[index] as T);\n }\n }\n\n await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, () => worker()));\n return results;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// src/image-generation/index.ts
|
|
2
|
+
var ImageGenerationRequestBuilder = class {
|
|
3
|
+
constructor(model) {
|
|
4
|
+
this.model = model;
|
|
5
|
+
}
|
|
6
|
+
model;
|
|
7
|
+
request = {
|
|
8
|
+
prompt: "",
|
|
9
|
+
width: 1024,
|
|
10
|
+
height: 1024
|
|
11
|
+
};
|
|
12
|
+
prompt(prompt) {
|
|
13
|
+
this.request = { ...this.request, prompt };
|
|
14
|
+
return this;
|
|
15
|
+
}
|
|
16
|
+
width(width) {
|
|
17
|
+
this.request = { ...this.request, width };
|
|
18
|
+
return this;
|
|
19
|
+
}
|
|
20
|
+
height(height) {
|
|
21
|
+
this.request = { ...this.request, height };
|
|
22
|
+
return this;
|
|
23
|
+
}
|
|
24
|
+
additionalParams(additionalParams) {
|
|
25
|
+
this.request = { ...this.request, additionalParams };
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
28
|
+
build() {
|
|
29
|
+
return { ...this.request };
|
|
30
|
+
}
|
|
31
|
+
send() {
|
|
32
|
+
return this.model.imageGeneration(this.build());
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
function imageGenerationRequest(model) {
|
|
36
|
+
return new ImageGenerationRequestBuilder(model);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export {
|
|
40
|
+
ImageGenerationRequestBuilder,
|
|
41
|
+
imageGenerationRequest
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=chunk-B24Q2ZYM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/image-generation/index.ts"],"sourcesContent":["import type { JsonValue } from \"../completion\";\n\nexport type ImageGenerationRequest = {\n prompt: string;\n width: number;\n height: number;\n additionalParams?: JsonValue | undefined;\n};\n\nexport type GeneratedImage = {\n data: Uint8Array;\n mediaType?: string | undefined;\n};\n\nexport type ImageGenerationResponse<RawResponse = unknown> = {\n image: Uint8Array;\n images: GeneratedImage[];\n mediaType?: string | undefined;\n rawResponse: RawResponse;\n};\n\nexport interface ImageGenerationModel<RawResponse = unknown> {\n readonly provider?: string | undefined;\n readonly defaultModel?: string | undefined;\n imageGeneration(request: ImageGenerationRequest): Promise<ImageGenerationResponse<RawResponse>>;\n}\n\nexport class ImageGenerationRequestBuilder<\n Model extends ImageGenerationModel = ImageGenerationModel,\n> {\n private request: ImageGenerationRequest = {\n prompt: \"\",\n width: 1024,\n height: 1024,\n };\n\n constructor(private readonly model: Model) {}\n\n prompt(prompt: string): this {\n this.request = { ...this.request, prompt };\n return this;\n }\n\n width(width: number): this {\n this.request = { ...this.request, width };\n return this;\n }\n\n height(height: number): this {\n this.request = { ...this.request, height };\n return this;\n }\n\n additionalParams(additionalParams: JsonValue): this {\n this.request = { ...this.request, additionalParams };\n return this;\n }\n\n build(): ImageGenerationRequest {\n return { ...this.request };\n }\n\n send(): Promise<Awaited<ReturnType<Model[\"imageGeneration\"]>>> {\n return this.model.imageGeneration(this.build()) as Promise<\n Awaited<ReturnType<Model[\"imageGeneration\"]>>\n >;\n }\n}\n\nexport function imageGenerationRequest<Model extends ImageGenerationModel>(\n model: Model,\n): ImageGenerationRequestBuilder<Model> {\n return new ImageGenerationRequestBuilder(model);\n}\n"],"mappings":";AA2BO,IAAM,gCAAN,MAEL;AAAA,EAOA,YAA6B,OAAc;AAAd;AAAA,EAAe;AAAA,EAAf;AAAA,EANrB,UAAkC;AAAA,IACxC,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EAIA,OAAO,QAAsB;AAC3B,SAAK,UAAU,EAAE,GAAG,KAAK,SAAS,OAAO;AACzC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAqB;AACzB,SAAK,UAAU,EAAE,GAAG,KAAK,SAAS,MAAM;AACxC,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,QAAsB;AAC3B,SAAK,UAAU,EAAE,GAAG,KAAK,SAAS,OAAO;AACzC,WAAO;AAAA,EACT;AAAA,EAEA,iBAAiB,kBAAmC;AAClD,SAAK,UAAU,EAAE,GAAG,KAAK,SAAS,iBAAiB;AACnD,WAAO;AAAA,EACT;AAAA,EAEA,QAAgC;AAC9B,WAAO,EAAE,GAAG,KAAK,QAAQ;AAAA,EAC3B;AAAA,EAEA,OAA+D;AAC7D,WAAO,KAAK,MAAM,gBAAgB,KAAK,MAAM,CAAC;AAAA,EAGhD;AACF;AAEO,SAAS,uBACd,OACsC;AACtC,SAAO,IAAI,8BAA8B,KAAK;AAChD;","names":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
// src/tool/create-tool.ts
|
|
10
|
+
function createTool(options) {
|
|
11
|
+
const parameters = toProviderJsonSchema(options.input);
|
|
12
|
+
return {
|
|
13
|
+
name: options.name,
|
|
14
|
+
...options.approval === void 0 ? {} : { approval: options.approval },
|
|
15
|
+
definition() {
|
|
16
|
+
return {
|
|
17
|
+
name: options.name,
|
|
18
|
+
description: options.description,
|
|
19
|
+
parameters
|
|
20
|
+
};
|
|
21
|
+
},
|
|
22
|
+
async call(args) {
|
|
23
|
+
const parsedArgs = options.input.parse(args);
|
|
24
|
+
const result = await options.execute(parsedArgs);
|
|
25
|
+
return options.output === void 0 ? result : options.output.parse(result);
|
|
26
|
+
},
|
|
27
|
+
parseApprovalArgs(args) {
|
|
28
|
+
return options.input.parse(args);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export {
|
|
34
|
+
toProviderJsonSchema,
|
|
35
|
+
createTool
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=chunk-B4QHQN5K.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schema/zod-schema.ts","../src/tool/create-tool.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","import type { z } from \"zod\";\nimport { toProviderJsonSchema, type ZodSchema } from \"../schema/zod-schema\";\nimport type { Tool, ToolApprovalPolicy } from \"./tool\";\n\nexport type CreateToolOptions<\n InputSchema extends ZodSchema,\n OutputSchema extends ZodSchema | undefined = undefined,\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 ): OutputSchema extends ZodSchema\n ? z.input<OutputSchema> | Promise<z.input<OutputSchema>>\n : unknown | Promise<unknown>;\n};\n\ntype ToolOutput<OutputSchema extends ZodSchema | undefined> = OutputSchema extends ZodSchema\n ? z.output<OutputSchema>\n : unknown;\n\nexport function createTool<\n InputSchema extends ZodSchema,\n OutputSchema extends ZodSchema | undefined = undefined,\n>(\n options: CreateToolOptions<InputSchema, OutputSchema>,\n): Tool<z.output<InputSchema>, ToolOutput<OutputSchema>> {\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): Promise<ToolOutput<OutputSchema>> {\n const parsedArgs = options.input.parse(args);\n const result = await options.execute(parsedArgs);\n return (\n options.output === undefined ? result : options.output.parse(result)\n ) as ToolOutput<OutputSchema>;\n },\n parseApprovalArgs(args): z.output<InputSchema> {\n return options.input.parse(args);\n },\n };\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;;;ACeO,SAAS,WAId,SACuD;AACvD,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,MAAyC;AAClD,YAAM,aAAa,QAAQ,MAAM,MAAM,IAAI;AAC3C,YAAM,SAAS,MAAM,QAAQ,QAAQ,UAAU;AAC/C,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;","names":[]}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
// src/completion/types.ts
|
|
2
|
+
var UserContent = {
|
|
3
|
+
text(text) {
|
|
4
|
+
return { type: "text", text };
|
|
5
|
+
},
|
|
6
|
+
imageUrl(url, options = {}) {
|
|
7
|
+
const image = { type: "image", source: { type: "url", url } };
|
|
8
|
+
if (options.detail !== void 0) {
|
|
9
|
+
image.detail = options.detail;
|
|
10
|
+
}
|
|
11
|
+
return image;
|
|
12
|
+
},
|
|
13
|
+
imageBase64(data, mediaType, options = {}) {
|
|
14
|
+
const image = {
|
|
15
|
+
type: "image",
|
|
16
|
+
source: { type: "base64", data, mediaType }
|
|
17
|
+
};
|
|
18
|
+
if (options.detail !== void 0) {
|
|
19
|
+
image.detail = options.detail;
|
|
20
|
+
}
|
|
21
|
+
return image;
|
|
22
|
+
},
|
|
23
|
+
documentUrl(url, mediaType, options = {}) {
|
|
24
|
+
return {
|
|
25
|
+
type: "document",
|
|
26
|
+
source: options.filename === void 0 ? { type: "url", url, mediaType } : { type: "url", url, mediaType, filename: options.filename }
|
|
27
|
+
};
|
|
28
|
+
},
|
|
29
|
+
documentBase64(data, mediaType, options = {}) {
|
|
30
|
+
return {
|
|
31
|
+
type: "document",
|
|
32
|
+
source: options.filename === void 0 ? { type: "base64", data, mediaType } : { type: "base64", data, mediaType, filename: options.filename }
|
|
33
|
+
};
|
|
34
|
+
},
|
|
35
|
+
documentText(text) {
|
|
36
|
+
return { type: "text", text };
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
var ToolContent = {
|
|
40
|
+
toolResult(id, content, callId) {
|
|
41
|
+
const normalized = typeof content === "string" ? [{ type: "text", text: content }] : content;
|
|
42
|
+
return callId === void 0 ? { type: "tool_result", id, content: normalized } : { type: "tool_result", id, callId, content: normalized };
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
var AssistantContent = {
|
|
46
|
+
text(text) {
|
|
47
|
+
return { type: "text", text };
|
|
48
|
+
},
|
|
49
|
+
imageUrl(url, options = {}) {
|
|
50
|
+
const image = { type: "image", source: { type: "url", url } };
|
|
51
|
+
if (options.detail !== void 0) {
|
|
52
|
+
image.detail = options.detail;
|
|
53
|
+
}
|
|
54
|
+
return image;
|
|
55
|
+
},
|
|
56
|
+
imageBase64(data, mediaType, options = {}) {
|
|
57
|
+
const image = {
|
|
58
|
+
type: "image",
|
|
59
|
+
source: { type: "base64", data, mediaType }
|
|
60
|
+
};
|
|
61
|
+
if (options.detail !== void 0) {
|
|
62
|
+
image.detail = options.detail;
|
|
63
|
+
}
|
|
64
|
+
return image;
|
|
65
|
+
},
|
|
66
|
+
reasoning(text, id) {
|
|
67
|
+
return id === void 0 ? { type: "reasoning", text } : { type: "reasoning", text, id };
|
|
68
|
+
},
|
|
69
|
+
reasoningFromContent(content, id) {
|
|
70
|
+
const text = reasoningDisplayText(content);
|
|
71
|
+
const reasoning = { type: "reasoning", text, content };
|
|
72
|
+
return id === void 0 ? reasoning : { ...reasoning, id };
|
|
73
|
+
},
|
|
74
|
+
reasoningSummary(text, id) {
|
|
75
|
+
return AssistantContent.reasoningFromContent([{ type: "summary", text }], id);
|
|
76
|
+
},
|
|
77
|
+
reasoningEncrypted(data, id) {
|
|
78
|
+
return AssistantContent.reasoningFromContent([{ type: "encrypted", data }], id);
|
|
79
|
+
},
|
|
80
|
+
reasoningRedacted(data, id) {
|
|
81
|
+
return AssistantContent.reasoningFromContent([{ type: "redacted", data }], id);
|
|
82
|
+
},
|
|
83
|
+
toolCall(id, name, args, callId) {
|
|
84
|
+
const base = {
|
|
85
|
+
type: "tool_call",
|
|
86
|
+
id,
|
|
87
|
+
function: {
|
|
88
|
+
name,
|
|
89
|
+
arguments: args
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
return callId === void 0 ? base : { ...base, callId };
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
function reasoningDisplayText(reasoning) {
|
|
96
|
+
const content = Array.isArray(reasoning) ? reasoning : reasoning.content;
|
|
97
|
+
if (content === void 0) {
|
|
98
|
+
return Array.isArray(reasoning) ? "" : reasoning.text;
|
|
99
|
+
}
|
|
100
|
+
return content.flatMap((item) => {
|
|
101
|
+
if (item.type === "text" || item.type === "summary") {
|
|
102
|
+
return [item.text];
|
|
103
|
+
}
|
|
104
|
+
return [];
|
|
105
|
+
}).join("");
|
|
106
|
+
}
|
|
107
|
+
var Message = {
|
|
108
|
+
system(content) {
|
|
109
|
+
return { role: "system", content };
|
|
110
|
+
},
|
|
111
|
+
user(content) {
|
|
112
|
+
return {
|
|
113
|
+
role: "user",
|
|
114
|
+
content: typeof content === "string" ? [UserContent.text(content)] : content
|
|
115
|
+
};
|
|
116
|
+
},
|
|
117
|
+
assistant(content, id) {
|
|
118
|
+
const normalized = typeof content === "string" ? [AssistantContent.text(content)] : content;
|
|
119
|
+
return id === void 0 ? { role: "assistant", content: normalized } : { role: "assistant", id, content: normalized };
|
|
120
|
+
},
|
|
121
|
+
tool(content) {
|
|
122
|
+
return {
|
|
123
|
+
role: "tool",
|
|
124
|
+
content: Array.isArray(content) ? content : [content]
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
var Usage = {
|
|
129
|
+
empty() {
|
|
130
|
+
return {
|
|
131
|
+
inputTokens: 0,
|
|
132
|
+
outputTokens: 0,
|
|
133
|
+
totalTokens: 0,
|
|
134
|
+
cachedInputTokens: 0,
|
|
135
|
+
cacheCreationInputTokens: 0
|
|
136
|
+
};
|
|
137
|
+
},
|
|
138
|
+
add(left, right) {
|
|
139
|
+
return {
|
|
140
|
+
inputTokens: left.inputTokens + right.inputTokens,
|
|
141
|
+
outputTokens: left.outputTokens + right.outputTokens,
|
|
142
|
+
totalTokens: left.totalTokens + right.totalTokens,
|
|
143
|
+
cachedInputTokens: left.cachedInputTokens + right.cachedInputTokens,
|
|
144
|
+
cacheCreationInputTokens: left.cacheCreationInputTokens + right.cacheCreationInputTokens
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
var CompletionCapabilityError = class extends Error {
|
|
149
|
+
constructor(message) {
|
|
150
|
+
super(message);
|
|
151
|
+
this.name = "CompletionCapabilityError";
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
function assertCompletionRequestSupported(model, request, options = {}) {
|
|
155
|
+
const modelLabel = `${model.provider}:${request.model ?? model.defaultModel}`;
|
|
156
|
+
const capabilities = model.capabilities;
|
|
157
|
+
if (options.streaming === true && !capabilities.streaming) {
|
|
158
|
+
throw new CompletionCapabilityError(`${modelLabel} does not support streaming completions.`);
|
|
159
|
+
}
|
|
160
|
+
if (request.tools.length > 0 && !capabilities.tools) {
|
|
161
|
+
throw new CompletionCapabilityError(`${modelLabel} does not support tool definitions.`);
|
|
162
|
+
}
|
|
163
|
+
if (request.toolChoice !== void 0 && !capabilities.toolChoice) {
|
|
164
|
+
throw new CompletionCapabilityError(`${modelLabel} does not support tool choice.`);
|
|
165
|
+
}
|
|
166
|
+
if (request.outputSchema !== void 0 && !capabilities.outputSchema) {
|
|
167
|
+
throw new CompletionCapabilityError(`${modelLabel} does not support output schemas.`);
|
|
168
|
+
}
|
|
169
|
+
if (!capabilities.imageInput && requestHasImageInput(request)) {
|
|
170
|
+
throw new CompletionCapabilityError(`${modelLabel} does not support image input.`);
|
|
171
|
+
}
|
|
172
|
+
if (!capabilities.documentInput && requestHasFileDocumentInput(request)) {
|
|
173
|
+
throw new CompletionCapabilityError(`${modelLabel} does not support document file input.`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function textFromAssistantContent(content) {
|
|
177
|
+
return content.flatMap((item) => item.type === "text" ? [item.text] : []).join("\n");
|
|
178
|
+
}
|
|
179
|
+
function requestHasImageInput(request) {
|
|
180
|
+
return request.chatHistory.some(
|
|
181
|
+
(message) => message.role === "system" ? false : message.content.some((content) => content.type === "image")
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
function requestHasFileDocumentInput(request) {
|
|
185
|
+
return request.chatHistory.some(
|
|
186
|
+
(message) => message.role === "user" ? message.content.some(
|
|
187
|
+
(content) => content.type === "document" && content.source.type !== "text"
|
|
188
|
+
) : false
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// src/completion/documents.ts
|
|
193
|
+
function normalizeDocuments(documents) {
|
|
194
|
+
if (documents.length === 0) {
|
|
195
|
+
return void 0;
|
|
196
|
+
}
|
|
197
|
+
return Message.user(documents.map(formatDocument).join("\n"));
|
|
198
|
+
}
|
|
199
|
+
function formatDocument(document) {
|
|
200
|
+
return `<file id: ${document.id}>
|
|
201
|
+
${formatDocumentBody(document)}
|
|
202
|
+
</file>
|
|
203
|
+
`;
|
|
204
|
+
}
|
|
205
|
+
function formatDocumentBody(document) {
|
|
206
|
+
const metadata = formatMetadata(document.additionalProps);
|
|
207
|
+
return metadata === void 0 ? document.text : `${metadata}
|
|
208
|
+
${document.text}`;
|
|
209
|
+
}
|
|
210
|
+
function formatMetadata(additionalProps) {
|
|
211
|
+
if (additionalProps === void 0) {
|
|
212
|
+
return void 0;
|
|
213
|
+
}
|
|
214
|
+
const entries = Object.entries(additionalProps).sort(
|
|
215
|
+
([left], [right]) => left.localeCompare(right)
|
|
216
|
+
);
|
|
217
|
+
if (entries.length === 0) {
|
|
218
|
+
return void 0;
|
|
219
|
+
}
|
|
220
|
+
const metadata = entries.map(([key, value]) => `${key}: ${JSON.stringify(value)}`).join(" ");
|
|
221
|
+
return `<metadata ${metadata} />`;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// src/completion/request.ts
|
|
225
|
+
var CompletionRequestBuilder = class {
|
|
226
|
+
constructor(model, promptMessage) {
|
|
227
|
+
this.model = model;
|
|
228
|
+
this.promptMessage = promptMessage;
|
|
229
|
+
}
|
|
230
|
+
model;
|
|
231
|
+
promptMessage;
|
|
232
|
+
requestModel;
|
|
233
|
+
instructionBlocks = [];
|
|
234
|
+
history = [];
|
|
235
|
+
docs = [];
|
|
236
|
+
toolDefs = [];
|
|
237
|
+
temp;
|
|
238
|
+
maxTokenCount;
|
|
239
|
+
choice;
|
|
240
|
+
params;
|
|
241
|
+
schema;
|
|
242
|
+
modelOverride(model) {
|
|
243
|
+
this.requestModel = model;
|
|
244
|
+
return this;
|
|
245
|
+
}
|
|
246
|
+
instructions(instructions) {
|
|
247
|
+
if (instructions !== void 0 && instructions.length > 0) {
|
|
248
|
+
this.instructionBlocks.push(instructions);
|
|
249
|
+
}
|
|
250
|
+
return this;
|
|
251
|
+
}
|
|
252
|
+
messages(messages) {
|
|
253
|
+
this.history.push(...messages);
|
|
254
|
+
return this;
|
|
255
|
+
}
|
|
256
|
+
documents(documents) {
|
|
257
|
+
this.docs.push(...documents);
|
|
258
|
+
return this;
|
|
259
|
+
}
|
|
260
|
+
tools(tools) {
|
|
261
|
+
this.toolDefs.push(...tools);
|
|
262
|
+
return this;
|
|
263
|
+
}
|
|
264
|
+
temperature(temperature) {
|
|
265
|
+
this.temp = temperature;
|
|
266
|
+
return this;
|
|
267
|
+
}
|
|
268
|
+
maxTokens(maxTokens) {
|
|
269
|
+
this.maxTokenCount = maxTokens;
|
|
270
|
+
return this;
|
|
271
|
+
}
|
|
272
|
+
toolChoice(toolChoice) {
|
|
273
|
+
this.choice = toolChoice;
|
|
274
|
+
return this;
|
|
275
|
+
}
|
|
276
|
+
additionalParams(additionalParams) {
|
|
277
|
+
this.params = additionalParams;
|
|
278
|
+
return this;
|
|
279
|
+
}
|
|
280
|
+
outputSchema(outputSchema) {
|
|
281
|
+
this.schema = outputSchema;
|
|
282
|
+
return this;
|
|
283
|
+
}
|
|
284
|
+
build() {
|
|
285
|
+
const instructions = this.buildInstructions();
|
|
286
|
+
const request = {
|
|
287
|
+
chatHistory: [...this.history, this.promptMessage],
|
|
288
|
+
documents: [...this.docs],
|
|
289
|
+
tools: [...this.toolDefs]
|
|
290
|
+
};
|
|
291
|
+
if (this.requestModel !== void 0) request.model = this.requestModel;
|
|
292
|
+
if (instructions !== void 0) request.instructions = instructions;
|
|
293
|
+
if (this.temp !== void 0) request.temperature = this.temp;
|
|
294
|
+
if (this.maxTokenCount !== void 0) request.maxTokens = this.maxTokenCount;
|
|
295
|
+
if (this.choice !== void 0) request.toolChoice = this.choice;
|
|
296
|
+
if (this.params !== void 0) request.additionalParams = this.params;
|
|
297
|
+
if (this.schema !== void 0) request.outputSchema = this.schema;
|
|
298
|
+
return request;
|
|
299
|
+
}
|
|
300
|
+
async send() {
|
|
301
|
+
const request = this.build();
|
|
302
|
+
assertCompletionRequestSupported(this.model, request);
|
|
303
|
+
return this.model.completion(request);
|
|
304
|
+
}
|
|
305
|
+
buildInstructions() {
|
|
306
|
+
return this.instructionBlocks.length === 0 ? void 0 : this.instructionBlocks.join("\n\n");
|
|
307
|
+
}
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
export {
|
|
311
|
+
UserContent,
|
|
312
|
+
ToolContent,
|
|
313
|
+
AssistantContent,
|
|
314
|
+
reasoningDisplayText,
|
|
315
|
+
Message,
|
|
316
|
+
Usage,
|
|
317
|
+
CompletionCapabilityError,
|
|
318
|
+
assertCompletionRequestSupported,
|
|
319
|
+
textFromAssistantContent,
|
|
320
|
+
normalizeDocuments,
|
|
321
|
+
formatDocument,
|
|
322
|
+
CompletionRequestBuilder
|
|
323
|
+
};
|
|
324
|
+
//# sourceMappingURL=chunk-CP47FBJV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/completion/types.ts","../src/completion/documents.ts","../src/completion/request.ts"],"sourcesContent":["export type JsonPrimitive = string | number | boolean | null;\nexport type JsonValue = JsonPrimitive | JsonObject | JsonValue[];\nexport type JsonObject = { [key: string]: JsonValue | undefined };\n\nexport type Document = {\n id: string;\n text: string;\n additionalProps?: Record<string, string>;\n};\n\nexport type Text = {\n type: \"text\";\n text: string;\n signature?: string;\n};\n\nexport type ImageDetail = \"auto\" | \"low\" | \"high\";\n\nexport type ImageContent = {\n type: \"image\";\n source:\n | {\n type: \"url\";\n url: string;\n }\n | {\n type: \"base64\";\n data: string;\n mediaType: string;\n };\n detail?: ImageDetail;\n};\n\nexport type DocumentContent = {\n type: \"document\";\n source:\n | {\n type: \"url\";\n url: string;\n mediaType: string;\n filename?: string;\n }\n | {\n type: \"base64\";\n data: string;\n mediaType: string;\n filename?: string;\n }\n | {\n type: \"text\";\n text: string;\n mediaType?: string;\n filename?: string;\n };\n};\n\nexport type Reasoning = {\n type: \"reasoning\";\n text: string;\n id?: string;\n content?: ReasoningContent[];\n};\n\nexport type ReasoningContent =\n | {\n type: \"text\";\n text: string;\n signature?: string;\n }\n | {\n type: \"summary\";\n text: string;\n }\n | {\n type: \"encrypted\";\n data: string;\n }\n | {\n type: \"redacted\";\n data: string;\n };\n\nexport type ReasoningContentType = ReasoningContent[\"type\"];\n\nexport type ToolFunction = {\n name: string;\n arguments: JsonValue;\n};\n\nexport type ToolCall = {\n type: \"tool_call\";\n id: string;\n callId?: string;\n function: ToolFunction;\n signature?: string;\n additionalParams?: JsonValue;\n};\n\nexport type ToolResultContent =\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mediaType?: string };\n\nexport type ToolResult = {\n type: \"tool_result\";\n id: string;\n callId?: string;\n content: ToolResultContent[];\n};\n\nexport type UserContent = Text | ImageContent | DocumentContent;\nexport type AssistantContent = Text | ToolCall | Reasoning | ImageContent;\nexport type ToolContent = ToolResult;\n\nexport type SystemMessage = {\n role: \"system\";\n content: string;\n};\n\nexport type UserMessage = {\n role: \"user\";\n content: UserContent[];\n};\n\nexport type AssistantMessage = {\n role: \"assistant\";\n id?: string;\n content: AssistantContent[];\n};\n\nexport type ToolMessage = {\n role: \"tool\";\n content: ToolContent[];\n};\n\nexport type Message = SystemMessage | UserMessage | AssistantMessage | ToolMessage;\n\nexport const UserContent = {\n text(text: string): Text {\n return { type: \"text\", text };\n },\n imageUrl(url: string, options: { detail?: ImageDetail } = {}): ImageContent {\n const image: ImageContent = { type: \"image\", source: { type: \"url\", url } };\n if (options.detail !== undefined) {\n image.detail = options.detail;\n }\n return image;\n },\n imageBase64(\n data: string,\n mediaType: string,\n options: { detail?: ImageDetail } = {},\n ): ImageContent {\n const image: ImageContent = {\n type: \"image\",\n source: { type: \"base64\", data, mediaType },\n };\n if (options.detail !== undefined) {\n image.detail = options.detail;\n }\n return image;\n },\n documentUrl(\n url: string,\n mediaType: string,\n options: { filename?: string | undefined } = {},\n ): DocumentContent {\n return {\n type: \"document\",\n source:\n options.filename === undefined\n ? { type: \"url\", url, mediaType }\n : { type: \"url\", url, mediaType, filename: options.filename },\n };\n },\n documentBase64(\n data: string,\n mediaType: string,\n options: { filename?: string | undefined } = {},\n ): DocumentContent {\n return {\n type: \"document\",\n source:\n options.filename === undefined\n ? { type: \"base64\", data, mediaType }\n : { type: \"base64\", data, mediaType, filename: options.filename },\n };\n },\n documentText(text: string): Text {\n return { type: \"text\", text };\n },\n};\n\nexport const ToolContent = {\n toolResult(id: string, content: string | ToolResultContent[], callId?: string): ToolResult {\n const normalized =\n typeof content === \"string\" ? [{ type: \"text\" as const, text: content }] : content;\n return callId === undefined\n ? { type: \"tool_result\", id, content: normalized }\n : { type: \"tool_result\", id, callId, content: normalized };\n },\n};\n\nexport const AssistantContent = {\n text(text: string): Text {\n return { type: \"text\", text };\n },\n imageUrl(url: string, options: { detail?: ImageDetail } = {}): ImageContent {\n const image: ImageContent = { type: \"image\", source: { type: \"url\", url } };\n if (options.detail !== undefined) {\n image.detail = options.detail;\n }\n return image;\n },\n imageBase64(\n data: string,\n mediaType: string,\n options: { detail?: ImageDetail } = {},\n ): ImageContent {\n const image: ImageContent = {\n type: \"image\",\n source: { type: \"base64\", data, mediaType },\n };\n if (options.detail !== undefined) {\n image.detail = options.detail;\n }\n return image;\n },\n reasoning(text: string, id?: string): Reasoning {\n return id === undefined ? { type: \"reasoning\", text } : { type: \"reasoning\", text, id };\n },\n reasoningFromContent(content: ReasoningContent[], id?: string): Reasoning {\n const text = reasoningDisplayText(content);\n const reasoning: Reasoning = { type: \"reasoning\", text, content };\n return id === undefined ? reasoning : { ...reasoning, id };\n },\n reasoningSummary(text: string, id?: string): Reasoning {\n return AssistantContent.reasoningFromContent([{ type: \"summary\", text }], id);\n },\n reasoningEncrypted(data: string, id?: string): Reasoning {\n return AssistantContent.reasoningFromContent([{ type: \"encrypted\", data }], id);\n },\n reasoningRedacted(data: string, id?: string): Reasoning {\n return AssistantContent.reasoningFromContent([{ type: \"redacted\", data }], id);\n },\n toolCall(id: string, name: string, args: JsonValue, callId?: string): ToolCall {\n const base: ToolCall = {\n type: \"tool_call\",\n id,\n function: {\n name,\n arguments: args,\n },\n };\n return callId === undefined ? base : { ...base, callId };\n },\n};\n\nexport function reasoningDisplayText(reasoning: Reasoning | ReasoningContent[]): string {\n const content = Array.isArray(reasoning) ? reasoning : reasoning.content;\n if (content === undefined) {\n return Array.isArray(reasoning) ? \"\" : reasoning.text;\n }\n return content\n .flatMap((item) => {\n if (item.type === \"text\" || item.type === \"summary\") {\n return [item.text];\n }\n return [];\n })\n .join(\"\");\n}\n\nexport const Message = {\n system(content: string): Message {\n return { role: \"system\", content };\n },\n user(content: string | UserContent[]): Message {\n return {\n role: \"user\",\n content: typeof content === \"string\" ? [UserContent.text(content)] : content,\n };\n },\n assistant(content: string | AssistantContent[], id?: string): Message {\n const normalized = typeof content === \"string\" ? [AssistantContent.text(content)] : content;\n return id === undefined\n ? { role: \"assistant\", content: normalized }\n : { role: \"assistant\", id, content: normalized };\n },\n tool(content: ToolContent | ToolContent[]): Message {\n return {\n role: \"tool\",\n content: Array.isArray(content) ? content : [content],\n };\n },\n};\n\nexport type ToolChoice =\n | \"auto\"\n | \"required\"\n | \"none\"\n | {\n type: \"function\";\n name: string;\n };\n\nexport type ToolDefinition = {\n name: string;\n description: string;\n parameters: JsonObject;\n};\n\nexport type Usage = {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n cachedInputTokens: number;\n cacheCreationInputTokens: number;\n};\n\nexport const Usage = {\n empty(): Usage {\n return {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n cachedInputTokens: 0,\n cacheCreationInputTokens: 0,\n };\n },\n add(left: Usage, right: Usage): Usage {\n return {\n inputTokens: left.inputTokens + right.inputTokens,\n outputTokens: left.outputTokens + right.outputTokens,\n totalTokens: left.totalTokens + right.totalTokens,\n cachedInputTokens: left.cachedInputTokens + right.cachedInputTokens,\n cacheCreationInputTokens: left.cacheCreationInputTokens + right.cacheCreationInputTokens,\n };\n },\n};\n\nexport type CompletionRequest = {\n model?: string;\n instructions?: string;\n chatHistory: Message[];\n documents: Document[];\n tools: ToolDefinition[];\n temperature?: number;\n maxTokens?: number;\n toolChoice?: ToolChoice;\n additionalParams?: JsonValue;\n outputSchema?: JsonObject;\n};\n\nexport type CompletionResponse<RawResponse = unknown> = {\n choice: AssistantContent[];\n usage: Usage;\n rawResponse: RawResponse;\n messageId?: string;\n};\n\nexport type CompletionModelCapabilities = {\n streaming: boolean;\n tools: boolean;\n toolChoice: boolean;\n imageInput: boolean;\n documentInput: boolean;\n outputSchema: boolean;\n reasoning: boolean;\n};\n\nexport interface CompletionModel<RawResponse = unknown> {\n readonly provider: string;\n readonly defaultModel: string;\n readonly capabilities: CompletionModelCapabilities;\n completion(request: CompletionRequest): Promise<CompletionResponse<RawResponse>>;\n}\n\nexport type CompletionStreamEvent<RawResponse = unknown> =\n | {\n type: \"text_delta\";\n delta: string;\n }\n | {\n type: \"reasoning_delta\";\n delta: string;\n id?: string;\n contentType?: ReasoningContentType;\n signature?: string;\n }\n | {\n type: \"tool_call_delta\";\n id: string;\n callId?: string;\n name?: string;\n argumentsDelta?: string;\n signature?: string;\n }\n | {\n type: \"tool_call\";\n toolCall: ToolCall;\n }\n | {\n type: \"message_id\";\n id: string;\n }\n | {\n type: \"final\";\n response: CompletionResponse<RawResponse>;\n }\n | {\n type: \"error\";\n error: unknown;\n };\n\nexport interface StreamingCompletionModel<RawResponse = unknown>\n extends CompletionModel<RawResponse> {\n streamCompletion(request: CompletionRequest): AsyncIterable<CompletionStreamEvent<RawResponse>>;\n}\n\nexport class CompletionCapabilityError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CompletionCapabilityError\";\n }\n}\n\nexport function assertCompletionRequestSupported(\n model: CompletionModel,\n request: CompletionRequest,\n options: { streaming?: boolean | undefined } = {},\n): void {\n const modelLabel = `${model.provider}:${request.model ?? model.defaultModel}`;\n const capabilities = model.capabilities;\n\n if (options.streaming === true && !capabilities.streaming) {\n throw new CompletionCapabilityError(`${modelLabel} does not support streaming completions.`);\n }\n\n if (request.tools.length > 0 && !capabilities.tools) {\n throw new CompletionCapabilityError(`${modelLabel} does not support tool definitions.`);\n }\n\n if (request.toolChoice !== undefined && !capabilities.toolChoice) {\n throw new CompletionCapabilityError(`${modelLabel} does not support tool choice.`);\n }\n\n if (request.outputSchema !== undefined && !capabilities.outputSchema) {\n throw new CompletionCapabilityError(`${modelLabel} does not support output schemas.`);\n }\n\n if (!capabilities.imageInput && requestHasImageInput(request)) {\n throw new CompletionCapabilityError(`${modelLabel} does not support image input.`);\n }\n\n if (!capabilities.documentInput && requestHasFileDocumentInput(request)) {\n throw new CompletionCapabilityError(`${modelLabel} does not support document file input.`);\n }\n}\n\nexport function textFromAssistantContent(content: AssistantContent[]): string {\n return content.flatMap((item) => (item.type === \"text\" ? [item.text] : [])).join(\"\\n\");\n}\n\nfunction requestHasImageInput(request: CompletionRequest): boolean {\n return request.chatHistory.some((message) =>\n message.role === \"system\" ? false : message.content.some((content) => content.type === \"image\"),\n );\n}\n\nfunction requestHasFileDocumentInput(request: CompletionRequest): boolean {\n return request.chatHistory.some((message) =>\n message.role === \"user\"\n ? message.content.some(\n (content) => content.type === \"document\" && content.source.type !== \"text\",\n )\n : false,\n );\n}\n","import { type Document, Message, type Message as MessageType } from \"./types\";\n\nexport function normalizeDocuments(documents: Document[]): MessageType | undefined {\n if (documents.length === 0) {\n return undefined;\n }\n\n return Message.user(documents.map(formatDocument).join(\"\\n\"));\n}\n\nexport function formatDocument(document: Document): string {\n return `<file id: ${document.id}>\\n${formatDocumentBody(document)}\\n</file>\\n`;\n}\n\nfunction formatDocumentBody(document: Document): string {\n const metadata = formatMetadata(document.additionalProps);\n return metadata === undefined ? document.text : `${metadata}\\n${document.text}`;\n}\n\nfunction formatMetadata(additionalProps: Record<string, string> | undefined): string | undefined {\n if (additionalProps === undefined) {\n return undefined;\n }\n\n const entries = Object.entries(additionalProps).sort(([left], [right]) =>\n left.localeCompare(right),\n );\n if (entries.length === 0) {\n return undefined;\n }\n\n const metadata = entries.map(([key, value]) => `${key}: ${JSON.stringify(value)}`).join(\" \");\n return `<metadata ${metadata} />`;\n}\n","import type {\n CompletionModel,\n CompletionRequest,\n CompletionResponse,\n Document,\n JsonObject,\n JsonValue,\n Message as MessageType,\n ToolChoice,\n ToolDefinition,\n} from \"./types\";\nimport { assertCompletionRequestSupported } from \"./types\";\n\nexport class CompletionRequestBuilder<M extends CompletionModel = CompletionModel> {\n private requestModel: string | undefined;\n private instructionBlocks: string[] = [];\n private history: MessageType[] = [];\n private docs: Document[] = [];\n private toolDefs: ToolDefinition[] = [];\n private temp: number | undefined;\n private maxTokenCount: number | undefined;\n private choice: ToolChoice | undefined;\n private params: JsonValue | undefined;\n private schema: JsonObject | undefined;\n\n constructor(\n private readonly model: M,\n private readonly promptMessage: MessageType,\n ) {}\n\n modelOverride(model: string | undefined): this {\n this.requestModel = model;\n return this;\n }\n\n instructions(instructions: string | undefined): this {\n if (instructions !== undefined && instructions.length > 0) {\n this.instructionBlocks.push(instructions);\n }\n return this;\n }\n\n messages(messages: MessageType[]): this {\n this.history.push(...messages);\n return this;\n }\n\n documents(documents: Document[]): this {\n this.docs.push(...documents);\n return this;\n }\n\n tools(tools: ToolDefinition[]): this {\n this.toolDefs.push(...tools);\n return this;\n }\n\n temperature(temperature: number | undefined): this {\n this.temp = temperature;\n return this;\n }\n\n maxTokens(maxTokens: number | undefined): this {\n this.maxTokenCount = maxTokens;\n return this;\n }\n\n toolChoice(toolChoice: ToolChoice | undefined): this {\n this.choice = toolChoice;\n return this;\n }\n\n additionalParams(additionalParams: JsonValue | undefined): this {\n this.params = additionalParams;\n return this;\n }\n\n outputSchema(outputSchema: JsonObject | undefined): this {\n this.schema = outputSchema;\n return this;\n }\n\n build(): CompletionRequest {\n const instructions = this.buildInstructions();\n const request: CompletionRequest = {\n chatHistory: [...this.history, this.promptMessage],\n documents: [...this.docs],\n tools: [...this.toolDefs],\n };\n\n if (this.requestModel !== undefined) request.model = this.requestModel;\n if (instructions !== undefined) request.instructions = instructions;\n if (this.temp !== undefined) request.temperature = this.temp;\n if (this.maxTokenCount !== undefined) request.maxTokens = this.maxTokenCount;\n if (this.choice !== undefined) request.toolChoice = this.choice;\n if (this.params !== undefined) request.additionalParams = this.params;\n if (this.schema !== undefined) request.outputSchema = this.schema;\n\n return request;\n }\n\n async send(): Promise<CompletionResponse> {\n const request = this.build();\n assertCompletionRequestSupported(this.model, request);\n return this.model.completion(request);\n }\n\n private buildInstructions(): string | undefined {\n return this.instructionBlocks.length === 0 ? undefined : this.instructionBlocks.join(\"\\n\\n\");\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// src/pipeline/index.ts
|
|
2
|
+
var Pipeline = class {
|
|
3
|
+
constructor(executor) {
|
|
4
|
+
this.executor = executor;
|
|
5
|
+
}
|
|
6
|
+
executor;
|
|
7
|
+
/** Run one input through the built pipeline and return the final stage output. */
|
|
8
|
+
async run(input) {
|
|
9
|
+
return await this.executor(input);
|
|
10
|
+
}
|
|
11
|
+
/** Run many inputs through the same pipeline with bounded concurrency. */
|
|
12
|
+
async batch(inputs, options) {
|
|
13
|
+
return mapWithConcurrency([...inputs], options.concurrency, (input) => this.run(input));
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
var PipelineBuilder = class _PipelineBuilder {
|
|
17
|
+
constructor(executor = identity) {
|
|
18
|
+
this.executor = executor;
|
|
19
|
+
}
|
|
20
|
+
executor;
|
|
21
|
+
/** Add a synchronous or asynchronous transform stage. */
|
|
22
|
+
step(fn) {
|
|
23
|
+
return new _PipelineBuilder(async (input) => {
|
|
24
|
+
const result = await fn(await this.runStep(input));
|
|
25
|
+
return result;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/** Compose another pipeline operation after the current stage. */
|
|
29
|
+
use(op) {
|
|
30
|
+
return new _PipelineBuilder(async (input) => {
|
|
31
|
+
const result = await op.run(await this.runStep(input));
|
|
32
|
+
return result;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/** Run named branch operations concurrently from the current value. */
|
|
36
|
+
parallel(branches) {
|
|
37
|
+
return new _PipelineBuilder(async (input) => {
|
|
38
|
+
const value = await this.runStep(input);
|
|
39
|
+
const entries = await Promise.all(
|
|
40
|
+
Object.entries(branches).map(async ([key, op]) => [key, await op.run(value)])
|
|
41
|
+
);
|
|
42
|
+
return Object.fromEntries(entries);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/** Send the current value to an agent as text and continue with the agent output. */
|
|
46
|
+
prompt(agent) {
|
|
47
|
+
return this.step(async (input) => {
|
|
48
|
+
const response = await agent.prompt(String(input)).send();
|
|
49
|
+
return response.output;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/** Send the current value to an extractor as text and continue with typed schema data. */
|
|
53
|
+
extract(extractor) {
|
|
54
|
+
return this.step((input) => extractor.extract(String(input)));
|
|
55
|
+
}
|
|
56
|
+
/** Finish the builder and return a runnable pipeline. */
|
|
57
|
+
build() {
|
|
58
|
+
return new Pipeline((input) => this.runStep(input));
|
|
59
|
+
}
|
|
60
|
+
async runStep(input) {
|
|
61
|
+
return await this.executor(input);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
function identity(input) {
|
|
65
|
+
return input;
|
|
66
|
+
}
|
|
67
|
+
async function mapWithConcurrency(inputs, concurrency, fn) {
|
|
68
|
+
const limit = Math.max(1, Math.trunc(concurrency));
|
|
69
|
+
const results = new Array(inputs.length);
|
|
70
|
+
let nextIndex = 0;
|
|
71
|
+
async function worker() {
|
|
72
|
+
while (nextIndex < inputs.length) {
|
|
73
|
+
const index = nextIndex;
|
|
74
|
+
nextIndex += 1;
|
|
75
|
+
results[index] = await fn(inputs[index]);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
await Promise.all(Array.from({ length: Math.min(limit, inputs.length) }, () => worker()));
|
|
79
|
+
return results;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export {
|
|
83
|
+
Pipeline,
|
|
84
|
+
PipelineBuilder
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=chunk-FI2BTRT5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pipeline/index.ts"],"sourcesContent":["import type { Agent } from \"../agent\";\nimport type { CompletionModel } from \"../completion\";\nimport type { Extractor } from \"../extractor\";\n\n/** Minimal interface for anything that can run as a pipeline stage. */\nexport interface PipelineOp<Input = unknown, Output = unknown> {\n run(input: Input): Output | Promise<Output>;\n}\n\nexport interface PipelineBatchOptions {\n /** Maximum number of inputs processed at the same time. */\n concurrency: number;\n}\n\ntype AwaitedOutput<Op> = Op extends PipelineOp<unknown, infer Output> ? Awaited<Output> : never;\n\ntype ParallelOutput<Branches extends Record<string, PipelineOp<unknown, unknown>>> = {\n [Key in keyof Branches]: AwaitedOutput<Branches[Key]>;\n};\n\n/** Runnable pipeline returned by `PipelineBuilder.build()`. */\nexport class Pipeline<Input, Output> implements PipelineOp<Input, Awaited<Output>> {\n constructor(private readonly executor: (input: Input) => Output | Promise<Output>) {}\n\n /** Run one input through the built pipeline and return the final stage output. */\n async run(input: Input): Promise<Awaited<Output>> {\n return await this.executor(input);\n }\n\n /** Run many inputs through the same pipeline with bounded concurrency. */\n async batch<I extends Iterable<Input>>(\n inputs: I,\n options: PipelineBatchOptions,\n ): Promise<Array<Awaited<Output>>> {\n return mapWithConcurrency([...inputs], options.concurrency, (input) => this.run(input));\n }\n}\n\n/** Builds a typed pipeline from an original input type to an inferred output type. */\nexport class PipelineBuilder<Input, Output = Input> {\n constructor(\n private readonly executor: (input: Input) => Output | Promise<Output> = identity as (\n input: Input,\n ) => Output,\n ) {}\n\n /** Add a synchronous or asynchronous transform stage. */\n step<Next>(\n fn: (input: Awaited<Output>) => Next | Promise<Next>,\n ): PipelineBuilder<Input, Awaited<Next>> {\n return new PipelineBuilder<Input, Awaited<Next>>(async (input): Promise<Awaited<Next>> => {\n const result = await fn(await this.runStep(input));\n return result as Awaited<Next>;\n });\n }\n\n /** Compose another pipeline operation after the current stage. */\n use<Next>(op: PipelineOp<Awaited<Output>, Next>): PipelineBuilder<Input, Awaited<Next>> {\n return new PipelineBuilder<Input, Awaited<Next>>(async (input): Promise<Awaited<Next>> => {\n const result = await op.run(await this.runStep(input));\n return result as Awaited<Next>;\n });\n }\n\n /** Run named branch operations concurrently from the current value. */\n parallel<Branches extends Record<string, PipelineOp<Awaited<Output>, unknown>>>(\n branches: Branches,\n ): PipelineBuilder<Input, ParallelOutput<Branches>> {\n return new PipelineBuilder<Input, ParallelOutput<Branches>>(async (input) => {\n const value = await this.runStep(input);\n const entries = await Promise.all(\n Object.entries(branches).map(async ([key, op]) => [key, await op.run(value)] as const),\n );\n return Object.fromEntries(entries) as ParallelOutput<Branches>;\n });\n }\n\n /** Send the current value to an agent as text and continue with the agent output. */\n prompt(agent: Agent<CompletionModel>): PipelineBuilder<Input, string> {\n return this.step(async (input) => {\n const response = await agent.prompt(String(input)).send();\n return response.output;\n });\n }\n\n /** Send the current value to an extractor as text and continue with typed schema data. */\n extract<T>(extractor: Extractor<T, CompletionModel>): PipelineBuilder<Input, T> {\n return this.step((input) => extractor.extract(String(input)));\n }\n\n /** Finish the builder and return a runnable pipeline. */\n build(): Pipeline<Input, Awaited<Output>> {\n return new Pipeline<Input, Awaited<Output>>((input) => this.runStep(input));\n }\n\n private async runStep(input: Input): Promise<Awaited<Output>> {\n return (await this.executor(input)) as Awaited<Output>;\n }\n}\n\nfunction identity<T>(input: T): T {\n return input;\n}\n\nasync function mapWithConcurrency<Input, Output>(\n inputs: Input[],\n concurrency: number,\n fn: (input: Input) => Promise<Output>,\n): Promise<Output[]> {\n const limit = Math.max(1, Math.trunc(concurrency));\n const results = new Array<Output>(inputs.length);\n let nextIndex = 0;\n\n async function worker(): Promise<void> {\n while (nextIndex < inputs.length) {\n const index = nextIndex;\n nextIndex += 1;\n results[index] = await fn(inputs[index] as Input);\n }\n }\n\n await Promise.all(Array.from({ length: Math.min(limit, inputs.length) }, () => worker()));\n return results;\n}\n"],"mappings":";AAqBO,IAAM,WAAN,MAA4E;AAAA,EACjF,YAA6B,UAAsD;AAAtD;AAAA,EAAuD;AAAA,EAAvD;AAAA;AAAA,EAG7B,MAAM,IAAI,OAAwC;AAChD,WAAO,MAAM,KAAK,SAAS,KAAK;AAAA,EAClC;AAAA;AAAA,EAGA,MAAM,MACJ,QACA,SACiC;AACjC,WAAO,mBAAmB,CAAC,GAAG,MAAM,GAAG,QAAQ,aAAa,CAAC,UAAU,KAAK,IAAI,KAAK,CAAC;AAAA,EACxF;AACF;AAGO,IAAM,kBAAN,MAAM,iBAAuC;AAAA,EAClD,YACmB,WAAuD,UAGxE;AAHiB;AAAA,EAGhB;AAAA,EAHgB;AAAA;AAAA,EAMnB,KACE,IACuC;AACvC,WAAO,IAAI,iBAAsC,OAAO,UAAkC;AACxF,YAAM,SAAS,MAAM,GAAG,MAAM,KAAK,QAAQ,KAAK,CAAC;AACjD,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,IAAU,IAA8E;AACtF,WAAO,IAAI,iBAAsC,OAAO,UAAkC;AACxF,YAAM,SAAS,MAAM,GAAG,IAAI,MAAM,KAAK,QAAQ,KAAK,CAAC;AACrD,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,SACE,UACkD;AAClD,WAAO,IAAI,iBAAiD,OAAO,UAAU;AAC3E,YAAM,QAAQ,MAAM,KAAK,QAAQ,KAAK;AACtC,YAAM,UAAU,MAAM,QAAQ;AAAA,QAC5B,OAAO,QAAQ,QAAQ,EAAE,IAAI,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,CAAU;AAAA,MACvF;AACA,aAAO,OAAO,YAAY,OAAO;AAAA,IACnC,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,OAA+D;AACpE,WAAO,KAAK,KAAK,OAAO,UAAU;AAChC,YAAM,WAAW,MAAM,MAAM,OAAO,OAAO,KAAK,CAAC,EAAE,KAAK;AACxD,aAAO,SAAS;AAAA,IAClB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QAAW,WAAqE;AAC9E,WAAO,KAAK,KAAK,CAAC,UAAU,UAAU,QAAQ,OAAO,KAAK,CAAC,CAAC;AAAA,EAC9D;AAAA;AAAA,EAGA,QAA0C;AACxC,WAAO,IAAI,SAAiC,CAAC,UAAU,KAAK,QAAQ,KAAK,CAAC;AAAA,EAC5E;AAAA,EAEA,MAAc,QAAQ,OAAwC;AAC5D,WAAQ,MAAM,KAAK,SAAS,KAAK;AAAA,EACnC;AACF;AAEA,SAAS,SAAY,OAAa;AAChC,SAAO;AACT;AAEA,eAAe,mBACb,QACA,aACA,IACmB;AACnB,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,WAAW,CAAC;AACjD,QAAM,UAAU,IAAI,MAAc,OAAO,MAAM;AAC/C,MAAI,YAAY;AAEhB,iBAAe,SAAwB;AACrC,WAAO,YAAY,OAAO,QAAQ;AAChC,YAAM,QAAQ;AACd,mBAAa;AACb,cAAQ,KAAK,IAAI,MAAM,GAAG,OAAO,KAAK,CAAU;AAAA,IAClD;AAAA,EACF;AAEA,QAAM,QAAQ,IAAI,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,OAAO,OAAO,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;AACxF,SAAO;AACT;","names":[]}
|