ai.matey.frontend 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 +21 -0
- package/dist/cjs/adapters/anthropic.js +328 -0
- package/dist/cjs/adapters/anthropic.js.map +1 -0
- package/dist/cjs/adapters/chrome-ai.js +55 -0
- package/dist/cjs/adapters/chrome-ai.js.map +1 -0
- package/dist/cjs/adapters/gemini.js +95 -0
- package/dist/cjs/adapters/gemini.js.map +1 -0
- package/dist/cjs/adapters/generic.js +165 -0
- package/dist/cjs/adapters/generic.js.map +1 -0
- package/dist/cjs/adapters/mistral.js +87 -0
- package/dist/cjs/adapters/mistral.js.map +1 -0
- package/dist/cjs/adapters/ollama.js +73 -0
- package/dist/cjs/adapters/ollama.js.map +1 -0
- package/dist/cjs/adapters/openai.js +287 -0
- package/dist/cjs/adapters/openai.js.map +1 -0
- package/dist/cjs/index.js +34 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/esm/adapters/anthropic.js +324 -0
- package/dist/esm/adapters/anthropic.js.map +1 -0
- package/dist/esm/adapters/chrome-ai.js +51 -0
- package/dist/esm/adapters/chrome-ai.js.map +1 -0
- package/dist/esm/adapters/gemini.js +91 -0
- package/dist/esm/adapters/gemini.js.map +1 -0
- package/dist/esm/adapters/generic.js +160 -0
- package/dist/esm/adapters/generic.js.map +1 -0
- package/dist/esm/adapters/mistral.js +83 -0
- package/dist/esm/adapters/mistral.js.map +1 -0
- package/dist/esm/adapters/ollama.js +69 -0
- package/dist/esm/adapters/ollama.js.map +1 -0
- package/dist/esm/adapters/openai.js +283 -0
- package/dist/esm/adapters/openai.js.map +1 -0
- package/dist/esm/index.js +18 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/types/adapters/anthropic.d.ts +149 -0
- package/dist/types/adapters/anthropic.d.ts.map +1 -0
- package/dist/types/adapters/chrome-ai.d.ts +25 -0
- package/dist/types/adapters/chrome-ai.d.ts.map +1 -0
- package/dist/types/adapters/gemini.d.ts +55 -0
- package/dist/types/adapters/gemini.d.ts.map +1 -0
- package/dist/types/adapters/generic.d.ts +122 -0
- package/dist/types/adapters/generic.d.ts.map +1 -0
- package/dist/types/adapters/mistral.d.ts +47 -0
- package/dist/types/adapters/mistral.d.ts.map +1 -0
- package/dist/types/adapters/ollama.d.ts +44 -0
- package/dist/types/adapters/ollama.d.ts.map +1 -0
- package/dist/types/adapters/openai.d.ts +116 -0
- package/dist/types/adapters/openai.d.ts.map +1 -0
- package/dist/types/index.d.ts +17 -0
- package/dist/types/index.d.ts.map +1 -0
- package/package.json +144 -0
- package/readme.md +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;AAEH,oBAAoB;AACpB,uDAAqC;AACrC,0DAAwC;AACxC,uDAAqC;AACrC,wDAAsC;AACtC,uDAAqC;AACrC,0DAAwC;AACxC,wDAAsC"}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic Frontend Adapter
|
|
3
|
+
*
|
|
4
|
+
* Adapts Anthropic Messages API format to Universal IR.
|
|
5
|
+
* Handles Anthropic's separate system parameter and content block structure.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { AdapterConversionError, ErrorCode } from 'ai.matey.errors';
|
|
10
|
+
import { convertStreamMode } from 'ai.matey.utils';
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Anthropic Frontend Adapter
|
|
13
|
+
// ============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Frontend adapter for Anthropic Messages API.
|
|
16
|
+
*/
|
|
17
|
+
export class AnthropicFrontendAdapter {
|
|
18
|
+
metadata = {
|
|
19
|
+
name: 'anthropic-frontend',
|
|
20
|
+
version: '1.0.0',
|
|
21
|
+
provider: 'Anthropic',
|
|
22
|
+
capabilities: {
|
|
23
|
+
streaming: true,
|
|
24
|
+
multiModal: true,
|
|
25
|
+
tools: true,
|
|
26
|
+
maxContextTokens: 200000,
|
|
27
|
+
systemMessageStrategy: 'separate-parameter',
|
|
28
|
+
supportsMultipleSystemMessages: false, // Anthropic merges multiple system messages
|
|
29
|
+
supportsTemperature: true,
|
|
30
|
+
supportsTopP: true,
|
|
31
|
+
supportsTopK: true,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Convert Anthropic request to Universal IR.
|
|
36
|
+
*/
|
|
37
|
+
toIR(request) {
|
|
38
|
+
try {
|
|
39
|
+
// Convert messages
|
|
40
|
+
const messages = request.messages.map((msg) => this.convertMessageToIR(msg));
|
|
41
|
+
// Add system message if present
|
|
42
|
+
if (request.system) {
|
|
43
|
+
const systemMessage = {
|
|
44
|
+
role: 'system',
|
|
45
|
+
content: request.system,
|
|
46
|
+
};
|
|
47
|
+
messages.unshift(systemMessage);
|
|
48
|
+
}
|
|
49
|
+
// Build IR request
|
|
50
|
+
const irRequest = {
|
|
51
|
+
messages,
|
|
52
|
+
parameters: {
|
|
53
|
+
model: request.model,
|
|
54
|
+
temperature: request.temperature,
|
|
55
|
+
maxTokens: request.max_tokens,
|
|
56
|
+
topP: request.top_p,
|
|
57
|
+
topK: request.top_k,
|
|
58
|
+
stopSequences: request.stop_sequences,
|
|
59
|
+
},
|
|
60
|
+
stream: request.stream ?? false,
|
|
61
|
+
metadata: {
|
|
62
|
+
requestId: crypto.randomUUID(),
|
|
63
|
+
timestamp: Date.now(),
|
|
64
|
+
provenance: {
|
|
65
|
+
frontend: this.metadata.name,
|
|
66
|
+
},
|
|
67
|
+
custom: {
|
|
68
|
+
anthropicMetadata: request.metadata,
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
return Promise.resolve(irRequest);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
throw new AdapterConversionError({
|
|
76
|
+
code: ErrorCode.ADAPTER_CONVERSION_ERROR,
|
|
77
|
+
message: `Failed to convert Anthropic request to IR: ${error instanceof Error ? error.message : String(error)}`,
|
|
78
|
+
provenance: {
|
|
79
|
+
frontend: this.metadata.name,
|
|
80
|
+
},
|
|
81
|
+
cause: error instanceof Error ? error : undefined,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Convert Universal IR response to Anthropic format.
|
|
87
|
+
*/
|
|
88
|
+
fromIR(response) {
|
|
89
|
+
try {
|
|
90
|
+
// Convert message content
|
|
91
|
+
const content = this.convertContentFromIR(response.message.content);
|
|
92
|
+
// Map finish reason
|
|
93
|
+
const stopReason = this.mapFinishReason(response.finishReason);
|
|
94
|
+
// Build Anthropic response
|
|
95
|
+
const anthropicResponse = {
|
|
96
|
+
id: response.metadata.requestId,
|
|
97
|
+
type: 'message',
|
|
98
|
+
role: 'assistant',
|
|
99
|
+
content,
|
|
100
|
+
model: response.metadata.provenance?.backend || 'unknown',
|
|
101
|
+
stop_reason: stopReason,
|
|
102
|
+
usage: {
|
|
103
|
+
input_tokens: response.usage?.promptTokens ?? 0,
|
|
104
|
+
output_tokens: response.usage?.completionTokens ?? 0,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
return Promise.resolve(anthropicResponse);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
throw new AdapterConversionError({
|
|
111
|
+
code: ErrorCode.ADAPTER_CONVERSION_ERROR,
|
|
112
|
+
message: `Failed to convert IR response to Anthropic format: ${error instanceof Error ? error.message : String(error)}`,
|
|
113
|
+
provenance: {
|
|
114
|
+
frontend: this.metadata.name,
|
|
115
|
+
},
|
|
116
|
+
cause: error instanceof Error ? error : undefined,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Convert Universal IR stream to Anthropic SSE format.
|
|
122
|
+
*/
|
|
123
|
+
async *fromIRStream(stream, options) {
|
|
124
|
+
try {
|
|
125
|
+
// Apply stream mode conversion if options provided
|
|
126
|
+
const processedStream = options ? convertStreamMode(stream, options) : stream;
|
|
127
|
+
for await (const chunk of processedStream) {
|
|
128
|
+
switch (chunk.type) {
|
|
129
|
+
case 'start':
|
|
130
|
+
// Emit message_start event
|
|
131
|
+
yield {
|
|
132
|
+
type: 'message_start',
|
|
133
|
+
message: {
|
|
134
|
+
id: chunk.metadata.requestId,
|
|
135
|
+
type: 'message',
|
|
136
|
+
role: 'assistant',
|
|
137
|
+
model: chunk.metadata.provenance?.backend || 'unknown',
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
// Emit content_block_start
|
|
141
|
+
yield {
|
|
142
|
+
type: 'content_block_start',
|
|
143
|
+
index: 0,
|
|
144
|
+
content_block: { type: 'text', text: '' },
|
|
145
|
+
};
|
|
146
|
+
break;
|
|
147
|
+
case 'content':
|
|
148
|
+
// Emit content delta
|
|
149
|
+
yield {
|
|
150
|
+
type: 'content_block_delta',
|
|
151
|
+
index: 0,
|
|
152
|
+
delta: { type: 'text_delta', text: chunk.delta },
|
|
153
|
+
};
|
|
154
|
+
break;
|
|
155
|
+
case 'done': {
|
|
156
|
+
// Emit content_block_stop
|
|
157
|
+
yield {
|
|
158
|
+
type: 'content_block_stop',
|
|
159
|
+
index: 0,
|
|
160
|
+
};
|
|
161
|
+
// Emit message_delta with stop reason
|
|
162
|
+
const stopReason = this.mapFinishReason(chunk.finishReason);
|
|
163
|
+
yield {
|
|
164
|
+
type: 'message_delta',
|
|
165
|
+
delta: {
|
|
166
|
+
stop_reason: stopReason || 'end_turn',
|
|
167
|
+
},
|
|
168
|
+
usage: {
|
|
169
|
+
output_tokens: chunk.usage?.completionTokens ?? 0,
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
// Emit message_stop
|
|
173
|
+
yield {
|
|
174
|
+
type: 'message_stop',
|
|
175
|
+
};
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
case 'error':
|
|
179
|
+
// Emit error event
|
|
180
|
+
yield {
|
|
181
|
+
type: 'error',
|
|
182
|
+
error: {
|
|
183
|
+
type: chunk.error.code,
|
|
184
|
+
message: chunk.error.message,
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
// Emit error event
|
|
193
|
+
yield {
|
|
194
|
+
type: 'error',
|
|
195
|
+
error: {
|
|
196
|
+
type: 'stream_error',
|
|
197
|
+
message: error instanceof Error ? error.message : String(error),
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// ==========================================================================
|
|
203
|
+
// Private Helper Methods
|
|
204
|
+
// ==========================================================================
|
|
205
|
+
/**
|
|
206
|
+
* Convert Anthropic message to IR message.
|
|
207
|
+
*/
|
|
208
|
+
convertMessageToIR(message) {
|
|
209
|
+
// Convert content
|
|
210
|
+
let content;
|
|
211
|
+
if (typeof message.content === 'string') {
|
|
212
|
+
content = message.content;
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
content = message.content.map((block) => this.convertContentBlockToIR(block));
|
|
216
|
+
}
|
|
217
|
+
return {
|
|
218
|
+
role: message.role,
|
|
219
|
+
content,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Convert Anthropic content block to IR content block.
|
|
224
|
+
*/
|
|
225
|
+
convertContentBlockToIR(block) {
|
|
226
|
+
switch (block.type) {
|
|
227
|
+
case 'text':
|
|
228
|
+
return {
|
|
229
|
+
type: 'text',
|
|
230
|
+
text: block.text,
|
|
231
|
+
};
|
|
232
|
+
case 'image':
|
|
233
|
+
if (block.source.type === 'url') {
|
|
234
|
+
return {
|
|
235
|
+
type: 'image',
|
|
236
|
+
source: {
|
|
237
|
+
type: 'url',
|
|
238
|
+
url: block.source.url,
|
|
239
|
+
},
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
return {
|
|
244
|
+
type: 'image',
|
|
245
|
+
source: {
|
|
246
|
+
type: 'base64',
|
|
247
|
+
mediaType: block.source.media_type,
|
|
248
|
+
data: block.source.data,
|
|
249
|
+
},
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
case 'tool_use':
|
|
253
|
+
return {
|
|
254
|
+
type: 'tool_use',
|
|
255
|
+
id: block.id,
|
|
256
|
+
name: block.name,
|
|
257
|
+
input: block.input,
|
|
258
|
+
};
|
|
259
|
+
default:
|
|
260
|
+
// Unknown block type, convert to text
|
|
261
|
+
return {
|
|
262
|
+
type: 'text',
|
|
263
|
+
text: JSON.stringify(block),
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Convert IR content to Anthropic content blocks.
|
|
269
|
+
*/
|
|
270
|
+
convertContentFromIR(content) {
|
|
271
|
+
if (typeof content === 'string') {
|
|
272
|
+
return [{ type: 'text', text: content }];
|
|
273
|
+
}
|
|
274
|
+
return content.map((block) => {
|
|
275
|
+
switch (block.type) {
|
|
276
|
+
case 'text':
|
|
277
|
+
return { type: 'text', text: block.text };
|
|
278
|
+
case 'image':
|
|
279
|
+
if (block.source.type === 'url') {
|
|
280
|
+
return {
|
|
281
|
+
type: 'image',
|
|
282
|
+
source: { type: 'url', url: block.source.url },
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
return {
|
|
287
|
+
type: 'image',
|
|
288
|
+
source: {
|
|
289
|
+
type: 'base64',
|
|
290
|
+
media_type: block.source.mediaType,
|
|
291
|
+
data: block.source.data,
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
case 'tool_use':
|
|
296
|
+
return {
|
|
297
|
+
type: 'tool_use',
|
|
298
|
+
id: block.id,
|
|
299
|
+
name: block.name,
|
|
300
|
+
input: block.input,
|
|
301
|
+
};
|
|
302
|
+
default:
|
|
303
|
+
// Fallback to text
|
|
304
|
+
return { type: 'text', text: JSON.stringify(block) };
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Map IR finish reason to Anthropic stop reason.
|
|
310
|
+
*/
|
|
311
|
+
mapFinishReason(finishReason) {
|
|
312
|
+
switch (finishReason) {
|
|
313
|
+
case 'stop':
|
|
314
|
+
return 'end_turn';
|
|
315
|
+
case 'length':
|
|
316
|
+
return 'max_tokens';
|
|
317
|
+
case 'tool_calls':
|
|
318
|
+
return 'tool_use';
|
|
319
|
+
default:
|
|
320
|
+
return null;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=anthropic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/adapters/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chrome AI Frontend Adapter
|
|
3
|
+
*
|
|
4
|
+
* Pass-through adapter for Chrome AI format.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import { convertStreamMode } from 'ai.matey.utils';
|
|
9
|
+
export class ChromeAIFrontendAdapter {
|
|
10
|
+
metadata = {
|
|
11
|
+
name: 'chrome-ai-frontend',
|
|
12
|
+
version: '1.0.0',
|
|
13
|
+
provider: 'Chrome AI',
|
|
14
|
+
capabilities: {
|
|
15
|
+
streaming: true,
|
|
16
|
+
multiModal: false,
|
|
17
|
+
tools: false,
|
|
18
|
+
systemMessageStrategy: 'prepend-user',
|
|
19
|
+
supportsMultipleSystemMessages: false,
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
toIR(request) {
|
|
23
|
+
return Promise.resolve({
|
|
24
|
+
messages: [{ role: 'user', content: request.prompt }],
|
|
25
|
+
parameters: {
|
|
26
|
+
temperature: request.temperature,
|
|
27
|
+
topK: request.topK,
|
|
28
|
+
},
|
|
29
|
+
metadata: {
|
|
30
|
+
requestId: `chrome-ai-${Date.now()}`,
|
|
31
|
+
timestamp: Date.now(),
|
|
32
|
+
provenance: { frontend: this.metadata.name },
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
fromIR(response) {
|
|
37
|
+
return Promise.resolve({
|
|
38
|
+
text: typeof response.message.content === 'string' ? response.message.content : '',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
async *fromIRStream(stream, options) {
|
|
42
|
+
// Apply stream mode conversion if options provided
|
|
43
|
+
const processedStream = options ? convertStreamMode(stream, options) : stream;
|
|
44
|
+
for await (const chunk of processedStream) {
|
|
45
|
+
if (chunk.type === 'content') {
|
|
46
|
+
yield chunk.delta;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=chrome-ai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chrome-ai.js","sourceRoot":"","sources":["../../../src/adapters/chrome-ai.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAYnD,MAAM,OAAO,uBAAuB;IACzB,QAAQ,GAAoB;QACnC,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,WAAW;QACrB,YAAY,EAAE;YACZ,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,KAAK;YACjB,KAAK,EAAE,KAAK;YACZ,qBAAqB,EAAE,cAAc;YACrC,8BAA8B,EAAE,KAAK;SACtC;KACF,CAAC;IAEF,IAAI,CAAC,OAAwB;QAC3B,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;YACrD,UAAU,EAAE;gBACV,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB;YACD,QAAQ,EAAE;gBACR,SAAS,EAAE,aAAa,IAAI,CAAC,GAAG,EAAE,EAAE;gBACpC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;aAC7C;SACF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,QAAwB;QAC7B,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,IAAI,EAAE,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;SACnF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,CAAC,YAAY,CACjB,MAAqC,EACrC,OAAiC;QAEjC,mDAAmD;QACnD,MAAM,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAE9E,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;YAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC7B,MAAM,KAAK,CAAC,KAAK,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini Frontend Adapter
|
|
3
|
+
*
|
|
4
|
+
* Adapts Google Gemini API format to Universal IR.
|
|
5
|
+
* Handles Gemini's systemInstruction field and content array format.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
export class GeminiFrontendAdapter {
|
|
10
|
+
metadata = {
|
|
11
|
+
name: 'gemini-frontend',
|
|
12
|
+
version: '1.0.0',
|
|
13
|
+
provider: 'Google Gemini',
|
|
14
|
+
capabilities: {
|
|
15
|
+
streaming: true,
|
|
16
|
+
multiModal: true,
|
|
17
|
+
tools: true,
|
|
18
|
+
systemMessageStrategy: 'separate-parameter',
|
|
19
|
+
supportsMultipleSystemMessages: false,
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
toIR(request) {
|
|
23
|
+
const messages = request.contents.map((c) => ({
|
|
24
|
+
role: c.role === 'model' ? 'assistant' : 'user',
|
|
25
|
+
content: c.parts
|
|
26
|
+
.map((p) => 'text' in p ? p.text : '')
|
|
27
|
+
.join(''),
|
|
28
|
+
}));
|
|
29
|
+
if (request.systemInstruction) {
|
|
30
|
+
messages.unshift({
|
|
31
|
+
role: 'system',
|
|
32
|
+
content: request.systemInstruction.parts.map((p) => p.text).join(''),
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return Promise.resolve({
|
|
36
|
+
messages,
|
|
37
|
+
parameters: {
|
|
38
|
+
temperature: request.generationConfig?.temperature
|
|
39
|
+
? request.generationConfig.temperature * 2
|
|
40
|
+
: undefined,
|
|
41
|
+
topP: request.generationConfig?.topP,
|
|
42
|
+
topK: request.generationConfig?.topK,
|
|
43
|
+
maxTokens: request.generationConfig?.maxOutputTokens,
|
|
44
|
+
stopSequences: request.generationConfig?.stopSequences,
|
|
45
|
+
},
|
|
46
|
+
metadata: {
|
|
47
|
+
requestId: 'gemini-' + Date.now(),
|
|
48
|
+
timestamp: Date.now(),
|
|
49
|
+
provenance: { frontend: this.metadata.name },
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
fromIR(response) {
|
|
54
|
+
return Promise.resolve({
|
|
55
|
+
candidates: [
|
|
56
|
+
{
|
|
57
|
+
content: {
|
|
58
|
+
role: 'model',
|
|
59
|
+
parts: [
|
|
60
|
+
{
|
|
61
|
+
text: typeof response.message.content === 'string' ? response.message.content : '',
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
finishReason: response.finishReason === 'stop'
|
|
66
|
+
? 'STOP'
|
|
67
|
+
: response.finishReason === 'length'
|
|
68
|
+
? 'MAX_TOKENS'
|
|
69
|
+
: 'OTHER',
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
usageMetadata: response.usage
|
|
73
|
+
? {
|
|
74
|
+
promptTokenCount: response.usage.promptTokens,
|
|
75
|
+
candidatesTokenCount: response.usage.completionTokens,
|
|
76
|
+
totalTokenCount: response.usage.totalTokens,
|
|
77
|
+
}
|
|
78
|
+
: undefined,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async *fromIRStream(stream, _options) {
|
|
82
|
+
for await (const chunk of stream) {
|
|
83
|
+
if (chunk.type === 'content') {
|
|
84
|
+
yield 'data: ' +
|
|
85
|
+
JSON.stringify({ candidates: [{ content: { parts: [{ text: chunk.delta }] } }] }) +
|
|
86
|
+
'\n\n';
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/adapters/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic Frontend Adapter
|
|
3
|
+
*
|
|
4
|
+
* A passthrough frontend adapter that accepts and returns IR format directly.
|
|
5
|
+
* Use this when you want to work with the universal IR format without
|
|
6
|
+
* any provider-specific conversions.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { GenericFrontendAdapter } from 'ai.matey.frontend/generic';
|
|
11
|
+
* import { Bridge } from 'ai.matey.core';
|
|
12
|
+
*
|
|
13
|
+
* const frontend = new GenericFrontendAdapter();
|
|
14
|
+
* const bridge = new Bridge(frontend, backend);
|
|
15
|
+
*
|
|
16
|
+
* // Request and response are both in IR format
|
|
17
|
+
* const response = await bridge.chat({
|
|
18
|
+
* messages: [{ role: 'user', content: 'Hello!' }],
|
|
19
|
+
* parameters: { model: 'gpt-4' },
|
|
20
|
+
* metadata: { requestId: 'req_123', timestamp: Date.now(), provenance: {} },
|
|
21
|
+
* });
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @module
|
|
25
|
+
*/
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// Generic Frontend Adapter
|
|
28
|
+
// ============================================================================
|
|
29
|
+
/**
|
|
30
|
+
* Passthrough frontend adapter for IR format.
|
|
31
|
+
*
|
|
32
|
+
* This adapter accepts IR requests directly and returns IR responses without
|
|
33
|
+
* any conversion. It's useful for:
|
|
34
|
+
*
|
|
35
|
+
* - **Direct IR access**: Work with the universal format without provider wrappers
|
|
36
|
+
* - **Testing**: Test bridges and backends without conversion overhead
|
|
37
|
+
* - **Custom integrations**: Build tools that operate at the IR level
|
|
38
|
+
* - **Format normalization**: Use when your application already produces IR
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* // Basic usage
|
|
43
|
+
* const frontend = new GenericFrontendAdapter();
|
|
44
|
+
*
|
|
45
|
+
* // With custom configuration
|
|
46
|
+
* const frontend = new GenericFrontendAdapter({
|
|
47
|
+
* name: 'my-app-frontend',
|
|
48
|
+
* trackProvenance: true,
|
|
49
|
+
* maxContextTokens: 128000,
|
|
50
|
+
* });
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export class GenericFrontendAdapter {
|
|
54
|
+
metadata;
|
|
55
|
+
config;
|
|
56
|
+
constructor(config = {}) {
|
|
57
|
+
this.config = config;
|
|
58
|
+
this.metadata = {
|
|
59
|
+
name: config.name ?? 'generic-frontend',
|
|
60
|
+
version: '1.0.0',
|
|
61
|
+
provider: 'Generic',
|
|
62
|
+
capabilities: {
|
|
63
|
+
streaming: true,
|
|
64
|
+
multiModal: true,
|
|
65
|
+
tools: true,
|
|
66
|
+
maxContextTokens: config.maxContextTokens,
|
|
67
|
+
supportedModels: config.supportedModels,
|
|
68
|
+
systemMessageStrategy: 'in-messages',
|
|
69
|
+
supportsMultipleSystemMessages: true,
|
|
70
|
+
supportsTemperature: true,
|
|
71
|
+
supportsTopP: true,
|
|
72
|
+
supportsTopK: true,
|
|
73
|
+
supportsSeed: true,
|
|
74
|
+
supportsFrequencyPenalty: true,
|
|
75
|
+
supportsPresencePenalty: true,
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Pass through IR request (no conversion needed).
|
|
81
|
+
*
|
|
82
|
+
* Optionally adds provenance tracking if enabled.
|
|
83
|
+
*/
|
|
84
|
+
toIR(request) {
|
|
85
|
+
// Optionally add provenance
|
|
86
|
+
if (this.config.trackProvenance !== false) {
|
|
87
|
+
return Promise.resolve({
|
|
88
|
+
...request,
|
|
89
|
+
metadata: {
|
|
90
|
+
...request.metadata,
|
|
91
|
+
provenance: {
|
|
92
|
+
...request.metadata.provenance,
|
|
93
|
+
frontend: this.metadata.name,
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
return Promise.resolve(request);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Pass through IR response (no conversion needed).
|
|
102
|
+
*/
|
|
103
|
+
fromIR(response) {
|
|
104
|
+
return Promise.resolve(response);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Pass through IR stream chunks (no conversion needed).
|
|
108
|
+
*/
|
|
109
|
+
async *fromIRStream(stream, _options) {
|
|
110
|
+
for await (const chunk of stream) {
|
|
111
|
+
yield chunk;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Validate IR request structure.
|
|
116
|
+
*
|
|
117
|
+
* Only performs validation if `validateRequests` is enabled in config.
|
|
118
|
+
*/
|
|
119
|
+
validate(request) {
|
|
120
|
+
if (!this.config.validateRequests) {
|
|
121
|
+
return Promise.resolve();
|
|
122
|
+
}
|
|
123
|
+
// Basic validation
|
|
124
|
+
if (!request.messages || request.messages.length === 0) {
|
|
125
|
+
return Promise.reject(new Error('Request must contain at least one message'));
|
|
126
|
+
}
|
|
127
|
+
if (!request.metadata?.requestId) {
|
|
128
|
+
return Promise.reject(new Error('Request must have a requestId in metadata'));
|
|
129
|
+
}
|
|
130
|
+
if (typeof request.metadata.timestamp !== 'number') {
|
|
131
|
+
return Promise.reject(new Error('Request must have a numeric timestamp in metadata'));
|
|
132
|
+
}
|
|
133
|
+
return Promise.resolve();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// ============================================================================
|
|
137
|
+
// Factory Function
|
|
138
|
+
// ============================================================================
|
|
139
|
+
/**
|
|
140
|
+
* Create a new Generic Frontend Adapter instance.
|
|
141
|
+
*
|
|
142
|
+
* @example
|
|
143
|
+
* ```typescript
|
|
144
|
+
* const frontend = createGenericFrontend();
|
|
145
|
+
*
|
|
146
|
+
* // Or with configuration
|
|
147
|
+
* const frontend = createGenericFrontend({
|
|
148
|
+
* name: 'my-frontend',
|
|
149
|
+
* trackProvenance: true,
|
|
150
|
+
* });
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
153
|
+
export function createGenericFrontend(config) {
|
|
154
|
+
return new GenericFrontendAdapter(config);
|
|
155
|
+
}
|
|
156
|
+
// ============================================================================
|
|
157
|
+
// Default Export
|
|
158
|
+
// ============================================================================
|
|
159
|
+
export default GenericFrontendAdapter;
|
|
160
|
+
//# sourceMappingURL=generic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic.js","sourceRoot":"","sources":["../../../src/adapters/generic.ts"],"names":[],"mappings":"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"}
|