@memberjunction/ai-openai 2.32.2 → 2.34.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/dist/models/openAI.d.ts +24 -1
- package/dist/models/openAI.d.ts.map +1 -1
- package/dist/models/openAI.js +79 -1
- package/dist/models/openAI.js.map +1 -1
- package/package.json +3 -3
- package/readme.md +188 -2
package/dist/models/openAI.d.ts
CHANGED
|
@@ -11,7 +11,30 @@ export declare class OpenAILLM extends BaseLLM {
|
|
|
11
11
|
* Read only getter method to get the OpenAI instance
|
|
12
12
|
*/
|
|
13
13
|
get OpenAI(): OpenAI;
|
|
14
|
-
|
|
14
|
+
/**
|
|
15
|
+
* OpenAI supports streaming
|
|
16
|
+
*/
|
|
17
|
+
get SupportsStreaming(): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Implementation of non-streaming chat completion for OpenAI
|
|
20
|
+
*/
|
|
21
|
+
protected nonStreamingChatCompletion(params: ChatParams): Promise<ChatResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Create a streaming request for OpenAI
|
|
24
|
+
*/
|
|
25
|
+
protected createStreamingRequest(params: ChatParams): Promise<any>;
|
|
26
|
+
/**
|
|
27
|
+
* Process a streaming chunk from OpenAI
|
|
28
|
+
*/
|
|
29
|
+
protected processStreamingChunk(chunk: any): {
|
|
30
|
+
content: string;
|
|
31
|
+
finishReason?: string;
|
|
32
|
+
usage?: any;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Create the final response from streaming results for OpenAI
|
|
36
|
+
*/
|
|
37
|
+
protected finalizeStreamingResponse(accumulatedContent: string | null | undefined, lastChunk: any | null | undefined, usage: any | null | undefined): ChatResult;
|
|
15
38
|
SummarizeText(params: SummarizeParams): Promise<SummarizeResult>;
|
|
16
39
|
ClassifyText(params: ClassifyParams): Promise<ClassifyResult>;
|
|
17
40
|
ConvertMJToOpenAIChatMessages(messages: ChatMessage[]): ChatCompletionMessageParam[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openAI.d.ts","sourceRoot":"","sources":["../../src/models/openAI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAmB,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAA4C,eAAe,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"openAI.d.ts","sourceRoot":"","sources":["../../src/models/openAI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAmB,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAA4C,eAAe,EAAE,eAAe,EAA0B,MAAM,oBAAoB,CAAC;AACvO,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAE9D;;GAEG;AACH,qBACa,SAAU,SAAQ,OAAO;IAClC,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,MAAM;IAS1B;;OAEG;IACH,IAAW,MAAM,IAAI,MAAM,CAE1B;IAED;;OAEG;IACH,IAAoB,iBAAiB,IAAI,OAAO,CAE/C;IAED;;OAEG;cACa,0BAA0B,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAoDnF;;OAEG;cACa,sBAAsB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAwBxE;;OAEG;IACH,SAAS,CAAC,qBAAqB,CAAC,KAAK,EAAE,GAAG,GAAG;QACzC,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,GAAG,CAAC;KACf;IAgBD;;OAEG;IACH,SAAS,CAAC,yBAAyB,CAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC7C,SAAS,EAAE,GAAG,GAAG,IAAI,GAAG,SAAS,EACjC,KAAK,EAAE,GAAG,GAAG,IAAI,GAAG,SAAS,GAC9B,UAAU;IAiCA,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAmBhE,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAInE,6BAA6B,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,0BAA0B,EAAE;IAU3F;;;;;;;;;OASG;IACI,qBAAqB,CAAC,IAAI,EAAE,MAAM;CAY5C;AAED,wBAAgB,aAAa,SAE5B"}
|
package/dist/models/openAI.js
CHANGED
|
@@ -27,7 +27,16 @@ let OpenAILLM = class OpenAILLM extends ai_1.BaseLLM {
|
|
|
27
27
|
get OpenAI() {
|
|
28
28
|
return this._openAI;
|
|
29
29
|
}
|
|
30
|
-
|
|
30
|
+
/**
|
|
31
|
+
* OpenAI supports streaming
|
|
32
|
+
*/
|
|
33
|
+
get SupportsStreaming() {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Implementation of non-streaming chat completion for OpenAI
|
|
38
|
+
*/
|
|
39
|
+
async nonStreamingChatCompletion(params) {
|
|
31
40
|
const messages = this.ConvertMJToOpenAIChatMessages(params.messages);
|
|
32
41
|
const startTime = new Date();
|
|
33
42
|
const openAIParams = {
|
|
@@ -74,6 +83,75 @@ let OpenAILLM = class OpenAILLM extends ai_1.BaseLLM {
|
|
|
74
83
|
exception: null
|
|
75
84
|
};
|
|
76
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Create a streaming request for OpenAI
|
|
88
|
+
*/
|
|
89
|
+
async createStreamingRequest(params) {
|
|
90
|
+
const messages = this.ConvertMJToOpenAIChatMessages(params.messages);
|
|
91
|
+
const openAIParams = {
|
|
92
|
+
model: params.model,
|
|
93
|
+
messages: messages,
|
|
94
|
+
temperature: params.temperature,
|
|
95
|
+
max_tokens: params.maxOutputTokens,
|
|
96
|
+
stream: true
|
|
97
|
+
};
|
|
98
|
+
// Set response format if specified
|
|
99
|
+
switch (params.responseFormat) {
|
|
100
|
+
case 'JSON':
|
|
101
|
+
openAIParams.response_format = { type: "json_object" };
|
|
102
|
+
break;
|
|
103
|
+
case 'ModelSpecific':
|
|
104
|
+
openAIParams.response_format = params.modelSpecificResponseFormat;
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
return this.OpenAI.chat.completions.create(openAIParams);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Process a streaming chunk from OpenAI
|
|
111
|
+
*/
|
|
112
|
+
processStreamingChunk(chunk) {
|
|
113
|
+
// Handle potential null/undefined values safely
|
|
114
|
+
const content = chunk?.choices?.[0]?.delta?.content || '';
|
|
115
|
+
const usage = chunk?.usage || null;
|
|
116
|
+
return {
|
|
117
|
+
content,
|
|
118
|
+
finishReason: chunk?.choices?.[0]?.finish_reason,
|
|
119
|
+
usage: usage ? {
|
|
120
|
+
promptTokens: usage.prompt_tokens || 0,
|
|
121
|
+
completionTokens: usage.completion_tokens || 0,
|
|
122
|
+
totalTokens: (usage.prompt_tokens || 0) + (usage.completion_tokens || 0)
|
|
123
|
+
} : null
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Create the final response from streaming results for OpenAI
|
|
128
|
+
*/
|
|
129
|
+
finalizeStreamingResponse(accumulatedContent, lastChunk, usage) {
|
|
130
|
+
// Handle possible null/undefined values
|
|
131
|
+
const content = accumulatedContent || '';
|
|
132
|
+
const promptTokens = usage?.promptTokens || 0;
|
|
133
|
+
const completionTokens = usage?.completionTokens || 0;
|
|
134
|
+
// Create dates (will be overridden by base class)
|
|
135
|
+
const now = new Date();
|
|
136
|
+
// Create a proper ChatResult instance with constructor params
|
|
137
|
+
const result = new ai_1.ChatResult(true, now, now);
|
|
138
|
+
// Set all properties
|
|
139
|
+
result.data = {
|
|
140
|
+
choices: [{
|
|
141
|
+
message: {
|
|
142
|
+
role: 'assistant',
|
|
143
|
+
content: content
|
|
144
|
+
},
|
|
145
|
+
finish_reason: lastChunk?.choices?.[0]?.finish_reason || 'stop',
|
|
146
|
+
index: 0
|
|
147
|
+
}],
|
|
148
|
+
usage: new ai_1.ModelUsage(promptTokens, completionTokens)
|
|
149
|
+
};
|
|
150
|
+
result.statusText = 'success';
|
|
151
|
+
result.errorMessage = null;
|
|
152
|
+
result.exception = null;
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
77
155
|
async SummarizeText(params) {
|
|
78
156
|
const messages = this.ConvertMJToOpenAIChatMessages(params.messages);
|
|
79
157
|
const startTime = new Date();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openAI.js","sourceRoot":"","sources":["../../src/models/openAI.ts"],"names":[],"mappings":";;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"openAI.js","sourceRoot":"","sources":["../../src/models/openAI.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ai-openai",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.34.0",
|
|
4
4
|
"description": "MemberJunction Wrapper for OpenAI AI Models",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
"typescript": "^5.4.5"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@memberjunction/ai": "2.
|
|
23
|
-
"@memberjunction/global": "2.
|
|
22
|
+
"@memberjunction/ai": "2.34.0",
|
|
23
|
+
"@memberjunction/global": "2.34.0",
|
|
24
24
|
"openai": "4.83.0"
|
|
25
25
|
}
|
|
26
26
|
}
|
package/readme.md
CHANGED
|
@@ -1,2 +1,188 @@
|
|
|
1
|
-
# @memberjunction/ai-
|
|
2
|
-
|
|
1
|
+
# @memberjunction/ai-openai
|
|
2
|
+
|
|
3
|
+
A comprehensive wrapper for OpenAI's API and models that seamlessly integrates with the MemberJunction AI framework, providing a standardized interface for GPT and other OpenAI models.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **OpenAI Integration**: Full integration with OpenAI's chat completion models
|
|
8
|
+
- **Standardized Interface**: Follows MemberJunction's BaseLLM abstract class for consistency
|
|
9
|
+
- **Message Formatting**: Handles conversion between MemberJunction and OpenAI message formats
|
|
10
|
+
- **Response Format Support**: Support for different response formats (Text, JSON, etc.)
|
|
11
|
+
- **Error Handling**: Comprehensive error handling with detailed reporting
|
|
12
|
+
- **Token Usage Tracking**: Automatic tracking of prompt and completion tokens
|
|
13
|
+
- **Chat Completion**: Chat-based interaction with models like GPT-4 and GPT-3.5
|
|
14
|
+
- **Text Summarization**: Summarize text content using OpenAI models
|
|
15
|
+
|
|
16
|
+
## Installation
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install @memberjunction/ai-openai
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Requirements
|
|
23
|
+
|
|
24
|
+
- Node.js 16+
|
|
25
|
+
- An OpenAI API key
|
|
26
|
+
- MemberJunction Core libraries
|
|
27
|
+
|
|
28
|
+
## Usage
|
|
29
|
+
|
|
30
|
+
### Basic Setup
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
import { OpenAILLM } from '@memberjunction/ai-openai';
|
|
34
|
+
|
|
35
|
+
// Initialize with your API key
|
|
36
|
+
const openAI = new OpenAILLM('your-openai-api-key');
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Chat Completion
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
import { ChatParams } from '@memberjunction/ai';
|
|
43
|
+
|
|
44
|
+
// Create chat parameters
|
|
45
|
+
const chatParams: ChatParams = {
|
|
46
|
+
model: 'gpt-4',
|
|
47
|
+
messages: [
|
|
48
|
+
{ role: 'system', content: 'You are a helpful assistant.' },
|
|
49
|
+
{ role: 'user', content: 'What is machine learning?' }
|
|
50
|
+
],
|
|
51
|
+
temperature: 0.7,
|
|
52
|
+
maxOutputTokens: 500,
|
|
53
|
+
responseFormat: 'Text'
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// Get a response
|
|
57
|
+
try {
|
|
58
|
+
const response = await openAI.ChatCompletion(chatParams);
|
|
59
|
+
if (response.success) {
|
|
60
|
+
console.log('Response:', response.data.choices[0].message.content);
|
|
61
|
+
console.log('Token Usage:', response.data.usage);
|
|
62
|
+
} else {
|
|
63
|
+
console.error('Error:', response.errorMessage);
|
|
64
|
+
}
|
|
65
|
+
} catch (error) {
|
|
66
|
+
console.error('Exception:', error);
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### JSON Response Format
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
const jsonParams: ChatParams = {
|
|
74
|
+
model: 'gpt-4',
|
|
75
|
+
messages: [
|
|
76
|
+
{ role: 'system', content: 'You are a helpful assistant.' },
|
|
77
|
+
{ role: 'user', content: 'Generate a JSON object with name, age, and city for 3 fictional people.' }
|
|
78
|
+
],
|
|
79
|
+
temperature: 0.3,
|
|
80
|
+
maxOutputTokens: 500,
|
|
81
|
+
responseFormat: 'JSON'
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
const jsonResponse = await openAI.ChatCompletion(jsonParams);
|
|
85
|
+
const jsonData = JSON.parse(jsonResponse.data.choices[0].message.content);
|
|
86
|
+
console.log('Structured Data:', jsonData);
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Text Summarization
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
import { SummarizeParams } from '@memberjunction/ai';
|
|
93
|
+
|
|
94
|
+
const text = `Long text that you want to summarize...`;
|
|
95
|
+
|
|
96
|
+
const summarizeParams: SummarizeParams = {
|
|
97
|
+
text: text,
|
|
98
|
+
model: 'gpt-3.5-turbo',
|
|
99
|
+
temperature: 0.3,
|
|
100
|
+
maxWords: 100
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const summary = await openAI.SummarizeText(summarizeParams);
|
|
104
|
+
console.log('Summary:', summary.summary);
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Direct Access to OpenAI Client
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
// Access the underlying OpenAI client for advanced usage
|
|
111
|
+
const openAIClient = openAI.OpenAI;
|
|
112
|
+
|
|
113
|
+
// Use the client directly if needed
|
|
114
|
+
const embeddings = await openAIClient.embeddings.create({
|
|
115
|
+
model: 'text-embedding-ada-002',
|
|
116
|
+
input: 'The quick brown fox jumps over the lazy dog'
|
|
117
|
+
});
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## API Reference
|
|
121
|
+
|
|
122
|
+
### OpenAILLM Class
|
|
123
|
+
|
|
124
|
+
A class that extends BaseLLM to provide OpenAI-specific functionality.
|
|
125
|
+
|
|
126
|
+
#### Constructor
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
new OpenAILLM(apiKey: string)
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
#### Properties
|
|
133
|
+
|
|
134
|
+
- `OpenAI`: (read-only) Returns the underlying OpenAI client instance
|
|
135
|
+
|
|
136
|
+
#### Methods
|
|
137
|
+
|
|
138
|
+
- `ChatCompletion(params: ChatParams): Promise<ChatResult>` - Perform a chat completion
|
|
139
|
+
- `SummarizeText(params: SummarizeParams): Promise<SummarizeResult>` - Summarize text
|
|
140
|
+
- `ClassifyText(params: ClassifyParams): Promise<ClassifyResult>` - Classify text (not implemented)
|
|
141
|
+
- `ConvertMJToOpenAIChatMessages(messages: ChatMessage[]): ChatCompletionMessageParam[]` - Convert MemberJunction messages to OpenAI messages
|
|
142
|
+
- `ConvertMJToOpenAIRole(role: string): string` - Convert MemberJunction roles to OpenAI roles
|
|
143
|
+
|
|
144
|
+
## Response Formats
|
|
145
|
+
|
|
146
|
+
The OpenAILLM class supports various response formats:
|
|
147
|
+
|
|
148
|
+
- `Text`: Regular text responses (default)
|
|
149
|
+
- `JSON`: Structured JSON responses
|
|
150
|
+
- `Markdown`: Markdown-formatted responses
|
|
151
|
+
- `ModelSpecific`: Custom formats supported by specific models
|
|
152
|
+
|
|
153
|
+
Example with JSON response:
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
const params: ChatParams = {
|
|
157
|
+
// ...other parameters
|
|
158
|
+
responseFormat: 'JSON'
|
|
159
|
+
};
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Error Handling
|
|
163
|
+
|
|
164
|
+
The wrapper provides comprehensive error information:
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
try {
|
|
168
|
+
const response = await openAI.ChatCompletion(params);
|
|
169
|
+
if (!response.success) {
|
|
170
|
+
console.error('Error:', response.errorMessage);
|
|
171
|
+
console.error('Status:', response.statusText);
|
|
172
|
+
console.error('Time Elapsed:', response.timeElapsed, 'ms');
|
|
173
|
+
console.error('Exception:', response.exception);
|
|
174
|
+
}
|
|
175
|
+
} catch (error) {
|
|
176
|
+
console.error('Exception occurred:', error);
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Dependencies
|
|
181
|
+
|
|
182
|
+
- `openai`: Official OpenAI Node.js SDK (v4.x)
|
|
183
|
+
- `@memberjunction/ai`: MemberJunction AI core framework
|
|
184
|
+
- `@memberjunction/global`: MemberJunction global utilities
|
|
185
|
+
|
|
186
|
+
## License
|
|
187
|
+
|
|
188
|
+
ISC
|