@mozaik-ai/core 0.8.4 → 0.9.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.
- package/dist/index.d.mts +14 -2
- package/dist/index.d.ts +14 -2
- package/dist/index.js +51 -15
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +51 -15
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -41,7 +41,7 @@ interface Message {
|
|
|
41
41
|
content: string | Array<TextPart | ImagePart>;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
declare const OPENAI_MODELS: readonly ["gpt-5", "gpt-5-mini", "gpt-5-nano", "gpt-5.1"];
|
|
44
|
+
declare const OPENAI_MODELS: readonly ["gpt-5", "gpt-5-mini", "gpt-5-nano", "gpt-5.1", "gpt-5.2", "gpt-5.4"];
|
|
45
45
|
type OpenAIModel = (typeof OPENAI_MODELS)[number];
|
|
46
46
|
declare const ANTHROPIC_MODELS: readonly ["claude-sonnet-4.5", "claude-haiku-4.5", "claude-opus-4.5"];
|
|
47
47
|
type AnthropicModel = (typeof ANTHROPIC_MODELS)[number];
|
|
@@ -60,7 +60,15 @@ type MozaikRequest = {
|
|
|
60
60
|
task?: string;
|
|
61
61
|
structuredOutput?: ZodObject<any>;
|
|
62
62
|
tools?: Tool[];
|
|
63
|
+
reasoningEffort?: ReasoningEffort;
|
|
63
64
|
};
|
|
65
|
+
declare enum ReasoningEffort {
|
|
66
|
+
NONE = "none",
|
|
67
|
+
LOW = "low",
|
|
68
|
+
MEDIUM = "medium",
|
|
69
|
+
HIGH = "high",
|
|
70
|
+
MAX = "max"
|
|
71
|
+
}
|
|
64
72
|
|
|
65
73
|
declare abstract class RequestBuilder {
|
|
66
74
|
request: any;
|
|
@@ -70,6 +78,7 @@ declare abstract class RequestBuilder {
|
|
|
70
78
|
abstract addMessages(messages: Message[]): RequestBuilder;
|
|
71
79
|
abstract addStructuredOutput(schema: ZodObject<any>): RequestBuilder;
|
|
72
80
|
abstract addTools(tools: Tool[]): RequestBuilder;
|
|
81
|
+
abstract addReasoningEffort(effort: ReasoningEffort): RequestBuilder;
|
|
73
82
|
build(): any;
|
|
74
83
|
}
|
|
75
84
|
|
|
@@ -114,7 +123,10 @@ type UsageEntry = {
|
|
|
114
123
|
};
|
|
115
124
|
type MozaikResponse = {
|
|
116
125
|
data: any;
|
|
117
|
-
|
|
126
|
+
usage: {
|
|
127
|
+
entries: UsageEntry[];
|
|
128
|
+
totalUsdCost: number;
|
|
129
|
+
};
|
|
118
130
|
};
|
|
119
131
|
|
|
120
132
|
export { type Message, type Model, MozaikAgent, type MozaikRequest, type MozaikResponse, PlanningAgent, Task, type Tool, WorkUnit, Workflow };
|
package/dist/index.d.ts
CHANGED
|
@@ -41,7 +41,7 @@ interface Message {
|
|
|
41
41
|
content: string | Array<TextPart | ImagePart>;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
declare const OPENAI_MODELS: readonly ["gpt-5", "gpt-5-mini", "gpt-5-nano", "gpt-5.1"];
|
|
44
|
+
declare const OPENAI_MODELS: readonly ["gpt-5", "gpt-5-mini", "gpt-5-nano", "gpt-5.1", "gpt-5.2", "gpt-5.4"];
|
|
45
45
|
type OpenAIModel = (typeof OPENAI_MODELS)[number];
|
|
46
46
|
declare const ANTHROPIC_MODELS: readonly ["claude-sonnet-4.5", "claude-haiku-4.5", "claude-opus-4.5"];
|
|
47
47
|
type AnthropicModel = (typeof ANTHROPIC_MODELS)[number];
|
|
@@ -60,7 +60,15 @@ type MozaikRequest = {
|
|
|
60
60
|
task?: string;
|
|
61
61
|
structuredOutput?: ZodObject<any>;
|
|
62
62
|
tools?: Tool[];
|
|
63
|
+
reasoningEffort?: ReasoningEffort;
|
|
63
64
|
};
|
|
65
|
+
declare enum ReasoningEffort {
|
|
66
|
+
NONE = "none",
|
|
67
|
+
LOW = "low",
|
|
68
|
+
MEDIUM = "medium",
|
|
69
|
+
HIGH = "high",
|
|
70
|
+
MAX = "max"
|
|
71
|
+
}
|
|
64
72
|
|
|
65
73
|
declare abstract class RequestBuilder {
|
|
66
74
|
request: any;
|
|
@@ -70,6 +78,7 @@ declare abstract class RequestBuilder {
|
|
|
70
78
|
abstract addMessages(messages: Message[]): RequestBuilder;
|
|
71
79
|
abstract addStructuredOutput(schema: ZodObject<any>): RequestBuilder;
|
|
72
80
|
abstract addTools(tools: Tool[]): RequestBuilder;
|
|
81
|
+
abstract addReasoningEffort(effort: ReasoningEffort): RequestBuilder;
|
|
73
82
|
build(): any;
|
|
74
83
|
}
|
|
75
84
|
|
|
@@ -114,7 +123,10 @@ type UsageEntry = {
|
|
|
114
123
|
};
|
|
115
124
|
type MozaikResponse = {
|
|
116
125
|
data: any;
|
|
117
|
-
|
|
126
|
+
usage: {
|
|
127
|
+
entries: UsageEntry[];
|
|
128
|
+
totalUsdCost: number;
|
|
129
|
+
};
|
|
118
130
|
};
|
|
119
131
|
|
|
120
132
|
export { type Message, type Model, MozaikAgent, type MozaikRequest, type MozaikResponse, PlanningAgent, Task, type Tool, WorkUnit, Workflow };
|
package/dist/index.js
CHANGED
|
@@ -60,7 +60,7 @@ var EndpointResolver = class {
|
|
|
60
60
|
};
|
|
61
61
|
|
|
62
62
|
// src/types/model.ts
|
|
63
|
-
var OPENAI_MODELS = ["gpt-5", "gpt-5-mini", "gpt-5-nano", "gpt-5.1"];
|
|
63
|
+
var OPENAI_MODELS = ["gpt-5", "gpt-5-mini", "gpt-5-nano", "gpt-5.1", "gpt-5.2", "gpt-5.4"];
|
|
64
64
|
var latest_sonnet = "claude-sonnet-4-5-20250929";
|
|
65
65
|
var latest_haiku = "claude-haiku-4-5-20251001";
|
|
66
66
|
var latest_opus = "claude-opus-4-5-20251101";
|
|
@@ -71,7 +71,7 @@ var ANTHROPIC_MODEL_MAP = {
|
|
|
71
71
|
"claude-opus-4.5": latest_opus
|
|
72
72
|
};
|
|
73
73
|
|
|
74
|
-
// src/core/
|
|
74
|
+
// src/core/request-handler/capability.ts
|
|
75
75
|
var CapabilityHandler = class {
|
|
76
76
|
setNextHandler(capability) {
|
|
77
77
|
this.nextHandler = capability;
|
|
@@ -85,7 +85,7 @@ var CapabilityHandler = class {
|
|
|
85
85
|
}
|
|
86
86
|
};
|
|
87
87
|
|
|
88
|
-
// src/core/
|
|
88
|
+
// src/core/request-handler/messages.ts
|
|
89
89
|
var MessagesHandler = class extends CapabilityHandler {
|
|
90
90
|
apply(request, builder) {
|
|
91
91
|
if (request.messages) {
|
|
@@ -94,7 +94,7 @@ var MessagesHandler = class extends CapabilityHandler {
|
|
|
94
94
|
}
|
|
95
95
|
};
|
|
96
96
|
|
|
97
|
-
// src/core/
|
|
97
|
+
// src/core/request-handler/task.ts
|
|
98
98
|
var TaskHandler = class extends CapabilityHandler {
|
|
99
99
|
apply(request, builder) {
|
|
100
100
|
if (request.task) {
|
|
@@ -103,7 +103,7 @@ var TaskHandler = class extends CapabilityHandler {
|
|
|
103
103
|
}
|
|
104
104
|
};
|
|
105
105
|
|
|
106
|
-
// src/core/
|
|
106
|
+
// src/core/request-handler/model.ts
|
|
107
107
|
var ModelHandler = class extends CapabilityHandler {
|
|
108
108
|
apply(request, builder) {
|
|
109
109
|
if (request.model) {
|
|
@@ -112,7 +112,7 @@ var ModelHandler = class extends CapabilityHandler {
|
|
|
112
112
|
}
|
|
113
113
|
};
|
|
114
114
|
|
|
115
|
-
// src/core/
|
|
115
|
+
// src/core/request-handler/structured-output.ts
|
|
116
116
|
var StructuredOutputlHandler = class extends CapabilityHandler {
|
|
117
117
|
apply(request, builder) {
|
|
118
118
|
if (request.structuredOutput) {
|
|
@@ -121,7 +121,7 @@ var StructuredOutputlHandler = class extends CapabilityHandler {
|
|
|
121
121
|
}
|
|
122
122
|
};
|
|
123
123
|
|
|
124
|
-
// src/core/
|
|
124
|
+
// src/core/request-handler/tools.ts
|
|
125
125
|
var ToolsHandler = class extends CapabilityHandler {
|
|
126
126
|
apply(mozaikRequest, requestBuilder) {
|
|
127
127
|
if (mozaikRequest.tools && mozaikRequest.tools.length > 0) {
|
|
@@ -246,6 +246,24 @@ var OpenAIResponsesBuilder = class extends RequestBuilder {
|
|
|
246
246
|
}));
|
|
247
247
|
return this;
|
|
248
248
|
}
|
|
249
|
+
addReasoningEffort(effort) {
|
|
250
|
+
let reasoningEffort = "";
|
|
251
|
+
if (effort === "none" /* NONE */) {
|
|
252
|
+
reasoningEffort = "none";
|
|
253
|
+
} else if (effort === "low" /* LOW */) {
|
|
254
|
+
reasoningEffort = "low";
|
|
255
|
+
} else if (effort === "medium" /* MEDIUM */) {
|
|
256
|
+
reasoningEffort = "medium";
|
|
257
|
+
} else if (effort === "high" /* HIGH */) {
|
|
258
|
+
reasoningEffort = "high";
|
|
259
|
+
} else if (effort === "max" /* MAX */) {
|
|
260
|
+
reasoningEffort = "xhigh";
|
|
261
|
+
}
|
|
262
|
+
this.request.reasoning = {
|
|
263
|
+
effort: reasoningEffort
|
|
264
|
+
};
|
|
265
|
+
return this;
|
|
266
|
+
}
|
|
249
267
|
};
|
|
250
268
|
|
|
251
269
|
// src/providers/openai/client/default.ts
|
|
@@ -291,13 +309,13 @@ var ResponseHandler = class {
|
|
|
291
309
|
|
|
292
310
|
// src/providers/openai/response-handler/output-parsed.ts
|
|
293
311
|
var OutputParsedHandler = class extends ResponseHandler {
|
|
294
|
-
async handle(
|
|
295
|
-
const providerResponse =
|
|
312
|
+
async handle(mozaikResponse) {
|
|
313
|
+
const providerResponse = mozaikResponse.providerResponse;
|
|
296
314
|
if (providerResponse.output_parsed) {
|
|
297
|
-
|
|
298
|
-
return
|
|
315
|
+
mozaikResponse.setResponseData(providerResponse.output_parsed);
|
|
316
|
+
return mozaikResponse;
|
|
299
317
|
}
|
|
300
|
-
return await this.nextHandler.handle(
|
|
318
|
+
return await this.nextHandler.handle(mozaikResponse);
|
|
301
319
|
}
|
|
302
320
|
};
|
|
303
321
|
|
|
@@ -511,9 +529,9 @@ var OpenAIResponses = class extends Endpoint {
|
|
|
511
529
|
super();
|
|
512
530
|
this.requestBuilder = new OpenAIResponsesBuilder();
|
|
513
531
|
}
|
|
514
|
-
async sendRequest(
|
|
532
|
+
async sendRequest(mozaikRequest) {
|
|
515
533
|
try {
|
|
516
|
-
const request = this.buildRequest(
|
|
534
|
+
const request = this.buildRequest(mozaikRequest);
|
|
517
535
|
const client = OpenAIClientResolver.resolve(request);
|
|
518
536
|
const response = await client.send(request);
|
|
519
537
|
const mozaikResponse = new MozaikResponse();
|
|
@@ -521,7 +539,7 @@ var OpenAIResponses = class extends Endpoint {
|
|
|
521
539
|
const usageHandler = new UsageHandler();
|
|
522
540
|
const functionCallsHandler = new FunctionCallsHandler(
|
|
523
541
|
request,
|
|
524
|
-
|
|
542
|
+
mozaikRequest.tools ? mozaikRequest.tools : []
|
|
525
543
|
);
|
|
526
544
|
const outputParsedHandler = new OutputParsedHandler();
|
|
527
545
|
const outputTextHandler = new OutputTextHandler();
|
|
@@ -681,6 +699,24 @@ var AnthropicRequestBuilder = class extends RequestBuilder {
|
|
|
681
699
|
}));
|
|
682
700
|
return this;
|
|
683
701
|
}
|
|
702
|
+
addReasoningEffort(effort) {
|
|
703
|
+
let reasoningEffort = "";
|
|
704
|
+
if (effort === "none" /* NONE */) {
|
|
705
|
+
return this;
|
|
706
|
+
} else if (effort === "low" /* LOW */) {
|
|
707
|
+
reasoningEffort = "low";
|
|
708
|
+
} else if (effort === "medium" /* MEDIUM */) {
|
|
709
|
+
reasoningEffort = "medium";
|
|
710
|
+
} else if (effort === "high" /* HIGH */) {
|
|
711
|
+
reasoningEffort = "high";
|
|
712
|
+
} else if (effort === "max" /* MAX */) {
|
|
713
|
+
reasoningEffort = "max";
|
|
714
|
+
}
|
|
715
|
+
this.request.output_config = {
|
|
716
|
+
effort: reasoningEffort
|
|
717
|
+
};
|
|
718
|
+
return this;
|
|
719
|
+
}
|
|
684
720
|
build() {
|
|
685
721
|
if (!this.request.max_tokens) {
|
|
686
722
|
this.request.max_tokens = 1024;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core/workflow/work-unit.ts","../src/core/endpoint/request-gateway.ts","../src/core/endpoint/endpoint-resolver.ts","../src/types/model.ts","../src/core/command-handler/capability.ts","../src/core/command-handler/messages.ts","../src/core/command-handler/task.ts","../src/core/command-handler/model.ts","../src/core/command-handler/structured-output.ts","../src/core/command-handler/tools.ts","../src/core/endpoint/endpoint.ts","../src/core/endpoint/request-builder.ts","../src/providers/openai/mapper.ts","../src/providers/openai/builder.ts","../src/providers/openai/client/default.ts","../src/providers/openai/client/parser.ts","../src/providers/openai/client/resolver.ts","../src/core/endpoint/response-handler.ts","../src/providers/openai/response-handler/output-parsed.ts","../src/providers/openai/response-handler/content.ts","../src/providers/openai/response-handler/output-text.ts","../src/core/usage-entry.ts","../src/providers/openai/model-pricing.ts","../src/providers/openai/response-handler/function-calls.ts","../src/core/response.ts","../src/providers/openai/response-handler/usage.ts","../src/providers/openai/endpoint.ts","../src/providers/anthropic/mapper.ts","../src/providers/anthropic/builder.ts","../src/providers/anthropic/client/default.ts","../src/providers/anthropic/client/parser.ts","../src/providers/anthropic/client/resolver.ts","../src/providers/anthropic/response-handler/parsed-output.ts","../src/providers/anthropic/response-handler/content.ts","../src/providers/anthropic/model-pricing.ts","../src/providers/anthropic/response-handler/tool-use.ts","../src/providers/anthropic/response-handler/usage.ts","../src/providers/anthropic/response-handler/undhandled.ts","../src/providers/anthropic/endpoint.ts","../src/providers/endpoint-resolver.ts","../src/core/agents/agent.ts","../src/core/workflow/schema/plan.ts","../src/core/workflow/execution/parallel.ts","../src/core/workflow/execution/sequential.ts","../src/core/workflow/execution/strategy-factory.ts","../src/core/workflow/hooks/cluster.ts","../src/core/workflow/hooks/logger.ts","../src/core/workflow/hooks/index.ts","../src/core/workflow/workflow.ts","../src/core/workflow/task.ts","../src/core/workflow/mapper.ts","../src/core/agents/planner.ts"],"sourcesContent":["import { WorkUnit } from \"@core/workflow/work-unit\"\nimport { PlanningAgent } from \"@/core/agents/planner\"\nimport { Task } from \"@core/workflow/task\"\nimport { Workflow } from \"@core/workflow/workflow\"\nimport { MozaikAgent } from \"@core/agents/agent\"\nimport { Message } from \"@/types/message\"\nimport { Model } from \"@/types/model\"\nimport { Tool } from \"@/types/tool\"\nimport { MozaikResponse } from \"@/types/response\"\nimport { MozaikRequest } from \"@/types/request\"\n\nexport { Model, Message, Tool, Workflow, Task, WorkUnit, PlanningAgent, MozaikAgent, MozaikRequest, MozaikResponse }\n","import { ExecutionHook } from \"./hooks/execution-hook\"\n\nexport abstract class WorkUnit {\n\tconstructor() {}\n\n\tabstract execute(hook: ExecutionHook): Promise<any>\n}\n","import { MozaikRequest } from \"@/types/request\"\nimport { Endpoint } from \"./endpoint\"\nimport { EndpointResolver } from \"./endpoint-resolver\"\n\nexport class RequestGateway {\n\tendpoint!: Endpoint\n\n\tconstructor(readonly endpointResolver: EndpointResolver) {}\n\n\tasync invoke(request: MozaikRequest): Promise<any> {\n\t\tthis.endpoint = this.endpointResolver.resolve(request.model)\n\t\treturn await this.endpoint.sendRequest(request)\n\t}\n}\n","import { Endpoint } from \"./endpoint\"\n\nexport abstract class EndpointResolver {\n\tabstract resolve(model: string): Endpoint\n}\n","export const OPENAI_MODELS = [\"gpt-5\", \"gpt-5-mini\", \"gpt-5-nano\", \"gpt-5.1\"] as const\n\nexport type OpenAIModel = (typeof OPENAI_MODELS)[number]\n\nconst latest_sonnet = \"claude-sonnet-4-5-20250929\"\nconst latest_haiku = \"claude-haiku-4-5-20251001\"\nconst latest_opus = \"claude-opus-4-5-20251101\"\n\nexport const ANTHROPIC_MODELS = [\"claude-sonnet-4.5\", \"claude-haiku-4.5\", \"claude-opus-4.5\"] as const\n\nexport const ANTHROPIC_MODEL_MAP = {\n\t\"claude-sonnet-4.5\": latest_sonnet,\n\t\"claude-haiku-4.5\": latest_haiku,\n\t\"claude-opus-4.5\": latest_opus,\n} as const\n\nexport type AnthropicModel = (typeof ANTHROPIC_MODELS)[number]\n\nexport type Model = OpenAIModel | AnthropicModel\n","import { MozaikRequest } from \"@/types/request\"\nimport { RequestBuilder } from \"../endpoint/request-builder\"\n\nexport abstract class CapabilityHandler {\n\tabstract nextHandler: CapabilityHandler\n\n\tsetNextHandler(capability: CapabilityHandler): CapabilityHandler {\n\t\tthis.nextHandler = capability\n\t\treturn this.nextHandler\n\t}\n\n\tabstract apply(request: MozaikRequest, requestBuilder: RequestBuilder): any\n\n\thandle(request: MozaikRequest, builder: RequestBuilder) {\n\t\tthis.apply(request, builder)\n\n\t\tif (this.nextHandler) {\n\t\t\tthis.nextHandler.handle(request, builder)\n\t\t}\n\t}\n}\n","import { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { CapabilityHandler } from \"./capability\"\nimport { MozaikRequest } from \"@/types/request\"\n\nexport class MessagesHandler extends CapabilityHandler {\n\tnextHandler!: CapabilityHandler\n\n\tapply(request: MozaikRequest, builder: RequestBuilder) {\n\t\tif (request.messages) {\n\t\t\tbuilder.addMessages(request.messages)\n\t\t}\n\t}\n}\n","import { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { CapabilityHandler } from \"./capability\"\nimport { MozaikRequest } from \"@/types/request\"\n\nexport class TaskHandler extends CapabilityHandler {\n\tnextHandler!: CapabilityHandler\n\n\tapply(request: MozaikRequest, builder: RequestBuilder) {\n\t\tif (request.task) {\n\t\t\tbuilder.addTask(request.task)\n\t\t}\n\t}\n}\n","import { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { CapabilityHandler } from \"./capability\"\nimport { MozaikRequest } from \"@/types/request\"\n\nexport class ModelHandler extends CapabilityHandler {\n\tnextHandler!: CapabilityHandler\n\n\tapply(request: MozaikRequest, builder: RequestBuilder) {\n\t\tif (request.model) {\n\t\t\tbuilder.addModel(request.model)\n\t\t}\n\t}\n}\n","import { MozaikRequest } from \"@/types/request\"\nimport { CapabilityHandler } from \"./capability\"\nimport { RequestBuilder } from \"@core/endpoint/request-builder\"\n\nexport class StructuredOutputlHandler extends CapabilityHandler {\n\tnextHandler!: CapabilityHandler\n\n\tapply(request: MozaikRequest, builder: RequestBuilder) {\n\t\tif (request.structuredOutput) {\n\t\t\tbuilder.addStructuredOutput(request.structuredOutput)\n\t\t}\n\t}\n}\n","import { MozaikRequest } from \"@/types/request\"\nimport { RequestBuilder } from \"../endpoint/request-builder\"\nimport { CapabilityHandler } from \"./capability\"\n\nexport class ToolsHandler extends CapabilityHandler {\n\tnextHandler!: CapabilityHandler\n\n\tapply(mozaikRequest: MozaikRequest, requestBuilder: RequestBuilder) {\n\t\tif (mozaikRequest.tools && mozaikRequest.tools.length > 0) {\n\t\t\trequestBuilder.addTools(mozaikRequest.tools)\n\t\t}\n\t}\n}\n","import { RequestBuilder } from \"./request-builder\"\nimport { CapabilityHandler } from \"../command-handler/capability\"\nimport { MessagesHandler } from \"../command-handler/messages\"\nimport { TaskHandler } from \"../command-handler/task\"\nimport { ModelHandler } from \"../command-handler/model\"\nimport { StructuredOutputlHandler } from \"../command-handler/structured-output\"\nimport { MozaikRequest } from \"@/types/request\"\nimport { ToolsHandler } from \"../command-handler/tools\"\n\nexport abstract class Endpoint {\n\tabstract requestBuilder: RequestBuilder\n\trequest: MozaikRequest | null = null\n\n\tbuildRequest(request: MozaikRequest): any {\n\t\tthis.request = request\n\n\t\tthis.requestBuilder.initialize()\n\n\t\tconst messagesHandler: CapabilityHandler = new MessagesHandler()\n\t\tconst taskHandler: CapabilityHandler = new TaskHandler()\n\t\tconst modelHandler: CapabilityHandler = new ModelHandler()\n\t\tconst structuredOutputHandler: CapabilityHandler = new StructuredOutputlHandler()\n\t\tconst toolsHandler: CapabilityHandler = new ToolsHandler()\n\n\t\tmessagesHandler\n\t\t\t.setNextHandler(taskHandler)\n\t\t\t.setNextHandler(modelHandler)\n\t\t\t.setNextHandler(structuredOutputHandler)\n\t\t\t.setNextHandler(toolsHandler)\n\n\t\tmessagesHandler.handle(request, this.requestBuilder)\n\n\t\treturn this.requestBuilder.build()\n\t}\n\n\tabstract sendRequest(providerRequest: any): any\n}\n","import { Message } from \"@/types/message\"\nimport { Tool } from \"@/types/tool\"\nimport { ZodObject } from \"zod\"\n\nexport abstract class RequestBuilder {\n\trequest: any\n\n\tinitialize() {\n\t\tthis.request = {}\n\t}\n\n\tabstract addModel(model: string): RequestBuilder\n\tabstract addTask(task: string): RequestBuilder\n\tabstract addMessages(messages: Message[]): RequestBuilder\n\tabstract addStructuredOutput(schema: ZodObject<any>): RequestBuilder\n\tabstract addTools(tools: Tool[]): RequestBuilder\n\n\tbuild() {\n\t\treturn this.request\n\t}\n}\n","import { Message } from \"@/types/message\"\nimport { Tool } from \"@/types/tool\"\n\nexport interface ToolDefinition {\n\ttype: \"function\"\n\tname: string\n\tdescription: string\n\tparameters: any\n\tstrict?: boolean\n}\n\nexport class OpenAIResponsesMapper {\n\t/**\n\t * Convert domain Messages to Responses API instructions format\n\t *\n\t * The Responses API uses 'instructions' (system prompt) rather than messages array.\n\t * For multi-turn conversations, use conversation.id or previous_response_id parameters.\n\t */\n\ttoInstructions(messages: Message[]): string {\n\t\tif (messages.length === 0) {\n\t\t\tthrow new Error(\"[ResponsesMapper] Cannot create instructions from empty messages\")\n\t\t}\n\n\t\t// Find system message if exists, otherwise use first user message as context\n\t\tconst systemMessage = messages.find((m) => m.role === \"system\")\n\n\t\tif (systemMessage) {\n\t\t\treturn typeof systemMessage.content === \"string\"\n\t\t\t\t? systemMessage.content\n\t\t\t\t: this.extractTextFromContent(systemMessage.content)\n\t\t}\n\n\t\t// Fallback: create instructions from context\n\t\treturn \"You are a helpful assistant.\"\n\t}\n\n\t/**\n\t * Extract the user's input from messages\n\t * Returns the last user message content for use in prompt variables.\n\t * In Responses API, the actual user query is typically passed via prompt variables\n\t * or handled through conversation continuation.\n\t */\n\textractUserInput(messages: Message[]): string {\n\t\tconst userMessages = messages.filter((m) => m.role === \"user\")\n\n\t\tif (userMessages.length === 0) {\n\t\t\treturn \"\"\n\t\t}\n\n\t\tconst lastUserMessage = userMessages[userMessages.length - 1]\n\t\treturn typeof lastUserMessage.content === \"string\"\n\t\t\t? lastUserMessage.content\n\t\t\t: this.extractTextFromContent(lastUserMessage.content)\n\t}\n\n\tprivate extractTextFromContent(content: any[]): string {\n\t\treturn content\n\t\t\t.filter((part) => part.type === \"text\")\n\t\t\t.map((part) => part.text)\n\t\t\t.join(\" \")\n\t}\n\n\t/**\n\t * Map tools to Responses API format\n\t */\n\ttoTools(tools: Tool[]): ToolDefinition[] {\n\t\treturn tools.map((t) => ({\n\t\t\ttype: \"function\",\n\t\t\tname: t.name,\n\t\t\tdescription: t.description,\n\t\t\tparameters: t.schema,\n\t\t\tstrict: true, // Enable strict mode by default for better validation\n\t\t}))\n\t}\n}\n","import { Message } from \"@/types/message\"\nimport { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { OpenAIResponsesMapper } from \"./mapper\"\nimport { zodTextFormat } from \"openai/helpers/zod\"\nimport { ZodObject } from \"zod\"\nimport { Tool } from \"@/types/tool\"\n\nexport class OpenAIResponsesBuilder extends RequestBuilder {\n\tconstructor(private mapper = new OpenAIResponsesMapper()) {\n\t\tsuper()\n\t}\n\n\taddModel(model: string): RequestBuilder {\n\t\tthis.request.model = model\n\t\treturn this\n\t}\n\n\taddTask(task: string): RequestBuilder {\n\t\tthis.request.input = task\n\t\treturn this\n\t}\n\n\taddMessages(messages: Message[]): RequestBuilder {\n\t\tconst instructions = this.mapper.toInstructions(messages)\n\t\t// Set optional instructions if there's a system message\n\t\tif (instructions && instructions !== \"You are a helpful assistant.\") {\n\t\t\tthis.request.instructions = instructions\n\t\t}\n\n\t\treturn this\n\t}\n\n\taddStructuredOutput(schema: ZodObject): RequestBuilder {\n\t\tthis.request.text = {\n\t\t\tformat: zodTextFormat(schema, \"outputSchema\"),\n\t\t}\n\t\treturn this\n\t}\n\n\taddTools(tools: Tool[]): RequestBuilder {\n\t\tthis.request.tools = tools.map((tool) => ({\n\t\t\ttype: \"function\" as const,\n\t\t\tname: tool.name,\n\t\t\tdescription: tool.description,\n\t\t\tparameters: tool.schema,\n\t\t}))\n\t\treturn this\n\t}\n}\n","import OpenAI from \"openai\"\nimport { SendingClient } from \"@core/endpoint/client\"\n\nexport class OpenAIDefaultClient implements SendingClient {\n\tconstructor(private client = new OpenAI()) {}\n\n\tasync send(request: any): Promise<any> {\n\t\treturn await this.client.responses.create(request)\n\t}\n}\n","import OpenAI from \"openai\"\nimport { SendingClient } from \"@core/endpoint/client\"\n\nexport class OpenAIParserClient implements SendingClient {\n\tconstructor(private client = new OpenAI()) {}\n\n\tasync send(request: any): Promise<any> {\n\t\treturn await this.client.responses.parse(request)\n\t}\n}\n","import { SendingClient } from \"@core/endpoint/client\"\nimport { OpenAIDefaultClient } from \"./default\"\nimport { OpenAIParserClient } from \"./parser\"\n\nexport class OpenAIClientResolver {\n\tstatic resolve(request: any): SendingClient {\n\t\tif (request.text && request.text.format) {\n\t\t\treturn new OpenAIParserClient()\n\t\t} else {\n\t\t\treturn new OpenAIDefaultClient()\n\t\t}\n\t}\n}\n","import { MozaikResponse } from \"../response\"\n\nexport abstract class ResponseHandler {\n\tabstract nextHandler: ResponseHandler\n\n\tsetNextHandler(responseHandler: ResponseHandler): ResponseHandler {\n\t\tthis.nextHandler = responseHandler\n\t\treturn this.nextHandler\n\t}\n\n\tabstract handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse>\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class OutputParsedHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(responseContext: MozaikResponse) {\n\t\tconst providerResponse = responseContext.providerResponse\n\t\tif (providerResponse.output_parsed) {\n\t\t\tresponseContext.setResponseData(providerResponse.output_parsed)\n\t\t\treturn responseContext\n\t\t}\n\n\t\treturn await this.nextHandler.handle(responseContext)\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class ContentHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tconst firstOutput = providerResponse.output?.[0]\n\t\tif (firstOutput && \"content\" in firstOutput) {\n\t\t\tconst firstContent = firstOutput.content?.[0]\n\t\t\tif (firstContent && \"text\" in firstContent) {\n\t\t\t\tmozaikResponse.setResponseData(firstContent.text)\n\t\t\t\treturn mozaikResponse\n\t\t\t}\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class OutputTextHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tif (providerResponse.output_text) {\n\t\t\tmozaikResponse.setResponseData(providerResponse.output_text)\n\t\t\treturn mozaikResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","export class UsageEntry {\n\tpriceInUsd: number\n\tmodel: string\n\n\tconstructor(priceInUsd: number, model: string) {\n\t\tthis.priceInUsd = priceInUsd\n\t\tthis.model = model\n\t}\n}\n","export class OpenAIModelPricing {\n\tprivate inputPricePer1MToken!: number\n\tprivate outputPricePer1MToken!: number\n\tprivate cachedPricePer1MToken!: number\n\n\tcalculateTotalCost(inputTokens: number, outputTokens: number, cachedInputTokens: number): number {\n\t\tconst inputCost = ((inputTokens - cachedInputTokens) * this.inputPricePer1MToken) / 1_000_000\n\t\tconst outputCost = (outputTokens * this.outputPricePer1MToken) / 1_000_000\n\t\tconst cachedCost = (cachedInputTokens * this.cachedPricePer1MToken) / 1_000_000\n\t\treturn inputCost + outputCost + cachedCost\n\t}\n\n\tgetPriceInUsd(modelName: string, inputTokens: number, outputTokens: number, cachedInputTokens: number): number {\n\t\tif (modelName.startsWith(\"gpt-5-mini\")) {\n\t\t\tthis.inputPricePer1MToken = 0.25\n\t\t\tthis.outputPricePer1MToken = 2\n\t\t\tthis.cachedPricePer1MToken = 0.025\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens, cachedInputTokens)\n\t\t} else if (modelName.startsWith(\"gpt-5-nano\")) {\n\t\t\tthis.inputPricePer1MToken = 0.05\n\t\t\tthis.outputPricePer1MToken = 0.4\n\t\t\tthis.cachedPricePer1MToken = 0.005\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens, cachedInputTokens)\n\t\t} else if (modelName.startsWith(\"gpt-5.1\")) {\n\t\t\tthis.inputPricePer1MToken = 1.25\n\t\t\tthis.outputPricePer1MToken = 10\n\t\t\tthis.cachedPricePer1MToken = 0.125\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens, cachedInputTokens)\n\t\t} else if (modelName.startsWith(\"gpt-5\")) {\n\t\t\tthis.inputPricePer1MToken = 1.25\n\t\t\tthis.outputPricePer1MToken = 10\n\t\t\tthis.cachedPricePer1MToken = 0.125\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens, cachedInputTokens)\n\t\t}\n\n\t\tthrow new Error(`Model name ${modelName} is not supported for this pricing`)\n\t}\n}\n","import { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { OpenAIDefaultClient } from \"../client/default\"\nimport { Tool } from \"@/types/tool\"\nimport { MozaikResponse } from \"@core/response\"\nimport { UsageEntry } from \"@core/usage-entry\"\nimport { OpenAIModelPricing } from \"@providers/openai/model-pricing\"\n\nexport interface ToolCall {\n\tcall_id: string\n\tname: string\n\targuments: string | Record<string, any>\n}\n\nexport interface ToolResult {\n\ttype: \"function_call_output\"\n\tcall_id: string\n\toutput: string\n}\n\nexport class FunctionCallsHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\tclient: OpenAIDefaultClient\n\ttools: Tool[]\n\trequest: any\n\n\tconstructor(request: any, tools: Tool[]) {\n\t\tsuper()\n\t\tthis.request = request\n\t\tthis.tools = tools\n\t\tthis.client = new OpenAIDefaultClient()\n\t}\n\n\tprivate hasToolCalls(response: any): boolean {\n\t\treturn response.output?.some((item: any) => item.type === \"function_call\")\n\t}\n\n\tprivate extractToolCalls(response: any): any[] {\n\t\treturn response.output?.filter((item: any) => item.type === \"function_call\") || []\n\t}\n\n\tprivate resolveTool(call: ToolCall, tools: Tool[]): Tool | null {\n\t\treturn tools.find((t) => t.name === call.name) ?? null\n\t}\n\n\tprivate async executeTool(tool: Tool, rawArgs: ToolCall[\"arguments\"]): Promise<any> {\n\t\tconst args = typeof rawArgs === \"string\" ? JSON.parse(rawArgs) : rawArgs\n\n\t\treturn await tool.invoke(args)\n\t}\n\n\tprivate formatToolResult(callId: string, payload: any): ToolResult {\n\t\treturn {\n\t\t\ttype: \"function_call_output\",\n\t\t\tcall_id: callId,\n\t\t\toutput: JSON.stringify(payload),\n\t\t}\n\t}\n\n\tprivate async executeToolCalls(toolCalls: ToolCall[], tools: Tool[]): Promise<ToolResult[]> {\n\t\tconst results: ToolResult[] = []\n\n\t\tfor (const call of toolCalls) {\n\t\t\tconst tool = this.resolveTool(call, tools)\n\n\t\t\tif (!tool) {\n\t\t\t\tresults.push(\n\t\t\t\t\tthis.formatToolResult(call.call_id, {\n\t\t\t\t\t\terror: `Unknown tool: ${call.name}`,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst result = await this.executeTool(tool, call.arguments)\n\t\t\t\tresults.push(this.formatToolResult(call.call_id, result))\n\t\t\t} catch (err: any) {\n\t\t\t\tresults.push(\n\t\t\t\t\tthis.formatToolResult(call.call_id, {\n\t\t\t\t\t\terror: err.message ?? \"Tool execution failed\",\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\treturn results\n\t}\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tlet providerResponse = mozaikResponse.providerResponse\n\t\tlet toolCallingResponse: any\n\t\twhile (this.hasToolCalls(providerResponse)) {\n\t\t\tconst toolCalls = this.extractToolCalls(providerResponse)\n\n\t\t\tconst toolResults = await this.executeToolCalls(toolCalls, this.tools)\n\n\t\t\t// Continue the conversation with tool results\n\t\t\tthis.request.input = toolResults\n\t\t\tthis.request.previous_response_id = providerResponse.id\n\n\t\t\ttoolCallingResponse = await this.client.send(this.request)\n\n\t\t\tconst openAIModelPricing = new OpenAIModelPricing()\n\t\t\tconst usage = toolCallingResponse.usage\n\t\t\tconst totalCost = openAIModelPricing.getPriceInUsd(\n\t\t\t\tproviderResponse.model,\n\t\t\t\tusage.input_tokens,\n\t\t\t\tusage.output_tokens,\n\t\t\t\tusage.input_token_details?.cached_tokens ?? 0,\n\t\t\t)\n\n\t\t\tmozaikResponse.addUsageEntry(new UsageEntry(totalCost, providerResponse.model))\n\t\t\tmozaikResponse.setProviderResponse(toolCallingResponse)\n\t\t\tmozaikResponse.setResponseData(toolCallingResponse)\n\t\t\tproviderResponse = toolCallingResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { UsageEntry } from \"./usage-entry\"\n\nexport class MozaikResponse {\n\tproviderResponse: any\n\tresponseData?: any\n\tusageEntries: UsageEntry[] = []\n\n\tsetProviderResponse(providerResponse: any): MozaikResponse {\n\t\tthis.providerResponse = providerResponse\n\t\treturn this\n\t}\n\n\taddUsageEntry(usageEntry: UsageEntry): MozaikResponse {\n\t\tthis.usageEntries.push(usageEntry)\n\t\treturn this\n\t}\n\n\tsetResponseData(response: any): MozaikResponse {\n\t\tthis.responseData = response\n\t\treturn this\n\t}\n\n\tgetResponse(): any {\n\t\treturn {\n\t\t\tdata: this.responseData,\n\t\t\tusage: {\n\t\t\t\tentries: this.usageEntries,\n\t\t\t},\n\t\t\ttotalCost: this.usageEntries.reduce((acc, entry) => acc + entry.priceInUsd, 0),\n\t\t}\n\t}\n\n\tgetUsageEntries(): UsageEntry[] {\n\t\treturn this.usageEntries\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { UsageEntry } from \"@core/usage-entry\"\nimport { OpenAIModelPricing } from \"@providers/openai/model-pricing\"\n\nexport class UsageHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tconst usage = providerResponse.usage\n\n\t\tconst openAIModelPricing = new OpenAIModelPricing()\n\t\tconst totalCost = openAIModelPricing.getPriceInUsd(\n\t\t\tproviderResponse.model,\n\t\t\tusage.input_tokens,\n\t\t\tusage.output_tokens,\n\t\t\tusage.input_token_details?.cached_tokens ?? 0,\n\t\t)\n\n\t\tmozaikResponse.addUsageEntry(new UsageEntry(totalCost, providerResponse.model))\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { Endpoint } from \"@core/endpoint/endpoint\"\nimport { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { OpenAIResponsesBuilder } from \"./builder\"\nimport { OpenAIClientResolver } from \"./client/resolver\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { OutputParsedHandler } from \"./response-handler/output-parsed\"\nimport { ContentHandler } from \"./response-handler/content\"\nimport { OutputTextHandler } from \"./response-handler/output-text\"\nimport { FunctionCallsHandler } from \"./response-handler/function-calls\"\nimport { Command } from \"@/types/request\"\nimport { MozaikResponse } from \"@core/response\"\nimport { UsageHandler } from \"./response-handler/usage\"\nimport { UsageEntry } from \"@core/usage-entry\"\n\nexport class OpenAIResponses extends Endpoint {\n\trequestBuilder: RequestBuilder = new OpenAIResponsesBuilder()\n\n\tconstructor() {\n\t\tsuper()\n\t}\n\n\tasync sendRequest(command: Command): Promise<any> {\n\t\ttry {\n\t\t\tconst request = this.buildRequest(command)\n\t\t\tconst client = OpenAIClientResolver.resolve(request)\n\t\t\tconst response = await client.send(request)\n\n\t\t\tconst mozaikResponse = new MozaikResponse()\n\t\t\tmozaikResponse.setProviderResponse(response)\n\n\t\t\t// response handler (chain of responsibilities)\n\t\t\tconst usageHandler: ResponseHandler = new UsageHandler()\n\t\t\tconst functionCallsHandler: ResponseHandler = new FunctionCallsHandler(\n\t\t\t\trequest,\n\t\t\t\tcommand.tools ? command.tools : [],\n\t\t\t)\n\t\t\tconst outputParsedHandler: ResponseHandler = new OutputParsedHandler()\n\t\t\tconst outputTextHandler: ResponseHandler = new OutputTextHandler()\n\t\t\tconst contentHandler: ResponseHandler = new ContentHandler()\n\n\t\t\tusageHandler\n\t\t\t\t.setNextHandler(functionCallsHandler)\n\t\t\t\t.setNextHandler(outputParsedHandler)\n\t\t\t\t.setNextHandler(outputTextHandler)\n\t\t\t\t.setNextHandler(contentHandler)\n\n\t\t\tconst responseHandler = usageHandler\n\n\t\t\tconst result: MozaikResponse = await responseHandler.handle(mozaikResponse)\n\n\t\t\treturn result.getResponse()\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"[OpenAIProvider] Responses API request failed:\", error)\n\t\t\tthrow error\n\t\t}\n\t}\n}\n","import { Message, TextPart, ImagePart } from \"@/types/message\"\nimport type { MessageParam, TextBlockParam, ImageBlockParam } from \"@anthropic-ai/sdk/resources/messages\"\n\nexport class AnthropicMapper {\n\t/**\n\t * Transforms domain messages to Anthropic API format.\n\t * Separates system messages from conversation messages.\n\t */\n\ttoMessages(messages: Message[]): { messages: MessageParam[]; system?: string } {\n\t\tconst anthropicMessages: MessageParam[] = []\n\t\tlet systemPrompt: string | undefined\n\n\t\tfor (const msg of messages) {\n\t\t\t// Extract system messages separately (Anthropic uses dedicated system parameter)\n\t\t\tif (msg.role === \"system\") {\n\t\t\t\tconst content =\n\t\t\t\t\ttypeof msg.content === \"string\"\n\t\t\t\t\t\t? msg.content\n\t\t\t\t\t\t: (msg.content as TextPart[]).map((p) => p.text).join(\"\\n\")\n\n\t\t\t\tsystemPrompt = systemPrompt ? `${systemPrompt}\\n\\n${content}` : content\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Skip tool role messages (not directly supported in basic implementation)\n\t\t\tif (msg.role === \"tool\") {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Map user and assistant messages\n\t\t\tif (msg.role === \"user\" || msg.role === \"assistant\") {\n\t\t\t\tif (typeof msg.content === \"string\") {\n\t\t\t\t\tanthropicMessages.push({\n\t\t\t\t\t\trole: msg.role,\n\t\t\t\t\t\tcontent: msg.content,\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\t// Handle multimodal content (text + images)\n\t\t\t\t\tconst contentBlocks = (msg.content as Array<TextPart | ImagePart>).map((part) => {\n\t\t\t\t\t\tif (part.type === \"text\") {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\t\ttext: part.text,\n\t\t\t\t\t\t\t} as TextBlockParam\n\t\t\t\t\t\t} else if (part.type === \"image_url\") {\n\t\t\t\t\t\t\t// Note: Anthropic requires base64-encoded images\n\t\t\t\t\t\t\t// This is a simplified version - production code should handle URL->base64 conversion\n\t\t\t\t\t\t\tconst imageUrl = part.url\n\n\t\t\t\t\t\t\t// Check if it's already base64 data\n\t\t\t\t\t\t\tif (imageUrl.startsWith(\"data:image\")) {\n\t\t\t\t\t\t\t\tconst matches = imageUrl.match(/data:image\\/(\\w+);base64,(.+)/)\n\t\t\t\t\t\t\t\tif (matches) {\n\t\t\t\t\t\t\t\t\tconst [, mediaType, data] = matches\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\ttype: \"image\" as const,\n\t\t\t\t\t\t\t\t\t\tsource: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"base64\" as const,\n\t\t\t\t\t\t\t\t\t\t\tmedia_type: `image/${mediaType}` as\n\t\t\t\t\t\t\t\t\t\t\t\t| \"image/jpeg\"\n\t\t\t\t\t\t\t\t\t\t\t\t| \"image/png\"\n\t\t\t\t\t\t\t\t\t\t\t\t| \"image/gif\"\n\t\t\t\t\t\t\t\t\t\t\t\t| \"image/webp\",\n\t\t\t\t\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t} as ImageBlockParam\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// For non-base64 URLs, throw error (or you could fetch and convert)\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\"[AnthropicMapper] Image URLs must be base64-encoded. \" +\n\t\t\t\t\t\t\t\t\t\"Convert to data:image/[type];base64,[data] format.\",\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn { type: \"text\" as const, text: \"\" } as TextBlockParam\n\t\t\t\t\t})\n\n\t\t\t\t\tanthropicMessages.push({\n\t\t\t\t\t\trole: msg.role,\n\t\t\t\t\t\tcontent: contentBlocks,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Anthropic requires alternating user/assistant roles\n\t\t// Validate and fix if needed\n\t\tconst validated = this.ensureAlternatingRoles(anthropicMessages)\n\n\t\treturn {\n\t\t\tmessages: validated,\n\t\t\tsystem: systemPrompt,\n\t\t}\n\t}\n\n\t/**\n\t * Ensures messages alternate between user and assistant roles.\n\t * Anthropic API requires this constraint.\n\t */\n\tprivate ensureAlternatingRoles(messages: MessageParam[]): MessageParam[] {\n\t\tif (messages.length === 0) return messages\n\n\t\tconst result: MessageParam[] = []\n\t\tlet lastRole: \"user\" | \"assistant\" | undefined\n\n\t\tfor (const msg of messages) {\n\t\t\t// If same role appears consecutively, merge the messages\n\t\t\tif (lastRole === msg.role && result.length > 0) {\n\t\t\t\tconst lastMsg = result[result.length - 1]\n\n\t\t\t\t// Merge content\n\t\t\t\tif (typeof lastMsg.content === \"string\" && typeof msg.content === \"string\") {\n\t\t\t\t\tlastMsg.content = `${lastMsg.content}\\n${msg.content}`\n\t\t\t\t} else {\n\t\t\t\t\t// For array content, concatenate\n\t\t\t\t\tconst lastContent = Array.isArray(lastMsg.content)\n\t\t\t\t\t\t? lastMsg.content\n\t\t\t\t\t\t: [{ type: \"text\" as const, text: lastMsg.content as string }]\n\t\t\t\t\tconst newContent = Array.isArray(msg.content)\n\t\t\t\t\t\t? msg.content\n\t\t\t\t\t\t: [{ type: \"text\" as const, text: msg.content as string }]\n\t\t\t\t\tlastMsg.content = [...lastContent, ...newContent]\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresult.push(msg)\n\t\t\t\tlastRole = msg.role\n\t\t\t}\n\t\t}\n\n\t\t// Ensure first message is from user (Anthropic requirement)\n\t\tif (result.length > 0 && result[0].role !== \"user\") {\n\t\t\tthrow new Error(\n\t\t\t\t\"[AnthropicMapper] First message must be from user. Anthropic API requires conversations to start with a user message.\",\n\t\t\t)\n\t\t}\n\n\t\treturn result\n\t}\n}\n","import { Message } from \"@/types/message\"\nimport { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { AnthropicMapper } from \"./mapper\"\nimport { betaZodOutputFormat } from \"@anthropic-ai/sdk/helpers/beta/zod\"\nimport { ANTHROPIC_MODEL_MAP, AnthropicModel } from \"@/types/model\"\nimport { ZodObject } from \"zod\"\nimport { Tool } from \"@/types/tool\"\n\nexport class AnthropicRequestBuilder extends RequestBuilder {\n\tprivate mapper = new AnthropicMapper()\n\n\taddModel(model: AnthropicModel): RequestBuilder {\n\t\tthis.request.model = ANTHROPIC_MODEL_MAP[model]\n\t\treturn this\n\t}\n\n\taddTask(task: string): RequestBuilder {\n\t\t// Add task as a user message\n\t\tconst message = {\n\t\t\trole: \"user\" as const,\n\t\t\tcontent: task,\n\t\t}\n\n\t\tif (!this.request.messages) {\n\t\t\tthis.request.messages = []\n\t\t}\n\n\t\tthis.request.messages.push(message)\n\t\treturn this\n\t}\n\n\taddMessages(messages: Message[]): RequestBuilder {\n\t\tconst { messages: anthropicMessages, system } = this.mapper.toMessages(messages)\n\n\t\tthis.request.messages = anthropicMessages\n\n\t\tif (system) {\n\t\t\tthis.request.system = system\n\t\t}\n\n\t\treturn this\n\t}\n\n\taddStructuredOutput(schema: ZodObject): RequestBuilder {\n\t\tthis.request.betas = [\"structured-outputs-2025-11-13\"]\n\t\tthis.request.output_format = betaZodOutputFormat(schema)\n\t\treturn this\n\t}\n\n\taddTools(tools: Tool[]): RequestBuilder {\n\t\tthis.request.tools = tools.map((tool) => ({\n\t\t\tname: tool.name,\n\t\t\tdescription: tool.description,\n\t\t\tinput_schema: tool.schema,\n\t\t}))\n\t\treturn this\n\t}\n\n\tbuild() {\n\t\t// Anthropic requires max_tokens parameter\n\t\tif (!this.request.max_tokens) {\n\t\t\tthis.request.max_tokens = 1024\n\t\t}\n\n\t\treturn this.request\n\t}\n}\n","import { SendingClient } from \"@core/endpoint/client\"\nimport Anthropic from \"@anthropic-ai/sdk\"\n\nexport class AnthropicDefaultClient implements SendingClient {\n\tconstructor(private client = new Anthropic()) {}\n\n\tasync send(request: any): Promise<any> {\n\t\treturn await this.client.messages.create(request)\n\t}\n}\n","import { SendingClient } from \"@core/endpoint/client\"\nimport Anthropic from \"@anthropic-ai/sdk\"\n\nexport class AnthropicParserClient implements SendingClient {\n\tconstructor(private client = new Anthropic()) {}\n\n\tasync send(request: any): Promise<any> {\n\t\treturn await this.client.beta.messages.parse(request)\n\t}\n}\n","import { SendingClient } from \"@core/endpoint/client\"\nimport { AnthropicDefaultClient } from \"./default\"\nimport { AnthropicParserClient } from \"./parser\"\n\nexport class AnthropicClientResolver {\n\tstatic resolve(request: any): SendingClient {\n\t\treturn request.output_format ? new AnthropicParserClient() : new AnthropicDefaultClient()\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class ParsedOutputHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tif (providerResponse.parsed_output) {\n\t\t\tmozaikResponse.setResponseData(providerResponse.parsed_output)\n\t\t\treturn mozaikResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class ContentHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tconst content = providerResponse.content\n\t\t\t.filter((block: any) => block.type === \"text\")\n\t\t\t.map((block: any) => (block.type === \"text\" ? block.text : \"\"))\n\t\t\t.join(\"\")\n\n\t\tif (content) {\n\t\t\tmozaikResponse.setResponseData(content)\n\t\t\treturn mozaikResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","export class AnthropicModelPricing {\n\tprivate inputPricePer1MToken!: number\n\tprivate outputPricePer1MToken!: number\n\n\tcalculateTotalCost(inputTokens: number, outputTokens: number): number {\n\t\tconst inputCost = (inputTokens * this.inputPricePer1MToken) / 1_000_000\n\t\tconst outputCost = (outputTokens * this.outputPricePer1MToken) / 1_000_000\n\t\treturn inputCost + outputCost\n\t}\n\n\tgetPriceInUsd(modelName: string, inputTokens: number, outputTokens: number): number {\n\t\tif (modelName.startsWith(\"claude-sonnet-4-5\")) {\n\t\t\tthis.inputPricePer1MToken = 3\n\t\t\tthis.outputPricePer1MToken = 15\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens)\n\t\t} else if (modelName.startsWith(\"claude-haiku-4-5\")) {\n\t\t\tthis.inputPricePer1MToken = 1\n\t\t\tthis.outputPricePer1MToken = 5\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens)\n\t\t} else if (modelName.startsWith(\"claude-opus-4-5\")) {\n\t\t\tthis.inputPricePer1MToken = 5\n\t\t\tthis.outputPricePer1MToken = 25\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens)\n\t\t}\n\n\t\tthrow new Error(`Model name ${modelName} is not supported for this pricing`)\n\t}\n}\n","import { Tool } from \"@/types/tool\"\nimport Anthropic from \"@anthropic-ai/sdk\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { AnthropicDefaultClient } from \"../client/default\"\nimport { MozaikResponse } from \"@core/response\"\nimport { UsageEntry } from \"@core/usage-entry\"\nimport { AnthropicModelPricing } from \"../model-pricing\"\n\nexport class ToolUseHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\tclient: AnthropicDefaultClient\n\ttools: Tool[]\n\trequest: any\n\n\tconstructor(request: any, tools: Tool[]) {\n\t\tsuper()\n\t\tthis.tools = tools\n\t\tthis.request = request\n\t\tthis.client = new AnthropicDefaultClient()\n\t}\n\n\tprivate async executeToolCalls(tools: Tool[], toolUseBlocks: Anthropic.ToolUseBlock[]): Promise<any[]> {\n\t\tconst results: any[] = []\n\n\t\tfor (const toolUse of toolUseBlocks) {\n\t\t\tconst tool = tools?.find((t) => t.name === toolUse.name)\n\n\t\t\tif (!tool) {\n\t\t\t\tresults.push({\n\t\t\t\t\ttype: \"tool_result\",\n\t\t\t\t\ttool_use_id: toolUse.id,\n\t\t\t\t\tcontent: JSON.stringify({ error: `Unknown tool: ${toolUse.name}` }),\n\t\t\t\t})\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst result = await tool.invoke(toolUse.input)\n\t\t\t\tresults.push({\n\t\t\t\t\ttype: \"tool_result\",\n\t\t\t\t\ttool_use_id: toolUse.id,\n\t\t\t\t\tcontent: JSON.stringify(result),\n\t\t\t\t})\n\t\t\t} catch (error: any) {\n\t\t\t\tresults.push({\n\t\t\t\t\ttype: \"tool_result\",\n\t\t\t\t\ttool_use_id: toolUse.id,\n\t\t\t\t\tcontent: JSON.stringify({ error: error.message }),\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn results\n\t}\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tlet providerResponse = mozaikResponse.providerResponse\n\n\t\twhile (providerResponse.stop_reason === \"tool_use\") {\n\t\t\tconst toolUseBlocks = providerResponse.content.filter(\n\t\t\t\t(block: any): block is Anthropic.ToolUseBlock => block.type === \"tool_use\",\n\t\t\t)\n\n\t\t\t// Add assistant's response to messages\n\t\t\tthis.request.messages.push({\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: providerResponse.content,\n\t\t\t})\n\n\t\t\tconst toolResults = await this.executeToolCalls(this.tools, toolUseBlocks)\n\n\t\t\t// Add tool results as user message\n\t\t\tthis.request.messages.push({\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: toolResults,\n\t\t\t})\n\n\t\t\t// Call model again\n\t\t\tconst toolCallingResponse = await this.client.send(this.request)\n\n\t\t\tconst usage = toolCallingResponse.usage\n\t\t\tconst anthropicModelPricing = new AnthropicModelPricing()\n\t\t\tconst totalCost = anthropicModelPricing.getPriceInUsd(\n\t\t\t\tproviderResponse.model,\n\t\t\t\tusage.input_tokens,\n\t\t\t\tusage.output_tokens,\n\t\t\t)\n\n\t\t\tmozaikResponse.addUsageEntry(new UsageEntry(totalCost, toolCallingResponse.model.name))\n\t\t\tmozaikResponse.setProviderResponse(toolCallingResponse)\n\t\t\tproviderResponse = toolCallingResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { UsageEntry } from \"@core/usage-entry\"\nimport { AnthropicModelPricing } from \"../model-pricing\"\n\nexport class UsageHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tconst usage = providerResponse.usage\n\n\t\tconst anthropicModelPricing = new AnthropicModelPricing()\n\t\tconst totalCost = anthropicModelPricing.getPriceInUsd(\n\t\t\tproviderResponse.model,\n\t\t\tusage.input_tokens,\n\t\t\tusage.output_tokens,\n\t\t)\n\t\tif (usage) {\n\t\t\tmozaikResponse.addUsageEntry(new UsageEntry(totalCost, providerResponse.model))\n\t\t}\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class UnhandledResponseHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tconst id = providerResponse?.id ?? \"unknown\"\n\t\tconst model = providerResponse?.model ?? \"unknown\"\n\n\t\tthrow new Error(`No response handler matched. response_id=${id} model=${model}`)\n\t}\n}\n","import { Endpoint } from \"@core/endpoint/endpoint\"\nimport { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { AnthropicRequestBuilder } from \"./builder\"\nimport { AnthropicClientResolver } from \"./client/resolver\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { ParsedOutputHandler } from \"./response-handler/parsed-output\"\nimport { ContentHandler } from \"./response-handler/content\"\nimport { ToolUseHandler } from \"./response-handler/tool-use\"\nimport { MozaikRequest } from \"@/types/request\"\nimport { MozaikResponse } from \"@core/response\"\nimport { UsageHandler } from \"./response-handler/usage\"\nimport { UnhandledResponseHandler } from \"./response-handler/undhandled\"\n\nexport class AnthropicEndpoint extends Endpoint {\n\trequestBuilder: RequestBuilder = new AnthropicRequestBuilder()\n\n\tasync sendRequest(mozaikRequest: MozaikRequest): Promise<any> {\n\t\tconst providerRequest = this.buildRequest(mozaikRequest)\n\t\tconst client = AnthropicClientResolver.resolve(providerRequest)\n\t\tconst response = await client.send(providerRequest)\n\n\t\tconst mozaikResponse = new MozaikResponse()\n\t\tmozaikResponse.setProviderResponse(response)\n\n\t\t// response handler (chain of responsibilities)\n\t\tconst usageHandler: ResponseHandler = new UsageHandler()\n\t\tconst toolUseHandler: ResponseHandler = new ToolUseHandler(\n\t\t\tproviderRequest,\n\t\t\tmozaikRequest.tools ? mozaikRequest.tools : [],\n\t\t)\n\t\tconst parsedOutputHandler: ResponseHandler = new ParsedOutputHandler()\n\t\tconst contentHandler: ResponseHandler = new ContentHandler()\n\t\tconst unhandledResponseHandler: ResponseHandler = new UnhandledResponseHandler()\n\n\t\tusageHandler\n\t\t\t.setNextHandler(toolUseHandler)\n\t\t\t.setNextHandler(parsedOutputHandler)\n\t\t\t.setNextHandler(contentHandler)\n\t\t\t.setNextHandler(unhandledResponseHandler)\n\n\t\tconst responseHandler = usageHandler\n\n\t\tconst result = await responseHandler.handle(mozaikResponse)\n\n\t\treturn result.getResponse()\n\t}\n}\n","import { EndpointResolver } from \"@core/endpoint/endpoint-resolver\"\nimport { Endpoint } from \"@core/endpoint/endpoint\"\nimport { OPENAI_MODELS, ANTHROPIC_MODELS } from \"@/types/model\"\nimport { OpenAIResponses } from \"./openai/endpoint\"\nimport { AnthropicEndpoint } from \"./anthropic/endpoint\"\n\nexport class DefaultEndpointResolver extends EndpointResolver {\n\tisOpenAIModel(value: string): boolean {\n\t\treturn (OPENAI_MODELS as readonly string[]).includes(value)\n\t}\n\n\tisAnthropicModel(value: string): boolean {\n\t\treturn (ANTHROPIC_MODELS as readonly string[]).includes(value)\n\t}\n\n\tresolve(model: string): Endpoint {\n\t\tif (this.isOpenAIModel(model)) {\n\t\t\treturn new OpenAIResponses()\n\t\t} else if (this.isAnthropicModel(model)) {\n\t\t\treturn new AnthropicEndpoint()\n\t\t}\n\n\t\tthrow new Error(\"Provider not found\")\n\t}\n}\n","import { RequestGateway } from \"@core/endpoint/request-gateway\"\nimport { MozaikRequest } from \"@/types/request\"\nimport { DefaultEndpointResolver } from \"@providers/endpoint-resolver\"\nimport { ZodObject } from \"zod\"\nimport { Model } from \"@/types/model\"\nimport { Message } from \"@/types/message\"\n\nexport class MozaikAgent {\n\tprivate request: MozaikRequest\n\tgateway: RequestGateway = new RequestGateway(new DefaultEndpointResolver())\n\n\tconstructor(request: MozaikRequest) {\n\t\tthis.request = request\n\t}\n\n\tsetModel(model: Model) {\n\t\tthis.request.model = model\n\t}\n\n\tsetMessages(messages: Message[]) {\n\t\tthis.request.messages = messages\n\t}\n\n\tsetTask(task: string) {\n\t\tthis.request.task = task\n\t}\n\n\tsetStructuredOutput(schema: ZodObject<any>) {\n\t\tthis.request.structuredOutput = schema\n\t}\n\n\tasync act(task?: string) {\n\t\tif (task) {\n\t\t\tthis.request.task = task\n\t\t}\n\t\treturn await this.gateway.invoke(this.request)\n\t}\n}\n","import z from \"zod\"\nimport { ANTHROPIC_MODELS, OPENAI_MODELS } from \"@/types/model\"\nimport { PlanNode } from \"@/types/plan\"\n\nconst ModelSchema = z.enum([...OPENAI_MODELS, ...ANTHROPIC_MODELS])\n\nconst TaskPlanNodeSchema = z.object({\n\tkind: z.literal(\"task\"),\n\ttask: z.string(),\n\tmodel: ModelSchema,\n})\n\nconst WorkflowPlanNodeSchema: z.ZodType<Extract<PlanNode, { kind: \"workflow\" }>> = z.lazy(() =>\n\tz.object({\n\t\tkind: z.literal(\"workflow\"),\n\t\tmode: z.enum([\"sequential\", \"parallel\"]),\n\t\tunits: z.array(PlanNodeSchema),\n\t}),\n)\n\nconst PlanNodeSchema: z.ZodType<PlanNode> = TaskPlanNodeSchema.or(WorkflowPlanNodeSchema)\n\nexport const PlanSchema = z.object({\n\troot: PlanNodeSchema,\n})\n","import { Workflow } from \"@core/workflow/workflow\"\nimport { WorkflowExecutionStrategy } from \"@core/workflow/execution/strategy\"\nimport { ExecutionHook } from \"../hooks/execution-hook\"\n\nexport class ParallelExecution implements WorkflowExecutionStrategy {\n\tasync execute(workflow: Workflow, hook: ExecutionHook): Promise<any> {\n\t\tconst promises = []\n\t\tfor (const u of workflow.units) {\n\t\t\tpromises.push(u.execute(hook))\n\t\t}\n\n\t\tconst results = await Promise.all(promises)\n\n\t\treturn results\n\t}\n}\n","import { ExecutionHook } from \"../hooks/execution-hook\"\nimport { Workflow } from \"../workflow\"\nimport { WorkflowExecutionStrategy } from \"./strategy\"\n\nexport class SequentalExecution implements WorkflowExecutionStrategy {\n\tasync execute(workflow: Workflow, hook: ExecutionHook): Promise<any> {\n\t\tconst results = []\n\t\tfor (const u of workflow.units) {\n\t\t\tresults.push(await u.execute(hook))\n\t\t}\n\n\t\treturn results\n\t}\n}\n","import { ParallelExecution } from \"./parallel\"\nimport { SequentalExecution } from \"./sequential\"\nimport { WorkflowExecutionStrategy } from \"./strategy\"\n\nexport class ExecutionStrategyFactory {\n\tstatic create(mode: string): WorkflowExecutionStrategy {\n\t\tlet strategy: WorkflowExecutionStrategy\n\t\tif (mode == \"parallel\") {\n\t\t\tstrategy = new ParallelExecution()\n\t\t} else {\n\t\t\tstrategy = new SequentalExecution()\n\t\t}\n\n\t\treturn strategy\n\t}\n}\n","import { Task } from \"../task\"\nimport { Workflow } from \"../workflow\"\nimport { ExecutionHook } from \"./execution-hook\"\n\nexport class ClusterHook implements ExecutionHook {\n\tconstructor(private hooks: ExecutionHook[]) {}\n\n\tbeforeTask(task: Task): void {\n\t\tthis.hooks.forEach((h) => h.beforeTask(task))\n\t}\n\n\tafterTask(task: Task, result: any): void {\n\t\tthis.hooks.forEach((h) => h.afterTask(task, result))\n\t}\n\n\tbeforeWorkflow(wf: Workflow) {\n\t\tthis.hooks.forEach((h) => h.beforeWorkflow(wf))\n\t}\n\n\tafterWorkflow(wf: Workflow, result: any) {\n\t\tthis.hooks.forEach((h) => h.afterWorkflow(wf, result))\n\t}\n}\n","import { Task } from \"../task\"\nimport { Workflow } from \"../workflow\"\nimport { ExecutionHook } from \"./execution-hook\"\n\nexport class Logger implements ExecutionHook {\n\tbeforeWorkflow(workflow: Workflow) {\n\t\tconsole.log(`[Workflow:start], Mode: ${workflow.mode}`)\n\t}\n\n\tafterWorkflow(workflow: Workflow) {\n\t\tconsole.log(`[Workflow:end], Mode: ${workflow.mode}`)\n\t}\n\n\tbeforeTask(task: Task) {\n\t\tconsole.log(`[Task:end]: Model: ${task.getModel()} Task: ${task.getTask()}`)\n\t}\n\n\tafterTask(task: Task, result: any) {\n\t\tconsole.log(`[Task:end]: Model: ${task.getModel()} Task: ${task.getTask()}`)\n\t}\n}\n","import { ClusterHook } from \"./cluster\"\nimport { ExecutionHook } from \"./execution-hook\"\nimport { Logger } from \"./logger\"\n\nconst loggingHook: ExecutionHook = new Logger()\n\nconst defaultHooks = [loggingHook]\nconst clusterHook: ExecutionHook = new ClusterHook(defaultHooks)\n\nexport const DEFAULT_CLUSTER_HOOK = clusterHook\n","import { WorkUnit } from \"@core/workflow/work-unit\"\nimport { ExecutionStrategyFactory } from \"@core/workflow/execution/strategy-factory\"\nimport { WorkflowExecutionStrategy } from \"@core/workflow/execution/strategy\"\nimport { ExecutionHook } from \"./hooks/execution-hook\"\nimport { DEFAULT_CLUSTER_HOOK } from \"./hooks\"\n\nexport class Workflow extends WorkUnit {\n\tconstructor(\n\t\treadonly mode: \"parallel\" | \"sequential\",\n\t\treadonly units: WorkUnit[],\n\t) {\n\t\tsuper()\n\t}\n\n\tasync execute(hook: ExecutionHook = DEFAULT_CLUSTER_HOOK): Promise<any> {\n\t\thook.beforeWorkflow(this)\n\n\t\tconst executionStrategy: WorkflowExecutionStrategy = ExecutionStrategyFactory.create(this.mode)\n\t\tconst result = await executionStrategy.execute(this, hook)\n\n\t\thook.afterWorkflow(this, result)\n\t\treturn result\n\t}\n}\n","import { Model, MozaikRequest, MozaikAgent } from \"@/index\"\nimport { WorkUnit } from \"@core/workflow/work-unit\"\nimport { ExecutionHook } from \"./hooks/execution-hook\"\nimport { DEFAULT_CLUSTER_HOOK } from \"./hooks\"\n\nexport class Task extends WorkUnit {\n\tconstructor(\n\t\tprivate task: string,\n\t\tprivate model: Model,\n\t) {\n\t\tsuper()\n\t}\n\n\tgetTask() {\n\t\treturn this.task\n\t}\n\n\tgetModel() {\n\t\treturn this.model\n\t}\n\n\tasync execute(hook: ExecutionHook = DEFAULT_CLUSTER_HOOK): Promise<any> {\n\t\thook.beforeTask(this)\n\n\t\tconst request: MozaikRequest = {\n\t\t\tmodel: this.model,\n\t\t\ttask: this.task,\n\t\t}\n\n\t\tconst agent = new MozaikAgent(request)\n\t\tconst result = await agent.act(this.task)\n\n\t\thook.afterTask(this, result)\n\t\treturn result\n\t}\n}\n","import { Plan, PlanNode } from \"@/types/plan\"\nimport { Workflow } from \"./workflow\"\nimport { WorkUnit } from \"./work-unit\"\nimport { Task } from \"./task\"\n\nexport class PlanWorkflowMapper {\n\tstatic fromPlan(plan: Plan): Workflow {\n\t\treturn this.fromNode(plan.root)\n\t}\n\n\tprivate static fromNode(node: PlanNode): Workflow {\n\t\tif (node.kind !== \"workflow\") {\n\t\t\tthrow new Error(\"Root must be workflow\")\n\t\t}\n\n\t\treturn new Workflow(node.mode, node.units.map(this.mapNode))\n\t}\n\n\tprivate static mapNode(node: PlanNode): WorkUnit {\n\t\tif (node.kind === \"task\") {\n\t\t\treturn new Task(node.task, node.model)\n\t\t}\n\n\t\treturn new Workflow(node.mode, node.units.map(this.mapNode))\n\t}\n}\n","import { Plan } from \"@/types/plan\"\nimport { Workflow } from \"@core/workflow/workflow\"\nimport { MozaikAgent } from \"./agent\"\nimport { MozaikRequest } from \"@/types/request\"\nimport { PlanSchema } from \"@core/workflow/schema/plan\"\nimport { PlanWorkflowMapper } from \"@core/workflow/mapper\"\n\nconst PROMPT = `You are a planner.\n\nRules:\n- Use 'parallel' for the task that can be run in parallel.\n- Pick model based on the task complexity\n- Keep prompts actionable.\n- Don't ask user for any input, just do the thing with available data you have.\n`\n\nexport class PlanningAgent extends MozaikAgent {\n\tconstructor(request: MozaikRequest) {\n\t\tsuper(request)\n\t}\n\n\tasync planFromGoal(goal: string): Promise<Workflow> {\n\t\tthis.setStructuredOutput(PlanSchema)\n\t\tconst plan: Plan = await this.act(`${PROMPT}\\nGoal: ${goal}`)\n\t\treturn PlanWorkflowMapper.fromPlan(plan)\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,IAAe,WAAf,MAAwB;AAAA,EAC9B,cAAc;AAAA,EAAC;AAGhB;;;ACFO,IAAM,iBAAN,MAAqB;AAAA,EAG3B,YAAqB,kBAAoC;AAApC;AAAA,EAAqC;AAAA,EAE1D,MAAM,OAAO,SAAsC;AAClD,SAAK,WAAW,KAAK,iBAAiB,QAAQ,QAAQ,KAAK;AAC3D,WAAO,MAAM,KAAK,SAAS,YAAY,OAAO;AAAA,EAC/C;AACD;;;ACXO,IAAe,mBAAf,MAAgC;AAEvC;;;ACJO,IAAM,gBAAgB,CAAC,SAAS,cAAc,cAAc,SAAS;AAI5E,IAAM,gBAAgB;AACtB,IAAM,eAAe;AACrB,IAAM,cAAc;AAEb,IAAM,mBAAmB,CAAC,qBAAqB,oBAAoB,iBAAiB;AAEpF,IAAM,sBAAsB;AAAA,EAClC,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,mBAAmB;AACpB;;;ACXO,IAAe,oBAAf,MAAiC;AAAA,EAGvC,eAAe,YAAkD;AAChE,SAAK,cAAc;AACnB,WAAO,KAAK;AAAA,EACb;AAAA,EAIA,OAAO,SAAwB,SAAyB;AACvD,SAAK,MAAM,SAAS,OAAO;AAE3B,QAAI,KAAK,aAAa;AACrB,WAAK,YAAY,OAAO,SAAS,OAAO;AAAA,IACzC;AAAA,EACD;AACD;;;AChBO,IAAM,kBAAN,cAA8B,kBAAkB;AAAA,EAGtD,MAAM,SAAwB,SAAyB;AACtD,QAAI,QAAQ,UAAU;AACrB,cAAQ,YAAY,QAAQ,QAAQ;AAAA,IACrC;AAAA,EACD;AACD;;;ACRO,IAAM,cAAN,cAA0B,kBAAkB;AAAA,EAGlD,MAAM,SAAwB,SAAyB;AACtD,QAAI,QAAQ,MAAM;AACjB,cAAQ,QAAQ,QAAQ,IAAI;AAAA,IAC7B;AAAA,EACD;AACD;;;ACRO,IAAM,eAAN,cAA2B,kBAAkB;AAAA,EAGnD,MAAM,SAAwB,SAAyB;AACtD,QAAI,QAAQ,OAAO;AAClB,cAAQ,SAAS,QAAQ,KAAK;AAAA,IAC/B;AAAA,EACD;AACD;;;ACRO,IAAM,2BAAN,cAAuC,kBAAkB;AAAA,EAG/D,MAAM,SAAwB,SAAyB;AACtD,QAAI,QAAQ,kBAAkB;AAC7B,cAAQ,oBAAoB,QAAQ,gBAAgB;AAAA,IACrD;AAAA,EACD;AACD;;;ACRO,IAAM,eAAN,cAA2B,kBAAkB;AAAA,EAGnD,MAAM,eAA8B,gBAAgC;AACnE,QAAI,cAAc,SAAS,cAAc,MAAM,SAAS,GAAG;AAC1D,qBAAe,SAAS,cAAc,KAAK;AAAA,IAC5C;AAAA,EACD;AACD;;;ACHO,IAAe,WAAf,MAAwB;AAAA,EAAxB;AAEN,mBAAgC;AAAA;AAAA,EAEhC,aAAa,SAA6B;AACzC,SAAK,UAAU;AAEf,SAAK,eAAe,WAAW;AAE/B,UAAM,kBAAqC,IAAI,gBAAgB;AAC/D,UAAM,cAAiC,IAAI,YAAY;AACvD,UAAM,eAAkC,IAAI,aAAa;AACzD,UAAM,0BAA6C,IAAI,yBAAyB;AAChF,UAAM,eAAkC,IAAI,aAAa;AAEzD,oBACE,eAAe,WAAW,EAC1B,eAAe,YAAY,EAC3B,eAAe,uBAAuB,EACtC,eAAe,YAAY;AAE7B,oBAAgB,OAAO,SAAS,KAAK,cAAc;AAEnD,WAAO,KAAK,eAAe,MAAM;AAAA,EAClC;AAGD;;;AChCO,IAAe,iBAAf,MAA8B;AAAA,EAGpC,aAAa;AACZ,SAAK,UAAU,CAAC;AAAA,EACjB;AAAA,EAQA,QAAQ;AACP,WAAO,KAAK;AAAA,EACb;AACD;;;ACTO,IAAM,wBAAN,MAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlC,eAAe,UAA6B;AAC3C,QAAI,SAAS,WAAW,GAAG;AAC1B,YAAM,IAAI,MAAM,kEAAkE;AAAA,IACnF;AAGA,UAAM,gBAAgB,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ;AAE9D,QAAI,eAAe;AAClB,aAAO,OAAO,cAAc,YAAY,WACrC,cAAc,UACd,KAAK,uBAAuB,cAAc,OAAO;AAAA,IACrD;AAGA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB,UAA6B;AAC7C,UAAM,eAAe,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAE7D,QAAI,aAAa,WAAW,GAAG;AAC9B,aAAO;AAAA,IACR;AAEA,UAAM,kBAAkB,aAAa,aAAa,SAAS,CAAC;AAC5D,WAAO,OAAO,gBAAgB,YAAY,WACvC,gBAAgB,UAChB,KAAK,uBAAuB,gBAAgB,OAAO;AAAA,EACvD;AAAA,EAEQ,uBAAuB,SAAwB;AACtD,WAAO,QACL,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,EACrC,IAAI,CAAC,SAAS,KAAK,IAAI,EACvB,KAAK,GAAG;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,OAAiC;AACxC,WAAO,MAAM,IAAI,CAAC,OAAO;AAAA,MACxB,MAAM;AAAA,MACN,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,MACf,YAAY,EAAE;AAAA,MACd,QAAQ;AAAA;AAAA,IACT,EAAE;AAAA,EACH;AACD;;;ACvEA,iBAA8B;AAIvB,IAAM,yBAAN,cAAqC,eAAe;AAAA,EAC1D,YAAoB,SAAS,IAAI,sBAAsB,GAAG;AACzD,UAAM;AADa;AAAA,EAEpB;AAAA,EAEA,SAAS,OAA+B;AACvC,SAAK,QAAQ,QAAQ;AACrB,WAAO;AAAA,EACR;AAAA,EAEA,QAAQ,MAA8B;AACrC,SAAK,QAAQ,QAAQ;AACrB,WAAO;AAAA,EACR;AAAA,EAEA,YAAY,UAAqC;AAChD,UAAM,eAAe,KAAK,OAAO,eAAe,QAAQ;AAExD,QAAI,gBAAgB,iBAAiB,gCAAgC;AACpE,WAAK,QAAQ,eAAe;AAAA,IAC7B;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,oBAAoB,QAAmC;AACtD,SAAK,QAAQ,OAAO;AAAA,MACnB,YAAQ,0BAAc,QAAQ,cAAc;AAAA,IAC7C;AACA,WAAO;AAAA,EACR;AAAA,EAEA,SAAS,OAA+B;AACvC,SAAK,QAAQ,QAAQ,MAAM,IAAI,CAAC,UAAU;AAAA,MACzC,MAAM;AAAA,MACN,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK;AAAA,IAClB,EAAE;AACF,WAAO;AAAA,EACR;AACD;;;AChDA,oBAAmB;AAGZ,IAAM,sBAAN,MAAmD;AAAA,EACzD,YAAoB,SAAS,IAAI,cAAAA,QAAO,GAAG;AAAvB;AAAA,EAAwB;AAAA,EAE5C,MAAM,KAAK,SAA4B;AACtC,WAAO,MAAM,KAAK,OAAO,UAAU,OAAO,OAAO;AAAA,EAClD;AACD;;;ACTA,IAAAC,iBAAmB;AAGZ,IAAM,qBAAN,MAAkD;AAAA,EACxD,YAAoB,SAAS,IAAI,eAAAC,QAAO,GAAG;AAAvB;AAAA,EAAwB;AAAA,EAE5C,MAAM,KAAK,SAA4B;AACtC,WAAO,MAAM,KAAK,OAAO,UAAU,MAAM,OAAO;AAAA,EACjD;AACD;;;ACLO,IAAM,uBAAN,MAA2B;AAAA,EACjC,OAAO,QAAQ,SAA6B;AAC3C,QAAI,QAAQ,QAAQ,QAAQ,KAAK,QAAQ;AACxC,aAAO,IAAI,mBAAmB;AAAA,IAC/B,OAAO;AACN,aAAO,IAAI,oBAAoB;AAAA,IAChC;AAAA,EACD;AACD;;;ACVO,IAAe,kBAAf,MAA+B;AAAA,EAGrC,eAAe,iBAAmD;AACjE,SAAK,cAAc;AACnB,WAAO,KAAK;AAAA,EACb;AAGD;;;ACRO,IAAM,sBAAN,cAAkC,gBAAgB;AAAA,EAGxD,MAAM,OAAO,iBAAiC;AAC7C,UAAM,mBAAmB,gBAAgB;AACzC,QAAI,iBAAiB,eAAe;AACnC,sBAAgB,gBAAgB,iBAAiB,aAAa;AAC9D,aAAO;AAAA,IACR;AAEA,WAAO,MAAM,KAAK,YAAY,OAAO,eAAe;AAAA,EACrD;AACD;;;ACZO,IAAM,iBAAN,cAA6B,gBAAgB;AAAA,EAGnD,MAAM,OAAO,gBAAyD;AANvE;AAOE,UAAM,mBAAmB,eAAe;AACxC,UAAM,eAAc,sBAAiB,WAAjB,mBAA0B;AAC9C,QAAI,eAAe,aAAa,aAAa;AAC5C,YAAM,gBAAe,iBAAY,YAAZ,mBAAsB;AAC3C,UAAI,gBAAgB,UAAU,cAAc;AAC3C,uBAAe,gBAAgB,aAAa,IAAI;AAChD,eAAO;AAAA,MACR;AAAA,IACD;AAEA,WAAO,MAAM,KAAK,YAAY,OAAO,cAAc;AAAA,EACpD;AACD;;;AChBO,IAAM,oBAAN,cAAgC,gBAAgB;AAAA,EAGtD,MAAM,OAAO,gBAAyD;AACrE,UAAM,mBAAmB,eAAe;AACxC,QAAI,iBAAiB,aAAa;AACjC,qBAAe,gBAAgB,iBAAiB,WAAW;AAC3D,aAAO;AAAA,IACR;AAEA,WAAO,MAAM,KAAK,YAAY,OAAO,cAAc;AAAA,EACpD;AACD;;;ACfO,IAAM,aAAN,MAAiB;AAAA,EAIvB,YAAY,YAAoB,OAAe;AAC9C,SAAK,aAAa;AAClB,SAAK,QAAQ;AAAA,EACd;AACD;;;ACRO,IAAM,qBAAN,MAAyB;AAAA,EAK/B,mBAAmB,aAAqB,cAAsB,mBAAmC;AAChG,UAAM,aAAc,cAAc,qBAAqB,KAAK,uBAAwB;AACpF,UAAM,aAAc,eAAe,KAAK,wBAAyB;AACjE,UAAM,aAAc,oBAAoB,KAAK,wBAAyB;AACtE,WAAO,YAAY,aAAa;AAAA,EACjC;AAAA,EAEA,cAAc,WAAmB,aAAqB,cAAsB,mBAAmC;AAC9G,QAAI,UAAU,WAAW,YAAY,GAAG;AACvC,WAAK,uBAAuB;AAC5B,WAAK,wBAAwB;AAC7B,WAAK,wBAAwB;AAC7B,aAAO,KAAK,mBAAmB,aAAa,cAAc,iBAAiB;AAAA,IAC5E,WAAW,UAAU,WAAW,YAAY,GAAG;AAC9C,WAAK,uBAAuB;AAC5B,WAAK,wBAAwB;AAC7B,WAAK,wBAAwB;AAC7B,aAAO,KAAK,mBAAmB,aAAa,cAAc,iBAAiB;AAAA,IAC5E,WAAW,UAAU,WAAW,SAAS,GAAG;AAC3C,WAAK,uBAAuB;AAC5B,WAAK,wBAAwB;AAC7B,WAAK,wBAAwB;AAC7B,aAAO,KAAK,mBAAmB,aAAa,cAAc,iBAAiB;AAAA,IAC5E,WAAW,UAAU,WAAW,OAAO,GAAG;AACzC,WAAK,uBAAuB;AAC5B,WAAK,wBAAwB;AAC7B,WAAK,wBAAwB;AAC7B,aAAO,KAAK,mBAAmB,aAAa,cAAc,iBAAiB;AAAA,IAC5E;AAEA,UAAM,IAAI,MAAM,cAAc,SAAS,oCAAoC;AAAA,EAC5E;AACD;;;AClBO,IAAM,uBAAN,cAAmC,gBAAgB;AAAA,EAMzD,YAAY,SAAc,OAAe;AACxC,UAAM;AACN,SAAK,UAAU;AACf,SAAK,QAAQ;AACb,SAAK,SAAS,IAAI,oBAAoB;AAAA,EACvC;AAAA,EAEQ,aAAa,UAAwB;AAhC9C;AAiCE,YAAO,cAAS,WAAT,mBAAiB,KAAK,CAAC,SAAc,KAAK,SAAS;AAAA,EAC3D;AAAA,EAEQ,iBAAiB,UAAsB;AApChD;AAqCE,aAAO,cAAS,WAAT,mBAAiB,OAAO,CAAC,SAAc,KAAK,SAAS,qBAAoB,CAAC;AAAA,EAClF;AAAA,EAEQ,YAAY,MAAgB,OAA4B;AAxCjE;AAyCE,YAAO,WAAM,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,MAAtC,YAA2C;AAAA,EACnD;AAAA,EAEA,MAAc,YAAY,MAAY,SAA8C;AACnF,UAAM,OAAO,OAAO,YAAY,WAAW,KAAK,MAAM,OAAO,IAAI;AAEjE,WAAO,MAAM,KAAK,OAAO,IAAI;AAAA,EAC9B;AAAA,EAEQ,iBAAiB,QAAgB,SAA0B;AAClE,WAAO;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ,KAAK,UAAU,OAAO;AAAA,IAC/B;AAAA,EACD;AAAA,EAEA,MAAc,iBAAiB,WAAuB,OAAsC;AA1D7F;AA2DE,UAAM,UAAwB,CAAC;AAE/B,eAAW,QAAQ,WAAW;AAC7B,YAAM,OAAO,KAAK,YAAY,MAAM,KAAK;AAEzC,UAAI,CAAC,MAAM;AACV,gBAAQ;AAAA,UACP,KAAK,iBAAiB,KAAK,SAAS;AAAA,YACnC,OAAO,iBAAiB,KAAK,IAAI;AAAA,UAClC,CAAC;AAAA,QACF;AACA;AAAA,MACD;AAEA,UAAI;AACH,cAAM,SAAS,MAAM,KAAK,YAAY,MAAM,KAAK,SAAS;AAC1D,gBAAQ,KAAK,KAAK,iBAAiB,KAAK,SAAS,MAAM,CAAC;AAAA,MACzD,SAAS,KAAU;AAClB,gBAAQ;AAAA,UACP,KAAK,iBAAiB,KAAK,SAAS;AAAA,YACnC,QAAO,SAAI,YAAJ,YAAe;AAAA,UACvB,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,OAAO,gBAAyD;AAxFvE;AAyFE,QAAI,mBAAmB,eAAe;AACtC,QAAI;AACJ,WAAO,KAAK,aAAa,gBAAgB,GAAG;AAC3C,YAAM,YAAY,KAAK,iBAAiB,gBAAgB;AAExD,YAAM,cAAc,MAAM,KAAK,iBAAiB,WAAW,KAAK,KAAK;AAGrE,WAAK,QAAQ,QAAQ;AACrB,WAAK,QAAQ,uBAAuB,iBAAiB;AAErD,4BAAsB,MAAM,KAAK,OAAO,KAAK,KAAK,OAAO;AAEzD,YAAM,qBAAqB,IAAI,mBAAmB;AAClD,YAAM,QAAQ,oBAAoB;AAClC,YAAM,YAAY,mBAAmB;AAAA,QACpC,iBAAiB;AAAA,QACjB,MAAM;AAAA,QACN,MAAM;AAAA,SACN,iBAAM,wBAAN,mBAA2B,kBAA3B,YAA4C;AAAA,MAC7C;AAEA,qBAAe,cAAc,IAAI,WAAW,WAAW,iBAAiB,KAAK,CAAC;AAC9E,qBAAe,oBAAoB,mBAAmB;AACtD,qBAAe,gBAAgB,mBAAmB;AAClD,yBAAmB;AAAA,IACpB;AAEA,WAAO,MAAM,KAAK,YAAY,OAAO,cAAc;AAAA,EACpD;AACD;;;ACrHO,IAAM,iBAAN,MAAqB;AAAA,EAArB;AAGN,wBAA6B,CAAC;AAAA;AAAA,EAE9B,oBAAoB,kBAAuC;AAC1D,SAAK,mBAAmB;AACxB,WAAO;AAAA,EACR;AAAA,EAEA,cAAc,YAAwC;AACrD,SAAK,aAAa,KAAK,UAAU;AACjC,WAAO;AAAA,EACR;AAAA,EAEA,gBAAgB,UAA+B;AAC9C,SAAK,eAAe;AACpB,WAAO;AAAA,EACR;AAAA,EAEA,cAAmB;AAClB,WAAO;AAAA,MACN,MAAM,KAAK;AAAA,MACX,OAAO;AAAA,QACN,SAAS,KAAK;AAAA,MACf;AAAA,MACA,WAAW,KAAK,aAAa,OAAO,CAAC,KAAK,UAAU,MAAM,MAAM,YAAY,CAAC;AAAA,IAC9E;AAAA,EACD;AAAA,EAEA,kBAAgC;AAC/B,WAAO,KAAK;AAAA,EACb;AACD;;;AC9BO,IAAM,eAAN,cAA2B,gBAAgB;AAAA,EAGjD,MAAM,OAAO,gBAAyD;AARvE;AASE,UAAM,mBAAmB,eAAe;AACxC,UAAM,QAAQ,iBAAiB;AAE/B,UAAM,qBAAqB,IAAI,mBAAmB;AAClD,UAAM,YAAY,mBAAmB;AAAA,MACpC,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,MAAM;AAAA,OACN,iBAAM,wBAAN,mBAA2B,kBAA3B,YAA4C;AAAA,IAC7C;AAEA,mBAAe,cAAc,IAAI,WAAW,WAAW,iBAAiB,KAAK,CAAC;AAE9E,WAAO,MAAM,KAAK,YAAY,OAAO,cAAc;AAAA,EACpD;AACD;;;ACVO,IAAM,kBAAN,cAA8B,SAAS;AAAA,EAG7C,cAAc;AACb,UAAM;AAHP,0BAAiC,IAAI,uBAAuB;AAAA,EAI5D;AAAA,EAEA,MAAM,YAAY,SAAgC;AACjD,QAAI;AACH,YAAM,UAAU,KAAK,aAAa,OAAO;AACzC,YAAM,SAAS,qBAAqB,QAAQ,OAAO;AACnD,YAAM,WAAW,MAAM,OAAO,KAAK,OAAO;AAE1C,YAAM,iBAAiB,IAAI,eAAe;AAC1C,qBAAe,oBAAoB,QAAQ;AAG3C,YAAM,eAAgC,IAAI,aAAa;AACvD,YAAM,uBAAwC,IAAI;AAAA,QACjD;AAAA,QACA,QAAQ,QAAQ,QAAQ,QAAQ,CAAC;AAAA,MAClC;AACA,YAAM,sBAAuC,IAAI,oBAAoB;AACrE,YAAM,oBAAqC,IAAI,kBAAkB;AACjE,YAAM,iBAAkC,IAAI,eAAe;AAE3D,mBACE,eAAe,oBAAoB,EACnC,eAAe,mBAAmB,EAClC,eAAe,iBAAiB,EAChC,eAAe,cAAc;AAE/B,YAAM,kBAAkB;AAExB,YAAM,SAAyB,MAAM,gBAAgB,OAAO,cAAc;AAE1E,aAAO,OAAO,YAAY;AAAA,IAC3B,SAAS,OAAO;AACf,cAAQ,KAAK,kDAAkD,KAAK;AACpE,YAAM;AAAA,IACP;AAAA,EACD;AACD;;;ACrDO,IAAM,kBAAN,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK5B,WAAW,UAAoE;AAC9E,UAAM,oBAAoC,CAAC;AAC3C,QAAI;AAEJ,eAAW,OAAO,UAAU;AAE3B,UAAI,IAAI,SAAS,UAAU;AAC1B,cAAM,UACL,OAAO,IAAI,YAAY,WACpB,IAAI,UACH,IAAI,QAAuB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI;AAE5D,uBAAe,eAAe,GAAG,YAAY;AAAA;AAAA,EAAO,OAAO,KAAK;AAChE;AAAA,MACD;AAGA,UAAI,IAAI,SAAS,QAAQ;AACxB;AAAA,MACD;AAGA,UAAI,IAAI,SAAS,UAAU,IAAI,SAAS,aAAa;AACpD,YAAI,OAAO,IAAI,YAAY,UAAU;AACpC,4BAAkB,KAAK;AAAA,YACtB,MAAM,IAAI;AAAA,YACV,SAAS,IAAI;AAAA,UACd,CAAC;AAAA,QACF,OAAO;AAEN,gBAAM,gBAAiB,IAAI,QAAwC,IAAI,CAAC,SAAS;AAChF,gBAAI,KAAK,SAAS,QAAQ;AACzB,qBAAO;AAAA,gBACN,MAAM;AAAA,gBACN,MAAM,KAAK;AAAA,cACZ;AAAA,YACD,WAAW,KAAK,SAAS,aAAa;AAGrC,oBAAM,WAAW,KAAK;AAGtB,kBAAI,SAAS,WAAW,YAAY,GAAG;AACtC,sBAAM,UAAU,SAAS,MAAM,+BAA+B;AAC9D,oBAAI,SAAS;AACZ,wBAAM,CAAC,EAAE,WAAW,IAAI,IAAI;AAC5B,yBAAO;AAAA,oBACN,MAAM;AAAA,oBACN,QAAQ;AAAA,sBACP,MAAM;AAAA,sBACN,YAAY,SAAS,SAAS;AAAA,sBAK9B;AAAA,oBACD;AAAA,kBACD;AAAA,gBACD;AAAA,cACD;AAGA,oBAAM,IAAI;AAAA,gBACT;AAAA,cAED;AAAA,YACD;AAEA,mBAAO,EAAE,MAAM,QAAiB,MAAM,GAAG;AAAA,UAC1C,CAAC;AAED,4BAAkB,KAAK;AAAA,YACtB,MAAM,IAAI;AAAA,YACV,SAAS;AAAA,UACV,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD;AAIA,UAAM,YAAY,KAAK,uBAAuB,iBAAiB;AAE/D,WAAO;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,IACT;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,uBAAuB,UAA0C;AACxE,QAAI,SAAS,WAAW,EAAG,QAAO;AAElC,UAAM,SAAyB,CAAC;AAChC,QAAI;AAEJ,eAAW,OAAO,UAAU;AAE3B,UAAI,aAAa,IAAI,QAAQ,OAAO,SAAS,GAAG;AAC/C,cAAM,UAAU,OAAO,OAAO,SAAS,CAAC;AAGxC,YAAI,OAAO,QAAQ,YAAY,YAAY,OAAO,IAAI,YAAY,UAAU;AAC3E,kBAAQ,UAAU,GAAG,QAAQ,OAAO;AAAA,EAAK,IAAI,OAAO;AAAA,QACrD,OAAO;AAEN,gBAAM,cAAc,MAAM,QAAQ,QAAQ,OAAO,IAC9C,QAAQ,UACR,CAAC,EAAE,MAAM,QAAiB,MAAM,QAAQ,QAAkB,CAAC;AAC9D,gBAAM,aAAa,MAAM,QAAQ,IAAI,OAAO,IACzC,IAAI,UACJ,CAAC,EAAE,MAAM,QAAiB,MAAM,IAAI,QAAkB,CAAC;AAC1D,kBAAQ,UAAU,CAAC,GAAG,aAAa,GAAG,UAAU;AAAA,QACjD;AAAA,MACD,OAAO;AACN,eAAO,KAAK,GAAG;AACf,mBAAW,IAAI;AAAA,MAChB;AAAA,IACD;AAGA,QAAI,OAAO,SAAS,KAAK,OAAO,CAAC,EAAE,SAAS,QAAQ;AACnD,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AACD;;;ACzIA,IAAAC,cAAoC;AAK7B,IAAM,0BAAN,cAAsC,eAAe;AAAA,EAArD;AAAA;AACN,SAAQ,SAAS,IAAI,gBAAgB;AAAA;AAAA,EAErC,SAAS,OAAuC;AAC/C,SAAK,QAAQ,QAAQ,oBAAoB,KAAK;AAC9C,WAAO;AAAA,EACR;AAAA,EAEA,QAAQ,MAA8B;AAErC,UAAM,UAAU;AAAA,MACf,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAEA,QAAI,CAAC,KAAK,QAAQ,UAAU;AAC3B,WAAK,QAAQ,WAAW,CAAC;AAAA,IAC1B;AAEA,SAAK,QAAQ,SAAS,KAAK,OAAO;AAClC,WAAO;AAAA,EACR;AAAA,EAEA,YAAY,UAAqC;AAChD,UAAM,EAAE,UAAU,mBAAmB,OAAO,IAAI,KAAK,OAAO,WAAW,QAAQ;AAE/E,SAAK,QAAQ,WAAW;AAExB,QAAI,QAAQ;AACX,WAAK,QAAQ,SAAS;AAAA,IACvB;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,oBAAoB,QAAmC;AACtD,SAAK,QAAQ,QAAQ,CAAC,+BAA+B;AACrD,SAAK,QAAQ,oBAAgB,iCAAoB,MAAM;AACvD,WAAO;AAAA,EACR;AAAA,EAEA,SAAS,OAA+B;AACvC,SAAK,QAAQ,QAAQ,MAAM,IAAI,CAAC,UAAU;AAAA,MACzC,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,IACpB,EAAE;AACF,WAAO;AAAA,EACR;AAAA,EAEA,QAAQ;AAEP,QAAI,CAAC,KAAK,QAAQ,YAAY;AAC7B,WAAK,QAAQ,aAAa;AAAA,IAC3B;AAEA,WAAO,KAAK;AAAA,EACb;AACD;;;ACjEA,iBAAsB;AAEf,IAAM,yBAAN,MAAsD;AAAA,EAC5D,YAAoB,SAAS,IAAI,WAAAC,QAAU,GAAG;AAA1B;AAAA,EAA2B;AAAA,EAE/C,MAAM,KAAK,SAA4B;AACtC,WAAO,MAAM,KAAK,OAAO,SAAS,OAAO,OAAO;AAAA,EACjD;AACD;;;ACRA,IAAAC,cAAsB;AAEf,IAAM,wBAAN,MAAqD;AAAA,EAC3D,YAAoB,SAAS,IAAI,YAAAC,QAAU,GAAG;AAA1B;AAAA,EAA2B;AAAA,EAE/C,MAAM,KAAK,SAA4B;AACtC,WAAO,MAAM,KAAK,OAAO,KAAK,SAAS,MAAM,OAAO;AAAA,EACrD;AACD;;;ACLO,IAAM,0BAAN,MAA8B;AAAA,EACpC,OAAO,QAAQ,SAA6B;AAC3C,WAAO,QAAQ,gBAAgB,IAAI,sBAAsB,IAAI,IAAI,uBAAuB;AAAA,EACzF;AACD;;;ACLO,IAAM,sBAAN,cAAkC,gBAAgB;AAAA,EAGxD,MAAM,OAAO,gBAAyD;AACrE,UAAM,mBAAmB,eAAe;AACxC,QAAI,iBAAiB,eAAe;AACnC,qBAAe,gBAAgB,iBAAiB,aAAa;AAC7D,aAAO;AAAA,IACR;AAEA,WAAO,MAAM,KAAK,YAAY,OAAO,cAAc;AAAA,EACpD;AACD;;;ACZO,IAAMC,kBAAN,cAA6B,gBAAgB;AAAA,EAGnD,MAAM,OAAO,gBAAyD;AACrE,UAAM,mBAAmB,eAAe;AACxC,UAAM,UAAU,iBAAiB,QAC/B,OAAO,CAAC,UAAe,MAAM,SAAS,MAAM,EAC5C,IAAI,CAAC,UAAgB,MAAM,SAAS,SAAS,MAAM,OAAO,EAAG,EAC7D,KAAK,EAAE;AAET,QAAI,SAAS;AACZ,qBAAe,gBAAgB,OAAO;AACtC,aAAO;AAAA,IACR;AAEA,WAAO,MAAM,KAAK,YAAY,OAAO,cAAc;AAAA,EACpD;AACD;;;ACpBO,IAAM,wBAAN,MAA4B;AAAA,EAIlC,mBAAmB,aAAqB,cAA8B;AACrE,UAAM,YAAa,cAAc,KAAK,uBAAwB;AAC9D,UAAM,aAAc,eAAe,KAAK,wBAAyB;AACjE,WAAO,YAAY;AAAA,EACpB;AAAA,EAEA,cAAc,WAAmB,aAAqB,cAA8B;AACnF,QAAI,UAAU,WAAW,mBAAmB,GAAG;AAC9C,WAAK,uBAAuB;AAC5B,WAAK,wBAAwB;AAC7B,aAAO,KAAK,mBAAmB,aAAa,YAAY;AAAA,IACzD,WAAW,UAAU,WAAW,kBAAkB,GAAG;AACpD,WAAK,uBAAuB;AAC5B,WAAK,wBAAwB;AAC7B,aAAO,KAAK,mBAAmB,aAAa,YAAY;AAAA,IACzD,WAAW,UAAU,WAAW,iBAAiB,GAAG;AACnD,WAAK,uBAAuB;AAC5B,WAAK,wBAAwB;AAC7B,aAAO,KAAK,mBAAmB,aAAa,YAAY;AAAA,IACzD;AAEA,UAAM,IAAI,MAAM,cAAc,SAAS,oCAAoC;AAAA,EAC5E;AACD;;;ACnBO,IAAM,iBAAN,cAA6B,gBAAgB;AAAA,EAMnD,YAAY,SAAc,OAAe;AACxC,UAAM;AACN,SAAK,QAAQ;AACb,SAAK,UAAU;AACf,SAAK,SAAS,IAAI,uBAAuB;AAAA,EAC1C;AAAA,EAEA,MAAc,iBAAiB,OAAe,eAAyD;AACtG,UAAM,UAAiB,CAAC;AAExB,eAAW,WAAW,eAAe;AACpC,YAAM,OAAO,+BAAO,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ;AAEnD,UAAI,CAAC,MAAM;AACV,gBAAQ,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,aAAa,QAAQ;AAAA,UACrB,SAAS,KAAK,UAAU,EAAE,OAAO,iBAAiB,QAAQ,IAAI,GAAG,CAAC;AAAA,QACnE,CAAC;AACD;AAAA,MACD;AAEA,UAAI;AACH,cAAM,SAAS,MAAM,KAAK,OAAO,QAAQ,KAAK;AAC9C,gBAAQ,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,aAAa,QAAQ;AAAA,UACrB,SAAS,KAAK,UAAU,MAAM;AAAA,QAC/B,CAAC;AAAA,MACF,SAAS,OAAY;AACpB,gBAAQ,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,aAAa,QAAQ;AAAA,UACrB,SAAS,KAAK,UAAU,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,QACjD,CAAC;AAAA,MACF;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,OAAO,gBAAyD;AACrE,QAAI,mBAAmB,eAAe;AAEtC,WAAO,iBAAiB,gBAAgB,YAAY;AACnD,YAAM,gBAAgB,iBAAiB,QAAQ;AAAA,QAC9C,CAAC,UAAgD,MAAM,SAAS;AAAA,MACjE;AAGA,WAAK,QAAQ,SAAS,KAAK;AAAA,QAC1B,MAAM;AAAA,QACN,SAAS,iBAAiB;AAAA,MAC3B,CAAC;AAED,YAAM,cAAc,MAAM,KAAK,iBAAiB,KAAK,OAAO,aAAa;AAGzE,WAAK,QAAQ,SAAS,KAAK;AAAA,QAC1B,MAAM;AAAA,QACN,SAAS;AAAA,MACV,CAAC;AAGD,YAAM,sBAAsB,MAAM,KAAK,OAAO,KAAK,KAAK,OAAO;AAE/D,YAAM,QAAQ,oBAAoB;AAClC,YAAM,wBAAwB,IAAI,sBAAsB;AACxD,YAAM,YAAY,sBAAsB;AAAA,QACvC,iBAAiB;AAAA,QACjB,MAAM;AAAA,QACN,MAAM;AAAA,MACP;AAEA,qBAAe,cAAc,IAAI,WAAW,WAAW,oBAAoB,MAAM,IAAI,CAAC;AACtF,qBAAe,oBAAoB,mBAAmB;AACtD,yBAAmB;AAAA,IACpB;AAEA,WAAO,MAAM,KAAK,YAAY,OAAO,cAAc;AAAA,EACpD;AACD;;;AC1FO,IAAMC,gBAAN,cAA2B,gBAAgB;AAAA,EAGjD,MAAM,OAAO,gBAAyD;AACrE,UAAM,mBAAmB,eAAe;AACxC,UAAM,QAAQ,iBAAiB;AAE/B,UAAM,wBAAwB,IAAI,sBAAsB;AACxD,UAAM,YAAY,sBAAsB;AAAA,MACvC,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,MAAM;AAAA,IACP;AACA,QAAI,OAAO;AACV,qBAAe,cAAc,IAAI,WAAW,WAAW,iBAAiB,KAAK,CAAC;AAAA,IAC/E;AACA,WAAO,MAAM,KAAK,YAAY,OAAO,cAAc;AAAA,EACpD;AACD;;;ACpBO,IAAM,2BAAN,cAAuC,gBAAgB;AAAA,EAG7D,MAAM,OAAO,gBAAyD;AANvE;AAOE,UAAM,mBAAmB,eAAe;AACxC,UAAM,MAAK,0DAAkB,OAAlB,YAAwB;AACnC,UAAM,SAAQ,0DAAkB,UAAlB,YAA2B;AAEzC,UAAM,IAAI,MAAM,4CAA4C,EAAE,UAAU,KAAK,EAAE;AAAA,EAChF;AACD;;;ACAO,IAAM,oBAAN,cAAgC,SAAS;AAAA,EAAzC;AAAA;AACN,0BAAiC,IAAI,wBAAwB;AAAA;AAAA,EAE7D,MAAM,YAAY,eAA4C;AAC7D,UAAM,kBAAkB,KAAK,aAAa,aAAa;AACvD,UAAM,SAAS,wBAAwB,QAAQ,eAAe;AAC9D,UAAM,WAAW,MAAM,OAAO,KAAK,eAAe;AAElD,UAAM,iBAAiB,IAAI,eAAe;AAC1C,mBAAe,oBAAoB,QAAQ;AAG3C,UAAM,eAAgC,IAAIC,cAAa;AACvD,UAAM,iBAAkC,IAAI;AAAA,MAC3C;AAAA,MACA,cAAc,QAAQ,cAAc,QAAQ,CAAC;AAAA,IAC9C;AACA,UAAM,sBAAuC,IAAI,oBAAoB;AACrE,UAAM,iBAAkC,IAAIC,gBAAe;AAC3D,UAAM,2BAA4C,IAAI,yBAAyB;AAE/E,iBACE,eAAe,cAAc,EAC7B,eAAe,mBAAmB,EAClC,eAAe,cAAc,EAC7B,eAAe,wBAAwB;AAEzC,UAAM,kBAAkB;AAExB,UAAM,SAAS,MAAM,gBAAgB,OAAO,cAAc;AAE1D,WAAO,OAAO,YAAY;AAAA,EAC3B;AACD;;;ACxCO,IAAM,0BAAN,cAAsC,iBAAiB;AAAA,EAC7D,cAAc,OAAwB;AACrC,WAAQ,cAAoC,SAAS,KAAK;AAAA,EAC3D;AAAA,EAEA,iBAAiB,OAAwB;AACxC,WAAQ,iBAAuC,SAAS,KAAK;AAAA,EAC9D;AAAA,EAEA,QAAQ,OAAyB;AAChC,QAAI,KAAK,cAAc,KAAK,GAAG;AAC9B,aAAO,IAAI,gBAAgB;AAAA,IAC5B,WAAW,KAAK,iBAAiB,KAAK,GAAG;AACxC,aAAO,IAAI,kBAAkB;AAAA,IAC9B;AAEA,UAAM,IAAI,MAAM,oBAAoB;AAAA,EACrC;AACD;;;ACjBO,IAAM,cAAN,MAAkB;AAAA,EAIxB,YAAY,SAAwB;AAFpC,mBAA0B,IAAI,eAAe,IAAI,wBAAwB,CAAC;AAGzE,SAAK,UAAU;AAAA,EAChB;AAAA,EAEA,SAAS,OAAc;AACtB,SAAK,QAAQ,QAAQ;AAAA,EACtB;AAAA,EAEA,YAAY,UAAqB;AAChC,SAAK,QAAQ,WAAW;AAAA,EACzB;AAAA,EAEA,QAAQ,MAAc;AACrB,SAAK,QAAQ,OAAO;AAAA,EACrB;AAAA,EAEA,oBAAoB,QAAwB;AAC3C,SAAK,QAAQ,mBAAmB;AAAA,EACjC;AAAA,EAEA,MAAM,IAAI,MAAe;AACxB,QAAI,MAAM;AACT,WAAK,QAAQ,OAAO;AAAA,IACrB;AACA,WAAO,MAAM,KAAK,QAAQ,OAAO,KAAK,OAAO;AAAA,EAC9C;AACD;;;ACrCA,IAAAC,cAAc;AAId,IAAM,cAAc,YAAAC,QAAE,KAAK,CAAC,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAElE,IAAM,qBAAqB,YAAAA,QAAE,OAAO;AAAA,EACnC,MAAM,YAAAA,QAAE,QAAQ,MAAM;AAAA,EACtB,MAAM,YAAAA,QAAE,OAAO;AAAA,EACf,OAAO;AACR,CAAC;AAED,IAAM,yBAA6E,YAAAA,QAAE;AAAA,EAAK,MACzF,YAAAA,QAAE,OAAO;AAAA,IACR,MAAM,YAAAA,QAAE,QAAQ,UAAU;AAAA,IAC1B,MAAM,YAAAA,QAAE,KAAK,CAAC,cAAc,UAAU,CAAC;AAAA,IACvC,OAAO,YAAAA,QAAE,MAAM,cAAc;AAAA,EAC9B,CAAC;AACF;AAEA,IAAM,iBAAsC,mBAAmB,GAAG,sBAAsB;AAEjF,IAAM,aAAa,YAAAA,QAAE,OAAO;AAAA,EAClC,MAAM;AACP,CAAC;;;ACpBM,IAAM,oBAAN,MAA6D;AAAA,EACnE,MAAM,QAAQ,UAAoB,MAAmC;AACpE,UAAM,WAAW,CAAC;AAClB,eAAW,KAAK,SAAS,OAAO;AAC/B,eAAS,KAAK,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC9B;AAEA,UAAM,UAAU,MAAM,QAAQ,IAAI,QAAQ;AAE1C,WAAO;AAAA,EACR;AACD;;;ACXO,IAAM,qBAAN,MAA8D;AAAA,EACpE,MAAM,QAAQ,UAAoB,MAAmC;AACpE,UAAM,UAAU,CAAC;AACjB,eAAW,KAAK,SAAS,OAAO;AAC/B,cAAQ,KAAK,MAAM,EAAE,QAAQ,IAAI,CAAC;AAAA,IACnC;AAEA,WAAO;AAAA,EACR;AACD;;;ACTO,IAAM,2BAAN,MAA+B;AAAA,EACrC,OAAO,OAAO,MAAyC;AACtD,QAAI;AACJ,QAAI,QAAQ,YAAY;AACvB,iBAAW,IAAI,kBAAkB;AAAA,IAClC,OAAO;AACN,iBAAW,IAAI,mBAAmB;AAAA,IACnC;AAEA,WAAO;AAAA,EACR;AACD;;;ACXO,IAAM,cAAN,MAA2C;AAAA,EACjD,YAAoB,OAAwB;AAAxB;AAAA,EAAyB;AAAA,EAE7C,WAAW,MAAkB;AAC5B,SAAK,MAAM,QAAQ,CAAC,MAAM,EAAE,WAAW,IAAI,CAAC;AAAA,EAC7C;AAAA,EAEA,UAAU,MAAY,QAAmB;AACxC,SAAK,MAAM,QAAQ,CAAC,MAAM,EAAE,UAAU,MAAM,MAAM,CAAC;AAAA,EACpD;AAAA,EAEA,eAAe,IAAc;AAC5B,SAAK,MAAM,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC;AAAA,EAC/C;AAAA,EAEA,cAAc,IAAc,QAAa;AACxC,SAAK,MAAM,QAAQ,CAAC,MAAM,EAAE,cAAc,IAAI,MAAM,CAAC;AAAA,EACtD;AACD;;;AClBO,IAAM,SAAN,MAAsC;AAAA,EAC5C,eAAe,UAAoB;AAClC,YAAQ,IAAI,2BAA2B,SAAS,IAAI,EAAE;AAAA,EACvD;AAAA,EAEA,cAAc,UAAoB;AACjC,YAAQ,IAAI,yBAAyB,SAAS,IAAI,EAAE;AAAA,EACrD;AAAA,EAEA,WAAW,MAAY;AACtB,YAAQ,IAAI,sBAAsB,KAAK,SAAS,CAAC,UAAU,KAAK,QAAQ,CAAC,EAAE;AAAA,EAC5E;AAAA,EAEA,UAAU,MAAY,QAAa;AAClC,YAAQ,IAAI,sBAAsB,KAAK,SAAS,CAAC,UAAU,KAAK,QAAQ,CAAC,EAAE;AAAA,EAC5E;AACD;;;AChBA,IAAM,cAA6B,IAAI,OAAO;AAE9C,IAAM,eAAe,CAAC,WAAW;AACjC,IAAM,cAA6B,IAAI,YAAY,YAAY;AAExD,IAAM,uBAAuB;;;ACH7B,IAAM,WAAN,cAAuB,SAAS;AAAA,EACtC,YACU,MACA,OACR;AACD,UAAM;AAHG;AACA;AAAA,EAGV;AAAA,EAEA,MAAM,QAAQ,OAAsB,sBAAoC;AACvE,SAAK,eAAe,IAAI;AAExB,UAAM,oBAA+C,yBAAyB,OAAO,KAAK,IAAI;AAC9F,UAAM,SAAS,MAAM,kBAAkB,QAAQ,MAAM,IAAI;AAEzD,SAAK,cAAc,MAAM,MAAM;AAC/B,WAAO;AAAA,EACR;AACD;;;AClBO,IAAM,OAAN,cAAmB,SAAS;AAAA,EAClC,YACS,MACA,OACP;AACD,UAAM;AAHE;AACA;AAAA,EAGT;AAAA,EAEA,UAAU;AACT,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,WAAW;AACV,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,MAAM,QAAQ,OAAsB,sBAAoC;AACvE,SAAK,WAAW,IAAI;AAEpB,UAAM,UAAyB;AAAA,MAC9B,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,IACZ;AAEA,UAAM,QAAQ,IAAI,YAAY,OAAO;AACrC,UAAM,SAAS,MAAM,MAAM,IAAI,KAAK,IAAI;AAExC,SAAK,UAAU,MAAM,MAAM;AAC3B,WAAO;AAAA,EACR;AACD;;;AC9BO,IAAM,qBAAN,MAAyB;AAAA,EAC/B,OAAO,SAAS,MAAsB;AACrC,WAAO,KAAK,SAAS,KAAK,IAAI;AAAA,EAC/B;AAAA,EAEA,OAAe,SAAS,MAA0B;AACjD,QAAI,KAAK,SAAS,YAAY;AAC7B,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACxC;AAEA,WAAO,IAAI,SAAS,KAAK,MAAM,KAAK,MAAM,IAAI,KAAK,OAAO,CAAC;AAAA,EAC5D;AAAA,EAEA,OAAe,QAAQ,MAA0B;AAChD,QAAI,KAAK,SAAS,QAAQ;AACzB,aAAO,IAAI,KAAK,KAAK,MAAM,KAAK,KAAK;AAAA,IACtC;AAEA,WAAO,IAAI,SAAS,KAAK,MAAM,KAAK,MAAM,IAAI,KAAK,OAAO,CAAC;AAAA,EAC5D;AACD;;;AClBA,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASR,IAAM,gBAAN,cAA4B,YAAY;AAAA,EAC9C,YAAY,SAAwB;AACnC,UAAM,OAAO;AAAA,EACd;AAAA,EAEA,MAAM,aAAa,MAAiC;AACnD,SAAK,oBAAoB,UAAU;AACnC,UAAM,OAAa,MAAM,KAAK,IAAI,GAAG,MAAM;AAAA,QAAW,IAAI,EAAE;AAC5D,WAAO,mBAAmB,SAAS,IAAI;AAAA,EACxC;AACD;","names":["OpenAI","import_openai","OpenAI","import_zod","Anthropic","import_sdk","Anthropic","ContentHandler","UsageHandler","UsageHandler","ContentHandler","import_zod","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/workflow/work-unit.ts","../src/core/endpoint/request-gateway.ts","../src/core/endpoint/endpoint-resolver.ts","../src/types/model.ts","../src/core/request-handler/capability.ts","../src/core/request-handler/messages.ts","../src/core/request-handler/task.ts","../src/core/request-handler/model.ts","../src/core/request-handler/structured-output.ts","../src/core/request-handler/tools.ts","../src/core/endpoint/endpoint.ts","../src/core/endpoint/request-builder.ts","../src/providers/openai/mapper.ts","../src/providers/openai/builder.ts","../src/providers/openai/client/default.ts","../src/providers/openai/client/parser.ts","../src/providers/openai/client/resolver.ts","../src/core/endpoint/response-handler.ts","../src/providers/openai/response-handler/output-parsed.ts","../src/providers/openai/response-handler/content.ts","../src/providers/openai/response-handler/output-text.ts","../src/core/usage-entry.ts","../src/providers/openai/model-pricing.ts","../src/providers/openai/response-handler/function-calls.ts","../src/core/response.ts","../src/providers/openai/response-handler/usage.ts","../src/providers/openai/endpoint.ts","../src/providers/anthropic/mapper.ts","../src/providers/anthropic/builder.ts","../src/providers/anthropic/client/default.ts","../src/providers/anthropic/client/parser.ts","../src/providers/anthropic/client/resolver.ts","../src/providers/anthropic/response-handler/parsed-output.ts","../src/providers/anthropic/response-handler/content.ts","../src/providers/anthropic/model-pricing.ts","../src/providers/anthropic/response-handler/tool-use.ts","../src/providers/anthropic/response-handler/usage.ts","../src/providers/anthropic/response-handler/undhandled.ts","../src/providers/anthropic/endpoint.ts","../src/providers/endpoint-resolver.ts","../src/core/agents/agent.ts","../src/core/workflow/schema/plan.ts","../src/core/workflow/execution/parallel.ts","../src/core/workflow/execution/sequential.ts","../src/core/workflow/execution/strategy-factory.ts","../src/core/workflow/hooks/cluster.ts","../src/core/workflow/hooks/logger.ts","../src/core/workflow/hooks/index.ts","../src/core/workflow/workflow.ts","../src/core/workflow/task.ts","../src/core/workflow/mapper.ts","../src/core/agents/planner.ts"],"sourcesContent":["import { WorkUnit } from \"@core/workflow/work-unit\"\nimport { PlanningAgent } from \"@/core/agents/planner\"\nimport { Task } from \"@core/workflow/task\"\nimport { Workflow } from \"@core/workflow/workflow\"\nimport { MozaikAgent } from \"@core/agents/agent\"\nimport { Message } from \"@/types/message\"\nimport { Model } from \"@/types/model\"\nimport { Tool } from \"@/types/tool\"\nimport { MozaikResponse } from \"@/types/response\"\nimport { MozaikRequest } from \"@/types/request\"\n\nexport { Model, Message, Tool, Workflow, Task, WorkUnit, PlanningAgent, MozaikAgent, MozaikRequest, MozaikResponse }\n","import { ExecutionHook } from \"./hooks/execution-hook\"\n\nexport abstract class WorkUnit {\n\tconstructor() {}\n\n\tabstract execute(hook: ExecutionHook): Promise<any>\n}\n","import { MozaikRequest } from \"@/types/request\"\nimport { Endpoint } from \"./endpoint\"\nimport { EndpointResolver } from \"./endpoint-resolver\"\n\nexport class RequestGateway {\n\tendpoint!: Endpoint\n\n\tconstructor(readonly endpointResolver: EndpointResolver) {}\n\n\tasync invoke(request: MozaikRequest): Promise<any> {\n\t\tthis.endpoint = this.endpointResolver.resolve(request.model)\n\t\treturn await this.endpoint.sendRequest(request)\n\t}\n}\n","import { Endpoint } from \"./endpoint\"\n\nexport abstract class EndpointResolver {\n\tabstract resolve(model: string): Endpoint\n}\n","export const OPENAI_MODELS = [\"gpt-5\", \"gpt-5-mini\", \"gpt-5-nano\", \"gpt-5.1\", \"gpt-5.2\", \"gpt-5.4\"] as const\n\nexport type OpenAIModel = (typeof OPENAI_MODELS)[number]\n\nconst latest_sonnet = \"claude-sonnet-4-5-20250929\"\nconst latest_haiku = \"claude-haiku-4-5-20251001\"\nconst latest_opus = \"claude-opus-4-5-20251101\"\n\nexport const ANTHROPIC_MODELS = [\"claude-sonnet-4.5\", \"claude-haiku-4.5\", \"claude-opus-4.5\"] as const\n\nexport const ANTHROPIC_MODEL_MAP = {\n\t\"claude-sonnet-4.5\": latest_sonnet,\n\t\"claude-haiku-4.5\": latest_haiku,\n\t\"claude-opus-4.5\": latest_opus,\n} as const\n\nexport type AnthropicModel = (typeof ANTHROPIC_MODELS)[number]\n\nexport type Model = OpenAIModel | AnthropicModel\n","import { MozaikRequest } from \"@/types/request\"\nimport { RequestBuilder } from \"../endpoint/request-builder\"\n\nexport abstract class CapabilityHandler {\n\tabstract nextHandler: CapabilityHandler\n\n\tsetNextHandler(capability: CapabilityHandler): CapabilityHandler {\n\t\tthis.nextHandler = capability\n\t\treturn this.nextHandler\n\t}\n\n\tabstract apply(request: MozaikRequest, requestBuilder: RequestBuilder): any\n\n\thandle(request: MozaikRequest, builder: RequestBuilder) {\n\t\tthis.apply(request, builder)\n\n\t\tif (this.nextHandler) {\n\t\t\tthis.nextHandler.handle(request, builder)\n\t\t}\n\t}\n}\n","import { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { CapabilityHandler } from \"./capability\"\nimport { MozaikRequest } from \"@/types/request\"\n\nexport class MessagesHandler extends CapabilityHandler {\n\tnextHandler!: CapabilityHandler\n\n\tapply(request: MozaikRequest, builder: RequestBuilder) {\n\t\tif (request.messages) {\n\t\t\tbuilder.addMessages(request.messages)\n\t\t}\n\t}\n}\n","import { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { CapabilityHandler } from \"./capability\"\nimport { MozaikRequest } from \"@/types/request\"\n\nexport class TaskHandler extends CapabilityHandler {\n\tnextHandler!: CapabilityHandler\n\n\tapply(request: MozaikRequest, builder: RequestBuilder) {\n\t\tif (request.task) {\n\t\t\tbuilder.addTask(request.task)\n\t\t}\n\t}\n}\n","import { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { CapabilityHandler } from \"./capability\"\nimport { MozaikRequest } from \"@/types/request\"\n\nexport class ModelHandler extends CapabilityHandler {\n\tnextHandler!: CapabilityHandler\n\n\tapply(request: MozaikRequest, builder: RequestBuilder) {\n\t\tif (request.model) {\n\t\t\tbuilder.addModel(request.model)\n\t\t}\n\t}\n}\n","import { MozaikRequest } from \"@/types/request\"\nimport { CapabilityHandler } from \"./capability\"\nimport { RequestBuilder } from \"@core/endpoint/request-builder\"\n\nexport class StructuredOutputlHandler extends CapabilityHandler {\n\tnextHandler!: CapabilityHandler\n\n\tapply(request: MozaikRequest, builder: RequestBuilder) {\n\t\tif (request.structuredOutput) {\n\t\t\tbuilder.addStructuredOutput(request.structuredOutput)\n\t\t}\n\t}\n}\n","import { MozaikRequest } from \"@/types/request\"\nimport { RequestBuilder } from \"../endpoint/request-builder\"\nimport { CapabilityHandler } from \"./capability\"\n\nexport class ToolsHandler extends CapabilityHandler {\n\tnextHandler!: CapabilityHandler\n\n\tapply(mozaikRequest: MozaikRequest, requestBuilder: RequestBuilder) {\n\t\tif (mozaikRequest.tools && mozaikRequest.tools.length > 0) {\n\t\t\trequestBuilder.addTools(mozaikRequest.tools)\n\t\t}\n\t}\n}\n","import { RequestBuilder } from \"./request-builder\"\nimport { CapabilityHandler } from \"../request-handler/capability\"\nimport { MessagesHandler } from \"../request-handler/messages\"\nimport { TaskHandler } from \"../request-handler/task\"\nimport { ModelHandler } from \"../request-handler/model\"\nimport { StructuredOutputlHandler } from \"../request-handler/structured-output\"\nimport { MozaikRequest } from \"@/types/request\"\nimport { ToolsHandler } from \"../request-handler/tools\"\n\nexport abstract class Endpoint {\n\tabstract requestBuilder: RequestBuilder\n\trequest: MozaikRequest | null = null\n\n\tbuildRequest(request: MozaikRequest): any {\n\t\tthis.request = request\n\n\t\tthis.requestBuilder.initialize()\n\n\t\tconst messagesHandler: CapabilityHandler = new MessagesHandler()\n\t\tconst taskHandler: CapabilityHandler = new TaskHandler()\n\t\tconst modelHandler: CapabilityHandler = new ModelHandler()\n\t\tconst structuredOutputHandler: CapabilityHandler = new StructuredOutputlHandler()\n\t\tconst toolsHandler: CapabilityHandler = new ToolsHandler()\n\n\t\tmessagesHandler\n\t\t\t.setNextHandler(taskHandler)\n\t\t\t.setNextHandler(modelHandler)\n\t\t\t.setNextHandler(structuredOutputHandler)\n\t\t\t.setNextHandler(toolsHandler)\n\n\t\tmessagesHandler.handle(request, this.requestBuilder)\n\n\t\treturn this.requestBuilder.build()\n\t}\n\n\tabstract sendRequest(providerRequest: any): any\n}\n","import { Message } from \"@/types/message\"\nimport { ReasoningEffort } from \"@/types/request\"\nimport { Tool } from \"@/types/tool\"\nimport { ZodObject } from \"zod\"\n\nexport abstract class RequestBuilder {\n\trequest: any\n\n\tinitialize() {\n\t\tthis.request = {}\n\t}\n\n\tabstract addModel(model: string): RequestBuilder\n\tabstract addTask(task: string): RequestBuilder\n\tabstract addMessages(messages: Message[]): RequestBuilder\n\tabstract addStructuredOutput(schema: ZodObject<any>): RequestBuilder\n\tabstract addTools(tools: Tool[]): RequestBuilder\n\tabstract addReasoningEffort(effort: ReasoningEffort): RequestBuilder\n\n\tbuild() {\n\t\treturn this.request\n\t}\n}\n","import { Message } from \"@/types/message\"\nimport { Tool } from \"@/types/tool\"\n\nexport interface ToolDefinition {\n\ttype: \"function\"\n\tname: string\n\tdescription: string\n\tparameters: any\n\tstrict?: boolean\n}\n\nexport class OpenAIResponsesMapper {\n\t/**\n\t * Convert domain Messages to Responses API instructions format\n\t *\n\t * The Responses API uses 'instructions' (system prompt) rather than messages array.\n\t * For multi-turn conversations, use conversation.id or previous_response_id parameters.\n\t */\n\ttoInstructions(messages: Message[]): string {\n\t\tif (messages.length === 0) {\n\t\t\tthrow new Error(\"[ResponsesMapper] Cannot create instructions from empty messages\")\n\t\t}\n\n\t\t// Find system message if exists, otherwise use first user message as context\n\t\tconst systemMessage = messages.find((m) => m.role === \"system\")\n\n\t\tif (systemMessage) {\n\t\t\treturn typeof systemMessage.content === \"string\"\n\t\t\t\t? systemMessage.content\n\t\t\t\t: this.extractTextFromContent(systemMessage.content)\n\t\t}\n\n\t\t// Fallback: create instructions from context\n\t\treturn \"You are a helpful assistant.\"\n\t}\n\n\t/**\n\t * Extract the user's input from messages\n\t * Returns the last user message content for use in prompt variables.\n\t * In Responses API, the actual user query is typically passed via prompt variables\n\t * or handled through conversation continuation.\n\t */\n\textractUserInput(messages: Message[]): string {\n\t\tconst userMessages = messages.filter((m) => m.role === \"user\")\n\n\t\tif (userMessages.length === 0) {\n\t\t\treturn \"\"\n\t\t}\n\n\t\tconst lastUserMessage = userMessages[userMessages.length - 1]\n\t\treturn typeof lastUserMessage.content === \"string\"\n\t\t\t? lastUserMessage.content\n\t\t\t: this.extractTextFromContent(lastUserMessage.content)\n\t}\n\n\tprivate extractTextFromContent(content: any[]): string {\n\t\treturn content\n\t\t\t.filter((part) => part.type === \"text\")\n\t\t\t.map((part) => part.text)\n\t\t\t.join(\" \")\n\t}\n\n\t/**\n\t * Map tools to Responses API format\n\t */\n\ttoTools(tools: Tool[]): ToolDefinition[] {\n\t\treturn tools.map((t) => ({\n\t\t\ttype: \"function\",\n\t\t\tname: t.name,\n\t\t\tdescription: t.description,\n\t\t\tparameters: t.schema,\n\t\t\tstrict: true, // Enable strict mode by default for better validation\n\t\t}))\n\t}\n}\n","import { Message } from \"@/types/message\"\nimport { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { OpenAIResponsesMapper } from \"./mapper\"\nimport { zodTextFormat } from \"openai/helpers/zod\"\nimport { ZodObject } from \"zod\"\nimport { Tool } from \"@/types/tool\"\nimport { ReasoningEffort } from \"@/types/request\"\n\nexport class OpenAIResponsesBuilder extends RequestBuilder {\n\n\tconstructor(private mapper = new OpenAIResponsesMapper()) {\n\t\tsuper()\n\t}\n\n\taddModel(model: string): RequestBuilder {\n\t\tthis.request.model = model\n\t\treturn this\n\t}\n\n\taddTask(task: string): RequestBuilder {\n\t\tthis.request.input = task\n\t\treturn this\n\t}\n\n\taddMessages(messages: Message[]): RequestBuilder {\n\t\tconst instructions = this.mapper.toInstructions(messages)\n\t\t// Set optional instructions if there's a system message\n\t\tif (instructions && instructions !== \"You are a helpful assistant.\") {\n\t\t\tthis.request.instructions = instructions\n\t\t}\n\n\t\treturn this\n\t}\n\n\taddStructuredOutput(schema: ZodObject): RequestBuilder {\n\t\tthis.request.text = {\n\t\t\tformat: zodTextFormat(schema, \"outputSchema\"),\n\t\t}\n\t\treturn this\n\t}\n\t\n\taddTools(tools: Tool[]): RequestBuilder {\n\t\tthis.request.tools = tools.map((tool) => ({\n\t\t\ttype: \"function\" as const,\n\t\t\tname: tool.name,\n\t\t\tdescription: tool.description,\n\t\t\tparameters: tool.schema,\n\t\t}))\n\t\treturn this\n\t}\n\n\taddReasoningEffort(effort: ReasoningEffort): RequestBuilder {\n\t\tlet reasoningEffort = ''\n\t\tif (effort === ReasoningEffort.NONE) {\n\t\t\treasoningEffort = 'none'\n\t\t} else if (effort === ReasoningEffort.LOW) {\n\t\t\treasoningEffort = \"low\"\n\t\t} else if (effort === ReasoningEffort.MEDIUM) {\n\t\t\treasoningEffort = \"medium\"\n\t\t} else if (effort === ReasoningEffort.HIGH) {\n\t\t\treasoningEffort = \"high\"\n\t\t} else if (effort === ReasoningEffort.MAX) {\n\t\t\treasoningEffort = \"xhigh\"\n\t\t}\n\n\t\tthis.request.reasoning = {\n\t\t\teffort: reasoningEffort\n\t\t}\n\n\t\treturn this\n\t}\n}\n","import OpenAI from \"openai\"\nimport { SendingClient } from \"@core/endpoint/client\"\n\nexport class OpenAIDefaultClient implements SendingClient {\n\tconstructor(private client = new OpenAI()) {}\n\n\tasync send(request: any): Promise<any> {\n\t\treturn await this.client.responses.create(request)\n\t}\n}\n","import OpenAI from \"openai\"\nimport { SendingClient } from \"@core/endpoint/client\"\n\nexport class OpenAIParserClient implements SendingClient {\n\tconstructor(private client = new OpenAI()) {}\n\n\tasync send(request: any): Promise<any> {\n\t\treturn await this.client.responses.parse(request)\n\t}\n}\n","import { SendingClient } from \"@core/endpoint/client\"\nimport { OpenAIDefaultClient } from \"./default\"\nimport { OpenAIParserClient } from \"./parser\"\n\nexport class OpenAIClientResolver {\n\tstatic resolve(request: any): SendingClient {\n\t\tif (request.text && request.text.format) {\n\t\t\treturn new OpenAIParserClient()\n\t\t} else {\n\t\t\treturn new OpenAIDefaultClient()\n\t\t}\n\t}\n}\n","import { MozaikResponse } from \"../response\"\n\nexport abstract class ResponseHandler {\n\tabstract nextHandler: ResponseHandler\n\n\tsetNextHandler(responseHandler: ResponseHandler): ResponseHandler {\n\t\tthis.nextHandler = responseHandler\n\t\treturn this.nextHandler\n\t}\n\n\tabstract handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse>\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class OutputParsedHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tif (providerResponse.output_parsed) {\n\t\t\tmozaikResponse.setResponseData(providerResponse.output_parsed)\n\t\t\treturn mozaikResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class ContentHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tconst firstOutput = providerResponse.output?.[0]\n\t\tif (firstOutput && \"content\" in firstOutput) {\n\t\t\tconst firstContent = firstOutput.content?.[0]\n\t\t\tif (firstContent && \"text\" in firstContent) {\n\t\t\t\tmozaikResponse.setResponseData(firstContent.text)\n\t\t\t\treturn mozaikResponse\n\t\t\t}\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class OutputTextHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tif (providerResponse.output_text) {\n\t\t\tmozaikResponse.setResponseData(providerResponse.output_text)\n\t\t\treturn mozaikResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","export class UsageEntry {\n\tpriceInUsd: number\n\tmodel: string\n\n\tconstructor(priceInUsd: number, model: string) {\n\t\tthis.priceInUsd = priceInUsd\n\t\tthis.model = model\n\t}\n}\n","export class OpenAIModelPricing {\n\tprivate inputPricePer1MToken!: number\n\tprivate outputPricePer1MToken!: number\n\tprivate cachedPricePer1MToken!: number\n\n\tcalculateTotalCost(inputTokens: number, outputTokens: number, cachedInputTokens: number): number {\n\t\tconst inputCost = ((inputTokens - cachedInputTokens) * this.inputPricePer1MToken) / 1_000_000\n\t\tconst outputCost = (outputTokens * this.outputPricePer1MToken) / 1_000_000\n\t\tconst cachedCost = (cachedInputTokens * this.cachedPricePer1MToken) / 1_000_000\n\t\treturn inputCost + outputCost + cachedCost\n\t}\n\n\tgetPriceInUsd(modelName: string, inputTokens: number, outputTokens: number, cachedInputTokens: number): number {\n\t\tif (modelName.startsWith(\"gpt-5-mini\")) {\n\t\t\tthis.inputPricePer1MToken = 0.25\n\t\t\tthis.outputPricePer1MToken = 2\n\t\t\tthis.cachedPricePer1MToken = 0.025\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens, cachedInputTokens)\n\t\t} else if (modelName.startsWith(\"gpt-5-nano\")) {\n\t\t\tthis.inputPricePer1MToken = 0.05\n\t\t\tthis.outputPricePer1MToken = 0.4\n\t\t\tthis.cachedPricePer1MToken = 0.005\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens, cachedInputTokens)\n\t\t} else if (modelName.startsWith(\"gpt-5.1\")) {\n\t\t\tthis.inputPricePer1MToken = 1.25\n\t\t\tthis.outputPricePer1MToken = 10\n\t\t\tthis.cachedPricePer1MToken = 0.125\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens, cachedInputTokens)\n\t\t} else if (modelName.startsWith(\"gpt-5\")) {\n\t\t\tthis.inputPricePer1MToken = 1.25\n\t\t\tthis.outputPricePer1MToken = 10\n\t\t\tthis.cachedPricePer1MToken = 0.125\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens, cachedInputTokens)\n\t\t}\n\n\t\tthrow new Error(`Model name ${modelName} is not supported for this pricing`)\n\t}\n}\n","import { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { OpenAIDefaultClient } from \"../client/default\"\nimport { Tool } from \"@/types/tool\"\nimport { MozaikResponse } from \"@core/response\"\nimport { UsageEntry } from \"@core/usage-entry\"\nimport { OpenAIModelPricing } from \"@providers/openai/model-pricing\"\n\nexport interface ToolCall {\n\tcall_id: string\n\tname: string\n\targuments: string | Record<string, any>\n}\n\nexport interface ToolResult {\n\ttype: \"function_call_output\"\n\tcall_id: string\n\toutput: string\n}\n\nexport class FunctionCallsHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\tclient: OpenAIDefaultClient\n\ttools: Tool[]\n\trequest: any\n\n\tconstructor(request: any, tools: Tool[]) {\n\t\tsuper()\n\t\tthis.request = request\n\t\tthis.tools = tools\n\t\tthis.client = new OpenAIDefaultClient()\n\t}\n\n\tprivate hasToolCalls(response: any): boolean {\n\t\treturn response.output?.some((item: any) => item.type === \"function_call\")\n\t}\n\n\tprivate extractToolCalls(response: any): any[] {\n\t\treturn response.output?.filter((item: any) => item.type === \"function_call\") || []\n\t}\n\n\tprivate resolveTool(call: ToolCall, tools: Tool[]): Tool | null {\n\t\treturn tools.find((t) => t.name === call.name) ?? null\n\t}\n\n\tprivate async executeTool(tool: Tool, rawArgs: ToolCall[\"arguments\"]): Promise<any> {\n\t\tconst args = typeof rawArgs === \"string\" ? JSON.parse(rawArgs) : rawArgs\n\n\t\treturn await tool.invoke(args)\n\t}\n\n\tprivate formatToolResult(callId: string, payload: any): ToolResult {\n\t\treturn {\n\t\t\ttype: \"function_call_output\",\n\t\t\tcall_id: callId,\n\t\t\toutput: JSON.stringify(payload),\n\t\t}\n\t}\n\n\tprivate async executeToolCalls(toolCalls: ToolCall[], tools: Tool[]): Promise<ToolResult[]> {\n\t\tconst results: ToolResult[] = []\n\n\t\tfor (const call of toolCalls) {\n\t\t\tconst tool = this.resolveTool(call, tools)\n\n\t\t\tif (!tool) {\n\t\t\t\tresults.push(\n\t\t\t\t\tthis.formatToolResult(call.call_id, {\n\t\t\t\t\t\terror: `Unknown tool: ${call.name}`,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst result = await this.executeTool(tool, call.arguments)\n\t\t\t\tresults.push(this.formatToolResult(call.call_id, result))\n\t\t\t} catch (err: any) {\n\t\t\t\tresults.push(\n\t\t\t\t\tthis.formatToolResult(call.call_id, {\n\t\t\t\t\t\terror: err.message ?? \"Tool execution failed\",\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\treturn results\n\t}\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tlet providerResponse = mozaikResponse.providerResponse\n\t\tlet toolCallingResponse: any\n\t\twhile (this.hasToolCalls(providerResponse)) {\n\t\t\tconst toolCalls = this.extractToolCalls(providerResponse)\n\n\t\t\tconst toolResults = await this.executeToolCalls(toolCalls, this.tools)\n\n\t\t\t// Continue the conversation with tool results\n\t\t\tthis.request.input = toolResults\n\t\t\tthis.request.previous_response_id = providerResponse.id\n\n\t\t\ttoolCallingResponse = await this.client.send(this.request)\n\n\t\t\tconst openAIModelPricing = new OpenAIModelPricing()\n\t\t\tconst usage = toolCallingResponse.usage\n\t\t\tconst totalCost = openAIModelPricing.getPriceInUsd(\n\t\t\t\tproviderResponse.model,\n\t\t\t\tusage.input_tokens,\n\t\t\t\tusage.output_tokens,\n\t\t\t\tusage.input_token_details?.cached_tokens ?? 0,\n\t\t\t)\n\n\t\t\tmozaikResponse.addUsageEntry(new UsageEntry(totalCost, providerResponse.model))\n\t\t\tmozaikResponse.setProviderResponse(toolCallingResponse)\n\t\t\tmozaikResponse.setResponseData(toolCallingResponse)\n\t\t\tproviderResponse = toolCallingResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { UsageEntry } from \"./usage-entry\"\n\nexport class MozaikResponse {\n\tproviderResponse: any\n\tresponseData?: any\n\tusageEntries: UsageEntry[] = []\n\n\tsetProviderResponse(providerResponse: any): MozaikResponse {\n\t\tthis.providerResponse = providerResponse\n\t\treturn this\n\t}\n\n\taddUsageEntry(usageEntry: UsageEntry): MozaikResponse {\n\t\tthis.usageEntries.push(usageEntry)\n\t\treturn this\n\t}\n\n\tsetResponseData(response: any): MozaikResponse {\n\t\tthis.responseData = response\n\t\treturn this\n\t}\n\n\tgetResponse(): any {\n\t\treturn {\n\t\t\tdata: this.responseData,\n\t\t\tusage: {\n\t\t\t\tentries: this.usageEntries,\n\t\t\t},\n\t\t\ttotalCost: this.usageEntries.reduce((acc, entry) => acc + entry.priceInUsd, 0),\n\t\t}\n\t}\n\n\tgetUsageEntries(): UsageEntry[] {\n\t\treturn this.usageEntries\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { UsageEntry } from \"@core/usage-entry\"\nimport { OpenAIModelPricing } from \"@providers/openai/model-pricing\"\n\nexport class UsageHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tconst usage = providerResponse.usage\n\n\t\tconst openAIModelPricing = new OpenAIModelPricing()\n\t\tconst totalCost = openAIModelPricing.getPriceInUsd(\n\t\t\tproviderResponse.model,\n\t\t\tusage.input_tokens,\n\t\t\tusage.output_tokens,\n\t\t\tusage.input_token_details?.cached_tokens ?? 0,\n\t\t)\n\n\t\tmozaikResponse.addUsageEntry(new UsageEntry(totalCost, providerResponse.model))\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { Endpoint } from \"@core/endpoint/endpoint\"\nimport { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { OpenAIResponsesBuilder } from \"./builder\"\nimport { OpenAIClientResolver } from \"./client/resolver\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { OutputParsedHandler } from \"./response-handler/output-parsed\"\nimport { ContentHandler } from \"./response-handler/content\"\nimport { OutputTextHandler } from \"./response-handler/output-text\"\nimport { FunctionCallsHandler } from \"./response-handler/function-calls\"\nimport { MozaikRequest } from \"@/types/request\"\nimport { MozaikResponse } from \"@core/response\"\nimport { UsageHandler } from \"./response-handler/usage\"\n\nexport class OpenAIResponses extends Endpoint {\n\trequestBuilder: RequestBuilder = new OpenAIResponsesBuilder()\n\n\tconstructor() {\n\t\tsuper()\n\t}\n\n\tasync sendRequest(mozaikRequest: MozaikRequest): Promise<any> {\n\t\ttry {\n\t\t\tconst request = this.buildRequest(mozaikRequest)\n\t\t\tconst client = OpenAIClientResolver.resolve(request)\n\t\t\tconst response = await client.send(request)\n\n\t\t\tconst mozaikResponse = new MozaikResponse()\n\t\t\tmozaikResponse.setProviderResponse(response)\n\n\t\t\t// response handler (chain of responsibilities)\n\t\t\tconst usageHandler: ResponseHandler = new UsageHandler()\n\t\t\tconst functionCallsHandler: ResponseHandler = new FunctionCallsHandler(\n\t\t\t\trequest,\n\t\t\t\tmozaikRequest.tools ? mozaikRequest.tools : [],\n\t\t\t)\n\t\t\tconst outputParsedHandler: ResponseHandler = new OutputParsedHandler()\n\t\t\tconst outputTextHandler: ResponseHandler = new OutputTextHandler()\n\t\t\tconst contentHandler: ResponseHandler = new ContentHandler()\n\n\t\t\tusageHandler\n\t\t\t\t.setNextHandler(functionCallsHandler)\n\t\t\t\t.setNextHandler(outputParsedHandler)\n\t\t\t\t.setNextHandler(outputTextHandler)\n\t\t\t\t.setNextHandler(contentHandler)\n\n\t\t\tconst responseHandler = usageHandler\n\n\t\t\tconst result: MozaikResponse = await responseHandler.handle(mozaikResponse)\n\n\t\t\treturn result.getResponse()\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"[OpenAIProvider] Responses API request failed:\", error)\n\t\t\tthrow error\n\t\t}\n\t}\n}\n","import { Message, TextPart, ImagePart } from \"@/types/message\"\nimport type { MessageParam, TextBlockParam, ImageBlockParam } from \"@anthropic-ai/sdk/resources/messages\"\n\nexport class AnthropicMapper {\n\t/**\n\t * Transforms domain messages to Anthropic API format.\n\t * Separates system messages from conversation messages.\n\t */\n\ttoMessages(messages: Message[]): { messages: MessageParam[]; system?: string } {\n\t\tconst anthropicMessages: MessageParam[] = []\n\t\tlet systemPrompt: string | undefined\n\n\t\tfor (const msg of messages) {\n\t\t\t// Extract system messages separately (Anthropic uses dedicated system parameter)\n\t\t\tif (msg.role === \"system\") {\n\t\t\t\tconst content =\n\t\t\t\t\ttypeof msg.content === \"string\"\n\t\t\t\t\t\t? msg.content\n\t\t\t\t\t\t: (msg.content as TextPart[]).map((p) => p.text).join(\"\\n\")\n\n\t\t\t\tsystemPrompt = systemPrompt ? `${systemPrompt}\\n\\n${content}` : content\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Skip tool role messages (not directly supported in basic implementation)\n\t\t\tif (msg.role === \"tool\") {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Map user and assistant messages\n\t\t\tif (msg.role === \"user\" || msg.role === \"assistant\") {\n\t\t\t\tif (typeof msg.content === \"string\") {\n\t\t\t\t\tanthropicMessages.push({\n\t\t\t\t\t\trole: msg.role,\n\t\t\t\t\t\tcontent: msg.content,\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\t// Handle multimodal content (text + images)\n\t\t\t\t\tconst contentBlocks = (msg.content as Array<TextPart | ImagePart>).map((part) => {\n\t\t\t\t\t\tif (part.type === \"text\") {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\t\ttext: part.text,\n\t\t\t\t\t\t\t} as TextBlockParam\n\t\t\t\t\t\t} else if (part.type === \"image_url\") {\n\t\t\t\t\t\t\t// Note: Anthropic requires base64-encoded images\n\t\t\t\t\t\t\t// This is a simplified version - production code should handle URL->base64 conversion\n\t\t\t\t\t\t\tconst imageUrl = part.url\n\n\t\t\t\t\t\t\t// Check if it's already base64 data\n\t\t\t\t\t\t\tif (imageUrl.startsWith(\"data:image\")) {\n\t\t\t\t\t\t\t\tconst matches = imageUrl.match(/data:image\\/(\\w+);base64,(.+)/)\n\t\t\t\t\t\t\t\tif (matches) {\n\t\t\t\t\t\t\t\t\tconst [, mediaType, data] = matches\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\ttype: \"image\" as const,\n\t\t\t\t\t\t\t\t\t\tsource: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"base64\" as const,\n\t\t\t\t\t\t\t\t\t\t\tmedia_type: `image/${mediaType}` as\n\t\t\t\t\t\t\t\t\t\t\t\t| \"image/jpeg\"\n\t\t\t\t\t\t\t\t\t\t\t\t| \"image/png\"\n\t\t\t\t\t\t\t\t\t\t\t\t| \"image/gif\"\n\t\t\t\t\t\t\t\t\t\t\t\t| \"image/webp\",\n\t\t\t\t\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t} as ImageBlockParam\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// For non-base64 URLs, throw error (or you could fetch and convert)\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\"[AnthropicMapper] Image URLs must be base64-encoded. \" +\n\t\t\t\t\t\t\t\t\t\"Convert to data:image/[type];base64,[data] format.\",\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn { type: \"text\" as const, text: \"\" } as TextBlockParam\n\t\t\t\t\t})\n\n\t\t\t\t\tanthropicMessages.push({\n\t\t\t\t\t\trole: msg.role,\n\t\t\t\t\t\tcontent: contentBlocks,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Anthropic requires alternating user/assistant roles\n\t\t// Validate and fix if needed\n\t\tconst validated = this.ensureAlternatingRoles(anthropicMessages)\n\n\t\treturn {\n\t\t\tmessages: validated,\n\t\t\tsystem: systemPrompt,\n\t\t}\n\t}\n\n\t/**\n\t * Ensures messages alternate between user and assistant roles.\n\t * Anthropic API requires this constraint.\n\t */\n\tprivate ensureAlternatingRoles(messages: MessageParam[]): MessageParam[] {\n\t\tif (messages.length === 0) return messages\n\n\t\tconst result: MessageParam[] = []\n\t\tlet lastRole: \"user\" | \"assistant\" | undefined\n\n\t\tfor (const msg of messages) {\n\t\t\t// If same role appears consecutively, merge the messages\n\t\t\tif (lastRole === msg.role && result.length > 0) {\n\t\t\t\tconst lastMsg = result[result.length - 1]\n\n\t\t\t\t// Merge content\n\t\t\t\tif (typeof lastMsg.content === \"string\" && typeof msg.content === \"string\") {\n\t\t\t\t\tlastMsg.content = `${lastMsg.content}\\n${msg.content}`\n\t\t\t\t} else {\n\t\t\t\t\t// For array content, concatenate\n\t\t\t\t\tconst lastContent = Array.isArray(lastMsg.content)\n\t\t\t\t\t\t? lastMsg.content\n\t\t\t\t\t\t: [{ type: \"text\" as const, text: lastMsg.content as string }]\n\t\t\t\t\tconst newContent = Array.isArray(msg.content)\n\t\t\t\t\t\t? msg.content\n\t\t\t\t\t\t: [{ type: \"text\" as const, text: msg.content as string }]\n\t\t\t\t\tlastMsg.content = [...lastContent, ...newContent]\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresult.push(msg)\n\t\t\t\tlastRole = msg.role\n\t\t\t}\n\t\t}\n\n\t\t// Ensure first message is from user (Anthropic requirement)\n\t\tif (result.length > 0 && result[0].role !== \"user\") {\n\t\t\tthrow new Error(\n\t\t\t\t\"[AnthropicMapper] First message must be from user. Anthropic API requires conversations to start with a user message.\",\n\t\t\t)\n\t\t}\n\n\t\treturn result\n\t}\n}\n","import { Message } from \"@/types/message\"\nimport { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { AnthropicMapper } from \"./mapper\"\nimport { betaZodOutputFormat } from \"@anthropic-ai/sdk/helpers/beta/zod\"\nimport { ANTHROPIC_MODEL_MAP, AnthropicModel } from \"@/types/model\"\nimport { ZodObject } from \"zod\"\nimport { Tool } from \"@/types/tool\"\nimport { ReasoningEffort } from \"@/types/request\"\n\nexport class AnthropicRequestBuilder extends RequestBuilder {\n\tprivate mapper = new AnthropicMapper()\n\n\taddModel(model: AnthropicModel): RequestBuilder {\n\t\tthis.request.model = ANTHROPIC_MODEL_MAP[model]\n\t\treturn this\n\t}\n\n\taddTask(task: string): RequestBuilder {\n\t\t// Add task as a user message\n\t\tconst message = {\n\t\t\trole: \"user\" as const,\n\t\t\tcontent: task,\n\t\t}\n\n\t\tif (!this.request.messages) {\n\t\t\tthis.request.messages = []\n\t\t}\n\n\t\tthis.request.messages.push(message)\n\t\treturn this\n\t}\n\n\taddMessages(messages: Message[]): RequestBuilder {\n\t\tconst { messages: anthropicMessages, system } = this.mapper.toMessages(messages)\n\n\t\tthis.request.messages = anthropicMessages\n\n\t\tif (system) {\n\t\t\tthis.request.system = system\n\t\t}\n\n\t\treturn this\n\t}\n\n\taddStructuredOutput(schema: ZodObject): RequestBuilder {\n\t\tthis.request.betas = [\"structured-outputs-2025-11-13\"]\n\t\tthis.request.output_format = betaZodOutputFormat(schema)\n\t\treturn this\n\t}\n\n\taddTools(tools: Tool[]): RequestBuilder {\n\t\tthis.request.tools = tools.map((tool) => ({\n\t\t\tname: tool.name,\n\t\t\tdescription: tool.description,\n\t\t\tinput_schema: tool.schema,\n\t\t}))\n\t\treturn this\n\t}\n\n\taddReasoningEffort(effort: ReasoningEffort): RequestBuilder {\n\n\t\tlet reasoningEffort = ''\n\t\tif (effort === ReasoningEffort.NONE) {\n\t\t\treturn this\n\t\t} else if (effort === ReasoningEffort.LOW) {\n\t\t\treasoningEffort = \"low\"\n\t\t} else if (effort === ReasoningEffort.MEDIUM) {\n\t\t\treasoningEffort = \"medium\"\n\t\t} else if (effort === ReasoningEffort.HIGH) {\n\t\t\treasoningEffort = \"high\"\n\t\t} else if (effort === ReasoningEffort.MAX) {\n\t\t\treasoningEffort = \"max\"\n\t\t}\n\n\t\tthis.request.output_config = {\n\t\t\teffort: reasoningEffort\n\t\t}\n\t\treturn this\n\t}\n\n\tbuild() {\n\t\t// Anthropic requires max_tokens parameter\n\t\tif (!this.request.max_tokens) {\n\t\t\tthis.request.max_tokens = 1024\n\t\t}\n\n\t\treturn this.request\n\t}\n}\n","import { SendingClient } from \"@core/endpoint/client\"\nimport Anthropic from \"@anthropic-ai/sdk\"\n\nexport class AnthropicDefaultClient implements SendingClient {\n\tconstructor(private client = new Anthropic()) {}\n\n\tasync send(request: any): Promise<any> {\n\t\treturn await this.client.messages.create(request)\n\t}\n}\n","import { SendingClient } from \"@core/endpoint/client\"\nimport Anthropic from \"@anthropic-ai/sdk\"\n\nexport class AnthropicParserClient implements SendingClient {\n\tconstructor(private client = new Anthropic()) {}\n\n\tasync send(request: any): Promise<any> {\n\t\treturn await this.client.beta.messages.parse(request)\n\t}\n}\n","import { SendingClient } from \"@core/endpoint/client\"\nimport { AnthropicDefaultClient } from \"./default\"\nimport { AnthropicParserClient } from \"./parser\"\n\nexport class AnthropicClientResolver {\n\tstatic resolve(request: any): SendingClient {\n\t\treturn request.output_format ? new AnthropicParserClient() : new AnthropicDefaultClient()\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class ParsedOutputHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tif (providerResponse.parsed_output) {\n\t\t\tmozaikResponse.setResponseData(providerResponse.parsed_output)\n\t\t\treturn mozaikResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class ContentHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tconst content = providerResponse.content\n\t\t\t.filter((block: any) => block.type === \"text\")\n\t\t\t.map((block: any) => (block.type === \"text\" ? block.text : \"\"))\n\t\t\t.join(\"\")\n\n\t\tif (content) {\n\t\t\tmozaikResponse.setResponseData(content)\n\t\t\treturn mozaikResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","export class AnthropicModelPricing {\n\tprivate inputPricePer1MToken!: number\n\tprivate outputPricePer1MToken!: number\n\n\tcalculateTotalCost(inputTokens: number, outputTokens: number): number {\n\t\tconst inputCost = (inputTokens * this.inputPricePer1MToken) / 1_000_000\n\t\tconst outputCost = (outputTokens * this.outputPricePer1MToken) / 1_000_000\n\t\treturn inputCost + outputCost\n\t}\n\n\tgetPriceInUsd(modelName: string, inputTokens: number, outputTokens: number): number {\n\t\tif (modelName.startsWith(\"claude-sonnet-4-5\")) {\n\t\t\tthis.inputPricePer1MToken = 3\n\t\t\tthis.outputPricePer1MToken = 15\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens)\n\t\t} else if (modelName.startsWith(\"claude-haiku-4-5\")) {\n\t\t\tthis.inputPricePer1MToken = 1\n\t\t\tthis.outputPricePer1MToken = 5\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens)\n\t\t} else if (modelName.startsWith(\"claude-opus-4-5\")) {\n\t\t\tthis.inputPricePer1MToken = 5\n\t\t\tthis.outputPricePer1MToken = 25\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens)\n\t\t}\n\n\t\tthrow new Error(`Model name ${modelName} is not supported for this pricing`)\n\t}\n}\n","import { Tool } from \"@/types/tool\"\nimport Anthropic from \"@anthropic-ai/sdk\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { AnthropicDefaultClient } from \"../client/default\"\nimport { MozaikResponse } from \"@core/response\"\nimport { UsageEntry } from \"@core/usage-entry\"\nimport { AnthropicModelPricing } from \"../model-pricing\"\n\nexport class ToolUseHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\tclient: AnthropicDefaultClient\n\ttools: Tool[]\n\trequest: any\n\n\tconstructor(request: any, tools: Tool[]) {\n\t\tsuper()\n\t\tthis.tools = tools\n\t\tthis.request = request\n\t\tthis.client = new AnthropicDefaultClient()\n\t}\n\n\tprivate async executeToolCalls(tools: Tool[], toolUseBlocks: Anthropic.ToolUseBlock[]): Promise<any[]> {\n\t\tconst results: any[] = []\n\n\t\tfor (const toolUse of toolUseBlocks) {\n\t\t\tconst tool = tools?.find((t) => t.name === toolUse.name)\n\n\t\t\tif (!tool) {\n\t\t\t\tresults.push({\n\t\t\t\t\ttype: \"tool_result\",\n\t\t\t\t\ttool_use_id: toolUse.id,\n\t\t\t\t\tcontent: JSON.stringify({ error: `Unknown tool: ${toolUse.name}` }),\n\t\t\t\t})\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst result = await tool.invoke(toolUse.input)\n\t\t\t\tresults.push({\n\t\t\t\t\ttype: \"tool_result\",\n\t\t\t\t\ttool_use_id: toolUse.id,\n\t\t\t\t\tcontent: JSON.stringify(result),\n\t\t\t\t})\n\t\t\t} catch (error: any) {\n\t\t\t\tresults.push({\n\t\t\t\t\ttype: \"tool_result\",\n\t\t\t\t\ttool_use_id: toolUse.id,\n\t\t\t\t\tcontent: JSON.stringify({ error: error.message }),\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn results\n\t}\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tlet providerResponse = mozaikResponse.providerResponse\n\n\t\twhile (providerResponse.stop_reason === \"tool_use\") {\n\t\t\tconst toolUseBlocks = providerResponse.content.filter(\n\t\t\t\t(block: any): block is Anthropic.ToolUseBlock => block.type === \"tool_use\",\n\t\t\t)\n\n\t\t\t// Add assistant's response to messages\n\t\t\tthis.request.messages.push({\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: providerResponse.content,\n\t\t\t})\n\n\t\t\tconst toolResults = await this.executeToolCalls(this.tools, toolUseBlocks)\n\n\t\t\t// Add tool results as user message\n\t\t\tthis.request.messages.push({\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: toolResults,\n\t\t\t})\n\n\t\t\t// Call model again\n\t\t\tconst toolCallingResponse = await this.client.send(this.request)\n\n\t\t\tconst usage = toolCallingResponse.usage\n\t\t\tconst anthropicModelPricing = new AnthropicModelPricing()\n\t\t\tconst totalCost = anthropicModelPricing.getPriceInUsd(\n\t\t\t\tproviderResponse.model,\n\t\t\t\tusage.input_tokens,\n\t\t\t\tusage.output_tokens,\n\t\t\t)\n\n\t\t\tmozaikResponse.addUsageEntry(new UsageEntry(totalCost, toolCallingResponse.model.name))\n\t\t\tmozaikResponse.setProviderResponse(toolCallingResponse)\n\t\t\tproviderResponse = toolCallingResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { UsageEntry } from \"@core/usage-entry\"\nimport { AnthropicModelPricing } from \"../model-pricing\"\n\nexport class UsageHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tconst usage = providerResponse.usage\n\n\t\tconst anthropicModelPricing = new AnthropicModelPricing()\n\t\tconst totalCost = anthropicModelPricing.getPriceInUsd(\n\t\t\tproviderResponse.model,\n\t\t\tusage.input_tokens,\n\t\t\tusage.output_tokens,\n\t\t)\n\t\tif (usage) {\n\t\t\tmozaikResponse.addUsageEntry(new UsageEntry(totalCost, providerResponse.model))\n\t\t}\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class UnhandledResponseHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tconst id = providerResponse?.id ?? \"unknown\"\n\t\tconst model = providerResponse?.model ?? \"unknown\"\n\n\t\tthrow new Error(`No response handler matched. response_id=${id} model=${model}`)\n\t}\n}\n","import { Endpoint } from \"@core/endpoint/endpoint\"\nimport { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { AnthropicRequestBuilder } from \"./builder\"\nimport { AnthropicClientResolver } from \"./client/resolver\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { ParsedOutputHandler } from \"./response-handler/parsed-output\"\nimport { ContentHandler } from \"./response-handler/content\"\nimport { ToolUseHandler } from \"./response-handler/tool-use\"\nimport { MozaikRequest } from \"@/types/request\"\nimport { MozaikResponse } from \"@core/response\"\nimport { UsageHandler } from \"./response-handler/usage\"\nimport { UnhandledResponseHandler } from \"./response-handler/undhandled\"\n\nexport class AnthropicEndpoint extends Endpoint {\n\trequestBuilder: RequestBuilder = new AnthropicRequestBuilder()\n\n\tasync sendRequest(mozaikRequest: MozaikRequest): Promise<any> {\n\t\tconst providerRequest = this.buildRequest(mozaikRequest)\n\t\tconst client = AnthropicClientResolver.resolve(providerRequest)\n\t\tconst response = await client.send(providerRequest)\n\n\t\tconst mozaikResponse = new MozaikResponse()\n\t\tmozaikResponse.setProviderResponse(response)\n\n\t\t// response handler (chain of responsibilities)\n\t\tconst usageHandler: ResponseHandler = new UsageHandler()\n\t\tconst toolUseHandler: ResponseHandler = new ToolUseHandler(\n\t\t\tproviderRequest,\n\t\t\tmozaikRequest.tools ? mozaikRequest.tools : [],\n\t\t)\n\t\tconst parsedOutputHandler: ResponseHandler = new ParsedOutputHandler()\n\t\tconst contentHandler: ResponseHandler = new ContentHandler()\n\t\tconst unhandledResponseHandler: ResponseHandler = new UnhandledResponseHandler()\n\n\t\tusageHandler\n\t\t\t.setNextHandler(toolUseHandler)\n\t\t\t.setNextHandler(parsedOutputHandler)\n\t\t\t.setNextHandler(contentHandler)\n\t\t\t.setNextHandler(unhandledResponseHandler)\n\n\t\tconst responseHandler = usageHandler\n\n\t\tconst result = await responseHandler.handle(mozaikResponse)\n\n\t\treturn result.getResponse()\n\t}\n}\n","import { EndpointResolver } from \"@core/endpoint/endpoint-resolver\"\nimport { Endpoint } from \"@core/endpoint/endpoint\"\nimport { OPENAI_MODELS, ANTHROPIC_MODELS } from \"@/types/model\"\nimport { OpenAIResponses } from \"./openai/endpoint\"\nimport { AnthropicEndpoint } from \"./anthropic/endpoint\"\n\nexport class DefaultEndpointResolver extends EndpointResolver {\n\tisOpenAIModel(value: string): boolean {\n\t\treturn (OPENAI_MODELS as readonly string[]).includes(value)\n\t}\n\n\tisAnthropicModel(value: string): boolean {\n\t\treturn (ANTHROPIC_MODELS as readonly string[]).includes(value)\n\t}\n\n\tresolve(model: string): Endpoint {\n\t\tif (this.isOpenAIModel(model)) {\n\t\t\treturn new OpenAIResponses()\n\t\t} else if (this.isAnthropicModel(model)) {\n\t\t\treturn new AnthropicEndpoint()\n\t\t}\n\n\t\tthrow new Error(\"Provider not found\")\n\t}\n}\n","import { RequestGateway } from \"@core/endpoint/request-gateway\"\nimport { MozaikRequest } from \"@/types/request\"\nimport { DefaultEndpointResolver } from \"@providers/endpoint-resolver\"\nimport { ZodObject } from \"zod\"\nimport { Model } from \"@/types/model\"\nimport { Message } from \"@/types/message\"\n\nexport class MozaikAgent {\n\tprivate request: MozaikRequest\n\tgateway: RequestGateway = new RequestGateway(new DefaultEndpointResolver())\n\n\tconstructor(request: MozaikRequest) {\n\t\tthis.request = request\n\t}\n\n\tsetModel(model: Model) {\n\t\tthis.request.model = model\n\t}\n\n\tsetMessages(messages: Message[]) {\n\t\tthis.request.messages = messages\n\t}\n\n\tsetTask(task: string) {\n\t\tthis.request.task = task\n\t}\n\n\tsetStructuredOutput(schema: ZodObject<any>) {\n\t\tthis.request.structuredOutput = schema\n\t}\n\n\tasync act(task?: string) {\n\t\tif (task) {\n\t\t\tthis.request.task = task\n\t\t}\n\t\treturn await this.gateway.invoke(this.request)\n\t}\n}\n","import z from \"zod\"\nimport { ANTHROPIC_MODELS, OPENAI_MODELS } from \"@/types/model\"\nimport { PlanNode } from \"@/types/plan\"\n\nconst ModelSchema = z.enum([...OPENAI_MODELS, ...ANTHROPIC_MODELS])\n\nconst TaskPlanNodeSchema = z.object({\n\tkind: z.literal(\"task\"),\n\ttask: z.string(),\n\tmodel: ModelSchema,\n})\n\nconst WorkflowPlanNodeSchema: z.ZodType<Extract<PlanNode, { kind: \"workflow\" }>> = z.lazy(() =>\n\tz.object({\n\t\tkind: z.literal(\"workflow\"),\n\t\tmode: z.enum([\"sequential\", \"parallel\"]),\n\t\tunits: z.array(PlanNodeSchema),\n\t}),\n)\n\nconst PlanNodeSchema: z.ZodType<PlanNode> = TaskPlanNodeSchema.or(WorkflowPlanNodeSchema)\n\nexport const PlanSchema = z.object({\n\troot: PlanNodeSchema,\n})\n","import { Workflow } from \"@core/workflow/workflow\"\nimport { WorkflowExecutionStrategy } from \"@core/workflow/execution/strategy\"\nimport { ExecutionHook } from \"../hooks/execution-hook\"\n\nexport class ParallelExecution implements WorkflowExecutionStrategy {\n\tasync execute(workflow: Workflow, hook: ExecutionHook): Promise<any> {\n\t\tconst promises = []\n\t\tfor (const u of workflow.units) {\n\t\t\tpromises.push(u.execute(hook))\n\t\t}\n\n\t\tconst results = await Promise.all(promises)\n\n\t\treturn results\n\t}\n}\n","import { ExecutionHook } from \"../hooks/execution-hook\"\nimport { Workflow } from \"../workflow\"\nimport { WorkflowExecutionStrategy } from \"./strategy\"\n\nexport class SequentalExecution implements WorkflowExecutionStrategy {\n\tasync execute(workflow: Workflow, hook: ExecutionHook): Promise<any> {\n\t\tconst results = []\n\t\tfor (const u of workflow.units) {\n\t\t\tresults.push(await u.execute(hook))\n\t\t}\n\n\t\treturn results\n\t}\n}\n","import { ParallelExecution } from \"./parallel\"\nimport { SequentalExecution } from \"./sequential\"\nimport { WorkflowExecutionStrategy } from \"./strategy\"\n\nexport class ExecutionStrategyFactory {\n\tstatic create(mode: string): WorkflowExecutionStrategy {\n\t\tlet strategy: WorkflowExecutionStrategy\n\t\tif (mode == \"parallel\") {\n\t\t\tstrategy = new ParallelExecution()\n\t\t} else {\n\t\t\tstrategy = new SequentalExecution()\n\t\t}\n\n\t\treturn strategy\n\t}\n}\n","import { Task } from \"../task\"\nimport { Workflow } from \"../workflow\"\nimport { ExecutionHook } from \"./execution-hook\"\n\nexport class ClusterHook implements ExecutionHook {\n\tconstructor(private hooks: ExecutionHook[]) {}\n\n\tbeforeTask(task: Task): void {\n\t\tthis.hooks.forEach((h) => h.beforeTask(task))\n\t}\n\n\tafterTask(task: Task, result: any): void {\n\t\tthis.hooks.forEach((h) => h.afterTask(task, result))\n\t}\n\n\tbeforeWorkflow(wf: Workflow) {\n\t\tthis.hooks.forEach((h) => h.beforeWorkflow(wf))\n\t}\n\n\tafterWorkflow(wf: Workflow, result: any) {\n\t\tthis.hooks.forEach((h) => h.afterWorkflow(wf, result))\n\t}\n}\n","import { Task } from \"../task\"\nimport { Workflow } from \"../workflow\"\nimport { ExecutionHook } from \"./execution-hook\"\n\nexport class Logger implements ExecutionHook {\n\tbeforeWorkflow(workflow: Workflow) {\n\t\tconsole.log(`[Workflow:start], Mode: ${workflow.mode}`)\n\t}\n\n\tafterWorkflow(workflow: Workflow) {\n\t\tconsole.log(`[Workflow:end], Mode: ${workflow.mode}`)\n\t}\n\n\tbeforeTask(task: Task) {\n\t\tconsole.log(`[Task:end]: Model: ${task.getModel()} Task: ${task.getTask()}`)\n\t}\n\n\tafterTask(task: Task, result: any) {\n\t\tconsole.log(`[Task:end]: Model: ${task.getModel()} Task: ${task.getTask()}`)\n\t}\n}\n","import { ClusterHook } from \"./cluster\"\nimport { ExecutionHook } from \"./execution-hook\"\nimport { Logger } from \"./logger\"\n\nconst loggingHook: ExecutionHook = new Logger()\n\nconst defaultHooks = [loggingHook]\nconst clusterHook: ExecutionHook = new ClusterHook(defaultHooks)\n\nexport const DEFAULT_CLUSTER_HOOK = clusterHook\n","import { WorkUnit } from \"@core/workflow/work-unit\"\nimport { ExecutionStrategyFactory } from \"@core/workflow/execution/strategy-factory\"\nimport { WorkflowExecutionStrategy } from \"@core/workflow/execution/strategy\"\nimport { ExecutionHook } from \"./hooks/execution-hook\"\nimport { DEFAULT_CLUSTER_HOOK } from \"./hooks\"\n\nexport class Workflow extends WorkUnit {\n\tconstructor(\n\t\treadonly mode: \"parallel\" | \"sequential\",\n\t\treadonly units: WorkUnit[],\n\t) {\n\t\tsuper()\n\t}\n\n\tasync execute(hook: ExecutionHook = DEFAULT_CLUSTER_HOOK): Promise<any> {\n\t\thook.beforeWorkflow(this)\n\n\t\tconst executionStrategy: WorkflowExecutionStrategy = ExecutionStrategyFactory.create(this.mode)\n\t\tconst result = await executionStrategy.execute(this, hook)\n\n\t\thook.afterWorkflow(this, result)\n\t\treturn result\n\t}\n}\n","import { Model, MozaikRequest, MozaikAgent } from \"@/index\"\nimport { WorkUnit } from \"@core/workflow/work-unit\"\nimport { ExecutionHook } from \"./hooks/execution-hook\"\nimport { DEFAULT_CLUSTER_HOOK } from \"./hooks\"\n\nexport class Task extends WorkUnit {\n\tconstructor(\n\t\tprivate task: string,\n\t\tprivate model: Model,\n\t) {\n\t\tsuper()\n\t}\n\n\tgetTask() {\n\t\treturn this.task\n\t}\n\n\tgetModel() {\n\t\treturn this.model\n\t}\n\n\tasync execute(hook: ExecutionHook = DEFAULT_CLUSTER_HOOK): Promise<any> {\n\t\thook.beforeTask(this)\n\n\t\tconst request: MozaikRequest = {\n\t\t\tmodel: this.model,\n\t\t\ttask: this.task,\n\t\t}\n\n\t\tconst agent = new MozaikAgent(request)\n\t\tconst result = await agent.act(this.task)\n\n\t\thook.afterTask(this, result)\n\t\treturn result\n\t}\n}\n","import { Plan, PlanNode } from \"@/types/plan\"\nimport { Workflow } from \"./workflow\"\nimport { WorkUnit } from \"./work-unit\"\nimport { Task } from \"./task\"\n\nexport class PlanWorkflowMapper {\n\tstatic fromPlan(plan: Plan): Workflow {\n\t\treturn this.fromNode(plan.root)\n\t}\n\n\tprivate static fromNode(node: PlanNode): Workflow {\n\t\tif (node.kind !== \"workflow\") {\n\t\t\tthrow new Error(\"Root must be workflow\")\n\t\t}\n\n\t\treturn new Workflow(node.mode, node.units.map(this.mapNode))\n\t}\n\n\tprivate static mapNode(node: PlanNode): WorkUnit {\n\t\tif (node.kind === \"task\") {\n\t\t\treturn new Task(node.task, node.model)\n\t\t}\n\n\t\treturn new Workflow(node.mode, node.units.map(this.mapNode))\n\t}\n}\n","import { Plan } from \"@/types/plan\"\nimport { Workflow } from \"@core/workflow/workflow\"\nimport { MozaikAgent } from \"./agent\"\nimport { MozaikRequest } from \"@/types/request\"\nimport { PlanSchema } from \"@core/workflow/schema/plan\"\nimport { PlanWorkflowMapper } from \"@core/workflow/mapper\"\n\nconst PROMPT = `You are a planner.\n\nRules:\n- Use 'parallel' for the task that can be run in parallel.\n- Pick model based on the task complexity\n- Keep prompts actionable.\n- Don't ask user for any input, just do the thing with available data you have.\n`\n\nexport class PlanningAgent extends MozaikAgent {\n\tconstructor(request: MozaikRequest) {\n\t\tsuper(request)\n\t}\n\n\tasync planFromGoal(goal: string): Promise<Workflow> {\n\t\tthis.setStructuredOutput(PlanSchema)\n\t\tconst plan: Plan = await this.act(`${PROMPT}\\nGoal: ${goal}`)\n\t\treturn PlanWorkflowMapper.fromPlan(plan)\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,IAAe,WAAf,MAAwB;AAAA,EAC9B,cAAc;AAAA,EAAC;AAGhB;;;ACFO,IAAM,iBAAN,MAAqB;AAAA,EAG3B,YAAqB,kBAAoC;AAApC;AAAA,EAAqC;AAAA,EAE1D,MAAM,OAAO,SAAsC;AAClD,SAAK,WAAW,KAAK,iBAAiB,QAAQ,QAAQ,KAAK;AAC3D,WAAO,MAAM,KAAK,SAAS,YAAY,OAAO;AAAA,EAC/C;AACD;;;ACXO,IAAe,mBAAf,MAAgC;AAEvC;;;ACJO,IAAM,gBAAgB,CAAC,SAAS,cAAc,cAAc,WAAW,WAAW,SAAS;AAIlG,IAAM,gBAAgB;AACtB,IAAM,eAAe;AACrB,IAAM,cAAc;AAEb,IAAM,mBAAmB,CAAC,qBAAqB,oBAAoB,iBAAiB;AAEpF,IAAM,sBAAsB;AAAA,EAClC,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,mBAAmB;AACpB;;;ACXO,IAAe,oBAAf,MAAiC;AAAA,EAGvC,eAAe,YAAkD;AAChE,SAAK,cAAc;AACnB,WAAO,KAAK;AAAA,EACb;AAAA,EAIA,OAAO,SAAwB,SAAyB;AACvD,SAAK,MAAM,SAAS,OAAO;AAE3B,QAAI,KAAK,aAAa;AACrB,WAAK,YAAY,OAAO,SAAS,OAAO;AAAA,IACzC;AAAA,EACD;AACD;;;AChBO,IAAM,kBAAN,cAA8B,kBAAkB;AAAA,EAGtD,MAAM,SAAwB,SAAyB;AACtD,QAAI,QAAQ,UAAU;AACrB,cAAQ,YAAY,QAAQ,QAAQ;AAAA,IACrC;AAAA,EACD;AACD;;;ACRO,IAAM,cAAN,cAA0B,kBAAkB;AAAA,EAGlD,MAAM,SAAwB,SAAyB;AACtD,QAAI,QAAQ,MAAM;AACjB,cAAQ,QAAQ,QAAQ,IAAI;AAAA,IAC7B;AAAA,EACD;AACD;;;ACRO,IAAM,eAAN,cAA2B,kBAAkB;AAAA,EAGnD,MAAM,SAAwB,SAAyB;AACtD,QAAI,QAAQ,OAAO;AAClB,cAAQ,SAAS,QAAQ,KAAK;AAAA,IAC/B;AAAA,EACD;AACD;;;ACRO,IAAM,2BAAN,cAAuC,kBAAkB;AAAA,EAG/D,MAAM,SAAwB,SAAyB;AACtD,QAAI,QAAQ,kBAAkB;AAC7B,cAAQ,oBAAoB,QAAQ,gBAAgB;AAAA,IACrD;AAAA,EACD;AACD;;;ACRO,IAAM,eAAN,cAA2B,kBAAkB;AAAA,EAGnD,MAAM,eAA8B,gBAAgC;AACnE,QAAI,cAAc,SAAS,cAAc,MAAM,SAAS,GAAG;AAC1D,qBAAe,SAAS,cAAc,KAAK;AAAA,IAC5C;AAAA,EACD;AACD;;;ACHO,IAAe,WAAf,MAAwB;AAAA,EAAxB;AAEN,mBAAgC;AAAA;AAAA,EAEhC,aAAa,SAA6B;AACzC,SAAK,UAAU;AAEf,SAAK,eAAe,WAAW;AAE/B,UAAM,kBAAqC,IAAI,gBAAgB;AAC/D,UAAM,cAAiC,IAAI,YAAY;AACvD,UAAM,eAAkC,IAAI,aAAa;AACzD,UAAM,0BAA6C,IAAI,yBAAyB;AAChF,UAAM,eAAkC,IAAI,aAAa;AAEzD,oBACE,eAAe,WAAW,EAC1B,eAAe,YAAY,EAC3B,eAAe,uBAAuB,EACtC,eAAe,YAAY;AAE7B,oBAAgB,OAAO,SAAS,KAAK,cAAc;AAEnD,WAAO,KAAK,eAAe,MAAM;AAAA,EAClC;AAGD;;;AC/BO,IAAe,iBAAf,MAA8B;AAAA,EAGpC,aAAa;AACZ,SAAK,UAAU,CAAC;AAAA,EACjB;AAAA,EASA,QAAQ;AACP,WAAO,KAAK;AAAA,EACb;AACD;;;ACXO,IAAM,wBAAN,MAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlC,eAAe,UAA6B;AAC3C,QAAI,SAAS,WAAW,GAAG;AAC1B,YAAM,IAAI,MAAM,kEAAkE;AAAA,IACnF;AAGA,UAAM,gBAAgB,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ;AAE9D,QAAI,eAAe;AAClB,aAAO,OAAO,cAAc,YAAY,WACrC,cAAc,UACd,KAAK,uBAAuB,cAAc,OAAO;AAAA,IACrD;AAGA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB,UAA6B;AAC7C,UAAM,eAAe,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAE7D,QAAI,aAAa,WAAW,GAAG;AAC9B,aAAO;AAAA,IACR;AAEA,UAAM,kBAAkB,aAAa,aAAa,SAAS,CAAC;AAC5D,WAAO,OAAO,gBAAgB,YAAY,WACvC,gBAAgB,UAChB,KAAK,uBAAuB,gBAAgB,OAAO;AAAA,EACvD;AAAA,EAEQ,uBAAuB,SAAwB;AACtD,WAAO,QACL,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,EACrC,IAAI,CAAC,SAAS,KAAK,IAAI,EACvB,KAAK,GAAG;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,OAAiC;AACxC,WAAO,MAAM,IAAI,CAAC,OAAO;AAAA,MACxB,MAAM;AAAA,MACN,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,MACf,YAAY,EAAE;AAAA,MACd,QAAQ;AAAA;AAAA,IACT,EAAE;AAAA,EACH;AACD;;;ACvEA,iBAA8B;AAKvB,IAAM,yBAAN,cAAqC,eAAe;AAAA,EAE1D,YAAoB,SAAS,IAAI,sBAAsB,GAAG;AACzD,UAAM;AADa;AAAA,EAEpB;AAAA,EAEA,SAAS,OAA+B;AACvC,SAAK,QAAQ,QAAQ;AACrB,WAAO;AAAA,EACR;AAAA,EAEA,QAAQ,MAA8B;AACrC,SAAK,QAAQ,QAAQ;AACrB,WAAO;AAAA,EACR;AAAA,EAEA,YAAY,UAAqC;AAChD,UAAM,eAAe,KAAK,OAAO,eAAe,QAAQ;AAExD,QAAI,gBAAgB,iBAAiB,gCAAgC;AACpE,WAAK,QAAQ,eAAe;AAAA,IAC7B;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,oBAAoB,QAAmC;AACtD,SAAK,QAAQ,OAAO;AAAA,MACnB,YAAQ,0BAAc,QAAQ,cAAc;AAAA,IAC7C;AACA,WAAO;AAAA,EACR;AAAA,EAEA,SAAS,OAA+B;AACvC,SAAK,QAAQ,QAAQ,MAAM,IAAI,CAAC,UAAU;AAAA,MACzC,MAAM;AAAA,MACN,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK;AAAA,IAClB,EAAE;AACF,WAAO;AAAA,EACR;AAAA,EAEA,mBAAmB,QAAyC;AAC3D,QAAI,kBAAkB;AACtB,QAAI,8BAAiC;AACpC,wBAAkB;AAAA,IACnB,WAAW,4BAAgC;AAC1C,wBAAkB;AAAA,IACnB,WAAW,kCAAmC;AAC7C,wBAAkB;AAAA,IACnB,WAAW,8BAAiC;AAC3C,wBAAkB;AAAA,IACnB,WAAW,4BAAgC;AAC1C,wBAAkB;AAAA,IACnB;AAEA,SAAK,QAAQ,YAAY;AAAA,MACxB,QAAQ;AAAA,IACT;AAEA,WAAO;AAAA,EACR;AACD;;;ACvEA,oBAAmB;AAGZ,IAAM,sBAAN,MAAmD;AAAA,EACzD,YAAoB,SAAS,IAAI,cAAAA,QAAO,GAAG;AAAvB;AAAA,EAAwB;AAAA,EAE5C,MAAM,KAAK,SAA4B;AACtC,WAAO,MAAM,KAAK,OAAO,UAAU,OAAO,OAAO;AAAA,EAClD;AACD;;;ACTA,IAAAC,iBAAmB;AAGZ,IAAM,qBAAN,MAAkD;AAAA,EACxD,YAAoB,SAAS,IAAI,eAAAC,QAAO,GAAG;AAAvB;AAAA,EAAwB;AAAA,EAE5C,MAAM,KAAK,SAA4B;AACtC,WAAO,MAAM,KAAK,OAAO,UAAU,MAAM,OAAO;AAAA,EACjD;AACD;;;ACLO,IAAM,uBAAN,MAA2B;AAAA,EACjC,OAAO,QAAQ,SAA6B;AAC3C,QAAI,QAAQ,QAAQ,QAAQ,KAAK,QAAQ;AACxC,aAAO,IAAI,mBAAmB;AAAA,IAC/B,OAAO;AACN,aAAO,IAAI,oBAAoB;AAAA,IAChC;AAAA,EACD;AACD;;;ACVO,IAAe,kBAAf,MAA+B;AAAA,EAGrC,eAAe,iBAAmD;AACjE,SAAK,cAAc;AACnB,WAAO,KAAK;AAAA,EACb;AAGD;;;ACRO,IAAM,sBAAN,cAAkC,gBAAgB;AAAA,EAGxD,MAAM,OAAO,gBAAyD;AACrE,UAAM,mBAAmB,eAAe;AACxC,QAAI,iBAAiB,eAAe;AACnC,qBAAe,gBAAgB,iBAAiB,aAAa;AAC7D,aAAO;AAAA,IACR;AAEA,WAAO,MAAM,KAAK,YAAY,OAAO,cAAc;AAAA,EACpD;AACD;;;ACZO,IAAM,iBAAN,cAA6B,gBAAgB;AAAA,EAGnD,MAAM,OAAO,gBAAyD;AANvE;AAOE,UAAM,mBAAmB,eAAe;AACxC,UAAM,eAAc,sBAAiB,WAAjB,mBAA0B;AAC9C,QAAI,eAAe,aAAa,aAAa;AAC5C,YAAM,gBAAe,iBAAY,YAAZ,mBAAsB;AAC3C,UAAI,gBAAgB,UAAU,cAAc;AAC3C,uBAAe,gBAAgB,aAAa,IAAI;AAChD,eAAO;AAAA,MACR;AAAA,IACD;AAEA,WAAO,MAAM,KAAK,YAAY,OAAO,cAAc;AAAA,EACpD;AACD;;;AChBO,IAAM,oBAAN,cAAgC,gBAAgB;AAAA,EAGtD,MAAM,OAAO,gBAAyD;AACrE,UAAM,mBAAmB,eAAe;AACxC,QAAI,iBAAiB,aAAa;AACjC,qBAAe,gBAAgB,iBAAiB,WAAW;AAC3D,aAAO;AAAA,IACR;AAEA,WAAO,MAAM,KAAK,YAAY,OAAO,cAAc;AAAA,EACpD;AACD;;;ACfO,IAAM,aAAN,MAAiB;AAAA,EAIvB,YAAY,YAAoB,OAAe;AAC9C,SAAK,aAAa;AAClB,SAAK,QAAQ;AAAA,EACd;AACD;;;ACRO,IAAM,qBAAN,MAAyB;AAAA,EAK/B,mBAAmB,aAAqB,cAAsB,mBAAmC;AAChG,UAAM,aAAc,cAAc,qBAAqB,KAAK,uBAAwB;AACpF,UAAM,aAAc,eAAe,KAAK,wBAAyB;AACjE,UAAM,aAAc,oBAAoB,KAAK,wBAAyB;AACtE,WAAO,YAAY,aAAa;AAAA,EACjC;AAAA,EAEA,cAAc,WAAmB,aAAqB,cAAsB,mBAAmC;AAC9G,QAAI,UAAU,WAAW,YAAY,GAAG;AACvC,WAAK,uBAAuB;AAC5B,WAAK,wBAAwB;AAC7B,WAAK,wBAAwB;AAC7B,aAAO,KAAK,mBAAmB,aAAa,cAAc,iBAAiB;AAAA,IAC5E,WAAW,UAAU,WAAW,YAAY,GAAG;AAC9C,WAAK,uBAAuB;AAC5B,WAAK,wBAAwB;AAC7B,WAAK,wBAAwB;AAC7B,aAAO,KAAK,mBAAmB,aAAa,cAAc,iBAAiB;AAAA,IAC5E,WAAW,UAAU,WAAW,SAAS,GAAG;AAC3C,WAAK,uBAAuB;AAC5B,WAAK,wBAAwB;AAC7B,WAAK,wBAAwB;AAC7B,aAAO,KAAK,mBAAmB,aAAa,cAAc,iBAAiB;AAAA,IAC5E,WAAW,UAAU,WAAW,OAAO,GAAG;AACzC,WAAK,uBAAuB;AAC5B,WAAK,wBAAwB;AAC7B,WAAK,wBAAwB;AAC7B,aAAO,KAAK,mBAAmB,aAAa,cAAc,iBAAiB;AAAA,IAC5E;AAEA,UAAM,IAAI,MAAM,cAAc,SAAS,oCAAoC;AAAA,EAC5E;AACD;;;AClBO,IAAM,uBAAN,cAAmC,gBAAgB;AAAA,EAMzD,YAAY,SAAc,OAAe;AACxC,UAAM;AACN,SAAK,UAAU;AACf,SAAK,QAAQ;AACb,SAAK,SAAS,IAAI,oBAAoB;AAAA,EACvC;AAAA,EAEQ,aAAa,UAAwB;AAhC9C;AAiCE,YAAO,cAAS,WAAT,mBAAiB,KAAK,CAAC,SAAc,KAAK,SAAS;AAAA,EAC3D;AAAA,EAEQ,iBAAiB,UAAsB;AApChD;AAqCE,aAAO,cAAS,WAAT,mBAAiB,OAAO,CAAC,SAAc,KAAK,SAAS,qBAAoB,CAAC;AAAA,EAClF;AAAA,EAEQ,YAAY,MAAgB,OAA4B;AAxCjE;AAyCE,YAAO,WAAM,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,MAAtC,YAA2C;AAAA,EACnD;AAAA,EAEA,MAAc,YAAY,MAAY,SAA8C;AACnF,UAAM,OAAO,OAAO,YAAY,WAAW,KAAK,MAAM,OAAO,IAAI;AAEjE,WAAO,MAAM,KAAK,OAAO,IAAI;AAAA,EAC9B;AAAA,EAEQ,iBAAiB,QAAgB,SAA0B;AAClE,WAAO;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ,KAAK,UAAU,OAAO;AAAA,IAC/B;AAAA,EACD;AAAA,EAEA,MAAc,iBAAiB,WAAuB,OAAsC;AA1D7F;AA2DE,UAAM,UAAwB,CAAC;AAE/B,eAAW,QAAQ,WAAW;AAC7B,YAAM,OAAO,KAAK,YAAY,MAAM,KAAK;AAEzC,UAAI,CAAC,MAAM;AACV,gBAAQ;AAAA,UACP,KAAK,iBAAiB,KAAK,SAAS;AAAA,YACnC,OAAO,iBAAiB,KAAK,IAAI;AAAA,UAClC,CAAC;AAAA,QACF;AACA;AAAA,MACD;AAEA,UAAI;AACH,cAAM,SAAS,MAAM,KAAK,YAAY,MAAM,KAAK,SAAS;AAC1D,gBAAQ,KAAK,KAAK,iBAAiB,KAAK,SAAS,MAAM,CAAC;AAAA,MACzD,SAAS,KAAU;AAClB,gBAAQ;AAAA,UACP,KAAK,iBAAiB,KAAK,SAAS;AAAA,YACnC,QAAO,SAAI,YAAJ,YAAe;AAAA,UACvB,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,OAAO,gBAAyD;AAxFvE;AAyFE,QAAI,mBAAmB,eAAe;AACtC,QAAI;AACJ,WAAO,KAAK,aAAa,gBAAgB,GAAG;AAC3C,YAAM,YAAY,KAAK,iBAAiB,gBAAgB;AAExD,YAAM,cAAc,MAAM,KAAK,iBAAiB,WAAW,KAAK,KAAK;AAGrE,WAAK,QAAQ,QAAQ;AACrB,WAAK,QAAQ,uBAAuB,iBAAiB;AAErD,4BAAsB,MAAM,KAAK,OAAO,KAAK,KAAK,OAAO;AAEzD,YAAM,qBAAqB,IAAI,mBAAmB;AAClD,YAAM,QAAQ,oBAAoB;AAClC,YAAM,YAAY,mBAAmB;AAAA,QACpC,iBAAiB;AAAA,QACjB,MAAM;AAAA,QACN,MAAM;AAAA,SACN,iBAAM,wBAAN,mBAA2B,kBAA3B,YAA4C;AAAA,MAC7C;AAEA,qBAAe,cAAc,IAAI,WAAW,WAAW,iBAAiB,KAAK,CAAC;AAC9E,qBAAe,oBAAoB,mBAAmB;AACtD,qBAAe,gBAAgB,mBAAmB;AAClD,yBAAmB;AAAA,IACpB;AAEA,WAAO,MAAM,KAAK,YAAY,OAAO,cAAc;AAAA,EACpD;AACD;;;ACrHO,IAAM,iBAAN,MAAqB;AAAA,EAArB;AAGN,wBAA6B,CAAC;AAAA;AAAA,EAE9B,oBAAoB,kBAAuC;AAC1D,SAAK,mBAAmB;AACxB,WAAO;AAAA,EACR;AAAA,EAEA,cAAc,YAAwC;AACrD,SAAK,aAAa,KAAK,UAAU;AACjC,WAAO;AAAA,EACR;AAAA,EAEA,gBAAgB,UAA+B;AAC9C,SAAK,eAAe;AACpB,WAAO;AAAA,EACR;AAAA,EAEA,cAAmB;AAClB,WAAO;AAAA,MACN,MAAM,KAAK;AAAA,MACX,OAAO;AAAA,QACN,SAAS,KAAK;AAAA,MACf;AAAA,MACA,WAAW,KAAK,aAAa,OAAO,CAAC,KAAK,UAAU,MAAM,MAAM,YAAY,CAAC;AAAA,IAC9E;AAAA,EACD;AAAA,EAEA,kBAAgC;AAC/B,WAAO,KAAK;AAAA,EACb;AACD;;;AC9BO,IAAM,eAAN,cAA2B,gBAAgB;AAAA,EAGjD,MAAM,OAAO,gBAAyD;AARvE;AASE,UAAM,mBAAmB,eAAe;AACxC,UAAM,QAAQ,iBAAiB;AAE/B,UAAM,qBAAqB,IAAI,mBAAmB;AAClD,UAAM,YAAY,mBAAmB;AAAA,MACpC,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,MAAM;AAAA,OACN,iBAAM,wBAAN,mBAA2B,kBAA3B,YAA4C;AAAA,IAC7C;AAEA,mBAAe,cAAc,IAAI,WAAW,WAAW,iBAAiB,KAAK,CAAC;AAE9E,WAAO,MAAM,KAAK,YAAY,OAAO,cAAc;AAAA,EACpD;AACD;;;ACXO,IAAM,kBAAN,cAA8B,SAAS;AAAA,EAG7C,cAAc;AACb,UAAM;AAHP,0BAAiC,IAAI,uBAAuB;AAAA,EAI5D;AAAA,EAEA,MAAM,YAAY,eAA4C;AAC7D,QAAI;AACH,YAAM,UAAU,KAAK,aAAa,aAAa;AAC/C,YAAM,SAAS,qBAAqB,QAAQ,OAAO;AACnD,YAAM,WAAW,MAAM,OAAO,KAAK,OAAO;AAE1C,YAAM,iBAAiB,IAAI,eAAe;AAC1C,qBAAe,oBAAoB,QAAQ;AAG3C,YAAM,eAAgC,IAAI,aAAa;AACvD,YAAM,uBAAwC,IAAI;AAAA,QACjD;AAAA,QACA,cAAc,QAAQ,cAAc,QAAQ,CAAC;AAAA,MAC9C;AACA,YAAM,sBAAuC,IAAI,oBAAoB;AACrE,YAAM,oBAAqC,IAAI,kBAAkB;AACjE,YAAM,iBAAkC,IAAI,eAAe;AAE3D,mBACE,eAAe,oBAAoB,EACnC,eAAe,mBAAmB,EAClC,eAAe,iBAAiB,EAChC,eAAe,cAAc;AAE/B,YAAM,kBAAkB;AAExB,YAAM,SAAyB,MAAM,gBAAgB,OAAO,cAAc;AAE1E,aAAO,OAAO,YAAY;AAAA,IAC3B,SAAS,OAAO;AACf,cAAQ,KAAK,kDAAkD,KAAK;AACpE,YAAM;AAAA,IACP;AAAA,EACD;AACD;;;ACpDO,IAAM,kBAAN,MAAsB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK5B,WAAW,UAAoE;AAC9E,UAAM,oBAAoC,CAAC;AAC3C,QAAI;AAEJ,eAAW,OAAO,UAAU;AAE3B,UAAI,IAAI,SAAS,UAAU;AAC1B,cAAM,UACL,OAAO,IAAI,YAAY,WACpB,IAAI,UACH,IAAI,QAAuB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI;AAE5D,uBAAe,eAAe,GAAG,YAAY;AAAA;AAAA,EAAO,OAAO,KAAK;AAChE;AAAA,MACD;AAGA,UAAI,IAAI,SAAS,QAAQ;AACxB;AAAA,MACD;AAGA,UAAI,IAAI,SAAS,UAAU,IAAI,SAAS,aAAa;AACpD,YAAI,OAAO,IAAI,YAAY,UAAU;AACpC,4BAAkB,KAAK;AAAA,YACtB,MAAM,IAAI;AAAA,YACV,SAAS,IAAI;AAAA,UACd,CAAC;AAAA,QACF,OAAO;AAEN,gBAAM,gBAAiB,IAAI,QAAwC,IAAI,CAAC,SAAS;AAChF,gBAAI,KAAK,SAAS,QAAQ;AACzB,qBAAO;AAAA,gBACN,MAAM;AAAA,gBACN,MAAM,KAAK;AAAA,cACZ;AAAA,YACD,WAAW,KAAK,SAAS,aAAa;AAGrC,oBAAM,WAAW,KAAK;AAGtB,kBAAI,SAAS,WAAW,YAAY,GAAG;AACtC,sBAAM,UAAU,SAAS,MAAM,+BAA+B;AAC9D,oBAAI,SAAS;AACZ,wBAAM,CAAC,EAAE,WAAW,IAAI,IAAI;AAC5B,yBAAO;AAAA,oBACN,MAAM;AAAA,oBACN,QAAQ;AAAA,sBACP,MAAM;AAAA,sBACN,YAAY,SAAS,SAAS;AAAA,sBAK9B;AAAA,oBACD;AAAA,kBACD;AAAA,gBACD;AAAA,cACD;AAGA,oBAAM,IAAI;AAAA,gBACT;AAAA,cAED;AAAA,YACD;AAEA,mBAAO,EAAE,MAAM,QAAiB,MAAM,GAAG;AAAA,UAC1C,CAAC;AAED,4BAAkB,KAAK;AAAA,YACtB,MAAM,IAAI;AAAA,YACV,SAAS;AAAA,UACV,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD;AAIA,UAAM,YAAY,KAAK,uBAAuB,iBAAiB;AAE/D,WAAO;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,IACT;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,uBAAuB,UAA0C;AACxE,QAAI,SAAS,WAAW,EAAG,QAAO;AAElC,UAAM,SAAyB,CAAC;AAChC,QAAI;AAEJ,eAAW,OAAO,UAAU;AAE3B,UAAI,aAAa,IAAI,QAAQ,OAAO,SAAS,GAAG;AAC/C,cAAM,UAAU,OAAO,OAAO,SAAS,CAAC;AAGxC,YAAI,OAAO,QAAQ,YAAY,YAAY,OAAO,IAAI,YAAY,UAAU;AAC3E,kBAAQ,UAAU,GAAG,QAAQ,OAAO;AAAA,EAAK,IAAI,OAAO;AAAA,QACrD,OAAO;AAEN,gBAAM,cAAc,MAAM,QAAQ,QAAQ,OAAO,IAC9C,QAAQ,UACR,CAAC,EAAE,MAAM,QAAiB,MAAM,QAAQ,QAAkB,CAAC;AAC9D,gBAAM,aAAa,MAAM,QAAQ,IAAI,OAAO,IACzC,IAAI,UACJ,CAAC,EAAE,MAAM,QAAiB,MAAM,IAAI,QAAkB,CAAC;AAC1D,kBAAQ,UAAU,CAAC,GAAG,aAAa,GAAG,UAAU;AAAA,QACjD;AAAA,MACD,OAAO;AACN,eAAO,KAAK,GAAG;AACf,mBAAW,IAAI;AAAA,MAChB;AAAA,IACD;AAGA,QAAI,OAAO,SAAS,KAAK,OAAO,CAAC,EAAE,SAAS,QAAQ;AACnD,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AACD;;;ACzIA,IAAAC,cAAoC;AAM7B,IAAM,0BAAN,cAAsC,eAAe;AAAA,EAArD;AAAA;AACN,SAAQ,SAAS,IAAI,gBAAgB;AAAA;AAAA,EAErC,SAAS,OAAuC;AAC/C,SAAK,QAAQ,QAAQ,oBAAoB,KAAK;AAC9C,WAAO;AAAA,EACR;AAAA,EAEA,QAAQ,MAA8B;AAErC,UAAM,UAAU;AAAA,MACf,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAEA,QAAI,CAAC,KAAK,QAAQ,UAAU;AAC3B,WAAK,QAAQ,WAAW,CAAC;AAAA,IAC1B;AAEA,SAAK,QAAQ,SAAS,KAAK,OAAO;AAClC,WAAO;AAAA,EACR;AAAA,EAEA,YAAY,UAAqC;AAChD,UAAM,EAAE,UAAU,mBAAmB,OAAO,IAAI,KAAK,OAAO,WAAW,QAAQ;AAE/E,SAAK,QAAQ,WAAW;AAExB,QAAI,QAAQ;AACX,WAAK,QAAQ,SAAS;AAAA,IACvB;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,oBAAoB,QAAmC;AACtD,SAAK,QAAQ,QAAQ,CAAC,+BAA+B;AACrD,SAAK,QAAQ,oBAAgB,iCAAoB,MAAM;AACvD,WAAO;AAAA,EACR;AAAA,EAEA,SAAS,OAA+B;AACvC,SAAK,QAAQ,QAAQ,MAAM,IAAI,CAAC,UAAU;AAAA,MACzC,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,IACpB,EAAE;AACF,WAAO;AAAA,EACR;AAAA,EAEA,mBAAmB,QAAyC;AAE3D,QAAI,kBAAkB;AACtB,QAAI,8BAAiC;AACpC,aAAO;AAAA,IACR,WAAW,4BAAgC;AAC1C,wBAAkB;AAAA,IACnB,WAAW,kCAAmC;AAC7C,wBAAkB;AAAA,IACnB,WAAW,8BAAiC;AAC3C,wBAAkB;AAAA,IACnB,WAAW,4BAAgC;AAC1C,wBAAkB;AAAA,IACnB;AAEA,SAAK,QAAQ,gBAAgB;AAAA,MAC5B,QAAQ;AAAA,IACT;AACA,WAAO;AAAA,EACR;AAAA,EAEA,QAAQ;AAEP,QAAI,CAAC,KAAK,QAAQ,YAAY;AAC7B,WAAK,QAAQ,aAAa;AAAA,IAC3B;AAEA,WAAO,KAAK;AAAA,EACb;AACD;;;ACvFA,iBAAsB;AAEf,IAAM,yBAAN,MAAsD;AAAA,EAC5D,YAAoB,SAAS,IAAI,WAAAC,QAAU,GAAG;AAA1B;AAAA,EAA2B;AAAA,EAE/C,MAAM,KAAK,SAA4B;AACtC,WAAO,MAAM,KAAK,OAAO,SAAS,OAAO,OAAO;AAAA,EACjD;AACD;;;ACRA,IAAAC,cAAsB;AAEf,IAAM,wBAAN,MAAqD;AAAA,EAC3D,YAAoB,SAAS,IAAI,YAAAC,QAAU,GAAG;AAA1B;AAAA,EAA2B;AAAA,EAE/C,MAAM,KAAK,SAA4B;AACtC,WAAO,MAAM,KAAK,OAAO,KAAK,SAAS,MAAM,OAAO;AAAA,EACrD;AACD;;;ACLO,IAAM,0BAAN,MAA8B;AAAA,EACpC,OAAO,QAAQ,SAA6B;AAC3C,WAAO,QAAQ,gBAAgB,IAAI,sBAAsB,IAAI,IAAI,uBAAuB;AAAA,EACzF;AACD;;;ACLO,IAAM,sBAAN,cAAkC,gBAAgB;AAAA,EAGxD,MAAM,OAAO,gBAAyD;AACrE,UAAM,mBAAmB,eAAe;AACxC,QAAI,iBAAiB,eAAe;AACnC,qBAAe,gBAAgB,iBAAiB,aAAa;AAC7D,aAAO;AAAA,IACR;AAEA,WAAO,MAAM,KAAK,YAAY,OAAO,cAAc;AAAA,EACpD;AACD;;;ACZO,IAAMC,kBAAN,cAA6B,gBAAgB;AAAA,EAGnD,MAAM,OAAO,gBAAyD;AACrE,UAAM,mBAAmB,eAAe;AACxC,UAAM,UAAU,iBAAiB,QAC/B,OAAO,CAAC,UAAe,MAAM,SAAS,MAAM,EAC5C,IAAI,CAAC,UAAgB,MAAM,SAAS,SAAS,MAAM,OAAO,EAAG,EAC7D,KAAK,EAAE;AAET,QAAI,SAAS;AACZ,qBAAe,gBAAgB,OAAO;AACtC,aAAO;AAAA,IACR;AAEA,WAAO,MAAM,KAAK,YAAY,OAAO,cAAc;AAAA,EACpD;AACD;;;ACpBO,IAAM,wBAAN,MAA4B;AAAA,EAIlC,mBAAmB,aAAqB,cAA8B;AACrE,UAAM,YAAa,cAAc,KAAK,uBAAwB;AAC9D,UAAM,aAAc,eAAe,KAAK,wBAAyB;AACjE,WAAO,YAAY;AAAA,EACpB;AAAA,EAEA,cAAc,WAAmB,aAAqB,cAA8B;AACnF,QAAI,UAAU,WAAW,mBAAmB,GAAG;AAC9C,WAAK,uBAAuB;AAC5B,WAAK,wBAAwB;AAC7B,aAAO,KAAK,mBAAmB,aAAa,YAAY;AAAA,IACzD,WAAW,UAAU,WAAW,kBAAkB,GAAG;AACpD,WAAK,uBAAuB;AAC5B,WAAK,wBAAwB;AAC7B,aAAO,KAAK,mBAAmB,aAAa,YAAY;AAAA,IACzD,WAAW,UAAU,WAAW,iBAAiB,GAAG;AACnD,WAAK,uBAAuB;AAC5B,WAAK,wBAAwB;AAC7B,aAAO,KAAK,mBAAmB,aAAa,YAAY;AAAA,IACzD;AAEA,UAAM,IAAI,MAAM,cAAc,SAAS,oCAAoC;AAAA,EAC5E;AACD;;;ACnBO,IAAM,iBAAN,cAA6B,gBAAgB;AAAA,EAMnD,YAAY,SAAc,OAAe;AACxC,UAAM;AACN,SAAK,QAAQ;AACb,SAAK,UAAU;AACf,SAAK,SAAS,IAAI,uBAAuB;AAAA,EAC1C;AAAA,EAEA,MAAc,iBAAiB,OAAe,eAAyD;AACtG,UAAM,UAAiB,CAAC;AAExB,eAAW,WAAW,eAAe;AACpC,YAAM,OAAO,+BAAO,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ;AAEnD,UAAI,CAAC,MAAM;AACV,gBAAQ,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,aAAa,QAAQ;AAAA,UACrB,SAAS,KAAK,UAAU,EAAE,OAAO,iBAAiB,QAAQ,IAAI,GAAG,CAAC;AAAA,QACnE,CAAC;AACD;AAAA,MACD;AAEA,UAAI;AACH,cAAM,SAAS,MAAM,KAAK,OAAO,QAAQ,KAAK;AAC9C,gBAAQ,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,aAAa,QAAQ;AAAA,UACrB,SAAS,KAAK,UAAU,MAAM;AAAA,QAC/B,CAAC;AAAA,MACF,SAAS,OAAY;AACpB,gBAAQ,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,aAAa,QAAQ;AAAA,UACrB,SAAS,KAAK,UAAU,EAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,QACjD,CAAC;AAAA,MACF;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,OAAO,gBAAyD;AACrE,QAAI,mBAAmB,eAAe;AAEtC,WAAO,iBAAiB,gBAAgB,YAAY;AACnD,YAAM,gBAAgB,iBAAiB,QAAQ;AAAA,QAC9C,CAAC,UAAgD,MAAM,SAAS;AAAA,MACjE;AAGA,WAAK,QAAQ,SAAS,KAAK;AAAA,QAC1B,MAAM;AAAA,QACN,SAAS,iBAAiB;AAAA,MAC3B,CAAC;AAED,YAAM,cAAc,MAAM,KAAK,iBAAiB,KAAK,OAAO,aAAa;AAGzE,WAAK,QAAQ,SAAS,KAAK;AAAA,QAC1B,MAAM;AAAA,QACN,SAAS;AAAA,MACV,CAAC;AAGD,YAAM,sBAAsB,MAAM,KAAK,OAAO,KAAK,KAAK,OAAO;AAE/D,YAAM,QAAQ,oBAAoB;AAClC,YAAM,wBAAwB,IAAI,sBAAsB;AACxD,YAAM,YAAY,sBAAsB;AAAA,QACvC,iBAAiB;AAAA,QACjB,MAAM;AAAA,QACN,MAAM;AAAA,MACP;AAEA,qBAAe,cAAc,IAAI,WAAW,WAAW,oBAAoB,MAAM,IAAI,CAAC;AACtF,qBAAe,oBAAoB,mBAAmB;AACtD,yBAAmB;AAAA,IACpB;AAEA,WAAO,MAAM,KAAK,YAAY,OAAO,cAAc;AAAA,EACpD;AACD;;;AC1FO,IAAMC,gBAAN,cAA2B,gBAAgB;AAAA,EAGjD,MAAM,OAAO,gBAAyD;AACrE,UAAM,mBAAmB,eAAe;AACxC,UAAM,QAAQ,iBAAiB;AAE/B,UAAM,wBAAwB,IAAI,sBAAsB;AACxD,UAAM,YAAY,sBAAsB;AAAA,MACvC,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,MAAM;AAAA,IACP;AACA,QAAI,OAAO;AACV,qBAAe,cAAc,IAAI,WAAW,WAAW,iBAAiB,KAAK,CAAC;AAAA,IAC/E;AACA,WAAO,MAAM,KAAK,YAAY,OAAO,cAAc;AAAA,EACpD;AACD;;;ACpBO,IAAM,2BAAN,cAAuC,gBAAgB;AAAA,EAG7D,MAAM,OAAO,gBAAyD;AANvE;AAOE,UAAM,mBAAmB,eAAe;AACxC,UAAM,MAAK,0DAAkB,OAAlB,YAAwB;AACnC,UAAM,SAAQ,0DAAkB,UAAlB,YAA2B;AAEzC,UAAM,IAAI,MAAM,4CAA4C,EAAE,UAAU,KAAK,EAAE;AAAA,EAChF;AACD;;;ACAO,IAAM,oBAAN,cAAgC,SAAS;AAAA,EAAzC;AAAA;AACN,0BAAiC,IAAI,wBAAwB;AAAA;AAAA,EAE7D,MAAM,YAAY,eAA4C;AAC7D,UAAM,kBAAkB,KAAK,aAAa,aAAa;AACvD,UAAM,SAAS,wBAAwB,QAAQ,eAAe;AAC9D,UAAM,WAAW,MAAM,OAAO,KAAK,eAAe;AAElD,UAAM,iBAAiB,IAAI,eAAe;AAC1C,mBAAe,oBAAoB,QAAQ;AAG3C,UAAM,eAAgC,IAAIC,cAAa;AACvD,UAAM,iBAAkC,IAAI;AAAA,MAC3C;AAAA,MACA,cAAc,QAAQ,cAAc,QAAQ,CAAC;AAAA,IAC9C;AACA,UAAM,sBAAuC,IAAI,oBAAoB;AACrE,UAAM,iBAAkC,IAAIC,gBAAe;AAC3D,UAAM,2BAA4C,IAAI,yBAAyB;AAE/E,iBACE,eAAe,cAAc,EAC7B,eAAe,mBAAmB,EAClC,eAAe,cAAc,EAC7B,eAAe,wBAAwB;AAEzC,UAAM,kBAAkB;AAExB,UAAM,SAAS,MAAM,gBAAgB,OAAO,cAAc;AAE1D,WAAO,OAAO,YAAY;AAAA,EAC3B;AACD;;;ACxCO,IAAM,0BAAN,cAAsC,iBAAiB;AAAA,EAC7D,cAAc,OAAwB;AACrC,WAAQ,cAAoC,SAAS,KAAK;AAAA,EAC3D;AAAA,EAEA,iBAAiB,OAAwB;AACxC,WAAQ,iBAAuC,SAAS,KAAK;AAAA,EAC9D;AAAA,EAEA,QAAQ,OAAyB;AAChC,QAAI,KAAK,cAAc,KAAK,GAAG;AAC9B,aAAO,IAAI,gBAAgB;AAAA,IAC5B,WAAW,KAAK,iBAAiB,KAAK,GAAG;AACxC,aAAO,IAAI,kBAAkB;AAAA,IAC9B;AAEA,UAAM,IAAI,MAAM,oBAAoB;AAAA,EACrC;AACD;;;ACjBO,IAAM,cAAN,MAAkB;AAAA,EAIxB,YAAY,SAAwB;AAFpC,mBAA0B,IAAI,eAAe,IAAI,wBAAwB,CAAC;AAGzE,SAAK,UAAU;AAAA,EAChB;AAAA,EAEA,SAAS,OAAc;AACtB,SAAK,QAAQ,QAAQ;AAAA,EACtB;AAAA,EAEA,YAAY,UAAqB;AAChC,SAAK,QAAQ,WAAW;AAAA,EACzB;AAAA,EAEA,QAAQ,MAAc;AACrB,SAAK,QAAQ,OAAO;AAAA,EACrB;AAAA,EAEA,oBAAoB,QAAwB;AAC3C,SAAK,QAAQ,mBAAmB;AAAA,EACjC;AAAA,EAEA,MAAM,IAAI,MAAe;AACxB,QAAI,MAAM;AACT,WAAK,QAAQ,OAAO;AAAA,IACrB;AACA,WAAO,MAAM,KAAK,QAAQ,OAAO,KAAK,OAAO;AAAA,EAC9C;AACD;;;ACrCA,IAAAC,cAAc;AAId,IAAM,cAAc,YAAAC,QAAE,KAAK,CAAC,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAElE,IAAM,qBAAqB,YAAAA,QAAE,OAAO;AAAA,EACnC,MAAM,YAAAA,QAAE,QAAQ,MAAM;AAAA,EACtB,MAAM,YAAAA,QAAE,OAAO;AAAA,EACf,OAAO;AACR,CAAC;AAED,IAAM,yBAA6E,YAAAA,QAAE;AAAA,EAAK,MACzF,YAAAA,QAAE,OAAO;AAAA,IACR,MAAM,YAAAA,QAAE,QAAQ,UAAU;AAAA,IAC1B,MAAM,YAAAA,QAAE,KAAK,CAAC,cAAc,UAAU,CAAC;AAAA,IACvC,OAAO,YAAAA,QAAE,MAAM,cAAc;AAAA,EAC9B,CAAC;AACF;AAEA,IAAM,iBAAsC,mBAAmB,GAAG,sBAAsB;AAEjF,IAAM,aAAa,YAAAA,QAAE,OAAO;AAAA,EAClC,MAAM;AACP,CAAC;;;ACpBM,IAAM,oBAAN,MAA6D;AAAA,EACnE,MAAM,QAAQ,UAAoB,MAAmC;AACpE,UAAM,WAAW,CAAC;AAClB,eAAW,KAAK,SAAS,OAAO;AAC/B,eAAS,KAAK,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC9B;AAEA,UAAM,UAAU,MAAM,QAAQ,IAAI,QAAQ;AAE1C,WAAO;AAAA,EACR;AACD;;;ACXO,IAAM,qBAAN,MAA8D;AAAA,EACpE,MAAM,QAAQ,UAAoB,MAAmC;AACpE,UAAM,UAAU,CAAC;AACjB,eAAW,KAAK,SAAS,OAAO;AAC/B,cAAQ,KAAK,MAAM,EAAE,QAAQ,IAAI,CAAC;AAAA,IACnC;AAEA,WAAO;AAAA,EACR;AACD;;;ACTO,IAAM,2BAAN,MAA+B;AAAA,EACrC,OAAO,OAAO,MAAyC;AACtD,QAAI;AACJ,QAAI,QAAQ,YAAY;AACvB,iBAAW,IAAI,kBAAkB;AAAA,IAClC,OAAO;AACN,iBAAW,IAAI,mBAAmB;AAAA,IACnC;AAEA,WAAO;AAAA,EACR;AACD;;;ACXO,IAAM,cAAN,MAA2C;AAAA,EACjD,YAAoB,OAAwB;AAAxB;AAAA,EAAyB;AAAA,EAE7C,WAAW,MAAkB;AAC5B,SAAK,MAAM,QAAQ,CAAC,MAAM,EAAE,WAAW,IAAI,CAAC;AAAA,EAC7C;AAAA,EAEA,UAAU,MAAY,QAAmB;AACxC,SAAK,MAAM,QAAQ,CAAC,MAAM,EAAE,UAAU,MAAM,MAAM,CAAC;AAAA,EACpD;AAAA,EAEA,eAAe,IAAc;AAC5B,SAAK,MAAM,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC;AAAA,EAC/C;AAAA,EAEA,cAAc,IAAc,QAAa;AACxC,SAAK,MAAM,QAAQ,CAAC,MAAM,EAAE,cAAc,IAAI,MAAM,CAAC;AAAA,EACtD;AACD;;;AClBO,IAAM,SAAN,MAAsC;AAAA,EAC5C,eAAe,UAAoB;AAClC,YAAQ,IAAI,2BAA2B,SAAS,IAAI,EAAE;AAAA,EACvD;AAAA,EAEA,cAAc,UAAoB;AACjC,YAAQ,IAAI,yBAAyB,SAAS,IAAI,EAAE;AAAA,EACrD;AAAA,EAEA,WAAW,MAAY;AACtB,YAAQ,IAAI,sBAAsB,KAAK,SAAS,CAAC,UAAU,KAAK,QAAQ,CAAC,EAAE;AAAA,EAC5E;AAAA,EAEA,UAAU,MAAY,QAAa;AAClC,YAAQ,IAAI,sBAAsB,KAAK,SAAS,CAAC,UAAU,KAAK,QAAQ,CAAC,EAAE;AAAA,EAC5E;AACD;;;AChBA,IAAM,cAA6B,IAAI,OAAO;AAE9C,IAAM,eAAe,CAAC,WAAW;AACjC,IAAM,cAA6B,IAAI,YAAY,YAAY;AAExD,IAAM,uBAAuB;;;ACH7B,IAAM,WAAN,cAAuB,SAAS;AAAA,EACtC,YACU,MACA,OACR;AACD,UAAM;AAHG;AACA;AAAA,EAGV;AAAA,EAEA,MAAM,QAAQ,OAAsB,sBAAoC;AACvE,SAAK,eAAe,IAAI;AAExB,UAAM,oBAA+C,yBAAyB,OAAO,KAAK,IAAI;AAC9F,UAAM,SAAS,MAAM,kBAAkB,QAAQ,MAAM,IAAI;AAEzD,SAAK,cAAc,MAAM,MAAM;AAC/B,WAAO;AAAA,EACR;AACD;;;AClBO,IAAM,OAAN,cAAmB,SAAS;AAAA,EAClC,YACS,MACA,OACP;AACD,UAAM;AAHE;AACA;AAAA,EAGT;AAAA,EAEA,UAAU;AACT,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,WAAW;AACV,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,MAAM,QAAQ,OAAsB,sBAAoC;AACvE,SAAK,WAAW,IAAI;AAEpB,UAAM,UAAyB;AAAA,MAC9B,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,IACZ;AAEA,UAAM,QAAQ,IAAI,YAAY,OAAO;AACrC,UAAM,SAAS,MAAM,MAAM,IAAI,KAAK,IAAI;AAExC,SAAK,UAAU,MAAM,MAAM;AAC3B,WAAO;AAAA,EACR;AACD;;;AC9BO,IAAM,qBAAN,MAAyB;AAAA,EAC/B,OAAO,SAAS,MAAsB;AACrC,WAAO,KAAK,SAAS,KAAK,IAAI;AAAA,EAC/B;AAAA,EAEA,OAAe,SAAS,MAA0B;AACjD,QAAI,KAAK,SAAS,YAAY;AAC7B,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACxC;AAEA,WAAO,IAAI,SAAS,KAAK,MAAM,KAAK,MAAM,IAAI,KAAK,OAAO,CAAC;AAAA,EAC5D;AAAA,EAEA,OAAe,QAAQ,MAA0B;AAChD,QAAI,KAAK,SAAS,QAAQ;AACzB,aAAO,IAAI,KAAK,KAAK,MAAM,KAAK,KAAK;AAAA,IACtC;AAEA,WAAO,IAAI,SAAS,KAAK,MAAM,KAAK,MAAM,IAAI,KAAK,OAAO,CAAC;AAAA,EAC5D;AACD;;;AClBA,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASR,IAAM,gBAAN,cAA4B,YAAY;AAAA,EAC9C,YAAY,SAAwB;AACnC,UAAM,OAAO;AAAA,EACd;AAAA,EAEA,MAAM,aAAa,MAAiC;AACnD,SAAK,oBAAoB,UAAU;AACnC,UAAM,OAAa,MAAM,KAAK,IAAI,GAAG,MAAM;AAAA,QAAW,IAAI,EAAE;AAC5D,WAAO,mBAAmB,SAAS,IAAI;AAAA,EACxC;AACD;","names":["OpenAI","import_openai","OpenAI","import_zod","Anthropic","import_sdk","Anthropic","ContentHandler","UsageHandler","UsageHandler","ContentHandler","import_zod","z"]}
|
package/dist/index.mjs
CHANGED
|
@@ -20,7 +20,7 @@ var EndpointResolver = class {
|
|
|
20
20
|
};
|
|
21
21
|
|
|
22
22
|
// src/types/model.ts
|
|
23
|
-
var OPENAI_MODELS = ["gpt-5", "gpt-5-mini", "gpt-5-nano", "gpt-5.1"];
|
|
23
|
+
var OPENAI_MODELS = ["gpt-5", "gpt-5-mini", "gpt-5-nano", "gpt-5.1", "gpt-5.2", "gpt-5.4"];
|
|
24
24
|
var latest_sonnet = "claude-sonnet-4-5-20250929";
|
|
25
25
|
var latest_haiku = "claude-haiku-4-5-20251001";
|
|
26
26
|
var latest_opus = "claude-opus-4-5-20251101";
|
|
@@ -31,7 +31,7 @@ var ANTHROPIC_MODEL_MAP = {
|
|
|
31
31
|
"claude-opus-4.5": latest_opus
|
|
32
32
|
};
|
|
33
33
|
|
|
34
|
-
// src/core/
|
|
34
|
+
// src/core/request-handler/capability.ts
|
|
35
35
|
var CapabilityHandler = class {
|
|
36
36
|
setNextHandler(capability) {
|
|
37
37
|
this.nextHandler = capability;
|
|
@@ -45,7 +45,7 @@ var CapabilityHandler = class {
|
|
|
45
45
|
}
|
|
46
46
|
};
|
|
47
47
|
|
|
48
|
-
// src/core/
|
|
48
|
+
// src/core/request-handler/messages.ts
|
|
49
49
|
var MessagesHandler = class extends CapabilityHandler {
|
|
50
50
|
apply(request, builder) {
|
|
51
51
|
if (request.messages) {
|
|
@@ -54,7 +54,7 @@ var MessagesHandler = class extends CapabilityHandler {
|
|
|
54
54
|
}
|
|
55
55
|
};
|
|
56
56
|
|
|
57
|
-
// src/core/
|
|
57
|
+
// src/core/request-handler/task.ts
|
|
58
58
|
var TaskHandler = class extends CapabilityHandler {
|
|
59
59
|
apply(request, builder) {
|
|
60
60
|
if (request.task) {
|
|
@@ -63,7 +63,7 @@ var TaskHandler = class extends CapabilityHandler {
|
|
|
63
63
|
}
|
|
64
64
|
};
|
|
65
65
|
|
|
66
|
-
// src/core/
|
|
66
|
+
// src/core/request-handler/model.ts
|
|
67
67
|
var ModelHandler = class extends CapabilityHandler {
|
|
68
68
|
apply(request, builder) {
|
|
69
69
|
if (request.model) {
|
|
@@ -72,7 +72,7 @@ var ModelHandler = class extends CapabilityHandler {
|
|
|
72
72
|
}
|
|
73
73
|
};
|
|
74
74
|
|
|
75
|
-
// src/core/
|
|
75
|
+
// src/core/request-handler/structured-output.ts
|
|
76
76
|
var StructuredOutputlHandler = class extends CapabilityHandler {
|
|
77
77
|
apply(request, builder) {
|
|
78
78
|
if (request.structuredOutput) {
|
|
@@ -81,7 +81,7 @@ var StructuredOutputlHandler = class extends CapabilityHandler {
|
|
|
81
81
|
}
|
|
82
82
|
};
|
|
83
83
|
|
|
84
|
-
// src/core/
|
|
84
|
+
// src/core/request-handler/tools.ts
|
|
85
85
|
var ToolsHandler = class extends CapabilityHandler {
|
|
86
86
|
apply(mozaikRequest, requestBuilder) {
|
|
87
87
|
if (mozaikRequest.tools && mozaikRequest.tools.length > 0) {
|
|
@@ -206,6 +206,24 @@ var OpenAIResponsesBuilder = class extends RequestBuilder {
|
|
|
206
206
|
}));
|
|
207
207
|
return this;
|
|
208
208
|
}
|
|
209
|
+
addReasoningEffort(effort) {
|
|
210
|
+
let reasoningEffort = "";
|
|
211
|
+
if (effort === "none" /* NONE */) {
|
|
212
|
+
reasoningEffort = "none";
|
|
213
|
+
} else if (effort === "low" /* LOW */) {
|
|
214
|
+
reasoningEffort = "low";
|
|
215
|
+
} else if (effort === "medium" /* MEDIUM */) {
|
|
216
|
+
reasoningEffort = "medium";
|
|
217
|
+
} else if (effort === "high" /* HIGH */) {
|
|
218
|
+
reasoningEffort = "high";
|
|
219
|
+
} else if (effort === "max" /* MAX */) {
|
|
220
|
+
reasoningEffort = "xhigh";
|
|
221
|
+
}
|
|
222
|
+
this.request.reasoning = {
|
|
223
|
+
effort: reasoningEffort
|
|
224
|
+
};
|
|
225
|
+
return this;
|
|
226
|
+
}
|
|
209
227
|
};
|
|
210
228
|
|
|
211
229
|
// src/providers/openai/client/default.ts
|
|
@@ -251,13 +269,13 @@ var ResponseHandler = class {
|
|
|
251
269
|
|
|
252
270
|
// src/providers/openai/response-handler/output-parsed.ts
|
|
253
271
|
var OutputParsedHandler = class extends ResponseHandler {
|
|
254
|
-
async handle(
|
|
255
|
-
const providerResponse =
|
|
272
|
+
async handle(mozaikResponse) {
|
|
273
|
+
const providerResponse = mozaikResponse.providerResponse;
|
|
256
274
|
if (providerResponse.output_parsed) {
|
|
257
|
-
|
|
258
|
-
return
|
|
275
|
+
mozaikResponse.setResponseData(providerResponse.output_parsed);
|
|
276
|
+
return mozaikResponse;
|
|
259
277
|
}
|
|
260
|
-
return await this.nextHandler.handle(
|
|
278
|
+
return await this.nextHandler.handle(mozaikResponse);
|
|
261
279
|
}
|
|
262
280
|
};
|
|
263
281
|
|
|
@@ -471,9 +489,9 @@ var OpenAIResponses = class extends Endpoint {
|
|
|
471
489
|
super();
|
|
472
490
|
this.requestBuilder = new OpenAIResponsesBuilder();
|
|
473
491
|
}
|
|
474
|
-
async sendRequest(
|
|
492
|
+
async sendRequest(mozaikRequest) {
|
|
475
493
|
try {
|
|
476
|
-
const request = this.buildRequest(
|
|
494
|
+
const request = this.buildRequest(mozaikRequest);
|
|
477
495
|
const client = OpenAIClientResolver.resolve(request);
|
|
478
496
|
const response = await client.send(request);
|
|
479
497
|
const mozaikResponse = new MozaikResponse();
|
|
@@ -481,7 +499,7 @@ var OpenAIResponses = class extends Endpoint {
|
|
|
481
499
|
const usageHandler = new UsageHandler();
|
|
482
500
|
const functionCallsHandler = new FunctionCallsHandler(
|
|
483
501
|
request,
|
|
484
|
-
|
|
502
|
+
mozaikRequest.tools ? mozaikRequest.tools : []
|
|
485
503
|
);
|
|
486
504
|
const outputParsedHandler = new OutputParsedHandler();
|
|
487
505
|
const outputTextHandler = new OutputTextHandler();
|
|
@@ -641,6 +659,24 @@ var AnthropicRequestBuilder = class extends RequestBuilder {
|
|
|
641
659
|
}));
|
|
642
660
|
return this;
|
|
643
661
|
}
|
|
662
|
+
addReasoningEffort(effort) {
|
|
663
|
+
let reasoningEffort = "";
|
|
664
|
+
if (effort === "none" /* NONE */) {
|
|
665
|
+
return this;
|
|
666
|
+
} else if (effort === "low" /* LOW */) {
|
|
667
|
+
reasoningEffort = "low";
|
|
668
|
+
} else if (effort === "medium" /* MEDIUM */) {
|
|
669
|
+
reasoningEffort = "medium";
|
|
670
|
+
} else if (effort === "high" /* HIGH */) {
|
|
671
|
+
reasoningEffort = "high";
|
|
672
|
+
} else if (effort === "max" /* MAX */) {
|
|
673
|
+
reasoningEffort = "max";
|
|
674
|
+
}
|
|
675
|
+
this.request.output_config = {
|
|
676
|
+
effort: reasoningEffort
|
|
677
|
+
};
|
|
678
|
+
return this;
|
|
679
|
+
}
|
|
644
680
|
build() {
|
|
645
681
|
if (!this.request.max_tokens) {
|
|
646
682
|
this.request.max_tokens = 1024;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/workflow/work-unit.ts","../src/core/endpoint/request-gateway.ts","../src/core/endpoint/endpoint-resolver.ts","../src/types/model.ts","../src/core/command-handler/capability.ts","../src/core/command-handler/messages.ts","../src/core/command-handler/task.ts","../src/core/command-handler/model.ts","../src/core/command-handler/structured-output.ts","../src/core/command-handler/tools.ts","../src/core/endpoint/endpoint.ts","../src/core/endpoint/request-builder.ts","../src/providers/openai/mapper.ts","../src/providers/openai/builder.ts","../src/providers/openai/client/default.ts","../src/providers/openai/client/parser.ts","../src/providers/openai/client/resolver.ts","../src/core/endpoint/response-handler.ts","../src/providers/openai/response-handler/output-parsed.ts","../src/providers/openai/response-handler/content.ts","../src/providers/openai/response-handler/output-text.ts","../src/core/usage-entry.ts","../src/providers/openai/model-pricing.ts","../src/providers/openai/response-handler/function-calls.ts","../src/core/response.ts","../src/providers/openai/response-handler/usage.ts","../src/providers/openai/endpoint.ts","../src/providers/anthropic/mapper.ts","../src/providers/anthropic/builder.ts","../src/providers/anthropic/client/default.ts","../src/providers/anthropic/client/parser.ts","../src/providers/anthropic/client/resolver.ts","../src/providers/anthropic/response-handler/parsed-output.ts","../src/providers/anthropic/response-handler/content.ts","../src/providers/anthropic/model-pricing.ts","../src/providers/anthropic/response-handler/tool-use.ts","../src/providers/anthropic/response-handler/usage.ts","../src/providers/anthropic/response-handler/undhandled.ts","../src/providers/anthropic/endpoint.ts","../src/providers/endpoint-resolver.ts","../src/core/agents/agent.ts","../src/core/workflow/schema/plan.ts","../src/core/workflow/execution/parallel.ts","../src/core/workflow/execution/sequential.ts","../src/core/workflow/execution/strategy-factory.ts","../src/core/workflow/hooks/cluster.ts","../src/core/workflow/hooks/logger.ts","../src/core/workflow/hooks/index.ts","../src/core/workflow/workflow.ts","../src/core/workflow/task.ts","../src/core/workflow/mapper.ts","../src/core/agents/planner.ts"],"sourcesContent":["import { ExecutionHook } from \"./hooks/execution-hook\"\n\nexport abstract class WorkUnit {\n\tconstructor() {}\n\n\tabstract execute(hook: ExecutionHook): Promise<any>\n}\n","import { MozaikRequest } from \"@/types/request\"\nimport { Endpoint } from \"./endpoint\"\nimport { EndpointResolver } from \"./endpoint-resolver\"\n\nexport class RequestGateway {\n\tendpoint!: Endpoint\n\n\tconstructor(readonly endpointResolver: EndpointResolver) {}\n\n\tasync invoke(request: MozaikRequest): Promise<any> {\n\t\tthis.endpoint = this.endpointResolver.resolve(request.model)\n\t\treturn await this.endpoint.sendRequest(request)\n\t}\n}\n","import { Endpoint } from \"./endpoint\"\n\nexport abstract class EndpointResolver {\n\tabstract resolve(model: string): Endpoint\n}\n","export const OPENAI_MODELS = [\"gpt-5\", \"gpt-5-mini\", \"gpt-5-nano\", \"gpt-5.1\"] as const\n\nexport type OpenAIModel = (typeof OPENAI_MODELS)[number]\n\nconst latest_sonnet = \"claude-sonnet-4-5-20250929\"\nconst latest_haiku = \"claude-haiku-4-5-20251001\"\nconst latest_opus = \"claude-opus-4-5-20251101\"\n\nexport const ANTHROPIC_MODELS = [\"claude-sonnet-4.5\", \"claude-haiku-4.5\", \"claude-opus-4.5\"] as const\n\nexport const ANTHROPIC_MODEL_MAP = {\n\t\"claude-sonnet-4.5\": latest_sonnet,\n\t\"claude-haiku-4.5\": latest_haiku,\n\t\"claude-opus-4.5\": latest_opus,\n} as const\n\nexport type AnthropicModel = (typeof ANTHROPIC_MODELS)[number]\n\nexport type Model = OpenAIModel | AnthropicModel\n","import { MozaikRequest } from \"@/types/request\"\nimport { RequestBuilder } from \"../endpoint/request-builder\"\n\nexport abstract class CapabilityHandler {\n\tabstract nextHandler: CapabilityHandler\n\n\tsetNextHandler(capability: CapabilityHandler): CapabilityHandler {\n\t\tthis.nextHandler = capability\n\t\treturn this.nextHandler\n\t}\n\n\tabstract apply(request: MozaikRequest, requestBuilder: RequestBuilder): any\n\n\thandle(request: MozaikRequest, builder: RequestBuilder) {\n\t\tthis.apply(request, builder)\n\n\t\tif (this.nextHandler) {\n\t\t\tthis.nextHandler.handle(request, builder)\n\t\t}\n\t}\n}\n","import { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { CapabilityHandler } from \"./capability\"\nimport { MozaikRequest } from \"@/types/request\"\n\nexport class MessagesHandler extends CapabilityHandler {\n\tnextHandler!: CapabilityHandler\n\n\tapply(request: MozaikRequest, builder: RequestBuilder) {\n\t\tif (request.messages) {\n\t\t\tbuilder.addMessages(request.messages)\n\t\t}\n\t}\n}\n","import { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { CapabilityHandler } from \"./capability\"\nimport { MozaikRequest } from \"@/types/request\"\n\nexport class TaskHandler extends CapabilityHandler {\n\tnextHandler!: CapabilityHandler\n\n\tapply(request: MozaikRequest, builder: RequestBuilder) {\n\t\tif (request.task) {\n\t\t\tbuilder.addTask(request.task)\n\t\t}\n\t}\n}\n","import { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { CapabilityHandler } from \"./capability\"\nimport { MozaikRequest } from \"@/types/request\"\n\nexport class ModelHandler extends CapabilityHandler {\n\tnextHandler!: CapabilityHandler\n\n\tapply(request: MozaikRequest, builder: RequestBuilder) {\n\t\tif (request.model) {\n\t\t\tbuilder.addModel(request.model)\n\t\t}\n\t}\n}\n","import { MozaikRequest } from \"@/types/request\"\nimport { CapabilityHandler } from \"./capability\"\nimport { RequestBuilder } from \"@core/endpoint/request-builder\"\n\nexport class StructuredOutputlHandler extends CapabilityHandler {\n\tnextHandler!: CapabilityHandler\n\n\tapply(request: MozaikRequest, builder: RequestBuilder) {\n\t\tif (request.structuredOutput) {\n\t\t\tbuilder.addStructuredOutput(request.structuredOutput)\n\t\t}\n\t}\n}\n","import { MozaikRequest } from \"@/types/request\"\nimport { RequestBuilder } from \"../endpoint/request-builder\"\nimport { CapabilityHandler } from \"./capability\"\n\nexport class ToolsHandler extends CapabilityHandler {\n\tnextHandler!: CapabilityHandler\n\n\tapply(mozaikRequest: MozaikRequest, requestBuilder: RequestBuilder) {\n\t\tif (mozaikRequest.tools && mozaikRequest.tools.length > 0) {\n\t\t\trequestBuilder.addTools(mozaikRequest.tools)\n\t\t}\n\t}\n}\n","import { RequestBuilder } from \"./request-builder\"\nimport { CapabilityHandler } from \"../command-handler/capability\"\nimport { MessagesHandler } from \"../command-handler/messages\"\nimport { TaskHandler } from \"../command-handler/task\"\nimport { ModelHandler } from \"../command-handler/model\"\nimport { StructuredOutputlHandler } from \"../command-handler/structured-output\"\nimport { MozaikRequest } from \"@/types/request\"\nimport { ToolsHandler } from \"../command-handler/tools\"\n\nexport abstract class Endpoint {\n\tabstract requestBuilder: RequestBuilder\n\trequest: MozaikRequest | null = null\n\n\tbuildRequest(request: MozaikRequest): any {\n\t\tthis.request = request\n\n\t\tthis.requestBuilder.initialize()\n\n\t\tconst messagesHandler: CapabilityHandler = new MessagesHandler()\n\t\tconst taskHandler: CapabilityHandler = new TaskHandler()\n\t\tconst modelHandler: CapabilityHandler = new ModelHandler()\n\t\tconst structuredOutputHandler: CapabilityHandler = new StructuredOutputlHandler()\n\t\tconst toolsHandler: CapabilityHandler = new ToolsHandler()\n\n\t\tmessagesHandler\n\t\t\t.setNextHandler(taskHandler)\n\t\t\t.setNextHandler(modelHandler)\n\t\t\t.setNextHandler(structuredOutputHandler)\n\t\t\t.setNextHandler(toolsHandler)\n\n\t\tmessagesHandler.handle(request, this.requestBuilder)\n\n\t\treturn this.requestBuilder.build()\n\t}\n\n\tabstract sendRequest(providerRequest: any): any\n}\n","import { Message } from \"@/types/message\"\nimport { Tool } from \"@/types/tool\"\nimport { ZodObject } from \"zod\"\n\nexport abstract class RequestBuilder {\n\trequest: any\n\n\tinitialize() {\n\t\tthis.request = {}\n\t}\n\n\tabstract addModel(model: string): RequestBuilder\n\tabstract addTask(task: string): RequestBuilder\n\tabstract addMessages(messages: Message[]): RequestBuilder\n\tabstract addStructuredOutput(schema: ZodObject<any>): RequestBuilder\n\tabstract addTools(tools: Tool[]): RequestBuilder\n\n\tbuild() {\n\t\treturn this.request\n\t}\n}\n","import { Message } from \"@/types/message\"\nimport { Tool } from \"@/types/tool\"\n\nexport interface ToolDefinition {\n\ttype: \"function\"\n\tname: string\n\tdescription: string\n\tparameters: any\n\tstrict?: boolean\n}\n\nexport class OpenAIResponsesMapper {\n\t/**\n\t * Convert domain Messages to Responses API instructions format\n\t *\n\t * The Responses API uses 'instructions' (system prompt) rather than messages array.\n\t * For multi-turn conversations, use conversation.id or previous_response_id parameters.\n\t */\n\ttoInstructions(messages: Message[]): string {\n\t\tif (messages.length === 0) {\n\t\t\tthrow new Error(\"[ResponsesMapper] Cannot create instructions from empty messages\")\n\t\t}\n\n\t\t// Find system message if exists, otherwise use first user message as context\n\t\tconst systemMessage = messages.find((m) => m.role === \"system\")\n\n\t\tif (systemMessage) {\n\t\t\treturn typeof systemMessage.content === \"string\"\n\t\t\t\t? systemMessage.content\n\t\t\t\t: this.extractTextFromContent(systemMessage.content)\n\t\t}\n\n\t\t// Fallback: create instructions from context\n\t\treturn \"You are a helpful assistant.\"\n\t}\n\n\t/**\n\t * Extract the user's input from messages\n\t * Returns the last user message content for use in prompt variables.\n\t * In Responses API, the actual user query is typically passed via prompt variables\n\t * or handled through conversation continuation.\n\t */\n\textractUserInput(messages: Message[]): string {\n\t\tconst userMessages = messages.filter((m) => m.role === \"user\")\n\n\t\tif (userMessages.length === 0) {\n\t\t\treturn \"\"\n\t\t}\n\n\t\tconst lastUserMessage = userMessages[userMessages.length - 1]\n\t\treturn typeof lastUserMessage.content === \"string\"\n\t\t\t? lastUserMessage.content\n\t\t\t: this.extractTextFromContent(lastUserMessage.content)\n\t}\n\n\tprivate extractTextFromContent(content: any[]): string {\n\t\treturn content\n\t\t\t.filter((part) => part.type === \"text\")\n\t\t\t.map((part) => part.text)\n\t\t\t.join(\" \")\n\t}\n\n\t/**\n\t * Map tools to Responses API format\n\t */\n\ttoTools(tools: Tool[]): ToolDefinition[] {\n\t\treturn tools.map((t) => ({\n\t\t\ttype: \"function\",\n\t\t\tname: t.name,\n\t\t\tdescription: t.description,\n\t\t\tparameters: t.schema,\n\t\t\tstrict: true, // Enable strict mode by default for better validation\n\t\t}))\n\t}\n}\n","import { Message } from \"@/types/message\"\nimport { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { OpenAIResponsesMapper } from \"./mapper\"\nimport { zodTextFormat } from \"openai/helpers/zod\"\nimport { ZodObject } from \"zod\"\nimport { Tool } from \"@/types/tool\"\n\nexport class OpenAIResponsesBuilder extends RequestBuilder {\n\tconstructor(private mapper = new OpenAIResponsesMapper()) {\n\t\tsuper()\n\t}\n\n\taddModel(model: string): RequestBuilder {\n\t\tthis.request.model = model\n\t\treturn this\n\t}\n\n\taddTask(task: string): RequestBuilder {\n\t\tthis.request.input = task\n\t\treturn this\n\t}\n\n\taddMessages(messages: Message[]): RequestBuilder {\n\t\tconst instructions = this.mapper.toInstructions(messages)\n\t\t// Set optional instructions if there's a system message\n\t\tif (instructions && instructions !== \"You are a helpful assistant.\") {\n\t\t\tthis.request.instructions = instructions\n\t\t}\n\n\t\treturn this\n\t}\n\n\taddStructuredOutput(schema: ZodObject): RequestBuilder {\n\t\tthis.request.text = {\n\t\t\tformat: zodTextFormat(schema, \"outputSchema\"),\n\t\t}\n\t\treturn this\n\t}\n\n\taddTools(tools: Tool[]): RequestBuilder {\n\t\tthis.request.tools = tools.map((tool) => ({\n\t\t\ttype: \"function\" as const,\n\t\t\tname: tool.name,\n\t\t\tdescription: tool.description,\n\t\t\tparameters: tool.schema,\n\t\t}))\n\t\treturn this\n\t}\n}\n","import OpenAI from \"openai\"\nimport { SendingClient } from \"@core/endpoint/client\"\n\nexport class OpenAIDefaultClient implements SendingClient {\n\tconstructor(private client = new OpenAI()) {}\n\n\tasync send(request: any): Promise<any> {\n\t\treturn await this.client.responses.create(request)\n\t}\n}\n","import OpenAI from \"openai\"\nimport { SendingClient } from \"@core/endpoint/client\"\n\nexport class OpenAIParserClient implements SendingClient {\n\tconstructor(private client = new OpenAI()) {}\n\n\tasync send(request: any): Promise<any> {\n\t\treturn await this.client.responses.parse(request)\n\t}\n}\n","import { SendingClient } from \"@core/endpoint/client\"\nimport { OpenAIDefaultClient } from \"./default\"\nimport { OpenAIParserClient } from \"./parser\"\n\nexport class OpenAIClientResolver {\n\tstatic resolve(request: any): SendingClient {\n\t\tif (request.text && request.text.format) {\n\t\t\treturn new OpenAIParserClient()\n\t\t} else {\n\t\t\treturn new OpenAIDefaultClient()\n\t\t}\n\t}\n}\n","import { MozaikResponse } from \"../response\"\n\nexport abstract class ResponseHandler {\n\tabstract nextHandler: ResponseHandler\n\n\tsetNextHandler(responseHandler: ResponseHandler): ResponseHandler {\n\t\tthis.nextHandler = responseHandler\n\t\treturn this.nextHandler\n\t}\n\n\tabstract handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse>\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class OutputParsedHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(responseContext: MozaikResponse) {\n\t\tconst providerResponse = responseContext.providerResponse\n\t\tif (providerResponse.output_parsed) {\n\t\t\tresponseContext.setResponseData(providerResponse.output_parsed)\n\t\t\treturn responseContext\n\t\t}\n\n\t\treturn await this.nextHandler.handle(responseContext)\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class ContentHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tconst firstOutput = providerResponse.output?.[0]\n\t\tif (firstOutput && \"content\" in firstOutput) {\n\t\t\tconst firstContent = firstOutput.content?.[0]\n\t\t\tif (firstContent && \"text\" in firstContent) {\n\t\t\t\tmozaikResponse.setResponseData(firstContent.text)\n\t\t\t\treturn mozaikResponse\n\t\t\t}\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class OutputTextHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tif (providerResponse.output_text) {\n\t\t\tmozaikResponse.setResponseData(providerResponse.output_text)\n\t\t\treturn mozaikResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","export class UsageEntry {\n\tpriceInUsd: number\n\tmodel: string\n\n\tconstructor(priceInUsd: number, model: string) {\n\t\tthis.priceInUsd = priceInUsd\n\t\tthis.model = model\n\t}\n}\n","export class OpenAIModelPricing {\n\tprivate inputPricePer1MToken!: number\n\tprivate outputPricePer1MToken!: number\n\tprivate cachedPricePer1MToken!: number\n\n\tcalculateTotalCost(inputTokens: number, outputTokens: number, cachedInputTokens: number): number {\n\t\tconst inputCost = ((inputTokens - cachedInputTokens) * this.inputPricePer1MToken) / 1_000_000\n\t\tconst outputCost = (outputTokens * this.outputPricePer1MToken) / 1_000_000\n\t\tconst cachedCost = (cachedInputTokens * this.cachedPricePer1MToken) / 1_000_000\n\t\treturn inputCost + outputCost + cachedCost\n\t}\n\n\tgetPriceInUsd(modelName: string, inputTokens: number, outputTokens: number, cachedInputTokens: number): number {\n\t\tif (modelName.startsWith(\"gpt-5-mini\")) {\n\t\t\tthis.inputPricePer1MToken = 0.25\n\t\t\tthis.outputPricePer1MToken = 2\n\t\t\tthis.cachedPricePer1MToken = 0.025\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens, cachedInputTokens)\n\t\t} else if (modelName.startsWith(\"gpt-5-nano\")) {\n\t\t\tthis.inputPricePer1MToken = 0.05\n\t\t\tthis.outputPricePer1MToken = 0.4\n\t\t\tthis.cachedPricePer1MToken = 0.005\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens, cachedInputTokens)\n\t\t} else if (modelName.startsWith(\"gpt-5.1\")) {\n\t\t\tthis.inputPricePer1MToken = 1.25\n\t\t\tthis.outputPricePer1MToken = 10\n\t\t\tthis.cachedPricePer1MToken = 0.125\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens, cachedInputTokens)\n\t\t} else if (modelName.startsWith(\"gpt-5\")) {\n\t\t\tthis.inputPricePer1MToken = 1.25\n\t\t\tthis.outputPricePer1MToken = 10\n\t\t\tthis.cachedPricePer1MToken = 0.125\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens, cachedInputTokens)\n\t\t}\n\n\t\tthrow new Error(`Model name ${modelName} is not supported for this pricing`)\n\t}\n}\n","import { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { OpenAIDefaultClient } from \"../client/default\"\nimport { Tool } from \"@/types/tool\"\nimport { MozaikResponse } from \"@core/response\"\nimport { UsageEntry } from \"@core/usage-entry\"\nimport { OpenAIModelPricing } from \"@providers/openai/model-pricing\"\n\nexport interface ToolCall {\n\tcall_id: string\n\tname: string\n\targuments: string | Record<string, any>\n}\n\nexport interface ToolResult {\n\ttype: \"function_call_output\"\n\tcall_id: string\n\toutput: string\n}\n\nexport class FunctionCallsHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\tclient: OpenAIDefaultClient\n\ttools: Tool[]\n\trequest: any\n\n\tconstructor(request: any, tools: Tool[]) {\n\t\tsuper()\n\t\tthis.request = request\n\t\tthis.tools = tools\n\t\tthis.client = new OpenAIDefaultClient()\n\t}\n\n\tprivate hasToolCalls(response: any): boolean {\n\t\treturn response.output?.some((item: any) => item.type === \"function_call\")\n\t}\n\n\tprivate extractToolCalls(response: any): any[] {\n\t\treturn response.output?.filter((item: any) => item.type === \"function_call\") || []\n\t}\n\n\tprivate resolveTool(call: ToolCall, tools: Tool[]): Tool | null {\n\t\treturn tools.find((t) => t.name === call.name) ?? null\n\t}\n\n\tprivate async executeTool(tool: Tool, rawArgs: ToolCall[\"arguments\"]): Promise<any> {\n\t\tconst args = typeof rawArgs === \"string\" ? JSON.parse(rawArgs) : rawArgs\n\n\t\treturn await tool.invoke(args)\n\t}\n\n\tprivate formatToolResult(callId: string, payload: any): ToolResult {\n\t\treturn {\n\t\t\ttype: \"function_call_output\",\n\t\t\tcall_id: callId,\n\t\t\toutput: JSON.stringify(payload),\n\t\t}\n\t}\n\n\tprivate async executeToolCalls(toolCalls: ToolCall[], tools: Tool[]): Promise<ToolResult[]> {\n\t\tconst results: ToolResult[] = []\n\n\t\tfor (const call of toolCalls) {\n\t\t\tconst tool = this.resolveTool(call, tools)\n\n\t\t\tif (!tool) {\n\t\t\t\tresults.push(\n\t\t\t\t\tthis.formatToolResult(call.call_id, {\n\t\t\t\t\t\terror: `Unknown tool: ${call.name}`,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst result = await this.executeTool(tool, call.arguments)\n\t\t\t\tresults.push(this.formatToolResult(call.call_id, result))\n\t\t\t} catch (err: any) {\n\t\t\t\tresults.push(\n\t\t\t\t\tthis.formatToolResult(call.call_id, {\n\t\t\t\t\t\terror: err.message ?? \"Tool execution failed\",\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\treturn results\n\t}\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tlet providerResponse = mozaikResponse.providerResponse\n\t\tlet toolCallingResponse: any\n\t\twhile (this.hasToolCalls(providerResponse)) {\n\t\t\tconst toolCalls = this.extractToolCalls(providerResponse)\n\n\t\t\tconst toolResults = await this.executeToolCalls(toolCalls, this.tools)\n\n\t\t\t// Continue the conversation with tool results\n\t\t\tthis.request.input = toolResults\n\t\t\tthis.request.previous_response_id = providerResponse.id\n\n\t\t\ttoolCallingResponse = await this.client.send(this.request)\n\n\t\t\tconst openAIModelPricing = new OpenAIModelPricing()\n\t\t\tconst usage = toolCallingResponse.usage\n\t\t\tconst totalCost = openAIModelPricing.getPriceInUsd(\n\t\t\t\tproviderResponse.model,\n\t\t\t\tusage.input_tokens,\n\t\t\t\tusage.output_tokens,\n\t\t\t\tusage.input_token_details?.cached_tokens ?? 0,\n\t\t\t)\n\n\t\t\tmozaikResponse.addUsageEntry(new UsageEntry(totalCost, providerResponse.model))\n\t\t\tmozaikResponse.setProviderResponse(toolCallingResponse)\n\t\t\tmozaikResponse.setResponseData(toolCallingResponse)\n\t\t\tproviderResponse = toolCallingResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { UsageEntry } from \"./usage-entry\"\n\nexport class MozaikResponse {\n\tproviderResponse: any\n\tresponseData?: any\n\tusageEntries: UsageEntry[] = []\n\n\tsetProviderResponse(providerResponse: any): MozaikResponse {\n\t\tthis.providerResponse = providerResponse\n\t\treturn this\n\t}\n\n\taddUsageEntry(usageEntry: UsageEntry): MozaikResponse {\n\t\tthis.usageEntries.push(usageEntry)\n\t\treturn this\n\t}\n\n\tsetResponseData(response: any): MozaikResponse {\n\t\tthis.responseData = response\n\t\treturn this\n\t}\n\n\tgetResponse(): any {\n\t\treturn {\n\t\t\tdata: this.responseData,\n\t\t\tusage: {\n\t\t\t\tentries: this.usageEntries,\n\t\t\t},\n\t\t\ttotalCost: this.usageEntries.reduce((acc, entry) => acc + entry.priceInUsd, 0),\n\t\t}\n\t}\n\n\tgetUsageEntries(): UsageEntry[] {\n\t\treturn this.usageEntries\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { UsageEntry } from \"@core/usage-entry\"\nimport { OpenAIModelPricing } from \"@providers/openai/model-pricing\"\n\nexport class UsageHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tconst usage = providerResponse.usage\n\n\t\tconst openAIModelPricing = new OpenAIModelPricing()\n\t\tconst totalCost = openAIModelPricing.getPriceInUsd(\n\t\t\tproviderResponse.model,\n\t\t\tusage.input_tokens,\n\t\t\tusage.output_tokens,\n\t\t\tusage.input_token_details?.cached_tokens ?? 0,\n\t\t)\n\n\t\tmozaikResponse.addUsageEntry(new UsageEntry(totalCost, providerResponse.model))\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { Endpoint } from \"@core/endpoint/endpoint\"\nimport { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { OpenAIResponsesBuilder } from \"./builder\"\nimport { OpenAIClientResolver } from \"./client/resolver\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { OutputParsedHandler } from \"./response-handler/output-parsed\"\nimport { ContentHandler } from \"./response-handler/content\"\nimport { OutputTextHandler } from \"./response-handler/output-text\"\nimport { FunctionCallsHandler } from \"./response-handler/function-calls\"\nimport { Command } from \"@/types/request\"\nimport { MozaikResponse } from \"@core/response\"\nimport { UsageHandler } from \"./response-handler/usage\"\nimport { UsageEntry } from \"@core/usage-entry\"\n\nexport class OpenAIResponses extends Endpoint {\n\trequestBuilder: RequestBuilder = new OpenAIResponsesBuilder()\n\n\tconstructor() {\n\t\tsuper()\n\t}\n\n\tasync sendRequest(command: Command): Promise<any> {\n\t\ttry {\n\t\t\tconst request = this.buildRequest(command)\n\t\t\tconst client = OpenAIClientResolver.resolve(request)\n\t\t\tconst response = await client.send(request)\n\n\t\t\tconst mozaikResponse = new MozaikResponse()\n\t\t\tmozaikResponse.setProviderResponse(response)\n\n\t\t\t// response handler (chain of responsibilities)\n\t\t\tconst usageHandler: ResponseHandler = new UsageHandler()\n\t\t\tconst functionCallsHandler: ResponseHandler = new FunctionCallsHandler(\n\t\t\t\trequest,\n\t\t\t\tcommand.tools ? command.tools : [],\n\t\t\t)\n\t\t\tconst outputParsedHandler: ResponseHandler = new OutputParsedHandler()\n\t\t\tconst outputTextHandler: ResponseHandler = new OutputTextHandler()\n\t\t\tconst contentHandler: ResponseHandler = new ContentHandler()\n\n\t\t\tusageHandler\n\t\t\t\t.setNextHandler(functionCallsHandler)\n\t\t\t\t.setNextHandler(outputParsedHandler)\n\t\t\t\t.setNextHandler(outputTextHandler)\n\t\t\t\t.setNextHandler(contentHandler)\n\n\t\t\tconst responseHandler = usageHandler\n\n\t\t\tconst result: MozaikResponse = await responseHandler.handle(mozaikResponse)\n\n\t\t\treturn result.getResponse()\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"[OpenAIProvider] Responses API request failed:\", error)\n\t\t\tthrow error\n\t\t}\n\t}\n}\n","import { Message, TextPart, ImagePart } from \"@/types/message\"\nimport type { MessageParam, TextBlockParam, ImageBlockParam } from \"@anthropic-ai/sdk/resources/messages\"\n\nexport class AnthropicMapper {\n\t/**\n\t * Transforms domain messages to Anthropic API format.\n\t * Separates system messages from conversation messages.\n\t */\n\ttoMessages(messages: Message[]): { messages: MessageParam[]; system?: string } {\n\t\tconst anthropicMessages: MessageParam[] = []\n\t\tlet systemPrompt: string | undefined\n\n\t\tfor (const msg of messages) {\n\t\t\t// Extract system messages separately (Anthropic uses dedicated system parameter)\n\t\t\tif (msg.role === \"system\") {\n\t\t\t\tconst content =\n\t\t\t\t\ttypeof msg.content === \"string\"\n\t\t\t\t\t\t? msg.content\n\t\t\t\t\t\t: (msg.content as TextPart[]).map((p) => p.text).join(\"\\n\")\n\n\t\t\t\tsystemPrompt = systemPrompt ? `${systemPrompt}\\n\\n${content}` : content\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Skip tool role messages (not directly supported in basic implementation)\n\t\t\tif (msg.role === \"tool\") {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Map user and assistant messages\n\t\t\tif (msg.role === \"user\" || msg.role === \"assistant\") {\n\t\t\t\tif (typeof msg.content === \"string\") {\n\t\t\t\t\tanthropicMessages.push({\n\t\t\t\t\t\trole: msg.role,\n\t\t\t\t\t\tcontent: msg.content,\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\t// Handle multimodal content (text + images)\n\t\t\t\t\tconst contentBlocks = (msg.content as Array<TextPart | ImagePart>).map((part) => {\n\t\t\t\t\t\tif (part.type === \"text\") {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\t\ttext: part.text,\n\t\t\t\t\t\t\t} as TextBlockParam\n\t\t\t\t\t\t} else if (part.type === \"image_url\") {\n\t\t\t\t\t\t\t// Note: Anthropic requires base64-encoded images\n\t\t\t\t\t\t\t// This is a simplified version - production code should handle URL->base64 conversion\n\t\t\t\t\t\t\tconst imageUrl = part.url\n\n\t\t\t\t\t\t\t// Check if it's already base64 data\n\t\t\t\t\t\t\tif (imageUrl.startsWith(\"data:image\")) {\n\t\t\t\t\t\t\t\tconst matches = imageUrl.match(/data:image\\/(\\w+);base64,(.+)/)\n\t\t\t\t\t\t\t\tif (matches) {\n\t\t\t\t\t\t\t\t\tconst [, mediaType, data] = matches\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\ttype: \"image\" as const,\n\t\t\t\t\t\t\t\t\t\tsource: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"base64\" as const,\n\t\t\t\t\t\t\t\t\t\t\tmedia_type: `image/${mediaType}` as\n\t\t\t\t\t\t\t\t\t\t\t\t| \"image/jpeg\"\n\t\t\t\t\t\t\t\t\t\t\t\t| \"image/png\"\n\t\t\t\t\t\t\t\t\t\t\t\t| \"image/gif\"\n\t\t\t\t\t\t\t\t\t\t\t\t| \"image/webp\",\n\t\t\t\t\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t} as ImageBlockParam\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// For non-base64 URLs, throw error (or you could fetch and convert)\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\"[AnthropicMapper] Image URLs must be base64-encoded. \" +\n\t\t\t\t\t\t\t\t\t\"Convert to data:image/[type];base64,[data] format.\",\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn { type: \"text\" as const, text: \"\" } as TextBlockParam\n\t\t\t\t\t})\n\n\t\t\t\t\tanthropicMessages.push({\n\t\t\t\t\t\trole: msg.role,\n\t\t\t\t\t\tcontent: contentBlocks,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Anthropic requires alternating user/assistant roles\n\t\t// Validate and fix if needed\n\t\tconst validated = this.ensureAlternatingRoles(anthropicMessages)\n\n\t\treturn {\n\t\t\tmessages: validated,\n\t\t\tsystem: systemPrompt,\n\t\t}\n\t}\n\n\t/**\n\t * Ensures messages alternate between user and assistant roles.\n\t * Anthropic API requires this constraint.\n\t */\n\tprivate ensureAlternatingRoles(messages: MessageParam[]): MessageParam[] {\n\t\tif (messages.length === 0) return messages\n\n\t\tconst result: MessageParam[] = []\n\t\tlet lastRole: \"user\" | \"assistant\" | undefined\n\n\t\tfor (const msg of messages) {\n\t\t\t// If same role appears consecutively, merge the messages\n\t\t\tif (lastRole === msg.role && result.length > 0) {\n\t\t\t\tconst lastMsg = result[result.length - 1]\n\n\t\t\t\t// Merge content\n\t\t\t\tif (typeof lastMsg.content === \"string\" && typeof msg.content === \"string\") {\n\t\t\t\t\tlastMsg.content = `${lastMsg.content}\\n${msg.content}`\n\t\t\t\t} else {\n\t\t\t\t\t// For array content, concatenate\n\t\t\t\t\tconst lastContent = Array.isArray(lastMsg.content)\n\t\t\t\t\t\t? lastMsg.content\n\t\t\t\t\t\t: [{ type: \"text\" as const, text: lastMsg.content as string }]\n\t\t\t\t\tconst newContent = Array.isArray(msg.content)\n\t\t\t\t\t\t? msg.content\n\t\t\t\t\t\t: [{ type: \"text\" as const, text: msg.content as string }]\n\t\t\t\t\tlastMsg.content = [...lastContent, ...newContent]\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresult.push(msg)\n\t\t\t\tlastRole = msg.role\n\t\t\t}\n\t\t}\n\n\t\t// Ensure first message is from user (Anthropic requirement)\n\t\tif (result.length > 0 && result[0].role !== \"user\") {\n\t\t\tthrow new Error(\n\t\t\t\t\"[AnthropicMapper] First message must be from user. Anthropic API requires conversations to start with a user message.\",\n\t\t\t)\n\t\t}\n\n\t\treturn result\n\t}\n}\n","import { Message } from \"@/types/message\"\nimport { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { AnthropicMapper } from \"./mapper\"\nimport { betaZodOutputFormat } from \"@anthropic-ai/sdk/helpers/beta/zod\"\nimport { ANTHROPIC_MODEL_MAP, AnthropicModel } from \"@/types/model\"\nimport { ZodObject } from \"zod\"\nimport { Tool } from \"@/types/tool\"\n\nexport class AnthropicRequestBuilder extends RequestBuilder {\n\tprivate mapper = new AnthropicMapper()\n\n\taddModel(model: AnthropicModel): RequestBuilder {\n\t\tthis.request.model = ANTHROPIC_MODEL_MAP[model]\n\t\treturn this\n\t}\n\n\taddTask(task: string): RequestBuilder {\n\t\t// Add task as a user message\n\t\tconst message = {\n\t\t\trole: \"user\" as const,\n\t\t\tcontent: task,\n\t\t}\n\n\t\tif (!this.request.messages) {\n\t\t\tthis.request.messages = []\n\t\t}\n\n\t\tthis.request.messages.push(message)\n\t\treturn this\n\t}\n\n\taddMessages(messages: Message[]): RequestBuilder {\n\t\tconst { messages: anthropicMessages, system } = this.mapper.toMessages(messages)\n\n\t\tthis.request.messages = anthropicMessages\n\n\t\tif (system) {\n\t\t\tthis.request.system = system\n\t\t}\n\n\t\treturn this\n\t}\n\n\taddStructuredOutput(schema: ZodObject): RequestBuilder {\n\t\tthis.request.betas = [\"structured-outputs-2025-11-13\"]\n\t\tthis.request.output_format = betaZodOutputFormat(schema)\n\t\treturn this\n\t}\n\n\taddTools(tools: Tool[]): RequestBuilder {\n\t\tthis.request.tools = tools.map((tool) => ({\n\t\t\tname: tool.name,\n\t\t\tdescription: tool.description,\n\t\t\tinput_schema: tool.schema,\n\t\t}))\n\t\treturn this\n\t}\n\n\tbuild() {\n\t\t// Anthropic requires max_tokens parameter\n\t\tif (!this.request.max_tokens) {\n\t\t\tthis.request.max_tokens = 1024\n\t\t}\n\n\t\treturn this.request\n\t}\n}\n","import { SendingClient } from \"@core/endpoint/client\"\nimport Anthropic from \"@anthropic-ai/sdk\"\n\nexport class AnthropicDefaultClient implements SendingClient {\n\tconstructor(private client = new Anthropic()) {}\n\n\tasync send(request: any): Promise<any> {\n\t\treturn await this.client.messages.create(request)\n\t}\n}\n","import { SendingClient } from \"@core/endpoint/client\"\nimport Anthropic from \"@anthropic-ai/sdk\"\n\nexport class AnthropicParserClient implements SendingClient {\n\tconstructor(private client = new Anthropic()) {}\n\n\tasync send(request: any): Promise<any> {\n\t\treturn await this.client.beta.messages.parse(request)\n\t}\n}\n","import { SendingClient } from \"@core/endpoint/client\"\nimport { AnthropicDefaultClient } from \"./default\"\nimport { AnthropicParserClient } from \"./parser\"\n\nexport class AnthropicClientResolver {\n\tstatic resolve(request: any): SendingClient {\n\t\treturn request.output_format ? new AnthropicParserClient() : new AnthropicDefaultClient()\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class ParsedOutputHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tif (providerResponse.parsed_output) {\n\t\t\tmozaikResponse.setResponseData(providerResponse.parsed_output)\n\t\t\treturn mozaikResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class ContentHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tconst content = providerResponse.content\n\t\t\t.filter((block: any) => block.type === \"text\")\n\t\t\t.map((block: any) => (block.type === \"text\" ? block.text : \"\"))\n\t\t\t.join(\"\")\n\n\t\tif (content) {\n\t\t\tmozaikResponse.setResponseData(content)\n\t\t\treturn mozaikResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","export class AnthropicModelPricing {\n\tprivate inputPricePer1MToken!: number\n\tprivate outputPricePer1MToken!: number\n\n\tcalculateTotalCost(inputTokens: number, outputTokens: number): number {\n\t\tconst inputCost = (inputTokens * this.inputPricePer1MToken) / 1_000_000\n\t\tconst outputCost = (outputTokens * this.outputPricePer1MToken) / 1_000_000\n\t\treturn inputCost + outputCost\n\t}\n\n\tgetPriceInUsd(modelName: string, inputTokens: number, outputTokens: number): number {\n\t\tif (modelName.startsWith(\"claude-sonnet-4-5\")) {\n\t\t\tthis.inputPricePer1MToken = 3\n\t\t\tthis.outputPricePer1MToken = 15\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens)\n\t\t} else if (modelName.startsWith(\"claude-haiku-4-5\")) {\n\t\t\tthis.inputPricePer1MToken = 1\n\t\t\tthis.outputPricePer1MToken = 5\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens)\n\t\t} else if (modelName.startsWith(\"claude-opus-4-5\")) {\n\t\t\tthis.inputPricePer1MToken = 5\n\t\t\tthis.outputPricePer1MToken = 25\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens)\n\t\t}\n\n\t\tthrow new Error(`Model name ${modelName} is not supported for this pricing`)\n\t}\n}\n","import { Tool } from \"@/types/tool\"\nimport Anthropic from \"@anthropic-ai/sdk\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { AnthropicDefaultClient } from \"../client/default\"\nimport { MozaikResponse } from \"@core/response\"\nimport { UsageEntry } from \"@core/usage-entry\"\nimport { AnthropicModelPricing } from \"../model-pricing\"\n\nexport class ToolUseHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\tclient: AnthropicDefaultClient\n\ttools: Tool[]\n\trequest: any\n\n\tconstructor(request: any, tools: Tool[]) {\n\t\tsuper()\n\t\tthis.tools = tools\n\t\tthis.request = request\n\t\tthis.client = new AnthropicDefaultClient()\n\t}\n\n\tprivate async executeToolCalls(tools: Tool[], toolUseBlocks: Anthropic.ToolUseBlock[]): Promise<any[]> {\n\t\tconst results: any[] = []\n\n\t\tfor (const toolUse of toolUseBlocks) {\n\t\t\tconst tool = tools?.find((t) => t.name === toolUse.name)\n\n\t\t\tif (!tool) {\n\t\t\t\tresults.push({\n\t\t\t\t\ttype: \"tool_result\",\n\t\t\t\t\ttool_use_id: toolUse.id,\n\t\t\t\t\tcontent: JSON.stringify({ error: `Unknown tool: ${toolUse.name}` }),\n\t\t\t\t})\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst result = await tool.invoke(toolUse.input)\n\t\t\t\tresults.push({\n\t\t\t\t\ttype: \"tool_result\",\n\t\t\t\t\ttool_use_id: toolUse.id,\n\t\t\t\t\tcontent: JSON.stringify(result),\n\t\t\t\t})\n\t\t\t} catch (error: any) {\n\t\t\t\tresults.push({\n\t\t\t\t\ttype: \"tool_result\",\n\t\t\t\t\ttool_use_id: toolUse.id,\n\t\t\t\t\tcontent: JSON.stringify({ error: error.message }),\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn results\n\t}\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tlet providerResponse = mozaikResponse.providerResponse\n\n\t\twhile (providerResponse.stop_reason === \"tool_use\") {\n\t\t\tconst toolUseBlocks = providerResponse.content.filter(\n\t\t\t\t(block: any): block is Anthropic.ToolUseBlock => block.type === \"tool_use\",\n\t\t\t)\n\n\t\t\t// Add assistant's response to messages\n\t\t\tthis.request.messages.push({\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: providerResponse.content,\n\t\t\t})\n\n\t\t\tconst toolResults = await this.executeToolCalls(this.tools, toolUseBlocks)\n\n\t\t\t// Add tool results as user message\n\t\t\tthis.request.messages.push({\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: toolResults,\n\t\t\t})\n\n\t\t\t// Call model again\n\t\t\tconst toolCallingResponse = await this.client.send(this.request)\n\n\t\t\tconst usage = toolCallingResponse.usage\n\t\t\tconst anthropicModelPricing = new AnthropicModelPricing()\n\t\t\tconst totalCost = anthropicModelPricing.getPriceInUsd(\n\t\t\t\tproviderResponse.model,\n\t\t\t\tusage.input_tokens,\n\t\t\t\tusage.output_tokens,\n\t\t\t)\n\n\t\t\tmozaikResponse.addUsageEntry(new UsageEntry(totalCost, toolCallingResponse.model.name))\n\t\t\tmozaikResponse.setProviderResponse(toolCallingResponse)\n\t\t\tproviderResponse = toolCallingResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { UsageEntry } from \"@core/usage-entry\"\nimport { AnthropicModelPricing } from \"../model-pricing\"\n\nexport class UsageHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tconst usage = providerResponse.usage\n\n\t\tconst anthropicModelPricing = new AnthropicModelPricing()\n\t\tconst totalCost = anthropicModelPricing.getPriceInUsd(\n\t\t\tproviderResponse.model,\n\t\t\tusage.input_tokens,\n\t\t\tusage.output_tokens,\n\t\t)\n\t\tif (usage) {\n\t\t\tmozaikResponse.addUsageEntry(new UsageEntry(totalCost, providerResponse.model))\n\t\t}\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class UnhandledResponseHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tconst id = providerResponse?.id ?? \"unknown\"\n\t\tconst model = providerResponse?.model ?? \"unknown\"\n\n\t\tthrow new Error(`No response handler matched. response_id=${id} model=${model}`)\n\t}\n}\n","import { Endpoint } from \"@core/endpoint/endpoint\"\nimport { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { AnthropicRequestBuilder } from \"./builder\"\nimport { AnthropicClientResolver } from \"./client/resolver\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { ParsedOutputHandler } from \"./response-handler/parsed-output\"\nimport { ContentHandler } from \"./response-handler/content\"\nimport { ToolUseHandler } from \"./response-handler/tool-use\"\nimport { MozaikRequest } from \"@/types/request\"\nimport { MozaikResponse } from \"@core/response\"\nimport { UsageHandler } from \"./response-handler/usage\"\nimport { UnhandledResponseHandler } from \"./response-handler/undhandled\"\n\nexport class AnthropicEndpoint extends Endpoint {\n\trequestBuilder: RequestBuilder = new AnthropicRequestBuilder()\n\n\tasync sendRequest(mozaikRequest: MozaikRequest): Promise<any> {\n\t\tconst providerRequest = this.buildRequest(mozaikRequest)\n\t\tconst client = AnthropicClientResolver.resolve(providerRequest)\n\t\tconst response = await client.send(providerRequest)\n\n\t\tconst mozaikResponse = new MozaikResponse()\n\t\tmozaikResponse.setProviderResponse(response)\n\n\t\t// response handler (chain of responsibilities)\n\t\tconst usageHandler: ResponseHandler = new UsageHandler()\n\t\tconst toolUseHandler: ResponseHandler = new ToolUseHandler(\n\t\t\tproviderRequest,\n\t\t\tmozaikRequest.tools ? mozaikRequest.tools : [],\n\t\t)\n\t\tconst parsedOutputHandler: ResponseHandler = new ParsedOutputHandler()\n\t\tconst contentHandler: ResponseHandler = new ContentHandler()\n\t\tconst unhandledResponseHandler: ResponseHandler = new UnhandledResponseHandler()\n\n\t\tusageHandler\n\t\t\t.setNextHandler(toolUseHandler)\n\t\t\t.setNextHandler(parsedOutputHandler)\n\t\t\t.setNextHandler(contentHandler)\n\t\t\t.setNextHandler(unhandledResponseHandler)\n\n\t\tconst responseHandler = usageHandler\n\n\t\tconst result = await responseHandler.handle(mozaikResponse)\n\n\t\treturn result.getResponse()\n\t}\n}\n","import { EndpointResolver } from \"@core/endpoint/endpoint-resolver\"\nimport { Endpoint } from \"@core/endpoint/endpoint\"\nimport { OPENAI_MODELS, ANTHROPIC_MODELS } from \"@/types/model\"\nimport { OpenAIResponses } from \"./openai/endpoint\"\nimport { AnthropicEndpoint } from \"./anthropic/endpoint\"\n\nexport class DefaultEndpointResolver extends EndpointResolver {\n\tisOpenAIModel(value: string): boolean {\n\t\treturn (OPENAI_MODELS as readonly string[]).includes(value)\n\t}\n\n\tisAnthropicModel(value: string): boolean {\n\t\treturn (ANTHROPIC_MODELS as readonly string[]).includes(value)\n\t}\n\n\tresolve(model: string): Endpoint {\n\t\tif (this.isOpenAIModel(model)) {\n\t\t\treturn new OpenAIResponses()\n\t\t} else if (this.isAnthropicModel(model)) {\n\t\t\treturn new AnthropicEndpoint()\n\t\t}\n\n\t\tthrow new Error(\"Provider not found\")\n\t}\n}\n","import { RequestGateway } from \"@core/endpoint/request-gateway\"\nimport { MozaikRequest } from \"@/types/request\"\nimport { DefaultEndpointResolver } from \"@providers/endpoint-resolver\"\nimport { ZodObject } from \"zod\"\nimport { Model } from \"@/types/model\"\nimport { Message } from \"@/types/message\"\n\nexport class MozaikAgent {\n\tprivate request: MozaikRequest\n\tgateway: RequestGateway = new RequestGateway(new DefaultEndpointResolver())\n\n\tconstructor(request: MozaikRequest) {\n\t\tthis.request = request\n\t}\n\n\tsetModel(model: Model) {\n\t\tthis.request.model = model\n\t}\n\n\tsetMessages(messages: Message[]) {\n\t\tthis.request.messages = messages\n\t}\n\n\tsetTask(task: string) {\n\t\tthis.request.task = task\n\t}\n\n\tsetStructuredOutput(schema: ZodObject<any>) {\n\t\tthis.request.structuredOutput = schema\n\t}\n\n\tasync act(task?: string) {\n\t\tif (task) {\n\t\t\tthis.request.task = task\n\t\t}\n\t\treturn await this.gateway.invoke(this.request)\n\t}\n}\n","import z from \"zod\"\nimport { ANTHROPIC_MODELS, OPENAI_MODELS } from \"@/types/model\"\nimport { PlanNode } from \"@/types/plan\"\n\nconst ModelSchema = z.enum([...OPENAI_MODELS, ...ANTHROPIC_MODELS])\n\nconst TaskPlanNodeSchema = z.object({\n\tkind: z.literal(\"task\"),\n\ttask: z.string(),\n\tmodel: ModelSchema,\n})\n\nconst WorkflowPlanNodeSchema: z.ZodType<Extract<PlanNode, { kind: \"workflow\" }>> = z.lazy(() =>\n\tz.object({\n\t\tkind: z.literal(\"workflow\"),\n\t\tmode: z.enum([\"sequential\", \"parallel\"]),\n\t\tunits: z.array(PlanNodeSchema),\n\t}),\n)\n\nconst PlanNodeSchema: z.ZodType<PlanNode> = TaskPlanNodeSchema.or(WorkflowPlanNodeSchema)\n\nexport const PlanSchema = z.object({\n\troot: PlanNodeSchema,\n})\n","import { Workflow } from \"@core/workflow/workflow\"\nimport { WorkflowExecutionStrategy } from \"@core/workflow/execution/strategy\"\nimport { ExecutionHook } from \"../hooks/execution-hook\"\n\nexport class ParallelExecution implements WorkflowExecutionStrategy {\n\tasync execute(workflow: Workflow, hook: ExecutionHook): Promise<any> {\n\t\tconst promises = []\n\t\tfor (const u of workflow.units) {\n\t\t\tpromises.push(u.execute(hook))\n\t\t}\n\n\t\tconst results = await Promise.all(promises)\n\n\t\treturn results\n\t}\n}\n","import { ExecutionHook } from \"../hooks/execution-hook\"\nimport { Workflow } from \"../workflow\"\nimport { WorkflowExecutionStrategy } from \"./strategy\"\n\nexport class SequentalExecution implements WorkflowExecutionStrategy {\n\tasync execute(workflow: Workflow, hook: ExecutionHook): Promise<any> {\n\t\tconst results = []\n\t\tfor (const u of workflow.units) {\n\t\t\tresults.push(await u.execute(hook))\n\t\t}\n\n\t\treturn results\n\t}\n}\n","import { ParallelExecution } from \"./parallel\"\nimport { SequentalExecution } from \"./sequential\"\nimport { WorkflowExecutionStrategy } from \"./strategy\"\n\nexport class ExecutionStrategyFactory {\n\tstatic create(mode: string): WorkflowExecutionStrategy {\n\t\tlet strategy: WorkflowExecutionStrategy\n\t\tif (mode == \"parallel\") {\n\t\t\tstrategy = new ParallelExecution()\n\t\t} else {\n\t\t\tstrategy = new SequentalExecution()\n\t\t}\n\n\t\treturn strategy\n\t}\n}\n","import { Task } from \"../task\"\nimport { Workflow } from \"../workflow\"\nimport { ExecutionHook } from \"./execution-hook\"\n\nexport class ClusterHook implements ExecutionHook {\n\tconstructor(private hooks: ExecutionHook[]) {}\n\n\tbeforeTask(task: Task): void {\n\t\tthis.hooks.forEach((h) => h.beforeTask(task))\n\t}\n\n\tafterTask(task: Task, result: any): void {\n\t\tthis.hooks.forEach((h) => h.afterTask(task, result))\n\t}\n\n\tbeforeWorkflow(wf: Workflow) {\n\t\tthis.hooks.forEach((h) => h.beforeWorkflow(wf))\n\t}\n\n\tafterWorkflow(wf: Workflow, result: any) {\n\t\tthis.hooks.forEach((h) => h.afterWorkflow(wf, result))\n\t}\n}\n","import { Task } from \"../task\"\nimport { Workflow } from \"../workflow\"\nimport { ExecutionHook } from \"./execution-hook\"\n\nexport class Logger implements ExecutionHook {\n\tbeforeWorkflow(workflow: Workflow) {\n\t\tconsole.log(`[Workflow:start], Mode: ${workflow.mode}`)\n\t}\n\n\tafterWorkflow(workflow: Workflow) {\n\t\tconsole.log(`[Workflow:end], Mode: ${workflow.mode}`)\n\t}\n\n\tbeforeTask(task: Task) {\n\t\tconsole.log(`[Task:end]: Model: ${task.getModel()} Task: ${task.getTask()}`)\n\t}\n\n\tafterTask(task: Task, result: any) {\n\t\tconsole.log(`[Task:end]: Model: ${task.getModel()} Task: ${task.getTask()}`)\n\t}\n}\n","import { ClusterHook } from \"./cluster\"\nimport { ExecutionHook } from \"./execution-hook\"\nimport { Logger } from \"./logger\"\n\nconst loggingHook: ExecutionHook = new Logger()\n\nconst defaultHooks = [loggingHook]\nconst clusterHook: ExecutionHook = new ClusterHook(defaultHooks)\n\nexport const DEFAULT_CLUSTER_HOOK = clusterHook\n","import { WorkUnit } from \"@core/workflow/work-unit\"\nimport { ExecutionStrategyFactory } from \"@core/workflow/execution/strategy-factory\"\nimport { WorkflowExecutionStrategy } from \"@core/workflow/execution/strategy\"\nimport { ExecutionHook } from \"./hooks/execution-hook\"\nimport { DEFAULT_CLUSTER_HOOK } from \"./hooks\"\n\nexport class Workflow extends WorkUnit {\n\tconstructor(\n\t\treadonly mode: \"parallel\" | \"sequential\",\n\t\treadonly units: WorkUnit[],\n\t) {\n\t\tsuper()\n\t}\n\n\tasync execute(hook: ExecutionHook = DEFAULT_CLUSTER_HOOK): Promise<any> {\n\t\thook.beforeWorkflow(this)\n\n\t\tconst executionStrategy: WorkflowExecutionStrategy = ExecutionStrategyFactory.create(this.mode)\n\t\tconst result = await executionStrategy.execute(this, hook)\n\n\t\thook.afterWorkflow(this, result)\n\t\treturn result\n\t}\n}\n","import { Model, MozaikRequest, MozaikAgent } from \"@/index\"\nimport { WorkUnit } from \"@core/workflow/work-unit\"\nimport { ExecutionHook } from \"./hooks/execution-hook\"\nimport { DEFAULT_CLUSTER_HOOK } from \"./hooks\"\n\nexport class Task extends WorkUnit {\n\tconstructor(\n\t\tprivate task: string,\n\t\tprivate model: Model,\n\t) {\n\t\tsuper()\n\t}\n\n\tgetTask() {\n\t\treturn this.task\n\t}\n\n\tgetModel() {\n\t\treturn this.model\n\t}\n\n\tasync execute(hook: ExecutionHook = DEFAULT_CLUSTER_HOOK): Promise<any> {\n\t\thook.beforeTask(this)\n\n\t\tconst request: MozaikRequest = {\n\t\t\tmodel: this.model,\n\t\t\ttask: this.task,\n\t\t}\n\n\t\tconst agent = new MozaikAgent(request)\n\t\tconst result = await agent.act(this.task)\n\n\t\thook.afterTask(this, result)\n\t\treturn result\n\t}\n}\n","import { Plan, PlanNode } from \"@/types/plan\"\nimport { Workflow } from \"./workflow\"\nimport { WorkUnit } from \"./work-unit\"\nimport { Task } from \"./task\"\n\nexport class PlanWorkflowMapper {\n\tstatic fromPlan(plan: Plan): Workflow {\n\t\treturn this.fromNode(plan.root)\n\t}\n\n\tprivate static fromNode(node: PlanNode): Workflow {\n\t\tif (node.kind !== \"workflow\") {\n\t\t\tthrow new Error(\"Root must be workflow\")\n\t\t}\n\n\t\treturn new Workflow(node.mode, node.units.map(this.mapNode))\n\t}\n\n\tprivate static mapNode(node: PlanNode): WorkUnit {\n\t\tif (node.kind === \"task\") {\n\t\t\treturn new Task(node.task, node.model)\n\t\t}\n\n\t\treturn new Workflow(node.mode, node.units.map(this.mapNode))\n\t}\n}\n","import { Plan } from \"@/types/plan\"\nimport { Workflow } from \"@core/workflow/workflow\"\nimport { MozaikAgent } from \"./agent\"\nimport { MozaikRequest } from \"@/types/request\"\nimport { PlanSchema } from \"@core/workflow/schema/plan\"\nimport { PlanWorkflowMapper } from \"@core/workflow/mapper\"\n\nconst PROMPT = `You are a planner.\n\nRules:\n- Use 'parallel' for the task that can be run in parallel.\n- Pick model based on the task complexity\n- Keep prompts actionable.\n- Don't ask user for any input, just do the thing with available data you have.\n`\n\nexport class PlanningAgent extends MozaikAgent {\n\tconstructor(request: MozaikRequest) {\n\t\tsuper(request)\n\t}\n\n\tasync planFromGoal(goal: string): Promise<Workflow> {\n\t\tthis.setStructuredOutput(PlanSchema)\n\t\tconst plan: Plan = await this.act(`${PROMPT}\\nGoal: ${goal}`)\n\t\treturn PlanWorkflowMapper.fromPlan(plan)\n\t}\n}\n"],"mappings":"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","names":["OpenAI","Anthropic","ContentHandler","UsageHandler","UsageHandler","ContentHandler"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/workflow/work-unit.ts","../src/core/endpoint/request-gateway.ts","../src/core/endpoint/endpoint-resolver.ts","../src/types/model.ts","../src/core/request-handler/capability.ts","../src/core/request-handler/messages.ts","../src/core/request-handler/task.ts","../src/core/request-handler/model.ts","../src/core/request-handler/structured-output.ts","../src/core/request-handler/tools.ts","../src/core/endpoint/endpoint.ts","../src/core/endpoint/request-builder.ts","../src/providers/openai/mapper.ts","../src/providers/openai/builder.ts","../src/providers/openai/client/default.ts","../src/providers/openai/client/parser.ts","../src/providers/openai/client/resolver.ts","../src/core/endpoint/response-handler.ts","../src/providers/openai/response-handler/output-parsed.ts","../src/providers/openai/response-handler/content.ts","../src/providers/openai/response-handler/output-text.ts","../src/core/usage-entry.ts","../src/providers/openai/model-pricing.ts","../src/providers/openai/response-handler/function-calls.ts","../src/core/response.ts","../src/providers/openai/response-handler/usage.ts","../src/providers/openai/endpoint.ts","../src/providers/anthropic/mapper.ts","../src/providers/anthropic/builder.ts","../src/providers/anthropic/client/default.ts","../src/providers/anthropic/client/parser.ts","../src/providers/anthropic/client/resolver.ts","../src/providers/anthropic/response-handler/parsed-output.ts","../src/providers/anthropic/response-handler/content.ts","../src/providers/anthropic/model-pricing.ts","../src/providers/anthropic/response-handler/tool-use.ts","../src/providers/anthropic/response-handler/usage.ts","../src/providers/anthropic/response-handler/undhandled.ts","../src/providers/anthropic/endpoint.ts","../src/providers/endpoint-resolver.ts","../src/core/agents/agent.ts","../src/core/workflow/schema/plan.ts","../src/core/workflow/execution/parallel.ts","../src/core/workflow/execution/sequential.ts","../src/core/workflow/execution/strategy-factory.ts","../src/core/workflow/hooks/cluster.ts","../src/core/workflow/hooks/logger.ts","../src/core/workflow/hooks/index.ts","../src/core/workflow/workflow.ts","../src/core/workflow/task.ts","../src/core/workflow/mapper.ts","../src/core/agents/planner.ts"],"sourcesContent":["import { ExecutionHook } from \"./hooks/execution-hook\"\n\nexport abstract class WorkUnit {\n\tconstructor() {}\n\n\tabstract execute(hook: ExecutionHook): Promise<any>\n}\n","import { MozaikRequest } from \"@/types/request\"\nimport { Endpoint } from \"./endpoint\"\nimport { EndpointResolver } from \"./endpoint-resolver\"\n\nexport class RequestGateway {\n\tendpoint!: Endpoint\n\n\tconstructor(readonly endpointResolver: EndpointResolver) {}\n\n\tasync invoke(request: MozaikRequest): Promise<any> {\n\t\tthis.endpoint = this.endpointResolver.resolve(request.model)\n\t\treturn await this.endpoint.sendRequest(request)\n\t}\n}\n","import { Endpoint } from \"./endpoint\"\n\nexport abstract class EndpointResolver {\n\tabstract resolve(model: string): Endpoint\n}\n","export const OPENAI_MODELS = [\"gpt-5\", \"gpt-5-mini\", \"gpt-5-nano\", \"gpt-5.1\", \"gpt-5.2\", \"gpt-5.4\"] as const\n\nexport type OpenAIModel = (typeof OPENAI_MODELS)[number]\n\nconst latest_sonnet = \"claude-sonnet-4-5-20250929\"\nconst latest_haiku = \"claude-haiku-4-5-20251001\"\nconst latest_opus = \"claude-opus-4-5-20251101\"\n\nexport const ANTHROPIC_MODELS = [\"claude-sonnet-4.5\", \"claude-haiku-4.5\", \"claude-opus-4.5\"] as const\n\nexport const ANTHROPIC_MODEL_MAP = {\n\t\"claude-sonnet-4.5\": latest_sonnet,\n\t\"claude-haiku-4.5\": latest_haiku,\n\t\"claude-opus-4.5\": latest_opus,\n} as const\n\nexport type AnthropicModel = (typeof ANTHROPIC_MODELS)[number]\n\nexport type Model = OpenAIModel | AnthropicModel\n","import { MozaikRequest } from \"@/types/request\"\nimport { RequestBuilder } from \"../endpoint/request-builder\"\n\nexport abstract class CapabilityHandler {\n\tabstract nextHandler: CapabilityHandler\n\n\tsetNextHandler(capability: CapabilityHandler): CapabilityHandler {\n\t\tthis.nextHandler = capability\n\t\treturn this.nextHandler\n\t}\n\n\tabstract apply(request: MozaikRequest, requestBuilder: RequestBuilder): any\n\n\thandle(request: MozaikRequest, builder: RequestBuilder) {\n\t\tthis.apply(request, builder)\n\n\t\tif (this.nextHandler) {\n\t\t\tthis.nextHandler.handle(request, builder)\n\t\t}\n\t}\n}\n","import { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { CapabilityHandler } from \"./capability\"\nimport { MozaikRequest } from \"@/types/request\"\n\nexport class MessagesHandler extends CapabilityHandler {\n\tnextHandler!: CapabilityHandler\n\n\tapply(request: MozaikRequest, builder: RequestBuilder) {\n\t\tif (request.messages) {\n\t\t\tbuilder.addMessages(request.messages)\n\t\t}\n\t}\n}\n","import { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { CapabilityHandler } from \"./capability\"\nimport { MozaikRequest } from \"@/types/request\"\n\nexport class TaskHandler extends CapabilityHandler {\n\tnextHandler!: CapabilityHandler\n\n\tapply(request: MozaikRequest, builder: RequestBuilder) {\n\t\tif (request.task) {\n\t\t\tbuilder.addTask(request.task)\n\t\t}\n\t}\n}\n","import { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { CapabilityHandler } from \"./capability\"\nimport { MozaikRequest } from \"@/types/request\"\n\nexport class ModelHandler extends CapabilityHandler {\n\tnextHandler!: CapabilityHandler\n\n\tapply(request: MozaikRequest, builder: RequestBuilder) {\n\t\tif (request.model) {\n\t\t\tbuilder.addModel(request.model)\n\t\t}\n\t}\n}\n","import { MozaikRequest } from \"@/types/request\"\nimport { CapabilityHandler } from \"./capability\"\nimport { RequestBuilder } from \"@core/endpoint/request-builder\"\n\nexport class StructuredOutputlHandler extends CapabilityHandler {\n\tnextHandler!: CapabilityHandler\n\n\tapply(request: MozaikRequest, builder: RequestBuilder) {\n\t\tif (request.structuredOutput) {\n\t\t\tbuilder.addStructuredOutput(request.structuredOutput)\n\t\t}\n\t}\n}\n","import { MozaikRequest } from \"@/types/request\"\nimport { RequestBuilder } from \"../endpoint/request-builder\"\nimport { CapabilityHandler } from \"./capability\"\n\nexport class ToolsHandler extends CapabilityHandler {\n\tnextHandler!: CapabilityHandler\n\n\tapply(mozaikRequest: MozaikRequest, requestBuilder: RequestBuilder) {\n\t\tif (mozaikRequest.tools && mozaikRequest.tools.length > 0) {\n\t\t\trequestBuilder.addTools(mozaikRequest.tools)\n\t\t}\n\t}\n}\n","import { RequestBuilder } from \"./request-builder\"\nimport { CapabilityHandler } from \"../request-handler/capability\"\nimport { MessagesHandler } from \"../request-handler/messages\"\nimport { TaskHandler } from \"../request-handler/task\"\nimport { ModelHandler } from \"../request-handler/model\"\nimport { StructuredOutputlHandler } from \"../request-handler/structured-output\"\nimport { MozaikRequest } from \"@/types/request\"\nimport { ToolsHandler } from \"../request-handler/tools\"\n\nexport abstract class Endpoint {\n\tabstract requestBuilder: RequestBuilder\n\trequest: MozaikRequest | null = null\n\n\tbuildRequest(request: MozaikRequest): any {\n\t\tthis.request = request\n\n\t\tthis.requestBuilder.initialize()\n\n\t\tconst messagesHandler: CapabilityHandler = new MessagesHandler()\n\t\tconst taskHandler: CapabilityHandler = new TaskHandler()\n\t\tconst modelHandler: CapabilityHandler = new ModelHandler()\n\t\tconst structuredOutputHandler: CapabilityHandler = new StructuredOutputlHandler()\n\t\tconst toolsHandler: CapabilityHandler = new ToolsHandler()\n\n\t\tmessagesHandler\n\t\t\t.setNextHandler(taskHandler)\n\t\t\t.setNextHandler(modelHandler)\n\t\t\t.setNextHandler(structuredOutputHandler)\n\t\t\t.setNextHandler(toolsHandler)\n\n\t\tmessagesHandler.handle(request, this.requestBuilder)\n\n\t\treturn this.requestBuilder.build()\n\t}\n\n\tabstract sendRequest(providerRequest: any): any\n}\n","import { Message } from \"@/types/message\"\nimport { ReasoningEffort } from \"@/types/request\"\nimport { Tool } from \"@/types/tool\"\nimport { ZodObject } from \"zod\"\n\nexport abstract class RequestBuilder {\n\trequest: any\n\n\tinitialize() {\n\t\tthis.request = {}\n\t}\n\n\tabstract addModel(model: string): RequestBuilder\n\tabstract addTask(task: string): RequestBuilder\n\tabstract addMessages(messages: Message[]): RequestBuilder\n\tabstract addStructuredOutput(schema: ZodObject<any>): RequestBuilder\n\tabstract addTools(tools: Tool[]): RequestBuilder\n\tabstract addReasoningEffort(effort: ReasoningEffort): RequestBuilder\n\n\tbuild() {\n\t\treturn this.request\n\t}\n}\n","import { Message } from \"@/types/message\"\nimport { Tool } from \"@/types/tool\"\n\nexport interface ToolDefinition {\n\ttype: \"function\"\n\tname: string\n\tdescription: string\n\tparameters: any\n\tstrict?: boolean\n}\n\nexport class OpenAIResponsesMapper {\n\t/**\n\t * Convert domain Messages to Responses API instructions format\n\t *\n\t * The Responses API uses 'instructions' (system prompt) rather than messages array.\n\t * For multi-turn conversations, use conversation.id or previous_response_id parameters.\n\t */\n\ttoInstructions(messages: Message[]): string {\n\t\tif (messages.length === 0) {\n\t\t\tthrow new Error(\"[ResponsesMapper] Cannot create instructions from empty messages\")\n\t\t}\n\n\t\t// Find system message if exists, otherwise use first user message as context\n\t\tconst systemMessage = messages.find((m) => m.role === \"system\")\n\n\t\tif (systemMessage) {\n\t\t\treturn typeof systemMessage.content === \"string\"\n\t\t\t\t? systemMessage.content\n\t\t\t\t: this.extractTextFromContent(systemMessage.content)\n\t\t}\n\n\t\t// Fallback: create instructions from context\n\t\treturn \"You are a helpful assistant.\"\n\t}\n\n\t/**\n\t * Extract the user's input from messages\n\t * Returns the last user message content for use in prompt variables.\n\t * In Responses API, the actual user query is typically passed via prompt variables\n\t * or handled through conversation continuation.\n\t */\n\textractUserInput(messages: Message[]): string {\n\t\tconst userMessages = messages.filter((m) => m.role === \"user\")\n\n\t\tif (userMessages.length === 0) {\n\t\t\treturn \"\"\n\t\t}\n\n\t\tconst lastUserMessage = userMessages[userMessages.length - 1]\n\t\treturn typeof lastUserMessage.content === \"string\"\n\t\t\t? lastUserMessage.content\n\t\t\t: this.extractTextFromContent(lastUserMessage.content)\n\t}\n\n\tprivate extractTextFromContent(content: any[]): string {\n\t\treturn content\n\t\t\t.filter((part) => part.type === \"text\")\n\t\t\t.map((part) => part.text)\n\t\t\t.join(\" \")\n\t}\n\n\t/**\n\t * Map tools to Responses API format\n\t */\n\ttoTools(tools: Tool[]): ToolDefinition[] {\n\t\treturn tools.map((t) => ({\n\t\t\ttype: \"function\",\n\t\t\tname: t.name,\n\t\t\tdescription: t.description,\n\t\t\tparameters: t.schema,\n\t\t\tstrict: true, // Enable strict mode by default for better validation\n\t\t}))\n\t}\n}\n","import { Message } from \"@/types/message\"\nimport { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { OpenAIResponsesMapper } from \"./mapper\"\nimport { zodTextFormat } from \"openai/helpers/zod\"\nimport { ZodObject } from \"zod\"\nimport { Tool } from \"@/types/tool\"\nimport { ReasoningEffort } from \"@/types/request\"\n\nexport class OpenAIResponsesBuilder extends RequestBuilder {\n\n\tconstructor(private mapper = new OpenAIResponsesMapper()) {\n\t\tsuper()\n\t}\n\n\taddModel(model: string): RequestBuilder {\n\t\tthis.request.model = model\n\t\treturn this\n\t}\n\n\taddTask(task: string): RequestBuilder {\n\t\tthis.request.input = task\n\t\treturn this\n\t}\n\n\taddMessages(messages: Message[]): RequestBuilder {\n\t\tconst instructions = this.mapper.toInstructions(messages)\n\t\t// Set optional instructions if there's a system message\n\t\tif (instructions && instructions !== \"You are a helpful assistant.\") {\n\t\t\tthis.request.instructions = instructions\n\t\t}\n\n\t\treturn this\n\t}\n\n\taddStructuredOutput(schema: ZodObject): RequestBuilder {\n\t\tthis.request.text = {\n\t\t\tformat: zodTextFormat(schema, \"outputSchema\"),\n\t\t}\n\t\treturn this\n\t}\n\t\n\taddTools(tools: Tool[]): RequestBuilder {\n\t\tthis.request.tools = tools.map((tool) => ({\n\t\t\ttype: \"function\" as const,\n\t\t\tname: tool.name,\n\t\t\tdescription: tool.description,\n\t\t\tparameters: tool.schema,\n\t\t}))\n\t\treturn this\n\t}\n\n\taddReasoningEffort(effort: ReasoningEffort): RequestBuilder {\n\t\tlet reasoningEffort = ''\n\t\tif (effort === ReasoningEffort.NONE) {\n\t\t\treasoningEffort = 'none'\n\t\t} else if (effort === ReasoningEffort.LOW) {\n\t\t\treasoningEffort = \"low\"\n\t\t} else if (effort === ReasoningEffort.MEDIUM) {\n\t\t\treasoningEffort = \"medium\"\n\t\t} else if (effort === ReasoningEffort.HIGH) {\n\t\t\treasoningEffort = \"high\"\n\t\t} else if (effort === ReasoningEffort.MAX) {\n\t\t\treasoningEffort = \"xhigh\"\n\t\t}\n\n\t\tthis.request.reasoning = {\n\t\t\teffort: reasoningEffort\n\t\t}\n\n\t\treturn this\n\t}\n}\n","import OpenAI from \"openai\"\nimport { SendingClient } from \"@core/endpoint/client\"\n\nexport class OpenAIDefaultClient implements SendingClient {\n\tconstructor(private client = new OpenAI()) {}\n\n\tasync send(request: any): Promise<any> {\n\t\treturn await this.client.responses.create(request)\n\t}\n}\n","import OpenAI from \"openai\"\nimport { SendingClient } from \"@core/endpoint/client\"\n\nexport class OpenAIParserClient implements SendingClient {\n\tconstructor(private client = new OpenAI()) {}\n\n\tasync send(request: any): Promise<any> {\n\t\treturn await this.client.responses.parse(request)\n\t}\n}\n","import { SendingClient } from \"@core/endpoint/client\"\nimport { OpenAIDefaultClient } from \"./default\"\nimport { OpenAIParserClient } from \"./parser\"\n\nexport class OpenAIClientResolver {\n\tstatic resolve(request: any): SendingClient {\n\t\tif (request.text && request.text.format) {\n\t\t\treturn new OpenAIParserClient()\n\t\t} else {\n\t\t\treturn new OpenAIDefaultClient()\n\t\t}\n\t}\n}\n","import { MozaikResponse } from \"../response\"\n\nexport abstract class ResponseHandler {\n\tabstract nextHandler: ResponseHandler\n\n\tsetNextHandler(responseHandler: ResponseHandler): ResponseHandler {\n\t\tthis.nextHandler = responseHandler\n\t\treturn this.nextHandler\n\t}\n\n\tabstract handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse>\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class OutputParsedHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tif (providerResponse.output_parsed) {\n\t\t\tmozaikResponse.setResponseData(providerResponse.output_parsed)\n\t\t\treturn mozaikResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class ContentHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tconst firstOutput = providerResponse.output?.[0]\n\t\tif (firstOutput && \"content\" in firstOutput) {\n\t\t\tconst firstContent = firstOutput.content?.[0]\n\t\t\tif (firstContent && \"text\" in firstContent) {\n\t\t\t\tmozaikResponse.setResponseData(firstContent.text)\n\t\t\t\treturn mozaikResponse\n\t\t\t}\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class OutputTextHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tif (providerResponse.output_text) {\n\t\t\tmozaikResponse.setResponseData(providerResponse.output_text)\n\t\t\treturn mozaikResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","export class UsageEntry {\n\tpriceInUsd: number\n\tmodel: string\n\n\tconstructor(priceInUsd: number, model: string) {\n\t\tthis.priceInUsd = priceInUsd\n\t\tthis.model = model\n\t}\n}\n","export class OpenAIModelPricing {\n\tprivate inputPricePer1MToken!: number\n\tprivate outputPricePer1MToken!: number\n\tprivate cachedPricePer1MToken!: number\n\n\tcalculateTotalCost(inputTokens: number, outputTokens: number, cachedInputTokens: number): number {\n\t\tconst inputCost = ((inputTokens - cachedInputTokens) * this.inputPricePer1MToken) / 1_000_000\n\t\tconst outputCost = (outputTokens * this.outputPricePer1MToken) / 1_000_000\n\t\tconst cachedCost = (cachedInputTokens * this.cachedPricePer1MToken) / 1_000_000\n\t\treturn inputCost + outputCost + cachedCost\n\t}\n\n\tgetPriceInUsd(modelName: string, inputTokens: number, outputTokens: number, cachedInputTokens: number): number {\n\t\tif (modelName.startsWith(\"gpt-5-mini\")) {\n\t\t\tthis.inputPricePer1MToken = 0.25\n\t\t\tthis.outputPricePer1MToken = 2\n\t\t\tthis.cachedPricePer1MToken = 0.025\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens, cachedInputTokens)\n\t\t} else if (modelName.startsWith(\"gpt-5-nano\")) {\n\t\t\tthis.inputPricePer1MToken = 0.05\n\t\t\tthis.outputPricePer1MToken = 0.4\n\t\t\tthis.cachedPricePer1MToken = 0.005\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens, cachedInputTokens)\n\t\t} else if (modelName.startsWith(\"gpt-5.1\")) {\n\t\t\tthis.inputPricePer1MToken = 1.25\n\t\t\tthis.outputPricePer1MToken = 10\n\t\t\tthis.cachedPricePer1MToken = 0.125\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens, cachedInputTokens)\n\t\t} else if (modelName.startsWith(\"gpt-5\")) {\n\t\t\tthis.inputPricePer1MToken = 1.25\n\t\t\tthis.outputPricePer1MToken = 10\n\t\t\tthis.cachedPricePer1MToken = 0.125\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens, cachedInputTokens)\n\t\t}\n\n\t\tthrow new Error(`Model name ${modelName} is not supported for this pricing`)\n\t}\n}\n","import { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { OpenAIDefaultClient } from \"../client/default\"\nimport { Tool } from \"@/types/tool\"\nimport { MozaikResponse } from \"@core/response\"\nimport { UsageEntry } from \"@core/usage-entry\"\nimport { OpenAIModelPricing } from \"@providers/openai/model-pricing\"\n\nexport interface ToolCall {\n\tcall_id: string\n\tname: string\n\targuments: string | Record<string, any>\n}\n\nexport interface ToolResult {\n\ttype: \"function_call_output\"\n\tcall_id: string\n\toutput: string\n}\n\nexport class FunctionCallsHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\tclient: OpenAIDefaultClient\n\ttools: Tool[]\n\trequest: any\n\n\tconstructor(request: any, tools: Tool[]) {\n\t\tsuper()\n\t\tthis.request = request\n\t\tthis.tools = tools\n\t\tthis.client = new OpenAIDefaultClient()\n\t}\n\n\tprivate hasToolCalls(response: any): boolean {\n\t\treturn response.output?.some((item: any) => item.type === \"function_call\")\n\t}\n\n\tprivate extractToolCalls(response: any): any[] {\n\t\treturn response.output?.filter((item: any) => item.type === \"function_call\") || []\n\t}\n\n\tprivate resolveTool(call: ToolCall, tools: Tool[]): Tool | null {\n\t\treturn tools.find((t) => t.name === call.name) ?? null\n\t}\n\n\tprivate async executeTool(tool: Tool, rawArgs: ToolCall[\"arguments\"]): Promise<any> {\n\t\tconst args = typeof rawArgs === \"string\" ? JSON.parse(rawArgs) : rawArgs\n\n\t\treturn await tool.invoke(args)\n\t}\n\n\tprivate formatToolResult(callId: string, payload: any): ToolResult {\n\t\treturn {\n\t\t\ttype: \"function_call_output\",\n\t\t\tcall_id: callId,\n\t\t\toutput: JSON.stringify(payload),\n\t\t}\n\t}\n\n\tprivate async executeToolCalls(toolCalls: ToolCall[], tools: Tool[]): Promise<ToolResult[]> {\n\t\tconst results: ToolResult[] = []\n\n\t\tfor (const call of toolCalls) {\n\t\t\tconst tool = this.resolveTool(call, tools)\n\n\t\t\tif (!tool) {\n\t\t\t\tresults.push(\n\t\t\t\t\tthis.formatToolResult(call.call_id, {\n\t\t\t\t\t\terror: `Unknown tool: ${call.name}`,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst result = await this.executeTool(tool, call.arguments)\n\t\t\t\tresults.push(this.formatToolResult(call.call_id, result))\n\t\t\t} catch (err: any) {\n\t\t\t\tresults.push(\n\t\t\t\t\tthis.formatToolResult(call.call_id, {\n\t\t\t\t\t\terror: err.message ?? \"Tool execution failed\",\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\treturn results\n\t}\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tlet providerResponse = mozaikResponse.providerResponse\n\t\tlet toolCallingResponse: any\n\t\twhile (this.hasToolCalls(providerResponse)) {\n\t\t\tconst toolCalls = this.extractToolCalls(providerResponse)\n\n\t\t\tconst toolResults = await this.executeToolCalls(toolCalls, this.tools)\n\n\t\t\t// Continue the conversation with tool results\n\t\t\tthis.request.input = toolResults\n\t\t\tthis.request.previous_response_id = providerResponse.id\n\n\t\t\ttoolCallingResponse = await this.client.send(this.request)\n\n\t\t\tconst openAIModelPricing = new OpenAIModelPricing()\n\t\t\tconst usage = toolCallingResponse.usage\n\t\t\tconst totalCost = openAIModelPricing.getPriceInUsd(\n\t\t\t\tproviderResponse.model,\n\t\t\t\tusage.input_tokens,\n\t\t\t\tusage.output_tokens,\n\t\t\t\tusage.input_token_details?.cached_tokens ?? 0,\n\t\t\t)\n\n\t\t\tmozaikResponse.addUsageEntry(new UsageEntry(totalCost, providerResponse.model))\n\t\t\tmozaikResponse.setProviderResponse(toolCallingResponse)\n\t\t\tmozaikResponse.setResponseData(toolCallingResponse)\n\t\t\tproviderResponse = toolCallingResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { UsageEntry } from \"./usage-entry\"\n\nexport class MozaikResponse {\n\tproviderResponse: any\n\tresponseData?: any\n\tusageEntries: UsageEntry[] = []\n\n\tsetProviderResponse(providerResponse: any): MozaikResponse {\n\t\tthis.providerResponse = providerResponse\n\t\treturn this\n\t}\n\n\taddUsageEntry(usageEntry: UsageEntry): MozaikResponse {\n\t\tthis.usageEntries.push(usageEntry)\n\t\treturn this\n\t}\n\n\tsetResponseData(response: any): MozaikResponse {\n\t\tthis.responseData = response\n\t\treturn this\n\t}\n\n\tgetResponse(): any {\n\t\treturn {\n\t\t\tdata: this.responseData,\n\t\t\tusage: {\n\t\t\t\tentries: this.usageEntries,\n\t\t\t},\n\t\t\ttotalCost: this.usageEntries.reduce((acc, entry) => acc + entry.priceInUsd, 0),\n\t\t}\n\t}\n\n\tgetUsageEntries(): UsageEntry[] {\n\t\treturn this.usageEntries\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { UsageEntry } from \"@core/usage-entry\"\nimport { OpenAIModelPricing } from \"@providers/openai/model-pricing\"\n\nexport class UsageHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tconst usage = providerResponse.usage\n\n\t\tconst openAIModelPricing = new OpenAIModelPricing()\n\t\tconst totalCost = openAIModelPricing.getPriceInUsd(\n\t\t\tproviderResponse.model,\n\t\t\tusage.input_tokens,\n\t\t\tusage.output_tokens,\n\t\t\tusage.input_token_details?.cached_tokens ?? 0,\n\t\t)\n\n\t\tmozaikResponse.addUsageEntry(new UsageEntry(totalCost, providerResponse.model))\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { Endpoint } from \"@core/endpoint/endpoint\"\nimport { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { OpenAIResponsesBuilder } from \"./builder\"\nimport { OpenAIClientResolver } from \"./client/resolver\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { OutputParsedHandler } from \"./response-handler/output-parsed\"\nimport { ContentHandler } from \"./response-handler/content\"\nimport { OutputTextHandler } from \"./response-handler/output-text\"\nimport { FunctionCallsHandler } from \"./response-handler/function-calls\"\nimport { MozaikRequest } from \"@/types/request\"\nimport { MozaikResponse } from \"@core/response\"\nimport { UsageHandler } from \"./response-handler/usage\"\n\nexport class OpenAIResponses extends Endpoint {\n\trequestBuilder: RequestBuilder = new OpenAIResponsesBuilder()\n\n\tconstructor() {\n\t\tsuper()\n\t}\n\n\tasync sendRequest(mozaikRequest: MozaikRequest): Promise<any> {\n\t\ttry {\n\t\t\tconst request = this.buildRequest(mozaikRequest)\n\t\t\tconst client = OpenAIClientResolver.resolve(request)\n\t\t\tconst response = await client.send(request)\n\n\t\t\tconst mozaikResponse = new MozaikResponse()\n\t\t\tmozaikResponse.setProviderResponse(response)\n\n\t\t\t// response handler (chain of responsibilities)\n\t\t\tconst usageHandler: ResponseHandler = new UsageHandler()\n\t\t\tconst functionCallsHandler: ResponseHandler = new FunctionCallsHandler(\n\t\t\t\trequest,\n\t\t\t\tmozaikRequest.tools ? mozaikRequest.tools : [],\n\t\t\t)\n\t\t\tconst outputParsedHandler: ResponseHandler = new OutputParsedHandler()\n\t\t\tconst outputTextHandler: ResponseHandler = new OutputTextHandler()\n\t\t\tconst contentHandler: ResponseHandler = new ContentHandler()\n\n\t\t\tusageHandler\n\t\t\t\t.setNextHandler(functionCallsHandler)\n\t\t\t\t.setNextHandler(outputParsedHandler)\n\t\t\t\t.setNextHandler(outputTextHandler)\n\t\t\t\t.setNextHandler(contentHandler)\n\n\t\t\tconst responseHandler = usageHandler\n\n\t\t\tconst result: MozaikResponse = await responseHandler.handle(mozaikResponse)\n\n\t\t\treturn result.getResponse()\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"[OpenAIProvider] Responses API request failed:\", error)\n\t\t\tthrow error\n\t\t}\n\t}\n}\n","import { Message, TextPart, ImagePart } from \"@/types/message\"\nimport type { MessageParam, TextBlockParam, ImageBlockParam } from \"@anthropic-ai/sdk/resources/messages\"\n\nexport class AnthropicMapper {\n\t/**\n\t * Transforms domain messages to Anthropic API format.\n\t * Separates system messages from conversation messages.\n\t */\n\ttoMessages(messages: Message[]): { messages: MessageParam[]; system?: string } {\n\t\tconst anthropicMessages: MessageParam[] = []\n\t\tlet systemPrompt: string | undefined\n\n\t\tfor (const msg of messages) {\n\t\t\t// Extract system messages separately (Anthropic uses dedicated system parameter)\n\t\t\tif (msg.role === \"system\") {\n\t\t\t\tconst content =\n\t\t\t\t\ttypeof msg.content === \"string\"\n\t\t\t\t\t\t? msg.content\n\t\t\t\t\t\t: (msg.content as TextPart[]).map((p) => p.text).join(\"\\n\")\n\n\t\t\t\tsystemPrompt = systemPrompt ? `${systemPrompt}\\n\\n${content}` : content\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Skip tool role messages (not directly supported in basic implementation)\n\t\t\tif (msg.role === \"tool\") {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Map user and assistant messages\n\t\t\tif (msg.role === \"user\" || msg.role === \"assistant\") {\n\t\t\t\tif (typeof msg.content === \"string\") {\n\t\t\t\t\tanthropicMessages.push({\n\t\t\t\t\t\trole: msg.role,\n\t\t\t\t\t\tcontent: msg.content,\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\t// Handle multimodal content (text + images)\n\t\t\t\t\tconst contentBlocks = (msg.content as Array<TextPart | ImagePart>).map((part) => {\n\t\t\t\t\t\tif (part.type === \"text\") {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\t\ttext: part.text,\n\t\t\t\t\t\t\t} as TextBlockParam\n\t\t\t\t\t\t} else if (part.type === \"image_url\") {\n\t\t\t\t\t\t\t// Note: Anthropic requires base64-encoded images\n\t\t\t\t\t\t\t// This is a simplified version - production code should handle URL->base64 conversion\n\t\t\t\t\t\t\tconst imageUrl = part.url\n\n\t\t\t\t\t\t\t// Check if it's already base64 data\n\t\t\t\t\t\t\tif (imageUrl.startsWith(\"data:image\")) {\n\t\t\t\t\t\t\t\tconst matches = imageUrl.match(/data:image\\/(\\w+);base64,(.+)/)\n\t\t\t\t\t\t\t\tif (matches) {\n\t\t\t\t\t\t\t\t\tconst [, mediaType, data] = matches\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\ttype: \"image\" as const,\n\t\t\t\t\t\t\t\t\t\tsource: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"base64\" as const,\n\t\t\t\t\t\t\t\t\t\t\tmedia_type: `image/${mediaType}` as\n\t\t\t\t\t\t\t\t\t\t\t\t| \"image/jpeg\"\n\t\t\t\t\t\t\t\t\t\t\t\t| \"image/png\"\n\t\t\t\t\t\t\t\t\t\t\t\t| \"image/gif\"\n\t\t\t\t\t\t\t\t\t\t\t\t| \"image/webp\",\n\t\t\t\t\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t} as ImageBlockParam\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// For non-base64 URLs, throw error (or you could fetch and convert)\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\"[AnthropicMapper] Image URLs must be base64-encoded. \" +\n\t\t\t\t\t\t\t\t\t\"Convert to data:image/[type];base64,[data] format.\",\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn { type: \"text\" as const, text: \"\" } as TextBlockParam\n\t\t\t\t\t})\n\n\t\t\t\t\tanthropicMessages.push({\n\t\t\t\t\t\trole: msg.role,\n\t\t\t\t\t\tcontent: contentBlocks,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Anthropic requires alternating user/assistant roles\n\t\t// Validate and fix if needed\n\t\tconst validated = this.ensureAlternatingRoles(anthropicMessages)\n\n\t\treturn {\n\t\t\tmessages: validated,\n\t\t\tsystem: systemPrompt,\n\t\t}\n\t}\n\n\t/**\n\t * Ensures messages alternate between user and assistant roles.\n\t * Anthropic API requires this constraint.\n\t */\n\tprivate ensureAlternatingRoles(messages: MessageParam[]): MessageParam[] {\n\t\tif (messages.length === 0) return messages\n\n\t\tconst result: MessageParam[] = []\n\t\tlet lastRole: \"user\" | \"assistant\" | undefined\n\n\t\tfor (const msg of messages) {\n\t\t\t// If same role appears consecutively, merge the messages\n\t\t\tif (lastRole === msg.role && result.length > 0) {\n\t\t\t\tconst lastMsg = result[result.length - 1]\n\n\t\t\t\t// Merge content\n\t\t\t\tif (typeof lastMsg.content === \"string\" && typeof msg.content === \"string\") {\n\t\t\t\t\tlastMsg.content = `${lastMsg.content}\\n${msg.content}`\n\t\t\t\t} else {\n\t\t\t\t\t// For array content, concatenate\n\t\t\t\t\tconst lastContent = Array.isArray(lastMsg.content)\n\t\t\t\t\t\t? lastMsg.content\n\t\t\t\t\t\t: [{ type: \"text\" as const, text: lastMsg.content as string }]\n\t\t\t\t\tconst newContent = Array.isArray(msg.content)\n\t\t\t\t\t\t? msg.content\n\t\t\t\t\t\t: [{ type: \"text\" as const, text: msg.content as string }]\n\t\t\t\t\tlastMsg.content = [...lastContent, ...newContent]\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresult.push(msg)\n\t\t\t\tlastRole = msg.role\n\t\t\t}\n\t\t}\n\n\t\t// Ensure first message is from user (Anthropic requirement)\n\t\tif (result.length > 0 && result[0].role !== \"user\") {\n\t\t\tthrow new Error(\n\t\t\t\t\"[AnthropicMapper] First message must be from user. Anthropic API requires conversations to start with a user message.\",\n\t\t\t)\n\t\t}\n\n\t\treturn result\n\t}\n}\n","import { Message } from \"@/types/message\"\nimport { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { AnthropicMapper } from \"./mapper\"\nimport { betaZodOutputFormat } from \"@anthropic-ai/sdk/helpers/beta/zod\"\nimport { ANTHROPIC_MODEL_MAP, AnthropicModel } from \"@/types/model\"\nimport { ZodObject } from \"zod\"\nimport { Tool } from \"@/types/tool\"\nimport { ReasoningEffort } from \"@/types/request\"\n\nexport class AnthropicRequestBuilder extends RequestBuilder {\n\tprivate mapper = new AnthropicMapper()\n\n\taddModel(model: AnthropicModel): RequestBuilder {\n\t\tthis.request.model = ANTHROPIC_MODEL_MAP[model]\n\t\treturn this\n\t}\n\n\taddTask(task: string): RequestBuilder {\n\t\t// Add task as a user message\n\t\tconst message = {\n\t\t\trole: \"user\" as const,\n\t\t\tcontent: task,\n\t\t}\n\n\t\tif (!this.request.messages) {\n\t\t\tthis.request.messages = []\n\t\t}\n\n\t\tthis.request.messages.push(message)\n\t\treturn this\n\t}\n\n\taddMessages(messages: Message[]): RequestBuilder {\n\t\tconst { messages: anthropicMessages, system } = this.mapper.toMessages(messages)\n\n\t\tthis.request.messages = anthropicMessages\n\n\t\tif (system) {\n\t\t\tthis.request.system = system\n\t\t}\n\n\t\treturn this\n\t}\n\n\taddStructuredOutput(schema: ZodObject): RequestBuilder {\n\t\tthis.request.betas = [\"structured-outputs-2025-11-13\"]\n\t\tthis.request.output_format = betaZodOutputFormat(schema)\n\t\treturn this\n\t}\n\n\taddTools(tools: Tool[]): RequestBuilder {\n\t\tthis.request.tools = tools.map((tool) => ({\n\t\t\tname: tool.name,\n\t\t\tdescription: tool.description,\n\t\t\tinput_schema: tool.schema,\n\t\t}))\n\t\treturn this\n\t}\n\n\taddReasoningEffort(effort: ReasoningEffort): RequestBuilder {\n\n\t\tlet reasoningEffort = ''\n\t\tif (effort === ReasoningEffort.NONE) {\n\t\t\treturn this\n\t\t} else if (effort === ReasoningEffort.LOW) {\n\t\t\treasoningEffort = \"low\"\n\t\t} else if (effort === ReasoningEffort.MEDIUM) {\n\t\t\treasoningEffort = \"medium\"\n\t\t} else if (effort === ReasoningEffort.HIGH) {\n\t\t\treasoningEffort = \"high\"\n\t\t} else if (effort === ReasoningEffort.MAX) {\n\t\t\treasoningEffort = \"max\"\n\t\t}\n\n\t\tthis.request.output_config = {\n\t\t\teffort: reasoningEffort\n\t\t}\n\t\treturn this\n\t}\n\n\tbuild() {\n\t\t// Anthropic requires max_tokens parameter\n\t\tif (!this.request.max_tokens) {\n\t\t\tthis.request.max_tokens = 1024\n\t\t}\n\n\t\treturn this.request\n\t}\n}\n","import { SendingClient } from \"@core/endpoint/client\"\nimport Anthropic from \"@anthropic-ai/sdk\"\n\nexport class AnthropicDefaultClient implements SendingClient {\n\tconstructor(private client = new Anthropic()) {}\n\n\tasync send(request: any): Promise<any> {\n\t\treturn await this.client.messages.create(request)\n\t}\n}\n","import { SendingClient } from \"@core/endpoint/client\"\nimport Anthropic from \"@anthropic-ai/sdk\"\n\nexport class AnthropicParserClient implements SendingClient {\n\tconstructor(private client = new Anthropic()) {}\n\n\tasync send(request: any): Promise<any> {\n\t\treturn await this.client.beta.messages.parse(request)\n\t}\n}\n","import { SendingClient } from \"@core/endpoint/client\"\nimport { AnthropicDefaultClient } from \"./default\"\nimport { AnthropicParserClient } from \"./parser\"\n\nexport class AnthropicClientResolver {\n\tstatic resolve(request: any): SendingClient {\n\t\treturn request.output_format ? new AnthropicParserClient() : new AnthropicDefaultClient()\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class ParsedOutputHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tif (providerResponse.parsed_output) {\n\t\t\tmozaikResponse.setResponseData(providerResponse.parsed_output)\n\t\t\treturn mozaikResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class ContentHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tconst content = providerResponse.content\n\t\t\t.filter((block: any) => block.type === \"text\")\n\t\t\t.map((block: any) => (block.type === \"text\" ? block.text : \"\"))\n\t\t\t.join(\"\")\n\n\t\tif (content) {\n\t\t\tmozaikResponse.setResponseData(content)\n\t\t\treturn mozaikResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","export class AnthropicModelPricing {\n\tprivate inputPricePer1MToken!: number\n\tprivate outputPricePer1MToken!: number\n\n\tcalculateTotalCost(inputTokens: number, outputTokens: number): number {\n\t\tconst inputCost = (inputTokens * this.inputPricePer1MToken) / 1_000_000\n\t\tconst outputCost = (outputTokens * this.outputPricePer1MToken) / 1_000_000\n\t\treturn inputCost + outputCost\n\t}\n\n\tgetPriceInUsd(modelName: string, inputTokens: number, outputTokens: number): number {\n\t\tif (modelName.startsWith(\"claude-sonnet-4-5\")) {\n\t\t\tthis.inputPricePer1MToken = 3\n\t\t\tthis.outputPricePer1MToken = 15\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens)\n\t\t} else if (modelName.startsWith(\"claude-haiku-4-5\")) {\n\t\t\tthis.inputPricePer1MToken = 1\n\t\t\tthis.outputPricePer1MToken = 5\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens)\n\t\t} else if (modelName.startsWith(\"claude-opus-4-5\")) {\n\t\t\tthis.inputPricePer1MToken = 5\n\t\t\tthis.outputPricePer1MToken = 25\n\t\t\treturn this.calculateTotalCost(inputTokens, outputTokens)\n\t\t}\n\n\t\tthrow new Error(`Model name ${modelName} is not supported for this pricing`)\n\t}\n}\n","import { Tool } from \"@/types/tool\"\nimport Anthropic from \"@anthropic-ai/sdk\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { AnthropicDefaultClient } from \"../client/default\"\nimport { MozaikResponse } from \"@core/response\"\nimport { UsageEntry } from \"@core/usage-entry\"\nimport { AnthropicModelPricing } from \"../model-pricing\"\n\nexport class ToolUseHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\tclient: AnthropicDefaultClient\n\ttools: Tool[]\n\trequest: any\n\n\tconstructor(request: any, tools: Tool[]) {\n\t\tsuper()\n\t\tthis.tools = tools\n\t\tthis.request = request\n\t\tthis.client = new AnthropicDefaultClient()\n\t}\n\n\tprivate async executeToolCalls(tools: Tool[], toolUseBlocks: Anthropic.ToolUseBlock[]): Promise<any[]> {\n\t\tconst results: any[] = []\n\n\t\tfor (const toolUse of toolUseBlocks) {\n\t\t\tconst tool = tools?.find((t) => t.name === toolUse.name)\n\n\t\t\tif (!tool) {\n\t\t\t\tresults.push({\n\t\t\t\t\ttype: \"tool_result\",\n\t\t\t\t\ttool_use_id: toolUse.id,\n\t\t\t\t\tcontent: JSON.stringify({ error: `Unknown tool: ${toolUse.name}` }),\n\t\t\t\t})\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst result = await tool.invoke(toolUse.input)\n\t\t\t\tresults.push({\n\t\t\t\t\ttype: \"tool_result\",\n\t\t\t\t\ttool_use_id: toolUse.id,\n\t\t\t\t\tcontent: JSON.stringify(result),\n\t\t\t\t})\n\t\t\t} catch (error: any) {\n\t\t\t\tresults.push({\n\t\t\t\t\ttype: \"tool_result\",\n\t\t\t\t\ttool_use_id: toolUse.id,\n\t\t\t\t\tcontent: JSON.stringify({ error: error.message }),\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn results\n\t}\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tlet providerResponse = mozaikResponse.providerResponse\n\n\t\twhile (providerResponse.stop_reason === \"tool_use\") {\n\t\t\tconst toolUseBlocks = providerResponse.content.filter(\n\t\t\t\t(block: any): block is Anthropic.ToolUseBlock => block.type === \"tool_use\",\n\t\t\t)\n\n\t\t\t// Add assistant's response to messages\n\t\t\tthis.request.messages.push({\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: providerResponse.content,\n\t\t\t})\n\n\t\t\tconst toolResults = await this.executeToolCalls(this.tools, toolUseBlocks)\n\n\t\t\t// Add tool results as user message\n\t\t\tthis.request.messages.push({\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: toolResults,\n\t\t\t})\n\n\t\t\t// Call model again\n\t\t\tconst toolCallingResponse = await this.client.send(this.request)\n\n\t\t\tconst usage = toolCallingResponse.usage\n\t\t\tconst anthropicModelPricing = new AnthropicModelPricing()\n\t\t\tconst totalCost = anthropicModelPricing.getPriceInUsd(\n\t\t\t\tproviderResponse.model,\n\t\t\t\tusage.input_tokens,\n\t\t\t\tusage.output_tokens,\n\t\t\t)\n\n\t\t\tmozaikResponse.addUsageEntry(new UsageEntry(totalCost, toolCallingResponse.model.name))\n\t\t\tmozaikResponse.setProviderResponse(toolCallingResponse)\n\t\t\tproviderResponse = toolCallingResponse\n\t\t}\n\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { UsageEntry } from \"@core/usage-entry\"\nimport { AnthropicModelPricing } from \"../model-pricing\"\n\nexport class UsageHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tconst usage = providerResponse.usage\n\n\t\tconst anthropicModelPricing = new AnthropicModelPricing()\n\t\tconst totalCost = anthropicModelPricing.getPriceInUsd(\n\t\t\tproviderResponse.model,\n\t\t\tusage.input_tokens,\n\t\t\tusage.output_tokens,\n\t\t)\n\t\tif (usage) {\n\t\t\tmozaikResponse.addUsageEntry(new UsageEntry(totalCost, providerResponse.model))\n\t\t}\n\t\treturn await this.nextHandler.handle(mozaikResponse)\n\t}\n}\n","import { MozaikResponse } from \"@core/response\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\n\nexport class UnhandledResponseHandler extends ResponseHandler {\n\tnextHandler!: ResponseHandler\n\n\tasync handle(mozaikResponse: MozaikResponse): Promise<MozaikResponse> {\n\t\tconst providerResponse = mozaikResponse.providerResponse\n\t\tconst id = providerResponse?.id ?? \"unknown\"\n\t\tconst model = providerResponse?.model ?? \"unknown\"\n\n\t\tthrow new Error(`No response handler matched. response_id=${id} model=${model}`)\n\t}\n}\n","import { Endpoint } from \"@core/endpoint/endpoint\"\nimport { RequestBuilder } from \"@core/endpoint/request-builder\"\nimport { AnthropicRequestBuilder } from \"./builder\"\nimport { AnthropicClientResolver } from \"./client/resolver\"\nimport { ResponseHandler } from \"@core/endpoint/response-handler\"\nimport { ParsedOutputHandler } from \"./response-handler/parsed-output\"\nimport { ContentHandler } from \"./response-handler/content\"\nimport { ToolUseHandler } from \"./response-handler/tool-use\"\nimport { MozaikRequest } from \"@/types/request\"\nimport { MozaikResponse } from \"@core/response\"\nimport { UsageHandler } from \"./response-handler/usage\"\nimport { UnhandledResponseHandler } from \"./response-handler/undhandled\"\n\nexport class AnthropicEndpoint extends Endpoint {\n\trequestBuilder: RequestBuilder = new AnthropicRequestBuilder()\n\n\tasync sendRequest(mozaikRequest: MozaikRequest): Promise<any> {\n\t\tconst providerRequest = this.buildRequest(mozaikRequest)\n\t\tconst client = AnthropicClientResolver.resolve(providerRequest)\n\t\tconst response = await client.send(providerRequest)\n\n\t\tconst mozaikResponse = new MozaikResponse()\n\t\tmozaikResponse.setProviderResponse(response)\n\n\t\t// response handler (chain of responsibilities)\n\t\tconst usageHandler: ResponseHandler = new UsageHandler()\n\t\tconst toolUseHandler: ResponseHandler = new ToolUseHandler(\n\t\t\tproviderRequest,\n\t\t\tmozaikRequest.tools ? mozaikRequest.tools : [],\n\t\t)\n\t\tconst parsedOutputHandler: ResponseHandler = new ParsedOutputHandler()\n\t\tconst contentHandler: ResponseHandler = new ContentHandler()\n\t\tconst unhandledResponseHandler: ResponseHandler = new UnhandledResponseHandler()\n\n\t\tusageHandler\n\t\t\t.setNextHandler(toolUseHandler)\n\t\t\t.setNextHandler(parsedOutputHandler)\n\t\t\t.setNextHandler(contentHandler)\n\t\t\t.setNextHandler(unhandledResponseHandler)\n\n\t\tconst responseHandler = usageHandler\n\n\t\tconst result = await responseHandler.handle(mozaikResponse)\n\n\t\treturn result.getResponse()\n\t}\n}\n","import { EndpointResolver } from \"@core/endpoint/endpoint-resolver\"\nimport { Endpoint } from \"@core/endpoint/endpoint\"\nimport { OPENAI_MODELS, ANTHROPIC_MODELS } from \"@/types/model\"\nimport { OpenAIResponses } from \"./openai/endpoint\"\nimport { AnthropicEndpoint } from \"./anthropic/endpoint\"\n\nexport class DefaultEndpointResolver extends EndpointResolver {\n\tisOpenAIModel(value: string): boolean {\n\t\treturn (OPENAI_MODELS as readonly string[]).includes(value)\n\t}\n\n\tisAnthropicModel(value: string): boolean {\n\t\treturn (ANTHROPIC_MODELS as readonly string[]).includes(value)\n\t}\n\n\tresolve(model: string): Endpoint {\n\t\tif (this.isOpenAIModel(model)) {\n\t\t\treturn new OpenAIResponses()\n\t\t} else if (this.isAnthropicModel(model)) {\n\t\t\treturn new AnthropicEndpoint()\n\t\t}\n\n\t\tthrow new Error(\"Provider not found\")\n\t}\n}\n","import { RequestGateway } from \"@core/endpoint/request-gateway\"\nimport { MozaikRequest } from \"@/types/request\"\nimport { DefaultEndpointResolver } from \"@providers/endpoint-resolver\"\nimport { ZodObject } from \"zod\"\nimport { Model } from \"@/types/model\"\nimport { Message } from \"@/types/message\"\n\nexport class MozaikAgent {\n\tprivate request: MozaikRequest\n\tgateway: RequestGateway = new RequestGateway(new DefaultEndpointResolver())\n\n\tconstructor(request: MozaikRequest) {\n\t\tthis.request = request\n\t}\n\n\tsetModel(model: Model) {\n\t\tthis.request.model = model\n\t}\n\n\tsetMessages(messages: Message[]) {\n\t\tthis.request.messages = messages\n\t}\n\n\tsetTask(task: string) {\n\t\tthis.request.task = task\n\t}\n\n\tsetStructuredOutput(schema: ZodObject<any>) {\n\t\tthis.request.structuredOutput = schema\n\t}\n\n\tasync act(task?: string) {\n\t\tif (task) {\n\t\t\tthis.request.task = task\n\t\t}\n\t\treturn await this.gateway.invoke(this.request)\n\t}\n}\n","import z from \"zod\"\nimport { ANTHROPIC_MODELS, OPENAI_MODELS } from \"@/types/model\"\nimport { PlanNode } from \"@/types/plan\"\n\nconst ModelSchema = z.enum([...OPENAI_MODELS, ...ANTHROPIC_MODELS])\n\nconst TaskPlanNodeSchema = z.object({\n\tkind: z.literal(\"task\"),\n\ttask: z.string(),\n\tmodel: ModelSchema,\n})\n\nconst WorkflowPlanNodeSchema: z.ZodType<Extract<PlanNode, { kind: \"workflow\" }>> = z.lazy(() =>\n\tz.object({\n\t\tkind: z.literal(\"workflow\"),\n\t\tmode: z.enum([\"sequential\", \"parallel\"]),\n\t\tunits: z.array(PlanNodeSchema),\n\t}),\n)\n\nconst PlanNodeSchema: z.ZodType<PlanNode> = TaskPlanNodeSchema.or(WorkflowPlanNodeSchema)\n\nexport const PlanSchema = z.object({\n\troot: PlanNodeSchema,\n})\n","import { Workflow } from \"@core/workflow/workflow\"\nimport { WorkflowExecutionStrategy } from \"@core/workflow/execution/strategy\"\nimport { ExecutionHook } from \"../hooks/execution-hook\"\n\nexport class ParallelExecution implements WorkflowExecutionStrategy {\n\tasync execute(workflow: Workflow, hook: ExecutionHook): Promise<any> {\n\t\tconst promises = []\n\t\tfor (const u of workflow.units) {\n\t\t\tpromises.push(u.execute(hook))\n\t\t}\n\n\t\tconst results = await Promise.all(promises)\n\n\t\treturn results\n\t}\n}\n","import { ExecutionHook } from \"../hooks/execution-hook\"\nimport { Workflow } from \"../workflow\"\nimport { WorkflowExecutionStrategy } from \"./strategy\"\n\nexport class SequentalExecution implements WorkflowExecutionStrategy {\n\tasync execute(workflow: Workflow, hook: ExecutionHook): Promise<any> {\n\t\tconst results = []\n\t\tfor (const u of workflow.units) {\n\t\t\tresults.push(await u.execute(hook))\n\t\t}\n\n\t\treturn results\n\t}\n}\n","import { ParallelExecution } from \"./parallel\"\nimport { SequentalExecution } from \"./sequential\"\nimport { WorkflowExecutionStrategy } from \"./strategy\"\n\nexport class ExecutionStrategyFactory {\n\tstatic create(mode: string): WorkflowExecutionStrategy {\n\t\tlet strategy: WorkflowExecutionStrategy\n\t\tif (mode == \"parallel\") {\n\t\t\tstrategy = new ParallelExecution()\n\t\t} else {\n\t\t\tstrategy = new SequentalExecution()\n\t\t}\n\n\t\treturn strategy\n\t}\n}\n","import { Task } from \"../task\"\nimport { Workflow } from \"../workflow\"\nimport { ExecutionHook } from \"./execution-hook\"\n\nexport class ClusterHook implements ExecutionHook {\n\tconstructor(private hooks: ExecutionHook[]) {}\n\n\tbeforeTask(task: Task): void {\n\t\tthis.hooks.forEach((h) => h.beforeTask(task))\n\t}\n\n\tafterTask(task: Task, result: any): void {\n\t\tthis.hooks.forEach((h) => h.afterTask(task, result))\n\t}\n\n\tbeforeWorkflow(wf: Workflow) {\n\t\tthis.hooks.forEach((h) => h.beforeWorkflow(wf))\n\t}\n\n\tafterWorkflow(wf: Workflow, result: any) {\n\t\tthis.hooks.forEach((h) => h.afterWorkflow(wf, result))\n\t}\n}\n","import { Task } from \"../task\"\nimport { Workflow } from \"../workflow\"\nimport { ExecutionHook } from \"./execution-hook\"\n\nexport class Logger implements ExecutionHook {\n\tbeforeWorkflow(workflow: Workflow) {\n\t\tconsole.log(`[Workflow:start], Mode: ${workflow.mode}`)\n\t}\n\n\tafterWorkflow(workflow: Workflow) {\n\t\tconsole.log(`[Workflow:end], Mode: ${workflow.mode}`)\n\t}\n\n\tbeforeTask(task: Task) {\n\t\tconsole.log(`[Task:end]: Model: ${task.getModel()} Task: ${task.getTask()}`)\n\t}\n\n\tafterTask(task: Task, result: any) {\n\t\tconsole.log(`[Task:end]: Model: ${task.getModel()} Task: ${task.getTask()}`)\n\t}\n}\n","import { ClusterHook } from \"./cluster\"\nimport { ExecutionHook } from \"./execution-hook\"\nimport { Logger } from \"./logger\"\n\nconst loggingHook: ExecutionHook = new Logger()\n\nconst defaultHooks = [loggingHook]\nconst clusterHook: ExecutionHook = new ClusterHook(defaultHooks)\n\nexport const DEFAULT_CLUSTER_HOOK = clusterHook\n","import { WorkUnit } from \"@core/workflow/work-unit\"\nimport { ExecutionStrategyFactory } from \"@core/workflow/execution/strategy-factory\"\nimport { WorkflowExecutionStrategy } from \"@core/workflow/execution/strategy\"\nimport { ExecutionHook } from \"./hooks/execution-hook\"\nimport { DEFAULT_CLUSTER_HOOK } from \"./hooks\"\n\nexport class Workflow extends WorkUnit {\n\tconstructor(\n\t\treadonly mode: \"parallel\" | \"sequential\",\n\t\treadonly units: WorkUnit[],\n\t) {\n\t\tsuper()\n\t}\n\n\tasync execute(hook: ExecutionHook = DEFAULT_CLUSTER_HOOK): Promise<any> {\n\t\thook.beforeWorkflow(this)\n\n\t\tconst executionStrategy: WorkflowExecutionStrategy = ExecutionStrategyFactory.create(this.mode)\n\t\tconst result = await executionStrategy.execute(this, hook)\n\n\t\thook.afterWorkflow(this, result)\n\t\treturn result\n\t}\n}\n","import { Model, MozaikRequest, MozaikAgent } from \"@/index\"\nimport { WorkUnit } from \"@core/workflow/work-unit\"\nimport { ExecutionHook } from \"./hooks/execution-hook\"\nimport { DEFAULT_CLUSTER_HOOK } from \"./hooks\"\n\nexport class Task extends WorkUnit {\n\tconstructor(\n\t\tprivate task: string,\n\t\tprivate model: Model,\n\t) {\n\t\tsuper()\n\t}\n\n\tgetTask() {\n\t\treturn this.task\n\t}\n\n\tgetModel() {\n\t\treturn this.model\n\t}\n\n\tasync execute(hook: ExecutionHook = DEFAULT_CLUSTER_HOOK): Promise<any> {\n\t\thook.beforeTask(this)\n\n\t\tconst request: MozaikRequest = {\n\t\t\tmodel: this.model,\n\t\t\ttask: this.task,\n\t\t}\n\n\t\tconst agent = new MozaikAgent(request)\n\t\tconst result = await agent.act(this.task)\n\n\t\thook.afterTask(this, result)\n\t\treturn result\n\t}\n}\n","import { Plan, PlanNode } from \"@/types/plan\"\nimport { Workflow } from \"./workflow\"\nimport { WorkUnit } from \"./work-unit\"\nimport { Task } from \"./task\"\n\nexport class PlanWorkflowMapper {\n\tstatic fromPlan(plan: Plan): Workflow {\n\t\treturn this.fromNode(plan.root)\n\t}\n\n\tprivate static fromNode(node: PlanNode): Workflow {\n\t\tif (node.kind !== \"workflow\") {\n\t\t\tthrow new Error(\"Root must be workflow\")\n\t\t}\n\n\t\treturn new Workflow(node.mode, node.units.map(this.mapNode))\n\t}\n\n\tprivate static mapNode(node: PlanNode): WorkUnit {\n\t\tif (node.kind === \"task\") {\n\t\t\treturn new Task(node.task, node.model)\n\t\t}\n\n\t\treturn new Workflow(node.mode, node.units.map(this.mapNode))\n\t}\n}\n","import { Plan } from \"@/types/plan\"\nimport { Workflow } from \"@core/workflow/workflow\"\nimport { MozaikAgent } from \"./agent\"\nimport { MozaikRequest } from \"@/types/request\"\nimport { PlanSchema } from \"@core/workflow/schema/plan\"\nimport { PlanWorkflowMapper } from \"@core/workflow/mapper\"\n\nconst PROMPT = `You are a planner.\n\nRules:\n- Use 'parallel' for the task that can be run in parallel.\n- Pick model based on the task complexity\n- Keep prompts actionable.\n- Don't ask user for any input, just do the thing with available data you have.\n`\n\nexport class PlanningAgent extends MozaikAgent {\n\tconstructor(request: MozaikRequest) {\n\t\tsuper(request)\n\t}\n\n\tasync planFromGoal(goal: string): Promise<Workflow> {\n\t\tthis.setStructuredOutput(PlanSchema)\n\t\tconst plan: Plan = await this.act(`${PROMPT}\\nGoal: ${goal}`)\n\t\treturn PlanWorkflowMapper.fromPlan(plan)\n\t}\n}\n"],"mappings":"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","names":["OpenAI","Anthropic","ContentHandler","UsageHandler","UsageHandler","ContentHandler"]}
|