@zimtsui/brainswitch 0.0.40 → 0.0.42
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 +9 -20
- package/build/adaptor.d.ts +4 -2
- package/build/adaptor.js +27 -10
- package/build/adaptor.js.map +1 -1
- package/build/agentloop.d.ts +1 -1
- package/build/agentloop.js +2 -4
- package/build/agentloop.js.map +1 -1
- package/build/api-types/anthropic.d.ts +18 -22
- package/build/api-types/anthropic.js +81 -72
- package/build/api-types/anthropic.js.map +1 -1
- package/build/api-types/google.d.ts +13 -18
- package/build/api-types/google.js +32 -33
- package/build/api-types/google.js.map +1 -1
- package/build/api-types/openai-chat-completions.d.ts +17 -19
- package/build/api-types/openai-chat-completions.js +101 -85
- package/build/api-types/openai-chat-completions.js.map +1 -1
- package/build/api-types/openai-responses.d.ts +13 -13
- package/build/api-types/openai-responses.js +59 -51
- package/build/api-types/openai-responses.js.map +1 -1
- package/build/compatible-engine.d.ts +19 -24
- package/build/compatible-engine.js +54 -56
- package/build/compatible-engine.js.map +1 -1
- package/build/compatible-engines.d/aliyun.d.ts +38 -55
- package/build/compatible-engines.d/aliyun.js +91 -143
- package/build/compatible-engines.d/aliyun.js.map +1 -1
- package/build/compatible-engines.d/anthropic.d.ts +35 -60
- package/build/compatible-engines.d/anthropic.js +233 -282
- package/build/compatible-engines.d/anthropic.js.map +1 -1
- package/build/compatible-engines.d/google.d.ts +38 -59
- package/build/compatible-engines.d/google.js +172 -231
- package/build/compatible-engines.d/google.js.map +1 -1
- package/build/compatible-engines.d/openai-chatcompletions.d/monolith.d.ts +7 -14
- package/build/compatible-engines.d/openai-chatcompletions.d/monolith.js +64 -66
- package/build/compatible-engines.d/openai-chatcompletions.d/monolith.js.map +1 -1
- package/build/compatible-engines.d/openai-chatcompletions.d/stream.d.ts +10 -16
- package/build/compatible-engines.d/openai-chatcompletions.d/stream.js +169 -165
- package/build/compatible-engines.d/openai-chatcompletions.d/stream.js.map +1 -1
- package/build/compatible-engines.d/openai-chatcompletions.d.ts +12 -18
- package/build/compatible-engines.d/openai-chatcompletions.js +64 -64
- package/build/compatible-engines.d/openai-chatcompletions.js.map +1 -1
- package/build/compatible-engines.d/openai-responses.d.ts +46 -68
- package/build/compatible-engines.d/openai-responses.js +222 -274
- package/build/compatible-engines.d/openai-responses.js.map +1 -1
- package/build/engine.d.ts +10 -24
- package/build/engine.js +25 -38
- package/build/engine.js.map +1 -1
- package/build/exports.d.ts +1 -0
- package/build/exports.js +1 -0
- package/build/exports.js.map +1 -1
- package/build/frontmatter.js +2 -2
- package/build/frontmatter.js.map +1 -1
- package/build/function.js +9 -4
- package/build/function.js.map +1 -1
- package/build/inference-context.d.ts +1 -10
- package/build/inference-context.js +0 -2
- package/build/inference-context.js.map +1 -1
- package/build/native-engines.d/google/agentloop.d.ts +1 -1
- package/build/native-engines.d/google/agentloop.js +2 -4
- package/build/native-engines.d/google/agentloop.js.map +1 -1
- package/build/native-engines.d/google/engine.d.ts +56 -73
- package/build/native-engines.d/google/engine.js +265 -295
- package/build/native-engines.d/google/engine.js.map +1 -1
- package/build/native-engines.d/google/exports.d.ts +3 -2
- package/build/native-engines.d/google/exports.js +3 -2
- package/build/native-engines.d/google/exports.js.map +1 -1
- package/build/native-engines.d/google/session.js +6 -3
- package/build/native-engines.d/google/session.js.map +1 -1
- package/build/native-engines.d/openai-responses/agentloop.d.ts +1 -1
- package/build/native-engines.d/openai-responses/agentloop.js +2 -5
- package/build/native-engines.d/openai-responses/agentloop.js.map +1 -1
- package/build/native-engines.d/openai-responses/engine.d.ts +59 -78
- package/build/native-engines.d/openai-responses/engine.js +285 -321
- package/build/native-engines.d/openai-responses/engine.js.map +1 -1
- package/build/native-engines.d/openai-responses/exports.d.ts +4 -2
- package/build/native-engines.d/openai-responses/exports.js +4 -2
- package/build/native-engines.d/openai-responses/exports.js.map +1 -1
- package/build/native-engines.d/openai-responses/session.js +21 -8
- package/build/native-engines.d/openai-responses/session.js.map +1 -1
- package/build/session.js +12 -5
- package/build/session.js.map +1 -1
- package/build/telemetry.d.ts +6 -0
- package/build/telemetry.js +3 -0
- package/build/telemetry.js.map +1 -0
- package/build/throttle.d.ts +1 -1
- package/build/throttle.js +6 -6
- package/build/throttle.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -1,376 +1,340 @@
|
|
|
1
1
|
import { Function } from "../../function.js";
|
|
2
2
|
import { RoleMessage } from "./session.js";
|
|
3
3
|
import { Tool } from "./tool.js";
|
|
4
|
-
import { ResponseInvalid, Engine,
|
|
4
|
+
import { ResponseInvalid, Engine, USER_ABORTION, InferenceTimeout } from "../../engine.js";
|
|
5
5
|
import {} from "../../inference-context.js";
|
|
6
6
|
import OpenAI from 'openai';
|
|
7
|
-
import
|
|
8
|
-
import { fetch } from 'undici';
|
|
7
|
+
import * as Undici from 'undici';
|
|
9
8
|
import { OpenAIResponsesEngine } from "../../api-types/openai-responses.js";
|
|
9
|
+
import { Throttle } from "../../throttle.js";
|
|
10
|
+
import {} from "../../telemetry.js";
|
|
10
11
|
export var OpenAIResponsesNativeEngine;
|
|
11
12
|
(function (OpenAIResponsesNativeEngine) {
|
|
12
|
-
let
|
|
13
|
-
(function (
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
13
|
+
let OwnProps;
|
|
14
|
+
(function (OwnProps) {
|
|
15
|
+
function init(options) {
|
|
16
|
+
return {
|
|
17
|
+
apiURL: new URL(`${this.baseUrl}/responses`),
|
|
18
|
+
toolChoice: options.toolChoice ?? Function.ToolChoice.AUTO,
|
|
19
|
+
applyPatch: options.applyPatch ?? false,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
OwnProps.init = init;
|
|
23
|
+
})(OwnProps = OpenAIResponsesNativeEngine.OwnProps || (OpenAIResponsesNativeEngine.OwnProps = {}));
|
|
24
|
+
async function stateless(wfctx, session) {
|
|
25
|
+
for (let retry = 0;; retry++) {
|
|
26
|
+
const signalTimeout = this.timeout ? AbortSignal.timeout(this.timeout) : undefined;
|
|
27
|
+
const signal = wfctx.signal && signalTimeout ? AbortSignal.any([
|
|
28
|
+
wfctx.signal,
|
|
29
|
+
signalTimeout,
|
|
30
|
+
]) : wfctx.signal || signalTimeout;
|
|
31
|
+
try {
|
|
32
|
+
return await this.fetch(wfctx, session, signal);
|
|
26
33
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
else if (signalTimeout?.aborted)
|
|
41
|
-
e = new InferenceTimeout(undefined, { cause: e }); // 推理超时
|
|
42
|
-
else if (e instanceof ResponseInvalid) { } // 模型抽风
|
|
43
|
-
else if (e instanceof TypeError) { } // 网络故障
|
|
44
|
-
else
|
|
45
|
-
throw e;
|
|
46
|
-
if (retry < 3)
|
|
47
|
-
ctx.logger.message?.warn(e);
|
|
48
|
-
else
|
|
49
|
-
throw e;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
if (wfctx.signal?.aborted)
|
|
36
|
+
throw USER_ABORTION; // 用户中止
|
|
37
|
+
else if (signalTimeout?.aborted)
|
|
38
|
+
e = new InferenceTimeout(undefined, { cause: e }); // 推理超时
|
|
39
|
+
else if (e instanceof ResponseInvalid) { } // 模型抽风
|
|
40
|
+
else if (e instanceof TypeError) { } // 网络故障
|
|
41
|
+
else
|
|
42
|
+
throw e;
|
|
43
|
+
if (retry < 3)
|
|
44
|
+
this.logger.message?.warn(e);
|
|
45
|
+
else
|
|
46
|
+
throw e;
|
|
52
47
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
OpenAIResponsesNativeEngine.stateless = stateless;
|
|
51
|
+
async function stateful(wfctx, session) {
|
|
52
|
+
const response = await this.stateless(wfctx, session);
|
|
53
|
+
session.chatMessages.push(response);
|
|
54
|
+
return response;
|
|
55
|
+
}
|
|
56
|
+
OpenAIResponsesNativeEngine.stateful = stateful;
|
|
57
|
+
function appendUserMessage(session, message) {
|
|
58
|
+
return {
|
|
59
|
+
...session,
|
|
60
|
+
chatMessages: [...session.chatMessages, message],
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
OpenAIResponsesNativeEngine.appendUserMessage = appendUserMessage;
|
|
64
|
+
function pushUserMessage(session, message) {
|
|
65
|
+
session.chatMessages.push(message);
|
|
66
|
+
return session;
|
|
67
|
+
}
|
|
68
|
+
OpenAIResponsesNativeEngine.pushUserMessage = pushUserMessage;
|
|
69
|
+
function convertToAiMessage(output) {
|
|
70
|
+
const parts = output.flatMap((item) => {
|
|
71
|
+
if (item.type === 'message') {
|
|
72
|
+
if (item.content.every(part => part.type === 'output_text')) { }
|
|
73
|
+
else
|
|
74
|
+
throw new Error();
|
|
75
|
+
return [RoleMessage.Part.Text.create(item.content.map(part => part.text).join(''))];
|
|
57
76
|
}
|
|
58
|
-
|
|
77
|
+
else if (item.type === 'function_call')
|
|
78
|
+
return [this.convertToFunctionCall(item)];
|
|
79
|
+
else if (item.type === 'reasoning')
|
|
80
|
+
return [];
|
|
81
|
+
else if (item.type === 'apply_patch_call')
|
|
82
|
+
return [Tool.ApplyPatch.Call.create(item)];
|
|
83
|
+
else
|
|
84
|
+
throw new Error();
|
|
85
|
+
});
|
|
86
|
+
return RoleMessage.Ai.create(parts, output);
|
|
87
|
+
}
|
|
88
|
+
OpenAIResponsesNativeEngine.convertToAiMessage = convertToAiMessage;
|
|
89
|
+
function convertFromUserMessage(userMessage) {
|
|
90
|
+
return userMessage.getParts().map(part => {
|
|
91
|
+
if (part instanceof RoleMessage.Part.Text.Instance)
|
|
59
92
|
return {
|
|
60
|
-
|
|
61
|
-
|
|
93
|
+
type: 'message',
|
|
94
|
+
role: 'user',
|
|
95
|
+
content: part.text,
|
|
62
96
|
};
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
97
|
+
else if (part instanceof Function.Response)
|
|
98
|
+
return this.convertFromFunctionResponse(part);
|
|
99
|
+
else if (part instanceof Tool.ApplyPatch.Response)
|
|
100
|
+
return {
|
|
101
|
+
type: 'apply_patch_call_output',
|
|
102
|
+
call_id: part.id,
|
|
103
|
+
status: part.failure ? 'failed' : 'completed',
|
|
104
|
+
output: part.failure || undefined,
|
|
105
|
+
};
|
|
106
|
+
else
|
|
107
|
+
throw new Error();
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
OpenAIResponsesNativeEngine.convertFromUserMessage = convertFromUserMessage;
|
|
111
|
+
function convertFromDeveloperMessage(developerMessage) {
|
|
112
|
+
return developerMessage.getOnlyText();
|
|
113
|
+
}
|
|
114
|
+
OpenAIResponsesNativeEngine.convertFromDeveloperMessage = convertFromDeveloperMessage;
|
|
115
|
+
function convertFromChatMessage(chatMessage) {
|
|
116
|
+
if (chatMessage instanceof RoleMessage.User.Instance)
|
|
117
|
+
return this.convertFromUserMessage(chatMessage);
|
|
118
|
+
else if (chatMessage instanceof RoleMessage.Ai.Instance)
|
|
119
|
+
return chatMessage.getRaw();
|
|
120
|
+
else
|
|
121
|
+
throw new Error();
|
|
122
|
+
}
|
|
123
|
+
OpenAIResponsesNativeEngine.convertFromChatMessage = convertFromChatMessage;
|
|
124
|
+
function convertFromToolChoice(toolChoice) {
|
|
125
|
+
if (toolChoice === Function.ToolChoice.NONE)
|
|
126
|
+
return 'none';
|
|
127
|
+
else if (toolChoice === Function.ToolChoice.REQUIRED)
|
|
128
|
+
return 'required';
|
|
129
|
+
else if (toolChoice === Function.ToolChoice.AUTO)
|
|
130
|
+
return 'auto';
|
|
131
|
+
else {
|
|
132
|
+
return {
|
|
133
|
+
type: 'allowed_tools',
|
|
134
|
+
mode: 'required',
|
|
135
|
+
tools: toolChoice.map(name => {
|
|
136
|
+
if (name === Tool.Choice.APPLY_PATCH)
|
|
137
|
+
return { type: 'apply_patch' };
|
|
80
138
|
else
|
|
81
|
-
|
|
82
|
-
})
|
|
83
|
-
|
|
139
|
+
return { type: 'function', name };
|
|
140
|
+
}),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
OpenAIResponsesNativeEngine.convertFromToolChoice = convertFromToolChoice;
|
|
145
|
+
function makeMonolithParams(session) {
|
|
146
|
+
const fdentries = Object.entries(this.fdm);
|
|
147
|
+
const tools = fdentries.map(fdentry => this.convertFromFunctionDeclarationEntry(fdentry));
|
|
148
|
+
if (this.applyPatch)
|
|
149
|
+
tools.push({ type: 'apply_patch' });
|
|
150
|
+
return {
|
|
151
|
+
model: this.model,
|
|
152
|
+
include: ['reasoning.encrypted_content'],
|
|
153
|
+
store: false,
|
|
154
|
+
input: session.chatMessages.flatMap(chatMessage => this.convertFromChatMessage(chatMessage)),
|
|
155
|
+
instructions: session.developerMessage && this.convertFromDeveloperMessage(session.developerMessage),
|
|
156
|
+
tools: tools.length ? tools : undefined,
|
|
157
|
+
tool_choice: tools.length ? this.convertFromToolChoice(this.toolChoice) : undefined,
|
|
158
|
+
parallel_tool_calls: fdentries.length ? this.parallelToolCall : undefined,
|
|
159
|
+
max_output_tokens: this.maxTokens,
|
|
160
|
+
...this.additionalOptions,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
OpenAIResponsesNativeEngine.makeMonolithParams = makeMonolithParams;
|
|
164
|
+
function logAiMessage(output) {
|
|
165
|
+
for (const item of output)
|
|
166
|
+
if (item.type === 'message') {
|
|
167
|
+
if (item.content.every(part => part.type === 'output_text')) { }
|
|
168
|
+
else
|
|
169
|
+
throw new Error();
|
|
170
|
+
this.logger.inference?.debug(item.content.map(part => part.text).join('') + '\n');
|
|
84
171
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
172
|
+
else if (item.type === 'function_call')
|
|
173
|
+
this.logger.message?.debug(item);
|
|
174
|
+
else if (item.type === 'apply_patch_call')
|
|
175
|
+
this.logger.message?.debug(item);
|
|
176
|
+
}
|
|
177
|
+
OpenAIResponsesNativeEngine.logAiMessage = logAiMessage;
|
|
178
|
+
async function fetch(wfctx, session, signal) {
|
|
179
|
+
return await this.fetchRaw(wfctx, session, signal).catch(e => Promise.reject(e instanceof OpenAI.APIError ? new ResponseInvalid(undefined, { cause: e }) : e));
|
|
180
|
+
}
|
|
181
|
+
OpenAIResponsesNativeEngine.fetch = fetch;
|
|
182
|
+
async function fetchRaw(wfctx, session, signal) {
|
|
183
|
+
const params = this.makeMonolithParams(session);
|
|
184
|
+
this.logger.message?.trace(params);
|
|
185
|
+
await this.throttle.requests(wfctx);
|
|
186
|
+
const res = await Undici.fetch(this.apiURL, {
|
|
187
|
+
method: 'POST',
|
|
188
|
+
headers: new Headers({
|
|
189
|
+
'Content-Type': 'application/json',
|
|
190
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
191
|
+
}),
|
|
192
|
+
body: JSON.stringify(params),
|
|
193
|
+
dispatcher: this.proxyAgent,
|
|
194
|
+
signal,
|
|
195
|
+
});
|
|
196
|
+
if (res.ok) { }
|
|
197
|
+
else
|
|
198
|
+
throw new Error(undefined, { cause: res });
|
|
199
|
+
const response = await res.json();
|
|
200
|
+
this.logger.message?.trace(response);
|
|
201
|
+
if (response.status === 'incomplete' && response.incomplete_details?.reason === 'max_output_tokens')
|
|
202
|
+
throw new ResponseInvalid('Token limit exceeded.', { cause: response });
|
|
203
|
+
if (response.status === 'completed') { }
|
|
204
|
+
else
|
|
205
|
+
throw new ResponseInvalid('Abnormal response status', { cause: response });
|
|
206
|
+
this.logAiMessage(response.output);
|
|
207
|
+
if (response.usage) { }
|
|
208
|
+
else
|
|
209
|
+
throw new Error();
|
|
210
|
+
const cost = this.calcCost(response.usage);
|
|
211
|
+
wfctx.cost?.(cost);
|
|
212
|
+
this.logger.message?.debug(response.usage);
|
|
213
|
+
const aiMessage = this.convertToAiMessage(response.output);
|
|
214
|
+
this.validateToolCallsByToolChoice(aiMessage.getToolCalls());
|
|
215
|
+
return aiMessage;
|
|
216
|
+
}
|
|
217
|
+
OpenAIResponsesNativeEngine.fetchRaw = fetchRaw;
|
|
218
|
+
function validateToolCallsByToolChoice(toolCalls) {
|
|
219
|
+
if (this.toolChoice === Function.ToolChoice.REQUIRED)
|
|
220
|
+
if (toolCalls.length) { }
|
|
221
|
+
else
|
|
222
|
+
throw new ResponseInvalid('Invalid function call', { cause: toolCalls });
|
|
223
|
+
else if (this.toolChoice instanceof Array)
|
|
224
|
+
for (const tc of toolCalls) {
|
|
225
|
+
if (tc instanceof Function.Call)
|
|
226
|
+
if (this.toolChoice.includes(tc.name)) { }
|
|
102
227
|
else
|
|
103
|
-
throw new
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
}
|
|
109
|
-
convertFromChatMessage(chatMessage) {
|
|
110
|
-
if (chatMessage instanceof RoleMessage.User.Instance)
|
|
111
|
-
return this.convertFromUserMessage(chatMessage);
|
|
112
|
-
else if (chatMessage instanceof RoleMessage.Ai.Instance)
|
|
113
|
-
return chatMessage.getRaw();
|
|
228
|
+
throw new ResponseInvalid('Invalid function call', { cause: toolCalls });
|
|
229
|
+
else if (tc instanceof Tool.ApplyPatch.Call)
|
|
230
|
+
if (this.toolChoice.includes(Tool.Choice.APPLY_PATCH)) { }
|
|
231
|
+
else
|
|
232
|
+
throw new ResponseInvalid('Invalid function call', { cause: toolCalls });
|
|
114
233
|
else
|
|
115
234
|
throw new Error();
|
|
116
235
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
return 'auto';
|
|
124
|
-
else {
|
|
125
|
-
return {
|
|
126
|
-
type: 'allowed_tools',
|
|
127
|
-
mode: 'required',
|
|
128
|
-
tools: toolChoice.map(name => {
|
|
129
|
-
if (name === Tool.Choice.APPLY_PATCH)
|
|
130
|
-
return { type: 'apply_patch' };
|
|
131
|
-
else
|
|
132
|
-
return { type: 'function', name };
|
|
133
|
-
}),
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
makeMonolithParams(session) {
|
|
138
|
-
const fdentries = Object.entries(this.instance.fdm);
|
|
139
|
-
const tools = fdentries.map(fdentry => this.instance.convertFromFunctionDeclarationEntry(fdentry));
|
|
140
|
-
if (this.applyPatch)
|
|
141
|
-
tools.push({ type: 'apply_patch' });
|
|
142
|
-
return {
|
|
143
|
-
model: this.instance.model,
|
|
144
|
-
include: ['reasoning.encrypted_content'],
|
|
145
|
-
store: false,
|
|
146
|
-
input: session.chatMessages.flatMap(chatMessage => this.convertFromChatMessage(chatMessage)),
|
|
147
|
-
instructions: session.developerMessage && this.convertFromDeveloperMessage(session.developerMessage),
|
|
148
|
-
tools: tools.length ? tools : undefined,
|
|
149
|
-
tool_choice: tools.length ? this.convertFromToolChoice(this.toolChoice) : undefined,
|
|
150
|
-
parallel_tool_calls: fdentries.length ? this.parallel : undefined,
|
|
151
|
-
max_output_tokens: this.instance.maxTokens,
|
|
152
|
-
...this.instance.additionalOptions,
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
logAiMessage(ctx, output) {
|
|
156
|
-
for (const item of output)
|
|
157
|
-
if (item.type === 'message') {
|
|
158
|
-
assert(item.content.every(part => part.type === 'output_text'));
|
|
159
|
-
ctx.logger.inference?.debug(item.content.map(part => part.text).join('') + '\n');
|
|
160
|
-
}
|
|
161
|
-
else if (item.type === 'function_call')
|
|
162
|
-
ctx.logger.message?.debug(item);
|
|
163
|
-
else if (item.type === 'apply_patch_call')
|
|
164
|
-
ctx.logger.message?.debug(item);
|
|
165
|
-
}
|
|
166
|
-
async fetch(ctx, session, signal) {
|
|
167
|
-
return await this.fetchRaw(ctx, session, signal).catch(e => Promise.reject(e instanceof OpenAI.APIError ? new ResponseInvalid(undefined, { cause: e }) : e));
|
|
168
|
-
}
|
|
169
|
-
async fetchRaw(ctx, session, signal) {
|
|
170
|
-
const params = this.makeMonolithParams(session);
|
|
171
|
-
ctx.logger.message?.trace(params);
|
|
172
|
-
await this.instance.throttle.requests(ctx);
|
|
173
|
-
const res = await fetch(this.apiURL, {
|
|
174
|
-
method: 'POST',
|
|
175
|
-
headers: new Headers({
|
|
176
|
-
'Content-Type': 'application/json',
|
|
177
|
-
'Authorization': `Bearer ${this.instance.apiKey}`,
|
|
178
|
-
}),
|
|
179
|
-
body: JSON.stringify(params),
|
|
180
|
-
dispatcher: this.instance.proxyAgent,
|
|
181
|
-
signal,
|
|
182
|
-
});
|
|
183
|
-
assert(res.ok, new Error(undefined, { cause: res }));
|
|
184
|
-
const response = await res.json();
|
|
185
|
-
ctx.logger.message?.trace(response);
|
|
186
|
-
if (response.status === 'incomplete' && response.incomplete_details?.reason === 'max_output_tokens')
|
|
187
|
-
throw new ResponseInvalid('Token limit exceeded.', { cause: response });
|
|
188
|
-
assert(response.status === 'completed', new ResponseInvalid('Abnormal response status', { cause: response }));
|
|
189
|
-
this.logAiMessage(ctx, response.output);
|
|
190
|
-
assert(response.usage);
|
|
191
|
-
const cost = this.instance.calcCost(response.usage);
|
|
192
|
-
ctx.logger.cost?.(cost);
|
|
193
|
-
ctx.logger.message?.debug(response.usage);
|
|
194
|
-
const aiMessage = this.convertToAiMessage(response.output);
|
|
195
|
-
this.validateToolCallsByToolChoice(aiMessage.getToolCalls());
|
|
196
|
-
return aiMessage;
|
|
197
|
-
}
|
|
198
|
-
validateToolCallsByToolChoice(toolCalls) {
|
|
199
|
-
if (this.toolChoice === Function.ToolChoice.REQUIRED)
|
|
200
|
-
assert(toolCalls.length, new ResponseInvalid('Invalid function call', { cause: toolCalls }));
|
|
201
|
-
else if (this.toolChoice instanceof Array)
|
|
202
|
-
for (const tc of toolCalls) {
|
|
203
|
-
if (tc instanceof Function.Call)
|
|
204
|
-
assert(this.toolChoice.includes(tc.name), new ResponseInvalid('Invalid function call', { cause: toolCalls }));
|
|
205
|
-
else if (tc instanceof Tool.ApplyPatch.Call)
|
|
206
|
-
assert(this.toolChoice.includes(Tool.Choice.APPLY_PATCH), new ResponseInvalid('Invalid function call', { cause: toolCalls }));
|
|
207
|
-
else
|
|
208
|
-
throw new Error();
|
|
209
|
-
}
|
|
210
|
-
else if (this.toolChoice === Function.ToolChoice.NONE)
|
|
211
|
-
assert(!toolCalls.length, new ResponseInvalid('Invalid function call', { cause: toolCalls }));
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
Base.Instance = Instance;
|
|
215
|
-
})(Base = OpenAIResponsesNativeEngine.Base || (OpenAIResponsesNativeEngine.Base = {}));
|
|
236
|
+
else if (this.toolChoice === Function.ToolChoice.NONE)
|
|
237
|
+
if (!toolCalls.length) { }
|
|
238
|
+
else
|
|
239
|
+
throw new ResponseInvalid('Invalid function call', { cause: toolCalls });
|
|
240
|
+
}
|
|
241
|
+
OpenAIResponsesNativeEngine.validateToolCallsByToolChoice = validateToolCallsByToolChoice;
|
|
216
242
|
class Instance {
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
243
|
+
baseUrl;
|
|
244
|
+
apiKey;
|
|
245
|
+
model;
|
|
246
|
+
name;
|
|
247
|
+
inputPrice;
|
|
248
|
+
outputPrice;
|
|
249
|
+
cachePrice;
|
|
250
|
+
fdm;
|
|
251
|
+
additionalOptions;
|
|
252
|
+
throttle;
|
|
253
|
+
timeout;
|
|
254
|
+
maxTokens;
|
|
255
|
+
proxyAgent;
|
|
256
|
+
logger;
|
|
257
|
+
apiURL;
|
|
258
|
+
parallelToolCall;
|
|
259
|
+
applyPatch;
|
|
260
|
+
toolChoice;
|
|
220
261
|
constructor(options) {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
get name() {
|
|
244
|
-
return this.engineBase.name;
|
|
245
|
-
}
|
|
246
|
-
set name(value) {
|
|
247
|
-
this.engineBase.name = value;
|
|
248
|
-
}
|
|
249
|
-
get inputPrice() {
|
|
250
|
-
return this.engineBase.inputPrice;
|
|
251
|
-
}
|
|
252
|
-
set inputPrice(value) {
|
|
253
|
-
this.engineBase.inputPrice = value;
|
|
254
|
-
}
|
|
255
|
-
get outputPrice() {
|
|
256
|
-
return this.engineBase.outputPrice;
|
|
257
|
-
}
|
|
258
|
-
set outputPrice(value) {
|
|
259
|
-
this.engineBase.outputPrice = value;
|
|
260
|
-
}
|
|
261
|
-
get cachedPrice() {
|
|
262
|
-
return this.engineBase.cachedPrice;
|
|
263
|
-
}
|
|
264
|
-
set cachedPrice(value) {
|
|
265
|
-
this.engineBase.cachedPrice = value;
|
|
266
|
-
}
|
|
267
|
-
get fdm() {
|
|
268
|
-
return this.engineBase.fdm;
|
|
269
|
-
}
|
|
270
|
-
set fdm(value) {
|
|
271
|
-
this.engineBase.fdm = value;
|
|
272
|
-
}
|
|
273
|
-
get additionalOptions() {
|
|
274
|
-
return this.engineBase.additionalOptions;
|
|
275
|
-
}
|
|
276
|
-
set additionalOptions(value) {
|
|
277
|
-
this.engineBase.additionalOptions = value;
|
|
278
|
-
}
|
|
279
|
-
get throttle() {
|
|
280
|
-
return this.engineBase.throttle;
|
|
281
|
-
}
|
|
282
|
-
set throttle(value) {
|
|
283
|
-
this.engineBase.throttle = value;
|
|
284
|
-
}
|
|
285
|
-
get timeout() {
|
|
286
|
-
return this.engineBase.timeout;
|
|
287
|
-
}
|
|
288
|
-
set timeout(value) {
|
|
289
|
-
this.engineBase.timeout = value;
|
|
290
|
-
}
|
|
291
|
-
get maxTokens() {
|
|
292
|
-
return this.engineBase.maxTokens;
|
|
293
|
-
}
|
|
294
|
-
set maxTokens(value) {
|
|
295
|
-
this.engineBase.maxTokens = value;
|
|
296
|
-
}
|
|
297
|
-
get proxyAgent() {
|
|
298
|
-
return this.engineBase.proxyAgent;
|
|
299
|
-
}
|
|
300
|
-
set proxyAgent(value) {
|
|
301
|
-
this.engineBase.proxyAgent = value;
|
|
262
|
+
({
|
|
263
|
+
baseUrl: this.baseUrl,
|
|
264
|
+
apiKey: this.apiKey,
|
|
265
|
+
model: this.model,
|
|
266
|
+
name: this.name,
|
|
267
|
+
inputPrice: this.inputPrice,
|
|
268
|
+
outputPrice: this.outputPrice,
|
|
269
|
+
cachePrice: this.cachePrice,
|
|
270
|
+
fdm: this.fdm,
|
|
271
|
+
additionalOptions: this.additionalOptions,
|
|
272
|
+
throttle: this.throttle,
|
|
273
|
+
timeout: this.timeout,
|
|
274
|
+
maxTokens: this.maxTokens,
|
|
275
|
+
proxyAgent: this.proxyAgent,
|
|
276
|
+
logger: this.logger,
|
|
277
|
+
} = (Engine.OwnProps.init).call(this, options));
|
|
278
|
+
({ parallelToolCall: this.parallelToolCall } = (OpenAIResponsesEngine.OwnProps.init).call(this, options));
|
|
279
|
+
({
|
|
280
|
+
applyPatch: this.applyPatch,
|
|
281
|
+
toolChoice: this.toolChoice,
|
|
282
|
+
apiURL: this.apiURL,
|
|
283
|
+
} = (OwnProps.init).call(this, options));
|
|
302
284
|
}
|
|
303
285
|
convertFromFunctionResponse(fr) {
|
|
304
|
-
return
|
|
286
|
+
return (OpenAIResponsesEngine.convertFromFunctionResponse).call(this, fr);
|
|
305
287
|
}
|
|
306
288
|
calcCost(usage) {
|
|
307
|
-
return
|
|
289
|
+
return (OpenAIResponsesEngine.calcCost).call(this, usage);
|
|
308
290
|
}
|
|
309
291
|
convertFromFunctionDeclarationEntry(fdentry) {
|
|
310
|
-
return
|
|
292
|
+
return (OpenAIResponsesEngine.convertFromFunctionDeclarationEntry).call(this, fdentry);
|
|
311
293
|
}
|
|
312
294
|
convertToFunctionCall(apifc) {
|
|
313
|
-
return
|
|
314
|
-
}
|
|
315
|
-
get toolChoice() {
|
|
316
|
-
return this.openAIResponsesNativeEngineBase.toolChoice;
|
|
317
|
-
}
|
|
318
|
-
set toolChoice(value) {
|
|
319
|
-
this.openAIResponsesNativeEngineBase.toolChoice = value;
|
|
320
|
-
}
|
|
321
|
-
get parallel() {
|
|
322
|
-
return this.openAIResponsesNativeEngineBase.parallel;
|
|
323
|
-
}
|
|
324
|
-
set parallel(value) {
|
|
325
|
-
this.openAIResponsesNativeEngineBase.parallel = value;
|
|
326
|
-
}
|
|
327
|
-
get applyPatch() {
|
|
328
|
-
return this.openAIResponsesNativeEngineBase.applyPatch;
|
|
329
|
-
}
|
|
330
|
-
set applyPatch(value) {
|
|
331
|
-
this.openAIResponsesNativeEngineBase.applyPatch = value;
|
|
295
|
+
return (OpenAIResponsesEngine.convertToFunctionCall).call(this, apifc);
|
|
332
296
|
}
|
|
333
|
-
stateless(
|
|
334
|
-
return
|
|
297
|
+
stateless(wfctx, session) {
|
|
298
|
+
return (OpenAIResponsesNativeEngine.stateless).call(this, wfctx, session);
|
|
335
299
|
}
|
|
336
|
-
stateful(
|
|
337
|
-
return
|
|
300
|
+
stateful(wfctx, session) {
|
|
301
|
+
return (OpenAIResponsesNativeEngine.stateful).call(this, wfctx, session);
|
|
338
302
|
}
|
|
339
303
|
appendUserMessage(session, message) {
|
|
340
|
-
return
|
|
304
|
+
return (OpenAIResponsesNativeEngine.appendUserMessage).call(this, session, message);
|
|
341
305
|
}
|
|
342
306
|
pushUserMessage(session, message) {
|
|
343
|
-
return
|
|
307
|
+
return (OpenAIResponsesNativeEngine.pushUserMessage).call(this, session, message);
|
|
344
308
|
}
|
|
345
|
-
async fetch(
|
|
346
|
-
return
|
|
309
|
+
async fetch(wfctx, session, signal) {
|
|
310
|
+
return (OpenAIResponsesNativeEngine.fetch).call(this, wfctx, session, signal);
|
|
347
311
|
}
|
|
348
|
-
async fetchRaw(
|
|
349
|
-
return
|
|
312
|
+
async fetchRaw(wfctx, session, signal) {
|
|
313
|
+
return (OpenAIResponsesNativeEngine.fetchRaw).call(this, wfctx, session, signal);
|
|
350
314
|
}
|
|
351
315
|
convertToAiMessage(output) {
|
|
352
|
-
return
|
|
316
|
+
return (OpenAIResponsesNativeEngine.convertToAiMessage).call(this, output);
|
|
353
317
|
}
|
|
354
318
|
convertFromChatMessage(chatMessage) {
|
|
355
|
-
return
|
|
319
|
+
return (OpenAIResponsesNativeEngine.convertFromChatMessage).call(this, chatMessage);
|
|
356
320
|
}
|
|
357
321
|
convertFromUserMessage(userMessage) {
|
|
358
|
-
return
|
|
322
|
+
return (OpenAIResponsesNativeEngine.convertFromUserMessage).call(this, userMessage);
|
|
359
323
|
}
|
|
360
324
|
convertFromDeveloperMessage(developerMessage) {
|
|
361
|
-
return
|
|
325
|
+
return (OpenAIResponsesNativeEngine.convertFromDeveloperMessage).call(this, developerMessage);
|
|
362
326
|
}
|
|
363
327
|
convertFromToolChoice(toolChoice) {
|
|
364
|
-
return
|
|
328
|
+
return (OpenAIResponsesNativeEngine.convertFromToolChoice).call(this, toolChoice);
|
|
365
329
|
}
|
|
366
330
|
makeMonolithParams(session) {
|
|
367
|
-
return
|
|
331
|
+
return (OpenAIResponsesNativeEngine.makeMonolithParams).call(this, session);
|
|
368
332
|
}
|
|
369
|
-
logAiMessage(
|
|
370
|
-
return
|
|
333
|
+
logAiMessage(output) {
|
|
334
|
+
return (OpenAIResponsesNativeEngine.logAiMessage).call(this, output);
|
|
371
335
|
}
|
|
372
336
|
validateToolCallsByToolChoice(toolCalls) {
|
|
373
|
-
return
|
|
337
|
+
return (OpenAIResponsesNativeEngine.validateToolCallsByToolChoice).call(this, toolCalls);
|
|
374
338
|
}
|
|
375
339
|
}
|
|
376
340
|
OpenAIResponsesNativeEngine.Instance = Instance;
|