feat: expose maxSteps config

This commit is contained in:
Simon
2026-01-19 20:11:53 +08:00
parent 6d53f4cb44
commit 80c93bd668
5 changed files with 24 additions and 12 deletions

View File

@@ -8,7 +8,7 @@ import chalk from 'chalk'
import zod from 'zod' import zod from 'zod'
import { type PageAgentConfig } from './config' import { type PageAgentConfig } from './config'
import { MAX_STEPS } from './config/constants' import { DEFAULT_MAX_STEPS } from './config/constants'
import SYSTEM_PROMPT from './prompts/system_prompt.md?raw' import SYSTEM_PROMPT from './prompts/system_prompt.md?raw'
import { tools } from './tools' import { tools } from './tools'
import { import {
@@ -49,7 +49,7 @@ export { tool, type PageAgentTool } from './tools'
* - Types: thinking, executing, executed, retrying, error * - Types: thinking, executing, executed, retrying, error
*/ */
export class PageAgentCore extends EventTarget { export class PageAgentCore extends EventTarget {
config: PageAgentConfig config: PageAgentConfig & { maxSteps: number }
id = uid() id = uid()
tools: typeof tools tools: typeof tools
disposed = false disposed = false
@@ -86,7 +86,8 @@ export class PageAgentCore extends EventTarget {
constructor(config: PageAgentConfig & { pageController: PageController }) { constructor(config: PageAgentConfig & { pageController: PageController }) {
super() super()
this.config = config this.config = { ...config, maxSteps: config.maxSteps || DEFAULT_MAX_STEPS }
this.#llm = new LLM(this.config) this.#llm = new LLM(this.config)
this.tools = new Map(tools) this.tools = new Map(tools)
this.pageController = config.pageController this.pageController = config.pageController
@@ -273,7 +274,7 @@ export class PageAgentCore extends EventTarget {
await onAfterStep.call(this, this.history) await onAfterStep.call(this, this.history)
step++ step++
if (step > MAX_STEPS) { if (step > this.config.maxSteps) {
this.#onDone('Step count exceeded maximum limit', false) this.#onDone('Step count exceeded maximum limit', false)
const result: ExecutionResult = { const result: ExecutionResult = {
success: false, success: false,
@@ -475,7 +476,7 @@ export class PageAgentCore extends EventTarget {
} }
// Warn about remaining steps // Warn about remaining steps
const remaining = MAX_STEPS - stepCount const remaining = this.config.maxSteps - stepCount
if (remaining === 5) { if (remaining === 5) {
this.pushObservation( this.pushObservation(
`⚠️ Only ${remaining} steps remaining. Consider wrapping up or calling done with partial results.` `⚠️ Only ${remaining} steps remaining. Consider wrapping up or calling done with partial results.`
@@ -505,7 +506,7 @@ export class PageAgentCore extends EventTarget {
${this.task} ${this.task}
</user_request> </user_request>
<step_info> <step_info>
Step ${stepCount + 1} of ${MAX_STEPS} max possible steps Step ${stepCount + 1} of ${this.config.maxSteps} max possible steps
Current date and time: ${new Date().toISOString()} Current date and time: ${new Date().toISOString()}
</step_info> </step_info>
</agent_state> </agent_state>

View File

@@ -1,2 +1 @@
// Agent-specific constants (LLM constants moved to @page-agent/llms) export const DEFAULT_MAX_STEPS = 20
export const MAX_STEPS = 20

View File

@@ -1,5 +1,5 @@
import type { LLMConfig } from '@page-agent/llms' import type { LLMConfig } from '@page-agent/llms'
import type { PageController, PageControllerConfig } from '@page-agent/page-controller' import type { PageControllerConfig } from '@page-agent/page-controller'
import type { PageAgentCore } from '../PageAgentCore' import type { PageAgentCore } from '../PageAgentCore'
import type { PageAgentTool } from '../tools' import type { PageAgentTool } from '../tools'
@@ -14,6 +14,12 @@ export interface AgentConfig {
// theme?: 'light' | 'dark' // theme?: 'light' | 'dark'
language?: SupportedLanguage language?: SupportedLanguage
/**
* Maximum number of steps the agent can take per task.
* @default 20
*/
maxSteps?: number
/** /**
* Custom tools to extend PageAgent capabilities * Custom tools to extend PageAgent capabilities
* @experimental * @experimental

View File

@@ -105,8 +105,8 @@ const result = await agent.execute('Fill in the form with test data')`}
type: 'string', type: 'string',
required: true, required: true,
description: isZh description: isZh
? '模型名称(如 gpt-4o, claude-3.5-sonnet' ? '模型名称(如 gpt-5.2, anthropic/claude-4.5-haiku'
: 'Model name (e.g., gpt-4o, claude-3.5-sonnet)', : 'Model name (e.g., gpt-5.2, anthropic/claude-4.5-haiku)',
}, },
{ {
name: 'temperature', name: 'temperature',
@@ -149,6 +149,12 @@ const result = await agent.execute('Fill in the form with test data')`}
defaultValue: "'en-US'", defaultValue: "'en-US'",
description: isZh ? 'Agent 输出语言' : 'Agent output language', description: isZh ? 'Agent 输出语言' : 'Agent output language',
}, },
{
name: 'maxSteps',
type: 'number',
defaultValue: '20',
description: isZh ? '每个任务的最大步骤数' : 'Maximum number of steps per task',
},
{ {
name: 'customTools', name: 'customTools',
type: 'Record<string, PageAgentTool | null>', type: 'Record<string, PageAgentTool | null>',

View File

@@ -53,7 +53,7 @@ const agent = new PageAgent({
// LLM Configuration (required) // LLM Configuration (required)
baseURL: 'https://api.openai.com/v1', baseURL: 'https://api.openai.com/v1',
apiKey: 'your-api-key', apiKey: 'your-api-key',
model: 'gpt-4o', model: 'gpt-5.2',
// Optional settings // Optional settings
language: 'en-US', language: 'en-US',