@effect-uai/anthropic 0.11.0 → 0.12.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/Anthropic.d.mts +20 -4
- package/dist/Anthropic.d.mts.map +1 -1
- package/dist/Anthropic.mjs +12 -2
- package/dist/Anthropic.mjs.map +1 -1
- package/dist/AnthropicTools.d.mts +12 -4
- package/dist/AnthropicTools.d.mts.map +1 -1
- package/dist/AnthropicTools.mjs +1 -1
- package/dist/AnthropicTools.mjs.map +1 -1
- package/dist/anthropicTools.test.d.mts +1 -1
- package/dist/anthropicTools.test.mjs +13 -13637
- package/dist/anthropicTools.test.mjs.map +1 -1
- package/dist/codec.d.mts +16 -4
- package/dist/codec.d.mts.map +1 -1
- package/dist/codec.mjs +25 -11
- package/dist/codec.mjs.map +1 -1
- package/dist/{magic-string.es-PAZgLX4h.mjs → magic-string.es-CUAnjKYC.mjs} +14 -13
- package/dist/{magic-string.es-PAZgLX4h.mjs.map → magic-string.es-CUAnjKYC.mjs.map} +1 -1
- package/dist/models.d.mts.map +1 -1
- package/dist/streamEvents.d.mts +0 -2
- package/dist/streamEvents.d.mts.map +1 -1
- package/dist/streamEvents.mjs +1 -1
- package/dist/streamEvents.mjs.map +1 -1
- package/dist/test.DNmyFkvJ-N3QqMRwZ.mjs +13658 -0
- package/dist/test.DNmyFkvJ-N3QqMRwZ.mjs.map +1 -0
- package/dist/usage.test.d.mts +1 -0
- package/dist/usage.test.mjs +46 -0
- package/dist/usage.test.mjs.map +1 -0
- package/package.json +5 -5
- package/src/Anthropic.ts +40 -7
- package/src/AnthropicTools.ts +4 -6
- package/src/anthropicTools.test.ts +1 -0
- package/src/codec.ts +128 -112
- package/src/usage.test.ts +54 -0
- /package/dist/{chunk-CfYAbeIz.mjs → rolldown-runtime-D7D4PA-g.mjs} +0 -0
package/dist/codec.d.mts
CHANGED
|
@@ -2,10 +2,8 @@ import { Option, Result, Schema } from "effect";
|
|
|
2
2
|
import { Turn } from "@effect-uai/core/Turn";
|
|
3
3
|
import { JsonParseError } from "@effect-uai/core/JSONL";
|
|
4
4
|
import * as Items from "@effect-uai/core/Items";
|
|
5
|
-
|
|
6
|
-
//#region src/codec.d.ts
|
|
7
5
|
declare namespace codec_d_exports {
|
|
8
|
-
export { Accumulator, RequestBody, ThinkingConfig, WireContentBlock, WireUsage, accumulatorToTurn, appendInputJsonDelta, appendSignatureDelta, appendTextDelta, appendThinkingDelta, buildRequestBody, emptyAccumulator, mergeUsage, setStopReason, startBlock };
|
|
6
|
+
export { Accumulator, CacheControl, CacheTtl, RequestBody, ThinkingConfig, WireContentBlock, WireUsage, accumulatorToTurn, appendInputJsonDelta, appendSignatureDelta, appendTextDelta, appendThinkingDelta, buildRequestBody, emptyAccumulator, mergeUsage, setStopReason, startBlock };
|
|
9
7
|
}
|
|
10
8
|
declare const WireContentBlock: Schema.Union<readonly [Schema.Struct<{
|
|
11
9
|
readonly type: Schema.Literal<"text">;
|
|
@@ -81,6 +79,18 @@ type ThinkingConfig = {
|
|
|
81
79
|
readonly type: "enabled";
|
|
82
80
|
readonly budget_tokens: number;
|
|
83
81
|
};
|
|
82
|
+
/** Cache lifetime. `1h` writes cost 2x base input; `5m` costs 1.25x. */
|
|
83
|
+
type CacheTtl = "5m" | "1h";
|
|
84
|
+
/**
|
|
85
|
+
* Request-level cache breakpoint. Anthropic applies it to the last cacheable
|
|
86
|
+
* block and moves it forward as the conversation grows, so the cached prefix
|
|
87
|
+
* (`tools` → `system` → `messages`) follows the conversation without the
|
|
88
|
+
* caller re-placing anything.
|
|
89
|
+
*/
|
|
90
|
+
type CacheControl = {
|
|
91
|
+
readonly type: "ephemeral";
|
|
92
|
+
readonly ttl?: CacheTtl;
|
|
93
|
+
};
|
|
84
94
|
type RequestBody = {
|
|
85
95
|
readonly model: string;
|
|
86
96
|
readonly messages: ReadonlyArray<RequestMessage>;
|
|
@@ -97,6 +107,7 @@ type RequestBody = {
|
|
|
97
107
|
readonly user_id: string;
|
|
98
108
|
};
|
|
99
109
|
readonly output_config?: Record<string, unknown>;
|
|
110
|
+
readonly cache_control?: CacheControl;
|
|
100
111
|
readonly stream: true;
|
|
101
112
|
};
|
|
102
113
|
declare const buildRequestBody: (params: {
|
|
@@ -112,6 +123,7 @@ declare const buildRequestBody: (params: {
|
|
|
112
123
|
readonly toolChoice: Option.Option<Record<string, unknown>>;
|
|
113
124
|
readonly userId: Option.Option<string>;
|
|
114
125
|
readonly outputConfig: Option.Option<Record<string, unknown>>;
|
|
126
|
+
readonly cacheControl: Option.Option<CacheControl>;
|
|
115
127
|
}) => Result.Result<RequestBody, JsonParseError>;
|
|
116
128
|
type BlockBuffer = {
|
|
117
129
|
readonly type: WireContentBlock["type"];
|
|
@@ -138,5 +150,5 @@ declare const setStopReason: (acc: Accumulator, reason: string) => Accumulator;
|
|
|
138
150
|
declare const mergeUsage: (acc: Accumulator, wire: WireUsage) => Accumulator;
|
|
139
151
|
declare const accumulatorToTurn: (acc: Accumulator) => Turn;
|
|
140
152
|
//#endregion
|
|
141
|
-
export { Accumulator, RequestBody, ThinkingConfig, WireContentBlock, WireUsage, accumulatorToTurn, appendInputJsonDelta, appendSignatureDelta, appendTextDelta, appendThinkingDelta, buildRequestBody, emptyAccumulator, mergeUsage, setStopReason, startBlock, codec_d_exports as t };
|
|
153
|
+
export { Accumulator, CacheControl, CacheTtl, RequestBody, ThinkingConfig, WireContentBlock, WireUsage, accumulatorToTurn, appendInputJsonDelta, appendSignatureDelta, appendTextDelta, appendThinkingDelta, buildRequestBody, emptyAccumulator, mergeUsage, setStopReason, startBlock, codec_d_exports as t };
|
|
142
154
|
//# sourceMappingURL=codec.d.mts.map
|
package/dist/codec.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.d.mts","names":[],"sources":["../src/codec.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"codec.d.mts","names":[],"sources":["../src/codec.ts"],"mappings":";;;;;;;cAiCa,kBAAgB,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;;KAMjB,0BAA0B,iBAAiB;cAEjD,WAAS,OAAA;;;;;;KAMH,mBAAmB,UAAU;KAMpC;WACM;WACA;;KAGN;WACM;WACA;WACA;;KAGN;WACM;WACA;WACA;WACA;;KAGN;WACM;WACA;WACA;;KAGN;WACM;WACA;;KAGN;WACM;WACA;aACM;aAAsB;;aACtB;aAAyB;aAA6B;;;KAGlE,0BAA0B,qBAAqB,2BAA2B;KAE1E,+BACD,qBACA,wBACA,yBACA;KAEC;WACM;WACA,SAAS,cAAc;;KAG7B;WACM;WACA,SAAS,cAAc;;KAG7B,iBAAiB,qBAAqB;KAoN/B;WACD;WACA;;;KAIC;;;;;;;KAQA;WACD;WACA,MAAM;;KAGL;WACD;WACA,UAAU,cAAc;WACxB;WACA;WACA;WACA;WACA;WACA,iBAAiB;WACjB,WAAW;WACX,QAAQ,cAAc;WACtB,cAAc;WACd;aAAsB;;WACtB,gBAAgB;WAChB,gBAAgB;WAChB;;cAGE,mBAAgB;WAClB;WACA,SAAS,cAAc,MAAM;WAC7B;WACA,aAAa,OAAO;WACpB,MAAM,OAAO;WACb,MAAM,OAAO;WACb,eAAe,OAAO,OAAO;WAC7B,UAAU,OAAO,OAAO;WACxB,OAAO,OAAO,OAAO,cAAc;WACnC,YAAY,OAAO,OAAO;WAC1B,QAAQ,OAAO;WACf,cAAc,OAAO,OAAO;WAC5B,cAAc,OAAO,OAAO;MACnC,OAAO,OAAO,aAAa;KA4D1B;WACM,MAAM;WACN;WACA;WACA;WACA;WACA,IAAI,OAAO;WACX,MAAM,OAAO;WACb,cAAc,OAAO;;KAcpB;WACD,QAAQ,SAAS,eAAe;WAChC,YAAY,OAAO;WACnB,OAAO,MAAM;;cAGX,kBAAkB;cAiBlB,aAAU,KAAS,aAAW,eAAe,OAAS,qBAAmB;cAoBzE,kBAAe,KAAS,aAAW,eAAe,iBAAiB;cAGnE,uBAAoB,KAC1B,aAAW,eACH,oBAEZ;cAEU,sBAAmB,KACzB,aAAW,eACH,qBAEZ;cAEU,uBAAoB,KAC1B,aAAW,eACH,sBAEZ;cAEU,gBAAa,KAAS,aAAW,mBAAmB;cAWpD,aAAU,KAAS,aAAW,MAAQ,cAAY;cA+GlD,oBAAiB,KAAS,gBAAc"}
|
package/dist/codec.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as __exportAll } from "./
|
|
1
|
+
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
|
|
2
2
|
import { Array, Encoding, Match, Option, Order, Result, Schema, pipe } from "effect";
|
|
3
3
|
import { JsonParseError } from "@effect-uai/core/JSONL";
|
|
4
4
|
//#region src/codec.ts
|
|
@@ -226,6 +226,10 @@ const buildRequestBody = (params) => pipe(groupedMessages(params.history), Resul
|
|
|
226
226
|
onNone: () => ({}),
|
|
227
227
|
onSome: (output_config) => ({ output_config })
|
|
228
228
|
}),
|
|
229
|
+
...Option.match(params.cacheControl, {
|
|
230
|
+
onNone: () => ({}),
|
|
231
|
+
onSome: (cache_control) => ({ cache_control })
|
|
232
|
+
}),
|
|
229
233
|
stream: true
|
|
230
234
|
})));
|
|
231
235
|
const emptyBlock = (type) => ({
|
|
@@ -285,18 +289,28 @@ const setStopReason = (acc, reason) => ({
|
|
|
285
289
|
...acc,
|
|
286
290
|
stopReason: Option.some(reason)
|
|
287
291
|
});
|
|
288
|
-
const cachedFromWire = (wire) => Option.fromNullishOr(wire.cache_read_input_tokens);
|
|
289
292
|
const mergeUsage = (acc, wire) => {
|
|
290
|
-
const
|
|
293
|
+
const prev = acc.usage;
|
|
294
|
+
const input_tokens = wire.input_tokens ?? prev.input_tokens;
|
|
295
|
+
const output_tokens = wire.output_tokens ?? prev.output_tokens;
|
|
296
|
+
const cached_tokens = wire.cache_read_input_tokens ?? prev.input_tokens_details?.cached_tokens;
|
|
297
|
+
const cache_write_tokens = wire.cache_creation_input_tokens ?? prev.input_tokens_details?.cache_write_tokens;
|
|
298
|
+
const buckets = [
|
|
299
|
+
input_tokens,
|
|
300
|
+
cached_tokens,
|
|
301
|
+
cache_write_tokens,
|
|
302
|
+
output_tokens
|
|
303
|
+
];
|
|
304
|
+
const total_tokens = buckets.every((v) => v === void 0) ? void 0 : buckets.reduce((sum, v) => sum + (v ?? 0), 0);
|
|
305
|
+
const details = {
|
|
306
|
+
...cached_tokens !== void 0 && { cached_tokens },
|
|
307
|
+
...cache_write_tokens !== void 0 && { cache_write_tokens }
|
|
308
|
+
};
|
|
291
309
|
const usage = {
|
|
292
|
-
...
|
|
293
|
-
...
|
|
294
|
-
...
|
|
295
|
-
...
|
|
296
|
-
...Option.match(cached, {
|
|
297
|
-
onNone: () => ({}),
|
|
298
|
-
onSome: (cached_tokens) => ({ input_tokens_details: { cached_tokens } })
|
|
299
|
-
})
|
|
310
|
+
...input_tokens !== void 0 && { input_tokens },
|
|
311
|
+
...output_tokens !== void 0 && { output_tokens },
|
|
312
|
+
...total_tokens !== void 0 && { total_tokens },
|
|
313
|
+
...Object.keys(details).length > 0 && { input_tokens_details: details }
|
|
300
314
|
};
|
|
301
315
|
return {
|
|
302
316
|
...acc,
|
package/dist/codec.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.mjs","names":["Arr"],"sources":["../src/codec.ts"],"sourcesContent":["import { Array as Arr, Encoding, Match, Option, Order, Result, Schema, pipe } from \"effect\"\nimport * as Items from \"@effect-uai/core/Items\"\nimport { JsonParseError } from \"@effect-uai/core/JSONL\"\nimport type { Turn } from \"@effect-uai/core/Turn\"\n\n// ---------------------------------------------------------------------------\n// Wire schemas - subset of Anthropic Messages API we consume.\n// Reference: https://platform.claude.com/docs/en/api/messages\n// ---------------------------------------------------------------------------\n\nconst WireTextBlock = Schema.Struct({\n type: Schema.Literal(\"text\"),\n text: Schema.String,\n})\n\nconst WireToolUseBlock = Schema.Struct({\n type: Schema.Literal(\"tool_use\"),\n id: Schema.String,\n name: Schema.String,\n input: Schema.Unknown,\n})\n\nconst WireThinkingBlock = Schema.Struct({\n type: Schema.Literal(\"thinking\"),\n thinking: Schema.String,\n signature: Schema.optional(Schema.String),\n})\n\nconst WireRedactedThinkingBlock = Schema.Struct({\n type: Schema.Literal(\"redacted_thinking\"),\n data: Schema.String,\n})\n\nexport const WireContentBlock = Schema.Union([\n WireTextBlock,\n WireToolUseBlock,\n WireThinkingBlock,\n WireRedactedThinkingBlock,\n])\nexport type WireContentBlock = typeof WireContentBlock.Type\n\nconst WireUsage = Schema.Struct({\n input_tokens: Schema.optional(Schema.Number),\n output_tokens: Schema.optional(Schema.Number),\n cache_creation_input_tokens: Schema.optional(Schema.NullOr(Schema.Number)),\n cache_read_input_tokens: Schema.optional(Schema.NullOr(Schema.Number)),\n})\nexport type WireUsage = typeof WireUsage.Type\n\n// ---------------------------------------------------------------------------\n// History → request body\n// ---------------------------------------------------------------------------\n\ntype RequestTextContent = {\n readonly type: \"text\"\n readonly text: string\n}\n\ntype RequestToolResultContent = {\n readonly type: \"tool_result\"\n readonly tool_use_id: string\n readonly content: string\n}\n\ntype RequestToolUseContent = {\n readonly type: \"tool_use\"\n readonly id: string\n readonly name: string\n readonly input: unknown\n}\n\ntype RequestThinkingContent = {\n readonly type: \"thinking\"\n readonly thinking: string\n readonly signature?: string\n}\n\ntype RequestRedactedThinkingContent = {\n readonly type: \"redacted_thinking\"\n readonly data: string\n}\n\ntype RequestImageContent = {\n readonly type: \"image\"\n readonly source:\n | { readonly type: \"url\"; readonly url: string }\n | { readonly type: \"base64\"; readonly media_type: string; readonly data: string }\n}\n\ntype RequestUserContentBlock = RequestTextContent | RequestToolResultContent | RequestImageContent\n\ntype RequestAssistantContentBlock =\n | RequestTextContent\n | RequestToolUseContent\n | RequestThinkingContent\n | RequestRedactedThinkingContent\n\ntype RequestUserMessage = {\n readonly role: \"user\"\n readonly content: ReadonlyArray<RequestUserContentBlock>\n}\n\ntype RequestAssistantMessage = {\n readonly role: \"assistant\"\n readonly content: ReadonlyArray<RequestAssistantContentBlock>\n}\n\ntype RequestMessage = RequestUserMessage | RequestAssistantMessage\n\nconst blockText = Match.type<Items.ContentBlock>().pipe(\n Match.discriminatorsExhaustive(\"type\")({\n input_text: (b) => b.text,\n input_image: () => \"\",\n output_text: (b) => b.text,\n refusal: (b) => b.text,\n }),\n)\n\nconst messageText = (message: Items.Message): string => message.content.map(blockText).join(\"\")\n\nconst imageSourceToWire = Match.type<Items.InputImage[\"source\"]>().pipe(\n Match.tag(\"url\", (s): RequestImageContent[\"source\"] => ({ type: \"url\", url: s.url })),\n Match.tag(\"base64\", (s): RequestImageContent[\"source\"] => ({\n type: \"base64\",\n media_type: s.mimeType,\n data: s.base64,\n })),\n Match.tag(\"bytes\", (s): RequestImageContent[\"source\"] => ({\n type: \"base64\",\n media_type: s.mimeType,\n data: Encoding.encodeBase64(s.bytes),\n })),\n Match.exhaustive,\n)\n\nconst userContentBlock = (\n block: Items.ContentBlock,\n): Result.Result<RequestUserContentBlock, void> =>\n Match.value(block).pipe(\n Match.discriminatorsExhaustive(\"type\")({\n input_text: (b) =>\n b.text.length === 0\n ? Result.failVoid\n : Result.succeed({ type: \"text\" as const, text: b.text }),\n input_image: (b) =>\n Result.succeed({ type: \"image\" as const, source: imageSourceToWire(b.source) }),\n // Assistant content; never appears on a user message in practice. Skip.\n output_text: () => Result.failVoid,\n refusal: () => Result.failVoid,\n }),\n )\n\nconst parseJson = (s: string): Result.Result<unknown, JsonParseError> =>\n Result.try({\n try: () => JSON.parse(s) as unknown,\n catch: (cause) => new JsonParseError({ line: s, cause }),\n })\n\ntype RoleBucket = \"user\" | \"assistant\" | \"system\"\n\nconst roleBucket = (item: Items.HistoryItem): RoleBucket =>\n Match.value(item).pipe(\n Match.discriminatorsExhaustive(\"type\")({\n message: (m) => m.role,\n function_call: () => \"assistant\" as const,\n function_call_output: () => \"user\" as const,\n reasoning: () => \"assistant\" as const,\n }),\n )\n\nconst itemToUserBlocks = (item: Items.HistoryItem): ReadonlyArray<RequestUserContentBlock> =>\n Match.value(item).pipe(\n Match.discriminatorsExhaustive(\"type\")({\n message: (m): ReadonlyArray<RequestUserContentBlock> =>\n m.role === \"user\" ? pipe(m.content, Arr.filterMap(userContentBlock)) : [],\n function_call: (): ReadonlyArray<RequestUserContentBlock> => [],\n function_call_output: (o): ReadonlyArray<RequestUserContentBlock> => [\n { type: \"tool_result\", tool_use_id: o.call_id, content: o.output },\n ],\n reasoning: (): ReadonlyArray<RequestUserContentBlock> => [],\n }),\n )\n\nconst itemToAssistantBlocks = (\n item: Items.HistoryItem,\n): Result.Result<ReadonlyArray<RequestAssistantContentBlock>, JsonParseError> =>\n Match.value(item).pipe(\n Match.discriminatorsExhaustive(\"type\")({\n message: (m): Result.Result<ReadonlyArray<RequestAssistantContentBlock>, JsonParseError> => {\n const text = messageText(m)\n return Result.succeed(\n m.role === \"assistant\" && text.length > 0 ? [{ type: \"text\", text }] : [],\n )\n },\n function_call: (f) =>\n pipe(\n parseJson(f.arguments),\n Result.map(\n (input): ReadonlyArray<RequestAssistantContentBlock> => [\n { type: \"tool_use\", id: f.call_id, name: f.name, input },\n ],\n ),\n ),\n function_call_output: (): Result.Result<\n ReadonlyArray<RequestAssistantContentBlock>,\n JsonParseError\n > => Result.succeed([]),\n reasoning: (r) => {\n const blocks: ReadonlyArray<RequestAssistantContentBlock> =\n r.summary !== undefined\n ? [\n {\n type: \"thinking\",\n thinking: r.summary,\n ...(r.signature !== undefined && { signature: r.signature }),\n },\n ]\n : r.signature !== undefined\n ? [{ type: \"redacted_thinking\", data: r.signature }]\n : []\n return Result.succeed(blocks)\n },\n }),\n )\n\ntype GroupAcc = {\n readonly messages: ReadonlyArray<RequestMessage>\n readonly currentRole: Option.Option<\"user\" | \"assistant\">\n readonly userBuf: ReadonlyArray<RequestUserContentBlock>\n readonly assistantBuf: ReadonlyArray<RequestAssistantContentBlock>\n}\n\nconst flushAcc = (acc: GroupAcc): ReadonlyArray<RequestMessage> =>\n Option.match(acc.currentRole, {\n onNone: () => acc.messages,\n onSome: (role) =>\n role === \"user\" && acc.userBuf.length > 0\n ? [...acc.messages, { role: \"user\", content: acc.userBuf }]\n : role === \"assistant\" && acc.assistantBuf.length > 0\n ? [...acc.messages, { role: \"assistant\", content: acc.assistantBuf }]\n : acc.messages,\n })\n\nconst appendUser = (acc: GroupAcc, blocks: ReadonlyArray<RequestUserContentBlock>): GroupAcc =>\n blocks.length === 0\n ? acc\n : Option.isSome(acc.currentRole) && acc.currentRole.value === \"user\"\n ? { ...acc, userBuf: [...acc.userBuf, ...blocks] }\n : {\n messages: flushAcc(acc),\n currentRole: Option.some(\"user\"),\n userBuf: blocks,\n assistantBuf: [],\n }\n\nconst appendAssistant = (\n acc: GroupAcc,\n blocks: ReadonlyArray<RequestAssistantContentBlock>,\n): GroupAcc =>\n blocks.length === 0\n ? acc\n : Option.isSome(acc.currentRole) && acc.currentRole.value === \"assistant\"\n ? { ...acc, assistantBuf: [...acc.assistantBuf, ...blocks] }\n : {\n messages: flushAcc(acc),\n currentRole: Option.some(\"assistant\"),\n userBuf: [],\n assistantBuf: blocks,\n }\n\nconst groupStep = (\n acc: GroupAcc,\n item: Items.HistoryItem,\n): Result.Result<GroupAcc, JsonParseError> => {\n const bucket = roleBucket(item)\n if (bucket === \"system\") return Result.succeed(acc)\n if (bucket === \"user\") {\n return Result.succeed(appendUser(acc, itemToUserBlocks(item)))\n }\n return pipe(\n itemToAssistantBlocks(item),\n Result.map((blocks) => appendAssistant(acc, blocks)),\n )\n}\n\n/**\n * Group consecutive same-role items into Anthropic-shaped messages.\n * Anthropic requires strict user/assistant alternation; consecutive items\n * from the same role are folded into one message's `content`. Fails if any\n * `function_call.arguments` is not valid JSON, since Anthropic's wire shape\n * requires an object input.\n */\nconst groupedMessages = (\n history: ReadonlyArray<Items.HistoryItem>,\n): Result.Result<ReadonlyArray<RequestMessage>, JsonParseError> => {\n const initial: Result.Result<GroupAcc, JsonParseError> = Result.succeed({\n messages: [],\n currentRole: Option.none(),\n userBuf: [],\n assistantBuf: [],\n })\n return pipe(\n Arr.reduce(history, initial, (acc, item) => Result.flatMap(acc, (a) => groupStep(a, item))),\n Result.map(flushAcc),\n )\n}\n\nconst isSystemMessage = (item: Items.HistoryItem): item is Items.Message =>\n item.type === \"message\" && item.role === \"system\"\n\nconst systemFromHistory = (history: ReadonlyArray<Items.HistoryItem>): Option.Option<string> => {\n const texts = pipe(\n history,\n Arr.filterMap((item) =>\n isSystemMessage(item) ? Result.succeed(messageText(item)) : Result.failVoid,\n ),\n Arr.filter((s) => s.length > 0),\n )\n return texts.length === 0 ? Option.none() : Option.some(texts.join(\"\\n\"))\n}\n\nexport type ThinkingConfig = {\n readonly type: \"enabled\"\n readonly budget_tokens: number\n}\n\nexport type RequestBody = {\n readonly model: string\n readonly messages: ReadonlyArray<RequestMessage>\n readonly max_tokens: number\n readonly system?: string\n readonly temperature?: number\n readonly top_p?: number\n readonly top_k?: number\n readonly stop_sequences?: ReadonlyArray<string>\n readonly thinking?: ThinkingConfig\n readonly tools?: ReadonlyArray<Record<string, unknown>>\n readonly tool_choice?: Record<string, unknown>\n readonly metadata?: { readonly user_id: string }\n readonly output_config?: Record<string, unknown>\n readonly stream: true\n}\n\nexport const buildRequestBody = (params: {\n readonly model: string\n readonly history: ReadonlyArray<Items.HistoryItem>\n readonly maxTokens: number\n readonly temperature: Option.Option<number>\n readonly topP: Option.Option<number>\n readonly topK: Option.Option<number>\n readonly stopSequences: Option.Option<ReadonlyArray<string>>\n readonly thinking: Option.Option<ThinkingConfig>\n readonly tools: Option.Option<ReadonlyArray<Record<string, unknown>>>\n readonly toolChoice: Option.Option<Record<string, unknown>>\n readonly userId: Option.Option<string>\n readonly outputConfig: Option.Option<Record<string, unknown>>\n}): Result.Result<RequestBody, JsonParseError> =>\n pipe(\n groupedMessages(params.history),\n Result.map(\n (messages): RequestBody => ({\n model: params.model,\n messages,\n max_tokens: params.maxTokens,\n ...Option.match(systemFromHistory(params.history), {\n onNone: () => ({}),\n onSome: (system) => ({ system }),\n }),\n ...Option.match(params.temperature, {\n onNone: () => ({}),\n onSome: (temperature) => ({ temperature }),\n }),\n ...Option.match(params.topP, {\n onNone: () => ({}),\n onSome: (top_p) => ({ top_p }),\n }),\n ...Option.match(params.topK, {\n onNone: () => ({}),\n onSome: (top_k) => ({ top_k }),\n }),\n ...Option.match(params.stopSequences, {\n onNone: () => ({}),\n onSome: (stop_sequences) => ({ stop_sequences }),\n }),\n ...Option.match(params.thinking, {\n onNone: () => ({}),\n onSome: (thinking) => ({ thinking }),\n }),\n ...Option.match(params.tools, {\n onNone: () => ({}),\n onSome: (tools) => ({ tools }),\n }),\n ...Option.match(params.toolChoice, {\n onNone: () => ({}),\n onSome: (tool_choice) => ({ tool_choice }),\n }),\n ...Option.match(params.userId, {\n onNone: () => ({}),\n onSome: (user_id) => ({ metadata: { user_id } }),\n }),\n ...Option.match(params.outputConfig, {\n onNone: () => ({}),\n onSome: (output_config) => ({ output_config }),\n }),\n stream: true,\n }),\n ),\n )\n\n// ---------------------------------------------------------------------------\n// Stream-level state - assemble content blocks index-by-index, then emit\n// our `Items.HistoryItem[]` when `message_stop` lands.\n// ---------------------------------------------------------------------------\n\ntype BlockBuffer = {\n readonly type: WireContentBlock[\"type\"]\n readonly text: string\n readonly inputJson: string\n readonly thinking: string\n readonly signature: string\n readonly id: Option.Option<string>\n readonly name: Option.Option<string>\n readonly redactedData: Option.Option<string>\n}\n\nconst emptyBlock = (type: WireContentBlock[\"type\"]): BlockBuffer => ({\n type,\n text: \"\",\n inputJson: \"\",\n thinking: \"\",\n signature: \"\",\n id: Option.none(),\n name: Option.none(),\n redactedData: Option.none(),\n})\n\nexport type Accumulator = {\n readonly blocks: Readonly<Record<number, BlockBuffer>>\n readonly stopReason: Option.Option<string>\n readonly usage: Items.Usage\n}\n\nexport const emptyAccumulator: Accumulator = {\n blocks: {},\n stopReason: Option.none(),\n usage: {},\n}\n\nconst replaceBlock = (acc: Accumulator, index: number, block: BlockBuffer): Accumulator => ({\n ...acc,\n blocks: { ...acc.blocks, [index]: block },\n})\n\nconst updateBlock = (\n acc: Accumulator,\n index: number,\n patch: (block: BlockBuffer) => BlockBuffer,\n): Accumulator => replaceBlock(acc, index, patch(acc.blocks[index] ?? emptyBlock(\"text\")))\n\nexport const startBlock = (acc: Accumulator, index: number, block: WireContentBlock): Accumulator =>\n Match.value(block).pipe(\n Match.discriminatorsExhaustive(\"type\")({\n text: () => replaceBlock(acc, index, emptyBlock(\"text\")),\n tool_use: (b) =>\n replaceBlock(acc, index, {\n ...emptyBlock(\"tool_use\"),\n id: Option.some(b.id),\n name: Option.some(b.name),\n inputJson: typeof b.input === \"string\" ? b.input : \"\",\n }),\n thinking: () => replaceBlock(acc, index, emptyBlock(\"thinking\")),\n redacted_thinking: (b) =>\n replaceBlock(acc, index, {\n ...emptyBlock(\"redacted_thinking\"),\n redactedData: Option.some(b.data),\n }),\n }),\n )\n\nexport const appendTextDelta = (acc: Accumulator, index: number, text: string): Accumulator =>\n updateBlock(acc, index, (b) => ({ ...b, text: b.text + text }))\n\nexport const appendInputJsonDelta = (\n acc: Accumulator,\n index: number,\n partial: string,\n): Accumulator => updateBlock(acc, index, (b) => ({ ...b, inputJson: b.inputJson + partial }))\n\nexport const appendThinkingDelta = (\n acc: Accumulator,\n index: number,\n thinking: string,\n): Accumulator => updateBlock(acc, index, (b) => ({ ...b, thinking: b.thinking + thinking }))\n\nexport const appendSignatureDelta = (\n acc: Accumulator,\n index: number,\n signature: string,\n): Accumulator => updateBlock(acc, index, (b) => ({ ...b, signature: b.signature + signature }))\n\nexport const setStopReason = (acc: Accumulator, reason: string): Accumulator => ({\n ...acc,\n stopReason: Option.some(reason),\n})\n\nconst cachedFromWire = (wire: WireUsage): Option.Option<number> =>\n Option.fromNullishOr(wire.cache_read_input_tokens)\n\nexport const mergeUsage = (acc: Accumulator, wire: WireUsage): Accumulator => {\n const cached = cachedFromWire(wire)\n const usage: Items.Usage = {\n ...acc.usage,\n ...(wire.input_tokens !== undefined && { input_tokens: wire.input_tokens }),\n ...(wire.output_tokens !== undefined && { output_tokens: wire.output_tokens }),\n ...(wire.input_tokens !== undefined &&\n wire.output_tokens !== undefined && {\n total_tokens: wire.input_tokens + wire.output_tokens,\n }),\n ...Option.match(cached, {\n onNone: () => ({}),\n onSome: (cached_tokens) => ({ input_tokens_details: { cached_tokens } }),\n }),\n }\n return { ...acc, usage }\n}\n\nconst stopReasonFromAnthropic = (reason: Option.Option<string>): Turn[\"stop_reason\"] =>\n Option.match(reason, {\n onNone: () => \"stop\" as const,\n onSome: (r) =>\n Match.value(r).pipe(\n Match.when(\"tool_use\", () => \"tool_calls\" as const),\n Match.when(\"max_tokens\", () => \"max_tokens\" as const),\n Match.orElse(() => \"stop\" as const),\n ),\n })\n\nconst blocksByIndex = (acc: Accumulator): ReadonlyArray<BlockBuffer> =>\n pipe(\n Object.keys(acc.blocks),\n Arr.map((k) => Number(k)),\n Arr.sort(Order.Number),\n Arr.map((i) => acc.blocks[i]!),\n )\n\nconst blockToItems = (block: BlockBuffer): ReadonlyArray<Items.HistoryItem> =>\n Match.value(block.type).pipe(\n Match.when(\n \"text\",\n (): ReadonlyArray<Items.HistoryItem> =>\n block.text.length === 0\n ? []\n : [\n {\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: block.text }],\n },\n ],\n ),\n Match.when(\n \"tool_use\",\n (): ReadonlyArray<Items.HistoryItem> => [\n {\n type: \"function_call\",\n call_id: Option.getOrElse(block.id, () => \"\"),\n name: Option.getOrElse(block.name, () => \"\"),\n arguments: block.inputJson,\n },\n ],\n ),\n Match.when(\n \"thinking\",\n (): ReadonlyArray<Items.HistoryItem> => [\n {\n type: \"reasoning\",\n ...(block.thinking.length > 0 && { summary: block.thinking }),\n ...(block.signature.length > 0 && { signature: block.signature }),\n },\n ],\n ),\n Match.when(\n \"redacted_thinking\",\n (): ReadonlyArray<Items.HistoryItem> => [\n {\n type: \"reasoning\",\n ...Option.match(block.redactedData, {\n onNone: () => ({}),\n onSome: (signature) => ({ signature }),\n }),\n },\n ],\n ),\n Match.exhaustive,\n )\n\ntype MergeAcc = {\n readonly out: ReadonlyArray<Items.HistoryItem>\n}\n\nconst mergeStep = (acc: MergeAcc, item: Items.HistoryItem): MergeAcc => {\n const last = Arr.last(acc.out)\n if (\n Option.isSome(last) &&\n last.value.type === \"message\" &&\n last.value.role === \"assistant\" &&\n item.type === \"message\" &&\n item.role === \"assistant\"\n ) {\n const merged: Items.Message = {\n ...last.value,\n content: [...last.value.content, ...item.content],\n }\n return { out: [...acc.out.slice(0, -1), merged] }\n }\n return { out: [...acc.out, item] }\n}\n\nconst mergeAdjacentAssistantText = (\n items: ReadonlyArray<Items.HistoryItem>,\n): ReadonlyArray<Items.HistoryItem> => Arr.reduce(items, { out: [] } as MergeAcc, mergeStep).out\n\nexport const accumulatorToTurn = (acc: Accumulator): Turn => ({\n items: pipe(blocksByIndex(acc), Arr.flatMap(blockToItems), mergeAdjacentAssistantText),\n usage: acc.usage,\n stop_reason: stopReasonFromAnthropic(acc.stopReason),\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"codec.mjs","names":["Arr"],"sources":["../src/codec.ts"],"sourcesContent":["import { Array as Arr, Encoding, Match, Option, Order, Result, Schema, pipe } from \"effect\"\nimport * as Items from \"@effect-uai/core/Items\"\nimport { JsonParseError } from \"@effect-uai/core/JSONL\"\nimport type { Turn } from \"@effect-uai/core/Turn\"\n\n// ---------------------------------------------------------------------------\n// Wire schemas - subset of Anthropic Messages API we consume.\n// Reference: https://platform.claude.com/docs/en/api/messages\n// ---------------------------------------------------------------------------\n\nconst WireTextBlock = Schema.Struct({\n type: Schema.Literal(\"text\"),\n text: Schema.String,\n})\n\nconst WireToolUseBlock = Schema.Struct({\n type: Schema.Literal(\"tool_use\"),\n id: Schema.String,\n name: Schema.String,\n input: Schema.Unknown,\n})\n\nconst WireThinkingBlock = Schema.Struct({\n type: Schema.Literal(\"thinking\"),\n thinking: Schema.String,\n signature: Schema.optional(Schema.String),\n})\n\nconst WireRedactedThinkingBlock = Schema.Struct({\n type: Schema.Literal(\"redacted_thinking\"),\n data: Schema.String,\n})\n\nexport const WireContentBlock = Schema.Union([\n WireTextBlock,\n WireToolUseBlock,\n WireThinkingBlock,\n WireRedactedThinkingBlock,\n])\nexport type WireContentBlock = typeof WireContentBlock.Type\n\nconst WireUsage = Schema.Struct({\n input_tokens: Schema.optional(Schema.Number),\n output_tokens: Schema.optional(Schema.Number),\n cache_creation_input_tokens: Schema.optional(Schema.NullOr(Schema.Number)),\n cache_read_input_tokens: Schema.optional(Schema.NullOr(Schema.Number)),\n})\nexport type WireUsage = typeof WireUsage.Type\n\n// ---------------------------------------------------------------------------\n// History → request body\n// ---------------------------------------------------------------------------\n\ntype RequestTextContent = {\n readonly type: \"text\"\n readonly text: string\n}\n\ntype RequestToolResultContent = {\n readonly type: \"tool_result\"\n readonly tool_use_id: string\n readonly content: string\n}\n\ntype RequestToolUseContent = {\n readonly type: \"tool_use\"\n readonly id: string\n readonly name: string\n readonly input: unknown\n}\n\ntype RequestThinkingContent = {\n readonly type: \"thinking\"\n readonly thinking: string\n readonly signature?: string\n}\n\ntype RequestRedactedThinkingContent = {\n readonly type: \"redacted_thinking\"\n readonly data: string\n}\n\ntype RequestImageContent = {\n readonly type: \"image\"\n readonly source:\n | { readonly type: \"url\"; readonly url: string }\n | { readonly type: \"base64\"; readonly media_type: string; readonly data: string }\n}\n\ntype RequestUserContentBlock = RequestTextContent | RequestToolResultContent | RequestImageContent\n\ntype RequestAssistantContentBlock =\n | RequestTextContent\n | RequestToolUseContent\n | RequestThinkingContent\n | RequestRedactedThinkingContent\n\ntype RequestUserMessage = {\n readonly role: \"user\"\n readonly content: ReadonlyArray<RequestUserContentBlock>\n}\n\ntype RequestAssistantMessage = {\n readonly role: \"assistant\"\n readonly content: ReadonlyArray<RequestAssistantContentBlock>\n}\n\ntype RequestMessage = RequestUserMessage | RequestAssistantMessage\n\nconst blockText = Match.type<Items.ContentBlock>().pipe(\n Match.discriminatorsExhaustive(\"type\")({\n input_text: (b) => b.text,\n input_image: () => \"\",\n output_text: (b) => b.text,\n refusal: (b) => b.text,\n }),\n)\n\nconst messageText = (message: Items.Message): string => message.content.map(blockText).join(\"\")\n\nconst imageSourceToWire = Match.type<Items.InputImage[\"source\"]>().pipe(\n Match.tag(\"url\", (s): RequestImageContent[\"source\"] => ({ type: \"url\", url: s.url })),\n Match.tag(\"base64\", (s): RequestImageContent[\"source\"] => ({\n type: \"base64\",\n media_type: s.mimeType,\n data: s.base64,\n })),\n Match.tag(\"bytes\", (s): RequestImageContent[\"source\"] => ({\n type: \"base64\",\n media_type: s.mimeType,\n data: Encoding.encodeBase64(s.bytes),\n })),\n Match.exhaustive,\n)\n\nconst userContentBlock = (\n block: Items.ContentBlock,\n): Result.Result<RequestUserContentBlock, void> =>\n Match.value(block).pipe(\n Match.discriminatorsExhaustive(\"type\")({\n input_text: (b) =>\n b.text.length === 0\n ? Result.failVoid\n : Result.succeed({ type: \"text\" as const, text: b.text }),\n input_image: (b) =>\n Result.succeed({ type: \"image\" as const, source: imageSourceToWire(b.source) }),\n // Assistant content; never appears on a user message in practice. Skip.\n output_text: () => Result.failVoid,\n refusal: () => Result.failVoid,\n }),\n )\n\nconst parseJson = (s: string): Result.Result<unknown, JsonParseError> =>\n Result.try({\n try: () => JSON.parse(s) as unknown,\n catch: (cause) => new JsonParseError({ line: s, cause }),\n })\n\ntype RoleBucket = \"user\" | \"assistant\" | \"system\"\n\nconst roleBucket = (item: Items.HistoryItem): RoleBucket =>\n Match.value(item).pipe(\n Match.discriminatorsExhaustive(\"type\")({\n message: (m) => m.role,\n function_call: () => \"assistant\" as const,\n function_call_output: () => \"user\" as const,\n reasoning: () => \"assistant\" as const,\n }),\n )\n\nconst itemToUserBlocks = (item: Items.HistoryItem): ReadonlyArray<RequestUserContentBlock> =>\n Match.value(item).pipe(\n Match.discriminatorsExhaustive(\"type\")({\n message: (m): ReadonlyArray<RequestUserContentBlock> =>\n m.role === \"user\" ? pipe(m.content, Arr.filterMap(userContentBlock)) : [],\n function_call: (): ReadonlyArray<RequestUserContentBlock> => [],\n function_call_output: (o): ReadonlyArray<RequestUserContentBlock> => [\n { type: \"tool_result\", tool_use_id: o.call_id, content: o.output },\n ],\n reasoning: (): ReadonlyArray<RequestUserContentBlock> => [],\n }),\n )\n\nconst itemToAssistantBlocks = (\n item: Items.HistoryItem,\n): Result.Result<ReadonlyArray<RequestAssistantContentBlock>, JsonParseError> =>\n Match.value(item).pipe(\n Match.discriminatorsExhaustive(\"type\")({\n message: (m): Result.Result<ReadonlyArray<RequestAssistantContentBlock>, JsonParseError> => {\n const text = messageText(m)\n return Result.succeed(\n m.role === \"assistant\" && text.length > 0 ? [{ type: \"text\", text }] : [],\n )\n },\n function_call: (f) =>\n pipe(\n parseJson(f.arguments),\n Result.map((input): ReadonlyArray<RequestAssistantContentBlock> => [\n { type: \"tool_use\", id: f.call_id, name: f.name, input },\n ]),\n ),\n function_call_output: (): Result.Result<\n ReadonlyArray<RequestAssistantContentBlock>,\n JsonParseError\n > => Result.succeed([]),\n reasoning: (r) => {\n const blocks: ReadonlyArray<RequestAssistantContentBlock> =\n r.summary !== undefined\n ? [\n {\n type: \"thinking\",\n thinking: r.summary,\n ...(r.signature !== undefined && { signature: r.signature }),\n },\n ]\n : r.signature !== undefined\n ? [{ type: \"redacted_thinking\", data: r.signature }]\n : []\n return Result.succeed(blocks)\n },\n }),\n )\n\ntype GroupAcc = {\n readonly messages: ReadonlyArray<RequestMessage>\n readonly currentRole: Option.Option<\"user\" | \"assistant\">\n readonly userBuf: ReadonlyArray<RequestUserContentBlock>\n readonly assistantBuf: ReadonlyArray<RequestAssistantContentBlock>\n}\n\nconst flushAcc = (acc: GroupAcc): ReadonlyArray<RequestMessage> =>\n Option.match(acc.currentRole, {\n onNone: () => acc.messages,\n onSome: (role) =>\n role === \"user\" && acc.userBuf.length > 0\n ? [...acc.messages, { role: \"user\", content: acc.userBuf }]\n : role === \"assistant\" && acc.assistantBuf.length > 0\n ? [...acc.messages, { role: \"assistant\", content: acc.assistantBuf }]\n : acc.messages,\n })\n\nconst appendUser = (acc: GroupAcc, blocks: ReadonlyArray<RequestUserContentBlock>): GroupAcc =>\n blocks.length === 0\n ? acc\n : Option.isSome(acc.currentRole) && acc.currentRole.value === \"user\"\n ? { ...acc, userBuf: [...acc.userBuf, ...blocks] }\n : {\n messages: flushAcc(acc),\n currentRole: Option.some(\"user\"),\n userBuf: blocks,\n assistantBuf: [],\n }\n\nconst appendAssistant = (\n acc: GroupAcc,\n blocks: ReadonlyArray<RequestAssistantContentBlock>,\n): GroupAcc =>\n blocks.length === 0\n ? acc\n : Option.isSome(acc.currentRole) && acc.currentRole.value === \"assistant\"\n ? { ...acc, assistantBuf: [...acc.assistantBuf, ...blocks] }\n : {\n messages: flushAcc(acc),\n currentRole: Option.some(\"assistant\"),\n userBuf: [],\n assistantBuf: blocks,\n }\n\nconst groupStep = (\n acc: GroupAcc,\n item: Items.HistoryItem,\n): Result.Result<GroupAcc, JsonParseError> => {\n const bucket = roleBucket(item)\n if (bucket === \"system\") return Result.succeed(acc)\n if (bucket === \"user\") {\n return Result.succeed(appendUser(acc, itemToUserBlocks(item)))\n }\n return pipe(\n itemToAssistantBlocks(item),\n Result.map((blocks) => appendAssistant(acc, blocks)),\n )\n}\n\n/**\n * Group consecutive same-role items into Anthropic-shaped messages.\n * Anthropic requires strict user/assistant alternation; consecutive items\n * from the same role are folded into one message's `content`. Fails if any\n * `function_call.arguments` is not valid JSON, since Anthropic's wire shape\n * requires an object input.\n */\nconst groupedMessages = (\n history: ReadonlyArray<Items.HistoryItem>,\n): Result.Result<ReadonlyArray<RequestMessage>, JsonParseError> => {\n const initial: Result.Result<GroupAcc, JsonParseError> = Result.succeed({\n messages: [],\n currentRole: Option.none(),\n userBuf: [],\n assistantBuf: [],\n })\n return pipe(\n Arr.reduce(history, initial, (acc, item) => Result.flatMap(acc, (a) => groupStep(a, item))),\n Result.map(flushAcc),\n )\n}\n\nconst isSystemMessage = (item: Items.HistoryItem): item is Items.Message =>\n item.type === \"message\" && item.role === \"system\"\n\nconst systemFromHistory = (history: ReadonlyArray<Items.HistoryItem>): Option.Option<string> => {\n const texts = pipe(\n history,\n Arr.filterMap((item) =>\n isSystemMessage(item) ? Result.succeed(messageText(item)) : Result.failVoid,\n ),\n Arr.filter((s) => s.length > 0),\n )\n return texts.length === 0 ? Option.none() : Option.some(texts.join(\"\\n\"))\n}\n\nexport type ThinkingConfig = {\n readonly type: \"enabled\"\n readonly budget_tokens: number\n}\n\n/** Cache lifetime. `1h` writes cost 2x base input; `5m` costs 1.25x. */\nexport type CacheTtl = \"5m\" | \"1h\"\n\n/**\n * Request-level cache breakpoint. Anthropic applies it to the last cacheable\n * block and moves it forward as the conversation grows, so the cached prefix\n * (`tools` → `system` → `messages`) follows the conversation without the\n * caller re-placing anything.\n */\nexport type CacheControl = {\n readonly type: \"ephemeral\"\n readonly ttl?: CacheTtl\n}\n\nexport type RequestBody = {\n readonly model: string\n readonly messages: ReadonlyArray<RequestMessage>\n readonly max_tokens: number\n readonly system?: string\n readonly temperature?: number\n readonly top_p?: number\n readonly top_k?: number\n readonly stop_sequences?: ReadonlyArray<string>\n readonly thinking?: ThinkingConfig\n readonly tools?: ReadonlyArray<Record<string, unknown>>\n readonly tool_choice?: Record<string, unknown>\n readonly metadata?: { readonly user_id: string }\n readonly output_config?: Record<string, unknown>\n readonly cache_control?: CacheControl\n readonly stream: true\n}\n\nexport const buildRequestBody = (params: {\n readonly model: string\n readonly history: ReadonlyArray<Items.HistoryItem>\n readonly maxTokens: number\n readonly temperature: Option.Option<number>\n readonly topP: Option.Option<number>\n readonly topK: Option.Option<number>\n readonly stopSequences: Option.Option<ReadonlyArray<string>>\n readonly thinking: Option.Option<ThinkingConfig>\n readonly tools: Option.Option<ReadonlyArray<Record<string, unknown>>>\n readonly toolChoice: Option.Option<Record<string, unknown>>\n readonly userId: Option.Option<string>\n readonly outputConfig: Option.Option<Record<string, unknown>>\n readonly cacheControl: Option.Option<CacheControl>\n}): Result.Result<RequestBody, JsonParseError> =>\n pipe(\n groupedMessages(params.history),\n Result.map((messages): RequestBody => ({\n model: params.model,\n messages,\n max_tokens: params.maxTokens,\n ...Option.match(systemFromHistory(params.history), {\n onNone: () => ({}),\n onSome: (system) => ({ system }),\n }),\n ...Option.match(params.temperature, {\n onNone: () => ({}),\n onSome: (temperature) => ({ temperature }),\n }),\n ...Option.match(params.topP, {\n onNone: () => ({}),\n onSome: (top_p) => ({ top_p }),\n }),\n ...Option.match(params.topK, {\n onNone: () => ({}),\n onSome: (top_k) => ({ top_k }),\n }),\n ...Option.match(params.stopSequences, {\n onNone: () => ({}),\n onSome: (stop_sequences) => ({ stop_sequences }),\n }),\n ...Option.match(params.thinking, {\n onNone: () => ({}),\n onSome: (thinking) => ({ thinking }),\n }),\n ...Option.match(params.tools, {\n onNone: () => ({}),\n onSome: (tools) => ({ tools }),\n }),\n ...Option.match(params.toolChoice, {\n onNone: () => ({}),\n onSome: (tool_choice) => ({ tool_choice }),\n }),\n ...Option.match(params.userId, {\n onNone: () => ({}),\n onSome: (user_id) => ({ metadata: { user_id } }),\n }),\n ...Option.match(params.outputConfig, {\n onNone: () => ({}),\n onSome: (output_config) => ({ output_config }),\n }),\n ...Option.match(params.cacheControl, {\n onNone: () => ({}),\n onSome: (cache_control) => ({ cache_control }),\n }),\n stream: true,\n })),\n )\n\n// ---------------------------------------------------------------------------\n// Stream-level state - assemble content blocks index-by-index, then emit\n// our `Items.HistoryItem[]` when `message_stop` lands.\n// ---------------------------------------------------------------------------\n\ntype BlockBuffer = {\n readonly type: WireContentBlock[\"type\"]\n readonly text: string\n readonly inputJson: string\n readonly thinking: string\n readonly signature: string\n readonly id: Option.Option<string>\n readonly name: Option.Option<string>\n readonly redactedData: Option.Option<string>\n}\n\nconst emptyBlock = (type: WireContentBlock[\"type\"]): BlockBuffer => ({\n type,\n text: \"\",\n inputJson: \"\",\n thinking: \"\",\n signature: \"\",\n id: Option.none(),\n name: Option.none(),\n redactedData: Option.none(),\n})\n\nexport type Accumulator = {\n readonly blocks: Readonly<Record<number, BlockBuffer>>\n readonly stopReason: Option.Option<string>\n readonly usage: Items.Usage\n}\n\nexport const emptyAccumulator: Accumulator = {\n blocks: {},\n stopReason: Option.none(),\n usage: {},\n}\n\nconst replaceBlock = (acc: Accumulator, index: number, block: BlockBuffer): Accumulator => ({\n ...acc,\n blocks: { ...acc.blocks, [index]: block },\n})\n\nconst updateBlock = (\n acc: Accumulator,\n index: number,\n patch: (block: BlockBuffer) => BlockBuffer,\n): Accumulator => replaceBlock(acc, index, patch(acc.blocks[index] ?? emptyBlock(\"text\")))\n\nexport const startBlock = (acc: Accumulator, index: number, block: WireContentBlock): Accumulator =>\n Match.value(block).pipe(\n Match.discriminatorsExhaustive(\"type\")({\n text: () => replaceBlock(acc, index, emptyBlock(\"text\")),\n tool_use: (b) =>\n replaceBlock(acc, index, {\n ...emptyBlock(\"tool_use\"),\n id: Option.some(b.id),\n name: Option.some(b.name),\n inputJson: typeof b.input === \"string\" ? b.input : \"\",\n }),\n thinking: () => replaceBlock(acc, index, emptyBlock(\"thinking\")),\n redacted_thinking: (b) =>\n replaceBlock(acc, index, {\n ...emptyBlock(\"redacted_thinking\"),\n redactedData: Option.some(b.data),\n }),\n }),\n )\n\nexport const appendTextDelta = (acc: Accumulator, index: number, text: string): Accumulator =>\n updateBlock(acc, index, (b) => ({ ...b, text: b.text + text }))\n\nexport const appendInputJsonDelta = (\n acc: Accumulator,\n index: number,\n partial: string,\n): Accumulator => updateBlock(acc, index, (b) => ({ ...b, inputJson: b.inputJson + partial }))\n\nexport const appendThinkingDelta = (\n acc: Accumulator,\n index: number,\n thinking: string,\n): Accumulator => updateBlock(acc, index, (b) => ({ ...b, thinking: b.thinking + thinking }))\n\nexport const appendSignatureDelta = (\n acc: Accumulator,\n index: number,\n signature: string,\n): Accumulator => updateBlock(acc, index, (b) => ({ ...b, signature: b.signature + signature }))\n\nexport const setStopReason = (acc: Accumulator, reason: string): Accumulator => ({\n ...acc,\n stopReason: Option.some(reason),\n})\n\n// Anthropic splits input across three billed buckets: `input_tokens`\n// (post-breakpoint), cache reads, and cache writes. All three are kept;\n// `input_tokens` is not the input total. Each field carries over from the\n// prior value since a streamed turn spreads usage across events (input +\n// cache on message_start, output_tokens on message_delta), so total_tokens is\n// summed from the accumulated buckets, not one event.\nexport const mergeUsage = (acc: Accumulator, wire: WireUsage): Accumulator => {\n const prev = acc.usage\n const input_tokens = wire.input_tokens ?? prev.input_tokens\n const output_tokens = wire.output_tokens ?? prev.output_tokens\n const cached_tokens = wire.cache_read_input_tokens ?? prev.input_tokens_details?.cached_tokens\n const cache_write_tokens =\n wire.cache_creation_input_tokens ?? prev.input_tokens_details?.cache_write_tokens\n\n const buckets = [input_tokens, cached_tokens, cache_write_tokens, output_tokens]\n const total_tokens = buckets.every((v) => v === undefined)\n ? undefined\n : buckets.reduce<number>((sum, v) => sum + (v ?? 0), 0)\n\n const details: Items.InputTokensDetails = {\n ...(cached_tokens !== undefined && { cached_tokens }),\n ...(cache_write_tokens !== undefined && { cache_write_tokens }),\n }\n const usage: Items.Usage = {\n ...(input_tokens !== undefined && { input_tokens }),\n ...(output_tokens !== undefined && { output_tokens }),\n ...(total_tokens !== undefined && { total_tokens }),\n ...(Object.keys(details).length > 0 && { input_tokens_details: details }),\n }\n return { ...acc, usage }\n}\n\nconst stopReasonFromAnthropic = (reason: Option.Option<string>): Turn[\"stop_reason\"] =>\n Option.match(reason, {\n onNone: () => \"stop\" as const,\n onSome: (r) =>\n Match.value(r).pipe(\n Match.when(\"tool_use\", () => \"tool_calls\" as const),\n Match.when(\"max_tokens\", () => \"max_tokens\" as const),\n Match.orElse(() => \"stop\" as const),\n ),\n })\n\nconst blocksByIndex = (acc: Accumulator): ReadonlyArray<BlockBuffer> =>\n pipe(\n Object.keys(acc.blocks),\n Arr.map((k) => Number(k)),\n Arr.sort(Order.Number),\n Arr.map((i) => acc.blocks[i]!),\n )\n\nconst blockToItems = (block: BlockBuffer): ReadonlyArray<Items.HistoryItem> =>\n Match.value(block.type).pipe(\n Match.when(\"text\", (): ReadonlyArray<Items.HistoryItem> =>\n block.text.length === 0\n ? []\n : [\n {\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: block.text }],\n },\n ],\n ),\n Match.when(\"tool_use\", (): ReadonlyArray<Items.HistoryItem> => [\n {\n type: \"function_call\",\n call_id: Option.getOrElse(block.id, () => \"\"),\n name: Option.getOrElse(block.name, () => \"\"),\n arguments: block.inputJson,\n },\n ]),\n Match.when(\"thinking\", (): ReadonlyArray<Items.HistoryItem> => [\n {\n type: \"reasoning\",\n ...(block.thinking.length > 0 && { summary: block.thinking }),\n ...(block.signature.length > 0 && { signature: block.signature }),\n },\n ]),\n Match.when(\"redacted_thinking\", (): ReadonlyArray<Items.HistoryItem> => [\n {\n type: \"reasoning\",\n ...Option.match(block.redactedData, {\n onNone: () => ({}),\n onSome: (signature) => ({ signature }),\n }),\n },\n ]),\n Match.exhaustive,\n )\n\ntype MergeAcc = {\n readonly out: ReadonlyArray<Items.HistoryItem>\n}\n\nconst mergeStep = (acc: MergeAcc, item: Items.HistoryItem): MergeAcc => {\n const last = Arr.last(acc.out)\n if (\n Option.isSome(last) &&\n last.value.type === \"message\" &&\n last.value.role === \"assistant\" &&\n item.type === \"message\" &&\n item.role === \"assistant\"\n ) {\n const merged: Items.Message = {\n ...last.value,\n content: [...last.value.content, ...item.content],\n }\n return { out: [...acc.out.slice(0, -1), merged] }\n }\n return { out: [...acc.out, item] }\n}\n\nconst mergeAdjacentAssistantText = (\n items: ReadonlyArray<Items.HistoryItem>,\n): ReadonlyArray<Items.HistoryItem> => Arr.reduce(items, { out: [] } as MergeAcc, mergeStep).out\n\nexport const accumulatorToTurn = (acc: Accumulator): Turn => ({\n items: pipe(blocksByIndex(acc), Arr.flatMap(blockToItems), mergeAdjacentAssistantText),\n usage: acc.usage,\n stop_reason: stopReasonFromAnthropic(acc.stopReason),\n})\n"],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
var comma = ",".charCodeAt(0);
|
|
3
3
|
var semicolon = ";".charCodeAt(0);
|
|
4
4
|
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
5
|
-
var intToChar = new Uint8Array(64);
|
|
6
|
-
var charToInt = new Uint8Array(128);
|
|
5
|
+
var intToChar = /* @__PURE__ */ new Uint8Array(64);
|
|
6
|
+
var charToInt = /* @__PURE__ */ new Uint8Array(128);
|
|
7
7
|
for (let i = 0; i < chars.length; i++) {
|
|
8
8
|
const c = chars.charCodeAt(i);
|
|
9
9
|
intToChar[i] = c;
|
|
@@ -20,7 +20,7 @@ function encodeInteger(builder, num, relative) {
|
|
|
20
20
|
} while (delta > 0);
|
|
21
21
|
return num;
|
|
22
22
|
}
|
|
23
|
-
var bufLength =
|
|
23
|
+
var bufLength = 16384;
|
|
24
24
|
var td = typeof TextDecoder !== "undefined" ? /* @__PURE__ */ new TextDecoder() : typeof Buffer !== "undefined" ? { decode(buf) {
|
|
25
25
|
return Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength).toString();
|
|
26
26
|
} } : { decode(buf) {
|
|
@@ -218,7 +218,7 @@ function getBtoa() {
|
|
|
218
218
|
throw new Error("Unsupported environment: `window.btoa` or `Buffer` should be supported.");
|
|
219
219
|
};
|
|
220
220
|
}
|
|
221
|
-
const btoa =
|
|
221
|
+
const btoa = /*#__PURE__*/ getBtoa();
|
|
222
222
|
var SourceMap = class {
|
|
223
223
|
constructor(properties) {
|
|
224
224
|
this.version = 3;
|
|
@@ -355,16 +355,17 @@ var Mappings = class {
|
|
|
355
355
|
loc.line,
|
|
356
356
|
loc.column
|
|
357
357
|
];
|
|
358
|
-
if (this.hires === "boundary")
|
|
359
|
-
if (
|
|
358
|
+
if (this.hires === "boundary") {
|
|
359
|
+
if (wordRegex.test(original[originalCharIndex])) {
|
|
360
|
+
if (!charInHiresBoundary) {
|
|
361
|
+
this.rawSegments.push(segment);
|
|
362
|
+
charInHiresBoundary = true;
|
|
363
|
+
}
|
|
364
|
+
} else {
|
|
360
365
|
this.rawSegments.push(segment);
|
|
361
|
-
charInHiresBoundary =
|
|
366
|
+
charInHiresBoundary = false;
|
|
362
367
|
}
|
|
363
|
-
} else
|
|
364
|
-
this.rawSegments.push(segment);
|
|
365
|
-
charInHiresBoundary = false;
|
|
366
|
-
}
|
|
367
|
-
else this.rawSegments.push(segment);
|
|
368
|
+
} else this.rawSegments.push(segment);
|
|
368
369
|
}
|
|
369
370
|
loc.column += 1;
|
|
370
371
|
this.generatedCodeColumn += 1;
|
|
@@ -1010,4 +1011,4 @@ var MagicString = class MagicString {
|
|
|
1010
1011
|
//#endregion
|
|
1011
1012
|
export { MagicString as default };
|
|
1012
1013
|
|
|
1013
|
-
//# sourceMappingURL=magic-string.es-
|
|
1014
|
+
//# sourceMappingURL=magic-string.es-CUAnjKYC.mjs.map
|