@animalabs/membrane 0.3.1 → 0.3.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@animalabs/membrane",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "LLM middleware - a selective boundary that transforms what passes through",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,50 +0,0 @@
1
- /**
2
- * Anthropic Chat Adapter - Simple two-party conversation
3
- *
4
- * For standard Human/Assistant conversations without multi-user support.
5
- * - Strict participant validation (only configured human/assistant names allowed)
6
- * - No participant names in messages (pure user/assistant roles)
7
- * - Native Anthropic tool API
8
- *
9
- * Use AnthropicMultiuserAdapter for multi-party conversations.
10
- */
11
- import type { ProviderAdapter, ProviderRequest, ProviderRequestOptions, ProviderResponse, StreamCallbacks } from '../types/index.js';
12
- export interface AnthropicChatAdapterConfig {
13
- /** API key (defaults to ANTHROPIC_API_KEY env var) */
14
- apiKey?: string;
15
- /** Base URL override */
16
- baseURL?: string;
17
- /** Default max tokens */
18
- defaultMaxTokens?: number;
19
- /**
20
- * Human participant name (default: 'Human')
21
- * Messages with this participant become 'user' role.
22
- */
23
- humanParticipant?: string;
24
- /**
25
- * Assistant participant name (default: 'Claude')
26
- * Messages with this participant become 'assistant' role.
27
- */
28
- assistantParticipant?: string;
29
- }
30
- export declare class AnthropicChatAdapter implements ProviderAdapter {
31
- readonly name = "anthropic-chat";
32
- private client;
33
- private defaultMaxTokens;
34
- private humanParticipant;
35
- private assistantParticipant;
36
- constructor(config?: AnthropicChatAdapterConfig);
37
- supportsModel(modelId: string): boolean;
38
- complete(request: ProviderRequest, options?: ProviderRequestOptions): Promise<ProviderResponse>;
39
- stream(request: ProviderRequest, callbacks: StreamCallbacks, options?: ProviderRequestOptions): Promise<ProviderResponse>;
40
- /**
41
- * Convert normalized messages to Anthropic format.
42
- * Validates that only configured human/assistant participants are used.
43
- */
44
- private convertMessages;
45
- private buildRequest;
46
- private parseResponse;
47
- private handleError;
48
- private parseRetryAfter;
49
- }
50
- //# sourceMappingURL=anthropic-chat.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic-chat.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic-chat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EAEhB,MAAM,mBAAmB,CAAC;AAe3B,MAAM,WAAW,0BAA0B;IACzC,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,yBAAyB;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAMD,qBAAa,oBAAqB,YAAW,eAAe;IAC1D,QAAQ,CAAC,IAAI,oBAAoB;IACjC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,oBAAoB,CAAS;gBAEzB,MAAM,GAAE,0BAA+B;IAUnD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIjC,QAAQ,CACZ,OAAO,EAAE,eAAe,EACxB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,gBAAgB,CAAC;IAgBtB,MAAM,CACV,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,eAAe,EAC1B,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,gBAAgB,CAAC;IA4C5B;;;OAGG;IACH,OAAO,CAAC,eAAe;IA0BvB,OAAO,CAAC,YAAY;IAqDpB,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,WAAW;IAoCnB,OAAO,CAAC,eAAe;CAQxB"}
@@ -1,212 +0,0 @@
1
- /**
2
- * Anthropic Chat Adapter - Simple two-party conversation
3
- *
4
- * For standard Human/Assistant conversations without multi-user support.
5
- * - Strict participant validation (only configured human/assistant names allowed)
6
- * - No participant names in messages (pure user/assistant roles)
7
- * - Native Anthropic tool API
8
- *
9
- * Use AnthropicMultiuserAdapter for multi-party conversations.
10
- */
11
- import Anthropic from '@anthropic-ai/sdk';
12
- import { MembraneError, rateLimitError, contextLengthError, authError, serverError, abortError, } from '../types/index.js';
13
- import { toAnthropicContent, fromAnthropicContent } from './anthropic.js';
14
- // ============================================================================
15
- // Anthropic Chat Adapter
16
- // ============================================================================
17
- export class AnthropicChatAdapter {
18
- name = 'anthropic-chat';
19
- client;
20
- defaultMaxTokens;
21
- humanParticipant;
22
- assistantParticipant;
23
- constructor(config = {}) {
24
- this.client = new Anthropic({
25
- apiKey: config.apiKey,
26
- baseURL: config.baseURL,
27
- });
28
- this.defaultMaxTokens = config.defaultMaxTokens ?? 4096;
29
- this.humanParticipant = config.humanParticipant ?? 'Human';
30
- this.assistantParticipant = config.assistantParticipant ?? 'Claude';
31
- }
32
- supportsModel(modelId) {
33
- return modelId.startsWith('claude-');
34
- }
35
- async complete(request, options) {
36
- const anthropicRequest = this.buildRequest(request);
37
- const fullRequest = { ...anthropicRequest, stream: false };
38
- options?.onRequest?.(fullRequest);
39
- try {
40
- const response = await this.client.messages.create(fullRequest, {
41
- signal: options?.signal,
42
- });
43
- return this.parseResponse(response, fullRequest);
44
- }
45
- catch (error) {
46
- throw this.handleError(error, fullRequest);
47
- }
48
- }
49
- async stream(request, callbacks, options) {
50
- const anthropicRequest = this.buildRequest(request);
51
- const fullRequest = { ...anthropicRequest, stream: true };
52
- options?.onRequest?.(fullRequest);
53
- try {
54
- const stream = await this.client.messages.stream(anthropicRequest, {
55
- signal: options?.signal,
56
- });
57
- let accumulated = '';
58
- const contentBlocks = [];
59
- let currentBlockIndex = -1;
60
- for await (const event of stream) {
61
- if (event.type === 'content_block_start') {
62
- currentBlockIndex = event.index;
63
- contentBlocks[currentBlockIndex] = event.content_block;
64
- callbacks.onContentBlock?.(currentBlockIndex, event.content_block);
65
- }
66
- else if (event.type === 'content_block_delta') {
67
- if (event.delta.type === 'text_delta') {
68
- const chunk = event.delta.text;
69
- accumulated += chunk;
70
- callbacks.onChunk(chunk);
71
- }
72
- else if (event.delta.type === 'thinking_delta') {
73
- callbacks.onChunk(event.delta.thinking);
74
- }
75
- }
76
- else if (event.type === 'content_block_stop') {
77
- callbacks.onContentBlock?.(currentBlockIndex, contentBlocks[currentBlockIndex]);
78
- }
79
- }
80
- const finalMessage = await stream.finalMessage();
81
- return this.parseResponse(finalMessage, fullRequest);
82
- }
83
- catch (error) {
84
- throw this.handleError(error, fullRequest);
85
- }
86
- }
87
- // ============================================================================
88
- // Message Conversion
89
- // ============================================================================
90
- /**
91
- * Convert normalized messages to Anthropic format.
92
- * Validates that only configured human/assistant participants are used.
93
- */
94
- convertMessages(messages) {
95
- const result = [];
96
- for (const msg of messages) {
97
- // Validate participant
98
- if (msg.participant !== this.humanParticipant && msg.participant !== this.assistantParticipant) {
99
- throw new MembraneError({
100
- type: 'invalid_request',
101
- message: `AnthropicChatAdapter only supports two participants: "${this.humanParticipant}" and "${this.assistantParticipant}". ` +
102
- `Got: "${msg.participant}". Use AnthropicMultiuserAdapter for multi-party conversations.`,
103
- retryable: false,
104
- rawError: new Error(`Invalid participant: ${msg.participant}`),
105
- });
106
- }
107
- const role = msg.participant === this.humanParticipant ? 'user' : 'assistant';
108
- const content = toAnthropicContent(msg.content);
109
- result.push({ role, content });
110
- }
111
- return result;
112
- }
113
- buildRequest(request) {
114
- // Get normalized messages from extra (preferred) or fall back to provider messages
115
- const normalizedMessages = request.extra?.normalizedMessages;
116
- let messages;
117
- if (normalizedMessages) {
118
- messages = this.convertMessages(normalizedMessages);
119
- }
120
- else {
121
- // Assume already in provider format
122
- messages = request.messages;
123
- }
124
- const params = {
125
- model: request.model,
126
- max_tokens: request.maxTokens || this.defaultMaxTokens,
127
- messages,
128
- };
129
- // Handle system prompt
130
- if (request.system) {
131
- if (typeof request.system === 'string') {
132
- params.system = request.system;
133
- }
134
- else if (Array.isArray(request.system)) {
135
- params.system = request.system;
136
- }
137
- }
138
- if (request.temperature !== undefined) {
139
- params.temperature = request.temperature;
140
- }
141
- if (request.stopSequences && request.stopSequences.length > 0) {
142
- params.stop_sequences = request.stopSequences;
143
- }
144
- if (request.tools && request.tools.length > 0) {
145
- params.tools = request.tools;
146
- }
147
- // Handle extended thinking
148
- if (request.thinking) {
149
- params.thinking = request.thinking;
150
- }
151
- // Apply extra params (excluding normalizedMessages)
152
- if (request.extra) {
153
- const { normalizedMessages: _, ...rest } = request.extra;
154
- Object.assign(params, rest);
155
- }
156
- return params;
157
- }
158
- parseResponse(response, rawRequest) {
159
- return {
160
- content: fromAnthropicContent(response.content),
161
- stopReason: response.stop_reason ?? 'end_turn',
162
- stopSequence: response.stop_sequence ?? undefined,
163
- usage: {
164
- inputTokens: response.usage.input_tokens,
165
- outputTokens: response.usage.output_tokens,
166
- cacheCreationTokens: response.usage.cache_creation_input_tokens,
167
- cacheReadTokens: response.usage.cache_read_input_tokens,
168
- },
169
- model: response.model,
170
- rawRequest,
171
- raw: response,
172
- };
173
- }
174
- handleError(error, rawRequest) {
175
- if (error instanceof Anthropic.APIError) {
176
- const status = error.status;
177
- const message = error.message;
178
- if (status === 429) {
179
- const retryAfter = this.parseRetryAfter(error);
180
- return rateLimitError(message, retryAfter, error, rawRequest);
181
- }
182
- if (status === 401) {
183
- return authError(message, error, rawRequest);
184
- }
185
- if (message.includes('context') || message.includes('too long')) {
186
- return contextLengthError(message, error, rawRequest);
187
- }
188
- if (status >= 500) {
189
- return serverError(message, status, error, rawRequest);
190
- }
191
- }
192
- if (error instanceof Error && error.name === 'AbortError') {
193
- return abortError(undefined, rawRequest);
194
- }
195
- return new MembraneError({
196
- type: 'unknown',
197
- message: error instanceof Error ? error.message : String(error),
198
- retryable: false,
199
- rawError: error,
200
- rawRequest,
201
- });
202
- }
203
- parseRetryAfter(error) {
204
- const message = error.message;
205
- const match = message.match(/retry after (\d+)/i);
206
- if (match && match[1]) {
207
- return parseInt(match[1], 10) * 1000;
208
- }
209
- return undefined;
210
- }
211
- }
212
- //# sourceMappingURL=anthropic-chat.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic-chat.js","sourceRoot":"","sources":["../../src/providers/anthropic-chat.ts"],"names":[],"mappings":"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"}
@@ -1,64 +0,0 @@
1
- /**
2
- * Anthropic Multiuser Adapter - Multi-party conversation support
3
- *
4
- * For conversations with multiple participants (e.g., group chats, Discord).
5
- * - All non-bot participants map to 'user' role
6
- * - Bot participant maps to 'assistant' role
7
- * - Prefixes messages with participant names for context
8
- * - Native Anthropic tool API
9
- *
10
- * Use AnthropicChatAdapter for simple two-party Human/Assistant conversations.
11
- */
12
- import type { ProviderAdapter, ProviderRequest, ProviderRequestOptions, ProviderResponse, StreamCallbacks } from '../types/index.js';
13
- export interface AnthropicMultiuserAdapterConfig {
14
- /** API key (defaults to ANTHROPIC_API_KEY env var) */
15
- apiKey?: string;
16
- /** Base URL override */
17
- baseURL?: string;
18
- /** Default max tokens */
19
- defaultMaxTokens?: number;
20
- /**
21
- * Bot/assistant participant name (default: 'Claude')
22
- * Messages with this participant become 'assistant' role (no name prefix).
23
- */
24
- assistantParticipant?: string;
25
- /**
26
- * Whether to prefix user messages with participant names (default: true)
27
- * When true: "Alice: Hello there"
28
- * When false: "Hello there"
29
- */
30
- includeParticipantNames?: boolean;
31
- /**
32
- * Format for participant name prefix (default: '{name}: ')
33
- * Use {name} as placeholder for participant name.
34
- */
35
- nameFormat?: string;
36
- }
37
- export declare class AnthropicMultiuserAdapter implements ProviderAdapter {
38
- readonly name = "anthropic-multiuser";
39
- private client;
40
- private defaultMaxTokens;
41
- private assistantParticipant;
42
- private includeParticipantNames;
43
- private nameFormat;
44
- constructor(config?: AnthropicMultiuserAdapterConfig);
45
- supportsModel(modelId: string): boolean;
46
- complete(request: ProviderRequest, options?: ProviderRequestOptions): Promise<ProviderResponse>;
47
- stream(request: ProviderRequest, callbacks: StreamCallbacks, options?: ProviderRequestOptions): Promise<ProviderResponse>;
48
- /**
49
- * Convert normalized messages to Anthropic format.
50
- * - Bot messages become assistant role
51
- * - All other messages become user role with optional name prefix
52
- */
53
- private convertMessages;
54
- /**
55
- * Merge consecutive messages with the same role.
56
- * Anthropic API requires strictly alternating user/assistant messages.
57
- */
58
- private mergeConsecutiveRoles;
59
- private buildRequest;
60
- private parseResponse;
61
- private handleError;
62
- private parseRetryAfter;
63
- }
64
- //# sourceMappingURL=anthropic-multiuser.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic-multiuser.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic-multiuser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EAEhB,MAAM,mBAAmB,CAAC;AAe3B,MAAM,WAAW,+BAA+B;IAC9C,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,yBAAyB;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD,qBAAa,yBAA0B,YAAW,eAAe;IAC/D,QAAQ,CAAC,IAAI,yBAAyB;IACtC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,uBAAuB,CAAU;IACzC,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,GAAE,+BAAoC;IAWxD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIjC,QAAQ,CACZ,OAAO,EAAE,eAAe,EACxB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,gBAAgB,CAAC;IAgBtB,MAAM,CACV,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,eAAe,EAC1B,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,gBAAgB,CAAC;IA4C5B;;;;OAIG;IACH,OAAO,CAAC,eAAe;IA6EvB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IA2B7B,OAAO,CAAC,YAAY;IAqDpB,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,WAAW;IAoCnB,OAAO,CAAC,eAAe;CAQxB"}
@@ -1,297 +0,0 @@
1
- /**
2
- * Anthropic Multiuser Adapter - Multi-party conversation support
3
- *
4
- * For conversations with multiple participants (e.g., group chats, Discord).
5
- * - All non-bot participants map to 'user' role
6
- * - Bot participant maps to 'assistant' role
7
- * - Prefixes messages with participant names for context
8
- * - Native Anthropic tool API
9
- *
10
- * Use AnthropicChatAdapter for simple two-party Human/Assistant conversations.
11
- */
12
- import Anthropic from '@anthropic-ai/sdk';
13
- import { MembraneError, rateLimitError, contextLengthError, authError, serverError, abortError, } from '../types/index.js';
14
- import { fromAnthropicContent } from './anthropic.js';
15
- // ============================================================================
16
- // Anthropic Multiuser Adapter
17
- // ============================================================================
18
- export class AnthropicMultiuserAdapter {
19
- name = 'anthropic-multiuser';
20
- client;
21
- defaultMaxTokens;
22
- assistantParticipant;
23
- includeParticipantNames;
24
- nameFormat;
25
- constructor(config = {}) {
26
- this.client = new Anthropic({
27
- apiKey: config.apiKey,
28
- baseURL: config.baseURL,
29
- });
30
- this.defaultMaxTokens = config.defaultMaxTokens ?? 4096;
31
- this.assistantParticipant = config.assistantParticipant ?? 'Claude';
32
- this.includeParticipantNames = config.includeParticipantNames ?? true;
33
- this.nameFormat = config.nameFormat ?? '{name}: ';
34
- }
35
- supportsModel(modelId) {
36
- return modelId.startsWith('claude-');
37
- }
38
- async complete(request, options) {
39
- const anthropicRequest = this.buildRequest(request);
40
- const fullRequest = { ...anthropicRequest, stream: false };
41
- options?.onRequest?.(fullRequest);
42
- try {
43
- const response = await this.client.messages.create(fullRequest, {
44
- signal: options?.signal,
45
- });
46
- return this.parseResponse(response, fullRequest);
47
- }
48
- catch (error) {
49
- throw this.handleError(error, fullRequest);
50
- }
51
- }
52
- async stream(request, callbacks, options) {
53
- const anthropicRequest = this.buildRequest(request);
54
- const fullRequest = { ...anthropicRequest, stream: true };
55
- options?.onRequest?.(fullRequest);
56
- try {
57
- const stream = await this.client.messages.stream(anthropicRequest, {
58
- signal: options?.signal,
59
- });
60
- let accumulated = '';
61
- const contentBlocks = [];
62
- let currentBlockIndex = -1;
63
- for await (const event of stream) {
64
- if (event.type === 'content_block_start') {
65
- currentBlockIndex = event.index;
66
- contentBlocks[currentBlockIndex] = event.content_block;
67
- callbacks.onContentBlock?.(currentBlockIndex, event.content_block);
68
- }
69
- else if (event.type === 'content_block_delta') {
70
- if (event.delta.type === 'text_delta') {
71
- const chunk = event.delta.text;
72
- accumulated += chunk;
73
- callbacks.onChunk(chunk);
74
- }
75
- else if (event.delta.type === 'thinking_delta') {
76
- callbacks.onChunk(event.delta.thinking);
77
- }
78
- }
79
- else if (event.type === 'content_block_stop') {
80
- callbacks.onContentBlock?.(currentBlockIndex, contentBlocks[currentBlockIndex]);
81
- }
82
- }
83
- const finalMessage = await stream.finalMessage();
84
- return this.parseResponse(finalMessage, fullRequest);
85
- }
86
- catch (error) {
87
- throw this.handleError(error, fullRequest);
88
- }
89
- }
90
- // ============================================================================
91
- // Message Conversion
92
- // ============================================================================
93
- /**
94
- * Convert normalized messages to Anthropic format.
95
- * - Bot messages become assistant role
96
- * - All other messages become user role with optional name prefix
97
- */
98
- convertMessages(messages) {
99
- const result = [];
100
- for (const msg of messages) {
101
- const isAssistant = msg.participant === this.assistantParticipant;
102
- const role = isAssistant ? 'assistant' : 'user';
103
- // Convert content blocks
104
- const content = [];
105
- for (const block of msg.content) {
106
- if (block.type === 'text') {
107
- let text = block.text;
108
- // Prefix with participant name for non-assistant messages
109
- if (!isAssistant && this.includeParticipantNames) {
110
- const prefix = this.nameFormat.replace('{name}', msg.participant);
111
- text = prefix + text;
112
- }
113
- const textBlock = { type: 'text', text };
114
- if (block.cache_control) {
115
- textBlock.cache_control = block.cache_control;
116
- }
117
- content.push(textBlock);
118
- }
119
- else if (block.type === 'image' && block.source.type === 'base64') {
120
- content.push({
121
- type: 'image',
122
- source: {
123
- type: 'base64',
124
- media_type: block.source.mediaType,
125
- data: block.source.data,
126
- },
127
- });
128
- }
129
- else if (block.type === 'document') {
130
- content.push({
131
- type: 'document',
132
- source: {
133
- type: 'base64',
134
- media_type: block.source.mediaType,
135
- data: block.source.data,
136
- },
137
- });
138
- }
139
- else if (block.type === 'tool_use') {
140
- content.push({
141
- type: 'tool_use',
142
- id: block.id,
143
- name: block.name,
144
- input: block.input,
145
- });
146
- }
147
- else if (block.type === 'tool_result') {
148
- content.push({
149
- type: 'tool_result',
150
- tool_use_id: block.toolUseId,
151
- content: typeof block.content === 'string'
152
- ? block.content
153
- : JSON.stringify(block.content),
154
- is_error: block.isError,
155
- });
156
- }
157
- else if (block.type === 'thinking') {
158
- content.push({
159
- type: 'thinking',
160
- thinking: block.thinking,
161
- });
162
- }
163
- }
164
- result.push({ role, content });
165
- }
166
- // Anthropic requires alternating user/assistant messages
167
- // Merge consecutive same-role messages
168
- return this.mergeConsecutiveRoles(result);
169
- }
170
- /**
171
- * Merge consecutive messages with the same role.
172
- * Anthropic API requires strictly alternating user/assistant messages.
173
- */
174
- mergeConsecutiveRoles(messages) {
175
- if (messages.length === 0)
176
- return [];
177
- const merged = [];
178
- let current = messages[0];
179
- for (let i = 1; i < messages.length; i++) {
180
- const next = messages[i];
181
- if (next.role === current.role) {
182
- // Merge content arrays
183
- const currentContent = Array.isArray(current.content) ? current.content : [{ type: 'text', text: current.content }];
184
- const nextContent = Array.isArray(next.content) ? next.content : [{ type: 'text', text: next.content }];
185
- current = {
186
- role: current.role,
187
- content: [...currentContent, ...nextContent],
188
- };
189
- }
190
- else {
191
- merged.push(current);
192
- current = next;
193
- }
194
- }
195
- merged.push(current);
196
- return merged;
197
- }
198
- buildRequest(request) {
199
- // Get normalized messages from extra (preferred) or fall back to provider messages
200
- const normalizedMessages = request.extra?.normalizedMessages;
201
- let messages;
202
- if (normalizedMessages) {
203
- messages = this.convertMessages(normalizedMessages);
204
- }
205
- else {
206
- // Assume already in provider format
207
- messages = request.messages;
208
- }
209
- const params = {
210
- model: request.model,
211
- max_tokens: request.maxTokens || this.defaultMaxTokens,
212
- messages,
213
- };
214
- // Handle system prompt
215
- if (request.system) {
216
- if (typeof request.system === 'string') {
217
- params.system = request.system;
218
- }
219
- else if (Array.isArray(request.system)) {
220
- params.system = request.system;
221
- }
222
- }
223
- if (request.temperature !== undefined) {
224
- params.temperature = request.temperature;
225
- }
226
- if (request.stopSequences && request.stopSequences.length > 0) {
227
- params.stop_sequences = request.stopSequences;
228
- }
229
- if (request.tools && request.tools.length > 0) {
230
- params.tools = request.tools;
231
- }
232
- // Handle extended thinking
233
- if (request.thinking) {
234
- params.thinking = request.thinking;
235
- }
236
- // Apply extra params (excluding normalizedMessages)
237
- if (request.extra) {
238
- const { normalizedMessages: _, ...rest } = request.extra;
239
- Object.assign(params, rest);
240
- }
241
- return params;
242
- }
243
- parseResponse(response, rawRequest) {
244
- return {
245
- content: fromAnthropicContent(response.content),
246
- stopReason: response.stop_reason ?? 'end_turn',
247
- stopSequence: response.stop_sequence ?? undefined,
248
- usage: {
249
- inputTokens: response.usage.input_tokens,
250
- outputTokens: response.usage.output_tokens,
251
- cacheCreationTokens: response.usage.cache_creation_input_tokens,
252
- cacheReadTokens: response.usage.cache_read_input_tokens,
253
- },
254
- model: response.model,
255
- rawRequest,
256
- raw: response,
257
- };
258
- }
259
- handleError(error, rawRequest) {
260
- if (error instanceof Anthropic.APIError) {
261
- const status = error.status;
262
- const message = error.message;
263
- if (status === 429) {
264
- const retryAfter = this.parseRetryAfter(error);
265
- return rateLimitError(message, retryAfter, error, rawRequest);
266
- }
267
- if (status === 401) {
268
- return authError(message, error, rawRequest);
269
- }
270
- if (message.includes('context') || message.includes('too long')) {
271
- return contextLengthError(message, error, rawRequest);
272
- }
273
- if (status >= 500) {
274
- return serverError(message, status, error, rawRequest);
275
- }
276
- }
277
- if (error instanceof Error && error.name === 'AbortError') {
278
- return abortError(undefined, rawRequest);
279
- }
280
- return new MembraneError({
281
- type: 'unknown',
282
- message: error instanceof Error ? error.message : String(error),
283
- retryable: false,
284
- rawError: error,
285
- rawRequest,
286
- });
287
- }
288
- parseRetryAfter(error) {
289
- const message = error.message;
290
- const match = message.match(/retry after (\d+)/i);
291
- if (match && match[1]) {
292
- return parseInt(match[1], 10) * 1000;
293
- }
294
- return undefined;
295
- }
296
- }
297
- //# sourceMappingURL=anthropic-multiuser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic-multiuser.js","sourceRoot":"","sources":["../../src/providers/anthropic-multiuser.ts"],"names":[],"mappings":"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"}