@axonflow/sdk 1.2.0 → 1.3.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/README.md +313 -9
- package/dist/cjs/client.d.ts +106 -41
- package/dist/cjs/client.d.ts.map +1 -1
- package/dist/cjs/client.js +446 -198
- package/dist/cjs/client.js.map +1 -1
- package/dist/cjs/errors.d.ts +51 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +84 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.d.ts +6 -2
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +16 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/interceptors/anthropic.d.ts +1 -1
- package/dist/cjs/interceptors/anthropic.d.ts.map +1 -1
- package/dist/cjs/interceptors/anthropic.js +6 -6
- package/dist/cjs/interceptors/anthropic.js.map +1 -1
- package/dist/cjs/interceptors/bedrock.d.ts +141 -0
- package/dist/cjs/interceptors/bedrock.d.ts.map +1 -0
- package/dist/cjs/interceptors/bedrock.js +259 -0
- package/dist/cjs/interceptors/bedrock.js.map +1 -0
- package/dist/cjs/interceptors/gemini.d.ts +81 -0
- package/dist/cjs/interceptors/gemini.d.ts.map +1 -0
- package/dist/cjs/interceptors/gemini.js +110 -0
- package/dist/cjs/interceptors/gemini.js.map +1 -0
- package/dist/cjs/interceptors/ollama.d.ts +143 -0
- package/dist/cjs/interceptors/ollama.d.ts.map +1 -0
- package/dist/cjs/interceptors/ollama.js +150 -0
- package/dist/cjs/interceptors/ollama.js.map +1 -0
- package/dist/cjs/interceptors/openai.d.ts +1 -1
- package/dist/cjs/interceptors/openai.d.ts.map +1 -1
- package/dist/cjs/interceptors/openai.js +5 -5
- package/dist/cjs/interceptors/openai.js.map +1 -1
- package/dist/cjs/types/config.d.ts +7 -1
- package/dist/cjs/types/config.d.ts.map +1 -1
- package/dist/cjs/types/gateway.d.ts +51 -114
- package/dist/cjs/types/gateway.d.ts.map +1 -1
- package/dist/cjs/types/gateway.js +2 -7
- package/dist/cjs/types/gateway.js.map +1 -1
- package/dist/cjs/types/index.d.ts +1 -0
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/types/index.js +1 -0
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/proxy.d.ts +78 -0
- package/dist/cjs/types/proxy.d.ts.map +1 -0
- package/dist/cjs/types/proxy.js +9 -0
- package/dist/cjs/types/proxy.js.map +1 -0
- package/dist/cjs/utils/helpers.d.ts.map +1 -1
- package/dist/cjs/utils/helpers.js +3 -1
- package/dist/cjs/utils/helpers.js.map +1 -1
- package/dist/esm/client.d.ts +106 -41
- package/dist/esm/client.d.ts.map +1 -1
- package/dist/esm/client.js +446 -198
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/errors.d.ts +51 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +75 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.d.ts +6 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +6 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/interceptors/anthropic.d.ts +1 -1
- package/dist/esm/interceptors/anthropic.d.ts.map +1 -1
- package/dist/esm/interceptors/anthropic.js +6 -6
- package/dist/esm/interceptors/anthropic.js.map +1 -1
- package/dist/esm/interceptors/bedrock.d.ts +141 -0
- package/dist/esm/interceptors/bedrock.d.ts.map +1 -0
- package/dist/esm/interceptors/bedrock.js +220 -0
- package/dist/esm/interceptors/bedrock.js.map +1 -0
- package/dist/esm/interceptors/gemini.d.ts +81 -0
- package/dist/esm/interceptors/gemini.d.ts.map +1 -0
- package/dist/esm/interceptors/gemini.js +105 -0
- package/dist/esm/interceptors/gemini.js.map +1 -0
- package/dist/esm/interceptors/ollama.d.ts +143 -0
- package/dist/esm/interceptors/ollama.d.ts.map +1 -0
- package/dist/esm/interceptors/ollama.js +144 -0
- package/dist/esm/interceptors/ollama.js.map +1 -0
- package/dist/esm/interceptors/openai.d.ts +1 -1
- package/dist/esm/interceptors/openai.d.ts.map +1 -1
- package/dist/esm/interceptors/openai.js +5 -5
- package/dist/esm/interceptors/openai.js.map +1 -1
- package/dist/esm/types/config.d.ts +7 -1
- package/dist/esm/types/config.d.ts.map +1 -1
- package/dist/esm/types/gateway.d.ts +51 -114
- package/dist/esm/types/gateway.d.ts.map +1 -1
- package/dist/esm/types/gateway.js +2 -7
- package/dist/esm/types/gateway.js.map +1 -1
- package/dist/esm/types/index.d.ts +1 -0
- package/dist/esm/types/index.d.ts.map +1 -1
- package/dist/esm/types/index.js +1 -0
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/types/proxy.d.ts +78 -0
- package/dist/esm/types/proxy.d.ts.map +1 -0
- package/dist/esm/types/proxy.js +8 -0
- package/dist/esm/types/proxy.js.map +1 -0
- package/dist/esm/utils/helpers.d.ts.map +1 -1
- package/dist/esm/utils/helpers.js +3 -1
- package/dist/esm/utils/helpers.js.map +1 -1
- package/package.json +22 -7
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.BedrockModels = exports.BedrockInterceptor = void 0;
|
|
37
|
+
exports.wrapBedrockClient = wrapBedrockClient;
|
|
38
|
+
exports.createGovernedBedrockInvoke = createGovernedBedrockInvoke;
|
|
39
|
+
const base_1 = require("./base");
|
|
40
|
+
/**
|
|
41
|
+
* Interceptor for AWS Bedrock API calls
|
|
42
|
+
*
|
|
43
|
+
* Bedrock uses AWS IAM authentication (no API keys required).
|
|
44
|
+
* Supports multiple model providers: Anthropic Claude, Amazon Titan, Meta Llama, etc.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* import { BedrockRuntimeClient, InvokeModelCommand } from '@aws-sdk/client-bedrock-runtime';
|
|
49
|
+
* import { AxonFlow, wrapBedrockClient } from '@axonflow/sdk';
|
|
50
|
+
*
|
|
51
|
+
* const bedrockClient = new BedrockRuntimeClient({ region: 'us-east-1' });
|
|
52
|
+
* const axonflow = new AxonFlow({ endpoint: 'http://localhost:8080' });
|
|
53
|
+
*
|
|
54
|
+
* const wrapped = wrapBedrockClient(bedrockClient, axonflow);
|
|
55
|
+
* const response = await wrapped.send(new InvokeModelCommand({...}));
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
class BedrockInterceptor extends base_1.BaseInterceptor {
|
|
59
|
+
canHandle(aiCall) {
|
|
60
|
+
const callString = aiCall.toString();
|
|
61
|
+
return (callString.includes('bedrock') ||
|
|
62
|
+
callString.includes('BedrockRuntime') ||
|
|
63
|
+
callString.includes('InvokeModel') ||
|
|
64
|
+
callString.includes('anthropic.claude') ||
|
|
65
|
+
callString.includes('amazon.titan'));
|
|
66
|
+
}
|
|
67
|
+
extractRequest(aiCall) {
|
|
68
|
+
const callString = aiCall.toString();
|
|
69
|
+
let model = 'anthropic.claude-3-sonnet';
|
|
70
|
+
if (callString.includes('titan')) {
|
|
71
|
+
model = 'amazon.titan-text-express-v1';
|
|
72
|
+
}
|
|
73
|
+
else if (callString.includes('llama')) {
|
|
74
|
+
model = 'meta.llama2-70b-chat-v1';
|
|
75
|
+
}
|
|
76
|
+
else if (callString.includes('claude-3-opus')) {
|
|
77
|
+
model = 'anthropic.claude-3-opus';
|
|
78
|
+
}
|
|
79
|
+
else if (callString.includes('claude-3-haiku')) {
|
|
80
|
+
model = 'anthropic.claude-3-haiku';
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
provider: 'bedrock',
|
|
84
|
+
model,
|
|
85
|
+
prompt: callString,
|
|
86
|
+
parameters: {},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
executeWithModifications(aiCall, _modifications) {
|
|
90
|
+
return aiCall();
|
|
91
|
+
}
|
|
92
|
+
getProvider() {
|
|
93
|
+
return 'bedrock';
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.BedrockInterceptor = BedrockInterceptor;
|
|
97
|
+
/**
|
|
98
|
+
* Bedrock model providers and their model IDs
|
|
99
|
+
*/
|
|
100
|
+
exports.BedrockModels = {
|
|
101
|
+
// Anthropic Claude models
|
|
102
|
+
CLAUDE_3_OPUS: 'anthropic.claude-3-opus-20240229-v1:0',
|
|
103
|
+
CLAUDE_3_SONNET: 'anthropic.claude-3-sonnet-20240229-v1:0',
|
|
104
|
+
CLAUDE_3_HAIKU: 'anthropic.claude-3-haiku-20240307-v1:0',
|
|
105
|
+
CLAUDE_2_1: 'anthropic.claude-v2:1',
|
|
106
|
+
CLAUDE_2: 'anthropic.claude-v2',
|
|
107
|
+
CLAUDE_INSTANT: 'anthropic.claude-instant-v1',
|
|
108
|
+
// Amazon Titan models
|
|
109
|
+
TITAN_TEXT_EXPRESS: 'amazon.titan-text-express-v1',
|
|
110
|
+
TITAN_TEXT_LITE: 'amazon.titan-text-lite-v1',
|
|
111
|
+
TITAN_TEXT_PREMIER: 'amazon.titan-text-premier-v1:0',
|
|
112
|
+
// Meta Llama models
|
|
113
|
+
LLAMA2_13B: 'meta.llama2-13b-chat-v1',
|
|
114
|
+
LLAMA2_70B: 'meta.llama2-70b-chat-v1',
|
|
115
|
+
LLAMA3_8B: 'meta.llama3-8b-instruct-v1:0',
|
|
116
|
+
LLAMA3_70B: 'meta.llama3-70b-instruct-v1:0',
|
|
117
|
+
// Cohere models
|
|
118
|
+
COHERE_COMMAND: 'cohere.command-text-v14',
|
|
119
|
+
COHERE_COMMAND_LIGHT: 'cohere.command-light-text-v14',
|
|
120
|
+
// AI21 models
|
|
121
|
+
AI21_JURASSIC_ULTRA: 'ai21.j2-ultra-v1',
|
|
122
|
+
AI21_JURASSIC_MID: 'ai21.j2-mid-v1',
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Wraps an AWS Bedrock client with AxonFlow governance.
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* ```typescript
|
|
129
|
+
* import { BedrockRuntimeClient, InvokeModelCommand } from '@aws-sdk/client-bedrock-runtime';
|
|
130
|
+
* import { AxonFlow, wrapBedrockClient } from '@axonflow/sdk';
|
|
131
|
+
*
|
|
132
|
+
* const bedrock = new BedrockRuntimeClient({ region: 'us-east-1' });
|
|
133
|
+
* const axonflow = new AxonFlow({ endpoint: 'http://localhost:8080' });
|
|
134
|
+
*
|
|
135
|
+
* const wrapped = wrapBedrockClient(bedrock, axonflow);
|
|
136
|
+
*
|
|
137
|
+
* const command = new InvokeModelCommand({
|
|
138
|
+
* modelId: 'anthropic.claude-3-sonnet-20240229-v1:0',
|
|
139
|
+
* body: JSON.stringify({
|
|
140
|
+
* anthropic_version: 'bedrock-2023-05-31',
|
|
141
|
+
* max_tokens: 1024,
|
|
142
|
+
* messages: [{ role: 'user', content: 'Hello!' }]
|
|
143
|
+
* })
|
|
144
|
+
* });
|
|
145
|
+
*
|
|
146
|
+
* const response = await wrapped.send(command);
|
|
147
|
+
* ```
|
|
148
|
+
*/
|
|
149
|
+
function wrapBedrockClient(bedrockClient, axonflow) {
|
|
150
|
+
const originalSend = bedrockClient.send.bind(bedrockClient);
|
|
151
|
+
bedrockClient.send = async (command) => {
|
|
152
|
+
// Check if this is an InvokeModelCommand
|
|
153
|
+
const commandName = command.constructor?.name || '';
|
|
154
|
+
if (!commandName.includes('InvokeModel')) {
|
|
155
|
+
return originalSend(command);
|
|
156
|
+
}
|
|
157
|
+
// Extract model ID and prompt for governance context
|
|
158
|
+
const modelId = command.input?.modelId || 'unknown';
|
|
159
|
+
let prompt = '';
|
|
160
|
+
try {
|
|
161
|
+
const body = JSON.parse(typeof command.input?.body === 'string'
|
|
162
|
+
? command.input.body
|
|
163
|
+
: new TextDecoder().decode(command.input?.body));
|
|
164
|
+
// Extract prompt based on model type
|
|
165
|
+
if (body.messages) {
|
|
166
|
+
// Claude format
|
|
167
|
+
prompt = body.messages
|
|
168
|
+
.map((m) => (typeof m.content === 'string' ? m.content : m.content?.[0]?.text || ''))
|
|
169
|
+
.join(' ');
|
|
170
|
+
}
|
|
171
|
+
else if (body.inputText) {
|
|
172
|
+
// Titan format
|
|
173
|
+
prompt = body.inputText;
|
|
174
|
+
}
|
|
175
|
+
else if (body.prompt) {
|
|
176
|
+
// Generic format
|
|
177
|
+
prompt = body.prompt;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// If we can't parse the body, continue without prompt extraction
|
|
182
|
+
}
|
|
183
|
+
// Protect the call with AxonFlow, passing context
|
|
184
|
+
return axonflow.protect(async () => {
|
|
185
|
+
return originalSend(command);
|
|
186
|
+
}, { provider: 'bedrock', model: modelId, query: prompt });
|
|
187
|
+
};
|
|
188
|
+
return bedrockClient;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Creates a governed Bedrock invoke function with full governance flow.
|
|
192
|
+
*
|
|
193
|
+
* Use this for fine-grained control with pre-check and audit.
|
|
194
|
+
*/
|
|
195
|
+
function createGovernedBedrockInvoke(bedrockClient, axonflow, userToken = '') {
|
|
196
|
+
return async (modelId, body) => {
|
|
197
|
+
// Extract prompt
|
|
198
|
+
let prompt = '';
|
|
199
|
+
if (body.messages) {
|
|
200
|
+
prompt = body.messages
|
|
201
|
+
.map((m) => (typeof m.content === 'string' ? m.content : m.content?.[0]?.text || ''))
|
|
202
|
+
.join(' ');
|
|
203
|
+
}
|
|
204
|
+
else if (body.inputText) {
|
|
205
|
+
prompt = body.inputText;
|
|
206
|
+
}
|
|
207
|
+
// Pre-check with AxonFlow
|
|
208
|
+
const preCheck = await axonflow.getPolicyApprovedContext({
|
|
209
|
+
userToken,
|
|
210
|
+
query: prompt,
|
|
211
|
+
context: {
|
|
212
|
+
provider: 'bedrock',
|
|
213
|
+
model: modelId,
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
if (!preCheck.approved) {
|
|
217
|
+
throw new Error(`Request blocked by policy: ${preCheck.blockReason}`);
|
|
218
|
+
}
|
|
219
|
+
// Execute the call
|
|
220
|
+
const startTime = Date.now();
|
|
221
|
+
// Dynamically import to avoid requiring AWS SDK as a dependency
|
|
222
|
+
const { InvokeModelCommand } = await Promise.resolve().then(() => __importStar(require('@aws-sdk/client-bedrock-runtime')));
|
|
223
|
+
const command = new InvokeModelCommand({
|
|
224
|
+
modelId,
|
|
225
|
+
body: JSON.stringify(body),
|
|
226
|
+
contentType: 'application/json',
|
|
227
|
+
accept: 'application/json',
|
|
228
|
+
});
|
|
229
|
+
const response = await bedrockClient.send(command);
|
|
230
|
+
const latencyMs = Date.now() - startTime;
|
|
231
|
+
// Parse response
|
|
232
|
+
const responseBody = JSON.parse(new TextDecoder().decode(response.body));
|
|
233
|
+
// Audit the call
|
|
234
|
+
if (preCheck.contextId) {
|
|
235
|
+
let summary = '';
|
|
236
|
+
let promptTokens = 0;
|
|
237
|
+
let completionTokens = 0;
|
|
238
|
+
if (responseBody.content) {
|
|
239
|
+
// Claude response
|
|
240
|
+
summary = responseBody.content[0]?.text?.substring(0, 200) || '';
|
|
241
|
+
promptTokens = responseBody.usage?.input_tokens || 0;
|
|
242
|
+
completionTokens = responseBody.usage?.output_tokens || 0;
|
|
243
|
+
}
|
|
244
|
+
else if (responseBody.results) {
|
|
245
|
+
// Titan response
|
|
246
|
+
summary = responseBody.results[0]?.outputText?.substring(0, 200) || '';
|
|
247
|
+
promptTokens = responseBody.inputTextTokenCount || 0;
|
|
248
|
+
completionTokens = responseBody.results[0]?.tokenCount || 0;
|
|
249
|
+
}
|
|
250
|
+
await axonflow.auditLLMCall(preCheck.contextId, summary, 'bedrock', modelId, {
|
|
251
|
+
promptTokens,
|
|
252
|
+
completionTokens,
|
|
253
|
+
totalTokens: promptTokens + completionTokens,
|
|
254
|
+
}, latencyMs);
|
|
255
|
+
}
|
|
256
|
+
return responseBody;
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=bedrock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bedrock.js","sourceRoot":"","sources":["../../../src/interceptors/bedrock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { BaseInterceptor } from './base';
|
|
2
|
+
import { AIRequest } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Interceptor for Google Gemini API calls
|
|
5
|
+
*
|
|
6
|
+
* Supports both @google/generative-ai SDK and direct API calls.
|
|
7
|
+
*/
|
|
8
|
+
export declare class GeminiInterceptor extends BaseInterceptor {
|
|
9
|
+
canHandle(aiCall: any): boolean;
|
|
10
|
+
extractRequest(aiCall: any): AIRequest;
|
|
11
|
+
executeWithModifications(aiCall: any, _modifications: any): Promise<any>;
|
|
12
|
+
getProvider(): string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Gemini content part types
|
|
16
|
+
*/
|
|
17
|
+
export interface GeminiTextPart {
|
|
18
|
+
text: string;
|
|
19
|
+
}
|
|
20
|
+
export interface GeminiInlineDataPart {
|
|
21
|
+
inlineData: {
|
|
22
|
+
mimeType: string;
|
|
23
|
+
data: string;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export type GeminiPart = GeminiTextPart | GeminiInlineDataPart;
|
|
27
|
+
export interface GeminiContent {
|
|
28
|
+
role?: 'user' | 'model';
|
|
29
|
+
parts: GeminiPart[];
|
|
30
|
+
}
|
|
31
|
+
export interface GeminiGenerateContentRequest {
|
|
32
|
+
contents: GeminiContent[];
|
|
33
|
+
generationConfig?: {
|
|
34
|
+
temperature?: number;
|
|
35
|
+
topP?: number;
|
|
36
|
+
topK?: number;
|
|
37
|
+
maxOutputTokens?: number;
|
|
38
|
+
stopSequences?: string[];
|
|
39
|
+
};
|
|
40
|
+
safetySettings?: Array<{
|
|
41
|
+
category: string;
|
|
42
|
+
threshold: string;
|
|
43
|
+
}>;
|
|
44
|
+
}
|
|
45
|
+
export interface GeminiCandidate {
|
|
46
|
+
content: GeminiContent;
|
|
47
|
+
finishReason: string;
|
|
48
|
+
safetyRatings?: Array<{
|
|
49
|
+
category: string;
|
|
50
|
+
probability: string;
|
|
51
|
+
}>;
|
|
52
|
+
}
|
|
53
|
+
export interface GeminiUsageMetadata {
|
|
54
|
+
promptTokenCount: number;
|
|
55
|
+
candidatesTokenCount: number;
|
|
56
|
+
totalTokenCount: number;
|
|
57
|
+
}
|
|
58
|
+
export interface GeminiGenerateContentResponse {
|
|
59
|
+
candidates: GeminiCandidate[];
|
|
60
|
+
usageMetadata?: GeminiUsageMetadata;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Helper to wrap Gemini GenerativeModel for easier interception
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* import { GoogleGenerativeAI } from '@google/generative-ai';
|
|
68
|
+
* import { AxonFlow, wrapGeminiModel } from '@axonflow/sdk';
|
|
69
|
+
*
|
|
70
|
+
* const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
|
|
71
|
+
* const model = genAI.getGenerativeModel({ model: 'gemini-pro' });
|
|
72
|
+
* const axonflow = new AxonFlow({ apiKey: process.env.AXONFLOW_API_KEY });
|
|
73
|
+
*
|
|
74
|
+
* const wrappedModel = wrapGeminiModel(model, axonflow);
|
|
75
|
+
*
|
|
76
|
+
* // Use as normal - governance is automatic
|
|
77
|
+
* const result = await wrappedModel.generateContent('What is AI governance?');
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export declare function wrapGeminiModel(geminiModel: any, axonflow: any): any;
|
|
81
|
+
//# sourceMappingURL=gemini.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/interceptors/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,eAAe;IACpD,SAAS,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO;IAY/B,cAAc,CAAC,MAAM,EAAE,GAAG,GAAG,SAAS;IAwBtC,wBAAwB,CAAC,MAAM,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAKxE,WAAW,IAAI,MAAM;CAGtB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,oBAAoB,CAAC;AAE/D,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,gBAAgB,CAAC,EAAE;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;IACF,cAAc,CAAC,EAAE,KAAK,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,aAAa,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,KAAK,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACrC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,GAAG,GAAG,CA2BpE"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GeminiInterceptor = void 0;
|
|
4
|
+
exports.wrapGeminiModel = wrapGeminiModel;
|
|
5
|
+
const base_1 = require("./base");
|
|
6
|
+
/**
|
|
7
|
+
* Interceptor for Google Gemini API calls
|
|
8
|
+
*
|
|
9
|
+
* Supports both @google/generative-ai SDK and direct API calls.
|
|
10
|
+
*/
|
|
11
|
+
class GeminiInterceptor extends base_1.BaseInterceptor {
|
|
12
|
+
canHandle(aiCall) {
|
|
13
|
+
// Check if this looks like a Gemini call
|
|
14
|
+
const callString = aiCall.toString();
|
|
15
|
+
return (callString.includes('gemini') ||
|
|
16
|
+
callString.includes('generateContent') ||
|
|
17
|
+
callString.includes('GenerativeModel') ||
|
|
18
|
+
callString.includes('google') ||
|
|
19
|
+
callString.includes('palm'));
|
|
20
|
+
}
|
|
21
|
+
extractRequest(aiCall) {
|
|
22
|
+
// Try to extract Gemini-specific details
|
|
23
|
+
const callString = aiCall.toString();
|
|
24
|
+
// Try to detect model
|
|
25
|
+
let model = 'gemini-pro';
|
|
26
|
+
if (callString.includes('gemini-1.5-pro')) {
|
|
27
|
+
model = 'gemini-1.5-pro';
|
|
28
|
+
}
|
|
29
|
+
else if (callString.includes('gemini-1.5-flash')) {
|
|
30
|
+
model = 'gemini-1.5-flash';
|
|
31
|
+
}
|
|
32
|
+
else if (callString.includes('gemini-pro-vision')) {
|
|
33
|
+
model = 'gemini-pro-vision';
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
provider: 'gemini',
|
|
37
|
+
model,
|
|
38
|
+
prompt: callString,
|
|
39
|
+
parameters: {
|
|
40
|
+
// Would extract temperature, topP, etc. in production
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
executeWithModifications(aiCall, _modifications) {
|
|
45
|
+
// Execute the call with any modifications from governance
|
|
46
|
+
return aiCall();
|
|
47
|
+
}
|
|
48
|
+
getProvider() {
|
|
49
|
+
return 'gemini';
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.GeminiInterceptor = GeminiInterceptor;
|
|
53
|
+
/**
|
|
54
|
+
* Helper to wrap Gemini GenerativeModel for easier interception
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```typescript
|
|
58
|
+
* import { GoogleGenerativeAI } from '@google/generative-ai';
|
|
59
|
+
* import { AxonFlow, wrapGeminiModel } from '@axonflow/sdk';
|
|
60
|
+
*
|
|
61
|
+
* const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
|
|
62
|
+
* const model = genAI.getGenerativeModel({ model: 'gemini-pro' });
|
|
63
|
+
* const axonflow = new AxonFlow({ apiKey: process.env.AXONFLOW_API_KEY });
|
|
64
|
+
*
|
|
65
|
+
* const wrappedModel = wrapGeminiModel(model, axonflow);
|
|
66
|
+
*
|
|
67
|
+
* // Use as normal - governance is automatic
|
|
68
|
+
* const result = await wrappedModel.generateContent('What is AI governance?');
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
function wrapGeminiModel(geminiModel, axonflow) {
|
|
72
|
+
return new Proxy(geminiModel, {
|
|
73
|
+
get(target, prop, receiver) {
|
|
74
|
+
const original = Reflect.get(target, prop, receiver);
|
|
75
|
+
// Intercept generateContent and generateContentStream
|
|
76
|
+
if (typeof original === 'function' &&
|
|
77
|
+
['generateContent', 'generateContentStream', 'sendMessage'].includes(prop.toString())) {
|
|
78
|
+
return async (...args) => {
|
|
79
|
+
// Protect the call with AxonFlow
|
|
80
|
+
return axonflow.protect(() => original.apply(target, args));
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// For chat sessions, wrap the returned chat object
|
|
84
|
+
if (prop === 'startChat' && typeof original === 'function') {
|
|
85
|
+
return (...args) => {
|
|
86
|
+
const chat = original.apply(target, args);
|
|
87
|
+
return wrapGeminiChat(chat, axonflow);
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return original;
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Helper to wrap Gemini ChatSession for multi-turn conversations
|
|
96
|
+
*/
|
|
97
|
+
function wrapGeminiChat(chatSession, axonflow) {
|
|
98
|
+
return new Proxy(chatSession, {
|
|
99
|
+
get(target, prop, receiver) {
|
|
100
|
+
const original = Reflect.get(target, prop, receiver);
|
|
101
|
+
if (typeof original === 'function' && prop === 'sendMessage') {
|
|
102
|
+
return async (...args) => {
|
|
103
|
+
return axonflow.protect(() => original.apply(target, args));
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
return original;
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/interceptors/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { BaseInterceptor } from './base';
|
|
2
|
+
import { AIRequest } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Interceptor for Ollama API calls
|
|
5
|
+
*
|
|
6
|
+
* Ollama is a local LLM server that runs on localhost:11434 by default.
|
|
7
|
+
* No authentication is required.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { AxonFlow, wrapOllamaClient } from '@axonflow/sdk';
|
|
12
|
+
* import Ollama from 'ollama';
|
|
13
|
+
*
|
|
14
|
+
* const ollama = new Ollama({ host: 'http://localhost:11434' });
|
|
15
|
+
* const axonflow = new AxonFlow({ endpoint: 'http://localhost:8080' });
|
|
16
|
+
*
|
|
17
|
+
* const wrapped = wrapOllamaClient(ollama, axonflow);
|
|
18
|
+
* const response = await wrapped.chat({
|
|
19
|
+
* model: 'llama2',
|
|
20
|
+
* messages: [{ role: 'user', content: 'Hello!' }]
|
|
21
|
+
* });
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare class OllamaInterceptor extends BaseInterceptor {
|
|
25
|
+
canHandle(aiCall: any): boolean;
|
|
26
|
+
extractRequest(aiCall: any): AIRequest;
|
|
27
|
+
executeWithModifications(aiCall: any, _modifications: any): Promise<any>;
|
|
28
|
+
getProvider(): string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Ollama chat message
|
|
32
|
+
*/
|
|
33
|
+
export interface OllamaMessage {
|
|
34
|
+
role: 'system' | 'user' | 'assistant';
|
|
35
|
+
content: string;
|
|
36
|
+
images?: string[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Ollama chat request
|
|
40
|
+
*/
|
|
41
|
+
export interface OllamaChatRequest {
|
|
42
|
+
model: string;
|
|
43
|
+
messages: OllamaMessage[];
|
|
44
|
+
stream?: boolean;
|
|
45
|
+
format?: 'json';
|
|
46
|
+
options?: {
|
|
47
|
+
temperature?: number;
|
|
48
|
+
top_p?: number;
|
|
49
|
+
top_k?: number;
|
|
50
|
+
num_predict?: number;
|
|
51
|
+
stop?: string[];
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Ollama chat response
|
|
56
|
+
*/
|
|
57
|
+
export interface OllamaChatResponse {
|
|
58
|
+
model: string;
|
|
59
|
+
created_at: string;
|
|
60
|
+
message: OllamaMessage;
|
|
61
|
+
done: boolean;
|
|
62
|
+
total_duration?: number;
|
|
63
|
+
load_duration?: number;
|
|
64
|
+
prompt_eval_count?: number;
|
|
65
|
+
prompt_eval_duration?: number;
|
|
66
|
+
eval_count?: number;
|
|
67
|
+
eval_duration?: number;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Ollama generate request (for completions)
|
|
71
|
+
*/
|
|
72
|
+
export interface OllamaGenerateRequest {
|
|
73
|
+
model: string;
|
|
74
|
+
prompt: string;
|
|
75
|
+
stream?: boolean;
|
|
76
|
+
format?: 'json';
|
|
77
|
+
options?: {
|
|
78
|
+
temperature?: number;
|
|
79
|
+
top_p?: number;
|
|
80
|
+
top_k?: number;
|
|
81
|
+
num_predict?: number;
|
|
82
|
+
stop?: string[];
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Ollama generate response
|
|
87
|
+
*/
|
|
88
|
+
export interface OllamaGenerateResponse {
|
|
89
|
+
model: string;
|
|
90
|
+
created_at: string;
|
|
91
|
+
response: string;
|
|
92
|
+
done: boolean;
|
|
93
|
+
total_duration?: number;
|
|
94
|
+
load_duration?: number;
|
|
95
|
+
prompt_eval_count?: number;
|
|
96
|
+
prompt_eval_duration?: number;
|
|
97
|
+
eval_count?: number;
|
|
98
|
+
eval_duration?: number;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Wraps an Ollama client with AxonFlow governance.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```typescript
|
|
105
|
+
* import Ollama from 'ollama';
|
|
106
|
+
* import { AxonFlow, wrapOllamaClient } from '@axonflow/sdk';
|
|
107
|
+
*
|
|
108
|
+
* const ollama = new Ollama({ host: 'http://localhost:11434' });
|
|
109
|
+
* const axonflow = new AxonFlow({ endpoint: 'http://localhost:8080' });
|
|
110
|
+
*
|
|
111
|
+
* const wrapped = wrapOllamaClient(ollama, axonflow);
|
|
112
|
+
*
|
|
113
|
+
* // Chat API
|
|
114
|
+
* const chatResponse = await wrapped.chat({
|
|
115
|
+
* model: 'llama2',
|
|
116
|
+
* messages: [{ role: 'user', content: 'What is AI governance?' }]
|
|
117
|
+
* });
|
|
118
|
+
*
|
|
119
|
+
* // Generate API
|
|
120
|
+
* const genResponse = await wrapped.generate({
|
|
121
|
+
* model: 'llama2',
|
|
122
|
+
* prompt: 'What is AI governance?'
|
|
123
|
+
* });
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
export declare function wrapOllamaClient(ollamaClient: any, axonflow: any): any;
|
|
127
|
+
/**
|
|
128
|
+
* Creates a governed Ollama chat function.
|
|
129
|
+
*
|
|
130
|
+
* Use this when you want fine-grained control over individual calls
|
|
131
|
+
* rather than wrapping the entire client.
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* ```typescript
|
|
135
|
+
* const governedChat = createGovernedOllamaChat(ollamaClient, axonflow, 'user-123');
|
|
136
|
+
* const response = await governedChat({
|
|
137
|
+
* model: 'llama2',
|
|
138
|
+
* messages: [{ role: 'user', content: 'Hello!' }]
|
|
139
|
+
* });
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
export declare function createGovernedOllamaChat(ollamaClient: any, axonflow: any, userToken?: string): (request: OllamaChatRequest) => Promise<OllamaChatResponse>;
|
|
143
|
+
//# sourceMappingURL=ollama.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../src/interceptors/ollama.ts"],"names":[],"mappings":"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"}
|