@sortedyuan/provider-anthropic 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Yuan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,51 @@
1
- # Temporary Holding Version
1
+ # `@sortedyuan/provider-anthropic`
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Anthropic Messages API adapter for May.
4
+
5
+ ```ts
6
+ import { InMemoryContext, May } from "@sortedyuan/core";
7
+ import { AnthropicModel } from "@sortedyuan/provider-anthropic";
8
+
9
+ const model = new AnthropicModel({
10
+ apiKey: process.env.ANTHROPIC_API_KEY!,
11
+ model: "your-claude-model",
12
+ maxTokens: 8192,
13
+ thinking: { type: "adaptive", display: "summarized" },
14
+ reasoningEffort: "high",
15
+ });
16
+
17
+ const run = new May({
18
+ model,
19
+ context: new InMemoryContext(),
20
+ }).run({ input: "Analyze this problem." });
21
+ ```
22
+
23
+ The adapter uses `https://api.anthropic.com` and API version `2023-06-01` by
24
+ default. It supports streaming text and thinking, client tool calls, usage,
25
+ structured HTTP and stream errors, and cancellation.
26
+
27
+ User and tool-result content supports images and documents backed by URL,
28
+ base64 data, or an Anthropic file id. Audio and generic resource parts are
29
+ rejected explicitly.
30
+
31
+ Anthropic requires thinking and redacted-thinking blocks to be returned
32
+ unchanged during continuation. The adapter stores the complete native assistant
33
+ content in `AssistantMessage.modelState` under
34
+ `@may/provider-anthropic/message-v1`. May treats that data as opaque while the
35
+ adapter reuses it on later tool and conversation turns.
36
+
37
+ For models with adaptive thinking:
38
+
39
+ ```ts
40
+ thinking: { type: "adaptive", display: "summarized" }
41
+ ```
42
+
43
+ For models that support manual extended thinking:
44
+
45
+ ```ts
46
+ maxTokens: 8192,
47
+ thinking: { type: "enabled", budgetTokens: 4096 }
48
+ ```
49
+
50
+ Manual `budgetTokens` must be at least 1024 and less than `maxTokens` in this
51
+ MVP. Interleaved-thinking beta headers are not yet exposed.
@@ -0,0 +1,26 @@
1
+ import type { Model, ModelEvent, ModelRequest, ModelStreamOptions } from "@sortedyuan/core";
2
+ import type { AnthropicReasoningEffort, AnthropicThinkingConfig } from "./protocol.js";
3
+ export interface AnthropicModelOptions {
4
+ apiKey: string;
5
+ model: string;
6
+ baseURL?: string;
7
+ apiVersion?: string;
8
+ maxTokens?: number;
9
+ thinking?: Readonly<AnthropicThinkingConfig>;
10
+ reasoningEffort?: AnthropicReasoningEffort;
11
+ fetch?: typeof globalThis.fetch;
12
+ }
13
+ export declare class AnthropicModel implements Model {
14
+ private readonly apiKey;
15
+ private readonly model;
16
+ private readonly baseURL;
17
+ private readonly apiVersion;
18
+ private readonly maxTokens;
19
+ private readonly thinking;
20
+ private readonly reasoningEffort;
21
+ private readonly fetchImplementation;
22
+ constructor(options: AnthropicModelOptions);
23
+ stream(request: ModelRequest, options: ModelStreamOptions): AsyncIterable<ModelEvent>;
24
+ private createRequest;
25
+ }
26
+ //# sourceMappingURL=anthropic-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-model.d.ts","sourceRoot":"","sources":["../src/anthropic-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,KAAK,EACL,UAAU,EACV,YAAY,EACZ,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAQ1B,OAAO,KAAK,EAEV,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,eAAe,CAAC;AAGvB,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC,uBAAuB,CAAC,CAAC;IAC7C,eAAe,CAAC,EAAE,wBAAwB,CAAC;IAC3C,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAID,qBAAa,cAAe,YAAW,KAAK;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsC;IAC/D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAuC;IACvE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA0B;IAE9D,YAAY,OAAO,EAAE,qBAAqB,EA2CzC;IAEM,MAAM,CACX,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,kBAAkB,GAC1B,aAAa,CAAC,UAAU,CAAC,CAuB3B;IAED,OAAO,CAAC,aAAa;CAqBtB"}
@@ -0,0 +1,133 @@
1
+ import { parseRetryAfterMs } from "@sortedyuan/provider-openai-compatible/http";
2
+ import { toAnthropicRequestParts, toAnthropicThinking, toAnthropicTools, } from "./convert.js";
3
+ import { AnthropicApiError } from "./errors.js";
4
+ import { streamAnthropicResponse } from "./stream.js";
5
+ const FILES_API_BETA = "files-api-2025-04-14";
6
+ export class AnthropicModel {
7
+ apiKey;
8
+ model;
9
+ baseURL;
10
+ apiVersion;
11
+ maxTokens;
12
+ thinking;
13
+ reasoningEffort;
14
+ fetchImplementation;
15
+ constructor(options) {
16
+ if (options.apiKey.trim() === "") {
17
+ throw new TypeError("apiKey must not be empty");
18
+ }
19
+ if (options.model.trim() === "") {
20
+ throw new TypeError("model must not be empty");
21
+ }
22
+ const maxTokens = options.maxTokens ?? 4096;
23
+ if (!Number.isSafeInteger(maxTokens) || maxTokens < 1) {
24
+ throw new RangeError("maxTokens must be a positive safe integer");
25
+ }
26
+ if (options.apiVersion !== undefined &&
27
+ options.apiVersion.trim() === "") {
28
+ throw new TypeError("apiVersion must not be empty");
29
+ }
30
+ if (options.thinking?.type === "enabled") {
31
+ if (!Number.isSafeInteger(options.thinking.budgetTokens) ||
32
+ options.thinking.budgetTokens < 1024) {
33
+ throw new RangeError("thinking.budgetTokens must be a safe integer of at least 1024");
34
+ }
35
+ if (options.thinking.budgetTokens >= maxTokens) {
36
+ throw new RangeError("thinking.budgetTokens must be less than maxTokens");
37
+ }
38
+ }
39
+ this.apiKey = options.apiKey;
40
+ this.model = options.model;
41
+ this.baseURL = (options.baseURL ?? "https://api.anthropic.com")
42
+ .replace(/\/+$/, "");
43
+ this.apiVersion = options.apiVersion ?? "2023-06-01";
44
+ this.maxTokens = maxTokens;
45
+ this.thinking = cloneThinking(options.thinking);
46
+ this.reasoningEffort = options.reasoningEffort;
47
+ this.fetchImplementation = options.fetch ?? globalThis.fetch;
48
+ }
49
+ async *stream(request, options) {
50
+ if (request.responseFormat !== undefined)
51
+ throw new TypeError("Anthropic adapter does not support responseFormat");
52
+ const body = this.createRequest(request);
53
+ const headers = {
54
+ "anthropic-version": this.apiVersion,
55
+ "content-type": "application/json",
56
+ "x-api-key": this.apiKey,
57
+ };
58
+ if (usesFileId(request.messages)) {
59
+ headers["anthropic-beta"] = FILES_API_BETA;
60
+ }
61
+ const response = await this.fetchImplementation(`${this.baseURL}/v1/messages`, {
62
+ method: "POST",
63
+ headers,
64
+ body: JSON.stringify(body),
65
+ signal: options.signal,
66
+ });
67
+ if (!response.ok)
68
+ throw await createApiError(response);
69
+ yield* streamAnthropicResponse(response, options.signal);
70
+ }
71
+ createRequest(request) {
72
+ const parts = toAnthropicRequestParts(request.messages);
73
+ const body = {
74
+ model: this.model,
75
+ max_tokens: this.maxTokens,
76
+ messages: parts.messages,
77
+ stream: true,
78
+ };
79
+ if (parts.system !== undefined)
80
+ body.system = parts.system;
81
+ if (request.tools.length > 0) {
82
+ body.tools = toAnthropicTools(request.tools);
83
+ }
84
+ if (this.thinking !== undefined) {
85
+ body.thinking = toAnthropicThinking(this.thinking);
86
+ }
87
+ if (this.reasoningEffort !== undefined) {
88
+ body.output_config = { effort: this.reasoningEffort };
89
+ }
90
+ return body;
91
+ }
92
+ }
93
+ function usesFileId(messages) {
94
+ return messages.some((message) => message.content.some((part) => (part.type === "image" || part.type === "file") &&
95
+ part.source.type === "file"));
96
+ }
97
+ function cloneThinking(thinking) {
98
+ return thinking === undefined ? undefined : { ...thinking };
99
+ }
100
+ async function createApiError(response) {
101
+ const text = await response.text();
102
+ let message = text || `Anthropic request failed with status ${response.status}`;
103
+ let providerType;
104
+ let requestId = response.headers.get("request-id") ?? undefined;
105
+ try {
106
+ const parsed = JSON.parse(text);
107
+ if (typeof parsed.error?.message === "string") {
108
+ message = parsed.error.message;
109
+ }
110
+ if (typeof parsed.error?.type === "string") {
111
+ providerType = parsed.error.type;
112
+ }
113
+ if (typeof parsed.request_id === "string") {
114
+ requestId = parsed.request_id;
115
+ }
116
+ }
117
+ catch {
118
+ // Keep the response text as the error message when it is not JSON.
119
+ }
120
+ const options = {
121
+ status: response.status,
122
+ message,
123
+ };
124
+ if (providerType !== undefined)
125
+ options.providerType = providerType;
126
+ if (requestId !== undefined)
127
+ options.requestId = requestId;
128
+ const retryAfterMs = parseRetryAfterMs(response.headers.get("retry-after"));
129
+ if (retryAfterMs !== undefined)
130
+ options.retryAfterMs = retryAfterMs;
131
+ return new AnthropicApiError(options);
132
+ }
133
+ //# sourceMappingURL=anthropic-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-model.js","sourceRoot":"","sources":["../src/anthropic-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Message, ToolDefinition } from "@sortedyuan/core";
2
+ import { type AnthropicMessagesRequest, type AnthropicRequestMessage, type AnthropicThinkingConfig, type AnthropicToolDefinition } from "./protocol.js";
3
+ export interface AnthropicRequestParts {
4
+ messages: AnthropicRequestMessage[];
5
+ system?: string;
6
+ }
7
+ export declare function toAnthropicRequestParts(messages: readonly Message[]): AnthropicRequestParts;
8
+ export declare function toAnthropicTools(tools: readonly ToolDefinition[]): AnthropicToolDefinition[];
9
+ export declare function toAnthropicThinking(thinking: AnthropicThinkingConfig): NonNullable<AnthropicMessagesRequest["thinking"]>;
10
+ //# sourceMappingURL=convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../src/convert.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,OAAO,EAEP,cAAc,EACf,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAGL,KAAK,wBAAwB,EAG7B,KAAK,uBAAuB,EAG5B,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAE7B,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,uBAAuB,EAAE,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAC3B,qBAAqB,CA8DvB;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,cAAc,EAAE,GAC/B,uBAAuB,EAAE,CAM3B;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,uBAAuB,GAChC,WAAW,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAC,CAuBnD"}
@@ -0,0 +1,158 @@
1
+ import { UnsupportedContentError } from "@sortedyuan/core";
2
+ import { AnthropicProtocolError } from "./errors.js";
3
+ import { ANTHROPIC_MODEL_STATE_TYPE, } from "./protocol.js";
4
+ export function toAnthropicRequestParts(messages) {
5
+ const system = [];
6
+ const converted = [];
7
+ for (const message of messages) {
8
+ if (message.role === "system") {
9
+ const text = serializeVisibleContent(message.content);
10
+ if (text !== "")
11
+ system.push(text);
12
+ continue;
13
+ }
14
+ if (message.role === "user") {
15
+ converted.push({
16
+ role: "user",
17
+ content: toUserBlocks(message.content),
18
+ });
19
+ continue;
20
+ }
21
+ if (message.role === "tool") {
22
+ const toolResult = {
23
+ type: "tool_result",
24
+ tool_use_id: message.toolCallId,
25
+ content: hasMedia(message.content)
26
+ ? toUserBlocks(message.content)
27
+ : serializeVisibleContent(message.content, "tool"),
28
+ };
29
+ if (message.isError !== undefined) {
30
+ toolResult.is_error = message.isError;
31
+ }
32
+ converted.push({ role: "user", content: [toolResult] });
33
+ continue;
34
+ }
35
+ const nativeContent = getAnthropicStateContent(message.modelState);
36
+ if (nativeContent !== undefined) {
37
+ converted.push({ role: "assistant", content: nativeContent });
38
+ continue;
39
+ }
40
+ const content = [
41
+ ...toAssistantTextBlocks(message.content),
42
+ ];
43
+ for (const call of message.toolCalls ?? []) {
44
+ if (!isRecord(call.input)) {
45
+ throw new AnthropicProtocolError(`Anthropic tool call "${call.name}" input must be an object`);
46
+ }
47
+ content.push({
48
+ type: "tool_use",
49
+ id: call.id,
50
+ name: call.name,
51
+ input: call.input,
52
+ });
53
+ }
54
+ converted.push({ role: "assistant", content });
55
+ }
56
+ const result = { messages: converted };
57
+ if (system.length > 0)
58
+ result.system = system.join("\n");
59
+ return result;
60
+ }
61
+ export function toAnthropicTools(tools) {
62
+ return tools.map((tool) => ({
63
+ name: tool.name,
64
+ description: tool.description,
65
+ input_schema: tool.inputSchema,
66
+ }));
67
+ }
68
+ export function toAnthropicThinking(thinking) {
69
+ if (thinking.type === "enabled") {
70
+ const converted = {
71
+ type: "enabled",
72
+ budget_tokens: thinking.budgetTokens,
73
+ };
74
+ if (thinking.display !== undefined)
75
+ converted.display = thinking.display;
76
+ return converted;
77
+ }
78
+ if (thinking.type === "adaptive") {
79
+ const converted = { type: "adaptive" };
80
+ if (thinking.display !== undefined)
81
+ converted.display = thinking.display;
82
+ return converted;
83
+ }
84
+ return { type: "disabled" };
85
+ }
86
+ function getAnthropicStateContent(state) {
87
+ if (state?.type !== ANTHROPIC_MODEL_STATE_TYPE)
88
+ return undefined;
89
+ if (!isRecord(state.data) || !Array.isArray(state.data.content)) {
90
+ throw new AnthropicProtocolError("Anthropic model state is malformed");
91
+ }
92
+ return state.data.content;
93
+ }
94
+ function toAssistantTextBlocks(content) {
95
+ return content.flatMap((part) => {
96
+ if (part.type === "reasoning")
97
+ return [];
98
+ if (part.type !== "text" && part.type !== "json") {
99
+ throw new UnsupportedContentError("Anthropic adapter", part.type, "assistant");
100
+ }
101
+ return [{
102
+ type: "text",
103
+ text: part.type === "text" ? part.text : serializeJson(part.value),
104
+ }];
105
+ });
106
+ }
107
+ function toUserBlocks(content) {
108
+ return content.flatMap((part) => {
109
+ if (part.type === "reasoning")
110
+ return [];
111
+ if (part.type === "text")
112
+ return [{ type: "text", text: part.text }];
113
+ if (part.type === "json") {
114
+ return [{ type: "text", text: serializeJson(part.value) }];
115
+ }
116
+ if (part.type === "image") {
117
+ return [{ type: "image", source: toAnthropicSource(part.source) }];
118
+ }
119
+ if (part.type === "file") {
120
+ return [{ type: "document", source: toAnthropicSource(part.source) }];
121
+ }
122
+ throw new UnsupportedContentError("Anthropic adapter", part.type, "user");
123
+ });
124
+ }
125
+ function serializeVisibleContent(content, role = "system") {
126
+ return content
127
+ .filter((part) => part.type !== "reasoning")
128
+ .map((part) => {
129
+ if (part.type === "text")
130
+ return part.text;
131
+ if (part.type === "json")
132
+ return serializeJson(part.value);
133
+ throw new UnsupportedContentError("Anthropic adapter", part.type, role);
134
+ })
135
+ .join("\n");
136
+ }
137
+ function hasMedia(content) {
138
+ return content.some((part) => part.type === "image" || part.type === "file");
139
+ }
140
+ function toAnthropicSource(source) {
141
+ if (source.type === "url")
142
+ return { type: "url", url: source.url };
143
+ if (source.type === "file")
144
+ return { type: "file", file_id: source.fileId };
145
+ return {
146
+ type: "base64",
147
+ media_type: source.mediaType,
148
+ data: source.data,
149
+ };
150
+ }
151
+ function serializeJson(value) {
152
+ const serialized = JSON.stringify(value);
153
+ return serialized === undefined ? "null" : serialized;
154
+ }
155
+ function isRecord(value) {
156
+ return typeof value === "object" && value !== null && !Array.isArray(value);
157
+ }
158
+ //# sourceMappingURL=convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../src/convert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export declare class AnthropicError extends Error {
2
+ readonly code: string;
3
+ constructor(code: string, message: string, options?: ErrorOptions);
4
+ }
5
+ export declare class AnthropicApiError extends AnthropicError {
6
+ readonly status: number;
7
+ readonly providerType: string | undefined;
8
+ readonly requestId: string | undefined;
9
+ readonly retryAfterMs: number | undefined;
10
+ constructor(options: {
11
+ status: number;
12
+ message: string;
13
+ providerType?: string;
14
+ requestId?: string;
15
+ retryAfterMs?: number;
16
+ });
17
+ }
18
+ export declare class AnthropicStreamError extends AnthropicError {
19
+ readonly providerType: string | undefined;
20
+ readonly requestId: string | undefined;
21
+ constructor(options: {
22
+ message: string;
23
+ providerType?: string;
24
+ requestId?: string;
25
+ });
26
+ }
27
+ export declare class AnthropicProtocolError extends AnthropicError {
28
+ constructor(message: string, options?: ErrorOptions);
29
+ }
30
+ export declare class AnthropicFinishReasonError extends AnthropicError {
31
+ readonly finishReason: string;
32
+ constructor(finishReason: string);
33
+ }
34
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,YAAY,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAIhE;CACF;AAED,qBAAa,iBAAkB,SAAQ,cAAc;IACnD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAE1C,YAAY,OAAO,EAAE;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,EAMA;CACF;AAED,qBAAa,oBAAqB,SAAQ,cAAc;IACtD,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAEvC,YAAY,OAAO,EAAE;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,EAIA;CACF;AAED,qBAAa,sBAAuB,SAAQ,cAAc;IACxD,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAElD;CACF;AAED,qBAAa,0BAA2B,SAAQ,cAAc;IAC5D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B,YAAY,YAAY,EAAE,MAAM,EAM/B;CACF"}
package/dist/errors.js ADDED
@@ -0,0 +1,43 @@
1
+ export class AnthropicError extends Error {
2
+ code;
3
+ constructor(code, message, options) {
4
+ super(message, options);
5
+ this.name = new.target.name;
6
+ this.code = code;
7
+ }
8
+ }
9
+ export class AnthropicApiError extends AnthropicError {
10
+ status;
11
+ providerType;
12
+ requestId;
13
+ retryAfterMs;
14
+ constructor(options) {
15
+ super("ANTHROPIC_API_ERROR", options.message);
16
+ this.status = options.status;
17
+ this.providerType = options.providerType;
18
+ this.requestId = options.requestId;
19
+ this.retryAfterMs = options.retryAfterMs;
20
+ }
21
+ }
22
+ export class AnthropicStreamError extends AnthropicError {
23
+ providerType;
24
+ requestId;
25
+ constructor(options) {
26
+ super("ANTHROPIC_STREAM_ERROR", options.message);
27
+ this.providerType = options.providerType;
28
+ this.requestId = options.requestId;
29
+ }
30
+ }
31
+ export class AnthropicProtocolError extends AnthropicError {
32
+ constructor(message, options) {
33
+ super("ANTHROPIC_PROTOCOL_ERROR", message, options);
34
+ }
35
+ }
36
+ export class AnthropicFinishReasonError extends AnthropicError {
37
+ finishReason;
38
+ constructor(finishReason) {
39
+ super("ANTHROPIC_INCOMPLETE_RESPONSE", `Anthropic stopped with finish reason "${finishReason}"`);
40
+ this.finishReason = finishReason;
41
+ }
42
+ }
43
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,OAAe,EAAE,OAAsB;QAC/D,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,cAAc;IAC1C,MAAM,CAAS;IACf,YAAY,CAAqB;IACjC,SAAS,CAAqB;IAC9B,YAAY,CAAqB;IAE1C,YAAY,OAMX;QACC,KAAK,CAAC,qBAAqB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,cAAc;IAC7C,YAAY,CAAqB;IACjC,SAAS,CAAqB;IAEvC,YAAY,OAIX;QACC,KAAK,CAAC,wBAAwB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,cAAc;IACxD,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,0BAA0B,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;CACF;AAED,MAAM,OAAO,0BAA2B,SAAQ,cAAc;IACnD,YAAY,CAAS;IAE9B,YAAY,YAAoB;QAC9B,KAAK,CACH,+BAA+B,EAC/B,yCAAyC,YAAY,GAAG,CACzD,CAAC;QACF,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export * from "./anthropic-model.js";
2
+ export * from "./errors.js";
3
+ export { ANTHROPIC_MODEL_STATE_TYPE, type AnthropicModelStateData, type AnthropicReasoningEffort, type AnthropicThinkingConfig, } from "./protocol.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,OAAO,EACL,0BAA0B,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC7B,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from "./anthropic-model.js";
2
+ export * from "./errors.js";
3
+ export { ANTHROPIC_MODEL_STATE_TYPE, } from "./protocol.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,OAAO,EACL,0BAA0B,GAI3B,MAAM,eAAe,CAAC"}
@@ -0,0 +1,95 @@
1
+ import type { JsonSchema } from "@sortedyuan/core";
2
+ export declare const ANTHROPIC_MODEL_STATE_TYPE = "@may/provider-anthropic/message-v1";
3
+ /** Provider/model metadata determines concrete supported values. */
4
+ export type AnthropicReasoningEffort = string;
5
+ export type AnthropicThinkingConfig = {
6
+ type: "enabled";
7
+ budgetTokens: number;
8
+ display?: "summarized" | "omitted";
9
+ } | {
10
+ type: "adaptive";
11
+ display?: "summarized" | "omitted";
12
+ } | {
13
+ type: "disabled";
14
+ };
15
+ export interface AnthropicTextBlock {
16
+ type: "text";
17
+ text: string;
18
+ }
19
+ export type AnthropicMediaSource = {
20
+ type: "url";
21
+ url: string;
22
+ } | {
23
+ type: "base64";
24
+ media_type: string;
25
+ data: string;
26
+ } | {
27
+ type: "file";
28
+ file_id: string;
29
+ };
30
+ export interface AnthropicImageBlock {
31
+ type: "image";
32
+ source: AnthropicMediaSource;
33
+ }
34
+ export interface AnthropicDocumentBlock {
35
+ type: "document";
36
+ source: AnthropicMediaSource;
37
+ }
38
+ export type AnthropicUserContentBlock = AnthropicTextBlock | AnthropicImageBlock | AnthropicDocumentBlock;
39
+ export interface AnthropicThinkingBlock {
40
+ type: "thinking";
41
+ thinking: string;
42
+ signature: string;
43
+ }
44
+ export interface AnthropicRedactedThinkingBlock {
45
+ type: "redacted_thinking";
46
+ data: string;
47
+ }
48
+ export interface AnthropicToolUseBlock {
49
+ type: "tool_use";
50
+ id: string;
51
+ name: string;
52
+ input: Record<string, unknown>;
53
+ }
54
+ export type AnthropicAssistantContentBlock = AnthropicTextBlock | AnthropicThinkingBlock | AnthropicRedactedThinkingBlock | AnthropicToolUseBlock;
55
+ export interface AnthropicToolResultBlock {
56
+ type: "tool_result";
57
+ tool_use_id: string;
58
+ content: string | AnthropicUserContentBlock[];
59
+ is_error?: boolean;
60
+ }
61
+ export interface AnthropicRequestMessage {
62
+ role: "user" | "assistant";
63
+ content: Array<AnthropicAssistantContentBlock | AnthropicToolResultBlock | AnthropicImageBlock | AnthropicDocumentBlock>;
64
+ }
65
+ export interface AnthropicToolDefinition {
66
+ name: string;
67
+ description: string;
68
+ input_schema: JsonSchema;
69
+ }
70
+ export interface AnthropicModelStateData {
71
+ messageId: string;
72
+ content: AnthropicAssistantContentBlock[];
73
+ }
74
+ export interface AnthropicMessagesRequest {
75
+ model: string;
76
+ max_tokens: number;
77
+ messages: AnthropicRequestMessage[];
78
+ stream: true;
79
+ system?: string;
80
+ tools?: AnthropicToolDefinition[];
81
+ thinking?: {
82
+ type: "enabled";
83
+ budget_tokens: number;
84
+ display?: "summarized" | "omitted";
85
+ } | {
86
+ type: "adaptive";
87
+ display?: "summarized" | "omitted";
88
+ } | {
89
+ type: "disabled";
90
+ };
91
+ output_config?: {
92
+ effort: AnthropicReasoningEffort;
93
+ };
94
+ }
95
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export const ANTHROPIC_MODEL_STATE_TYPE = "@may/provider-anthropic/message-v1";
2
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,0BAA0B,GACrC,oCAAoC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ModelEvent } from "@sortedyuan/core";
2
+ export declare function streamAnthropicResponse(response: Response, signal: AbortSignal): AsyncIterable<ModelEvent>;
3
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,UAAU,EAGX,MAAM,kBAAkB,CAAC;AA+C1B,wBAAuB,uBAAuB,CAC5C,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,WAAW,GAClB,aAAa,CAAC,UAAU,CAAC,CA6L3B"}
package/dist/stream.js ADDED
@@ -0,0 +1,363 @@
1
+ import { readSseData } from "@sortedyuan/provider-openai-compatible/http";
2
+ import { AnthropicFinishReasonError, AnthropicProtocolError, AnthropicStreamError, } from "./errors.js";
3
+ import { ANTHROPIC_MODEL_STATE_TYPE, } from "./protocol.js";
4
+ export async function* streamAnthropicResponse(response, signal) {
5
+ const blocks = new Map();
6
+ let messageId;
7
+ let sawMessageStart = false;
8
+ let sawMessageStop = false;
9
+ let stopReason;
10
+ let inputTokens;
11
+ let outputTokens;
12
+ let cachedReadTokens;
13
+ let cachedWriteTokens;
14
+ const usageItems = new Map();
15
+ for await (const data of readSseData(response, signal, (message, options) => new AnthropicProtocolError(message, options), "Anthropic")) {
16
+ const event = parseEvent(data);
17
+ if (event.type === "ping")
18
+ continue;
19
+ if (event.type === "error")
20
+ throw createStreamError(event);
21
+ if (event.type === "message_start") {
22
+ if (sawMessageStart) {
23
+ throw new AnthropicProtocolError("Anthropic emitted more than one message_start event");
24
+ }
25
+ const message = requireRecord(event.message, "message_start.message");
26
+ messageId = requireString(message.id, "message_start.message.id");
27
+ const usage = optionalRecord(message.usage);
28
+ inputTokens = optionalTokenCount(usage?.input_tokens);
29
+ outputTokens = optionalTokenCount(usage?.output_tokens);
30
+ cachedReadTokens = optionalTokenCount(usage?.cache_read_input_tokens);
31
+ cachedWriteTokens = optionalTokenCount(usage?.cache_creation_input_tokens);
32
+ collectUsageItems(usage, usageItems);
33
+ sawMessageStart = true;
34
+ continue;
35
+ }
36
+ if (event.type === "content_block_start") {
37
+ requireActiveMessage(sawMessageStart, sawMessageStop);
38
+ const index = requireIndex(event.index);
39
+ if (blocks.has(index)) {
40
+ throw new AnthropicProtocolError(`Anthropic started content block ${index} more than once`);
41
+ }
42
+ blocks.set(index, createPendingBlock(event.content_block, index));
43
+ continue;
44
+ }
45
+ if (event.type === "content_block_delta") {
46
+ requireActiveMessage(sawMessageStart, sawMessageStop);
47
+ const index = requireIndex(event.index);
48
+ const block = requirePendingBlock(blocks, index);
49
+ const delta = requireRecord(event.delta, `content block ${index} delta`);
50
+ const deltaType = requireString(delta.type, `content block ${index} delta.type`);
51
+ if (deltaType === "text_delta") {
52
+ if (block.kind !== "text")
53
+ throw mismatchedDelta(index, deltaType);
54
+ const text = requireString(delta.text, `content block ${index} text`);
55
+ block.block.text += text;
56
+ if (text !== "")
57
+ yield { type: "text.delta", delta: text };
58
+ continue;
59
+ }
60
+ if (deltaType === "thinking_delta") {
61
+ if (block.kind !== "thinking")
62
+ throw mismatchedDelta(index, deltaType);
63
+ const thinking = requireString(delta.thinking, `content block ${index} thinking`);
64
+ block.block.thinking += thinking;
65
+ if (thinking !== "") {
66
+ yield { type: "reasoning.delta", delta: thinking };
67
+ }
68
+ continue;
69
+ }
70
+ if (deltaType === "signature_delta") {
71
+ if (block.kind !== "thinking")
72
+ throw mismatchedDelta(index, deltaType);
73
+ block.block.signature += requireString(delta.signature, `content block ${index} signature`);
74
+ continue;
75
+ }
76
+ if (deltaType === "input_json_delta") {
77
+ if (block.kind !== "tool_use")
78
+ throw mismatchedDelta(index, deltaType);
79
+ block.partialJson += requireString(delta.partial_json, `content block ${index} partial_json`);
80
+ }
81
+ // Anthropic may add new delta types; unknown ones are ignored.
82
+ continue;
83
+ }
84
+ if (event.type === "content_block_stop") {
85
+ requireActiveMessage(sawMessageStart, sawMessageStop);
86
+ const index = requireIndex(event.index);
87
+ const block = requirePendingBlock(blocks, index);
88
+ if (block.kind === "tool_use" && block.partialJson.trim() !== "") {
89
+ block.block.input = parseToolInput(block.partialJson, index);
90
+ }
91
+ block.stopped = true;
92
+ continue;
93
+ }
94
+ if (event.type === "message_delta") {
95
+ requireActiveMessage(sawMessageStart, sawMessageStop);
96
+ const delta = requireRecord(event.delta, "message_delta.delta");
97
+ if (delta.stop_reason !== undefined && delta.stop_reason !== null) {
98
+ stopReason = requireString(delta.stop_reason, "message_delta.delta.stop_reason");
99
+ }
100
+ const usage = optionalRecord(event.usage);
101
+ inputTokens = optionalTokenCount(usage?.input_tokens) ?? inputTokens;
102
+ outputTokens = optionalTokenCount(usage?.output_tokens) ?? outputTokens;
103
+ cachedReadTokens = optionalTokenCount(usage?.cache_read_input_tokens) ?? cachedReadTokens;
104
+ cachedWriteTokens = optionalTokenCount(usage?.cache_creation_input_tokens) ?? cachedWriteTokens;
105
+ collectUsageItems(usage, usageItems);
106
+ continue;
107
+ }
108
+ if (event.type === "message_stop") {
109
+ requireActiveMessage(sawMessageStart, sawMessageStop);
110
+ sawMessageStop = true;
111
+ }
112
+ // Unknown event types are ignored for forward compatibility.
113
+ }
114
+ if (!sawMessageStart || messageId === undefined) {
115
+ throw new AnthropicProtocolError("Anthropic stream ended without a message_start event");
116
+ }
117
+ if (!sawMessageStop) {
118
+ throw new AnthropicProtocolError("Anthropic stream ended without a message_stop event");
119
+ }
120
+ if (stopReason === undefined) {
121
+ throw new AnthropicProtocolError("Anthropic stream ended without a stop_reason");
122
+ }
123
+ if (stopReason !== "end_turn" && stopReason !== "tool_use") {
124
+ throw new AnthropicFinishReasonError(stopReason);
125
+ }
126
+ const content = [...blocks.entries()]
127
+ .sort(([left], [right]) => left - right)
128
+ .map(([index, block]) => {
129
+ if (!block.stopped) {
130
+ throw new AnthropicProtocolError(`Anthropic content block ${index} did not stop`);
131
+ }
132
+ return block.block;
133
+ });
134
+ const message = toAssistantMessage(messageId, content);
135
+ const calls = message.toolCalls ?? [];
136
+ if (stopReason === "tool_use" && calls.length === 0) {
137
+ throw new AnthropicProtocolError("Anthropic stopped for tool_use but emitted no tool calls");
138
+ }
139
+ if (stopReason !== "tool_use" && calls.length > 0) {
140
+ throw new AnthropicProtocolError(`Anthropic emitted tool calls with stop reason "${stopReason}"`);
141
+ }
142
+ const completed = {
143
+ type: "response.completed",
144
+ message,
145
+ };
146
+ const usage = createUsage(inputTokens, outputTokens, cachedReadTokens, cachedWriteTokens, [...usageItems.values()]);
147
+ if (usage !== undefined)
148
+ completed.usage = usage;
149
+ yield completed;
150
+ }
151
+ function parseEvent(data) {
152
+ try {
153
+ const event = JSON.parse(data);
154
+ const record = requireRecord(event, "stream event");
155
+ requireString(record.type, "stream event.type");
156
+ return record;
157
+ }
158
+ catch (error) {
159
+ if (error instanceof AnthropicProtocolError)
160
+ throw error;
161
+ throw new AnthropicProtocolError("Anthropic emitted invalid SSE JSON", { cause: error });
162
+ }
163
+ }
164
+ function createPendingBlock(value, index) {
165
+ const block = requireRecord(value, `content block ${index}`);
166
+ const type = requireString(block.type, `content block ${index}.type`);
167
+ if (type === "text") {
168
+ return {
169
+ kind: "text",
170
+ stopped: false,
171
+ block: {
172
+ type,
173
+ text: requireString(block.text, `content block ${index}.text`),
174
+ },
175
+ };
176
+ }
177
+ if (type === "thinking") {
178
+ return {
179
+ kind: "thinking",
180
+ stopped: false,
181
+ block: {
182
+ type,
183
+ thinking: requireString(block.thinking, `content block ${index}.thinking`),
184
+ signature: requireString(block.signature, `content block ${index}.signature`),
185
+ },
186
+ };
187
+ }
188
+ if (type === "redacted_thinking") {
189
+ return {
190
+ kind: "redacted_thinking",
191
+ stopped: false,
192
+ block: {
193
+ type,
194
+ data: requireString(block.data, `content block ${index}.data`),
195
+ },
196
+ };
197
+ }
198
+ if (type === "tool_use") {
199
+ return {
200
+ kind: "tool_use",
201
+ stopped: false,
202
+ partialJson: "",
203
+ block: {
204
+ type,
205
+ id: requireString(block.id, `content block ${index}.id`),
206
+ name: requireString(block.name, `content block ${index}.name`),
207
+ input: requireObject(block.input, `content block ${index}.input`),
208
+ },
209
+ };
210
+ }
211
+ throw new AnthropicProtocolError(`Anthropic emitted unsupported content block type "${type}"`);
212
+ }
213
+ function toAssistantMessage(messageId, blocks) {
214
+ const message = {
215
+ role: "assistant",
216
+ content: [],
217
+ modelState: {
218
+ type: ANTHROPIC_MODEL_STATE_TYPE,
219
+ data: { messageId, content: blocks },
220
+ },
221
+ };
222
+ const calls = [];
223
+ for (const block of blocks) {
224
+ if (block.type === "thinking") {
225
+ message.content.push({ type: "reasoning", text: block.thinking });
226
+ }
227
+ else if (block.type === "text") {
228
+ if (block.text !== "") {
229
+ message.content.push({ type: "text", text: block.text });
230
+ }
231
+ }
232
+ else if (block.type === "tool_use") {
233
+ calls.push({ id: block.id, name: block.name, input: block.input });
234
+ }
235
+ }
236
+ if (calls.length > 0)
237
+ message.toolCalls = calls;
238
+ return message;
239
+ }
240
+ function createStreamError(event) {
241
+ const error = optionalRecord(event.error);
242
+ const providerType = optionalString(error?.type);
243
+ const requestId = optionalString(event.request_id);
244
+ const message = optionalString(error?.message) ?? "Anthropic stream failed";
245
+ const options = {
246
+ message,
247
+ };
248
+ if (providerType !== undefined)
249
+ options.providerType = providerType;
250
+ if (requestId !== undefined)
251
+ options.requestId = requestId;
252
+ return new AnthropicStreamError(options);
253
+ }
254
+ function parseToolInput(input, index) {
255
+ try {
256
+ return requireObject(JSON.parse(input), `content block ${index} tool input`);
257
+ }
258
+ catch (error) {
259
+ if (error instanceof AnthropicProtocolError)
260
+ throw error;
261
+ throw new AnthropicProtocolError(`Anthropic emitted invalid tool input JSON at content block ${index}`, { cause: error });
262
+ }
263
+ }
264
+ function requireActiveMessage(started, stopped) {
265
+ if (!started) {
266
+ throw new AnthropicProtocolError("Anthropic emitted content before message_start");
267
+ }
268
+ if (stopped) {
269
+ throw new AnthropicProtocolError("Anthropic emitted content after message_stop");
270
+ }
271
+ }
272
+ function requirePendingBlock(blocks, index) {
273
+ const block = blocks.get(index);
274
+ if (!block) {
275
+ throw new AnthropicProtocolError(`Anthropic referenced unknown content block ${index}`);
276
+ }
277
+ if (block.stopped) {
278
+ throw new AnthropicProtocolError(`Anthropic emitted a delta after content block ${index} stopped`);
279
+ }
280
+ return block;
281
+ }
282
+ function mismatchedDelta(index, deltaType) {
283
+ return new AnthropicProtocolError(`Anthropic emitted ${deltaType} for incompatible content block ${index}`);
284
+ }
285
+ function requireRecord(value, name) {
286
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
287
+ throw new AnthropicProtocolError(`Anthropic ${name} must be an object`);
288
+ }
289
+ return value;
290
+ }
291
+ function requireObject(value, name) {
292
+ return requireRecord(value, name);
293
+ }
294
+ function optionalRecord(value) {
295
+ return typeof value === "object" && value !== null && !Array.isArray(value)
296
+ ? value
297
+ : undefined;
298
+ }
299
+ function requireString(value, name) {
300
+ if (typeof value !== "string") {
301
+ throw new AnthropicProtocolError(`Anthropic ${name} must be a string`);
302
+ }
303
+ return value;
304
+ }
305
+ function optionalString(value) {
306
+ return typeof value === "string" ? value : undefined;
307
+ }
308
+ function requireIndex(value) {
309
+ if (!Number.isSafeInteger(value) || value < 0) {
310
+ throw new AnthropicProtocolError("Anthropic content block index must be a non-negative safe integer");
311
+ }
312
+ return value;
313
+ }
314
+ function optionalTokenCount(value) {
315
+ if (value === undefined)
316
+ return undefined;
317
+ if (!Number.isSafeInteger(value) || value < 0)
318
+ throw new AnthropicProtocolError("Anthropic usage token count must be a non-negative safe integer");
319
+ return value;
320
+ }
321
+ function createUsage(inputTokens, outputTokens, cachedReadTokens, cachedWriteTokens, items) {
322
+ if (inputTokens === undefined && outputTokens === undefined && cachedReadTokens === undefined && cachedWriteTokens === undefined)
323
+ return undefined;
324
+ const usage = {};
325
+ if (inputTokens !== undefined)
326
+ usage.inputTokens = inputTokens;
327
+ if (outputTokens !== undefined)
328
+ usage.outputTokens = outputTokens;
329
+ if (cachedReadTokens !== undefined)
330
+ usage.cachedReadTokens = cachedReadTokens;
331
+ if (cachedWriteTokens !== undefined)
332
+ usage.cachedWriteTokens = cachedWriteTokens;
333
+ if (items.length > 0)
334
+ usage.items = items;
335
+ if (cachedReadTokens !== undefined || cachedWriteTokens !== undefined)
336
+ usage.tokenRelations = {
337
+ ...(cachedReadTokens === undefined ? {} : { cachedRead: "total" }),
338
+ ...(cachedWriteTokens === undefined ? {} : { cachedWrite: "total" }),
339
+ };
340
+ if (inputTokens !== undefined && outputTokens !== undefined) {
341
+ usage.totalTokens = inputTokens + outputTokens + (cachedReadTokens ?? 0) + (cachedWriteTokens ?? 0);
342
+ }
343
+ if (inputTokens === undefined || outputTokens === undefined)
344
+ usage.completeness = { status: "partial", reason: "provider-token-components-missing" };
345
+ return usage;
346
+ }
347
+ function collectUsageItems(usage, items) {
348
+ if (usage === undefined)
349
+ return;
350
+ const cache = usage.cache_creation === undefined || usage.cache_creation === null ? undefined : requireRecord(usage.cache_creation, "usage.cache_creation");
351
+ for (const [field, id] of [["ephemeral_5m_input_tokens", "cache-write-5m"], ["ephemeral_1h_input_tokens", "cache-write-1h"]]) {
352
+ const quantity = optionalTokenCount(cache?.[field]);
353
+ if (quantity !== undefined)
354
+ items.set(id, { id, quantity, unit: "tokens", includedIn: "cachedWrite" });
355
+ }
356
+ const server = usage.server_tool_use === undefined || usage.server_tool_use === null ? undefined : requireRecord(usage.server_tool_use, "usage.server_tool_use");
357
+ for (const [field, id] of [["web_search_requests", "web-search"], ["web_fetch_requests", "web-fetch"]]) {
358
+ const quantity = optionalTokenCount(server?.[field]);
359
+ if (quantity !== undefined)
360
+ items.set(id, { id, quantity, unit: "requests", includedIn: "none" });
361
+ }
362
+ }
363
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,36 @@
1
1
  {
2
2
  "name": "@sortedyuan/provider-anthropic",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.2.0",
4
+ "description": "Anthropic model adapter for May.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "!dist/.tsbuildinfo"
17
+ ],
18
+ "dependencies": {
19
+ "@sortedyuan/core": "0.2.0",
20
+ "@sortedyuan/provider-openai-compatible": "0.2.0"
21
+ },
22
+ "devDependencies": {
23
+ "@sortedyuan/config": "0.3.1"
24
+ },
25
+ "engines": {
26
+ "node": ">=22"
27
+ },
28
+ "license": "MIT",
29
+ "scripts": {
30
+ "build": "tsc -b",
31
+ "clean": "tsc -b --clean",
32
+ "test": "pnpm run build && node --test test/*.test.mjs",
33
+ "test:coverage": "pnpm run build && node --test --experimental-test-coverage test/*.test.mjs",
34
+ "test:integration": "pnpm --filter @sortedyuan/config run build && pnpm run build && node --test test-integration/*.test.mjs"
35
+ }
6
36
  }