@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,340 +1,310 @@
|
|
|
1
1
|
import { Function } from "../../function.js";
|
|
2
2
|
import { RoleMessage } from "./session.js";
|
|
3
|
-
import { ResponseInvalid, Engine,
|
|
3
|
+
import { ResponseInvalid, Engine, USER_ABORTION, InferenceTimeout } from "../../engine.js";
|
|
4
4
|
import {} from "../../inference-context.js";
|
|
5
5
|
import * as Google from '@google/genai';
|
|
6
|
-
import
|
|
7
|
-
import { fetch } from 'undici';
|
|
6
|
+
import * as Undici from 'undici';
|
|
8
7
|
import { GoogleEngine } from "../../api-types/google.js";
|
|
9
8
|
import { GoogleCompatibleEngine } from "../../compatible-engines.d/google.js";
|
|
10
9
|
import { CompatibleEngine } from "../../compatible-engine.js";
|
|
10
|
+
import { Throttle } from "../../throttle.js";
|
|
11
|
+
import {} from "../../telemetry.js";
|
|
11
12
|
export var GoogleNativeEngine;
|
|
12
13
|
(function (GoogleNativeEngine) {
|
|
13
|
-
let
|
|
14
|
-
(function (
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
14
|
+
let OwnProps;
|
|
15
|
+
(function (OwnProps) {
|
|
16
|
+
function init(options) {
|
|
17
|
+
return {
|
|
18
|
+
apiURL: new URL(`${this.baseUrl}/v1beta/models/${this.model}:generateContent`),
|
|
19
|
+
codeExecution: options.codeExecution ?? false,
|
|
20
|
+
urlContext: options.urlContext ?? false,
|
|
21
|
+
googleSearch: options.googleSearch ?? false,
|
|
22
|
+
toolChoice: options.toolChoice ?? Function.ToolChoice.AUTO,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
OwnProps.init = init;
|
|
26
|
+
})(OwnProps = GoogleNativeEngine.OwnProps || (GoogleNativeEngine.OwnProps = {}));
|
|
27
|
+
async function stateless(wfctx, session) {
|
|
28
|
+
for (let retry = 0;; retry++) {
|
|
29
|
+
const signalTimeout = this.timeout ? AbortSignal.timeout(this.timeout) : undefined;
|
|
30
|
+
const signal = wfctx.signal && signalTimeout ? AbortSignal.any([
|
|
31
|
+
wfctx.signal,
|
|
32
|
+
signalTimeout,
|
|
33
|
+
]) : wfctx.signal || signalTimeout;
|
|
34
|
+
try {
|
|
35
|
+
return await this.fetch(wfctx, session, signal);
|
|
31
36
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
else if (signalTimeout?.aborted)
|
|
46
|
-
e = new InferenceTimeout(undefined, { cause: e }); // 推理超时
|
|
47
|
-
else if (e instanceof ResponseInvalid) { } // 模型抽风
|
|
48
|
-
else if (e instanceof TypeError) { } // 网络故障
|
|
49
|
-
else
|
|
50
|
-
throw e;
|
|
51
|
-
if (retry < 3)
|
|
52
|
-
ctx.logger.message?.warn(e);
|
|
53
|
-
else
|
|
54
|
-
throw e;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
if (wfctx.signal?.aborted)
|
|
39
|
+
throw USER_ABORTION; // 用户中止
|
|
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
|
+
this.logger.message?.warn(e);
|
|
48
|
+
else
|
|
49
|
+
throw e;
|
|
57
50
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
assert(part.executableCode.language);
|
|
90
|
-
parts.push(RoleMessage.Ai.Part.ExecutableCode.create(part.executableCode.code, part.executableCode.language));
|
|
91
|
-
}
|
|
92
|
-
if (this.instance.codeExecution && part.codeExecutionResult) {
|
|
93
|
-
payload = true;
|
|
94
|
-
assert(part.codeExecutionResult.outcome);
|
|
95
|
-
parts.push(RoleMessage.Ai.Part.CodeExecutionResult.create(part.codeExecutionResult.outcome, part.codeExecutionResult.output));
|
|
96
|
-
}
|
|
97
|
-
assert(payload, new ResponseInvalid('Unknown content part', { cause: content }));
|
|
98
|
-
return parts;
|
|
99
|
-
}), content);
|
|
100
|
-
}
|
|
101
|
-
convertFromAiMessage(aiMessage) {
|
|
102
|
-
return aiMessage.getRaw();
|
|
103
|
-
}
|
|
104
|
-
convertFromUserMessage(userMessage) {
|
|
105
|
-
return GoogleCompatibleEngine.convertFromUserMessage(userMessage);
|
|
106
|
-
}
|
|
107
|
-
convertFromDeveloperMessage(developerMessage) {
|
|
108
|
-
return GoogleCompatibleEngine.convertFromDeveloperMessage(developerMessage);
|
|
109
|
-
}
|
|
110
|
-
convertFromChatMessages(chatMessages) {
|
|
111
|
-
return chatMessages.map(chatMessage => {
|
|
112
|
-
if (chatMessage instanceof RoleMessage.User.Instance)
|
|
113
|
-
return this.convertFromUserMessage(chatMessage);
|
|
114
|
-
else if (chatMessage instanceof RoleMessage.Ai.Instance)
|
|
115
|
-
return this.convertFromAiMessage(chatMessage);
|
|
116
|
-
else
|
|
117
|
-
throw new Error();
|
|
118
|
-
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
GoogleNativeEngine.stateless = stateless;
|
|
54
|
+
async function stateful(wfctx, session) {
|
|
55
|
+
const response = await this.stateless(wfctx, session);
|
|
56
|
+
session.chatMessages.push(response);
|
|
57
|
+
return response;
|
|
58
|
+
}
|
|
59
|
+
GoogleNativeEngine.stateful = stateful;
|
|
60
|
+
function appendUserMessage(session, message) {
|
|
61
|
+
return {
|
|
62
|
+
...session,
|
|
63
|
+
chatMessages: [...session.chatMessages, message],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
GoogleNativeEngine.appendUserMessage = appendUserMessage;
|
|
67
|
+
function pushUserMessage(session, message) {
|
|
68
|
+
session.chatMessages.push(message);
|
|
69
|
+
return session;
|
|
70
|
+
}
|
|
71
|
+
GoogleNativeEngine.pushUserMessage = pushUserMessage;
|
|
72
|
+
function convertToAiMessage(content) {
|
|
73
|
+
if (content.parts) { }
|
|
74
|
+
else
|
|
75
|
+
throw new Error();
|
|
76
|
+
return RoleMessage.Ai.create(content.parts.flatMap(part => {
|
|
77
|
+
const parts = [];
|
|
78
|
+
let payload = false;
|
|
79
|
+
if (part.text) {
|
|
80
|
+
payload = true;
|
|
81
|
+
parts.push(RoleMessage.Part.Text.create(part.text));
|
|
119
82
|
}
|
|
120
|
-
|
|
121
|
-
|
|
83
|
+
if (part.functionCall) {
|
|
84
|
+
payload = true;
|
|
85
|
+
parts.push(this.convertToFunctionCall(part.functionCall));
|
|
122
86
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
if (this.urlContext)
|
|
133
|
-
tools.push({ urlContext: {} });
|
|
134
|
-
if (this.googleSearch)
|
|
135
|
-
tools.push({ googleSearch: {} });
|
|
136
|
-
if (this.codeExecution)
|
|
137
|
-
tools.push({ codeExecution: {} });
|
|
138
|
-
const reqbody = {
|
|
139
|
-
contents,
|
|
140
|
-
tools: tools.length ? tools : undefined,
|
|
141
|
-
toolConfig: functionDeclarations.length ? {
|
|
142
|
-
functionCallingConfig: this.instance.convertFromToolChoice(this.instance.toolChoice),
|
|
143
|
-
} : undefined,
|
|
144
|
-
systemInstruction,
|
|
145
|
-
generationConfig: this.instance.maxTokens || this.instance.additionalOptions ? {
|
|
146
|
-
maxOutputTokens: this.instance.maxTokens ?? undefined,
|
|
147
|
-
...this.instance.additionalOptions,
|
|
148
|
-
} : undefined,
|
|
149
|
-
};
|
|
150
|
-
ctx.logger.message?.trace(reqbody);
|
|
151
|
-
const res = await fetch(this.apiURL, {
|
|
152
|
-
method: 'POST',
|
|
153
|
-
headers: new Headers({
|
|
154
|
-
'Content-Type': 'application/json',
|
|
155
|
-
'x-goog-api-key': this.instance.apiKey,
|
|
156
|
-
}),
|
|
157
|
-
body: JSON.stringify(reqbody),
|
|
158
|
-
dispatcher: this.instance.proxyAgent,
|
|
159
|
-
signal,
|
|
160
|
-
});
|
|
161
|
-
ctx.logger.message?.trace(res);
|
|
162
|
-
assert(res.ok, new Error(undefined, { cause: res }));
|
|
163
|
-
const response = await res.json();
|
|
164
|
-
assert(response.candidates?.[0]?.content?.parts?.length, new ResponseInvalid('Content missing', { cause: response }));
|
|
165
|
-
if (response.candidates[0].finishReason === Google.FinishReason.MAX_TOKENS)
|
|
166
|
-
throw new ResponseInvalid('Token limit exceeded.', { cause: response });
|
|
167
|
-
assert(response.candidates[0].finishReason === Google.FinishReason.STOP, new ResponseInvalid('Abnormal finish reason', { cause: response }));
|
|
168
|
-
for (const part of response.candidates[0].content.parts) {
|
|
169
|
-
if (part.text)
|
|
170
|
-
ctx.logger.inference?.debug(part.text + '\n');
|
|
171
|
-
if (part.functionCall)
|
|
172
|
-
ctx.logger.message?.debug(part.functionCall);
|
|
173
|
-
}
|
|
174
|
-
assert(response.usageMetadata?.promptTokenCount, new Error('Prompt token count absent', { cause: response }));
|
|
175
|
-
ctx.logger.message?.debug(response.usageMetadata);
|
|
176
|
-
const candidatesTokenCount = response.usageMetadata.candidatesTokenCount ?? 0;
|
|
177
|
-
const cacheHitTokenCount = response.usageMetadata.cachedContentTokenCount ?? 0;
|
|
178
|
-
const cacheMissTokenCount = response.usageMetadata.promptTokenCount - cacheHitTokenCount;
|
|
179
|
-
const thinkingTokenCount = response.usageMetadata.thoughtsTokenCount ?? 0;
|
|
180
|
-
const cost = this.instance.inputPrice * cacheMissTokenCount / 1e6 +
|
|
181
|
-
this.instance.cachedPrice * cacheHitTokenCount / 1e6 +
|
|
182
|
-
this.instance.outputPrice * candidatesTokenCount / 1e6 +
|
|
183
|
-
this.instance.outputPrice * thinkingTokenCount / 1e6;
|
|
184
|
-
ctx.logger.cost?.(cost);
|
|
185
|
-
const aiMessage = this.instance.convertToAiMessage(response.candidates[0].content);
|
|
186
|
-
this.instance.validateToolCallsByToolChoice(aiMessage.getFunctionCalls());
|
|
187
|
-
return aiMessage;
|
|
87
|
+
if (this.codeExecution && part.executableCode) {
|
|
88
|
+
payload = true;
|
|
89
|
+
if (part.executableCode.code) { }
|
|
90
|
+
else
|
|
91
|
+
throw new Error();
|
|
92
|
+
if (part.executableCode.language) { }
|
|
93
|
+
else
|
|
94
|
+
throw new Error();
|
|
95
|
+
parts.push(RoleMessage.Ai.Part.ExecutableCode.create(part.executableCode.code, part.executableCode.language));
|
|
188
96
|
}
|
|
189
|
-
|
|
190
|
-
|
|
97
|
+
if (this.codeExecution && part.codeExecutionResult) {
|
|
98
|
+
payload = true;
|
|
99
|
+
if (part.codeExecutionResult.outcome) { }
|
|
100
|
+
else
|
|
101
|
+
throw new Error();
|
|
102
|
+
parts.push(RoleMessage.Ai.Part.CodeExecutionResult.create(part.codeExecutionResult.outcome, part.codeExecutionResult.output));
|
|
191
103
|
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
104
|
+
if (payload) { }
|
|
105
|
+
else
|
|
106
|
+
throw new ResponseInvalid('Unknown content part', { cause: content });
|
|
107
|
+
return parts;
|
|
108
|
+
}), content);
|
|
109
|
+
}
|
|
110
|
+
GoogleNativeEngine.convertToAiMessage = convertToAiMessage;
|
|
111
|
+
function convertFromAiMessage(aiMessage) {
|
|
112
|
+
return aiMessage.getRaw();
|
|
113
|
+
}
|
|
114
|
+
GoogleNativeEngine.convertFromAiMessage = convertFromAiMessage;
|
|
115
|
+
function convertFromUserMessage(userMessage) {
|
|
116
|
+
return (GoogleCompatibleEngine.convertFromUserMessage).call(this, userMessage);
|
|
117
|
+
}
|
|
118
|
+
GoogleNativeEngine.convertFromUserMessage = convertFromUserMessage;
|
|
119
|
+
function convertFromDeveloperMessage(developerMessage) {
|
|
120
|
+
return (GoogleCompatibleEngine.convertFromDeveloperMessage).call(this, developerMessage);
|
|
121
|
+
}
|
|
122
|
+
GoogleNativeEngine.convertFromDeveloperMessage = convertFromDeveloperMessage;
|
|
123
|
+
function convertFromChatMessages(chatMessages) {
|
|
124
|
+
return chatMessages.map(chatMessage => {
|
|
125
|
+
if (chatMessage instanceof RoleMessage.User.Instance)
|
|
126
|
+
return this.convertFromUserMessage(chatMessage);
|
|
127
|
+
else if (chatMessage instanceof RoleMessage.Ai.Instance)
|
|
128
|
+
return this.convertFromAiMessage(chatMessage);
|
|
129
|
+
else
|
|
130
|
+
throw new Error();
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
GoogleNativeEngine.convertFromChatMessages = convertFromChatMessages;
|
|
134
|
+
function convertFromToolChoice(toolChoice) {
|
|
135
|
+
return (GoogleCompatibleEngine.convertFromToolChoice).call(this, toolChoice);
|
|
136
|
+
}
|
|
137
|
+
GoogleNativeEngine.convertFromToolChoice = convertFromToolChoice;
|
|
138
|
+
async function fetch(wfctx, session, signal) {
|
|
139
|
+
const systemInstruction = session.developerMessage && this.convertFromDeveloperMessage(session.developerMessage);
|
|
140
|
+
const contents = this.convertFromChatMessages(session.chatMessages);
|
|
141
|
+
await this.throttle.requests(wfctx);
|
|
142
|
+
const fdentries = Object.entries(this.fdm);
|
|
143
|
+
const functionDeclarations = fdentries.map(fdentry => this.convertFromFunctionDeclarationEntry(fdentry));
|
|
144
|
+
const tools = [];
|
|
145
|
+
if (functionDeclarations.length)
|
|
146
|
+
tools.push({ functionDeclarations });
|
|
147
|
+
if (this.urlContext)
|
|
148
|
+
tools.push({ urlContext: {} });
|
|
149
|
+
if (this.googleSearch)
|
|
150
|
+
tools.push({ googleSearch: {} });
|
|
151
|
+
if (this.codeExecution)
|
|
152
|
+
tools.push({ codeExecution: {} });
|
|
153
|
+
const reqbody = {
|
|
154
|
+
contents,
|
|
155
|
+
tools: tools.length ? tools : undefined,
|
|
156
|
+
toolConfig: functionDeclarations.length ? {
|
|
157
|
+
functionCallingConfig: this.convertFromToolChoice(this.toolChoice),
|
|
158
|
+
} : undefined,
|
|
159
|
+
systemInstruction,
|
|
160
|
+
generationConfig: this.maxTokens || this.additionalOptions ? {
|
|
161
|
+
maxOutputTokens: this.maxTokens ?? undefined,
|
|
162
|
+
...this.additionalOptions,
|
|
163
|
+
} : undefined,
|
|
164
|
+
};
|
|
165
|
+
this.logger.message?.trace(reqbody);
|
|
166
|
+
const res = await Undici.fetch(this.apiURL, {
|
|
167
|
+
method: 'POST',
|
|
168
|
+
headers: new Headers({
|
|
169
|
+
'Content-Type': 'application/json',
|
|
170
|
+
'x-goog-api-key': this.apiKey,
|
|
171
|
+
}),
|
|
172
|
+
body: JSON.stringify(reqbody),
|
|
173
|
+
dispatcher: this.proxyAgent,
|
|
174
|
+
signal,
|
|
175
|
+
});
|
|
176
|
+
this.logger.message?.trace(res);
|
|
177
|
+
if (res.ok) { }
|
|
178
|
+
else
|
|
179
|
+
throw new Error(undefined, { cause: res });
|
|
180
|
+
const response = await res.json();
|
|
181
|
+
if (response.candidates?.[0]?.content?.parts?.length) { }
|
|
182
|
+
else
|
|
183
|
+
throw new ResponseInvalid('Content missing', { cause: response });
|
|
184
|
+
if (response.candidates[0].finishReason === Google.FinishReason.MAX_TOKENS)
|
|
185
|
+
throw new ResponseInvalid('Token limit exceeded.', { cause: response });
|
|
186
|
+
if (response.candidates[0].finishReason === Google.FinishReason.STOP) { }
|
|
187
|
+
else
|
|
188
|
+
throw new ResponseInvalid('Abnormal finish reason', { cause: response });
|
|
189
|
+
for (const part of response.candidates[0].content.parts) {
|
|
190
|
+
if (part.text)
|
|
191
|
+
this.logger.inference?.debug(part.text + '\n');
|
|
192
|
+
if (part.functionCall)
|
|
193
|
+
this.logger.message?.debug(part.functionCall);
|
|
194
|
+
}
|
|
195
|
+
if (response.usageMetadata?.promptTokenCount) { }
|
|
196
|
+
else
|
|
197
|
+
throw new Error('Prompt token count absent', { cause: response });
|
|
198
|
+
this.logger.message?.debug(response.usageMetadata);
|
|
199
|
+
const candidatesTokenCount = response.usageMetadata.candidatesTokenCount ?? 0;
|
|
200
|
+
const cacheHitTokenCount = response.usageMetadata.cachedContentTokenCount ?? 0;
|
|
201
|
+
const cacheMissTokenCount = response.usageMetadata.promptTokenCount - cacheHitTokenCount;
|
|
202
|
+
const thinkingTokenCount = response.usageMetadata.thoughtsTokenCount ?? 0;
|
|
203
|
+
const cost = this.inputPrice * cacheMissTokenCount / 1e6 +
|
|
204
|
+
this.cachePrice * cacheHitTokenCount / 1e6 +
|
|
205
|
+
this.outputPrice * candidatesTokenCount / 1e6 +
|
|
206
|
+
this.outputPrice * thinkingTokenCount / 1e6;
|
|
207
|
+
wfctx.cost?.(cost);
|
|
208
|
+
const aiMessage = this.convertToAiMessage(response.candidates[0].content);
|
|
209
|
+
this.validateToolCallsByToolChoice(aiMessage.getFunctionCalls());
|
|
210
|
+
return aiMessage;
|
|
211
|
+
}
|
|
212
|
+
GoogleNativeEngine.fetch = fetch;
|
|
213
|
+
function validateToolCallsByToolChoice(toolCalls) {
|
|
214
|
+
Function.Call.validate(toolCalls, this.toolChoice, new ResponseInvalid('Invalid function call', { cause: toolCalls }));
|
|
215
|
+
}
|
|
216
|
+
GoogleNativeEngine.validateToolCallsByToolChoice = validateToolCallsByToolChoice;
|
|
195
217
|
class Instance {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
218
|
+
baseUrl;
|
|
219
|
+
apiKey;
|
|
220
|
+
model;
|
|
221
|
+
name;
|
|
222
|
+
inputPrice;
|
|
223
|
+
outputPrice;
|
|
224
|
+
cachePrice;
|
|
225
|
+
fdm;
|
|
226
|
+
additionalOptions;
|
|
227
|
+
throttle;
|
|
228
|
+
timeout;
|
|
229
|
+
maxTokens;
|
|
230
|
+
proxyAgent;
|
|
231
|
+
logger;
|
|
232
|
+
parallelToolCall;
|
|
233
|
+
apiURL;
|
|
234
|
+
codeExecution;
|
|
235
|
+
urlContext;
|
|
236
|
+
googleSearch;
|
|
237
|
+
toolChoice;
|
|
199
238
|
constructor(options) {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
return
|
|
230
|
-
}
|
|
231
|
-
set inputPrice(value) {
|
|
232
|
-
this.engineBase.inputPrice = value;
|
|
233
|
-
}
|
|
234
|
-
get outputPrice() {
|
|
235
|
-
return this.engineBase.outputPrice;
|
|
236
|
-
}
|
|
237
|
-
set outputPrice(value) {
|
|
238
|
-
this.engineBase.outputPrice = value;
|
|
239
|
-
}
|
|
240
|
-
get cachedPrice() {
|
|
241
|
-
return this.engineBase.cachedPrice;
|
|
242
|
-
}
|
|
243
|
-
set cachedPrice(value) {
|
|
244
|
-
this.engineBase.cachedPrice = value;
|
|
245
|
-
}
|
|
246
|
-
get fdm() {
|
|
247
|
-
return this.engineBase.fdm;
|
|
248
|
-
}
|
|
249
|
-
set fdm(value) {
|
|
250
|
-
this.engineBase.fdm = value;
|
|
251
|
-
}
|
|
252
|
-
get additionalOptions() {
|
|
253
|
-
return this.engineBase.additionalOptions;
|
|
254
|
-
}
|
|
255
|
-
set additionalOptions(value) {
|
|
256
|
-
this.engineBase.additionalOptions = value;
|
|
257
|
-
}
|
|
258
|
-
get throttle() {
|
|
259
|
-
return this.engineBase.throttle;
|
|
260
|
-
}
|
|
261
|
-
set throttle(value) {
|
|
262
|
-
this.engineBase.throttle = value;
|
|
263
|
-
}
|
|
264
|
-
get timeout() {
|
|
265
|
-
return this.engineBase.timeout;
|
|
266
|
-
}
|
|
267
|
-
set timeout(value) {
|
|
268
|
-
this.engineBase.timeout = value;
|
|
269
|
-
}
|
|
270
|
-
get maxTokens() {
|
|
271
|
-
return this.engineBase.maxTokens;
|
|
272
|
-
}
|
|
273
|
-
set maxTokens(value) {
|
|
274
|
-
this.engineBase.maxTokens = value;
|
|
275
|
-
}
|
|
276
|
-
get proxyAgent() {
|
|
277
|
-
return this.engineBase.proxyAgent;
|
|
278
|
-
}
|
|
279
|
-
set proxyAgent(value) {
|
|
280
|
-
this.engineBase.proxyAgent = value;
|
|
281
|
-
}
|
|
282
|
-
get toolChoice() {
|
|
283
|
-
return this.googleNativeEngineBase.toolChoice;
|
|
284
|
-
}
|
|
285
|
-
set toolChoice(value) {
|
|
286
|
-
this.googleNativeEngineBase.toolChoice = value;
|
|
287
|
-
}
|
|
288
|
-
stateless(ctx, session) {
|
|
289
|
-
return this.googleNativeEngineBase.stateless(ctx, session);
|
|
290
|
-
}
|
|
291
|
-
stateful(ctx, session) {
|
|
292
|
-
return this.googleNativeEngineBase.stateful(ctx, session);
|
|
239
|
+
({
|
|
240
|
+
baseUrl: this.baseUrl,
|
|
241
|
+
apiKey: this.apiKey,
|
|
242
|
+
model: this.model,
|
|
243
|
+
name: this.name,
|
|
244
|
+
inputPrice: this.inputPrice,
|
|
245
|
+
outputPrice: this.outputPrice,
|
|
246
|
+
cachePrice: this.cachePrice,
|
|
247
|
+
fdm: this.fdm,
|
|
248
|
+
additionalOptions: this.additionalOptions,
|
|
249
|
+
throttle: this.throttle,
|
|
250
|
+
timeout: this.timeout,
|
|
251
|
+
maxTokens: this.maxTokens,
|
|
252
|
+
proxyAgent: this.proxyAgent,
|
|
253
|
+
logger: this.logger,
|
|
254
|
+
} = (Engine.OwnProps.init).call(this, options));
|
|
255
|
+
({ parallelToolCall: this.parallelToolCall } = (GoogleEngine.OwnProps.init).call(this, options));
|
|
256
|
+
({
|
|
257
|
+
apiURL: this.apiURL,
|
|
258
|
+
codeExecution: this.codeExecution,
|
|
259
|
+
urlContext: this.urlContext,
|
|
260
|
+
googleSearch: this.googleSearch,
|
|
261
|
+
toolChoice: this.toolChoice,
|
|
262
|
+
} = (GoogleNativeEngine.OwnProps.init).call(this, options));
|
|
263
|
+
}
|
|
264
|
+
stateless(wfctx, session) {
|
|
265
|
+
return (GoogleNativeEngine.stateless).call(this, wfctx, session);
|
|
266
|
+
}
|
|
267
|
+
stateful(wfctx, session) {
|
|
268
|
+
return (GoogleNativeEngine.stateful).call(this, wfctx, session);
|
|
293
269
|
}
|
|
294
270
|
appendUserMessage(session, message) {
|
|
295
|
-
return
|
|
271
|
+
return (GoogleNativeEngine.appendUserMessage).call(this, session, message);
|
|
296
272
|
}
|
|
297
273
|
pushUserMessage(session, message) {
|
|
298
|
-
return
|
|
274
|
+
return (GoogleNativeEngine.pushUserMessage).call(this, session, message);
|
|
299
275
|
}
|
|
300
276
|
validateToolCallsByToolChoice(toolCalls) {
|
|
301
|
-
return
|
|
302
|
-
}
|
|
303
|
-
get parallel() {
|
|
304
|
-
return this.googleEngineBase.parallel;
|
|
305
|
-
}
|
|
306
|
-
set parallel(value) {
|
|
307
|
-
this.googleEngineBase.parallel = value;
|
|
277
|
+
return (GoogleNativeEngine.validateToolCallsByToolChoice).call(this, toolCalls);
|
|
308
278
|
}
|
|
309
279
|
convertFromFunctionCall(fc) {
|
|
310
|
-
return
|
|
280
|
+
return (GoogleEngine.convertFromFunctionCall).call(this, fc);
|
|
311
281
|
}
|
|
312
282
|
convertToFunctionCall(googlefc) {
|
|
313
|
-
return
|
|
283
|
+
return (GoogleEngine.convertToFunctionCall).call(this, googlefc);
|
|
314
284
|
}
|
|
315
285
|
convertFromFunctionDeclarationEntry(fdentry) {
|
|
316
|
-
return
|
|
286
|
+
return (GoogleEngine.convertFromFunctionDeclarationEntry).call(this, fdentry);
|
|
317
287
|
}
|
|
318
288
|
convertFromUserMessage(userMessage) {
|
|
319
|
-
return
|
|
289
|
+
return (GoogleNativeEngine.convertFromUserMessage).call(this, userMessage);
|
|
320
290
|
}
|
|
321
291
|
convertFromAiMessage(aiMessage) {
|
|
322
|
-
return
|
|
292
|
+
return (GoogleNativeEngine.convertFromAiMessage).call(this, aiMessage);
|
|
323
293
|
}
|
|
324
294
|
convertFromDeveloperMessage(developerMessage) {
|
|
325
|
-
return
|
|
295
|
+
return (GoogleNativeEngine.convertFromDeveloperMessage).call(this, developerMessage);
|
|
326
296
|
}
|
|
327
297
|
convertFromChatMessages(chatMessages) {
|
|
328
|
-
return
|
|
298
|
+
return (GoogleNativeEngine.convertFromChatMessages).call(this, chatMessages);
|
|
329
299
|
}
|
|
330
300
|
convertToAiMessage(content) {
|
|
331
|
-
return
|
|
301
|
+
return (GoogleNativeEngine.convertToAiMessage).call(this, content);
|
|
332
302
|
}
|
|
333
303
|
convertFromToolChoice(toolChoice) {
|
|
334
|
-
return
|
|
304
|
+
return (GoogleNativeEngine.convertFromToolChoice).call(this, toolChoice);
|
|
335
305
|
}
|
|
336
|
-
fetch(
|
|
337
|
-
return
|
|
306
|
+
fetch(wfctx, session, signal) {
|
|
307
|
+
return (GoogleNativeEngine.fetch).call(this, wfctx, session, signal);
|
|
338
308
|
}
|
|
339
309
|
}
|
|
340
310
|
GoogleNativeEngine.Instance = Instance;
|