























@@ -31,6 +31,8 @@ type GooglePromptCacheModel = Model<Api> & {
3131headers?: Record<string, string>;
3232provider: string;
3333};
34+type GooglePromptCacheContext = Parameters<StreamFn>[1];
35+type GooglePromptCacheOptions = Parameters<StreamFn>[2];
34363537type GooglePromptCacheEntry = {
3638timestamp: number;
@@ -39,6 +41,7 @@ type GooglePromptCacheEntry = {
3941modelApi?: string | null;
4042baseUrl: string;
4143systemPromptDigest: string;
44+cacheConfigDigest?: string;
4245cacheRetention: CacheRetention;
4346} & (
4447| {
@@ -111,6 +114,7 @@ function buildGooglePromptCacheMatchKey(params: {
111114modelApi?: string | null;
112115baseUrl: string;
113116systemPromptDigest: string;
117+cacheConfigDigest?: string;
114118}) {
115119return stableStringify(params);
116120}
@@ -150,6 +154,8 @@ function readLatestGooglePromptCacheEntry(
150154 : null,
151155baseUrl: stringifyGooglePromptCacheKeyPart(cacheData.baseUrl),
152156systemPromptDigest: stringifyGooglePromptCacheKeyPart(cacheData.systemPromptDigest),
157+cacheConfigDigest:
158+typeof cacheData.cacheConfigDigest === "string" ? cacheData.cacheConfigDigest : undefined,
153159});
154160if (candidateKey === matchKey) {
155161return data as GooglePromptCacheEntry;
@@ -183,13 +189,79 @@ function parseExpireTimeMs(expireTime: string | undefined): number | null {
183189return Number.isFinite(timestamp) ? timestamp : null;
184190}
185191186-function buildManagedContextWithoutSystemPrompt(context: Parameters<StreamFn>[1]) {
187-if (!context.systemPrompt) {
192+function convertManagedGoogleTools(tools: NonNullable<GooglePromptCacheContext["tools"]>) {
193+if (tools.length === 0) {
194+return undefined;
195+}
196+return [
197+{
198+functionDeclarations: tools.map((tool) => ({
199+name: tool.name,
200+description: tool.description,
201+parametersJsonSchema: tool.parameters,
202+})),
203+},
204+];
205+}
206+207+function mapManagedGoogleToolChoice(
208+choice: unknown,
209+): { mode: "AUTO" | "NONE" | "ANY"; allowedFunctionNames?: string[] } | undefined {
210+if (!choice) {
211+return undefined;
212+}
213+if (
214+typeof choice === "object" &&
215+choice !== null &&
216+(choice as { type?: unknown }).type === "function"
217+) {
218+const functionName = (choice as { function?: { name?: unknown } }).function?.name;
219+return typeof functionName === "string"
220+ ? { mode: "ANY", allowedFunctionNames: [functionName] }
221+ : { mode: "ANY" };
222+}
223+switch (choice) {
224+case "none":
225+return { mode: "NONE" };
226+case "any":
227+case "required":
228+return { mode: "ANY" };
229+default:
230+return { mode: "AUTO" };
231+}
232+}
233+234+function buildManagedGooglePromptCacheConfig(
235+context: GooglePromptCacheContext,
236+options: GooglePromptCacheOptions,
237+) {
238+const tools = context.tools?.length ? convertManagedGoogleTools(context.tools) : undefined;
239+const toolChoice = tools
240+ ? mapManagedGoogleToolChoice((options as { toolChoice?: unknown } | undefined)?.toolChoice)
241+ : undefined;
242+const toolConfig = toolChoice ? { functionCallingConfig: toolChoice } : undefined;
243+const cacheConfigDigest =
244+tools || toolConfig
245+ ? stableStringify({
246+ tools,
247+ toolConfig,
248+})
249+ : undefined;
250+return {
251+ cacheConfigDigest,
252+ tools,
253+ toolConfig,
254+};
255+}
256+257+function buildManagedContextForCachedContent(context: GooglePromptCacheContext) {
258+if (!context.systemPrompt && !context.tools?.length) {
188259return context;
189260}
190261return {
191262 ...context,
192263systemPrompt: undefined,
264+tools: undefined,
193265};
194266}
195267@@ -229,6 +301,8 @@ async function createGooglePromptCache(params: {
229301modelId: string;
230302signal?: AbortSignal;
231303systemPrompt: string;
304+tools?: unknown;
305+toolConfig?: unknown;
232306}): Promise<{ cachedContent: string; expireTime?: string } | null> {
233307const response = await params.fetchImpl(`${params.baseUrl}/cachedContents`, {
234308method: "POST",
@@ -239,6 +313,8 @@ async function createGooglePromptCache(params: {
239313systemInstruction: {
240314parts: [{ text: params.systemPrompt }],
241315},
316+ ...(params.tools ? { tools: params.tools } : {}),
317+ ...(params.toolConfig ? { toolConfig: params.toolConfig } : {}),
242318}),
243319signal: params.signal,
244320});
@@ -256,9 +332,12 @@ async function ensureGooglePromptCache(
256332cacheRetention: CacheRetention;
257333model: GooglePromptCacheModel;
258334provider: string;
335+cacheConfigDigest?: string;
259336sessionManager: GooglePromptCacheSessionManager;
260337signal?: AbortSignal;
261338systemPrompt: string;
339+tools?: unknown;
340+toolConfig?: unknown;
262341},
263342deps: GooglePromptCacheDeps,
264343): Promise<string | null> {
@@ -271,6 +350,7 @@ async function ensureGooglePromptCache(
271350modelApi: params.model.api,
272351 baseUrl,
273352 systemPromptDigest,
353+cacheConfigDigest: params.cacheConfigDigest,
274354});
275355const latestEntry = readLatestGooglePromptCacheEntry(params.sessionManager, matchKey);
276356@@ -306,6 +386,7 @@ async function ensureGooglePromptCache(
306386modelApi: params.model.api,
307387 baseUrl,
308388 systemPromptDigest,
389+cacheConfigDigest: params.cacheConfigDigest,
309390cacheRetention: params.cacheRetention,
310391cachedContent: latestEntry.cachedContent,
311392expireTime: refreshed.expireTime ?? latestEntry.expireTime,
@@ -325,6 +406,8 @@ async function ensureGooglePromptCache(
325406modelId: params.model.id,
326407signal: params.signal,
327408systemPrompt: params.systemPrompt,
409+tools: params.tools,
410+toolConfig: params.toolConfig,
328411});
329412if (!created) {
330413await appendGooglePromptCacheEntry(params.sessionManager, {
@@ -335,6 +418,7 @@ async function ensureGooglePromptCache(
335418modelApi: params.model.api,
336419 baseUrl,
337420 systemPromptDigest,
421+cacheConfigDigest: params.cacheConfigDigest,
338422cacheRetention: params.cacheRetention,
339423retryAfter: now + GOOGLE_PROMPT_CACHE_RETRY_BACKOFF_MS,
340424});
@@ -349,6 +433,7 @@ async function ensureGooglePromptCache(
349433modelApi: params.model.api,
350434 baseUrl,
351435 systemPromptDigest,
436+cacheConfigDigest: params.cacheConfigDigest,
352437cacheRetention: params.cacheRetention,
353438cachedContent: created.cachedContent,
354439expireTime: created.expireTime,
@@ -386,15 +471,19 @@ export async function prepareGooglePromptCacheStreamFn(
386471387472const inner = params.streamFn;
388473return async (model, context, options) => {
474+const cacheConfig = buildManagedGooglePromptCacheConfig(context, options);
389475const cachedContent = await ensureGooglePromptCache(
390476{
391477 apiKey,
478+cacheConfigDigest: cacheConfig.cacheConfigDigest,
392479cacheRetention: resolvedRetention,
393480model: params.model,
394481provider: params.provider,
395482sessionManager: params.sessionManager,
396483signal: params.signal,
397484 systemPrompt,
485+tools: cacheConfig.tools,
486+toolConfig: cacheConfig.toolConfig,
398487},
399488deps,
400489);
@@ -408,7 +497,7 @@ export async function prepareGooglePromptCacheStreamFn(
408497return streamWithPayloadPatch(
409498inner,
410499model,
411-buildManagedContextWithoutSystemPrompt(context),
500+buildManagedContextForCachedContent(context),
412501options,
413502(payload) => {
414503payload.cachedContent = cachedContent;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。