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 diff --git a/tests/playwright-test/stable-test-runner/package-lock.json b/tests/playwright-test/stable-test-runner/package-lock.json index 361b02fe0338c..5cd443046ac8b 100644 --- a/tests/playwright-test/stable-test-runner/package-lock.json +++ b/tests/playwright-test/stable-test-runner/package-lock.json @@ -5,16 +5,16 @@ "packages": { "": { "dependencies": { - "@playwright/test": "^1.58.0-alpha-1767864918000" + "@playwright/test": "^1.58.0-alpha-2026-01-12" } }, "node_modules/@playwright/test": { - "version": "1.58.0-alpha-1767864918000", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.0-alpha-1767864918000.tgz", - "integrity": "sha512-MpTnHVq9cDe0awcG84SdCPx/oFcjs5U2sooSQHwJhKGisDaXnped2n+P4iFFRx6A33u13XQpsvNCEXAYa32Utg==", + "version": "1.58.0-alpha-2026-01-12", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.0-alpha-2026-01-12.tgz", + "integrity": "sha512-dU5+U3li4qVOpqk8kUebh+1pGI6YLwNJcD68HvRflYze9Q9hlGEZk6afb8IvdhprtrjfGchvZT3MsxuyfK/Lyw==", "license": "Apache-2.0", "dependencies": { - "playwright": "1.58.0-alpha-1767864918000" + "playwright": "1.58.0-alpha-2026-01-12" }, "bin": { "playwright": "cli.js" @@ -38,12 +38,12 @@ } }, "node_modules/playwright": { - "version": "1.58.0-alpha-1767864918000", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.0-alpha-1767864918000.tgz", - "integrity": "sha512-l7e3/PeNy351d2rQrMqw1suOw4O+f5WyDIh08JX+w6UUNjZIwUjdYo/x5kViqJTNan2xsIVxM+v9U4pr2ABjGw==", + "version": "1.58.0-alpha-2026-01-12", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.0-alpha-2026-01-12.tgz", + "integrity": "sha512-qo6CQMIbyWScQBrI/ilgURc7DZoVr3Qd7LOKhlRqidzXLoTPWh9VQDjKxUdiZ6baRwxYfE7OwqVdVy0NB3dWjQ==", "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.0-alpha-1767864918000" + "playwright-core": "1.58.0-alpha-2026-01-12" }, "bin": { "playwright": "cli.js" @@ -56,9 +56,9 @@ } }, "node_modules/playwright-core": { - "version": "1.58.0-alpha-1767864918000", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.0-alpha-1767864918000.tgz", - "integrity": "sha512-KGg0syIJ6Vvt/ZpjIT/SD7T3eRRI9JO0k7wZR301F5qzaMbjJOWV5lpEjNG2dwfmPKr7rofmUkcFeWY29xTMLg==", + "version": "1.58.0-alpha-2026-01-12", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.0-alpha-2026-01-12.tgz", + "integrity": "sha512-XhRhPXOnA9TIMsIEtu9ooPcFDX1zMmWT4kCPknKrjYe1x8c8FbF/nqxxNjLMT7KA8VUFWfZrPXhSMhsRkuICmg==", "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" diff --git a/tests/playwright-test/stable-test-runner/package.json b/tests/playwright-test/stable-test-runner/package.json index 74a7c34c070ab..686edf0159c80 100644 --- a/tests/playwright-test/stable-test-runner/package.json +++ b/tests/playwright-test/stable-test-runner/package.json @@ -1,6 +1,6 @@ { "private": true, "dependencies": { - "@playwright/test": "^1.58.0-alpha-1767864918000" + "@playwright/test": "^1.58.0-alpha-2026-01-12" } }