@memberjunction/ai-groq 4.0.0 → 4.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/README.md +89 -0
- package/package.json +3 -3
- package/readme.md +54 -257
package/README.md
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# @memberjunction/ai-groq
|
|
2
|
+
|
|
3
|
+
MemberJunction AI provider for Groq's ultra-fast inference platform. This package extends the OpenAI provider to work with Groq's OpenAI-compatible API, providing access to LLM inference powered by Groq's custom Language Processing Units (LPUs) for industry-leading inference speed.
|
|
4
|
+
|
|
5
|
+
## Architecture
|
|
6
|
+
|
|
7
|
+
```mermaid
|
|
8
|
+
graph TD
|
|
9
|
+
A["GroqLLM<br/>(Provider)"] -->|extends| B["OpenAILLM<br/>(@memberjunction/ai-openai)"]
|
|
10
|
+
B -->|extends| C["BaseLLM<br/>(@memberjunction/ai)"]
|
|
11
|
+
A -->|overrides base URL| D["Groq API<br/>(api.groq.com/openai/v1)"]
|
|
12
|
+
D -->|runs on| E["Groq LPU<br/>Inference Engine"]
|
|
13
|
+
C -->|registered via| F["@RegisterClass"]
|
|
14
|
+
|
|
15
|
+
style A fill:#7c5295,stroke:#563a6b,color:#fff
|
|
16
|
+
style B fill:#2d6a9f,stroke:#1a4971,color:#fff
|
|
17
|
+
style C fill:#2d6a9f,stroke:#1a4971,color:#fff
|
|
18
|
+
style D fill:#2d8659,stroke:#1a5c3a,color:#fff
|
|
19
|
+
style E fill:#b8762f,stroke:#8a5722,color:#fff
|
|
20
|
+
style F fill:#b8762f,stroke:#8a5722,color:#fff
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Features
|
|
24
|
+
|
|
25
|
+
- **Ultra-Fast Inference**: Groq's custom LPU hardware delivers extremely low latency
|
|
26
|
+
- **OpenAI Compatible**: Inherits all features from the OpenAI provider
|
|
27
|
+
- **Streaming**: Full streaming support for real-time responses
|
|
28
|
+
- **Thinking/Reasoning**: Thinking block extraction for reasoning models
|
|
29
|
+
- **Multiple Models**: Access to Llama, Mixtral, Gemma, and other open models optimized for Groq
|
|
30
|
+
|
|
31
|
+
## Installation
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm install @memberjunction/ai-groq
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Usage
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
import { GroqLLM } from '@memberjunction/ai-groq';
|
|
41
|
+
|
|
42
|
+
const llm = new GroqLLM('your-groq-api-key');
|
|
43
|
+
|
|
44
|
+
const result = await llm.ChatCompletion({
|
|
45
|
+
model: 'llama-3.1-70b-versatile',
|
|
46
|
+
messages: [
|
|
47
|
+
{ role: 'system', content: 'You are a helpful assistant.' },
|
|
48
|
+
{ role: 'user', content: 'Explain neural networks.' }
|
|
49
|
+
],
|
|
50
|
+
temperature: 0.7,
|
|
51
|
+
maxOutputTokens: 1000
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
if (result.success) {
|
|
55
|
+
console.log(result.data.choices[0].message.content);
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Streaming
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
const result = await llm.ChatCompletion({
|
|
63
|
+
model: 'llama-3.1-8b-instant',
|
|
64
|
+
messages: [{ role: 'user', content: 'Write a haiku about speed.' }],
|
|
65
|
+
streaming: true,
|
|
66
|
+
streamingCallbacks: {
|
|
67
|
+
OnContent: (content) => process.stdout.write(content),
|
|
68
|
+
OnComplete: () => console.log('\nDone!')
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## How It Works
|
|
74
|
+
|
|
75
|
+
`GroqLLM` is a thin subclass of `OpenAILLM` that redirects API calls to Groq's endpoint at `https://api.groq.com/openai/v1`. Since Groq implements an OpenAI-compatible API, all chat, streaming, and parameter handling logic is inherited from the OpenAI provider.
|
|
76
|
+
|
|
77
|
+
## Supported Parameters
|
|
78
|
+
|
|
79
|
+
All parameters supported by the OpenAI provider are available, including `temperature`, `maxOutputTokens`, `topP`, `frequencyPenalty`, `presencePenalty`, `seed`, `stopSequences`, and `responseFormat`.
|
|
80
|
+
|
|
81
|
+
## Class Registration
|
|
82
|
+
|
|
83
|
+
Registered as `GroqLLM` via `@RegisterClass(BaseLLM, 'GroqLLM')`.
|
|
84
|
+
|
|
85
|
+
## Dependencies
|
|
86
|
+
|
|
87
|
+
- `@memberjunction/ai` - Core AI abstractions
|
|
88
|
+
- `@memberjunction/ai-openai` - OpenAI provider (parent class)
|
|
89
|
+
- `@memberjunction/global` - Class registration
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ai-groq",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "4.
|
|
4
|
+
"version": "4.2.0",
|
|
5
5
|
"description": "MemberJunction Wrapper for Groq AI LPU inference engine",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
"typescript": "^5.9.3"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@memberjunction/ai": "4.
|
|
24
|
-
"@memberjunction/global": "4.
|
|
23
|
+
"@memberjunction/ai": "4.2.0",
|
|
24
|
+
"@memberjunction/global": "4.2.0",
|
|
25
25
|
"groq-sdk": "^0.37.0"
|
|
26
26
|
},
|
|
27
27
|
"repository": {
|
package/readme.md
CHANGED
|
@@ -1,18 +1,32 @@
|
|
|
1
1
|
# @memberjunction/ai-groq
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
MemberJunction AI provider for Groq's ultra-fast inference platform. This package extends the OpenAI provider to work with Groq's OpenAI-compatible API, providing access to LLM inference powered by Groq's custom Language Processing Units (LPUs) for industry-leading inference speed.
|
|
4
|
+
|
|
5
|
+
## Architecture
|
|
6
|
+
|
|
7
|
+
```mermaid
|
|
8
|
+
graph TD
|
|
9
|
+
A["GroqLLM<br/>(Provider)"] -->|extends| B["OpenAILLM<br/>(@memberjunction/ai-openai)"]
|
|
10
|
+
B -->|extends| C["BaseLLM<br/>(@memberjunction/ai)"]
|
|
11
|
+
A -->|overrides base URL| D["Groq API<br/>(api.groq.com/openai/v1)"]
|
|
12
|
+
D -->|runs on| E["Groq LPU<br/>Inference Engine"]
|
|
13
|
+
C -->|registered via| F["@RegisterClass"]
|
|
14
|
+
|
|
15
|
+
style A fill:#7c5295,stroke:#563a6b,color:#fff
|
|
16
|
+
style B fill:#2d6a9f,stroke:#1a4971,color:#fff
|
|
17
|
+
style C fill:#2d6a9f,stroke:#1a4971,color:#fff
|
|
18
|
+
style D fill:#2d8659,stroke:#1a5c3a,color:#fff
|
|
19
|
+
style E fill:#b8762f,stroke:#8a5722,color:#fff
|
|
20
|
+
style F fill:#b8762f,stroke:#8a5722,color:#fff
|
|
21
|
+
```
|
|
4
22
|
|
|
5
23
|
## Features
|
|
6
24
|
|
|
7
|
-
- **
|
|
8
|
-
- **
|
|
9
|
-
- **Streaming
|
|
10
|
-
- **
|
|
11
|
-
- **
|
|
12
|
-
- **Token Usage Tracking**: Track token consumption for monitoring
|
|
13
|
-
- **Chat Completion**: Interactive chat completions with various LLMs hosted on Groq
|
|
14
|
-
- **Model Support**: Compatible with Llama, Mixtral, Gemma, and other models hosted on Groq
|
|
15
|
-
- **Response Format Control**: Support for JSON, text, and model-specific response formats
|
|
25
|
+
- **Ultra-Fast Inference**: Groq's custom LPU hardware delivers extremely low latency
|
|
26
|
+
- **OpenAI Compatible**: Inherits all features from the OpenAI provider
|
|
27
|
+
- **Streaming**: Full streaming support for real-time responses
|
|
28
|
+
- **Thinking/Reasoning**: Thinking block extraction for reasoning models
|
|
29
|
+
- **Multiple Models**: Access to Llama, Mixtral, Gemma, and other open models optimized for Groq
|
|
16
30
|
|
|
17
31
|
## Installation
|
|
18
32
|
|
|
@@ -20,273 +34,56 @@ A comprehensive wrapper for Groq's LPU (Language Processing Unit) inference engi
|
|
|
20
34
|
npm install @memberjunction/ai-groq
|
|
21
35
|
```
|
|
22
36
|
|
|
23
|
-
## Requirements
|
|
24
|
-
|
|
25
|
-
- Node.js 16+
|
|
26
|
-
- A Groq API key
|
|
27
|
-
- MemberJunction Core libraries
|
|
28
|
-
|
|
29
37
|
## Usage
|
|
30
38
|
|
|
31
|
-
### Basic Setup
|
|
32
|
-
|
|
33
39
|
```typescript
|
|
34
40
|
import { GroqLLM } from '@memberjunction/ai-groq';
|
|
35
41
|
|
|
36
|
-
|
|
37
|
-
const groqLLM = new GroqLLM('your-groq-api-key');
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
### Chat Completion
|
|
41
|
-
|
|
42
|
-
```typescript
|
|
43
|
-
import { ChatParams } from '@memberjunction/ai';
|
|
44
|
-
|
|
45
|
-
// Create chat parameters
|
|
46
|
-
const chatParams: ChatParams = {
|
|
47
|
-
model: 'llama2-70b-4096', // or other models like 'mixtral-8x7b-32768'
|
|
48
|
-
messages: [
|
|
49
|
-
{ role: 'system', content: 'You are a helpful AI assistant.' },
|
|
50
|
-
{ role: 'user', content: 'Explain how LPUs differ from traditional GPUs for AI inference.' }
|
|
51
|
-
],
|
|
52
|
-
temperature: 0.7,
|
|
53
|
-
maxOutputTokens: 1000
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
// Get a response
|
|
57
|
-
try {
|
|
58
|
-
const response = await groqLLM.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
|
-
console.log('Time Elapsed (ms):', response.timeElapsed);
|
|
63
|
-
} else {
|
|
64
|
-
console.error('Error:', response.errorMessage);
|
|
65
|
-
}
|
|
66
|
-
} catch (error) {
|
|
67
|
-
console.error('Exception:', error);
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### Streaming Responses
|
|
72
|
-
|
|
73
|
-
```typescript
|
|
74
|
-
import { ChatParams, ChatResult } from '@memberjunction/ai';
|
|
75
|
-
|
|
76
|
-
// Enable streaming in the chat parameters
|
|
77
|
-
const streamingParams: ChatParams = {
|
|
78
|
-
model: 'llama3-70b-8192',
|
|
79
|
-
messages: [
|
|
80
|
-
{ role: 'user', content: 'Write a short story about AI.' }
|
|
81
|
-
],
|
|
82
|
-
stream: true,
|
|
83
|
-
onStream: (content: string) => {
|
|
84
|
-
// Handle each chunk of streamed content
|
|
85
|
-
process.stdout.write(content);
|
|
86
|
-
},
|
|
87
|
-
maxOutputTokens: 2000
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
// The response will stream to the onStream callback
|
|
91
|
-
const response = await groqLLM.ChatCompletion(streamingParams);
|
|
92
|
-
console.log('\n\nFinal response:', response.data.choices[0].message.content);
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
### Response Format Control
|
|
96
|
-
|
|
97
|
-
```typescript
|
|
98
|
-
// Request JSON formatted response
|
|
99
|
-
const jsonParams: ChatParams = {
|
|
100
|
-
model: 'mixtral-8x7b-32768',
|
|
101
|
-
messages: [
|
|
102
|
-
{ role: 'system', content: 'You are a helpful assistant that responds in JSON format.' },
|
|
103
|
-
{ role: 'user', content: 'List 3 benefits of using Groq in JSON format with keys: benefit, description' }
|
|
104
|
-
],
|
|
105
|
-
responseFormat: 'JSON',
|
|
106
|
-
maxOutputTokens: 1000
|
|
107
|
-
};
|
|
42
|
+
const llm = new GroqLLM('your-groq-api-key');
|
|
108
43
|
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
const groqClient = groqLLM.GroqClient;
|
|
118
|
-
// or use the alias
|
|
119
|
-
const client = groqLLM.client;
|
|
120
|
-
|
|
121
|
-
// Use the client directly if needed
|
|
122
|
-
const customResponse = await groqClient.chat.completions.create({
|
|
123
|
-
model: 'mixtral-8x7b-32768',
|
|
124
|
-
messages: [{ role: 'user', content: 'Hello!' }],
|
|
125
|
-
max_tokens: 500
|
|
44
|
+
const result = await llm.ChatCompletion({
|
|
45
|
+
model: 'llama-3.1-70b-versatile',
|
|
46
|
+
messages: [
|
|
47
|
+
{ role: 'system', content: 'You are a helpful assistant.' },
|
|
48
|
+
{ role: 'user', content: 'Explain neural networks.' }
|
|
49
|
+
],
|
|
50
|
+
temperature: 0.7,
|
|
51
|
+
maxOutputTokens: 1000
|
|
126
52
|
});
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
## Supported Models
|
|
130
|
-
|
|
131
|
-
Groq provides access to various open models with optimized inference:
|
|
132
|
-
|
|
133
|
-
- **Llama Models**:
|
|
134
|
-
- `llama3-70b-8192` - Llama 3 70B with 8K context
|
|
135
|
-
- `llama3-8b-8192` - Llama 3 8B with 8K context
|
|
136
|
-
- `llama2-70b-4096` - Llama 2 70B with 4K context
|
|
137
|
-
|
|
138
|
-
- **Mixtral Models**:
|
|
139
|
-
- `mixtral-8x7b-32768` - Mixtral 8x7B with 32K context
|
|
140
|
-
|
|
141
|
-
- **Gemma Models**:
|
|
142
|
-
- `gemma-7b-it` - Gemma 7B Instruct
|
|
143
|
-
- `gemma2-9b-it` - Gemma 2 9B Instruct
|
|
144
|
-
|
|
145
|
-
Check the [Groq documentation](https://console.groq.com/docs/models) for the latest list of supported models and their capabilities.
|
|
146
|
-
|
|
147
|
-
## API Reference
|
|
148
|
-
|
|
149
|
-
### GroqLLM Class
|
|
150
|
-
|
|
151
|
-
A class that extends BaseLLM to provide Groq-specific functionality.
|
|
152
|
-
|
|
153
|
-
#### Constructor
|
|
154
|
-
|
|
155
|
-
```typescript
|
|
156
|
-
new GroqLLM(apiKey: string)
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
#### Properties
|
|
160
|
-
|
|
161
|
-
- `GroqClient`: (read-only) Returns the underlying Groq client instance
|
|
162
|
-
- `client`: (read-only) Alias for GroqClient
|
|
163
|
-
- `SupportsStreaming`: (read-only) Returns `true` - Groq supports streaming responses
|
|
164
|
-
|
|
165
|
-
#### Methods
|
|
166
53
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
ChatCompletion(params: ChatParams): Promise<ChatResult>
|
|
170
|
-
```
|
|
171
|
-
Perform a chat completion with support for both streaming and non-streaming responses.
|
|
172
|
-
|
|
173
|
-
##### SummarizeText
|
|
174
|
-
```typescript
|
|
175
|
-
SummarizeText(params: SummarizeParams): Promise<SummarizeResult>
|
|
176
|
-
```
|
|
177
|
-
*Note: Not yet implemented*
|
|
178
|
-
|
|
179
|
-
##### ClassifyText
|
|
180
|
-
```typescript
|
|
181
|
-
ClassifyText(params: ClassifyParams): Promise<ClassifyResult>
|
|
182
|
-
```
|
|
183
|
-
*Note: Not yet implemented*
|
|
184
|
-
|
|
185
|
-
## Performance Considerations
|
|
186
|
-
|
|
187
|
-
Groq is known for its extremely fast inference times:
|
|
188
|
-
|
|
189
|
-
- Response generation is typically 5-10x faster than traditional GPU-based inference
|
|
190
|
-
- Lower latency means better interactive experiences
|
|
191
|
-
- Benchmark different models to find the best performance/quality balance for your use case
|
|
192
|
-
|
|
193
|
-
## Error Handling
|
|
194
|
-
|
|
195
|
-
The wrapper provides detailed error information:
|
|
196
|
-
|
|
197
|
-
```typescript
|
|
198
|
-
try {
|
|
199
|
-
const response = await groqLLM.ChatCompletion(params);
|
|
200
|
-
if (!response.success) {
|
|
201
|
-
console.error('Error:', response.errorMessage);
|
|
202
|
-
console.error('Status:', response.statusText);
|
|
203
|
-
console.error('Time Elapsed:', response.timeElapsed, 'ms');
|
|
204
|
-
}
|
|
205
|
-
} catch (error) {
|
|
206
|
-
console.error('Exception occurred:', error);
|
|
54
|
+
if (result.success) {
|
|
55
|
+
console.log(result.data.choices[0].message.content);
|
|
207
56
|
}
|
|
208
57
|
```
|
|
209
58
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
This package seamlessly integrates with the MemberJunction AI framework:
|
|
59
|
+
### Streaming
|
|
213
60
|
|
|
214
61
|
```typescript
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
## Advanced Features
|
|
225
|
-
|
|
226
|
-
### Effort Level Support
|
|
227
|
-
|
|
228
|
-
For models that support reasoning effort levels (experimental):
|
|
229
|
-
|
|
230
|
-
```typescript
|
|
231
|
-
const params: ChatParams = {
|
|
232
|
-
model: 'llama3-70b-8192',
|
|
233
|
-
messages: [{ role: 'user', content: 'Solve this complex problem...' }],
|
|
234
|
-
effortLevel: 'high', // Experimental feature
|
|
235
|
-
maxOutputTokens: 2000
|
|
236
|
-
};
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
### Handling Groq-Specific Requirements
|
|
240
|
-
|
|
241
|
-
The wrapper automatically handles Groq's requirement that the last message must be from a user. If your message chain ends with an assistant message, the wrapper will automatically append a dummy user message to satisfy this requirement.
|
|
242
|
-
|
|
243
|
-
## Dependencies
|
|
244
|
-
|
|
245
|
-
- `groq-sdk` (0.21.0): Official Groq SDK
|
|
246
|
-
- `@memberjunction/ai` (2.43.0): MemberJunction AI core framework
|
|
247
|
-
- `@memberjunction/global` (2.43.0): MemberJunction global utilities
|
|
248
|
-
|
|
249
|
-
## Development
|
|
250
|
-
|
|
251
|
-
### Building
|
|
252
|
-
|
|
253
|
-
```bash
|
|
254
|
-
npm run build
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
### Development Mode
|
|
258
|
-
|
|
259
|
-
```bash
|
|
260
|
-
npm start
|
|
62
|
+
const result = await llm.ChatCompletion({
|
|
63
|
+
model: 'llama-3.1-8b-instant',
|
|
64
|
+
messages: [{ role: 'user', content: 'Write a haiku about speed.' }],
|
|
65
|
+
streaming: true,
|
|
66
|
+
streamingCallbacks: {
|
|
67
|
+
OnContent: (content) => process.stdout.write(content),
|
|
68
|
+
OnComplete: () => console.log('\nDone!')
|
|
69
|
+
}
|
|
70
|
+
});
|
|
261
71
|
```
|
|
262
72
|
|
|
263
|
-
##
|
|
73
|
+
## How It Works
|
|
264
74
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
1. Follow the MemberJunction coding standards
|
|
268
|
-
2. Ensure all TypeScript types are properly defined
|
|
269
|
-
3. Update tests when adding new features
|
|
270
|
-
4. Document any Groq-specific behaviors or limitations
|
|
75
|
+
`GroqLLM` is a thin subclass of `OpenAILLM` that redirects API calls to Groq's endpoint at `https://api.groq.com/openai/v1`. Since Groq implements an OpenAI-compatible API, all chat, streaming, and parameter handling logic is inherited from the OpenAI provider.
|
|
271
76
|
|
|
272
77
|
## Supported Parameters
|
|
273
78
|
|
|
274
|
-
|
|
79
|
+
All parameters supported by the OpenAI provider are available, including `temperature`, `maxOutputTokens`, `topP`, `frequencyPenalty`, `presencePenalty`, `seed`, `stopSequences`, and `responseFormat`.
|
|
275
80
|
|
|
276
|
-
|
|
277
|
-
- `temperature` - Controls randomness in the output (0.0-2.0)
|
|
278
|
-
- `maxOutputTokens` - Maximum number of tokens to generate
|
|
279
|
-
- `topP` - Nucleus sampling threshold (0.0-1.0)
|
|
280
|
-
- `seed` - For deterministic outputs
|
|
281
|
-
- `stopSequences` - Array of sequences where the API will stop generating
|
|
282
|
-
- `frequencyPenalty` - Reduces repetition of token sequences (-2.0 to 2.0)
|
|
283
|
-
- `presencePenalty` - Reduces repetition of specific tokens (-2.0 to 2.0)
|
|
284
|
-
- `responseFormat` - Output format (Text, JSON, etc.)
|
|
81
|
+
## Class Registration
|
|
285
82
|
|
|
286
|
-
|
|
287
|
-
- `topK` - Not available in Groq API
|
|
288
|
-
- `minP` - Not available in Groq API
|
|
83
|
+
Registered as `GroqLLM` via `@RegisterClass(BaseLLM, 'GroqLLM')`.
|
|
289
84
|
|
|
290
|
-
##
|
|
85
|
+
## Dependencies
|
|
291
86
|
|
|
292
|
-
|
|
87
|
+
- `@memberjunction/ai` - Core AI abstractions
|
|
88
|
+
- `@memberjunction/ai-openai` - OpenAI provider (parent class)
|
|
89
|
+
- `@memberjunction/global` - Class registration
|