zeitlich 0.2.49 → 0.2.51
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 +26 -23
- package/dist/adapters/sandbox/daytona/index.cjs.map +1 -1
- package/dist/adapters/sandbox/daytona/index.d.cts +3 -3
- package/dist/adapters/sandbox/daytona/index.d.ts +3 -3
- package/dist/adapters/sandbox/daytona/index.js.map +1 -1
- package/dist/adapters/sandbox/daytona/workflow.d.cts +2 -2
- package/dist/adapters/sandbox/daytona/workflow.d.ts +2 -2
- package/dist/adapters/sandbox/e2b/index.cjs.map +1 -1
- package/dist/adapters/sandbox/e2b/index.d.cts +1 -1
- package/dist/adapters/sandbox/e2b/index.d.ts +1 -1
- package/dist/adapters/sandbox/e2b/index.js.map +1 -1
- package/dist/adapters/sandbox/e2b/workflow.d.cts +1 -1
- package/dist/adapters/sandbox/e2b/workflow.d.ts +1 -1
- package/dist/adapters/thread/anthropic/index.cjs +60 -55
- package/dist/adapters/thread/anthropic/index.cjs.map +1 -1
- package/dist/adapters/thread/anthropic/index.d.cts +20 -15
- package/dist/adapters/thread/anthropic/index.d.ts +20 -15
- package/dist/adapters/thread/anthropic/index.js +60 -55
- package/dist/adapters/thread/anthropic/index.js.map +1 -1
- package/dist/adapters/thread/anthropic/workflow.d.cts +7 -7
- package/dist/adapters/thread/anthropic/workflow.d.ts +7 -7
- package/dist/adapters/thread/google-genai/index.cjs +135 -66
- package/dist/adapters/thread/google-genai/index.cjs.map +1 -1
- package/dist/adapters/thread/google-genai/index.d.cts +200 -26
- package/dist/adapters/thread/google-genai/index.d.ts +200 -26
- package/dist/adapters/thread/google-genai/index.js +135 -66
- package/dist/adapters/thread/google-genai/index.js.map +1 -1
- package/dist/adapters/thread/google-genai/workflow.d.cts +8 -8
- package/dist/adapters/thread/google-genai/workflow.d.ts +8 -8
- package/dist/adapters/thread/langchain/index.cjs +67 -55
- package/dist/adapters/thread/langchain/index.cjs.map +1 -1
- package/dist/adapters/thread/langchain/index.d.cts +20 -15
- package/dist/adapters/thread/langchain/index.d.ts +20 -15
- package/dist/adapters/thread/langchain/index.js +67 -55
- package/dist/adapters/thread/langchain/index.js.map +1 -1
- package/dist/adapters/thread/langchain/workflow.d.cts +7 -7
- package/dist/adapters/thread/langchain/workflow.d.ts +7 -7
- package/dist/{cold-store-DKMAO1Dd.d.ts → cold-store-DyHodfAB.d.ts} +1 -1
- package/dist/{cold-store-CkWoNtMh.d.cts → cold-store-YOx9nmgR.d.cts} +1 -1
- package/dist/index.cjs +15050 -420
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +79 -83
- package/dist/index.d.ts +79 -83
- package/dist/index.js +15051 -417
- package/dist/index.js.map +1 -1
- package/dist/{proxy-B7CWEV-T.d.cts → proxy-2htgGQrc.d.cts} +1 -1
- package/dist/{proxy-ByFHMVRX.d.ts → proxy-CmiTP4pp.d.ts} +1 -1
- package/dist/{thread-manager-nK-WcFzM.d.ts → thread-manager-BJ5pz5Cx.d.cts} +6 -7
- package/dist/{thread-manager-7AW4rhfu.d.ts → thread-manager-BQAbrYXH.d.cts} +6 -7
- package/dist/{thread-manager-Cibe0X5m.d.cts → thread-manager-CcvltOuq.d.ts} +6 -7
- package/dist/{thread-manager-B9rtMEVn.d.cts → thread-manager-DHAbncHX.d.ts} +6 -7
- package/dist/{types-gVa5XCWD.d.ts → types-BQvXWcft.d.ts} +1 -1
- package/dist/{types-XUUFvrJ9.d.cts → types-BjdqxKYp.d.cts} +709 -709
- package/dist/{types-CJ7tCdl6.d.ts → types-D8W5TnSa.d.cts} +3 -3
- package/dist/{types-CJ7tCdl6.d.cts → types-D8W5TnSa.d.ts} +3 -3
- package/dist/{types-DO4Tkwxo.d.ts → types-DEbkLA06.d.ts} +3 -3
- package/dist/{types-DeVNWqlb.d.ts → types-DiI7mZhI.d.ts} +709 -709
- package/dist/{types-BR-k7h0e.d.cts → types-N_LTWe4b.d.cts} +3 -3
- package/dist/{types-CjY93AWZ.d.cts → types-OEN1xrFg.d.cts} +1 -1
- package/dist/{workflow-uhOIj9D-.d.ts → workflow-CcgD6EUB.d.cts} +34 -3
- package/dist/{workflow-KbGsxpfh.d.cts → workflow-DBjPOKBr.d.ts} +34 -3
- package/dist/workflow.cjs +15008 -377
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts +3 -3
- package/dist/workflow.d.ts +3 -3
- package/dist/workflow.js +15009 -374
- package/dist/workflow.js.map +1 -1
- package/package.json +10 -37
- package/src/adapters/thread/anthropic/activities.test.ts +115 -0
- package/src/adapters/thread/anthropic/activities.ts +11 -19
- package/src/adapters/thread/anthropic/fork-transform.test.ts +17 -11
- package/src/adapters/thread/anthropic/model-invoker.test.ts +54 -3
- package/src/adapters/thread/anthropic/model-invoker.ts +11 -1
- package/src/adapters/thread/anthropic/thread-manager.test.ts +2 -2
- package/src/adapters/thread/anthropic/thread-manager.ts +3 -4
- package/src/adapters/thread/google-genai/activities.test.ts +162 -0
- package/src/adapters/thread/google-genai/activities.ts +38 -15
- package/src/adapters/thread/google-genai/fork-transform.test.ts +17 -11
- package/src/adapters/thread/google-genai/model-invoker.test.ts +386 -0
- package/src/adapters/thread/google-genai/model-invoker.ts +118 -23
- package/src/adapters/thread/google-genai/thread-manager.test.ts +2 -2
- package/src/adapters/thread/google-genai/thread-manager.ts +3 -4
- package/src/adapters/thread/langchain/activities.test.ts +88 -0
- package/src/adapters/thread/langchain/activities.ts +15 -12
- package/src/adapters/thread/langchain/fork-transform.test.ts +17 -11
- package/src/adapters/thread/langchain/model-invoker.test.ts +74 -0
- package/src/adapters/thread/langchain/model-invoker.ts +16 -3
- package/src/adapters/thread/langchain/thread-manager.test.ts +2 -2
- package/src/adapters/thread/langchain/thread-manager.ts +3 -4
- package/src/index.ts +2 -2
- package/src/lib/sandbox/capability-types.test.ts +2 -2
- package/src/lib/sandbox/manager.ts +2 -6
- package/src/lib/sandbox/sandbox.test.ts +1 -1
- package/src/lib/sandbox/types.ts +2 -2
- package/src/lib/session/session.integration.test.ts +92 -0
- package/src/lib/session/session.ts +23 -11
- package/src/lib/thread/keys.test.ts +9 -9
- package/src/lib/thread/keys.ts +1 -1
- package/src/lib/thread/manager.test.ts +24 -14
- package/src/lib/thread/manager.ts +19 -23
- package/src/lib/thread/snapshot.test.ts +51 -43
- package/src/lib/thread/snapshot.ts +54 -32
- package/src/lib/thread/test-utils.ts +106 -59
- package/src/lib/thread/tiered.test.ts +1 -1
- package/src/lib/thread/types.ts +2 -2
- package/src/lib/tool-router/router.integration.test.ts +44 -0
- package/src/lib/tool-router/router.ts +140 -32
- package/src/lib/workflow.ts +49 -0
- package/src/{adapters/sandbox/inmemory/proxy.ts → test-utils/in-memory-sandbox-proxy.ts} +5 -16
- package/src/{adapters/sandbox/inmemory/index.ts → test-utils/in-memory-sandbox.ts} +11 -3
- package/src/tools/bash/bash.test.ts +1 -1
- package/src/tools/edit/handler.test.ts +1 -1
- package/tsup.config.ts +2 -4
- package/dist/activities-7OcT_vdR.d.cts +0 -162
- package/dist/activities-zG_FBoY2.d.ts +0 -162
- package/dist/adapters/sandbox/inmemory/index.cjs +0 -214
- package/dist/adapters/sandbox/inmemory/index.cjs.map +0 -1
- package/dist/adapters/sandbox/inmemory/index.d.cts +0 -40
- package/dist/adapters/sandbox/inmemory/index.d.ts +0 -40
- package/dist/adapters/sandbox/inmemory/index.js +0 -211
- package/dist/adapters/sandbox/inmemory/index.js.map +0 -1
- package/dist/adapters/sandbox/inmemory/workflow.cjs +0 -36
- package/dist/adapters/sandbox/inmemory/workflow.cjs.map +0 -1
- package/dist/adapters/sandbox/inmemory/workflow.d.cts +0 -27
- package/dist/adapters/sandbox/inmemory/workflow.d.ts +0 -27
- package/dist/adapters/sandbox/inmemory/workflow.js +0 -34
- package/dist/adapters/sandbox/inmemory/workflow.js.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var crypto = require('crypto');
|
|
3
4
|
var activity = require('@temporalio/activity');
|
|
4
5
|
|
|
5
6
|
// src/adapters/thread/google-genai/adapter-id.ts
|
|
@@ -55,11 +56,11 @@ function createThreadManager(config) {
|
|
|
55
56
|
return {
|
|
56
57
|
async initialize() {
|
|
57
58
|
await redis.del(redisKey);
|
|
58
|
-
await redis.set(metaKey, "1",
|
|
59
|
+
await redis.set(metaKey, "1", { EX: ttlSeconds });
|
|
59
60
|
},
|
|
60
61
|
async load() {
|
|
61
62
|
await assertThreadExists();
|
|
62
|
-
const data = await redis.
|
|
63
|
+
const data = await redis.lRange(redisKey, 0, -1);
|
|
63
64
|
return data.map(deserialize);
|
|
64
65
|
},
|
|
65
66
|
async append(messages) {
|
|
@@ -67,22 +68,18 @@ function createThreadManager(config) {
|
|
|
67
68
|
await assertThreadExists();
|
|
68
69
|
if (idOf) {
|
|
69
70
|
const dedupId = messages.map(idOf).join(":");
|
|
70
|
-
await redis.eval(
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
redisKey,
|
|
75
|
-
String(ttlSeconds),
|
|
76
|
-
...messages.map(serialize)
|
|
77
|
-
);
|
|
71
|
+
await redis.eval(APPEND_IDEMPOTENT_SCRIPT, {
|
|
72
|
+
keys: [dedupKey(dedupId), redisKey],
|
|
73
|
+
arguments: [String(ttlSeconds), ...messages.map(serialize)]
|
|
74
|
+
});
|
|
78
75
|
} else {
|
|
79
|
-
await redis.
|
|
76
|
+
await redis.rPush(redisKey, messages.map(serialize));
|
|
80
77
|
await redis.expire(redisKey, ttlSeconds);
|
|
81
78
|
}
|
|
82
79
|
},
|
|
83
80
|
async fork(newThreadId) {
|
|
84
81
|
await assertThreadExists();
|
|
85
|
-
const data = await redis.
|
|
82
|
+
const data = await redis.lRange(redisKey, 0, -1);
|
|
86
83
|
const stateRaw = await redis.get(stateKey);
|
|
87
84
|
const forked = createThreadManager({
|
|
88
85
|
...config,
|
|
@@ -91,12 +88,12 @@ function createThreadManager(config) {
|
|
|
91
88
|
await forked.initialize();
|
|
92
89
|
if (data.length > 0) {
|
|
93
90
|
const newKey = getThreadListKey(key, newThreadId);
|
|
94
|
-
await redis.
|
|
91
|
+
await redis.rPush(newKey, data);
|
|
95
92
|
await redis.expire(newKey, ttlSeconds);
|
|
96
93
|
}
|
|
97
94
|
if (stateRaw != null) {
|
|
98
95
|
const newStateKey = getThreadStateKey(key, newThreadId);
|
|
99
|
-
await redis.set(newStateKey, stateRaw,
|
|
96
|
+
await redis.set(newStateKey, stateRaw, { EX: ttlSeconds });
|
|
100
97
|
}
|
|
101
98
|
return forked;
|
|
102
99
|
},
|
|
@@ -107,20 +104,20 @@ function createThreadManager(config) {
|
|
|
107
104
|
"replaceAll requires the thread manager to be configured with `idOf`"
|
|
108
105
|
);
|
|
109
106
|
}
|
|
110
|
-
const existing = await redis.
|
|
107
|
+
const existing = await redis.lRange(redisKey, 0, -1);
|
|
111
108
|
const existingIds = existing.map((raw) => idOf(deserialize(raw))).filter((id) => typeof id === "string");
|
|
112
109
|
await redis.del(redisKey);
|
|
113
110
|
if (existingIds.length > 0) {
|
|
114
|
-
await redis.del(
|
|
111
|
+
await redis.del(existingIds.map(dedupKey));
|
|
115
112
|
}
|
|
116
113
|
if (messages.length > 0) {
|
|
117
|
-
await redis.
|
|
114
|
+
await redis.rPush(redisKey, messages.map(serialize));
|
|
118
115
|
await redis.expire(redisKey, ttlSeconds);
|
|
119
116
|
}
|
|
120
117
|
await redis.expire(metaKey, ttlSeconds);
|
|
121
118
|
},
|
|
122
119
|
async delete() {
|
|
123
|
-
await redis.del(redisKey, metaKey, stateKey);
|
|
120
|
+
await redis.del([redisKey, metaKey, stateKey]);
|
|
124
121
|
},
|
|
125
122
|
async loadState() {
|
|
126
123
|
const raw = await redis.get(stateKey);
|
|
@@ -129,14 +126,14 @@ function createThreadManager(config) {
|
|
|
129
126
|
},
|
|
130
127
|
async saveState(state) {
|
|
131
128
|
await assertThreadExists();
|
|
132
|
-
await redis.set(stateKey, JSON.stringify(state),
|
|
129
|
+
await redis.set(stateKey, JSON.stringify(state), { EX: ttlSeconds });
|
|
133
130
|
},
|
|
134
131
|
async deleteState() {
|
|
135
132
|
await redis.del(stateKey);
|
|
136
133
|
},
|
|
137
134
|
async length() {
|
|
138
135
|
await assertThreadExists();
|
|
139
|
-
return redis.
|
|
136
|
+
return redis.lLen(redisKey);
|
|
140
137
|
},
|
|
141
138
|
async truncateFromId(messageId) {
|
|
142
139
|
await assertThreadExists();
|
|
@@ -145,7 +142,7 @@ function createThreadManager(config) {
|
|
|
145
142
|
"truncateFromId requires the thread manager to be configured with `idOf`"
|
|
146
143
|
);
|
|
147
144
|
}
|
|
148
|
-
const data = await redis.
|
|
145
|
+
const data = await redis.lRange(redisKey, 0, -1);
|
|
149
146
|
let idx = -1;
|
|
150
147
|
const removedIds = [];
|
|
151
148
|
for (let i = 0; i < data.length; i++) {
|
|
@@ -160,11 +157,11 @@ function createThreadManager(config) {
|
|
|
160
157
|
await redis.del(redisKey);
|
|
161
158
|
await redis.expire(metaKey, ttlSeconds);
|
|
162
159
|
} else {
|
|
163
|
-
await redis.
|
|
160
|
+
await redis.lTrim(redisKey, 0, idx - 1);
|
|
164
161
|
await redis.expire(redisKey, ttlSeconds);
|
|
165
162
|
}
|
|
166
163
|
if (removedIds.length > 0) {
|
|
167
|
-
await redis.del(
|
|
164
|
+
await redis.del(removedIds.map(dedupKey));
|
|
168
165
|
}
|
|
169
166
|
}
|
|
170
167
|
};
|
|
@@ -179,7 +176,7 @@ async function encodeSnapshot(config) {
|
|
|
179
176
|
}
|
|
180
177
|
const listKey = getThreadListKey(threadKey, threadId);
|
|
181
178
|
const stateKey = getThreadStateKey(threadKey, threadId);
|
|
182
|
-
const messages = await redis.
|
|
179
|
+
const messages = await redis.lRange(listKey, 0, -1);
|
|
183
180
|
const stateRaw = await redis.get(stateKey);
|
|
184
181
|
const state = stateRaw == null ? null : JSON.parse(stateRaw);
|
|
185
182
|
const dedupIds = idOf ? messages.map(idOf) : [];
|
|
@@ -199,31 +196,38 @@ async function applySnapshot(config) {
|
|
|
199
196
|
}
|
|
200
197
|
const listKey = getThreadListKey(threadKey, threadId);
|
|
201
198
|
const stateKey = getThreadStateKey(threadKey, threadId);
|
|
202
|
-
await redis.del(listKey, stateKey);
|
|
203
|
-
const pipeline = redis.
|
|
199
|
+
await redis.del([listKey, stateKey]);
|
|
200
|
+
const pipeline = redis.multi();
|
|
204
201
|
if (snapshot.messages.length > 0) {
|
|
205
|
-
pipeline.
|
|
202
|
+
pipeline.rPush(listKey, snapshot.messages);
|
|
206
203
|
pipeline.expire(listKey, ttlSeconds);
|
|
207
204
|
}
|
|
208
205
|
if (snapshot.state != null) {
|
|
209
|
-
pipeline.set(stateKey, JSON.stringify(snapshot.state),
|
|
206
|
+
pipeline.set(stateKey, JSON.stringify(snapshot.state), { EX: ttlSeconds });
|
|
210
207
|
}
|
|
211
208
|
for (const id of snapshot.dedupIds) {
|
|
212
|
-
pipeline.set(getThreadDedupKey(threadId, id), "1",
|
|
209
|
+
pipeline.set(getThreadDedupKey(threadId, id), "1", { EX: ttlSeconds });
|
|
213
210
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
211
|
+
try {
|
|
212
|
+
await pipeline.execAsPipeline();
|
|
213
|
+
} catch (err) {
|
|
214
|
+
await redis.del([
|
|
215
|
+
listKey,
|
|
216
|
+
stateKey,
|
|
217
|
+
...snapshot.dedupIds.map((id) => getThreadDedupKey(threadId, id))
|
|
218
|
+
]).catch(() => void 0);
|
|
219
|
+
throw firstPipelineError(err);
|
|
220
|
+
}
|
|
221
|
+
await redis.set(metaKey, "1", { EX: ttlSeconds });
|
|
222
|
+
}
|
|
223
|
+
function firstPipelineError(err) {
|
|
224
|
+
if (err != null && typeof err === "object" && "replies" in err && Array.isArray(err.replies)) {
|
|
225
|
+
const firstErr = err.replies.find(
|
|
226
|
+
(r) => r instanceof Error
|
|
227
|
+
);
|
|
228
|
+
if (firstErr) return firstErr;
|
|
225
229
|
}
|
|
226
|
-
|
|
230
|
+
return err;
|
|
227
231
|
}
|
|
228
232
|
async function clearHotTier(config) {
|
|
229
233
|
const { redis, threadKey, threadId, dedupIds = [] } = config;
|
|
@@ -233,7 +237,7 @@ async function clearHotTier(config) {
|
|
|
233
237
|
getThreadStateKey(threadKey, threadId),
|
|
234
238
|
...dedupIds.map((id) => getThreadDedupKey(threadId, id))
|
|
235
239
|
];
|
|
236
|
-
await redis.del(
|
|
240
|
+
await redis.del(keys);
|
|
237
241
|
}
|
|
238
242
|
|
|
239
243
|
// src/lib/thread/tiered.ts
|
|
@@ -431,7 +435,10 @@ function createGoogleGenAIModelInvoker({
|
|
|
431
435
|
redis,
|
|
432
436
|
client,
|
|
433
437
|
model,
|
|
434
|
-
hooks
|
|
438
|
+
hooks,
|
|
439
|
+
ttlSeconds,
|
|
440
|
+
config: generationConfig,
|
|
441
|
+
cache: cacheConfig
|
|
435
442
|
}) {
|
|
436
443
|
return async function invokeGoogleGenAIModel2(config) {
|
|
437
444
|
const { threadId, threadKey, state, assistantMessageId } = config;
|
|
@@ -440,18 +447,64 @@ function createGoogleGenAIModelInvoker({
|
|
|
440
447
|
redis,
|
|
441
448
|
threadId,
|
|
442
449
|
key: threadKey,
|
|
443
|
-
hooks
|
|
450
|
+
hooks,
|
|
451
|
+
...ttlSeconds !== void 0 && { ttlSeconds }
|
|
444
452
|
});
|
|
445
453
|
await thread.truncateFromId(assistantMessageId);
|
|
446
454
|
const { contents, systemInstruction } = await thread.prepareForInvocation();
|
|
447
455
|
const functionDeclarations = toFunctionDeclarations(state.tools);
|
|
448
456
|
const tools = functionDeclarations.length > 0 ? [{ functionDeclarations }] : void 0;
|
|
457
|
+
const {
|
|
458
|
+
systemInstruction: _si,
|
|
459
|
+
tools: _t,
|
|
460
|
+
abortSignal: _as,
|
|
461
|
+
cachedContent: callerCachedContent,
|
|
462
|
+
toolConfig: callerToolConfig,
|
|
463
|
+
...callerConfig
|
|
464
|
+
} = generationConfig ?? {};
|
|
465
|
+
let liveContents = contents;
|
|
466
|
+
let cachedContentName;
|
|
467
|
+
let cachedWriteTokens;
|
|
468
|
+
if (cacheConfig && cacheConfig.splitIndex > 0 && contents.length > cacheConfig.splitIndex) {
|
|
469
|
+
liveContents = contents.slice(cacheConfig.splitIndex);
|
|
470
|
+
const ttl = cacheConfig.ttlSeconds ?? 300;
|
|
471
|
+
const cacheRedisKey = `${threadKey ?? "messages"}:gemini-cache:${model}:${cacheConfig.splitIndex}:thread:${threadId}`;
|
|
472
|
+
cachedContentName = await redis.get(cacheRedisKey) ?? void 0;
|
|
473
|
+
if (!cachedContentName) {
|
|
474
|
+
const cacheInstance = await client.caches.create({
|
|
475
|
+
model,
|
|
476
|
+
config: {
|
|
477
|
+
contents: contents.slice(0, cacheConfig.splitIndex),
|
|
478
|
+
...systemInstruction ? { systemInstruction } : {},
|
|
479
|
+
...tools ? { tools } : {},
|
|
480
|
+
...callerToolConfig ? { toolConfig: callerToolConfig } : {},
|
|
481
|
+
ttl: `${ttl}s`,
|
|
482
|
+
abortSignal: signal
|
|
483
|
+
}
|
|
484
|
+
});
|
|
485
|
+
if (!cacheInstance?.name) {
|
|
486
|
+
throw new Error("Gemini cache creation did not return a cache name");
|
|
487
|
+
}
|
|
488
|
+
cachedContentName = cacheInstance.name;
|
|
489
|
+
cachedWriteTokens = cacheInstance.usageMetadata?.totalTokenCount ?? void 0;
|
|
490
|
+
const redisTtl = ttl - 5;
|
|
491
|
+
if (redisTtl > 0) {
|
|
492
|
+
await redis.set(cacheRedisKey, cachedContentName, { EX: redisTtl });
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
449
496
|
const stream = await client.models.generateContentStream({
|
|
450
497
|
model,
|
|
451
|
-
contents,
|
|
498
|
+
contents: liveContents,
|
|
452
499
|
config: {
|
|
453
|
-
...
|
|
454
|
-
...
|
|
500
|
+
...callerConfig,
|
|
501
|
+
...cachedContentName ? { cachedContent: cachedContentName } : {
|
|
502
|
+
...callerCachedContent ? { cachedContent: callerCachedContent } : {
|
|
503
|
+
...systemInstruction ? { systemInstruction } : {},
|
|
504
|
+
...tools ? { tools } : {}
|
|
505
|
+
},
|
|
506
|
+
...callerToolConfig ? { toolConfig: callerToolConfig } : {}
|
|
507
|
+
},
|
|
455
508
|
abortSignal: signal
|
|
456
509
|
}
|
|
457
510
|
});
|
|
@@ -465,19 +518,27 @@ function createGoogleGenAIModelInvoker({
|
|
|
465
518
|
if (!lastChunk) {
|
|
466
519
|
throw new Error("Google GenAI stream ended without producing any chunks");
|
|
467
520
|
}
|
|
521
|
+
for (const part of allParts) {
|
|
522
|
+
if (part.functionCall && !part.functionCall.id) {
|
|
523
|
+
part.functionCall.id = crypto.randomBytes(8).toString("hex");
|
|
524
|
+
}
|
|
525
|
+
}
|
|
468
526
|
const modelContent = { role: "model", parts: allParts };
|
|
469
|
-
const functionCalls = lastChunk.functionCalls ?? [];
|
|
470
527
|
return {
|
|
471
528
|
message: modelContent,
|
|
472
|
-
rawToolCalls:
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
529
|
+
rawToolCalls: allParts.filter(
|
|
530
|
+
(p) => !!p.functionCall
|
|
531
|
+
).map((p) => ({
|
|
532
|
+
id: p.functionCall.id,
|
|
533
|
+
name: p.functionCall.name ?? "",
|
|
534
|
+
args: p.functionCall.args ?? {}
|
|
476
535
|
})),
|
|
477
536
|
usage: {
|
|
478
537
|
inputTokens: lastChunk.usageMetadata?.promptTokenCount,
|
|
479
538
|
outputTokens: lastChunk.usageMetadata?.candidatesTokenCount,
|
|
480
|
-
|
|
539
|
+
cachedWriteTokens,
|
|
540
|
+
cachedReadTokens: lastChunk.usageMetadata?.cachedContentTokenCount,
|
|
541
|
+
reasonTokens: lastChunk.usageMetadata?.thoughtsTokenCount
|
|
481
542
|
}
|
|
482
543
|
};
|
|
483
544
|
};
|
|
@@ -487,13 +548,19 @@ async function invokeGoogleGenAIModel({
|
|
|
487
548
|
client,
|
|
488
549
|
model,
|
|
489
550
|
hooks,
|
|
490
|
-
|
|
551
|
+
ttlSeconds,
|
|
552
|
+
config,
|
|
553
|
+
generationConfig,
|
|
554
|
+
cache
|
|
491
555
|
}) {
|
|
492
556
|
const invoker = createGoogleGenAIModelInvoker({
|
|
493
557
|
redis,
|
|
494
558
|
client,
|
|
495
559
|
model,
|
|
496
|
-
hooks
|
|
560
|
+
hooks,
|
|
561
|
+
...ttlSeconds !== void 0 && { ttlSeconds },
|
|
562
|
+
config: generationConfig,
|
|
563
|
+
cache
|
|
497
564
|
});
|
|
498
565
|
return invoker(config);
|
|
499
566
|
}
|
|
@@ -501,21 +568,20 @@ async function invokeGoogleGenAIModel({
|
|
|
501
568
|
// src/adapters/thread/google-genai/activities.ts
|
|
502
569
|
function createGoogleGenAIAdapter(config) {
|
|
503
570
|
const { redis } = config;
|
|
504
|
-
const
|
|
571
|
+
const base = {
|
|
572
|
+
redis,
|
|
505
573
|
...config.ttlSeconds !== void 0 && { ttlSeconds: config.ttlSeconds }
|
|
506
574
|
};
|
|
507
575
|
const makeProviderThread = (threadId, threadKey) => createGoogleGenAIThreadManager({
|
|
508
|
-
|
|
576
|
+
...base,
|
|
509
577
|
threadId,
|
|
510
|
-
key: threadKey
|
|
511
|
-
...baseExtras
|
|
578
|
+
key: threadKey
|
|
512
579
|
});
|
|
513
580
|
const makeTieredBase = (threadId, threadKey) => createTieredThreadManager({
|
|
514
|
-
|
|
581
|
+
...base,
|
|
515
582
|
threadId,
|
|
516
583
|
key: threadKey,
|
|
517
584
|
idOf: storedContentId,
|
|
518
|
-
...baseExtras,
|
|
519
585
|
...config.coldStore && { coldStore: config.coldStore }
|
|
520
586
|
});
|
|
521
587
|
const threadOps = {
|
|
@@ -547,11 +613,10 @@ function createGoogleGenAIAdapter(config) {
|
|
|
547
613
|
},
|
|
548
614
|
async forkThread(sourceThreadId, targetThreadId, threadKey) {
|
|
549
615
|
const thread = createGoogleGenAIThreadManager({
|
|
550
|
-
|
|
616
|
+
...base,
|
|
551
617
|
threadId: sourceThreadId,
|
|
552
618
|
key: threadKey,
|
|
553
|
-
hooks: config.hooks
|
|
554
|
-
...baseExtras
|
|
619
|
+
hooks: config.hooks
|
|
555
620
|
});
|
|
556
621
|
await thread.fork(targetThreadId);
|
|
557
622
|
},
|
|
@@ -584,10 +649,14 @@ function createGoogleGenAIAdapter(config) {
|
|
|
584
649
|
);
|
|
585
650
|
}
|
|
586
651
|
const makeInvoker = (model, client) => createGoogleGenAIModelInvoker({
|
|
587
|
-
|
|
652
|
+
...base,
|
|
588
653
|
client,
|
|
589
654
|
model,
|
|
590
|
-
hooks: config.hooks
|
|
655
|
+
hooks: config.hooks,
|
|
656
|
+
...config.generationConfig !== void 0 && {
|
|
657
|
+
config: config.generationConfig
|
|
658
|
+
},
|
|
659
|
+
...config.cache !== void 0 && { cache: config.cache }
|
|
591
660
|
});
|
|
592
661
|
const invoker = config.model && config.client ? makeInvoker(config.model, config.client) : (() => {
|
|
593
662
|
throw new Error(
|