@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 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: string;
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
- export { type ChatGptAdapter, type ChatGptConfig, type ChatGptContext, type ChatMessage, type ChatMessageRole, type CreateChatCompletionInput, type CreateChatCompletionOutput, type Logger, createAdapter, createChatCompletion, createChatGptClient };
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: string;
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
- export { type ChatGptAdapter, type ChatGptConfig, type ChatGptContext, type ChatMessage, type ChatMessageRole, type CreateChatCompletionInput, type CreateChatCompletionOutput, type Logger, createAdapter, createChatCompletion, createChatGptClient };
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
- logger?.debug("chat-gpt:createChatCompletion:start", { data: input });
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
- const response = await client.chat.completions.create(input);
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":";;;;;;;;;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;;;ACPO,IAAM,oBAAA,GACT,CAAC,GAAA,KACD,OAAO,KAAA,KAA0E;AAC7E,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,GAAA;AAE3B,EAAA,MAAA,EAAQ,KAAA,CAAM,qCAAA,EAAuC,EAAE,IAAA,EAAM,OAAO,CAAA;AAEpE,EAAA,IAAI;AACA,IAAA,MAAM,WAAW,MAAM,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,OAAO,KAAY,CAAA;AAElE,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;;;ACVG,IAAM,aAAA,GAAgB,CAAC,MAAA,EAAuB,MAAA,KAAoC;AACrF,EAAA,MAAM,MAAA,GAAS,oBAAoB,MAAM,CAAA;AACzC,EAAA,MAAM,OAAA,GAA0B,EAAE,MAAA,EAAQ,MAAA,EAAO;AAEjD,EAAA,OAAO;AAAA,IACH,oBAAA,EAAsB,qBAAqB,OAAO;AAAA,GACtD;AACJ","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 { ChatGptContext, CreateChatCompletionInput, CreateChatCompletionOutput } from '../types';\n\nexport const createChatCompletion =\n (ctx: ChatGptContext) =>\n async (input: CreateChatCompletionInput): Promise<CreateChatCompletionOutput> => {\n const { client, logger } = ctx;\n\n logger?.debug('chat-gpt:createChatCompletion:start', { data: input });\n\n try {\n const response = await client.chat.completions.create(input 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 };\n\n return {\n createChatCompletion: createChatCompletion(context),\n };\n};\n"]}
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
- logger?.debug("chat-gpt:createChatCompletion:start", { data: input });
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
- const response = await client.chat.completions.create(input);
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
- export { createAdapter, createChatCompletion, createChatGptClient };
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
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/operations/create-chat-completion.ts","../src/adapter.ts"],"names":[],"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;;;ACPO,IAAM,oBAAA,GACT,CAAC,GAAA,KACD,OAAO,KAAA,KAA0E;AAC7E,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,GAAA;AAE3B,EAAA,MAAA,EAAQ,KAAA,CAAM,qCAAA,EAAuC,EAAE,IAAA,EAAM,OAAO,CAAA;AAEpE,EAAA,IAAI;AACA,IAAA,MAAM,WAAW,MAAM,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,OAAO,KAAY,CAAA;AAElE,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;;;ACVG,IAAM,aAAA,GAAgB,CAAC,MAAA,EAAuB,MAAA,KAAoC;AACrF,EAAA,MAAM,MAAA,GAAS,oBAAoB,MAAM,CAAA;AACzC,EAAA,MAAM,OAAA,GAA0B,EAAE,MAAA,EAAQ,MAAA,EAAO;AAEjD,EAAA,OAAO;AAAA,IACH,oBAAA,EAAsB,qBAAqB,OAAO;AAAA,GACtD;AACJ","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 { ChatGptContext, CreateChatCompletionInput, CreateChatCompletionOutput } from '../types';\n\nexport const createChatCompletion =\n (ctx: ChatGptContext) =>\n async (input: CreateChatCompletionInput): Promise<CreateChatCompletionOutput> => {\n const { client, logger } = ctx;\n\n logger?.debug('chat-gpt:createChatCompletion:start', { data: input });\n\n try {\n const response = await client.chat.completions.create(input 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 };\n\n return {\n createChatCompletion: createChatCompletion(context),\n };\n};\n"]}
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.0",
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
  }