@vitkuz/vitkuz-chat-gpt-apapter 1.1.0 → 1.2.1
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 +82 -0
- package/dist/index.d.mts +31 -3
- package/dist/index.d.ts +31 -3
- package/dist/index.js +41 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +41 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +13 -3
package/README.md
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# @vitkuz/vitkuz-chat-gpt-apapter
|
|
2
|
+
|
|
3
|
+
A powerful and type-safe ChatGPT adapter for Node.js, featuring default configurations, Zod schema support for structured outputs, and a simplified interface.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Default Configuration**: Set default model, temperature, and schema at the adapter level.
|
|
8
|
+
- **Zod Support**: Get type-safe, parsed results using Zod schemas.
|
|
9
|
+
- **Responses API**: Leverages the latest OpenAI `responses` API for reliable structured outputs.
|
|
10
|
+
- **Model Constants**: Pre-defined constants for popular ChatGPT models.
|
|
11
|
+
- **Simplified Interface**: Cleaner code by reducing repetitive parameters.
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install @vitkuz/vitkuz-chat-gpt-apapter zod
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
### 1. Initialize the Adapter
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { createAdapter, CHAT_GPT_MODELS } from '@vitkuz/vitkuz-chat-gpt-apapter';
|
|
25
|
+
|
|
26
|
+
const adapter = createAdapter({
|
|
27
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
28
|
+
defaults: {
|
|
29
|
+
model: CHAT_GPT_MODELS.GPT_4o_MINI,
|
|
30
|
+
temperature: 0.7,
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### 2. Basic Completion
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
const result = await adapter.createChatCompletion({
|
|
39
|
+
messages: [{ role: 'user', content: 'Hello!' }],
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
console.log(result.choices[0].message.content);
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 3. Structured Outputs with Zod
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
import { z } from 'zod';
|
|
49
|
+
|
|
50
|
+
const UserSchema = z.object({
|
|
51
|
+
name: z.string(),
|
|
52
|
+
age: z.number(),
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
const result = await adapter.createChatCompletion({
|
|
56
|
+
messages: [{ role: 'user', content: 'John is 30 years old.' }],
|
|
57
|
+
schema: UserSchema,
|
|
58
|
+
schemaName: 'user_info'
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
console.log(result.parsed); // Type-safe: { name: 'John', age: 30 }
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Overriding Defaults
|
|
65
|
+
|
|
66
|
+
You can always override the default configuration in any specific call:
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
const result = await adapter.createChatCompletion({
|
|
70
|
+
model: CHAT_GPT_MODELS.GPT_4o, // Use a more powerful model for this specific call
|
|
71
|
+
temperature: 0, // Deterministic output
|
|
72
|
+
messages: [...]
|
|
73
|
+
});
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## API Reference
|
|
77
|
+
|
|
78
|
+
See [docs.md](./docs.md) for detailed information on types and configuration options.
|
|
79
|
+
|
|
80
|
+
## License
|
|
81
|
+
|
|
82
|
+
MIT
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import OpenAI from 'openai';
|
|
2
|
+
import { z } from 'zod';
|
|
2
3
|
|
|
3
4
|
interface Logger {
|
|
4
5
|
debug: (message: string, context?: {
|
|
@@ -7,14 +8,23 @@ interface Logger {
|
|
|
7
8
|
}) => void;
|
|
8
9
|
[key: string]: any;
|
|
9
10
|
}
|
|
11
|
+
interface ChatGptDefaults {
|
|
12
|
+
model?: string;
|
|
13
|
+
temperature?: number;
|
|
14
|
+
response_format?: CreateChatCompletionInput['response_format'];
|
|
15
|
+
schema?: z.ZodType;
|
|
16
|
+
schemaName?: string;
|
|
17
|
+
}
|
|
10
18
|
interface ChatGptConfig {
|
|
11
19
|
apiKey: string;
|
|
12
20
|
organization?: string;
|
|
13
21
|
project?: string;
|
|
22
|
+
defaults?: ChatGptDefaults;
|
|
14
23
|
}
|
|
15
24
|
interface ChatGptContext {
|
|
16
25
|
client: OpenAI;
|
|
17
26
|
logger?: Logger;
|
|
27
|
+
defaults?: ChatGptDefaults;
|
|
18
28
|
}
|
|
19
29
|
type ChatMessageRole = 'system' | 'user' | 'assistant' | 'tool' | 'developer';
|
|
20
30
|
interface ChatMessage {
|
|
@@ -23,7 +33,7 @@ interface ChatMessage {
|
|
|
23
33
|
name?: string;
|
|
24
34
|
}
|
|
25
35
|
interface CreateChatCompletionInput {
|
|
26
|
-
model
|
|
36
|
+
model?: string;
|
|
27
37
|
messages: ChatMessage[];
|
|
28
38
|
temperature?: number;
|
|
29
39
|
max_tokens?: number;
|
|
@@ -38,6 +48,8 @@ interface CreateChatCompletionInput {
|
|
|
38
48
|
schema: Record<string, any>;
|
|
39
49
|
};
|
|
40
50
|
};
|
|
51
|
+
schema?: z.ZodType;
|
|
52
|
+
schemaName?: string;
|
|
41
53
|
stop?: string | string[];
|
|
42
54
|
}
|
|
43
55
|
interface CreateChatCompletionOutput {
|
|
@@ -47,9 +59,14 @@ interface CreateChatCompletionOutput {
|
|
|
47
59
|
model: string;
|
|
48
60
|
choices: {
|
|
49
61
|
index: number;
|
|
50
|
-
message: ChatMessage
|
|
62
|
+
message: ChatMessage & {
|
|
63
|
+
parsed?: any;
|
|
64
|
+
refusal?: string;
|
|
65
|
+
};
|
|
51
66
|
finish_reason: string;
|
|
52
67
|
}[];
|
|
68
|
+
parsed?: any;
|
|
69
|
+
refusal?: string;
|
|
53
70
|
usage?: {
|
|
54
71
|
prompt_tokens: number;
|
|
55
72
|
completion_tokens: number;
|
|
@@ -66,4 +83,15 @@ interface ChatGptAdapter {
|
|
|
66
83
|
}
|
|
67
84
|
declare const createAdapter: (config: ChatGptConfig, logger?: Logger) => ChatGptAdapter;
|
|
68
85
|
|
|
69
|
-
|
|
86
|
+
declare const CHAT_GPT_MODELS: {
|
|
87
|
+
readonly GPT_4o: "gpt-4o";
|
|
88
|
+
readonly GPT_4o_2024_08_06: "gpt-4o-2024-08-06";
|
|
89
|
+
readonly GPT_4o_MINI: "gpt-4o-mini";
|
|
90
|
+
readonly GPT_4o_MINI_2024_07_18: "gpt-4o-mini-2024-07-18";
|
|
91
|
+
readonly GPT_4_TURBO: "gpt-4-turbo";
|
|
92
|
+
readonly GPT_4: "gpt-4";
|
|
93
|
+
readonly GPT_3_5_TURBO: "gpt-3.5-turbo";
|
|
94
|
+
};
|
|
95
|
+
type ChatGptModel = (typeof CHAT_GPT_MODELS)[keyof typeof CHAT_GPT_MODELS];
|
|
96
|
+
|
|
97
|
+
export { CHAT_GPT_MODELS, type ChatGptAdapter, type ChatGptConfig, type ChatGptContext, type ChatGptDefaults, type ChatGptModel, type ChatMessage, type ChatMessageRole, type CreateChatCompletionInput, type CreateChatCompletionOutput, type Logger, createAdapter, createChatCompletion, createChatGptClient };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import OpenAI from 'openai';
|
|
2
|
+
import { z } from 'zod';
|
|
2
3
|
|
|
3
4
|
interface Logger {
|
|
4
5
|
debug: (message: string, context?: {
|
|
@@ -7,14 +8,23 @@ interface Logger {
|
|
|
7
8
|
}) => void;
|
|
8
9
|
[key: string]: any;
|
|
9
10
|
}
|
|
11
|
+
interface ChatGptDefaults {
|
|
12
|
+
model?: string;
|
|
13
|
+
temperature?: number;
|
|
14
|
+
response_format?: CreateChatCompletionInput['response_format'];
|
|
15
|
+
schema?: z.ZodType;
|
|
16
|
+
schemaName?: string;
|
|
17
|
+
}
|
|
10
18
|
interface ChatGptConfig {
|
|
11
19
|
apiKey: string;
|
|
12
20
|
organization?: string;
|
|
13
21
|
project?: string;
|
|
22
|
+
defaults?: ChatGptDefaults;
|
|
14
23
|
}
|
|
15
24
|
interface ChatGptContext {
|
|
16
25
|
client: OpenAI;
|
|
17
26
|
logger?: Logger;
|
|
27
|
+
defaults?: ChatGptDefaults;
|
|
18
28
|
}
|
|
19
29
|
type ChatMessageRole = 'system' | 'user' | 'assistant' | 'tool' | 'developer';
|
|
20
30
|
interface ChatMessage {
|
|
@@ -23,7 +33,7 @@ interface ChatMessage {
|
|
|
23
33
|
name?: string;
|
|
24
34
|
}
|
|
25
35
|
interface CreateChatCompletionInput {
|
|
26
|
-
model
|
|
36
|
+
model?: string;
|
|
27
37
|
messages: ChatMessage[];
|
|
28
38
|
temperature?: number;
|
|
29
39
|
max_tokens?: number;
|
|
@@ -38,6 +48,8 @@ interface CreateChatCompletionInput {
|
|
|
38
48
|
schema: Record<string, any>;
|
|
39
49
|
};
|
|
40
50
|
};
|
|
51
|
+
schema?: z.ZodType;
|
|
52
|
+
schemaName?: string;
|
|
41
53
|
stop?: string | string[];
|
|
42
54
|
}
|
|
43
55
|
interface CreateChatCompletionOutput {
|
|
@@ -47,9 +59,14 @@ interface CreateChatCompletionOutput {
|
|
|
47
59
|
model: string;
|
|
48
60
|
choices: {
|
|
49
61
|
index: number;
|
|
50
|
-
message: ChatMessage
|
|
62
|
+
message: ChatMessage & {
|
|
63
|
+
parsed?: any;
|
|
64
|
+
refusal?: string;
|
|
65
|
+
};
|
|
51
66
|
finish_reason: string;
|
|
52
67
|
}[];
|
|
68
|
+
parsed?: any;
|
|
69
|
+
refusal?: string;
|
|
53
70
|
usage?: {
|
|
54
71
|
prompt_tokens: number;
|
|
55
72
|
completion_tokens: number;
|
|
@@ -66,4 +83,15 @@ interface ChatGptAdapter {
|
|
|
66
83
|
}
|
|
67
84
|
declare const createAdapter: (config: ChatGptConfig, logger?: Logger) => ChatGptAdapter;
|
|
68
85
|
|
|
69
|
-
|
|
86
|
+
declare const CHAT_GPT_MODELS: {
|
|
87
|
+
readonly GPT_4o: "gpt-4o";
|
|
88
|
+
readonly GPT_4o_2024_08_06: "gpt-4o-2024-08-06";
|
|
89
|
+
readonly GPT_4o_MINI: "gpt-4o-mini";
|
|
90
|
+
readonly GPT_4o_MINI_2024_07_18: "gpt-4o-mini-2024-07-18";
|
|
91
|
+
readonly GPT_4_TURBO: "gpt-4-turbo";
|
|
92
|
+
readonly GPT_4: "gpt-4";
|
|
93
|
+
readonly GPT_3_5_TURBO: "gpt-3.5-turbo";
|
|
94
|
+
};
|
|
95
|
+
type ChatGptModel = (typeof CHAT_GPT_MODELS)[keyof typeof CHAT_GPT_MODELS];
|
|
96
|
+
|
|
97
|
+
export { CHAT_GPT_MODELS, type ChatGptAdapter, type ChatGptConfig, type ChatGptContext, type ChatGptDefaults, type ChatGptModel, type ChatMessage, type ChatMessageRole, type CreateChatCompletionInput, type CreateChatCompletionOutput, type Logger, createAdapter, createChatCompletion, createChatGptClient };
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var OpenAI = require('openai');
|
|
4
|
+
var zod = require('openai/helpers/zod');
|
|
4
5
|
|
|
5
6
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
7
|
|
|
@@ -14,13 +15,35 @@ var createChatGptClient = (config) => {
|
|
|
14
15
|
project: config.project
|
|
15
16
|
});
|
|
16
17
|
};
|
|
17
|
-
|
|
18
|
-
// src/operations/create-chat-completion.ts
|
|
19
18
|
var createChatCompletion = (ctx) => async (input) => {
|
|
20
|
-
const { client, logger } = ctx;
|
|
21
|
-
|
|
19
|
+
const { client, logger, defaults } = ctx;
|
|
20
|
+
const mergedInput = {
|
|
21
|
+
...defaults,
|
|
22
|
+
...input
|
|
23
|
+
};
|
|
24
|
+
if (!mergedInput.model) {
|
|
25
|
+
throw new Error("chat-gpt:createChatCompletion: model is required");
|
|
26
|
+
}
|
|
27
|
+
const { schema, schemaName, messages, ...rest } = mergedInput;
|
|
28
|
+
logger?.debug("chat-gpt:createChatCompletion:start", { data: mergedInput });
|
|
22
29
|
try {
|
|
23
|
-
|
|
30
|
+
if (schema) {
|
|
31
|
+
const response2 = await client.responses.parse({
|
|
32
|
+
...rest,
|
|
33
|
+
input: messages,
|
|
34
|
+
text: {
|
|
35
|
+
format: zod.zodTextFormat(schema, schemaName || "output")
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
logger?.debug("chat-gpt:createChatCompletion:success", { data: response2 });
|
|
39
|
+
return {
|
|
40
|
+
...response2,
|
|
41
|
+
parsed: response2.output_parsed
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const response = await client.chat.completions.create({
|
|
45
|
+
...mergedInput
|
|
46
|
+
});
|
|
24
47
|
logger?.debug("chat-gpt:createChatCompletion:success", { data: response });
|
|
25
48
|
return response;
|
|
26
49
|
} catch (error) {
|
|
@@ -32,12 +55,24 @@ var createChatCompletion = (ctx) => async (input) => {
|
|
|
32
55
|
// src/adapter.ts
|
|
33
56
|
var createAdapter = (config, logger) => {
|
|
34
57
|
const client = createChatGptClient(config);
|
|
35
|
-
const context = { client, logger };
|
|
58
|
+
const context = { client, logger, defaults: config.defaults };
|
|
36
59
|
return {
|
|
37
60
|
createChatCompletion: createChatCompletion(context)
|
|
38
61
|
};
|
|
39
62
|
};
|
|
40
63
|
|
|
64
|
+
// src/models.ts
|
|
65
|
+
var CHAT_GPT_MODELS = {
|
|
66
|
+
GPT_4o: "gpt-4o",
|
|
67
|
+
GPT_4o_2024_08_06: "gpt-4o-2024-08-06",
|
|
68
|
+
GPT_4o_MINI: "gpt-4o-mini",
|
|
69
|
+
GPT_4o_MINI_2024_07_18: "gpt-4o-mini-2024-07-18",
|
|
70
|
+
GPT_4_TURBO: "gpt-4-turbo",
|
|
71
|
+
GPT_4: "gpt-4",
|
|
72
|
+
GPT_3_5_TURBO: "gpt-3.5-turbo"
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
exports.CHAT_GPT_MODELS = CHAT_GPT_MODELS;
|
|
41
76
|
exports.createAdapter = createAdapter;
|
|
42
77
|
exports.createChatCompletion = createChatCompletion;
|
|
43
78
|
exports.createChatGptClient = createChatGptClient;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../src/operations/create-chat-completion.ts","../src/adapter.ts"],"names":["OpenAI"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/operations/create-chat-completion.ts","../src/adapter.ts","../src/models.ts"],"names":["OpenAI","response","zodTextFormat"],"mappings":";;;;;;;;;;AAGO,IAAM,mBAAA,GAAsB,CAAC,MAAA,KAAkC;AAClE,EAAA,OAAO,IAAIA,uBAAA,CAAO;AAAA,IACd,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,SAAS,MAAA,CAAO;AAAA,GACnB,CAAA;AACL;ACNO,IAAM,oBAAA,GACT,CAAC,GAAA,KACD,OAAO,KAAA,KAA0E;AAC7E,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAS,GAAI,GAAA;AAErC,EAAA,MAAM,WAAA,GAAc;AAAA,IAChB,GAAG,QAAA;AAAA,IACH,GAAG;AAAA,GACP;AAEA,EAAA,IAAI,CAAC,YAAY,KAAA,EAAO;AACpB,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACtE;AAEA,EAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAG,MAAK,GAAI,WAAA;AAElD,EAAA,MAAA,EAAQ,KAAA,CAAM,qCAAA,EAAuC,EAAE,IAAA,EAAM,aAAa,CAAA;AAE1E,EAAA,IAAI;AACA,IAAA,IAAI,MAAA,EAAQ;AACR,MAAA,MAAMC,SAAAA,GAAW,MAAO,MAAA,CAAO,SAAA,CAAkB,KAAA,CAAM;AAAA,QACnD,GAAG,IAAA;AAAA,QACH,KAAA,EAAO,QAAA;AAAA,QACP,IAAA,EAAM;AAAA,UACF,MAAA,EAAQC,iBAAA,CAAc,MAAA,EAAQ,UAAA,IAAc,QAAQ;AAAA;AACxD,OACH,CAAA;AAED,MAAA,MAAA,EAAQ,KAAA,CAAM,uCAAA,EAAyC,EAAE,IAAA,EAAMD,WAAU,CAAA;AAEzE,MAAA,OAAO;AAAA,QACH,GAAGA,SAAAA;AAAA,QACH,QAAQA,SAAAA,CAAS;AAAA,OACrB;AAAA,IACJ;AAIA,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,YAAY,MAAA,CAAO;AAAA,MAClD,GAAG;AAAA,KACC,CAAA;AAER,IAAA,MAAA,EAAQ,KAAA,CAAM,uCAAA,EAAyC,EAAE,IAAA,EAAM,UAAU,CAAA;AAEzE,IAAA,OAAO,QAAA;AAAA,EACX,SAAS,KAAA,EAAO;AACZ,IAAA,MAAA,EAAQ,KAAA,CAAM,qCAAA,EAAuC,EAAE,KAAA,EAAO,CAAA;AAC9D,IAAA,MAAM,KAAA;AAAA,EACV;AACJ;;;AC3CG,IAAM,aAAA,GAAgB,CAAC,MAAA,EAAuB,MAAA,KAAoC;AACrF,EAAA,MAAM,MAAA,GAAS,oBAAoB,MAAM,CAAA;AACzC,EAAA,MAAM,UAA0B,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,OAAO,QAAA,EAAS;AAE5E,EAAA,OAAO;AAAA,IACH,oBAAA,EAAsB,qBAAqB,OAAO;AAAA,GACtD;AACJ;;;AChBO,IAAM,eAAA,GAAkB;AAAA,EAC3B,MAAA,EAAQ,QAAA;AAAA,EACR,iBAAA,EAAmB,mBAAA;AAAA,EACnB,WAAA,EAAa,aAAA;AAAA,EACb,sBAAA,EAAwB,wBAAA;AAAA,EACxB,WAAA,EAAa,aAAA;AAAA,EACb,KAAA,EAAO,OAAA;AAAA,EACP,aAAA,EAAe;AACnB","file":"index.js","sourcesContent":["import OpenAI from 'openai';\nimport { ChatGptConfig } from './types';\n\nexport const createChatGptClient = (config: ChatGptConfig): OpenAI => {\n return new OpenAI({\n apiKey: config.apiKey,\n organization: config.organization,\n project: config.project,\n });\n};\n","import { zodTextFormat } from 'openai/helpers/zod';\nimport { ChatGptContext, CreateChatCompletionInput, CreateChatCompletionOutput } from '../types';\n\nexport const createChatCompletion =\n (ctx: ChatGptContext) =>\n async (input: CreateChatCompletionInput): Promise<CreateChatCompletionOutput> => {\n const { client, logger, defaults } = ctx;\n\n const mergedInput = {\n ...defaults,\n ...input,\n };\n\n if (!mergedInput.model) {\n throw new Error('chat-gpt:createChatCompletion: model is required');\n }\n\n const { schema, schemaName, messages, ...rest } = mergedInput;\n\n logger?.debug('chat-gpt:createChatCompletion:start', { data: mergedInput });\n\n try {\n if (schema) {\n const response = await (client.responses as any).parse({\n ...rest,\n input: messages,\n text: {\n format: zodTextFormat(schema, schemaName || 'output'),\n },\n });\n\n logger?.debug('chat-gpt:createChatCompletion:success', { data: response });\n\n return {\n ...response,\n parsed: response.output_parsed,\n } as CreateChatCompletionOutput;\n }\n\n // Fallback to regular chat completion for non-zod calls\n // or we can use client.responses.create if we want to be consistent\n const response = await client.chat.completions.create({\n ...mergedInput,\n } as any);\n\n logger?.debug('chat-gpt:createChatCompletion:success', { data: response });\n\n return response as CreateChatCompletionOutput;\n } catch (error) {\n logger?.debug('chat-gpt:createChatCompletion:error', { error });\n throw error;\n }\n };\n","import OpenAI from 'openai';\nimport { ChatGptConfig, ChatGptContext, Logger } from './types';\nimport { createChatGptClient } from './client';\nimport { createChatCompletion } from './operations/create-chat-completion';\n\nexport interface ChatGptAdapter {\n createChatCompletion: ReturnType<typeof createChatCompletion>;\n}\n\nexport const createAdapter = (config: ChatGptConfig, logger?: Logger): ChatGptAdapter => {\n const client = createChatGptClient(config);\n const context: ChatGptContext = { client, logger, defaults: config.defaults };\n\n return {\n createChatCompletion: createChatCompletion(context),\n };\n};\n","export const CHAT_GPT_MODELS = {\n GPT_4o: 'gpt-4o',\n GPT_4o_2024_08_06: 'gpt-4o-2024-08-06',\n GPT_4o_MINI: 'gpt-4o-mini',\n GPT_4o_MINI_2024_07_18: 'gpt-4o-mini-2024-07-18',\n GPT_4_TURBO: 'gpt-4-turbo',\n GPT_4: 'gpt-4',\n GPT_3_5_TURBO: 'gpt-3.5-turbo',\n} as const;\n\nexport type ChatGptModel = (typeof CHAT_GPT_MODELS)[keyof typeof CHAT_GPT_MODELS];\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import OpenAI from 'openai';
|
|
2
|
+
import { zodTextFormat } from 'openai/helpers/zod';
|
|
2
3
|
|
|
3
4
|
// src/client.ts
|
|
4
5
|
var createChatGptClient = (config) => {
|
|
@@ -8,13 +9,35 @@ var createChatGptClient = (config) => {
|
|
|
8
9
|
project: config.project
|
|
9
10
|
});
|
|
10
11
|
};
|
|
11
|
-
|
|
12
|
-
// src/operations/create-chat-completion.ts
|
|
13
12
|
var createChatCompletion = (ctx) => async (input) => {
|
|
14
|
-
const { client, logger } = ctx;
|
|
15
|
-
|
|
13
|
+
const { client, logger, defaults } = ctx;
|
|
14
|
+
const mergedInput = {
|
|
15
|
+
...defaults,
|
|
16
|
+
...input
|
|
17
|
+
};
|
|
18
|
+
if (!mergedInput.model) {
|
|
19
|
+
throw new Error("chat-gpt:createChatCompletion: model is required");
|
|
20
|
+
}
|
|
21
|
+
const { schema, schemaName, messages, ...rest } = mergedInput;
|
|
22
|
+
logger?.debug("chat-gpt:createChatCompletion:start", { data: mergedInput });
|
|
16
23
|
try {
|
|
17
|
-
|
|
24
|
+
if (schema) {
|
|
25
|
+
const response2 = await client.responses.parse({
|
|
26
|
+
...rest,
|
|
27
|
+
input: messages,
|
|
28
|
+
text: {
|
|
29
|
+
format: zodTextFormat(schema, schemaName || "output")
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
logger?.debug("chat-gpt:createChatCompletion:success", { data: response2 });
|
|
33
|
+
return {
|
|
34
|
+
...response2,
|
|
35
|
+
parsed: response2.output_parsed
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const response = await client.chat.completions.create({
|
|
39
|
+
...mergedInput
|
|
40
|
+
});
|
|
18
41
|
logger?.debug("chat-gpt:createChatCompletion:success", { data: response });
|
|
19
42
|
return response;
|
|
20
43
|
} catch (error) {
|
|
@@ -26,12 +49,23 @@ var createChatCompletion = (ctx) => async (input) => {
|
|
|
26
49
|
// src/adapter.ts
|
|
27
50
|
var createAdapter = (config, logger) => {
|
|
28
51
|
const client = createChatGptClient(config);
|
|
29
|
-
const context = { client, logger };
|
|
52
|
+
const context = { client, logger, defaults: config.defaults };
|
|
30
53
|
return {
|
|
31
54
|
createChatCompletion: createChatCompletion(context)
|
|
32
55
|
};
|
|
33
56
|
};
|
|
34
57
|
|
|
35
|
-
|
|
58
|
+
// src/models.ts
|
|
59
|
+
var CHAT_GPT_MODELS = {
|
|
60
|
+
GPT_4o: "gpt-4o",
|
|
61
|
+
GPT_4o_2024_08_06: "gpt-4o-2024-08-06",
|
|
62
|
+
GPT_4o_MINI: "gpt-4o-mini",
|
|
63
|
+
GPT_4o_MINI_2024_07_18: "gpt-4o-mini-2024-07-18",
|
|
64
|
+
GPT_4_TURBO: "gpt-4-turbo",
|
|
65
|
+
GPT_4: "gpt-4",
|
|
66
|
+
GPT_3_5_TURBO: "gpt-3.5-turbo"
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export { CHAT_GPT_MODELS, createAdapter, createChatCompletion, createChatGptClient };
|
|
36
70
|
//# sourceMappingURL=index.mjs.map
|
|
37
71
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../src/operations/create-chat-completion.ts","../src/adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/operations/create-chat-completion.ts","../src/adapter.ts","../src/models.ts"],"names":["response"],"mappings":";;;;AAGO,IAAM,mBAAA,GAAsB,CAAC,MAAA,KAAkC;AAClE,EAAA,OAAO,IAAI,MAAA,CAAO;AAAA,IACd,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,SAAS,MAAA,CAAO;AAAA,GACnB,CAAA;AACL;ACNO,IAAM,oBAAA,GACT,CAAC,GAAA,KACD,OAAO,KAAA,KAA0E;AAC7E,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAS,GAAI,GAAA;AAErC,EAAA,MAAM,WAAA,GAAc;AAAA,IAChB,GAAG,QAAA;AAAA,IACH,GAAG;AAAA,GACP;AAEA,EAAA,IAAI,CAAC,YAAY,KAAA,EAAO;AACpB,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACtE;AAEA,EAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAG,MAAK,GAAI,WAAA;AAElD,EAAA,MAAA,EAAQ,KAAA,CAAM,qCAAA,EAAuC,EAAE,IAAA,EAAM,aAAa,CAAA;AAE1E,EAAA,IAAI;AACA,IAAA,IAAI,MAAA,EAAQ;AACR,MAAA,MAAMA,SAAAA,GAAW,MAAO,MAAA,CAAO,SAAA,CAAkB,KAAA,CAAM;AAAA,QACnD,GAAG,IAAA;AAAA,QACH,KAAA,EAAO,QAAA;AAAA,QACP,IAAA,EAAM;AAAA,UACF,MAAA,EAAQ,aAAA,CAAc,MAAA,EAAQ,UAAA,IAAc,QAAQ;AAAA;AACxD,OACH,CAAA;AAED,MAAA,MAAA,EAAQ,KAAA,CAAM,uCAAA,EAAyC,EAAE,IAAA,EAAMA,WAAU,CAAA;AAEzE,MAAA,OAAO;AAAA,QACH,GAAGA,SAAAA;AAAA,QACH,QAAQA,SAAAA,CAAS;AAAA,OACrB;AAAA,IACJ;AAIA,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,YAAY,MAAA,CAAO;AAAA,MAClD,GAAG;AAAA,KACC,CAAA;AAER,IAAA,MAAA,EAAQ,KAAA,CAAM,uCAAA,EAAyC,EAAE,IAAA,EAAM,UAAU,CAAA;AAEzE,IAAA,OAAO,QAAA;AAAA,EACX,SAAS,KAAA,EAAO;AACZ,IAAA,MAAA,EAAQ,KAAA,CAAM,qCAAA,EAAuC,EAAE,KAAA,EAAO,CAAA;AAC9D,IAAA,MAAM,KAAA;AAAA,EACV;AACJ;;;AC3CG,IAAM,aAAA,GAAgB,CAAC,MAAA,EAAuB,MAAA,KAAoC;AACrF,EAAA,MAAM,MAAA,GAAS,oBAAoB,MAAM,CAAA;AACzC,EAAA,MAAM,UAA0B,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,OAAO,QAAA,EAAS;AAE5E,EAAA,OAAO;AAAA,IACH,oBAAA,EAAsB,qBAAqB,OAAO;AAAA,GACtD;AACJ;;;AChBO,IAAM,eAAA,GAAkB;AAAA,EAC3B,MAAA,EAAQ,QAAA;AAAA,EACR,iBAAA,EAAmB,mBAAA;AAAA,EACnB,WAAA,EAAa,aAAA;AAAA,EACb,sBAAA,EAAwB,wBAAA;AAAA,EACxB,WAAA,EAAa,aAAA;AAAA,EACb,KAAA,EAAO,OAAA;AAAA,EACP,aAAA,EAAe;AACnB","file":"index.mjs","sourcesContent":["import OpenAI from 'openai';\nimport { ChatGptConfig } from './types';\n\nexport const createChatGptClient = (config: ChatGptConfig): OpenAI => {\n return new OpenAI({\n apiKey: config.apiKey,\n organization: config.organization,\n project: config.project,\n });\n};\n","import { zodTextFormat } from 'openai/helpers/zod';\nimport { ChatGptContext, CreateChatCompletionInput, CreateChatCompletionOutput } from '../types';\n\nexport const createChatCompletion =\n (ctx: ChatGptContext) =>\n async (input: CreateChatCompletionInput): Promise<CreateChatCompletionOutput> => {\n const { client, logger, defaults } = ctx;\n\n const mergedInput = {\n ...defaults,\n ...input,\n };\n\n if (!mergedInput.model) {\n throw new Error('chat-gpt:createChatCompletion: model is required');\n }\n\n const { schema, schemaName, messages, ...rest } = mergedInput;\n\n logger?.debug('chat-gpt:createChatCompletion:start', { data: mergedInput });\n\n try {\n if (schema) {\n const response = await (client.responses as any).parse({\n ...rest,\n input: messages,\n text: {\n format: zodTextFormat(schema, schemaName || 'output'),\n },\n });\n\n logger?.debug('chat-gpt:createChatCompletion:success', { data: response });\n\n return {\n ...response,\n parsed: response.output_parsed,\n } as CreateChatCompletionOutput;\n }\n\n // Fallback to regular chat completion for non-zod calls\n // or we can use client.responses.create if we want to be consistent\n const response = await client.chat.completions.create({\n ...mergedInput,\n } as any);\n\n logger?.debug('chat-gpt:createChatCompletion:success', { data: response });\n\n return response as CreateChatCompletionOutput;\n } catch (error) {\n logger?.debug('chat-gpt:createChatCompletion:error', { error });\n throw error;\n }\n };\n","import OpenAI from 'openai';\nimport { ChatGptConfig, ChatGptContext, Logger } from './types';\nimport { createChatGptClient } from './client';\nimport { createChatCompletion } from './operations/create-chat-completion';\n\nexport interface ChatGptAdapter {\n createChatCompletion: ReturnType<typeof createChatCompletion>;\n}\n\nexport const createAdapter = (config: ChatGptConfig, logger?: Logger): ChatGptAdapter => {\n const client = createChatGptClient(config);\n const context: ChatGptContext = { client, logger, defaults: config.defaults };\n\n return {\n createChatCompletion: createChatCompletion(context),\n };\n};\n","export const CHAT_GPT_MODELS = {\n GPT_4o: 'gpt-4o',\n GPT_4o_2024_08_06: 'gpt-4o-2024-08-06',\n GPT_4o_MINI: 'gpt-4o-mini',\n GPT_4o_MINI_2024_07_18: 'gpt-4o-mini-2024-07-18',\n GPT_4_TURBO: 'gpt-4-turbo',\n GPT_4: 'gpt-4',\n GPT_3_5_TURBO: 'gpt-3.5-turbo',\n} as const;\n\nexport type ChatGptModel = (typeof CHAT_GPT_MODELS)[keyof typeof CHAT_GPT_MODELS];\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vitkuz/vitkuz-chat-gpt-apapter",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"module": "./dist/index.mjs",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -23,7 +23,8 @@
|
|
|
23
23
|
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\""
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"openai": "^4.77.0"
|
|
26
|
+
"openai": "^4.77.0",
|
|
27
|
+
"zod": "^3.25.76"
|
|
27
28
|
},
|
|
28
29
|
"devDependencies": {
|
|
29
30
|
"@types/node": "^22.10.2",
|
|
@@ -33,5 +34,14 @@
|
|
|
33
34
|
"tsup": "^8.3.5",
|
|
34
35
|
"tsx": "^4.19.2",
|
|
35
36
|
"typescript": "^5.7.2"
|
|
36
|
-
}
|
|
37
|
+
},
|
|
38
|
+
"author": "Vitali Kuzmenka",
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "git+https://github.com/vitkuz/vitkuz-chat-gpt-apapter.git"
|
|
42
|
+
},
|
|
43
|
+
"bugs": {
|
|
44
|
+
"url": "https://github.com/vitkuz/vitkuz-chat-gpt-apapter/issues"
|
|
45
|
+
},
|
|
46
|
+
"homepage": "https://github.com/vitkuz/vitkuz-chat-gpt-apapter#readme"
|
|
37
47
|
}
|