@effect-uai/anthropic 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,196 @@
1
+ import { Accumulator } from "./codec.mjs";
2
+ import { Schema } from "effect";
3
+
4
+ //#region src/streamEvents.d.ts
5
+ declare namespace streamEvents_d_exports {
6
+ export { KnownProviderEvent, ProviderEvent, applyEvent, isErrorEvent, isInputJsonDeltaEvent, isMessageStop, isTextDeltaEvent, isThinkingDeltaEvent, isToolUseStartEvent };
7
+ }
8
+ /**
9
+ * Internal: union of variants we actually know how to decode from the wire.
10
+ * Used as the decode target; failures are caught and re-emitted as `Unknown`.
11
+ */
12
+ declare const KnownProviderEvent: Schema.Union<readonly [Schema.Struct<{
13
+ readonly type: Schema.Literal<"message_start">;
14
+ readonly message: Schema.Struct<{
15
+ readonly id: Schema.optional<Schema.String>;
16
+ readonly usage: Schema.optional<Schema.Struct<{
17
+ readonly input_tokens: Schema.optional<Schema.Number>;
18
+ readonly output_tokens: Schema.optional<Schema.Number>;
19
+ readonly cache_creation_input_tokens: Schema.optional<Schema.NullOr<Schema.Number>>;
20
+ readonly cache_read_input_tokens: Schema.optional<Schema.NullOr<Schema.Number>>;
21
+ }>>;
22
+ }>;
23
+ }>, Schema.Struct<{
24
+ readonly type: Schema.Literal<"content_block_start">;
25
+ readonly index: Schema.Number;
26
+ readonly content_block: Schema.Union<readonly [Schema.Struct<{
27
+ readonly type: Schema.Literal<"text">;
28
+ readonly text: Schema.String;
29
+ }>, Schema.Struct<{
30
+ readonly type: Schema.Literal<"tool_use">;
31
+ readonly id: Schema.String;
32
+ readonly name: Schema.String;
33
+ readonly input: Schema.Unknown;
34
+ }>, Schema.Struct<{
35
+ readonly type: Schema.Literal<"thinking">;
36
+ readonly thinking: Schema.String;
37
+ readonly signature: Schema.optional<Schema.String>;
38
+ }>, Schema.Struct<{
39
+ readonly type: Schema.Literal<"redacted_thinking">;
40
+ readonly data: Schema.String;
41
+ }>]>;
42
+ }>, Schema.Struct<{
43
+ readonly type: Schema.Literal<"content_block_delta">;
44
+ readonly index: Schema.Number;
45
+ readonly delta: Schema.Union<readonly [Schema.Struct<{
46
+ readonly type: Schema.Literal<"text_delta">;
47
+ readonly text: Schema.String;
48
+ }>, Schema.Struct<{
49
+ readonly type: Schema.Literal<"input_json_delta">;
50
+ readonly partial_json: Schema.String;
51
+ }>, Schema.Struct<{
52
+ readonly type: Schema.Literal<"thinking_delta">;
53
+ readonly thinking: Schema.String;
54
+ }>, Schema.Struct<{
55
+ readonly type: Schema.Literal<"signature_delta">;
56
+ readonly signature: Schema.String;
57
+ }>]>;
58
+ }>, Schema.Struct<{
59
+ readonly type: Schema.Literal<"content_block_stop">;
60
+ readonly index: Schema.Number;
61
+ }>, Schema.Struct<{
62
+ readonly type: Schema.Literal<"message_delta">;
63
+ readonly delta: Schema.Struct<{
64
+ readonly stop_reason: Schema.optional<Schema.NullOr<Schema.String>>;
65
+ readonly stop_sequence: Schema.optional<Schema.NullOr<Schema.String>>;
66
+ }>;
67
+ readonly usage: Schema.optional<Schema.Struct<{
68
+ readonly input_tokens: Schema.optional<Schema.Number>;
69
+ readonly output_tokens: Schema.optional<Schema.Number>;
70
+ readonly cache_creation_input_tokens: Schema.optional<Schema.NullOr<Schema.Number>>;
71
+ readonly cache_read_input_tokens: Schema.optional<Schema.NullOr<Schema.Number>>;
72
+ }>>;
73
+ }>, Schema.Struct<{
74
+ readonly type: Schema.Literal<"message_stop">;
75
+ }>, Schema.Struct<{
76
+ readonly type: Schema.Literal<"ping">;
77
+ }>, Schema.Struct<{
78
+ readonly type: Schema.Literal<"error">;
79
+ readonly error: Schema.optional<Schema.Struct<{
80
+ readonly type: Schema.optional<Schema.String>;
81
+ readonly message: Schema.optional<Schema.String>;
82
+ }>>;
83
+ }>]>;
84
+ /**
85
+ * Public: every event the native stream can emit. Discriminated on `type`.
86
+ * The `_unknown` branch closes the cardinality so downstream `Match.exhaustive`
87
+ * cannot silently miss a wire event we didn't model.
88
+ */
89
+ declare const ProviderEvent: Schema.Union<readonly [Schema.Struct<{
90
+ readonly type: Schema.Literal<"message_start">;
91
+ readonly message: Schema.Struct<{
92
+ readonly id: Schema.optional<Schema.String>;
93
+ readonly usage: Schema.optional<Schema.Struct<{
94
+ readonly input_tokens: Schema.optional<Schema.Number>;
95
+ readonly output_tokens: Schema.optional<Schema.Number>;
96
+ readonly cache_creation_input_tokens: Schema.optional<Schema.NullOr<Schema.Number>>;
97
+ readonly cache_read_input_tokens: Schema.optional<Schema.NullOr<Schema.Number>>;
98
+ }>>;
99
+ }>;
100
+ }>, Schema.Struct<{
101
+ readonly type: Schema.Literal<"content_block_start">;
102
+ readonly index: Schema.Number;
103
+ readonly content_block: Schema.Union<readonly [Schema.Struct<{
104
+ readonly type: Schema.Literal<"text">;
105
+ readonly text: Schema.String;
106
+ }>, Schema.Struct<{
107
+ readonly type: Schema.Literal<"tool_use">;
108
+ readonly id: Schema.String;
109
+ readonly name: Schema.String;
110
+ readonly input: Schema.Unknown;
111
+ }>, Schema.Struct<{
112
+ readonly type: Schema.Literal<"thinking">;
113
+ readonly thinking: Schema.String;
114
+ readonly signature: Schema.optional<Schema.String>;
115
+ }>, Schema.Struct<{
116
+ readonly type: Schema.Literal<"redacted_thinking">;
117
+ readonly data: Schema.String;
118
+ }>]>;
119
+ }>, Schema.Struct<{
120
+ readonly type: Schema.Literal<"content_block_delta">;
121
+ readonly index: Schema.Number;
122
+ readonly delta: Schema.Union<readonly [Schema.Struct<{
123
+ readonly type: Schema.Literal<"text_delta">;
124
+ readonly text: Schema.String;
125
+ }>, Schema.Struct<{
126
+ readonly type: Schema.Literal<"input_json_delta">;
127
+ readonly partial_json: Schema.String;
128
+ }>, Schema.Struct<{
129
+ readonly type: Schema.Literal<"thinking_delta">;
130
+ readonly thinking: Schema.String;
131
+ }>, Schema.Struct<{
132
+ readonly type: Schema.Literal<"signature_delta">;
133
+ readonly signature: Schema.String;
134
+ }>]>;
135
+ }>, Schema.Struct<{
136
+ readonly type: Schema.Literal<"content_block_stop">;
137
+ readonly index: Schema.Number;
138
+ }>, Schema.Struct<{
139
+ readonly type: Schema.Literal<"message_delta">;
140
+ readonly delta: Schema.Struct<{
141
+ readonly stop_reason: Schema.optional<Schema.NullOr<Schema.String>>;
142
+ readonly stop_sequence: Schema.optional<Schema.NullOr<Schema.String>>;
143
+ }>;
144
+ readonly usage: Schema.optional<Schema.Struct<{
145
+ readonly input_tokens: Schema.optional<Schema.Number>;
146
+ readonly output_tokens: Schema.optional<Schema.Number>;
147
+ readonly cache_creation_input_tokens: Schema.optional<Schema.NullOr<Schema.Number>>;
148
+ readonly cache_read_input_tokens: Schema.optional<Schema.NullOr<Schema.Number>>;
149
+ }>>;
150
+ }>, Schema.Struct<{
151
+ readonly type: Schema.Literal<"message_stop">;
152
+ }>, Schema.Struct<{
153
+ readonly type: Schema.Literal<"ping">;
154
+ }>, Schema.Struct<{
155
+ readonly type: Schema.Literal<"error">;
156
+ readonly error: Schema.optional<Schema.Struct<{
157
+ readonly type: Schema.optional<Schema.String>;
158
+ readonly message: Schema.optional<Schema.String>;
159
+ }>>;
160
+ }>, Schema.Struct<{
161
+ readonly type: Schema.Literal<"_unknown">;
162
+ readonly raw: Schema.Unknown;
163
+ }>]>;
164
+ type ProviderEvent = typeof ProviderEvent.Type;
165
+ declare const applyEvent: (acc: Accumulator, event: ProviderEvent) => Accumulator;
166
+ declare const isTextDeltaEvent: (event: ProviderEvent) => event is Extract<ProviderEvent, {
167
+ type: "content_block_delta";
168
+ delta: {
169
+ type: "text_delta";
170
+ };
171
+ }>;
172
+ declare const isThinkingDeltaEvent: (event: ProviderEvent) => event is Extract<ProviderEvent, {
173
+ type: "content_block_delta";
174
+ delta: {
175
+ type: "thinking_delta";
176
+ };
177
+ }>;
178
+ declare const isInputJsonDeltaEvent: (event: ProviderEvent) => event is Extract<ProviderEvent, {
179
+ type: "content_block_delta";
180
+ delta: {
181
+ type: "input_json_delta";
182
+ };
183
+ }>;
184
+ declare const isToolUseStartEvent: (event: ProviderEvent) => event is Extract<ProviderEvent, {
185
+ type: "content_block_start";
186
+ content_block: {
187
+ type: "tool_use";
188
+ };
189
+ }>;
190
+ declare const isMessageStop: (event: ProviderEvent) => boolean;
191
+ declare const isErrorEvent: (event: ProviderEvent) => event is Extract<ProviderEvent, {
192
+ type: "error";
193
+ }>;
194
+ //#endregion
195
+ export { KnownProviderEvent, ProviderEvent, applyEvent, isErrorEvent, isInputJsonDeltaEvent, isMessageStop, isTextDeltaEvent, isThinkingDeltaEvent, isToolUseStartEvent, streamEvents_d_exports as t };
196
+ //# sourceMappingURL=streamEvents.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamEvents.d.mts","names":[],"sources":["../src/streamEvents.ts"],"mappings":";;;;;;;;;;;cAoHa,kBAAA,EAAkB,MAAA,CAAA,KAAA,WAAA,MAAA,CAAA,MAAA;EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAgBlB,aAAA,EAAa,MAAA,CAAA,KAAA,WAAA,MAAA,CAAA,MAAA;EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAWd,aAAA,UAAuB,aAAA,CAAc,IAAA;AAAA,cAWpC,UAAA,GAAc,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,aAAA,KAAgB,WAAA;AAAA,cAoCvD,gBAAA,GACX,KAAA,EAAO,aAAA,KACN,KAAA,IAAS,OAAA,CACV,aAAA;EACE,IAAA;EAA6B,KAAA;IAAS,IAAA;EAAA;AAAA;AAAA,cAG7B,oBAAA,GACX,KAAA,EAAO,aAAA,KACN,KAAA,IAAS,OAAA,CACV,aAAA;EACE,IAAA;EAA6B,KAAA;IAAS,IAAA;EAAA;AAAA;AAAA,cAG7B,qBAAA,GACX,KAAA,EAAO,aAAA,KACN,KAAA,IAAS,OAAA,CACV,aAAA;EACE,IAAA;EAA6B,KAAA;IAAS,IAAA;EAAA;AAAA;AAAA,cAG7B,mBAAA,GACX,KAAA,EAAO,aAAA,KACN,KAAA,IAAS,OAAA,CACV,aAAA;EACE,IAAA;EAA6B,aAAA;IAAiB,IAAA;EAAA;AAAA;AAAA,cAGrC,aAAA,GAAiB,KAAA,EAAO,aAAA;AAAA,cAExB,YAAA,GACX,KAAA,EAAO,aAAA,KACN,KAAA,IAAS,OAAA,CAAQ,aAAA;EAAiB,IAAA;AAAA"}
@@ -0,0 +1,152 @@
1
+ import { t as __exportAll } from "./chunk-CfYAbeIz.mjs";
2
+ import { WireContentBlock, appendInputJsonDelta, appendSignatureDelta, appendTextDelta, appendThinkingDelta, mergeUsage, setStopReason, startBlock } from "./codec.mjs";
3
+ import { Match, Schema } from "effect";
4
+ //#region src/streamEvents.ts
5
+ var streamEvents_exports = /* @__PURE__ */ __exportAll({
6
+ KnownProviderEvent: () => KnownProviderEvent,
7
+ ProviderEvent: () => ProviderEvent,
8
+ applyEvent: () => applyEvent,
9
+ isErrorEvent: () => isErrorEvent,
10
+ isInputJsonDeltaEvent: () => isInputJsonDeltaEvent,
11
+ isMessageStop: () => isMessageStop,
12
+ isTextDeltaEvent: () => isTextDeltaEvent,
13
+ isThinkingDeltaEvent: () => isThinkingDeltaEvent,
14
+ isToolUseStartEvent: () => isToolUseStartEvent
15
+ });
16
+ const WireMessageStartUsage = Schema.Struct({
17
+ input_tokens: Schema.optional(Schema.Number),
18
+ output_tokens: Schema.optional(Schema.Number),
19
+ cache_creation_input_tokens: Schema.optional(Schema.NullOr(Schema.Number)),
20
+ cache_read_input_tokens: Schema.optional(Schema.NullOr(Schema.Number))
21
+ });
22
+ const MessageStart = Schema.Struct({
23
+ type: Schema.Literal("message_start"),
24
+ message: Schema.Struct({
25
+ id: Schema.optional(Schema.String),
26
+ usage: Schema.optional(WireMessageStartUsage)
27
+ })
28
+ });
29
+ const ContentBlockStart = Schema.Struct({
30
+ type: Schema.Literal("content_block_start"),
31
+ index: Schema.Number,
32
+ content_block: WireContentBlock
33
+ });
34
+ const TextDelta = Schema.Struct({
35
+ type: Schema.Literal("text_delta"),
36
+ text: Schema.String
37
+ });
38
+ const InputJsonDelta = Schema.Struct({
39
+ type: Schema.Literal("input_json_delta"),
40
+ partial_json: Schema.String
41
+ });
42
+ const ThinkingDelta = Schema.Struct({
43
+ type: Schema.Literal("thinking_delta"),
44
+ thinking: Schema.String
45
+ });
46
+ const SignatureDelta = Schema.Struct({
47
+ type: Schema.Literal("signature_delta"),
48
+ signature: Schema.String
49
+ });
50
+ const Delta = Schema.Union([
51
+ TextDelta,
52
+ InputJsonDelta,
53
+ ThinkingDelta,
54
+ SignatureDelta
55
+ ]);
56
+ const ContentBlockDelta = Schema.Struct({
57
+ type: Schema.Literal("content_block_delta"),
58
+ index: Schema.Number,
59
+ delta: Delta
60
+ });
61
+ const ContentBlockStop = Schema.Struct({
62
+ type: Schema.Literal("content_block_stop"),
63
+ index: Schema.Number
64
+ });
65
+ const MessageDelta = Schema.Struct({
66
+ type: Schema.Literal("message_delta"),
67
+ delta: Schema.Struct({
68
+ stop_reason: Schema.optional(Schema.NullOr(Schema.String)),
69
+ stop_sequence: Schema.optional(Schema.NullOr(Schema.String))
70
+ }),
71
+ usage: Schema.optional(WireMessageStartUsage)
72
+ });
73
+ const MessageStop = Schema.Struct({ type: Schema.Literal("message_stop") });
74
+ const Ping = Schema.Struct({ type: Schema.Literal("ping") });
75
+ const ErrorEvent = Schema.Struct({
76
+ type: Schema.Literal("error"),
77
+ error: Schema.optional(Schema.Struct({
78
+ type: Schema.optional(Schema.String),
79
+ message: Schema.optional(Schema.String)
80
+ }))
81
+ });
82
+ /**
83
+ * Catch-all variant for wire events that fail to decode against any known
84
+ * schema, plus events that fail to JSON-parse. The decoder never produces
85
+ * this directly - it's synthesized by `sseEventToProviderEvent` when
86
+ * `decodeKnown` fails.
87
+ */
88
+ const Unknown = Schema.Struct({
89
+ type: Schema.Literal("_unknown"),
90
+ raw: Schema.Unknown
91
+ });
92
+ /**
93
+ * Internal: union of variants we actually know how to decode from the wire.
94
+ * Used as the decode target; failures are caught and re-emitted as `Unknown`.
95
+ */
96
+ const KnownProviderEvent = Schema.Union([
97
+ MessageStart,
98
+ ContentBlockStart,
99
+ ContentBlockDelta,
100
+ ContentBlockStop,
101
+ MessageDelta,
102
+ MessageStop,
103
+ Ping,
104
+ ErrorEvent
105
+ ]);
106
+ /**
107
+ * Public: every event the native stream can emit. Discriminated on `type`.
108
+ * The `_unknown` branch closes the cardinality so downstream `Match.exhaustive`
109
+ * cannot silently miss a wire event we didn't model.
110
+ */
111
+ const ProviderEvent = Schema.Union([
112
+ MessageStart,
113
+ ContentBlockStart,
114
+ ContentBlockDelta,
115
+ ContentBlockStop,
116
+ MessageDelta,
117
+ MessageStop,
118
+ Ping,
119
+ ErrorEvent,
120
+ Unknown
121
+ ]);
122
+ const mergeOptionalUsage = (acc, wire) => wire === void 0 ? acc : mergeUsage(acc, wire);
123
+ const applyEvent = (acc, event) => Match.value(event).pipe(Match.discriminatorsExhaustive("type")({
124
+ message_start: (e) => mergeOptionalUsage(acc, e.message.usage),
125
+ content_block_start: (e) => startBlock(acc, e.index, e.content_block),
126
+ content_block_delta: (e) => Match.value(e.delta).pipe(Match.discriminatorsExhaustive("type")({
127
+ text_delta: (d) => appendTextDelta(acc, e.index, d.text),
128
+ input_json_delta: (d) => appendInputJsonDelta(acc, e.index, d.partial_json),
129
+ thinking_delta: (d) => appendThinkingDelta(acc, e.index, d.thinking),
130
+ signature_delta: (d) => appendSignatureDelta(acc, e.index, d.signature)
131
+ })),
132
+ content_block_stop: () => acc,
133
+ message_delta: (e) => {
134
+ const withUsage = mergeOptionalUsage(acc, e.usage);
135
+ const reason = e.delta.stop_reason;
136
+ return reason === void 0 || reason === null ? withUsage : setStopReason(withUsage, reason);
137
+ },
138
+ message_stop: () => acc,
139
+ ping: () => acc,
140
+ error: () => acc,
141
+ _unknown: () => acc
142
+ }));
143
+ const isTextDeltaEvent = (event) => event.type === "content_block_delta" && event.delta.type === "text_delta";
144
+ const isThinkingDeltaEvent = (event) => event.type === "content_block_delta" && event.delta.type === "thinking_delta";
145
+ const isInputJsonDeltaEvent = (event) => event.type === "content_block_delta" && event.delta.type === "input_json_delta";
146
+ const isToolUseStartEvent = (event) => event.type === "content_block_start" && event.content_block.type === "tool_use";
147
+ const isMessageStop = (event) => event.type === "message_stop";
148
+ const isErrorEvent = (event) => event.type === "error";
149
+ //#endregion
150
+ export { KnownProviderEvent, ProviderEvent, applyEvent, isErrorEvent, isInputJsonDeltaEvent, isMessageStop, isTextDeltaEvent, isThinkingDeltaEvent, isToolUseStartEvent, streamEvents_exports as t };
151
+
152
+ //# sourceMappingURL=streamEvents.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamEvents.mjs","names":[],"sources":["../src/streamEvents.ts"],"sourcesContent":["import { Match, Schema } from \"effect\"\nimport {\n type Accumulator,\n WireContentBlock,\n type WireUsage,\n appendInputJsonDelta,\n appendSignatureDelta,\n appendTextDelta,\n appendThinkingDelta,\n mergeUsage,\n setStopReason,\n startBlock,\n} from \"./codec.js\"\n\n// ---------------------------------------------------------------------------\n// Wire schemas for the SSE events we map onto our `Accumulator`. Anthropic's\n// streaming protocol uses named SSE events; we match on the inner JSON\n// `type` field which mirrors the event name.\n// ---------------------------------------------------------------------------\n\nconst WireMessageStartUsage = 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})\n\nconst MessageStart = Schema.Struct({\n type: Schema.Literal(\"message_start\"),\n message: Schema.Struct({\n id: Schema.optional(Schema.String),\n usage: Schema.optional(WireMessageStartUsage),\n }),\n})\n\nconst ContentBlockStart = Schema.Struct({\n type: Schema.Literal(\"content_block_start\"),\n index: Schema.Number,\n content_block: WireContentBlock,\n})\n\nconst TextDelta = Schema.Struct({\n type: Schema.Literal(\"text_delta\"),\n text: Schema.String,\n})\n\nconst InputJsonDelta = Schema.Struct({\n type: Schema.Literal(\"input_json_delta\"),\n partial_json: Schema.String,\n})\n\nconst ThinkingDelta = Schema.Struct({\n type: Schema.Literal(\"thinking_delta\"),\n thinking: Schema.String,\n})\n\nconst SignatureDelta = Schema.Struct({\n type: Schema.Literal(\"signature_delta\"),\n signature: Schema.String,\n})\n\nconst Delta = Schema.Union([TextDelta, InputJsonDelta, ThinkingDelta, SignatureDelta])\n\nconst ContentBlockDelta = Schema.Struct({\n type: Schema.Literal(\"content_block_delta\"),\n index: Schema.Number,\n delta: Delta,\n})\n\nconst ContentBlockStop = Schema.Struct({\n type: Schema.Literal(\"content_block_stop\"),\n index: Schema.Number,\n})\n\nconst MessageDelta = Schema.Struct({\n type: Schema.Literal(\"message_delta\"),\n delta: Schema.Struct({\n stop_reason: Schema.optional(Schema.NullOr(Schema.String)),\n stop_sequence: Schema.optional(Schema.NullOr(Schema.String)),\n }),\n usage: Schema.optional(WireMessageStartUsage),\n})\n\nconst MessageStop = Schema.Struct({\n type: Schema.Literal(\"message_stop\"),\n})\n\nconst Ping = Schema.Struct({\n type: Schema.Literal(\"ping\"),\n})\n\nconst ErrorEvent = Schema.Struct({\n type: Schema.Literal(\"error\"),\n error: Schema.optional(\n Schema.Struct({\n type: Schema.optional(Schema.String),\n message: Schema.optional(Schema.String),\n }),\n ),\n})\n\n/**\n * Catch-all variant for wire events that fail to decode against any known\n * schema, plus events that fail to JSON-parse. The decoder never produces\n * this directly - it's synthesized by `sseEventToProviderEvent` when\n * `decodeKnown` fails.\n */\nconst Unknown = Schema.Struct({\n type: Schema.Literal(\"_unknown\"),\n raw: Schema.Unknown,\n})\n\n/**\n * Internal: union of variants we actually know how to decode from the wire.\n * Used as the decode target; failures are caught and re-emitted as `Unknown`.\n */\nexport const KnownProviderEvent = Schema.Union([\n MessageStart,\n ContentBlockStart,\n ContentBlockDelta,\n ContentBlockStop,\n MessageDelta,\n MessageStop,\n Ping,\n ErrorEvent,\n])\n\n/**\n * Public: every event the native stream can emit. Discriminated on `type`.\n * The `_unknown` branch closes the cardinality so downstream `Match.exhaustive`\n * cannot silently miss a wire event we didn't model.\n */\nexport const ProviderEvent = Schema.Union([\n MessageStart,\n ContentBlockStart,\n ContentBlockDelta,\n ContentBlockStop,\n MessageDelta,\n MessageStop,\n Ping,\n ErrorEvent,\n Unknown,\n])\nexport type ProviderEvent = typeof ProviderEvent.Type\n\n// ---------------------------------------------------------------------------\n// Apply event → Accumulator. Pure: the mapping never fails. Caller wires\n// this into `Stream.mapAccum` and emits text/turn_complete deltas based on\n// the diff.\n// ---------------------------------------------------------------------------\n\nconst mergeOptionalUsage = (acc: Accumulator, wire: WireUsage | undefined): Accumulator =>\n wire === undefined ? acc : mergeUsage(acc, wire)\n\nexport const applyEvent = (acc: Accumulator, event: ProviderEvent): Accumulator =>\n Match.value(event).pipe(\n Match.discriminatorsExhaustive(\"type\")({\n message_start: (e) => mergeOptionalUsage(acc, e.message.usage),\n content_block_start: (e) => startBlock(acc, e.index, e.content_block),\n content_block_delta: (e) =>\n Match.value(e.delta).pipe(\n Match.discriminatorsExhaustive(\"type\")({\n text_delta: (d) => appendTextDelta(acc, e.index, d.text),\n input_json_delta: (d) => appendInputJsonDelta(acc, e.index, d.partial_json),\n thinking_delta: (d) => appendThinkingDelta(acc, e.index, d.thinking),\n signature_delta: (d) => appendSignatureDelta(acc, e.index, d.signature),\n }),\n ),\n content_block_stop: () => acc,\n message_delta: (e) => {\n const withUsage = mergeOptionalUsage(acc, e.usage)\n const reason = e.delta.stop_reason\n return reason === undefined || reason === null\n ? withUsage\n : setStopReason(withUsage, reason)\n },\n message_stop: () => acc,\n ping: () => acc,\n error: () => acc,\n // No silent drops: unknown wire events flow through `streamNative` but\n // produce no accumulator change. Step 3 (canonical `other` event) will\n // also forward them to `TurnEvent`.\n _unknown: () => acc,\n }),\n )\n\n// ---------------------------------------------------------------------------\n// Helpers for producing TurnEvent from a step.\n// ---------------------------------------------------------------------------\n\nexport const isTextDeltaEvent = (\n event: ProviderEvent,\n): event is Extract<\n ProviderEvent,\n { type: \"content_block_delta\"; delta: { type: \"text_delta\" } }\n> => event.type === \"content_block_delta\" && event.delta.type === \"text_delta\"\n\nexport const isThinkingDeltaEvent = (\n event: ProviderEvent,\n): event is Extract<\n ProviderEvent,\n { type: \"content_block_delta\"; delta: { type: \"thinking_delta\" } }\n> => event.type === \"content_block_delta\" && event.delta.type === \"thinking_delta\"\n\nexport const isInputJsonDeltaEvent = (\n event: ProviderEvent,\n): event is Extract<\n ProviderEvent,\n { type: \"content_block_delta\"; delta: { type: \"input_json_delta\" } }\n> => event.type === \"content_block_delta\" && event.delta.type === \"input_json_delta\"\n\nexport const isToolUseStartEvent = (\n event: ProviderEvent,\n): event is Extract<\n ProviderEvent,\n { type: \"content_block_start\"; content_block: { type: \"tool_use\" } }\n> => event.type === \"content_block_start\" && event.content_block.type === \"tool_use\"\n\nexport const isMessageStop = (event: ProviderEvent): boolean => event.type === \"message_stop\"\n\nexport const isErrorEvent = (\n event: ProviderEvent,\n): event is Extract<ProviderEvent, { type: \"error\" }> => event.type === \"error\"\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.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "Anthropic Messages API provider for @effect-uai/core.",
5
5
  "keywords": [
6
6
  "ai",
@@ -20,6 +20,12 @@
20
20
  "url": "https://github.com/betalyra/effect-uai",
21
21
  "directory": "packages/providers/anthropic"
22
22
  },
23
+ "files": [
24
+ "dist",
25
+ "src",
26
+ "README.md",
27
+ "LICENSE"
28
+ ],
23
29
  "type": "module",
24
30
  "main": "./dist/index.mjs",
25
31
  "types": "./dist/index.d.mts",
@@ -27,25 +33,23 @@
27
33
  ".": {
28
34
  "types": "./dist/index.d.mts",
29
35
  "import": "./dist/index.mjs"
36
+ },
37
+ "./Anthropic": {
38
+ "types": "./dist/Anthropic.d.mts",
39
+ "import": "./dist/Anthropic.mjs"
30
40
  }
31
41
  },
32
- "files": [
33
- "dist",
34
- "src",
35
- "README.md",
36
- "LICENSE"
37
- ],
38
42
  "publishConfig": {
39
43
  "access": "public"
40
44
  },
41
- "peerDependencies": {
42
- "effect": "4.0.0-beta.57",
43
- "@effect-uai/core": "^0.2.0"
44
- },
45
45
  "devDependencies": {
46
46
  "effect": "4.0.0-beta.57",
47
47
  "typescript": "^6.0.3",
48
- "@effect-uai/core": "0.2.0"
48
+ "@effect-uai/core": "0.4.0"
49
+ },
50
+ "peerDependencies": {
51
+ "@effect-uai/core": ">=0.2.0 <1",
52
+ "effect": "4.0.0-beta.57"
49
53
  },
50
54
  "scripts": {
51
55
  "build": "tsdown",
package/src/Anthropic.ts CHANGED
@@ -17,7 +17,6 @@ import {
17
17
  LanguageModel,
18
18
  type LanguageModelService,
19
19
  } from "@effect-uai/core/LanguageModel"
20
- import { matchType } from "@effect-uai/core/Match"
21
20
  import * as SSE from "@effect-uai/core/SSE"
22
21
  import type { TurnEvent } from "@effect-uai/core/Turn"
23
22
  import {
@@ -34,7 +33,7 @@ import { KnownProviderEvent, ProviderEvent, applyEvent } from "./streamEvents.js
34
33
  // Public types
35
34
  // ---------------------------------------------------------------------------
36
35
 
37
- export interface AnthropicRequest extends Omit<CommonRequest, "model"> {
36
+ export type AnthropicRequest = Omit<CommonRequest, "model"> & {
38
37
  /**
39
38
  * Narrows `CommonRequest.model` (`string`) to the typed `AnthropicModel`
40
39
  * literal union for autocomplete.
@@ -59,7 +58,7 @@ export interface AnthropicRequest extends Omit<CommonRequest, "model"> {
59
58
  readonly user?: string
60
59
  }
61
60
 
62
- export interface AnthropicService {
61
+ export type AnthropicService = {
63
62
  /**
64
63
  * Stream the provider's native event vocabulary (post-SSE-decode).
65
64
  * Use this when you need full vendor fidelity (e.g. `signature_delta` for
@@ -93,7 +92,7 @@ export class Anthropic extends Context.Service<Anthropic, AnthropicService>()(
93
92
  "@betalyra/effect-uai/providers/anthropic/Anthropic",
94
93
  ) {}
95
94
 
96
- export interface Config {
95
+ export type Config = {
97
96
  readonly apiKey: Redacted.Redacted
98
97
  readonly baseUrl?: string
99
98
  /**
@@ -182,57 +181,53 @@ const sseEventToProviderEvent = (ev: SSE.Event): Effect.Effect<ProviderEvent> =>
182
181
 
183
182
  const deltasFromEvent = (next: Accumulator, event: ProviderEvent): ReadonlyArray<TurnEvent> =>
184
183
  Match.value(event).pipe(
185
- matchType("content_block_start", (e) =>
186
- e.content_block.type === "tool_use"
187
- ? [
188
- {
189
- type: "tool_call_start" as const,
190
- call_id: e.content_block.id,
191
- name: e.content_block.name,
184
+ Match.discriminatorsExhaustive("type")({
185
+ content_block_start: (e) =>
186
+ e.content_block.type === "tool_use"
187
+ ? [
188
+ {
189
+ type: "tool_call_start" as const,
190
+ call_id: e.content_block.id,
191
+ name: e.content_block.name,
192
+ },
193
+ ]
194
+ : [],
195
+ content_block_delta: (e) =>
196
+ Match.value(e.delta).pipe(
197
+ Match.discriminatorsExhaustive("type")({
198
+ text_delta: (d) => [{ type: "text_delta" as const, text: d.text }],
199
+ thinking_delta: (d) => [
200
+ { type: "reasoning_delta" as const, text: d.thinking, kind: "trace" as const },
201
+ ],
202
+ input_json_delta: (d) => {
203
+ const block = next.blocks[e.index]
204
+ if (block === undefined) return []
205
+ const callId = Option.getOrElse(block.id, () => "")
206
+ return callId.length === 0
207
+ ? []
208
+ : [
209
+ {
210
+ type: "tool_call_args_delta" as const,
211
+ call_id: callId,
212
+ delta: d.partial_json,
213
+ },
214
+ ]
192
215
  },
193
- ]
194
- : [],
195
- ),
196
- matchType("content_block_delta", (e) =>
197
- Match.value(e.delta).pipe(
198
- matchType("text_delta", (d) => [{ type: "text_delta" as const, text: d.text }]),
199
- matchType("thinking_delta", (d) => [
200
- { type: "reasoning_delta" as const, text: d.thinking, kind: "trace" as const },
201
- ]),
202
- matchType("input_json_delta", (d) => {
203
- const block = next.blocks[e.index]
204
- if (block === undefined) return []
205
- const callId = Option.getOrElse(block.id, () => "")
206
- return callId.length === 0
207
- ? []
208
- : [
209
- {
210
- type: "tool_call_args_delta" as const,
211
- call_id: callId,
212
- delta: d.partial_json,
213
- },
214
- ]
215
- }),
216
- // Encrypted reasoning state - flows through `streamNative` but has
217
- // no canonical representation.
218
- matchType("signature_delta", () => []),
219
- Match.exhaustive,
220
- ),
221
- ),
222
- matchType("message_start", (e) =>
223
- e.message.usage === undefined ? [] : [{ type: "usage_update" as const, usage: next.usage }],
224
- ),
225
- matchType("message_delta", (e) =>
226
- e.usage === undefined ? [] : [{ type: "usage_update" as const, usage: next.usage }],
227
- ),
228
- matchType("message_stop", () => [
229
- { type: "turn_complete" as const, turn: accumulatorToTurn(next) },
230
- ]),
231
- matchType("content_block_stop", () => []),
232
- matchType("ping", () => []),
233
- matchType("error", () => []),
234
- matchType("_unknown", () => []),
235
- Match.exhaustive,
216
+ // Encrypted reasoning state - flows through `streamNative` but has
217
+ // no canonical representation.
218
+ signature_delta: () => [],
219
+ }),
220
+ ),
221
+ message_start: (e) =>
222
+ e.message.usage === undefined ? [] : [{ type: "usage_update" as const, usage: next.usage }],
223
+ message_delta: (e) =>
224
+ e.usage === undefined ? [] : [{ type: "usage_update" as const, usage: next.usage }],
225
+ message_stop: () => [{ type: "turn_complete" as const, turn: accumulatorToTurn(next) }],
226
+ content_block_stop: () => [],
227
+ ping: () => [],
228
+ error: () => [],
229
+ _unknown: () => [],
230
+ }),
236
231
  )
237
232
 
238
233
  // ---------------------------------------------------------------------------