From 6155d43d18ffab32244958469d9e7a608fbd5845 Mon Sep 17 00:00:00 2001 From: Ben Cook Date: Sat, 14 Feb 2026 09:36:33 +0000 Subject: [PATCH 1/4] fix(js): skip appending prompt in generate when resume is set (#4652) --- js/ai/src/generate.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/ai/src/generate.ts b/js/ai/src/generate.ts index d5c0abf168..7e0945574c 100755 --- a/js/ai/src/generate.ts +++ b/js/ai/src/generate.ts @@ -200,7 +200,7 @@ export async function toGenerateRequest( if (options.messages) { messages.push(...options.messages.map((m) => Message.parseData(m))); } - if (options.prompt) { + if (options.prompt && !options.resume) { messages.push({ role: 'user', content: Message.parseContent(options.prompt), @@ -343,7 +343,7 @@ function messagesFromOptions(options: GenerateOptions): MessageData[] { if (options.messages) { messages.push(...options.messages); } - if (options.prompt) { + if (options.prompt && !options.resume) { messages.push({ role: 'user', content: Message.parseContent(options.prompt), From 0d51d106ecfcdfc6fe75c66ce6a364e5df143f46 Mon Sep 17 00:00:00 2001 From: Ben Cook Date: Sat, 14 Feb 2026 09:36:33 +0000 Subject: [PATCH 2/4] fix(js): skip appending user prompt in definePrompt when resume is set (#4652) --- js/ai/src/prompt.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/js/ai/src/prompt.ts b/js/ai/src/prompt.ts index 1c489ad189..a4dd2a6cae 100644 --- a/js/ai/src/prompt.ts +++ b/js/ai/src/prompt.ts @@ -629,6 +629,7 @@ async function renderUserPrompt< promptCache: PromptCache, renderOptions: PromptGenerateOptions | undefined ) { + if (renderOptions?.resume) return; if (typeof options.prompt === 'function') { messages.push({ role: 'user', From 5744b1ede7400be4dd0069edcc1a16e7b309c5e7 Mon Sep 17 00:00:00 2001 From: Ben Cook Date: Sat, 14 Feb 2026 09:36:33 +0000 Subject: [PATCH 3/4] test(js): toGenerateRequest does not append prompt when resume is set --- js/ai/tests/generate/generate_test.ts | 38 +++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/js/ai/tests/generate/generate_test.ts b/js/ai/tests/generate/generate_test.ts index a45c3ab0e8..1f4bd6bd72 100644 --- a/js/ai/tests/generate/generate_test.ts +++ b/js/ai/tests/generate/generate_test.ts @@ -296,6 +296,44 @@ describe('toGenerateRequest', () => { }, throws: 'FAILED_PRECONDITION', }, + { + should: 'do not append prompt when resume is set', + prompt: { + messages: [ + { role: 'user', content: [{ text: 'hi' }] }, + { + role: 'model', + content: [ + { text: 'there' }, + { toolRequest: { name: 'test', input: { x: 1 } } }, + ], + }, + ], + prompt: 'extra user message', + resume: { + respond: { + toolResponse: { name: 'test', output: { done: true } }, + }, + }, + }, + expectedOutput: { + messages: [ + { role: 'user', content: [{ text: 'hi' }] }, + { + role: 'model', + content: [ + { text: 'there' }, + { toolRequest: { name: 'test', input: { x: 1 } } }, + ], + }, + ], + config: undefined, + docs: undefined, + resources: [], + tools: [], + output: {}, + }, + }, { should: 'passes through output options', prompt: { From 799bc7cd020a1c29a1ebab4718e5f63a80b2d5eb Mon Sep 17 00:00:00 2001 From: Ben Cook Date: Sat, 14 Feb 2026 09:36:33 +0000 Subject: [PATCH 4/4] fix(js): throw INVALID_ARGUMENT when both prompt and resume are set (#4652) --- js/ai/src/generate.ts | 14 ++++++++++++++ js/ai/tests/generate/generate_test.ts | 22 +++------------------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/js/ai/src/generate.ts b/js/ai/src/generate.ts index 7e0945574c..c84f47b13e 100755 --- a/js/ai/src/generate.ts +++ b/js/ai/src/generate.ts @@ -190,6 +190,13 @@ export async function toGenerateRequest( registry: Registry, options: GenerateOptions ): Promise { + if (options.prompt && options.resume) { + throw new GenkitError({ + status: 'INVALID_ARGUMENT', + message: + 'prompt is not supported when resume is set. The message history in messages is used instead.', + }); + } const messages: MessageData[] = []; if (options.system) { messages.push({ @@ -333,6 +340,13 @@ async function resourcesToActionRefs( } function messagesFromOptions(options: GenerateOptions): MessageData[] { + if (options.prompt && options.resume) { + throw new GenkitError({ + status: 'INVALID_ARGUMENT', + message: + 'prompt is not supported when resume is set. The message history in messages is used instead.', + }); + } const messages: MessageData[] = []; if (options.system) { messages.push({ diff --git a/js/ai/tests/generate/generate_test.ts b/js/ai/tests/generate/generate_test.ts index 1f4bd6bd72..c428a40538 100644 --- a/js/ai/tests/generate/generate_test.ts +++ b/js/ai/tests/generate/generate_test.ts @@ -297,7 +297,7 @@ describe('toGenerateRequest', () => { throws: 'FAILED_PRECONDITION', }, { - should: 'do not append prompt when resume is set', + should: 'throw INVALID_ARGUMENT when both prompt and resume are set', prompt: { messages: [ { role: 'user', content: [{ text: 'hi' }] }, @@ -309,30 +309,14 @@ describe('toGenerateRequest', () => { ], }, ], - prompt: 'extra user message', + prompt: 'count to 10', resume: { respond: { toolResponse: { name: 'test', output: { done: true } }, }, }, }, - expectedOutput: { - messages: [ - { role: 'user', content: [{ text: 'hi' }] }, - { - role: 'model', - content: [ - { text: 'there' }, - { toolRequest: { name: 'test', input: { x: 1 } } }, - ], - }, - ], - config: undefined, - docs: undefined, - resources: [], - tools: [], - output: {}, - }, + throws: 'INVALID_ARGUMENT', }, { should: 'passes through output options',