@effect-uai/anthropic 0.19.0-dev-20261110065930 → 0.19.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.
@@ -1 +1 @@
1
- {"version":3,"file":"AnthropicTools.d.mts","names":[],"sources":["../src/AnthropicTools.ts"],"mappings":";;;;;cAeM,cAAY,OAAA;;;;;;KAMN,sBAAsB,aAAa;;cAiBlC,qBAAmB,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;;KACpB,6BAA6B,oBAAoB;KAEjD;WACD;WACA,iBAAiB;WACjB,iBAAiB;WACjB,eAAe;;;cAIb,gBAAa,OAAU,qBAAgB,KAAA,2BAAA;WAP/B;WACO,iBAAA;WACA,iBAAA;WACF,eAAA;WAUN;;;;cAIP,mBAAiB,KAAA,+BAAA;WAKZ;;;;;;;;KAQN;WACD;WACA;;;;;;;cAgDE,sBAAmB,OACvB,cAAc,KAAK,4CACzB,OAAO,OAAO,cAAc,0BAA0B"}
1
+ {"version":3,"file":"AnthropicTools.d.mts","names":[],"sources":["../src/AnthropicTools.ts"],"mappings":";;;;;cAea,cAAY,OAAA;;;;;;KAMb,sBAAsB,aAAa;;cAiBlC,qBAAmB,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;;KACpB,6BAA6B,oBAAoB;KAEjD;WACD;WACA,iBAAiB;WACjB,iBAAiB;WACjB,eAAe;;;cAIb,gBAAa,OAAU,qBAAgB,KAAA,2BAAA;WAP/B;WACO,iBAAA;WACA,iBAAA;WACF,eAAA;WAUN;;;;cAIP,mBAAiB,KAAA,+BAAA;WAKZ;;;;;;;;KAQN;WACD;WACA;;;;;;;cAgDE,sBAAmB,OACvB,cAAc,KAAK,4CACzB,OAAO,OAAO,cAAc,0BAA0B"}
@@ -4,6 +4,7 @@ import * as Tool from "@effect-uai/core/Tool";
4
4
  //#region src/AnthropicTools.ts
5
5
  var AnthropicTools_exports = /* @__PURE__ */ __exportAll({
6
6
  AnthropicToolConfig: () => AnthropicToolConfig,
7
+ UserLocation: () => UserLocation,
7
8
  codeExecutionTool: () => codeExecutionTool,
8
9
  renderProviderTools: () => renderProviderTools,
9
10
  webSearchTool: () => webSearchTool
@@ -89,6 +90,6 @@ const renderOne = (tool) => tool.provider !== "anthropic" ? Result.fail({
89
90
  */
90
91
  const renderProviderTools = (tools) => Result.all(tools.map(renderOne));
91
92
  //#endregion
92
- export { AnthropicToolConfig, codeExecutionTool, renderProviderTools, AnthropicTools_exports as t, webSearchTool };
93
+ export { AnthropicToolConfig, UserLocation, codeExecutionTool, renderProviderTools, AnthropicTools_exports as t, webSearchTool };
93
94
 
94
95
  //# sourceMappingURL=AnthropicTools.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnthropicTools.mjs","names":[],"sources":["../src/AnthropicTools.ts"],"sourcesContent":["import { Match, Result, Schema } from \"effect\"\nimport * as Tool from \"@effect-uai/core/Tool\"\n\n// ---------------------------------------------------------------------------\n// Anthropic provider-hosted tools. Each is a `Tool.provider` whose `config`\n// carries the version-dated wire `type` string plus its options; the renderer\n// maps it to a native entry appended to the `tools` array alongside custom\n// tools. The `inputSchema` is never sent (provider tools are partitioned out\n// of the custom-tool declarations), so `Tool.noInput` suffices.\n// Reference: https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/web-search-tool\n// ---------------------------------------------------------------------------\n\nconst WEB_SEARCH_TYPE = \"web_search_20250305\"\nconst CODE_EXECUTION_TYPE = \"code_execution_20250522\"\n\nconst UserLocation = Schema.Struct({\n city: Schema.optional(Schema.String),\n region: Schema.optional(Schema.String),\n country: Schema.optional(Schema.String),\n timezone: Schema.optional(Schema.String),\n})\nexport type UserLocation = typeof UserLocation.Type\n\nconst WebSearchConfig = Schema.Struct({\n kind: Schema.Literal(\"web_search\"),\n type: Schema.String,\n maxUses: Schema.optional(Schema.Number),\n allowedDomains: Schema.optional(Schema.Array(Schema.String)),\n blockedDomains: Schema.optional(Schema.Array(Schema.String)),\n userLocation: Schema.optional(UserLocation),\n})\n\nconst CodeExecutionConfig = Schema.Struct({\n kind: Schema.Literal(\"code_execution\"),\n type: Schema.String,\n})\n\n/** Discriminated config for an Anthropic hosted tool. */\nexport const AnthropicToolConfig = Schema.Union([WebSearchConfig, CodeExecutionConfig])\nexport type AnthropicToolConfig = typeof AnthropicToolConfig.Type\n\nexport type WebSearchOptions = {\n readonly maxUses?: number\n readonly allowedDomains?: ReadonlyArray<string>\n readonly blockedDomains?: ReadonlyArray<string>\n readonly userLocation?: UserLocation\n}\n\n/** Anthropic-hosted web search. */\nexport const webSearchTool = (opts: WebSearchOptions = {}) =>\n Tool.provider({\n name: \"web_search\",\n description: \"Search the web, executed by Anthropic.\",\n inputSchema: Tool.noInput,\n provider: \"anthropic\",\n config: { kind: \"web_search\", type: WEB_SEARCH_TYPE, ...opts } as const,\n })\n\n/** Anthropic-hosted code execution (Python sandbox). */\nexport const codeExecutionTool = Tool.provider({\n name: \"code_execution\",\n description: \"Run Python in a sandbox, executed by Anthropic.\",\n inputSchema: Tool.noInput,\n provider: \"anthropic\",\n config: { kind: \"code_execution\", type: CODE_EXECUTION_TYPE } as const,\n})\n\n/**\n * A provider tool this adapter cannot render — a foreign `provider` or an\n * unrecognized `config`. Carried as data so `Anthropic.ts` can lift it into a\n * typed `AiError.Unsupported`.\n */\nexport type ToolRenderError = {\n readonly capability: string\n readonly reason: string\n}\n\nconst userLocationWire = (loc: UserLocation): Record<string, unknown> => ({\n type: \"approximate\",\n ...(loc.city !== undefined && { city: loc.city }),\n ...(loc.region !== undefined && { region: loc.region }),\n ...(loc.country !== undefined && { country: loc.country }),\n ...(loc.timezone !== undefined && { timezone: loc.timezone }),\n})\n\nconst configToWire = Match.type<AnthropicToolConfig>().pipe(\n Match.discriminatorsExhaustive(\"kind\")({\n web_search: (c): Record<string, unknown> => ({\n type: c.type,\n name: \"web_search\",\n ...(c.maxUses !== undefined && { max_uses: c.maxUses }),\n ...(c.allowedDomains !== undefined && { allowed_domains: c.allowedDomains }),\n ...(c.blockedDomains !== undefined && { blocked_domains: c.blockedDomains }),\n ...(c.userLocation !== undefined && { user_location: userLocationWire(c.userLocation) }),\n }),\n code_execution: (c): Record<string, unknown> => ({ type: c.type, name: \"code_execution\" }),\n }),\n)\n\nconst decodeConfig = Schema.decodeUnknownResult(AnthropicToolConfig)\n\nconst renderOne = (\n tool: Tool.ProviderTool<string, any, string, any>,\n): Result.Result<Record<string, unknown>, ToolRenderError> =>\n tool.provider !== \"anthropic\"\n ? Result.fail({\n capability: `providerTool:${tool.provider}`,\n reason: `tool \"${tool.name}\" is hosted by \"${tool.provider}\", not anthropic`,\n })\n : decodeConfig(tool.config).pipe(\n Result.map(configToWire),\n Result.mapError((): ToolRenderError => ({\n capability: \"providerTool\",\n reason: `unrecognized Anthropic provider tool config on \"${tool.name}\"`,\n })),\n )\n\n/**\n * Render a toolkit's Anthropic provider tools to native `tools` entries. Fails\n * with a `ToolRenderError` on the first foreign or unrecognized tool rather\n * than dropping it.\n */\nexport const renderProviderTools = (\n tools: ReadonlyArray<Tool.ProviderTool<string, any, string, any>>,\n): Result.Result<ReadonlyArray<Record<string, unknown>>, ToolRenderError> =>\n Result.all(tools.map(renderOne))\n"],"mappings":";;;;;;;;;;AAYA,MAAM,kBAAkB;AACxB,MAAM,sBAAsB;AAE5B,MAAM,eAAe,OAAO,OAAO;CACjC,MAAM,OAAO,SAAS,OAAO,MAAM;CACnC,QAAQ,OAAO,SAAS,OAAO,MAAM;CACrC,SAAS,OAAO,SAAS,OAAO,MAAM;CACtC,UAAU,OAAO,SAAS,OAAO,MAAM;AACzC,CAAC;AAGD,MAAM,kBAAkB,OAAO,OAAO;CACpC,MAAM,OAAO,QAAQ,YAAY;CACjC,MAAM,OAAO;CACb,SAAS,OAAO,SAAS,OAAO,MAAM;CACtC,gBAAgB,OAAO,SAAS,OAAO,MAAM,OAAO,MAAM,CAAC;CAC3D,gBAAgB,OAAO,SAAS,OAAO,MAAM,OAAO,MAAM,CAAC;CAC3D,cAAc,OAAO,SAAS,YAAY;AAC5C,CAAC;AAED,MAAM,sBAAsB,OAAO,OAAO;CACxC,MAAM,OAAO,QAAQ,gBAAgB;CACrC,MAAM,OAAO;AACf,CAAC;;AAGD,MAAa,sBAAsB,OAAO,MAAM,CAAC,iBAAiB,mBAAmB,CAAC;;AAWtF,MAAa,iBAAiB,OAAyB,CAAC,MACtD,KAAK,SAAS;CACZ,MAAM;CACN,aAAa;CACb,aAAa,KAAK;CAClB,UAAU;CACV,QAAQ;EAAE,MAAM;EAAc,MAAM;EAAiB,GAAG;CAAK;AAC/D,CAAC;;AAGH,MAAa,oBAAoB,KAAK,SAAS;CAC7C,MAAM;CACN,aAAa;CACb,aAAa,KAAK;CAClB,UAAU;CACV,QAAQ;EAAE,MAAM;EAAkB,MAAM;CAAoB;AAC9D,CAAC;AAYD,MAAM,oBAAoB,SAAgD;CACxE,MAAM;CACN,GAAI,IAAI,SAAS,KAAA,KAAa,EAAE,MAAM,IAAI,KAAK;CAC/C,GAAI,IAAI,WAAW,KAAA,KAAa,EAAE,QAAQ,IAAI,OAAO;CACrD,GAAI,IAAI,YAAY,KAAA,KAAa,EAAE,SAAS,IAAI,QAAQ;CACxD,GAAI,IAAI,aAAa,KAAA,KAAa,EAAE,UAAU,IAAI,SAAS;AAC7D;AAEA,MAAM,eAAe,MAAM,KAA0B,CAAC,CAAC,KACrD,MAAM,yBAAyB,MAAM,CAAC,CAAC;CACrC,aAAa,OAAgC;EAC3C,MAAM,EAAE;EACR,MAAM;EACN,GAAI,EAAE,YAAY,KAAA,KAAa,EAAE,UAAU,EAAE,QAAQ;EACrD,GAAI,EAAE,mBAAmB,KAAA,KAAa,EAAE,iBAAiB,EAAE,eAAe;EAC1E,GAAI,EAAE,mBAAmB,KAAA,KAAa,EAAE,iBAAiB,EAAE,eAAe;EAC1E,GAAI,EAAE,iBAAiB,KAAA,KAAa,EAAE,eAAe,iBAAiB,EAAE,YAAY,EAAE;CACxF;CACA,iBAAiB,OAAgC;EAAE,MAAM,EAAE;EAAM,MAAM;CAAiB;AAC1F,CAAC,CACH;AAEA,MAAM,eAAe,OAAO,oBAAoB,mBAAmB;AAEnE,MAAM,aACJ,SAEA,KAAK,aAAa,cACd,OAAO,KAAK;CACV,YAAY,gBAAgB,KAAK;CACjC,QAAQ,SAAS,KAAK,KAAK,kBAAkB,KAAK,SAAS;AAC7D,CAAC,IACD,aAAa,KAAK,MAAM,CAAC,CAAC,KACxB,OAAO,IAAI,YAAY,GACvB,OAAO,gBAAiC;CACtC,YAAY;CACZ,QAAQ,mDAAmD,KAAK,KAAK;AACvE,EAAE,CACJ;;;;;;AAON,MAAa,uBACX,UAEA,OAAO,IAAI,MAAM,IAAI,SAAS,CAAC"}
1
+ {"version":3,"file":"AnthropicTools.mjs","names":[],"sources":["../src/AnthropicTools.ts"],"sourcesContent":["import { Match, Result, Schema } from \"effect\"\nimport * as Tool from \"@effect-uai/core/Tool\"\n\n// ---------------------------------------------------------------------------\n// Anthropic provider-hosted tools. Each is a `Tool.provider` whose `config`\n// carries the version-dated wire `type` string plus its options; the renderer\n// maps it to a native entry appended to the `tools` array alongside custom\n// tools. The `inputSchema` is never sent (provider tools are partitioned out\n// of the custom-tool declarations), so `Tool.noInput` suffices.\n// Reference: https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/web-search-tool\n// ---------------------------------------------------------------------------\n\nconst WEB_SEARCH_TYPE = \"web_search_20250305\"\nconst CODE_EXECUTION_TYPE = \"code_execution_20250522\"\n\nexport const UserLocation = Schema.Struct({\n city: Schema.optional(Schema.String),\n region: Schema.optional(Schema.String),\n country: Schema.optional(Schema.String),\n timezone: Schema.optional(Schema.String),\n})\nexport type UserLocation = typeof UserLocation.Type\n\nconst WebSearchConfig = Schema.Struct({\n kind: Schema.Literal(\"web_search\"),\n type: Schema.String,\n maxUses: Schema.optional(Schema.Number),\n allowedDomains: Schema.optional(Schema.Array(Schema.String)),\n blockedDomains: Schema.optional(Schema.Array(Schema.String)),\n userLocation: Schema.optional(UserLocation),\n})\n\nconst CodeExecutionConfig = Schema.Struct({\n kind: Schema.Literal(\"code_execution\"),\n type: Schema.String,\n})\n\n/** Discriminated config for an Anthropic hosted tool. */\nexport const AnthropicToolConfig = Schema.Union([WebSearchConfig, CodeExecutionConfig])\nexport type AnthropicToolConfig = typeof AnthropicToolConfig.Type\n\nexport type WebSearchOptions = {\n readonly maxUses?: number\n readonly allowedDomains?: ReadonlyArray<string>\n readonly blockedDomains?: ReadonlyArray<string>\n readonly userLocation?: UserLocation\n}\n\n/** Anthropic-hosted web search. */\nexport const webSearchTool = (opts: WebSearchOptions = {}) =>\n Tool.provider({\n name: \"web_search\",\n description: \"Search the web, executed by Anthropic.\",\n inputSchema: Tool.noInput,\n provider: \"anthropic\",\n config: { kind: \"web_search\", type: WEB_SEARCH_TYPE, ...opts } as const,\n })\n\n/** Anthropic-hosted code execution (Python sandbox). */\nexport const codeExecutionTool = Tool.provider({\n name: \"code_execution\",\n description: \"Run Python in a sandbox, executed by Anthropic.\",\n inputSchema: Tool.noInput,\n provider: \"anthropic\",\n config: { kind: \"code_execution\", type: CODE_EXECUTION_TYPE } as const,\n})\n\n/**\n * A provider tool this adapter cannot render — a foreign `provider` or an\n * unrecognized `config`. Carried as data so `Anthropic.ts` can lift it into a\n * typed `AiError.Unsupported`.\n */\nexport type ToolRenderError = {\n readonly capability: string\n readonly reason: string\n}\n\nconst userLocationWire = (loc: UserLocation): Record<string, unknown> => ({\n type: \"approximate\",\n ...(loc.city !== undefined && { city: loc.city }),\n ...(loc.region !== undefined && { region: loc.region }),\n ...(loc.country !== undefined && { country: loc.country }),\n ...(loc.timezone !== undefined && { timezone: loc.timezone }),\n})\n\nconst configToWire = Match.type<AnthropicToolConfig>().pipe(\n Match.discriminatorsExhaustive(\"kind\")({\n web_search: (c): Record<string, unknown> => ({\n type: c.type,\n name: \"web_search\",\n ...(c.maxUses !== undefined && { max_uses: c.maxUses }),\n ...(c.allowedDomains !== undefined && { allowed_domains: c.allowedDomains }),\n ...(c.blockedDomains !== undefined && { blocked_domains: c.blockedDomains }),\n ...(c.userLocation !== undefined && { user_location: userLocationWire(c.userLocation) }),\n }),\n code_execution: (c): Record<string, unknown> => ({ type: c.type, name: \"code_execution\" }),\n }),\n)\n\nconst decodeConfig = Schema.decodeUnknownResult(AnthropicToolConfig)\n\nconst renderOne = (\n tool: Tool.ProviderTool<string, any, string, any>,\n): Result.Result<Record<string, unknown>, ToolRenderError> =>\n tool.provider !== \"anthropic\"\n ? Result.fail({\n capability: `providerTool:${tool.provider}`,\n reason: `tool \"${tool.name}\" is hosted by \"${tool.provider}\", not anthropic`,\n })\n : decodeConfig(tool.config).pipe(\n Result.map(configToWire),\n Result.mapError((): ToolRenderError => ({\n capability: \"providerTool\",\n reason: `unrecognized Anthropic provider tool config on \"${tool.name}\"`,\n })),\n )\n\n/**\n * Render a toolkit's Anthropic provider tools to native `tools` entries. Fails\n * with a `ToolRenderError` on the first foreign or unrecognized tool rather\n * than dropping it.\n */\nexport const renderProviderTools = (\n tools: ReadonlyArray<Tool.ProviderTool<string, any, string, any>>,\n): Result.Result<ReadonlyArray<Record<string, unknown>>, ToolRenderError> =>\n Result.all(tools.map(renderOne))\n"],"mappings":";;;;;;;;;;;AAYA,MAAM,kBAAkB;AACxB,MAAM,sBAAsB;AAE5B,MAAa,eAAe,OAAO,OAAO;CACxC,MAAM,OAAO,SAAS,OAAO,MAAM;CACnC,QAAQ,OAAO,SAAS,OAAO,MAAM;CACrC,SAAS,OAAO,SAAS,OAAO,MAAM;CACtC,UAAU,OAAO,SAAS,OAAO,MAAM;AACzC,CAAC;AAGD,MAAM,kBAAkB,OAAO,OAAO;CACpC,MAAM,OAAO,QAAQ,YAAY;CACjC,MAAM,OAAO;CACb,SAAS,OAAO,SAAS,OAAO,MAAM;CACtC,gBAAgB,OAAO,SAAS,OAAO,MAAM,OAAO,MAAM,CAAC;CAC3D,gBAAgB,OAAO,SAAS,OAAO,MAAM,OAAO,MAAM,CAAC;CAC3D,cAAc,OAAO,SAAS,YAAY;AAC5C,CAAC;AAED,MAAM,sBAAsB,OAAO,OAAO;CACxC,MAAM,OAAO,QAAQ,gBAAgB;CACrC,MAAM,OAAO;AACf,CAAC;;AAGD,MAAa,sBAAsB,OAAO,MAAM,CAAC,iBAAiB,mBAAmB,CAAC;;AAWtF,MAAa,iBAAiB,OAAyB,CAAC,MACtD,KAAK,SAAS;CACZ,MAAM;CACN,aAAa;CACb,aAAa,KAAK;CAClB,UAAU;CACV,QAAQ;EAAE,MAAM;EAAc,MAAM;EAAiB,GAAG;CAAK;AAC/D,CAAC;;AAGH,MAAa,oBAAoB,KAAK,SAAS;CAC7C,MAAM;CACN,aAAa;CACb,aAAa,KAAK;CAClB,UAAU;CACV,QAAQ;EAAE,MAAM;EAAkB,MAAM;CAAoB;AAC9D,CAAC;AAYD,MAAM,oBAAoB,SAAgD;CACxE,MAAM;CACN,GAAI,IAAI,SAAS,KAAA,KAAa,EAAE,MAAM,IAAI,KAAK;CAC/C,GAAI,IAAI,WAAW,KAAA,KAAa,EAAE,QAAQ,IAAI,OAAO;CACrD,GAAI,IAAI,YAAY,KAAA,KAAa,EAAE,SAAS,IAAI,QAAQ;CACxD,GAAI,IAAI,aAAa,KAAA,KAAa,EAAE,UAAU,IAAI,SAAS;AAC7D;AAEA,MAAM,eAAe,MAAM,KAA0B,CAAC,CAAC,KACrD,MAAM,yBAAyB,MAAM,CAAC,CAAC;CACrC,aAAa,OAAgC;EAC3C,MAAM,EAAE;EACR,MAAM;EACN,GAAI,EAAE,YAAY,KAAA,KAAa,EAAE,UAAU,EAAE,QAAQ;EACrD,GAAI,EAAE,mBAAmB,KAAA,KAAa,EAAE,iBAAiB,EAAE,eAAe;EAC1E,GAAI,EAAE,mBAAmB,KAAA,KAAa,EAAE,iBAAiB,EAAE,eAAe;EAC1E,GAAI,EAAE,iBAAiB,KAAA,KAAa,EAAE,eAAe,iBAAiB,EAAE,YAAY,EAAE;CACxF;CACA,iBAAiB,OAAgC;EAAE,MAAM,EAAE;EAAM,MAAM;CAAiB;AAC1F,CAAC,CACH;AAEA,MAAM,eAAe,OAAO,oBAAoB,mBAAmB;AAEnE,MAAM,aACJ,SAEA,KAAK,aAAa,cACd,OAAO,KAAK;CACV,YAAY,gBAAgB,KAAK;CACjC,QAAQ,SAAS,KAAK,KAAK,kBAAkB,KAAK,SAAS;AAC7D,CAAC,IACD,aAAa,KAAK,MAAM,CAAC,CAAC,KACxB,OAAO,IAAI,YAAY,GACvB,OAAO,gBAAiC;CACtC,YAAY;CACZ,QAAQ,mDAAmD,KAAK,KAAK;AACvE,EAAE,CACJ;;;;;;AAON,MAAa,uBACX,UAEA,OAAO,IAAI,MAAM,IAAI,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"codec.d.mts","names":[],"sources":["../src/codec.ts"],"mappings":";;;;;;;cAmCa,kBAAgB,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;;KAMjB,0BAA0B,iBAAiB;cAEjD,WAAS,OAAA;;;;;;KAMH,mBAAmB,UAAU;KAMpC;WACM;WACA;;KAGN;WACM;WACA;WACA,kBAAkB,cAAc;WAChC;;KAGN;WACM;WACA;aACM;aAAsB;;aACtB;aAAyB;aAA6B;;WAC5D;;KAGN,yBAAyB,qBAAqB,sBAAsB;KAEpE;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;KA6P/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"}
1
+ {"version":3,"file":"codec.d.mts","names":[],"sources":["../src/codec.ts"],"mappings":";;;;;;;cAmCa,kBAAgB,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;;KAMjB,0BAA0B,iBAAiB;cAE1C,WAAS,OAAA;;;;;;KAMV,mBAAmB,UAAU;KAMpC;WACM;WACA;;KAGN;WACM;WACA;WACA,kBAAkB,cAAc;WAChC;;KAGN;WACM;WACA;aACM;aAAsB;;aACtB;aAAyB;aAA6B;;WAC5D;;KAGN,yBAAyB,qBAAqB,sBAAsB;KAEpE;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;KA6P/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
@@ -6,6 +6,7 @@ import * as ToolOutput from "@effect-uai/core/ToolOutput";
6
6
  //#region src/codec.ts
7
7
  var codec_exports = /* @__PURE__ */ __exportAll({
8
8
  WireContentBlock: () => WireContentBlock,
9
+ WireUsage: () => WireUsage,
9
10
  accumulatorToTurn: () => accumulatorToTurn,
10
11
  appendInputJsonDelta: () => appendInputJsonDelta,
11
12
  appendSignatureDelta: () => appendSignatureDelta,
@@ -42,7 +43,7 @@ const WireContentBlock = Schema.Union([
42
43
  WireThinkingBlock,
43
44
  WireRedactedThinkingBlock
44
45
  ]);
45
- Schema.Struct({
46
+ const WireUsage = Schema.Struct({
46
47
  input_tokens: Schema.optional(Schema.Number),
47
48
  output_tokens: Schema.optional(Schema.Number),
48
49
  cache_creation_input_tokens: Schema.optional(Schema.NullOr(Schema.Number)),
@@ -400,6 +401,6 @@ const accumulatorToTurn = (acc) => ({
400
401
  stop_reason: stopReasonFromAnthropic(acc.stopReason)
401
402
  });
402
403
  //#endregion
403
- export { WireContentBlock, accumulatorToTurn, appendInputJsonDelta, appendSignatureDelta, appendTextDelta, appendThinkingDelta, buildRequestBody, emptyAccumulator, mergeUsage, setStopReason, startBlock, codec_exports as t };
404
+ export { WireContentBlock, WireUsage, accumulatorToTurn, appendInputJsonDelta, appendSignatureDelta, appendTextDelta, appendThinkingDelta, buildRequestBody, emptyAccumulator, mergeUsage, setStopReason, startBlock, codec_exports as t };
404
405
 
405
406
  //# sourceMappingURL=codec.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"codec.mjs","names":["Arr"],"sources":["../src/codec.ts"],"sourcesContent":["import { Array as Arr, Match, Option, Order, Result, Schema, pipe } from \"effect\"\nimport { Base64 } from \"effect/encoding\"\nimport * as Items from \"@effect-uai/core/Items\"\nimport { JsonParseError } from \"@effect-uai/core/JSONL\"\nimport * as ToolOutput from \"@effect-uai/core/ToolOutput\"\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 | ReadonlyArray<RequestToolResultBlock>\n readonly is_error?: boolean\n}\n\ntype RequestDocumentContent = {\n readonly type: \"document\"\n readonly source:\n | { readonly type: \"url\"; readonly url: string }\n | { readonly type: \"base64\"; readonly media_type: string; readonly data: string }\n readonly title?: string\n}\n\ntype RequestToolResultBlock = RequestTextContent | RequestImageContent | RequestDocumentContent\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 output_image: () => \"\",\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: Base64.encode(s.bytes),\n })),\n Match.exhaustive,\n)\n\nconst fileSourceToWire = Match.type<Items.InputFile[\"source\"]>().pipe(\n Match.tag(\"url\", (s): RequestDocumentContent[\"source\"] => ({ type: \"url\", url: s.url })),\n Match.tag(\"base64\", (s): RequestDocumentContent[\"source\"] => ({\n type: \"base64\",\n media_type: s.mimeType,\n data: s.base64,\n })),\n Match.tag(\"bytes\", (s): RequestDocumentContent[\"source\"] => ({\n type: \"base64\",\n media_type: s.mimeType,\n data: Base64.encode(s.bytes),\n })),\n Match.exhaustive,\n)\n\nconst toolResultBlock = Match.type<Items.ToolOutputContent>().pipe(\n Match.discriminatorsExhaustive(\"type\")({\n input_text: (p): RequestToolResultBlock => ({ type: \"text\", text: ToolOutput.partText(p) }),\n input_json: (p): RequestToolResultBlock => ({ type: \"text\", text: ToolOutput.partText(p) }),\n input_image: (p): RequestToolResultBlock => ({\n type: \"image\",\n source: imageSourceToWire(p.source),\n }),\n input_file: (p): RequestToolResultBlock => ({\n type: \"document\",\n source: fileSourceToWire(p.source),\n ...(p.filename !== undefined && { title: p.filename }),\n }),\n }),\n)\n\n// Text and JSON only: one string. With media: image and document blocks.\nconst toolResult = (o: Items.ToolCallOutput): RequestToolResultContent => ({\n type: \"tool_result\",\n tool_use_id: o.call_id,\n content: Option.getOrElse(ToolOutput.text(o.output), () => o.output.map(toolResultBlock)),\n ...(o.isError === true && { is_error: true }),\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 // No assistant-image block here either. Dropped rather than relocated\n // onto a user message, which is the caller's call: `Turn.imagesAsInput`.\n output_image: () => 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> => [toolResult(o)],\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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"}
1
+ {"version":3,"file":"codec.mjs","names":["Arr"],"sources":["../src/codec.ts"],"sourcesContent":["import { Array as Arr, Match, Option, Order, Result, Schema, pipe } from \"effect\"\nimport { Base64 } from \"effect/encoding\"\nimport * as Items from \"@effect-uai/core/Items\"\nimport { JsonParseError } from \"@effect-uai/core/JSONL\"\nimport * as ToolOutput from \"@effect-uai/core/ToolOutput\"\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\nexport const 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 | ReadonlyArray<RequestToolResultBlock>\n readonly is_error?: boolean\n}\n\ntype RequestDocumentContent = {\n readonly type: \"document\"\n readonly source:\n | { readonly type: \"url\"; readonly url: string }\n | { readonly type: \"base64\"; readonly media_type: string; readonly data: string }\n readonly title?: string\n}\n\ntype RequestToolResultBlock = RequestTextContent | RequestImageContent | RequestDocumentContent\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 output_image: () => \"\",\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: Base64.encode(s.bytes),\n })),\n Match.exhaustive,\n)\n\nconst fileSourceToWire = Match.type<Items.InputFile[\"source\"]>().pipe(\n Match.tag(\"url\", (s): RequestDocumentContent[\"source\"] => ({ type: \"url\", url: s.url })),\n Match.tag(\"base64\", (s): RequestDocumentContent[\"source\"] => ({\n type: \"base64\",\n media_type: s.mimeType,\n data: s.base64,\n })),\n Match.tag(\"bytes\", (s): RequestDocumentContent[\"source\"] => ({\n type: \"base64\",\n media_type: s.mimeType,\n data: Base64.encode(s.bytes),\n })),\n Match.exhaustive,\n)\n\nconst toolResultBlock = Match.type<Items.ToolOutputContent>().pipe(\n Match.discriminatorsExhaustive(\"type\")({\n input_text: (p): RequestToolResultBlock => ({ type: \"text\", text: ToolOutput.partText(p) }),\n input_json: (p): RequestToolResultBlock => ({ type: \"text\", text: ToolOutput.partText(p) }),\n input_image: (p): RequestToolResultBlock => ({\n type: \"image\",\n source: imageSourceToWire(p.source),\n }),\n input_file: (p): RequestToolResultBlock => ({\n type: \"document\",\n source: fileSourceToWire(p.source),\n ...(p.filename !== undefined && { title: p.filename }),\n }),\n }),\n)\n\n// Text and JSON only: one string. With media: image and document blocks.\nconst toolResult = (o: Items.ToolCallOutput): RequestToolResultContent => ({\n type: \"tool_result\",\n tool_use_id: o.call_id,\n content: Option.getOrElse(ToolOutput.text(o.output), () => o.output.map(toolResultBlock)),\n ...(o.isError === true && { is_error: true }),\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 // No assistant-image block here either. Dropped rather than relocated\n // onto a user message, which is the caller's call: `Turn.imagesAsInput`.\n output_image: () => 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> => [toolResult(o)],\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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect-uai/anthropic",
3
- "version": "0.19.0-dev-20261110065930",
3
+ "version": "0.19.1",
4
4
  "description": "Anthropic Messages API provider for @effect-uai/core.",
5
5
  "keywords": [
6
6
  "ai",
@@ -45,10 +45,10 @@
45
45
  "devDependencies": {
46
46
  "effect": "4.1.2",
47
47
  "typescript": "^7.0.2",
48
- "@effect-uai/core": "0.19.0-dev-20261110065930"
48
+ "@effect-uai/core": "0.19.1"
49
49
  },
50
50
  "peerDependencies": {
51
- "@effect-uai/core": "0.19.0-dev-20261110065930",
51
+ "@effect-uai/core": ">=0.2.0 <1",
52
52
  "effect": ">=4.0.1 <5.0.0"
53
53
  },
54
54
  "scripts": {
@@ -13,7 +13,7 @@ import * as Tool from "@effect-uai/core/Tool"
13
13
  const WEB_SEARCH_TYPE = "web_search_20250305"
14
14
  const CODE_EXECUTION_TYPE = "code_execution_20250522"
15
15
 
16
- const UserLocation = Schema.Struct({
16
+ export const UserLocation = Schema.Struct({
17
17
  city: Schema.optional(Schema.String),
18
18
  region: Schema.optional(Schema.String),
19
19
  country: Schema.optional(Schema.String),
package/src/codec.ts CHANGED
@@ -41,7 +41,7 @@ export const WireContentBlock = Schema.Union([
41
41
  ])
42
42
  export type WireContentBlock = typeof WireContentBlock.Type
43
43
 
44
- const WireUsage = Schema.Struct({
44
+ export const WireUsage = Schema.Struct({
45
45
  input_tokens: Schema.optional(Schema.Number),
46
46
  output_tokens: Schema.optional(Schema.Number),
47
47
  cache_creation_input_tokens: Schema.optional(Schema.NullOr(Schema.Number)),