diff --git a/js/ai/src/generate.ts b/js/ai/src/generate.ts index d5c0abf168..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({ @@ -200,7 +207,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), @@ -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({ @@ -343,7 +357,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), 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', diff --git a/js/ai/tests/generate/generate_test.ts b/js/ai/tests/generate/generate_test.ts index a45c3ab0e8..c428a40538 100644 --- a/js/ai/tests/generate/generate_test.ts +++ b/js/ai/tests/generate/generate_test.ts @@ -296,6 +296,28 @@ describe('toGenerateRequest', () => { }, throws: 'FAILED_PRECONDITION', }, + { + should: 'throw INVALID_ARGUMENT when both prompt and resume are set', + prompt: { + messages: [ + { role: 'user', content: [{ text: 'hi' }] }, + { + role: 'model', + content: [ + { text: 'there' }, + { toolRequest: { name: 'test', input: { x: 1 } } }, + ], + }, + ], + prompt: 'count to 10', + resume: { + respond: { + toolResponse: { name: 'test', output: { done: true } }, + }, + }, + }, + throws: 'INVALID_ARGUMENT', + }, { should: 'passes through output options', prompt: {