@aituber-onair/chat 0.1.0 → 0.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 +2 -2
- package/dist/cjs/constants/chat.d.ts +24 -1
- package/dist/cjs/constants/chat.d.ts.map +1 -1
- package/dist/cjs/constants/chat.js +26 -2
- package/dist/cjs/constants/chat.js.map +1 -1
- package/dist/cjs/constants/openai.d.ts +11 -0
- package/dist/cjs/constants/openai.d.ts.map +1 -1
- package/dist/cjs/constants/openai.js +25 -1
- package/dist/cjs/constants/openai.js.map +1 -1
- package/dist/cjs/services/providers/ChatServiceProvider.d.ts +11 -1
- package/dist/cjs/services/providers/ChatServiceProvider.d.ts.map +1 -1
- package/dist/cjs/services/providers/openai/OpenAIChatService.d.ts +5 -1
- package/dist/cjs/services/providers/openai/OpenAIChatService.d.ts.map +1 -1
- package/dist/cjs/services/providers/openai/OpenAIChatService.js +121 -19
- package/dist/cjs/services/providers/openai/OpenAIChatService.js.map +1 -1
- package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.d.ts +6 -0
- package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.d.ts.map +1 -1
- package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.js +56 -10
- package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.js.map +1 -1
- package/dist/esm/constants/chat.d.ts +24 -1
- package/dist/esm/constants/chat.d.ts.map +1 -1
- package/dist/esm/constants/chat.js +25 -1
- package/dist/esm/constants/chat.js.map +1 -1
- package/dist/esm/constants/openai.d.ts +11 -0
- package/dist/esm/constants/openai.d.ts.map +1 -1
- package/dist/esm/constants/openai.js +23 -0
- package/dist/esm/constants/openai.js.map +1 -1
- package/dist/esm/services/providers/ChatServiceProvider.d.ts +11 -1
- package/dist/esm/services/providers/ChatServiceProvider.d.ts.map +1 -1
- package/dist/esm/services/providers/openai/OpenAIChatService.d.ts +5 -1
- package/dist/esm/services/providers/openai/OpenAIChatService.d.ts.map +1 -1
- package/dist/esm/services/providers/openai/OpenAIChatService.js +122 -20
- package/dist/esm/services/providers/openai/OpenAIChatService.js.map +1 -1
- package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.d.ts +6 -0
- package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.d.ts.map +1 -1
- package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.js +57 -11
- package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.OpenAIChatServiceProvider = void 0;
|
|
4
4
|
const constants_1 = require("../../../constants");
|
|
5
|
+
const chat_1 = require("../../../constants/chat");
|
|
5
6
|
const OpenAIChatService_1 = require("./OpenAIChatService");
|
|
6
7
|
/**
|
|
7
8
|
* OpenAI API provider implementation
|
|
@@ -13,21 +14,34 @@ class OpenAIChatServiceProvider {
|
|
|
13
14
|
* @returns OpenAIChatService instance
|
|
14
15
|
*/
|
|
15
16
|
createChatService(options) {
|
|
17
|
+
// Apply GPT-5 optimizations if needed
|
|
18
|
+
const optimizedOptions = this.optimizeGPT5Options(options);
|
|
16
19
|
// Use the visionModel if provided, otherwise use the model that supports vision
|
|
17
|
-
const visionModel =
|
|
18
|
-
(this.supportsVisionForModel(
|
|
19
|
-
?
|
|
20
|
+
const visionModel = optimizedOptions.visionModel ||
|
|
21
|
+
(this.supportsVisionForModel(optimizedOptions.model || this.getDefaultModel())
|
|
22
|
+
? optimizedOptions.model
|
|
20
23
|
: this.getDefaultModel());
|
|
21
24
|
// tools definition
|
|
22
|
-
const tools =
|
|
23
|
-
//
|
|
24
|
-
const mcpServers =
|
|
25
|
-
const
|
|
26
|
-
|
|
25
|
+
const tools = optimizedOptions.tools;
|
|
26
|
+
// Determine endpoint based on MCP servers, GPT-5 model, and user preference
|
|
27
|
+
const mcpServers = optimizedOptions.mcpServers ?? [];
|
|
28
|
+
const modelName = optimizedOptions.model || this.getDefaultModel();
|
|
29
|
+
// Determine endpoint preference
|
|
30
|
+
let shouldUseResponsesAPI = false;
|
|
31
|
+
// MCP requires Responses API regardless of model
|
|
32
|
+
if (mcpServers.length > 0) {
|
|
33
|
+
shouldUseResponsesAPI = true;
|
|
34
|
+
}
|
|
35
|
+
else if ((0, constants_1.isGPT5Model)(modelName)) {
|
|
36
|
+
// For GPT-5 models without MCP, respect user endpoint preference
|
|
37
|
+
const preference = optimizedOptions.gpt5EndpointPreference || 'chat'; // Default to chat API for GPT-5
|
|
38
|
+
shouldUseResponsesAPI = preference === 'responses';
|
|
39
|
+
}
|
|
40
|
+
const endpoint = optimizedOptions.endpoint ||
|
|
27
41
|
(shouldUseResponsesAPI
|
|
28
42
|
? constants_1.ENDPOINT_OPENAI_RESPONSES_API
|
|
29
43
|
: constants_1.ENDPOINT_OPENAI_CHAT_COMPLETIONS_API);
|
|
30
|
-
return new OpenAIChatService_1.OpenAIChatService(
|
|
44
|
+
return new OpenAIChatService_1.OpenAIChatService(optimizedOptions.apiKey, modelName, visionModel, tools, endpoint, mcpServers, optimizedOptions.responseLength, optimizedOptions.verbosity, optimizedOptions.reasoning_effort, optimizedOptions.enableReasoningSummary);
|
|
31
45
|
}
|
|
32
46
|
/**
|
|
33
47
|
* Get the provider name
|
|
@@ -42,6 +56,10 @@ class OpenAIChatServiceProvider {
|
|
|
42
56
|
*/
|
|
43
57
|
getSupportedModels() {
|
|
44
58
|
return [
|
|
59
|
+
constants_1.MODEL_GPT_5_NANO,
|
|
60
|
+
constants_1.MODEL_GPT_5_MINI,
|
|
61
|
+
constants_1.MODEL_GPT_5,
|
|
62
|
+
constants_1.MODEL_GPT_5_CHAT_LATEST,
|
|
45
63
|
constants_1.MODEL_GPT_4_1,
|
|
46
64
|
constants_1.MODEL_GPT_4_1_MINI,
|
|
47
65
|
constants_1.MODEL_GPT_4_1_NANO,
|
|
@@ -58,7 +76,7 @@ class OpenAIChatServiceProvider {
|
|
|
58
76
|
* @returns Default model name
|
|
59
77
|
*/
|
|
60
78
|
getDefaultModel() {
|
|
61
|
-
return constants_1.
|
|
79
|
+
return constants_1.MODEL_GPT_5_NANO;
|
|
62
80
|
}
|
|
63
81
|
/**
|
|
64
82
|
* Check if this provider supports vision (image processing)
|
|
@@ -75,6 +93,34 @@ class OpenAIChatServiceProvider {
|
|
|
75
93
|
supportsVisionForModel(model) {
|
|
76
94
|
return constants_1.VISION_SUPPORTED_MODELS.includes(model);
|
|
77
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Apply GPT-5 specific optimizations to options
|
|
98
|
+
* @param options Original chat service options
|
|
99
|
+
* @returns Optimized options for GPT-5 usage
|
|
100
|
+
*/
|
|
101
|
+
optimizeGPT5Options(options) {
|
|
102
|
+
const modelName = options.model || this.getDefaultModel();
|
|
103
|
+
// Skip optimization for non-GPT-5 models
|
|
104
|
+
if (!(0, constants_1.isGPT5Model)(modelName)) {
|
|
105
|
+
return options;
|
|
106
|
+
}
|
|
107
|
+
const optimized = { ...options };
|
|
108
|
+
// Apply preset if specified (only affects reasoning_effort and verbosity)
|
|
109
|
+
if (options.gpt5Preset) {
|
|
110
|
+
const preset = chat_1.GPT5_PRESETS[options.gpt5Preset];
|
|
111
|
+
optimized.reasoning_effort = preset.reasoning_effort;
|
|
112
|
+
optimized.verbosity = preset.verbosity;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// Set default reasoning_effort if not specified
|
|
116
|
+
if (!options.reasoning_effort) {
|
|
117
|
+
optimized.reasoning_effort = 'medium';
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Keep the user's selected response length regardless of API endpoint
|
|
121
|
+
// Users can manually select reasoning response lengths if desired
|
|
122
|
+
return optimized;
|
|
123
|
+
}
|
|
78
124
|
}
|
|
79
125
|
exports.OpenAIChatServiceProvider = OpenAIChatServiceProvider;
|
|
80
126
|
//# sourceMappingURL=OpenAIChatServiceProvider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAIChatServiceProvider.js","sourceRoot":"","sources":["../../../../../src/services/providers/openai/OpenAIChatServiceProvider.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"OpenAIChatServiceProvider.js","sourceRoot":"","sources":["../../../../../src/services/providers/openai/OpenAIChatServiceProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ export declare const CHAT_RESPONSE_LENGTH: {
|
|
|
4
4
|
readonly MEDIUM: "medium";
|
|
5
5
|
readonly LONG: "long";
|
|
6
6
|
readonly VERY_LONG: "veryLong";
|
|
7
|
+
readonly DEEP: "deep";
|
|
7
8
|
};
|
|
8
9
|
export declare const MAX_TOKENS_BY_LENGTH: {
|
|
9
10
|
readonly veryShort: 40;
|
|
@@ -11,11 +12,33 @@ export declare const MAX_TOKENS_BY_LENGTH: {
|
|
|
11
12
|
readonly medium: 200;
|
|
12
13
|
readonly long: 300;
|
|
13
14
|
readonly veryLong: 1000;
|
|
15
|
+
readonly deep: 5000;
|
|
14
16
|
};
|
|
15
17
|
/**
|
|
16
18
|
* Default max tokens for AI providers when not specified
|
|
17
19
|
*/
|
|
18
|
-
export declare const DEFAULT_MAX_TOKENS =
|
|
20
|
+
export declare const DEFAULT_MAX_TOKENS = 5000;
|
|
21
|
+
/**
|
|
22
|
+
* GPT-5 reasoning and verbosity presets (response length is set separately)
|
|
23
|
+
*/
|
|
24
|
+
export declare const GPT5_PRESETS: {
|
|
25
|
+
readonly casual: {
|
|
26
|
+
readonly reasoning_effort: "minimal";
|
|
27
|
+
readonly verbosity: "low";
|
|
28
|
+
readonly description: "Fast responses for casual chat, quick questions (GPT-4 like experience)";
|
|
29
|
+
};
|
|
30
|
+
readonly balanced: {
|
|
31
|
+
readonly reasoning_effort: "medium";
|
|
32
|
+
readonly verbosity: "medium";
|
|
33
|
+
readonly description: "Balanced reasoning for business tasks, learning, general problem solving";
|
|
34
|
+
};
|
|
35
|
+
readonly expert: {
|
|
36
|
+
readonly reasoning_effort: "high";
|
|
37
|
+
readonly verbosity: "high";
|
|
38
|
+
readonly description: "Deep reasoning for research, complex analysis, expert-level tasks";
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
export type GPT5PresetKey = keyof typeof GPT5_PRESETS;
|
|
19
42
|
export type ChatResponseLength = (typeof CHAT_RESPONSE_LENGTH)[keyof typeof CHAT_RESPONSE_LENGTH];
|
|
20
43
|
/**
|
|
21
44
|
* Converts a ChatResponseLength to the corresponding max_tokens value
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/constants/chat.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/constants/chat.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB;;;;;;;CAQvB,CAAC;AAEX,eAAO,MAAM,oBAAoB;;;;;;;CAQvB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAEvC;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;CAmBf,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,YAAY,CAAC;AAEtD,MAAM,MAAM,kBAAkB,GAC5B,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,OAAO,oBAAoB,CAAC,CAAC;AAEnE;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,cAAc,CAAC,EAAE,kBAAkB,GAClC,MAAM,CAKR"}
|
|
@@ -4,6 +4,8 @@ export const CHAT_RESPONSE_LENGTH = {
|
|
|
4
4
|
MEDIUM: 'medium',
|
|
5
5
|
LONG: 'long',
|
|
6
6
|
VERY_LONG: 'veryLong',
|
|
7
|
+
// Extended response length for longer outputs
|
|
8
|
+
DEEP: 'deep',
|
|
7
9
|
};
|
|
8
10
|
export const MAX_TOKENS_BY_LENGTH = {
|
|
9
11
|
[CHAT_RESPONSE_LENGTH.VERY_SHORT]: 40,
|
|
@@ -11,11 +13,33 @@ export const MAX_TOKENS_BY_LENGTH = {
|
|
|
11
13
|
[CHAT_RESPONSE_LENGTH.MEDIUM]: 200,
|
|
12
14
|
[CHAT_RESPONSE_LENGTH.LONG]: 300,
|
|
13
15
|
[CHAT_RESPONSE_LENGTH.VERY_LONG]: 1000,
|
|
16
|
+
// Extended response length for longer outputs
|
|
17
|
+
[CHAT_RESPONSE_LENGTH.DEEP]: 5000,
|
|
14
18
|
};
|
|
15
19
|
/**
|
|
16
20
|
* Default max tokens for AI providers when not specified
|
|
17
21
|
*/
|
|
18
|
-
export const DEFAULT_MAX_TOKENS =
|
|
22
|
+
export const DEFAULT_MAX_TOKENS = 5000;
|
|
23
|
+
/**
|
|
24
|
+
* GPT-5 reasoning and verbosity presets (response length is set separately)
|
|
25
|
+
*/
|
|
26
|
+
export const GPT5_PRESETS = {
|
|
27
|
+
casual: {
|
|
28
|
+
reasoning_effort: 'minimal',
|
|
29
|
+
verbosity: 'low',
|
|
30
|
+
description: 'Fast responses for casual chat, quick questions (GPT-4 like experience)',
|
|
31
|
+
},
|
|
32
|
+
balanced: {
|
|
33
|
+
reasoning_effort: 'medium',
|
|
34
|
+
verbosity: 'medium',
|
|
35
|
+
description: 'Balanced reasoning for business tasks, learning, general problem solving',
|
|
36
|
+
},
|
|
37
|
+
expert: {
|
|
38
|
+
reasoning_effort: 'high',
|
|
39
|
+
verbosity: 'high',
|
|
40
|
+
description: 'Deep reasoning for research, complex analysis, expert-level tasks',
|
|
41
|
+
},
|
|
42
|
+
};
|
|
19
43
|
/**
|
|
20
44
|
* Converts a ChatResponseLength to the corresponding max_tokens value
|
|
21
45
|
* @param responseLength - The response length setting
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/constants/chat.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,UAAU,EAAE,WAAW;IACvB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,UAAU;
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/constants/chat.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,UAAU,EAAE,WAAW;IACvB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,UAAU;IACrB,8CAA8C;IAC9C,IAAI,EAAE,MAAM;CACJ,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,CAAC,oBAAoB,CAAC,UAAU,CAAC,EAAE,EAAE;IACrC,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,GAAG;IACjC,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,GAAG;IAClC,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,GAAG;IAChC,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,IAAI;IACtC,8CAA8C;IAC9C,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,IAAI;CACzB,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEvC;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,MAAM,EAAE;QACN,gBAAgB,EAAE,SAAkB;QACpC,SAAS,EAAE,KAAc;QACzB,WAAW,EACT,yEAAyE;KAC5E;IACD,QAAQ,EAAE;QACR,gBAAgB,EAAE,QAAiB;QACnC,SAAS,EAAE,QAAiB;QAC5B,WAAW,EACT,0EAA0E;KAC7E;IACD,MAAM,EAAE;QACN,gBAAgB,EAAE,MAAe;QACjC,SAAS,EAAE,MAAe;QAC1B,WAAW,EACT,mEAAmE;KACtE;CACO,CAAC;AAOX;;;;GAIG;AACH,MAAM,UAAU,6BAA6B,CAC3C,cAAmC;IAEnC,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IACD,OAAO,oBAAoB,CAAC,cAAc,CAAC,IAAI,kBAAkB,CAAC;AACpE,CAAC"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
export declare const ENDPOINT_OPENAI_CHAT_COMPLETIONS_API = "https://api.openai.com/v1/chat/completions";
|
|
2
2
|
export declare const ENDPOINT_OPENAI_RESPONSES_API = "https://api.openai.com/v1/responses";
|
|
3
|
+
export declare const MODEL_GPT_5_NANO = "gpt-5-nano";
|
|
4
|
+
export declare const MODEL_GPT_5_MINI = "gpt-5-mini";
|
|
5
|
+
export declare const MODEL_GPT_5 = "gpt-5";
|
|
6
|
+
export declare const MODEL_GPT_5_CHAT_LATEST = "gpt-5-chat-latest";
|
|
3
7
|
export declare const MODEL_GPT_4_1 = "gpt-4.1";
|
|
4
8
|
export declare const MODEL_GPT_4_1_MINI = "gpt-4.1-mini";
|
|
5
9
|
export declare const MODEL_GPT_4_1_NANO = "gpt-4.1-nano";
|
|
@@ -10,4 +14,11 @@ export declare const MODEL_O1_MINI = "o1-mini";
|
|
|
10
14
|
export declare const MODEL_O1 = "o1";
|
|
11
15
|
export declare const MODEL_GPT_4_5_PREVIEW = "gpt-4.5-preview";
|
|
12
16
|
export declare const VISION_SUPPORTED_MODELS: string[];
|
|
17
|
+
export declare const GPT_5_MODELS: string[];
|
|
18
|
+
/**
|
|
19
|
+
* Check if a model is a GPT-5 model
|
|
20
|
+
* @param model Model name to check
|
|
21
|
+
* @returns True if the model is a GPT-5 variant
|
|
22
|
+
*/
|
|
23
|
+
export declare function isGPT5Model(model: string): boolean;
|
|
13
24
|
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/constants/openai.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oCAAoC,+CACH,CAAC;AAC/C,eAAO,MAAM,6BAA6B,wCACH,CAAC;AAGxC,eAAO,MAAM,aAAa,YAAY,CAAC;AACvC,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AACjD,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD,eAAO,MAAM,iBAAiB,gBAAgB,CAAC;AAC/C,eAAO,MAAM,YAAY,WAAW,CAAC;AACrC,eAAO,MAAM,aAAa,YAAY,CAAC;AAEvC,eAAO,MAAM,aAAa,YAAY,CAAC;AACvC,eAAO,MAAM,QAAQ,OAAO,CAAC;AAG7B,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AAGvD,eAAO,MAAM,uBAAuB,
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/constants/openai.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oCAAoC,+CACH,CAAC;AAC/C,eAAO,MAAM,6BAA6B,wCACH,CAAC;AAGxC,eAAO,MAAM,gBAAgB,eAAe,CAAC;AAC7C,eAAO,MAAM,gBAAgB,eAAe,CAAC;AAC7C,eAAO,MAAM,WAAW,UAAU,CAAC;AACnC,eAAO,MAAM,uBAAuB,sBAAsB,CAAC;AAE3D,eAAO,MAAM,aAAa,YAAY,CAAC;AACvC,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AACjD,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD,eAAO,MAAM,iBAAiB,gBAAgB,CAAC;AAC/C,eAAO,MAAM,YAAY,WAAW,CAAC;AACrC,eAAO,MAAM,aAAa,YAAY,CAAC;AAEvC,eAAO,MAAM,aAAa,YAAY,CAAC;AACvC,eAAO,MAAM,QAAQ,OAAO,CAAC;AAG7B,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AAGvD,eAAO,MAAM,uBAAuB,UAanC,CAAC;AAGF,eAAO,MAAM,YAAY,UAKxB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAElD"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
export const ENDPOINT_OPENAI_CHAT_COMPLETIONS_API = 'https://api.openai.com/v1/chat/completions';
|
|
2
2
|
export const ENDPOINT_OPENAI_RESPONSES_API = 'https://api.openai.com/v1/responses';
|
|
3
3
|
// gpt model
|
|
4
|
+
export const MODEL_GPT_5_NANO = 'gpt-5-nano';
|
|
5
|
+
export const MODEL_GPT_5_MINI = 'gpt-5-mini';
|
|
6
|
+
export const MODEL_GPT_5 = 'gpt-5';
|
|
7
|
+
export const MODEL_GPT_5_CHAT_LATEST = 'gpt-5-chat-latest';
|
|
4
8
|
export const MODEL_GPT_4_1 = 'gpt-4.1';
|
|
5
9
|
export const MODEL_GPT_4_1_MINI = 'gpt-4.1-mini';
|
|
6
10
|
export const MODEL_GPT_4_1_NANO = 'gpt-4.1-nano';
|
|
@@ -13,6 +17,10 @@ export const MODEL_O1 = 'o1';
|
|
|
13
17
|
export const MODEL_GPT_4_5_PREVIEW = 'gpt-4.5-preview';
|
|
14
18
|
// Vision support for models
|
|
15
19
|
export const VISION_SUPPORTED_MODELS = [
|
|
20
|
+
MODEL_GPT_5_NANO,
|
|
21
|
+
MODEL_GPT_5_MINI,
|
|
22
|
+
MODEL_GPT_5,
|
|
23
|
+
MODEL_GPT_5_CHAT_LATEST,
|
|
16
24
|
MODEL_GPT_4_1,
|
|
17
25
|
MODEL_GPT_4_1_MINI,
|
|
18
26
|
MODEL_GPT_4_1_NANO,
|
|
@@ -22,4 +30,19 @@ export const VISION_SUPPORTED_MODELS = [
|
|
|
22
30
|
MODEL_O1,
|
|
23
31
|
// MODEL_O3_MINI and MODEL_O1_MINI are not included as they don't support vision
|
|
24
32
|
];
|
|
33
|
+
// GPT-5 models list
|
|
34
|
+
export const GPT_5_MODELS = [
|
|
35
|
+
MODEL_GPT_5_NANO,
|
|
36
|
+
MODEL_GPT_5_MINI,
|
|
37
|
+
MODEL_GPT_5,
|
|
38
|
+
MODEL_GPT_5_CHAT_LATEST,
|
|
39
|
+
];
|
|
40
|
+
/**
|
|
41
|
+
* Check if a model is a GPT-5 model
|
|
42
|
+
* @param model Model name to check
|
|
43
|
+
* @returns True if the model is a GPT-5 variant
|
|
44
|
+
*/
|
|
45
|
+
export function isGPT5Model(model) {
|
|
46
|
+
return GPT_5_MODELS.includes(model);
|
|
47
|
+
}
|
|
25
48
|
//# sourceMappingURL=openai.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/constants/openai.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oCAAoC,GAC/C,4CAA4C,CAAC;AAC/C,MAAM,CAAC,MAAM,6BAA6B,GACxC,qCAAqC,CAAC;AAExC,YAAY;AACZ,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AACvC,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AACjD,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAEjD,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAC/C,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AAEvC,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AACvC,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC;AAE7B,aAAa;AACb,MAAM,CAAC,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAEvD,4BAA4B;AAC5B,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,aAAa;IACb,kBAAkB;IAClB,kBAAkB;IAClB,iBAAiB;IACjB,YAAY;IACZ,qBAAqB;IACrB,QAAQ;IACR,gFAAgF;CACjF,CAAC"}
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/constants/openai.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oCAAoC,GAC/C,4CAA4C,CAAC;AAC/C,MAAM,CAAC,MAAM,6BAA6B,GACxC,qCAAqC,CAAC;AAExC,YAAY;AACZ,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAC7C,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAC7C,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AACnC,MAAM,CAAC,MAAM,uBAAuB,GAAG,mBAAmB,CAAC;AAE3D,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AACvC,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AACjD,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAEjD,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAC/C,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AAEvC,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AACvC,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC;AAE7B,aAAa;AACb,MAAM,CAAC,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAEvD,4BAA4B;AAC5B,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,gBAAgB;IAChB,gBAAgB;IAChB,WAAW;IACX,uBAAuB;IACvB,aAAa;IACb,kBAAkB;IAClB,kBAAkB;IAClB,iBAAiB;IACjB,YAAY;IACZ,qBAAqB;IACrB,QAAQ;IACR,gFAAgF;CACjF,CAAC;AAEF,oBAAoB;AACpB,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,gBAAgB;IAChB,gBAAgB;IAChB,WAAW;IACX,uBAAuB;CACxB,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ChatService } from '../ChatService';
|
|
2
|
-
import { ChatResponseLength } from '../../constants/chat';
|
|
2
|
+
import { ChatResponseLength, GPT5PresetKey } from '../../constants/chat';
|
|
3
3
|
/**
|
|
4
4
|
* Options for chat service providers
|
|
5
5
|
*/
|
|
@@ -14,6 +14,16 @@ export interface ChatServiceOptions {
|
|
|
14
14
|
endpoint?: string;
|
|
15
15
|
/** Response length setting */
|
|
16
16
|
responseLength?: ChatResponseLength;
|
|
17
|
+
/** Verbosity level for GPT-5 models (OpenAI only) */
|
|
18
|
+
verbosity?: 'low' | 'medium' | 'high';
|
|
19
|
+
/** Reasoning effort level for GPT-5 models (OpenAI only) */
|
|
20
|
+
reasoning_effort?: 'minimal' | 'low' | 'medium' | 'high';
|
|
21
|
+
/** GPT-5 usage preset (OpenAI only) - overrides individual reasoning/verbosity settings */
|
|
22
|
+
gpt5Preset?: GPT5PresetKey;
|
|
23
|
+
/** GPT-5 endpoint preference (OpenAI only) - 'chat' for Chat Completions API, 'responses' for Responses API, 'auto' for automatic selection */
|
|
24
|
+
gpt5EndpointPreference?: 'chat' | 'responses' | 'auto';
|
|
25
|
+
/** Enable reasoning summary for GPT-5 models (OpenAI only) - requires organization verification */
|
|
26
|
+
enableReasoningSummary?: boolean;
|
|
17
27
|
/** Additional provider-specific options */
|
|
18
28
|
[key: string]: any;
|
|
19
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatServiceProvider.d.ts","sourceRoot":"","sources":["../../../../src/services/providers/ChatServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"ChatServiceProvider.d.ts","sourceRoot":"","sources":["../../../../src/services/providers/ChatServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,cAAc;IACd,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC,qDAAqD;IACrD,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtC,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACzD,2FAA2F;IAC3F,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,+IAA+I;IAC/I,sBAAsB,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IACvD,mGAAmG;IACnG,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,2CAA2C;IAC3C,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAAC;IAE5D;;;OAGG;IACH,eAAe,IAAI,MAAM,CAAC;IAE1B;;;OAGG;IACH,kBAAkB,IAAI,MAAM,EAAE,CAAC;IAE/B;;;OAGG;IACH,eAAe,IAAI,MAAM,CAAC;IAE1B;;;OAGG;IACH,cAAc,IAAI,OAAO,CAAC;CAC3B"}
|
|
@@ -16,13 +16,16 @@ export declare class OpenAIChatService implements ChatService {
|
|
|
16
16
|
private endpoint;
|
|
17
17
|
private mcpServers;
|
|
18
18
|
private responseLength?;
|
|
19
|
+
private verbosity?;
|
|
20
|
+
private reasoning_effort?;
|
|
21
|
+
private enableReasoningSummary?;
|
|
19
22
|
/**
|
|
20
23
|
* Constructor
|
|
21
24
|
* @param apiKey OpenAI API key
|
|
22
25
|
* @param model Name of the model to use
|
|
23
26
|
* @param visionModel Name of the vision model
|
|
24
27
|
*/
|
|
25
|
-
constructor(apiKey: string, model?: string, visionModel?: string, tools?: ToolDefinition[], endpoint?: string, mcpServers?: MCPServerConfig[], responseLength?: ChatResponseLength);
|
|
28
|
+
constructor(apiKey: string, model?: string, visionModel?: string, tools?: ToolDefinition[], endpoint?: string, mcpServers?: MCPServerConfig[], responseLength?: ChatResponseLength, verbosity?: 'low' | 'medium' | 'high', reasoning_effort?: 'minimal' | 'low' | 'medium' | 'high', enableReasoningSummary?: boolean);
|
|
26
29
|
/**
|
|
27
30
|
* Get the current model name
|
|
28
31
|
* @returns Model name
|
|
@@ -100,6 +103,7 @@ export declare class OpenAIChatService implements ChatService {
|
|
|
100
103
|
private parseResponsesStream;
|
|
101
104
|
/**
|
|
102
105
|
* Handle specific SSE events from Responses API
|
|
106
|
+
* @returns 'completed' if the response is completed, undefined otherwise
|
|
103
107
|
*/
|
|
104
108
|
private handleResponsesSSEEvent;
|
|
105
109
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAIChatService.d.ts","sourceRoot":"","sources":["../../../../../src/services/providers/openai/OpenAIChatService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"OpenAIChatService.d.ts","sourceRoot":"","sources":["../../../../../src/services/providers/openai/OpenAIChatService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ENDPOINT_OPENAI_CHAT_COMPLETIONS_API, ENDPOINT_OPENAI_RESPONSES_API, MODEL_GPT_4O_MINI, VISION_SUPPORTED_MODELS, } from '../../../constants';
|
|
1
|
+
import { ENDPOINT_OPENAI_CHAT_COMPLETIONS_API, ENDPOINT_OPENAI_RESPONSES_API, MODEL_GPT_4O_MINI, VISION_SUPPORTED_MODELS, isGPT5Model, } from '../../../constants';
|
|
2
2
|
import { getMaxTokensForResponseLength, } from '../../../constants/chat';
|
|
3
3
|
import { StreamTextAccumulator } from '../../../utils/streamTextAccumulator';
|
|
4
4
|
import { ChatServiceHttpClient } from '../../../utils/chatServiceHttpClient';
|
|
@@ -12,15 +12,19 @@ export class OpenAIChatService {
|
|
|
12
12
|
* @param model Name of the model to use
|
|
13
13
|
* @param visionModel Name of the vision model
|
|
14
14
|
*/
|
|
15
|
-
constructor(apiKey, model = MODEL_GPT_4O_MINI, visionModel = MODEL_GPT_4O_MINI, tools, endpoint = ENDPOINT_OPENAI_CHAT_COMPLETIONS_API, mcpServers = [], responseLength) {
|
|
15
|
+
constructor(apiKey, model = MODEL_GPT_4O_MINI, visionModel = MODEL_GPT_4O_MINI, tools, endpoint = ENDPOINT_OPENAI_CHAT_COMPLETIONS_API, mcpServers = [], responseLength, verbosity, reasoning_effort, enableReasoningSummary = false) {
|
|
16
16
|
/** Provider name */
|
|
17
17
|
this.provider = 'openai';
|
|
18
18
|
this.apiKey = apiKey;
|
|
19
19
|
this.model = model;
|
|
20
20
|
this.tools = tools || [];
|
|
21
|
+
// Keep the endpoint as specified - no auto-switching
|
|
21
22
|
this.endpoint = endpoint;
|
|
22
23
|
this.mcpServers = mcpServers;
|
|
23
24
|
this.responseLength = responseLength;
|
|
25
|
+
this.verbosity = verbosity;
|
|
26
|
+
this.reasoning_effort = reasoning_effort;
|
|
27
|
+
this.enableReasoningSummary = enableReasoningSummary;
|
|
24
28
|
// check if the vision model is supported
|
|
25
29
|
if (!VISION_SUPPORTED_MODELS.includes(visionModel)) {
|
|
26
30
|
throw new Error(`Model ${visionModel} does not support vision capabilities.`);
|
|
@@ -51,8 +55,27 @@ export class OpenAIChatService {
|
|
|
51
55
|
// not use tools
|
|
52
56
|
if (this.tools.length === 0) {
|
|
53
57
|
const res = await this.callOpenAI(messages, this.model, true);
|
|
54
|
-
const
|
|
55
|
-
|
|
58
|
+
const isResponsesAPI = this.endpoint === ENDPOINT_OPENAI_RESPONSES_API;
|
|
59
|
+
try {
|
|
60
|
+
if (isResponsesAPI) {
|
|
61
|
+
// Use Responses API parser for GPT-5 and other models using Responses API
|
|
62
|
+
const result = await this.parseResponsesStream(res, onPartialResponse);
|
|
63
|
+
const full = result.blocks
|
|
64
|
+
.filter((b) => b.type === 'text')
|
|
65
|
+
.map((b) => b.text)
|
|
66
|
+
.join('');
|
|
67
|
+
await onCompleteResponse(full);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// Use standard Chat Completions API parser
|
|
71
|
+
const full = await this.handleStream(res, onPartialResponse);
|
|
72
|
+
await onCompleteResponse(full);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.error('[processChat] Error in streaming/completion:', error);
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
56
79
|
return;
|
|
57
80
|
}
|
|
58
81
|
// use tools
|
|
@@ -82,8 +105,27 @@ export class OpenAIChatService {
|
|
|
82
105
|
// not use tools
|
|
83
106
|
if (this.tools.length === 0) {
|
|
84
107
|
const res = await this.callOpenAI(messages, this.visionModel, true);
|
|
85
|
-
const
|
|
86
|
-
|
|
108
|
+
const isResponsesAPI = this.endpoint === ENDPOINT_OPENAI_RESPONSES_API;
|
|
109
|
+
try {
|
|
110
|
+
if (isResponsesAPI) {
|
|
111
|
+
// Use Responses API parser for GPT-5 and other models using Responses API
|
|
112
|
+
const result = await this.parseResponsesStream(res, onPartialResponse);
|
|
113
|
+
const full = result.blocks
|
|
114
|
+
.filter((b) => b.type === 'text')
|
|
115
|
+
.map((b) => b.text)
|
|
116
|
+
.join('');
|
|
117
|
+
await onCompleteResponse(full);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
// Use standard Chat Completions API parser
|
|
121
|
+
const full = await this.handleStream(res, onPartialResponse);
|
|
122
|
+
await onCompleteResponse(full);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (streamError) {
|
|
126
|
+
console.error('[processVisionChat] Error in streaming/completion:', streamError);
|
|
127
|
+
throw streamError;
|
|
128
|
+
}
|
|
87
129
|
return;
|
|
88
130
|
}
|
|
89
131
|
// use tools
|
|
@@ -170,7 +212,7 @@ export class OpenAIChatService {
|
|
|
170
212
|
body.max_output_tokens = tokenLimit;
|
|
171
213
|
}
|
|
172
214
|
else {
|
|
173
|
-
body.
|
|
215
|
+
body.max_completion_tokens = tokenLimit;
|
|
174
216
|
}
|
|
175
217
|
// Handle messages format based on endpoint
|
|
176
218
|
if (isResponsesAPI) {
|
|
@@ -179,6 +221,39 @@ export class OpenAIChatService {
|
|
|
179
221
|
else {
|
|
180
222
|
body.messages = messages;
|
|
181
223
|
}
|
|
224
|
+
// Add GPT-5 specific parameters
|
|
225
|
+
if (isGPT5Model(model)) {
|
|
226
|
+
// For Responses API, use nested structure
|
|
227
|
+
if (isResponsesAPI) {
|
|
228
|
+
if (this.reasoning_effort) {
|
|
229
|
+
body.reasoning = {
|
|
230
|
+
...body.reasoning,
|
|
231
|
+
effort: this.reasoning_effort,
|
|
232
|
+
};
|
|
233
|
+
// Only add summary if explicitly enabled (requires org verification)
|
|
234
|
+
if (this.enableReasoningSummary) {
|
|
235
|
+
body.reasoning.summary = 'auto';
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (this.verbosity) {
|
|
239
|
+
body.text = {
|
|
240
|
+
...body.text,
|
|
241
|
+
format: { type: 'text' },
|
|
242
|
+
verbosity: this.verbosity,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
// For Chat Completions API, add GPT-5 parameters directly (flat structure)
|
|
248
|
+
// Example: { "reasoning_effort": "minimal", "verbosity": "low" }
|
|
249
|
+
if (this.reasoning_effort) {
|
|
250
|
+
body.reasoning_effort = this.reasoning_effort;
|
|
251
|
+
}
|
|
252
|
+
if (this.verbosity) {
|
|
253
|
+
body.verbosity = this.verbosity;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
182
257
|
// Add tools if available
|
|
183
258
|
const tools = this.buildToolsDefinition();
|
|
184
259
|
if (tools.length > 0) {
|
|
@@ -207,16 +282,35 @@ export class OpenAIChatService {
|
|
|
207
282
|
*/
|
|
208
283
|
cleanMessagesForResponsesAPI(messages) {
|
|
209
284
|
return messages.map((msg) => {
|
|
285
|
+
// Convert 'tool' role to 'user' for Responses API compatibility
|
|
286
|
+
const role = msg.role === 'tool' ? 'user' : msg.role;
|
|
210
287
|
const cleanMsg = {
|
|
211
|
-
role:
|
|
288
|
+
role: role,
|
|
212
289
|
};
|
|
213
290
|
// Handle content (text or vision)
|
|
214
291
|
if (typeof msg.content === 'string') {
|
|
215
292
|
cleanMsg.content = msg.content;
|
|
216
293
|
}
|
|
217
294
|
else if (Array.isArray(msg.content)) {
|
|
218
|
-
// Vision message case
|
|
219
|
-
cleanMsg.content = msg.content
|
|
295
|
+
// Vision message case - convert VisionBlock types for Responses API
|
|
296
|
+
cleanMsg.content = msg.content.map((block) => {
|
|
297
|
+
if (block.type === 'text') {
|
|
298
|
+
// Convert 'text' to 'input_text' for Responses API
|
|
299
|
+
return {
|
|
300
|
+
type: 'input_text',
|
|
301
|
+
text: block.text,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
else if (block.type === 'image_url') {
|
|
305
|
+
// For Responses API, image_url should be a direct string, not an object
|
|
306
|
+
return {
|
|
307
|
+
type: 'input_image',
|
|
308
|
+
image_url: block.image_url.url, // Extract the URL string directly
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
// Return as-is for any other types
|
|
312
|
+
return block;
|
|
313
|
+
});
|
|
220
314
|
}
|
|
221
315
|
else {
|
|
222
316
|
cleanMsg.content = msg.content;
|
|
@@ -265,10 +359,9 @@ export class OpenAIChatService {
|
|
|
265
359
|
buildMCPToolsDefinition() {
|
|
266
360
|
return this.mcpServers.map((server) => {
|
|
267
361
|
const mcpDef = {
|
|
268
|
-
type: 'mcp',
|
|
269
|
-
server_label: server.name,
|
|
270
|
-
server_url: server.url,
|
|
271
|
-
require_approval: 'never',
|
|
362
|
+
type: 'mcp', // Using 'mcp' as indicated by the error message
|
|
363
|
+
server_label: server.name, // Use server_label as required by API
|
|
364
|
+
server_url: server.url, // Use server_url instead of url
|
|
272
365
|
};
|
|
273
366
|
if (server.tool_configuration?.allowed_tools) {
|
|
274
367
|
mcpDef.allowed_tools = server.tool_configuration.allowed_tools;
|
|
@@ -421,7 +514,11 @@ export class OpenAIChatService {
|
|
|
421
514
|
// Process event separated by empty line
|
|
422
515
|
try {
|
|
423
516
|
const json = JSON.parse(eventData);
|
|
424
|
-
this.handleResponsesSSEEvent(eventType, json, onPartial, textBlocks, toolCallsMap);
|
|
517
|
+
const completionResult = this.handleResponsesSSEEvent(eventType, json, onPartial, textBlocks, toolCallsMap);
|
|
518
|
+
// Check if response is completed
|
|
519
|
+
if (completionResult === 'completed') {
|
|
520
|
+
// Response completed
|
|
521
|
+
}
|
|
425
522
|
}
|
|
426
523
|
catch (e) {
|
|
427
524
|
console.warn('Failed to parse SSE data:', eventData);
|
|
@@ -446,6 +543,7 @@ export class OpenAIChatService {
|
|
|
446
543
|
}
|
|
447
544
|
/**
|
|
448
545
|
* Handle specific SSE events from Responses API
|
|
546
|
+
* @returns 'completed' if the response is completed, undefined otherwise
|
|
449
547
|
*/
|
|
450
548
|
handleResponsesSSEEvent(eventType, data, onPartial, textBlocks, toolCallsMap) {
|
|
451
549
|
switch (eventType) {
|
|
@@ -488,20 +586,24 @@ export class OpenAIChatService {
|
|
|
488
586
|
}
|
|
489
587
|
}
|
|
490
588
|
break;
|
|
491
|
-
// Text completion events
|
|
589
|
+
// Text completion events - do not add text here as it's already accumulated via delta events
|
|
492
590
|
case 'response.output_text.done':
|
|
493
591
|
case 'response.content_part.done':
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
}
|
|
592
|
+
// These events contain the complete text but we've already accumulated it through deltas
|
|
593
|
+
// Adding it here would cause duplicate display
|
|
497
594
|
break;
|
|
498
595
|
// Response completion events
|
|
499
596
|
case 'response.completed':
|
|
597
|
+
return 'completed';
|
|
598
|
+
// GPT-5 reasoning token events (not visible but counted for billing)
|
|
599
|
+
case 'response.reasoning.started':
|
|
600
|
+
case 'response.reasoning.delta':
|
|
601
|
+
case 'response.reasoning.done':
|
|
500
602
|
break;
|
|
501
603
|
default:
|
|
502
|
-
// Ignore other events
|
|
503
604
|
break;
|
|
504
605
|
}
|
|
606
|
+
return undefined;
|
|
505
607
|
}
|
|
506
608
|
/**
|
|
507
609
|
* Parse non-streaming response from Responses API
|