@animalabs/membrane 0.5.50 → 0.5.52

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.
Files changed (123) hide show
  1. package/dist/context/index.d.ts +12 -0
  2. package/dist/context/index.js +11 -0
  3. package/dist/context/index.js.map +1 -0
  4. package/dist/context/process.d.ts +43 -0
  5. package/dist/context/process.js +381 -0
  6. package/dist/context/process.js.map +1 -0
  7. package/dist/context/types.d.ts +164 -0
  8. package/dist/context/types.js +61 -0
  9. package/dist/context/types.js.map +1 -0
  10. package/dist/formatters/anthropic-xml.d.ts +63 -0
  11. package/dist/formatters/anthropic-xml.js +417 -0
  12. package/dist/formatters/anthropic-xml.js.map +1 -0
  13. package/dist/formatters/completions.d.ts +68 -0
  14. package/dist/formatters/completions.js +261 -0
  15. package/dist/formatters/completions.js.map +1 -0
  16. package/dist/formatters/index.d.ts +8 -0
  17. package/dist/formatters/index.js +7 -0
  18. package/dist/formatters/index.js.map +1 -0
  19. package/dist/formatters/native.d.ts +35 -0
  20. package/dist/formatters/native.js +336 -0
  21. package/dist/formatters/native.js.map +1 -0
  22. package/dist/formatters/types.d.ts +167 -0
  23. package/dist/formatters/types.js +7 -0
  24. package/dist/formatters/types.js.map +1 -0
  25. package/dist/index.d.ts +13 -0
  26. package/dist/index.js +20 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/membrane.d.ts +155 -0
  29. package/dist/providers/anthropic.d.ts +36 -0
  30. package/dist/providers/bedrock.d.ts +43 -0
  31. package/dist/providers/gemini.d.ts +68 -0
  32. package/dist/providers/gemini.js +538 -0
  33. package/dist/providers/gemini.js.map +1 -0
  34. package/dist/providers/index.d.ts +13 -0
  35. package/dist/providers/index.js +13 -0
  36. package/dist/providers/index.js.map +1 -0
  37. package/dist/providers/mock.d.ts +90 -0
  38. package/dist/providers/mock.d.ts.map +1 -0
  39. package/dist/providers/mock.js +210 -0
  40. package/dist/providers/mock.js.map +1 -0
  41. package/dist/providers/openai-compatible.d.ts +82 -0
  42. package/dist/providers/openai-compatible.js +480 -0
  43. package/dist/providers/openai-compatible.js.map +1 -0
  44. package/dist/providers/openai-completions.d.ts +89 -0
  45. package/dist/providers/openai-completions.js +347 -0
  46. package/dist/providers/openai-completions.js.map +1 -0
  47. package/dist/providers/openai-responses.d.ts +77 -0
  48. package/dist/providers/openai-responses.js +333 -0
  49. package/dist/providers/openai-responses.js.map +1 -0
  50. package/dist/providers/openai.d.ts +77 -0
  51. package/dist/providers/openai.js +533 -0
  52. package/dist/providers/openai.js.map +1 -0
  53. package/dist/providers/openrouter.d.ts +82 -0
  54. package/dist/providers/openrouter.js +556 -0
  55. package/dist/providers/openrouter.js.map +1 -0
  56. package/dist/providers/utils.d.ts +44 -0
  57. package/dist/providers/utils.d.ts.map +1 -0
  58. package/dist/providers/utils.js +100 -0
  59. package/dist/providers/utils.js.map +1 -0
  60. package/dist/registry/default-pricing.d.ts +3 -0
  61. package/dist/registry/default-pricing.d.ts.map +1 -0
  62. package/dist/registry/default-pricing.js +75 -0
  63. package/dist/registry/default-pricing.js.map +1 -0
  64. package/dist/transforms/chat.d.ts +52 -0
  65. package/dist/transforms/chat.js +136 -0
  66. package/dist/transforms/chat.js.map +1 -0
  67. package/dist/transforms/index.d.ts +5 -0
  68. package/dist/transforms/index.js +7 -0
  69. package/dist/transforms/index.js.map +1 -0
  70. package/dist/types/config.d.ts +110 -0
  71. package/dist/types/config.js +21 -0
  72. package/dist/types/config.js.map +1 -0
  73. package/dist/types/content.d.ts +87 -0
  74. package/dist/types/content.d.ts.map +1 -0
  75. package/dist/types/content.js +40 -0
  76. package/dist/types/content.js.map +1 -0
  77. package/dist/types/errors.d.ts +50 -0
  78. package/dist/types/errors.d.ts.map +1 -0
  79. package/dist/types/errors.js +253 -0
  80. package/dist/types/errors.js.map +1 -0
  81. package/dist/types/index.d.ts +20 -0
  82. package/dist/types/index.js +10 -0
  83. package/dist/types/index.js.map +1 -0
  84. package/dist/types/message.d.ts +52 -0
  85. package/dist/types/message.d.ts.map +1 -0
  86. package/dist/types/message.js +38 -0
  87. package/dist/types/message.js.map +1 -0
  88. package/dist/types/provider.d.ts +169 -0
  89. package/dist/types/provider.d.ts.map +1 -0
  90. package/dist/types/provider.js +5 -0
  91. package/dist/types/provider.js.map +1 -0
  92. package/dist/types/request.d.ts +116 -0
  93. package/dist/types/request.d.ts.map +1 -0
  94. package/dist/types/request.js +5 -0
  95. package/dist/types/request.js.map +1 -0
  96. package/dist/types/response.d.ts +131 -0
  97. package/dist/types/response.d.ts.map +1 -0
  98. package/dist/types/response.js +7 -0
  99. package/dist/types/response.js.map +1 -0
  100. package/dist/types/streaming.d.ts +194 -0
  101. package/dist/types/streaming.js +5 -0
  102. package/dist/types/streaming.js.map +1 -0
  103. package/dist/types/tools.d.ts +71 -0
  104. package/dist/types/tools.d.ts.map +1 -0
  105. package/dist/types/tools.js +5 -0
  106. package/dist/types/tools.js.map +1 -0
  107. package/dist/utils/cost.d.ts +10 -0
  108. package/dist/utils/cost.d.ts.map +1 -0
  109. package/dist/utils/cost.js +19 -0
  110. package/dist/utils/cost.js.map +1 -0
  111. package/dist/utils/index.d.ts +7 -0
  112. package/dist/utils/index.js +6 -0
  113. package/dist/utils/index.js.map +1 -0
  114. package/dist/utils/stream-parser.d.ts +84 -0
  115. package/dist/utils/stream-parser.js +418 -0
  116. package/dist/utils/stream-parser.js.map +1 -0
  117. package/dist/utils/tool-parser.d.ts +134 -0
  118. package/dist/utils/tool-parser.js +600 -0
  119. package/dist/utils/tool-parser.js.map +1 -0
  120. package/dist/yielding-stream.d.ts +60 -0
  121. package/dist/yielding-stream.js +206 -0
  122. package/dist/yielding-stream.js.map +1 -0
  123. package/package.json +1 -1
@@ -0,0 +1,347 @@
1
+ /**
2
+ * OpenAI-Compatible Completions adapter for base models
3
+ *
4
+ * For true base/completion models that use the `/v1/completions` endpoint:
5
+ * - No chat formatting built-in
6
+ * - Single text prompt input
7
+ * - Raw completion output
8
+ * - No image support
9
+ *
10
+ * Serializes conversations to Human:/Assistant: format.
11
+ */
12
+ import { MembraneError, rateLimitError, contextLengthError, authError, serverError, abortError, networkError, } from '../types/index.js';
13
+ import { createCombinedSignal, SSELineParser } from './utils.js';
14
+ // ============================================================================
15
+ // OpenAI Completions Adapter
16
+ // ============================================================================
17
+ export class OpenAICompletionsAdapter {
18
+ name;
19
+ baseURL;
20
+ apiKey;
21
+ defaultMaxTokens;
22
+ extraHeaders;
23
+ assistantName;
24
+ eotToken;
25
+ extraStopSequences;
26
+ warnOnImageStrip;
27
+ constructor(config) {
28
+ if (!config.baseURL) {
29
+ throw new Error('OpenAI completions adapter requires baseURL');
30
+ }
31
+ this.name = config.providerName ?? 'openai-completions';
32
+ this.baseURL = config.baseURL.replace(/\/$/, ''); // Remove trailing slash
33
+ this.apiKey = config.apiKey ?? '';
34
+ this.defaultMaxTokens = config.defaultMaxTokens ?? 4096;
35
+ this.extraHeaders = config.extraHeaders ?? {};
36
+ this.assistantName = config.assistantName ?? 'Assistant';
37
+ this.eotToken = config.eotToken === null ? '' : (config.eotToken ?? '<|eot|>');
38
+ this.extraStopSequences = config.extraStopSequences ?? [];
39
+ this.warnOnImageStrip = config.warnOnImageStrip ?? true;
40
+ }
41
+ supportsModel(_modelId) {
42
+ return true;
43
+ }
44
+ async complete(request, options) {
45
+ const completionsRequest = this.buildRequest(request);
46
+ options?.onRequest?.(completionsRequest);
47
+ try {
48
+ const response = await this.makeRequest(completionsRequest, options);
49
+ return this.parseResponse(response, request.model, completionsRequest);
50
+ }
51
+ catch (error) {
52
+ throw this.handleError(error, completionsRequest);
53
+ }
54
+ }
55
+ async stream(request, callbacks, options) {
56
+ const completionsRequest = this.buildRequest(request);
57
+ completionsRequest.stream = true;
58
+ options?.onRequest?.(completionsRequest);
59
+ const { signal: combinedSignal, cleanup } = createCombinedSignal(options?.signal, options?.timeoutMs);
60
+ try {
61
+ const response = await fetch(`${this.baseURL}/completions`, {
62
+ method: 'POST',
63
+ headers: this.getHeaders(),
64
+ body: JSON.stringify(completionsRequest),
65
+ signal: combinedSignal,
66
+ });
67
+ if (!response.ok) {
68
+ const errorText = await response.text();
69
+ throw new Error(`API error: ${response.status} ${errorText}`);
70
+ }
71
+ const reader = response.body?.getReader();
72
+ if (!reader) {
73
+ throw new Error('No response body');
74
+ }
75
+ const decoder = new TextDecoder();
76
+ const sseParser = new SSELineParser();
77
+ let accumulated = '';
78
+ let finishReason = 'stop';
79
+ while (true) {
80
+ const { done, value } = await reader.read();
81
+ if (done)
82
+ break;
83
+ const chunk = decoder.decode(value, { stream: true });
84
+ const dataLines = sseParser.feed(chunk);
85
+ for (const data of dataLines) {
86
+ if (data === '[DONE]')
87
+ continue;
88
+ try {
89
+ const parsed = JSON.parse(data);
90
+ const text = parsed.choices?.[0]?.text;
91
+ if (text) {
92
+ accumulated += text;
93
+ callbacks.onChunk(text);
94
+ }
95
+ if (parsed.choices?.[0]?.finish_reason) {
96
+ finishReason = parsed.choices[0].finish_reason;
97
+ }
98
+ }
99
+ catch {
100
+ // Ignore parse errors in stream
101
+ }
102
+ }
103
+ }
104
+ return this.buildStreamedResponse(accumulated, finishReason, request.model, completionsRequest);
105
+ }
106
+ catch (error) {
107
+ throw this.handleError(error, completionsRequest);
108
+ }
109
+ finally {
110
+ cleanup?.();
111
+ }
112
+ }
113
+ // ============================================================================
114
+ // Prompt Serialization
115
+ // ============================================================================
116
+ /**
117
+ * Serialize messages to "Participant: content<eot>" format for base models.
118
+ * Uses actual participant names from messages.
119
+ * Images are stripped from content.
120
+ */
121
+ serializeToPrompt(messages) {
122
+ const parts = [];
123
+ const participants = new Set();
124
+ let hasStrippedImages = false;
125
+ for (const msg of messages) {
126
+ // Get participant name (supports both 'participant' and 'role' fields)
127
+ const participant = msg.participant || msg.role || 'Unknown';
128
+ participants.add(participant);
129
+ // Extract text content, strip images
130
+ const textContent = this.extractTextContent(msg.content);
131
+ if (textContent.hadImages) {
132
+ hasStrippedImages = true;
133
+ }
134
+ if (textContent.text) {
135
+ // Append EOT token after content (on same line)
136
+ const eot = this.eotToken;
137
+ parts.push(`${participant}: ${textContent.text}${eot}`);
138
+ }
139
+ }
140
+ if (hasStrippedImages && this.warnOnImageStrip) {
141
+ console.warn('[OpenAICompletionsAdapter] Images were stripped from context (not supported in completions mode)');
142
+ }
143
+ // Add final assistant prefix to prompt completion (no EOT - model generates this)
144
+ parts.push(`${this.assistantName}:`);
145
+ return {
146
+ prompt: parts.join('\n\n'),
147
+ participants,
148
+ };
149
+ }
150
+ /**
151
+ * Generate stop sequences from participant names.
152
+ * Prevents the model from generating turns for other participants.
153
+ */
154
+ generateStopSequences(participants) {
155
+ const stops = [];
156
+ for (const participant of participants) {
157
+ // Skip the assistant - we don't want to stop on its own name
158
+ if (participant === this.assistantName)
159
+ continue;
160
+ // Add both "\n\nName:" and "\nName:" variants
161
+ stops.push(`\n\n${participant}:`);
162
+ stops.push(`\n${participant}:`);
163
+ }
164
+ return stops;
165
+ }
166
+ extractTextContent(content) {
167
+ if (typeof content === 'string') {
168
+ return { text: content, hadImages: false };
169
+ }
170
+ if (Array.isArray(content)) {
171
+ const textParts = [];
172
+ let hadImages = false;
173
+ for (const block of content) {
174
+ if (block.type === 'text') {
175
+ textParts.push(block.text);
176
+ }
177
+ else if (block.type === 'image' || block.type === 'image_url') {
178
+ hadImages = true;
179
+ }
180
+ // Skip tool_use, tool_result, thinking blocks for base models
181
+ }
182
+ return { text: textParts.join('\n'), hadImages };
183
+ }
184
+ return { text: '', hadImages: false };
185
+ }
186
+ // ============================================================================
187
+ // Private Methods
188
+ // ============================================================================
189
+ getHeaders() {
190
+ const headers = {
191
+ 'Content-Type': 'application/json',
192
+ ...this.extraHeaders,
193
+ };
194
+ if (this.apiKey) {
195
+ headers['Authorization'] = `Bearer ${this.apiKey}`;
196
+ }
197
+ return headers;
198
+ }
199
+ buildRequest(request) {
200
+ let prompt;
201
+ let stopSequences;
202
+ if (typeof request.extra?.prompt === 'string') {
203
+ // Continuation path: prompt is already serialized, skip re-serialization.
204
+ // No participant-based stops or eotToken — the prompt already contains them.
205
+ prompt = request.extra.prompt;
206
+ stopSequences = [
207
+ ...this.extraStopSequences,
208
+ ...(request.stopSequences || []),
209
+ ];
210
+ }
211
+ else {
212
+ // Normal path: serialize messages into prompt format
213
+ const messages = request.extra?.normalizedMessages || request.messages;
214
+ const result = this.serializeToPrompt(messages);
215
+ prompt = result.prompt;
216
+ stopSequences = [
217
+ ...this.generateStopSequences(result.participants),
218
+ ...(this.eotToken ? [this.eotToken] : []),
219
+ ...this.extraStopSequences,
220
+ ...(request.stopSequences || []),
221
+ ];
222
+ }
223
+ const params = {
224
+ model: request.model,
225
+ prompt,
226
+ max_tokens: request.maxTokens || this.defaultMaxTokens,
227
+ };
228
+ if (request.temperature !== undefined) {
229
+ params.temperature = request.temperature;
230
+ }
231
+ if (request.topP !== undefined) {
232
+ params.top_p = request.topP;
233
+ }
234
+ if (request.presencePenalty !== undefined) {
235
+ params.presence_penalty = request.presencePenalty;
236
+ }
237
+ if (request.frequencyPenalty !== undefined) {
238
+ params.frequency_penalty = request.frequencyPenalty;
239
+ }
240
+ if (stopSequences.length > 0) {
241
+ params.stop = stopSequences;
242
+ }
243
+ // Apply extra params (but not messages/tools/normalizedMessages/prompt which don't apply)
244
+ if (request.extra) {
245
+ const { messages, tools, normalizedMessages, prompt, ...rest } = request.extra;
246
+ Object.assign(params, rest);
247
+ }
248
+ return params;
249
+ }
250
+ async makeRequest(request, options) {
251
+ const { signal: combinedSignal, cleanup } = createCombinedSignal(options?.signal, options?.timeoutMs);
252
+ try {
253
+ const response = await fetch(`${this.baseURL}/completions`, {
254
+ method: 'POST',
255
+ headers: this.getHeaders(),
256
+ body: JSON.stringify(request),
257
+ signal: combinedSignal,
258
+ });
259
+ if (!response.ok) {
260
+ const errorText = await response.text();
261
+ throw new Error(`API error: ${response.status} ${errorText}`);
262
+ }
263
+ return await response.json();
264
+ }
265
+ finally {
266
+ cleanup?.();
267
+ }
268
+ }
269
+ parseResponse(response, requestedModel, rawRequest) {
270
+ const choice = response.choices[0];
271
+ const text = choice?.text ?? '';
272
+ return {
273
+ content: this.textToContent(text),
274
+ stopReason: this.mapFinishReason(choice?.finish_reason),
275
+ stopSequence: undefined,
276
+ usage: {
277
+ inputTokens: response.usage?.prompt_tokens ?? 0,
278
+ outputTokens: response.usage?.completion_tokens ?? 0,
279
+ },
280
+ model: response.model ?? requestedModel,
281
+ rawRequest,
282
+ raw: response,
283
+ };
284
+ }
285
+ buildStreamedResponse(accumulated, finishReason, requestedModel, rawRequest) {
286
+ return {
287
+ content: this.textToContent(accumulated),
288
+ stopReason: this.mapFinishReason(finishReason),
289
+ stopSequence: undefined,
290
+ usage: {
291
+ inputTokens: 0, // Not available in streaming
292
+ outputTokens: 0,
293
+ },
294
+ model: requestedModel,
295
+ rawRequest,
296
+ raw: { text: accumulated, finish_reason: finishReason },
297
+ };
298
+ }
299
+ textToContent(text) {
300
+ // Trim leading whitespace (model often starts with space after "Assistant:")
301
+ const trimmed = text.replace(/^\s+/, '');
302
+ if (!trimmed)
303
+ return [];
304
+ return [{ type: 'text', text: trimmed }];
305
+ }
306
+ mapFinishReason(reason) {
307
+ switch (reason) {
308
+ case 'stop':
309
+ return 'end_turn';
310
+ case 'length':
311
+ return 'max_tokens';
312
+ default:
313
+ return 'end_turn';
314
+ }
315
+ }
316
+ handleError(error, rawRequest) {
317
+ if (error instanceof Error) {
318
+ const message = error.message;
319
+ if (message.includes('429') || message.includes('rate')) {
320
+ return rateLimitError(message, undefined, error, rawRequest);
321
+ }
322
+ if (message.includes('401') || message.includes('auth') || message.includes('Unauthorized')) {
323
+ return authError(message, error, rawRequest);
324
+ }
325
+ if (message.includes('context') || message.includes('too long') || message.includes('maximum context')) {
326
+ return contextLengthError(message, error, rawRequest);
327
+ }
328
+ if (message.includes('500') || message.includes('502') || message.includes('503')) {
329
+ return serverError(message, undefined, error, rawRequest);
330
+ }
331
+ if (error.name === 'AbortError') {
332
+ return abortError(undefined, rawRequest);
333
+ }
334
+ if (message.includes('network') || message.includes('fetch') || message.includes('ECONNREFUSED')) {
335
+ return networkError(message, error, rawRequest);
336
+ }
337
+ }
338
+ return new MembraneError({
339
+ type: 'unknown',
340
+ message: error instanceof Error ? error.message : String(error),
341
+ retryable: false,
342
+ rawError: error,
343
+ rawRequest,
344
+ });
345
+ }
346
+ }
347
+ //# sourceMappingURL=openai-completions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-completions.js","sourceRoot":"","sources":["../../src/providers/openai-completions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * OpenAI Images API provider adapter
3
+ *
4
+ * Adapter for OpenAI's Images API endpoints, used for image generation
5
+ * models like `gpt-image-1`:
6
+ *
7
+ * - `/v1/images/generations` — text-to-image (no image input)
8
+ * - `/v1/images/edits` — image editing (accepts input images + prompt)
9
+ *
10
+ * The adapter automatically selects the right endpoint:
11
+ * - If conversation contains images → uses /edits with images as data URLs
12
+ * - If text-only → uses /generations
13
+ *
14
+ * Both endpoints:
15
+ * - Take a single `prompt` string (not conversation messages)
16
+ * - Return base64-encoded images in `data[].b64_json`
17
+ * - No streaming support (returns complete image)
18
+ * - Support `size`, `quality`, `n`, `background`, `output_format`
19
+ *
20
+ * Note: File retains the name openai-responses.ts and class name
21
+ * OpenAIResponsesAdapter for compatibility with existing factory
22
+ * routing and vendor configs (`openairesponses-*` prefix).
23
+ */
24
+ import type { ProviderAdapter, ProviderRequest, ProviderRequestOptions, ProviderResponse, StreamCallbacks } from '../types/index.js';
25
+ export interface OpenAIResponsesAdapterConfig {
26
+ /** API key (defaults to OPENAI_API_KEY env var) */
27
+ apiKey?: string;
28
+ /** Base URL (default: https://api.openai.com/v1) */
29
+ baseURL?: string;
30
+ /** Organization ID (optional) */
31
+ organization?: string;
32
+ /** Default max output tokens (unused by Images API, kept for interface compat) */
33
+ defaultMaxTokens?: number;
34
+ /**
35
+ * Whether to allow image editing via /v1/images/edits when images
36
+ * are present in the conversation context. When true (default),
37
+ * the adapter auto-detects images and routes to the edits endpoint.
38
+ * When false, always uses /v1/images/generations (text-only).
39
+ */
40
+ allowImageEditing?: boolean;
41
+ }
42
+ export declare class OpenAIResponsesAdapter implements ProviderAdapter {
43
+ readonly name = "openai-responses";
44
+ private apiKey;
45
+ private baseURL;
46
+ private organization?;
47
+ private allowImageEditing;
48
+ constructor(config?: OpenAIResponsesAdapterConfig);
49
+ supportsModel(modelId: string): boolean;
50
+ complete(request: ProviderRequest, options?: ProviderRequestOptions): Promise<ProviderResponse>;
51
+ stream(request: ProviderRequest, callbacks: StreamCallbacks, options?: ProviderRequestOptions): Promise<ProviderResponse>;
52
+ private getHeaders;
53
+ /**
54
+ * Extract base64 images from conversation messages as data URLs.
55
+ * Used to determine whether to use /edits (with images) or /generations.
56
+ * Returns up to 16 images (OpenAI limit for /v1/images/edits).
57
+ */
58
+ private extractImages;
59
+ /**
60
+ * Convert a base64 data URL to a Buffer + mimeType for file upload.
61
+ */
62
+ private dataUrlToBuffer;
63
+ private buildRequest;
64
+ /**
65
+ * Flatten conversation messages into a single prompt string.
66
+ *
67
+ * The Images API takes a single text prompt, not a conversation.
68
+ * We include the system prompt as context and concatenate all
69
+ * message text with role labels so the model understands the
70
+ * full conversation when deciding what image to generate.
71
+ */
72
+ private flattenToPrompt;
73
+ private parseResponse;
74
+ private buildContentBlocks;
75
+ private handleError;
76
+ }
77
+ //# sourceMappingURL=openai-responses.d.ts.map