ai-requests-adapter 1.0.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/README.md +171 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/package.json +41 -0
package/README.md
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# AI Requests Adapter
|
|
2
|
+
|
|
3
|
+
A flexible and extensible SDK for handling AI API requests across multiple providers. This adapter provides a unified interface for interacting with different AI services, making it easy to switch between providers or use multiple providers in the same application.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install ai-requests-adapter
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { AIRequestsAdapter, createAIAdapter } from 'ai-requests-adapter';
|
|
15
|
+
|
|
16
|
+
// Create an adapter instance
|
|
17
|
+
const adapter = createAIAdapter();
|
|
18
|
+
|
|
19
|
+
// Register a provider (you'll need to implement the AIProvider interface)
|
|
20
|
+
adapter.registerProvider('my-provider', myProviderImplementation, true);
|
|
21
|
+
|
|
22
|
+
// Send a request
|
|
23
|
+
const response = await adapter.sendRequest({
|
|
24
|
+
messages: [
|
|
25
|
+
{ role: 'user', content: 'Hello, how are you?' }
|
|
26
|
+
],
|
|
27
|
+
model: 'gpt-3.5-turbo',
|
|
28
|
+
temperature: 0.7
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
console.log(response.content);
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## API Reference
|
|
35
|
+
|
|
36
|
+
### AIRequestsAdapter
|
|
37
|
+
|
|
38
|
+
The main class for managing AI providers and sending requests.
|
|
39
|
+
|
|
40
|
+
#### Methods
|
|
41
|
+
|
|
42
|
+
- `registerProvider(name: string, provider: AIProvider, setAsDefault?: boolean)`: Register an AI provider
|
|
43
|
+
- `sendRequest(request: AIRequest): Promise<AIResponse>`: Send a request using the default provider
|
|
44
|
+
- `sendRequestWithProvider(providerName: string, request: AIRequest): Promise<AIResponse>`: Send a request using a specific provider
|
|
45
|
+
- `getProviders(): string[]`: Get list of registered provider names
|
|
46
|
+
- `setDefaultProvider(name: string)`: Set the default provider
|
|
47
|
+
- `getDefaultProvider(): string | undefined`: Get the current default provider
|
|
48
|
+
|
|
49
|
+
### Interfaces
|
|
50
|
+
|
|
51
|
+
#### AIRequest
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
interface AIRequest {
|
|
55
|
+
messages: Array<{
|
|
56
|
+
role: 'user' | 'assistant' | 'system';
|
|
57
|
+
content: string;
|
|
58
|
+
}>;
|
|
59
|
+
model?: string;
|
|
60
|
+
temperature?: number;
|
|
61
|
+
maxTokens?: number;
|
|
62
|
+
[key: string]: any; // Allow additional provider-specific options
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
#### AIResponse
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
interface AIResponse {
|
|
70
|
+
content: string;
|
|
71
|
+
model: string;
|
|
72
|
+
usage?: {
|
|
73
|
+
promptTokens?: number;
|
|
74
|
+
completionTokens?: number;
|
|
75
|
+
totalTokens?: number;
|
|
76
|
+
};
|
|
77
|
+
metadata?: Record<string, any>;
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
#### AIProvider
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
interface AIProvider {
|
|
85
|
+
name: string;
|
|
86
|
+
sendRequest(request: AIRequest): Promise<AIResponse>;
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Implementing a Provider
|
|
91
|
+
|
|
92
|
+
To integrate with a specific AI provider, implement the `AIProvider` interface:
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
import { AIProvider, AIRequest, AIResponse } from 'ai-requests-adapter';
|
|
96
|
+
|
|
97
|
+
class OpenAIProvider implements AIProvider {
|
|
98
|
+
name = 'openai';
|
|
99
|
+
|
|
100
|
+
async sendRequest(request: AIRequest): Promise<AIResponse> {
|
|
101
|
+
// Your OpenAI API implementation here
|
|
102
|
+
const response = await fetch('https://api.openai.com/v1/chat/completions', {
|
|
103
|
+
method: 'POST',
|
|
104
|
+
headers: {
|
|
105
|
+
'Authorization': `Bearer ${process.env.OPENAI_API_KEY}`,
|
|
106
|
+
'Content-Type': 'application/json',
|
|
107
|
+
},
|
|
108
|
+
body: JSON.stringify({
|
|
109
|
+
model: request.model || 'gpt-3.5-turbo',
|
|
110
|
+
messages: request.messages,
|
|
111
|
+
temperature: request.temperature,
|
|
112
|
+
max_tokens: request.maxTokens,
|
|
113
|
+
}),
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
const data = await response.json();
|
|
117
|
+
|
|
118
|
+
return {
|
|
119
|
+
content: data.choices[0].message.content,
|
|
120
|
+
model: data.model,
|
|
121
|
+
usage: {
|
|
122
|
+
promptTokens: data.usage.prompt_tokens,
|
|
123
|
+
completionTokens: data.usage.completion_tokens,
|
|
124
|
+
totalTokens: data.usage.total_tokens,
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Register the provider
|
|
131
|
+
const adapter = createAIAdapter();
|
|
132
|
+
adapter.registerProvider('openai', new OpenAIProvider());
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Advanced Usage
|
|
136
|
+
|
|
137
|
+
### Multiple Providers
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
const adapter = createAIAdapter();
|
|
141
|
+
|
|
142
|
+
// Register multiple providers
|
|
143
|
+
adapter.registerProvider('openai', openAIProvider);
|
|
144
|
+
adapter.registerProvider('anthropic', anthropicProvider, true); // Set as default
|
|
145
|
+
|
|
146
|
+
// Use specific provider
|
|
147
|
+
const openAIResponse = await adapter.sendRequestWithProvider('openai', request);
|
|
148
|
+
const anthropicResponse = await adapter.sendRequest(request); // Uses default (anthropic)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Switching Providers Dynamically
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
const adapter = createAIAdapter();
|
|
155
|
+
adapter.registerProvider('openai', openAIProvider);
|
|
156
|
+
adapter.registerProvider('anthropic', anthropicProvider);
|
|
157
|
+
|
|
158
|
+
// Switch default provider
|
|
159
|
+
adapter.setDefaultProvider('anthropic');
|
|
160
|
+
|
|
161
|
+
// All subsequent requests use anthropic
|
|
162
|
+
const response = await adapter.sendRequest(request);
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Contributing
|
|
166
|
+
|
|
167
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
168
|
+
|
|
169
|
+
## License
|
|
170
|
+
|
|
171
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface AIRequest {
|
|
2
|
+
messages: Array<{
|
|
3
|
+
role: 'user' | 'assistant' | 'system';
|
|
4
|
+
content: string;
|
|
5
|
+
}>;
|
|
6
|
+
model?: string;
|
|
7
|
+
temperature?: number;
|
|
8
|
+
maxTokens?: number;
|
|
9
|
+
[key: string]: any;
|
|
10
|
+
}
|
|
11
|
+
export interface AIResponse {
|
|
12
|
+
content: string;
|
|
13
|
+
model: string;
|
|
14
|
+
usage?: {
|
|
15
|
+
promptTokens?: number;
|
|
16
|
+
completionTokens?: number;
|
|
17
|
+
totalTokens?: number;
|
|
18
|
+
};
|
|
19
|
+
metadata?: Record<string, any>;
|
|
20
|
+
}
|
|
21
|
+
export interface AIProvider {
|
|
22
|
+
name: string;
|
|
23
|
+
sendRequest(request: AIRequest): Promise<AIResponse>;
|
|
24
|
+
}
|
|
25
|
+
export declare class AIRequestsAdapter {
|
|
26
|
+
private providers;
|
|
27
|
+
private defaultProvider?;
|
|
28
|
+
registerProvider(name: string, provider: AIProvider, setAsDefault?: boolean): void;
|
|
29
|
+
sendRequest(request: AIRequest): Promise<AIResponse>;
|
|
30
|
+
sendRequestWithProvider(providerName: string, request: AIRequest): Promise<AIResponse>;
|
|
31
|
+
getProviders(): string[];
|
|
32
|
+
setDefaultProvider(name: string): void;
|
|
33
|
+
getDefaultProvider(): string | undefined;
|
|
34
|
+
}
|
|
35
|
+
export default AIRequestsAdapter;
|
|
36
|
+
export declare function createAIAdapter(): AIRequestsAdapter;
|
|
37
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;QACtC,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE;QACN,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACtD;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,eAAe,CAAC,CAAS;IAKjC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,UAAQ,GAAG,IAAI;IAU1E,WAAW,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IAUpD,uBAAuB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IAW5F,YAAY,IAAI,MAAM,EAAE;IAOxB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAUtC,kBAAkB,IAAI,MAAM,GAAG,SAAS;CAGzC;AAGD,eAAe,iBAAiB,CAAC;AAGjC,wBAAgB,eAAe,IAAI,iBAAiB,CAEnD"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AIRequestsAdapter = void 0;
|
|
4
|
+
exports.createAIAdapter = createAIAdapter;
|
|
5
|
+
class AIRequestsAdapter {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.providers = new Map();
|
|
8
|
+
}
|
|
9
|
+
registerProvider(name, provider, setAsDefault = false) {
|
|
10
|
+
this.providers.set(name, provider);
|
|
11
|
+
if (setAsDefault || !this.defaultProvider) {
|
|
12
|
+
this.defaultProvider = name;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async sendRequest(request) {
|
|
16
|
+
if (!this.defaultProvider) {
|
|
17
|
+
throw new Error('No default provider set. Register a provider first.');
|
|
18
|
+
}
|
|
19
|
+
return this.sendRequestWithProvider(this.defaultProvider, request);
|
|
20
|
+
}
|
|
21
|
+
async sendRequestWithProvider(providerName, request) {
|
|
22
|
+
const provider = this.providers.get(providerName);
|
|
23
|
+
if (!provider) {
|
|
24
|
+
throw new Error(`Provider '${providerName}' not found. Available providers: ${Array.from(this.providers.keys()).join(', ')}`);
|
|
25
|
+
}
|
|
26
|
+
return provider.sendRequest(request);
|
|
27
|
+
}
|
|
28
|
+
getProviders() {
|
|
29
|
+
return Array.from(this.providers.keys());
|
|
30
|
+
}
|
|
31
|
+
setDefaultProvider(name) {
|
|
32
|
+
if (!this.providers.has(name)) {
|
|
33
|
+
throw new Error(`Provider '${name}' not found.`);
|
|
34
|
+
}
|
|
35
|
+
this.defaultProvider = name;
|
|
36
|
+
}
|
|
37
|
+
getDefaultProvider() {
|
|
38
|
+
return this.defaultProvider;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.AIRequestsAdapter = AIRequestsAdapter;
|
|
42
|
+
exports.default = AIRequestsAdapter;
|
|
43
|
+
function createAIAdapter() {
|
|
44
|
+
return new AIRequestsAdapter();
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AA2FA,0CAEC;AAlED,MAAa,iBAAiB;IAA9B;QACU,cAAS,GAA4B,IAAI,GAAG,EAAE,CAAC;IAyDzD,CAAC;IAnDC,gBAAgB,CAAC,IAAY,EAAE,QAAoB,EAAE,YAAY,GAAG,KAAK;QACvE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACnC,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;IAKD,KAAK,CAAC,WAAW,CAAC,OAAkB;QAClC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;IAKD,KAAK,CAAC,uBAAuB,CAAC,YAAoB,EAAE,OAAkB;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,aAAa,YAAY,qCAAqC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChI,CAAC;QACD,OAAO,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAKD,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAKD,kBAAkB,CAAC,IAAY;QAC7B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,cAAc,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;IAC9B,CAAC;IAKD,kBAAkB;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;CACF;AA1DD,8CA0DC;AAGD,kBAAe,iBAAiB,CAAC;AAGjC,SAAgB,eAAe;IAC7B,OAAO,IAAI,iBAAiB,EAAE,CAAC;AACjC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ai-requests-adapter",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A flexible adapter SDK for handling AI API requests across multiple providers",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"prepublishOnly": "npm run build",
|
|
13
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"ai",
|
|
17
|
+
"api",
|
|
18
|
+
"adapter",
|
|
19
|
+
"requests",
|
|
20
|
+
"openai",
|
|
21
|
+
"anthropic",
|
|
22
|
+
"sdk"
|
|
23
|
+
],
|
|
24
|
+
"author": "Your Name",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"typescript": "^5.0.0",
|
|
28
|
+
"@types/node": "^20.0.0"
|
|
29
|
+
},
|
|
30
|
+
"engines": {
|
|
31
|
+
"node": ">=14.0.0"
|
|
32
|
+
},
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "git+https://github.com/yourusername/ai-requests-adapter.git"
|
|
36
|
+
},
|
|
37
|
+
"bugs": {
|
|
38
|
+
"url": "https://github.com/yourusername/ai-requests-adapter/issues"
|
|
39
|
+
},
|
|
40
|
+
"homepage": "https://github.com/yourusername/ai-requests-adapter#readme"
|
|
41
|
+
}
|