From 632e7168b425b2c95776b472b40aa41211a6159f Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Sun, 11 Jan 2026 15:22:03 -0800 Subject: [PATCH] chore: agent system prompt --- docs/src/api/class-page.md | 5 ++++ packages/playwright-client/types/types.d.ts | 5 ++++ packages/playwright-core/src/client/page.ts | 1 + .../playwright-core/src/protocol/validator.ts | 5 ++-- .../src/server/agent/pageAgent.ts | 24 +++++++++++++------ packages/playwright-core/types/types.d.ts | 5 ++++ packages/protocol/src/channels.d.ts | 10 ++++---- packages/protocol/src/protocol.yml | 7 +++--- 8 files changed, 46 insertions(+), 16 deletions(-) diff --git a/docs/src/api/class-page.md b/docs/src/api/class-page.md index ae88787901030..5b11eace1c164 100644 --- a/docs/src/api/class-page.md +++ b/docs/src/api/class-page.md @@ -745,6 +745,11 @@ Maximum number of agentic turns to take per call. Defaults to 10. Secrets to hide from the LLM. +### option: Page.agent.systemPrompt +* since: v1.58 +- `systemPrompt` <[string]> + +System prompt for the agent's loop. ## async method: Page.bringToFront * since: v1.8 diff --git a/packages/playwright-client/types/types.d.ts b/packages/playwright-client/types/types.d.ts index 1d0a59d40ea96..3e64513ef2bb0 100644 --- a/packages/playwright-client/types/types.d.ts +++ b/packages/playwright-client/types/types.d.ts @@ -2143,6 +2143,11 @@ export interface Page { * Secrets to hide from the LLM. */ secrets?: { [key: string]: string; }; + + /** + * System prompt for the agent's loop. + */ + systemPrompt?: string; }): Promise; /** diff --git a/packages/playwright-core/src/client/page.ts b/packages/playwright-core/src/client/page.ts index 61cc51380e554..4f4c7b03559b2 100644 --- a/packages/playwright-core/src/client/page.ts +++ b/packages/playwright-core/src/client/page.ts @@ -858,6 +858,7 @@ export class Page extends ChannelOwner implements api.Page maxTokens: options.maxTokens, maxTurns: options.maxTurns, secrets: options.secrets ? Object.entries(options.secrets).map(([name, value]) => ({ name, value })) : undefined, + systemPrompt: options.systemPrompt, }; const { agent } = await this._channel.agent(params); return PageAgent.from(agent); diff --git a/packages/playwright-core/src/protocol/validator.ts b/packages/playwright-core/src/protocol/validator.ts index 5481128be88dd..665e7a552b975 100644 --- a/packages/playwright-core/src/protocol/validator.ts +++ b/packages/playwright-core/src/protocol/validator.ts @@ -1491,12 +1491,13 @@ scheme.PageAgentParams = tObject({ api: tOptional(tString), apiKey: tOptional(tString), apiEndpoint: tOptional(tString), - model: tOptional(tString), cacheFile: tOptional(tString), cacheOutFile: tOptional(tString), - secrets: tOptional(tArray(tType('NameValue'))), maxTurns: tOptional(tInt), maxTokens: tOptional(tInt), + model: tOptional(tString), + secrets: tOptional(tArray(tType('NameValue'))), + systemPrompt: tOptional(tString), }); scheme.PageAgentResult = tObject({ agent: tChannel(['PageAgent']), diff --git a/packages/playwright-core/src/server/agent/pageAgent.ts b/packages/playwright-core/src/server/agent/pageAgent.ts index d8fc98a5a94e1..91b595fbd6501 100644 --- a/packages/playwright-core/src/server/agent/pageAgent.ts +++ b/packages/playwright-core/src/server/agent/pageAgent.ts @@ -110,16 +110,26 @@ async function runLoop(progress: Progress, context: Context, toolDefinitions: To ...context.events, }); - const task = `${userTask} + const task: string[] = []; + if (context.agentParams.systemPrompt) { + task.push('### System'); + task.push(context.agentParams.systemPrompt); + task.push(''); + } -### Context history -${context.history.map(h => `- ${h.type}: ${h.description}`).join('\n')} + task.push('### Task'); + task.push(userTask); -### Page snapshot -${full} -`; + if (context.history.length) { + task.push('### Context history'); + task.push(context.history.map(h => `- ${h.type}: ${h.description}`).join('\n')); + task.push(''); + } + task.push('### Page snapshot'); + task.push(full); + task.push(''); + await loop.run(task.join('\n')); - await loop.run(task); return { result: resultSchema ? reportedResult() : undefined }; } diff --git a/packages/playwright-core/types/types.d.ts b/packages/playwright-core/types/types.d.ts index 1d0a59d40ea96..3e64513ef2bb0 100644 --- a/packages/playwright-core/types/types.d.ts +++ b/packages/playwright-core/types/types.d.ts @@ -2143,6 +2143,11 @@ export interface Page { * Secrets to hide from the LLM. */ secrets?: { [key: string]: string; }; + + /** + * System prompt for the agent's loop. + */ + systemPrompt?: string; }): Promise; /** diff --git a/packages/protocol/src/channels.d.ts b/packages/protocol/src/channels.d.ts index bcf21f876f153..2f78521ef43b7 100644 --- a/packages/protocol/src/channels.d.ts +++ b/packages/protocol/src/channels.d.ts @@ -2586,23 +2586,25 @@ export type PageAgentParams = { api?: string, apiKey?: string, apiEndpoint?: string, - model?: string, cacheFile?: string, cacheOutFile?: string, - secrets?: NameValue[], maxTurns?: number, maxTokens?: number, + model?: string, + secrets?: NameValue[], + systemPrompt?: string, }; export type PageAgentOptions = { api?: string, apiKey?: string, apiEndpoint?: string, - model?: string, cacheFile?: string, cacheOutFile?: string, - secrets?: NameValue[], maxTurns?: number, maxTokens?: number, + model?: string, + secrets?: NameValue[], + systemPrompt?: string, }; export type PageAgentResult = { agent: PageAgentChannel, diff --git a/packages/protocol/src/protocol.yml b/packages/protocol/src/protocol.yml index 8dcf286b59703..1d603d65d80f6 100644 --- a/packages/protocol/src/protocol.yml +++ b/packages/protocol/src/protocol.yml @@ -2019,14 +2019,15 @@ Page: api: string? apiKey: string? apiEndpoint: string? - model: string? cacheFile: string? cacheOutFile: string? + maxTurns: int? + maxTokens: int? + model: string? secrets: type: array? items: NameValue - maxTurns: int? - maxTokens: int? + systemPrompt: string? returns: agent: PageAgent