From 7c2d000e298ac655280931aa832c98018818e866 Mon Sep 17 00:00:00 2001 From: Simon <10131203+gaomeng1900@users.noreply.github.com> Date: Mon, 22 Dec 2025 16:12:34 +0800 Subject: [PATCH] feat: create llms package and mv files --- .vscode/settings.json | 9 +- package-lock.json | 15 ++++ package.json | 1 + packages/llms/README.md | 82 +++++++++++++++++++ packages/llms/package.json | 44 ++++++++++ .../src/llms => llms/src}/OpenAIClient.ts | 0 .../llms => llms/src}/OpenAILenientClient.ts | 0 .../src/llms => llms/src}/errors.ts | 0 .../src/llms => llms/src}/index.ts | 0 .../src/llms => llms/src}/types.ts | 0 .../src/llms => llms/src}/utils.ts | 0 packages/llms/tsconfig.dts.json | 10 +++ packages/llms/tsconfig.json | 13 +++ packages/llms/vite.config.js | 37 +++++++++ packages/page-agent/package.json | 1 + packages/page-agent/tsconfig.json | 2 + packages/website/tsconfig.json | 2 + packages/website/vite.config.js | 1 + tsconfig.json | 1 + 19 files changed, 217 insertions(+), 1 deletion(-) create mode 100644 packages/llms/README.md create mode 100644 packages/llms/package.json rename packages/{page-agent/src/llms => llms/src}/OpenAIClient.ts (100%) rename packages/{page-agent/src/llms => llms/src}/OpenAILenientClient.ts (100%) rename packages/{page-agent/src/llms => llms/src}/errors.ts (100%) rename packages/{page-agent/src/llms => llms/src}/index.ts (100%) rename packages/{page-agent/src/llms => llms/src}/types.ts (100%) rename packages/{page-agent/src/llms => llms/src}/utils.ts (100%) create mode 100644 packages/llms/tsconfig.dts.json create mode 100644 packages/llms/tsconfig.json create mode 100644 packages/llms/vite.config.js diff --git a/.vscode/settings.json b/.vscode/settings.json index 2224078..a1f9a3a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,13 @@ { "editor.fontLigatures": true, - "cSpell.words": ["HITL", "innerhtml", "opensource", "retryable", "wouter"], + "cSpell.words": [ + "HITL", + "innerhtml", + "llms", + "opensource", + "retryable", + "wouter" + ], "markdownlint.config": { // "comment": "Relaxed rules", "default": true, diff --git a/package-lock.json b/package-lock.json index 1b12a3f..2206353 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "workspaces": [ "packages/page-controller", "packages/ui", + "packages/llms", "packages/page-agent", "packages/website" ], @@ -1558,6 +1559,10 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/@page-agent/llms": { + "resolved": "packages/llms", + "link": true + }, "node_modules/@page-agent/page-controller": { "resolved": "packages/page-controller", "link": true @@ -7183,10 +7188,20 @@ "zod": "^3.25.0 || ^4.0.0" } }, + "packages/llms": { + "name": "@page-agent/llms", + "version": "0.0.13", + "license": "MIT", + "dependencies": { + "chalk": "^5.6.2", + "zod": "^4.2.0" + } + }, "packages/page-agent": { "version": "0.0.13", "license": "MIT", "dependencies": { + "@page-agent/llms": "0.0.13", "@page-agent/page-controller": "0.0.13", "@page-agent/ui": "0.0.13", "chalk": "^5.6.2", diff --git a/package.json b/package.json index 19b2ff4..29a4cb0 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "workspaces": [ "packages/page-controller", "packages/ui", + "packages/llms", "packages/page-agent", "packages/website" ], diff --git a/packages/llms/README.md b/packages/llms/README.md new file mode 100644 index 0000000..a2d5e49 --- /dev/null +++ b/packages/llms/README.md @@ -0,0 +1,82 @@ +# @page-agent/llms + +LLM client with a **reflection-before-action** mental model for page-agent. + +## Why This Package Exists + +The LLM module and the agent logic are inherently coupled. This package exists not to decouple them, but to **define the interface contract** between the LLM and the agent. + +The core abstraction is the `MacroToolInput` — a structured output format that **forces the model to reflect before acting**. + +## The Reflection-Before-Action Model + +Every tool call must first output its reasoning state before the actual action: + +```typescript +interface MacroToolInput { + // Reflection (mandatory before any action) + evaluation_previous_goal?: string // How well did the previous action work? + memory?: string // Key information to remember + next_goal?: string // What to accomplish next + + // Action (the actual operation) + action: Record +} +``` + +This design ensures that: + +1. **The model evaluates its previous action** before deciding the next step +2. **Working memory is explicitly maintained** across conversation turns +3. **Goals are clearly stated**, making the agent's reasoning transparent and debuggable + +## Architecture + +``` +┌─────────────────────────────────────────────────────┐ +│ PageAgent │ +│ - Maintains agent state and history │ +│ - Orchestrates tool execution │ +│ - Assembles prompts with browser state │ +└─────────────────────┬───────────────────────────────┘ + │ uses + ▼ +┌─────────────────────────────────────────────────────┐ +│ @page-agent/llms │ +│ - Defines MacroToolInput contract │ +│ - Handles LLM API calls │ +│ - Parses and validates structured output │ +│ - Executes tool calls │ +└─────────────────────────────────────────────────────┘ +``` + +## Key Components + +| Export | Description | +|--------|-------------| +| `LLM` | Main LLM client class with retry logic | +| `MacroToolInput` | The reflection-before-action input schema | +| `AgentBrain` | Agent's thinking state (eval, memory, goal) | +| `LLMConfig` | Configuration for LLM connection | +| `parseLLMConfig` | Parse and apply defaults to config | + +## Usage + +This package is used internally by `page-agent`. Direct usage: + +```typescript +import { LLM, type MacroToolInput } from '@page-agent/llms' + +const llm = new LLM({ + model: 'gpt-4o', + apiKey: 'your-api-key', + baseURL: 'https://api.openai.com/v1', +}) + +const result = await llm.invoke(messages, tools, abortSignal) +``` + +## License + +MIT + diff --git a/packages/llms/package.json b/packages/llms/package.json new file mode 100644 index 0000000..1688b38 --- /dev/null +++ b/packages/llms/package.json @@ -0,0 +1,44 @@ +{ + "name": "@page-agent/llms", + "version": "0.0.13", + "type": "module", + "main": "./dist/lib/page-agent-llms.js", + "module": "./dist/lib/page-agent-llms.js", + "types": "./dist/lib/index.d.ts", + "exports": { + ".": { + "types": "./dist/lib/index.d.ts", + "import": "./dist/lib/page-agent-llms.js", + "default": "./dist/lib/page-agent-llms.js" + } + }, + "files": [ + "dist/" + ], + "description": "LLM client with reflection-before-action mental model for page-agent", + "keywords": [ + "page-agent", + "llm", + "openai", + "tool-calling", + "agent" + ], + "author": "Simon", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/alibaba/page-agent.git", + "directory": "packages/llms" + }, + "homepage": "https://alibaba.github.io/page-agent/", + "scripts": { + "build": "vite build", + "prepublishOnly": "node -e \"const fs=require('fs');['LICENSE'].forEach(f=>fs.copyFileSync('../../'+f,f))\"", + "postpublish": "node -e \"['LICENSE'].forEach(f=>{try{require('fs').unlinkSync(f)}catch{}})\"" + }, + "dependencies": { + "chalk": "^5.6.2", + "zod": "^4.2.0" + } +} + diff --git a/packages/page-agent/src/llms/OpenAIClient.ts b/packages/llms/src/OpenAIClient.ts similarity index 100% rename from packages/page-agent/src/llms/OpenAIClient.ts rename to packages/llms/src/OpenAIClient.ts diff --git a/packages/page-agent/src/llms/OpenAILenientClient.ts b/packages/llms/src/OpenAILenientClient.ts similarity index 100% rename from packages/page-agent/src/llms/OpenAILenientClient.ts rename to packages/llms/src/OpenAILenientClient.ts diff --git a/packages/page-agent/src/llms/errors.ts b/packages/llms/src/errors.ts similarity index 100% rename from packages/page-agent/src/llms/errors.ts rename to packages/llms/src/errors.ts diff --git a/packages/page-agent/src/llms/index.ts b/packages/llms/src/index.ts similarity index 100% rename from packages/page-agent/src/llms/index.ts rename to packages/llms/src/index.ts diff --git a/packages/page-agent/src/llms/types.ts b/packages/llms/src/types.ts similarity index 100% rename from packages/page-agent/src/llms/types.ts rename to packages/llms/src/types.ts diff --git a/packages/page-agent/src/llms/utils.ts b/packages/llms/src/utils.ts similarity index 100% rename from packages/page-agent/src/llms/utils.ts rename to packages/llms/src/utils.ts diff --git a/packages/llms/tsconfig.dts.json b/packages/llms/tsconfig.dts.json new file mode 100644 index 0000000..9f9b906 --- /dev/null +++ b/packages/llms/tsconfig.dts.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + // @workaround DTS bug + // dts do not work with monorepo path mapping + // disable path mapping for it + "paths": {} + } +} + diff --git a/packages/llms/tsconfig.json b/packages/llms/tsconfig.json new file mode 100644 index 0000000..4e27f29 --- /dev/null +++ b/packages/llms/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.tsbuildinfo", + "noEmit": false, + "allowImportingTsExtensions": false, + "baseUrl": ".", + "outDir": "dist" + }, + "include": ["**/*.ts"], + "exclude": ["dist", "node_modules"] +} + diff --git a/packages/llms/vite.config.js b/packages/llms/vite.config.js new file mode 100644 index 0000000..6ad522f --- /dev/null +++ b/packages/llms/vite.config.js @@ -0,0 +1,37 @@ +// @ts-check +import chalk from 'chalk' +import { dirname, resolve } from 'path' +import dts from 'unplugin-dts/vite' +import { fileURLToPath } from 'url' +import { defineConfig } from 'vite' + +const __dirname = dirname(fileURLToPath(import.meta.url)) + +console.log(chalk.cyan(`📦 Building @page-agent/llms`)) + +export default defineConfig({ + clearScreen: false, + plugins: [dts({ tsconfigPath: './tsconfig.dts.json', bundleTypes: true })], + publicDir: false, + esbuild: { + keepNames: true, + }, + build: { + lib: { + entry: resolve(__dirname, 'src/index.ts'), + name: 'PageAgentLLMs', + fileName: 'page-agent-llms', + formats: ['es'], + }, + outDir: resolve(__dirname, 'dist', 'lib'), + rollupOptions: { + external: ['chalk', 'zod'], + }, + minify: false, + sourcemap: true, + }, + define: { + 'process.env.NODE_ENV': '"production"', + }, +}) + diff --git a/packages/page-agent/package.json b/packages/page-agent/package.json index a7558dd..9e33b87 100644 --- a/packages/page-agent/package.json +++ b/packages/page-agent/package.json @@ -46,6 +46,7 @@ "dependencies": { "chalk": "^5.6.2", "zod": "^4.2.0", + "@page-agent/llms": "0.0.13", "@page-agent/page-controller": "0.0.13", "@page-agent/ui": "0.0.13" } diff --git a/packages/page-agent/tsconfig.json b/packages/page-agent/tsconfig.json index 7c6afd2..f6e917c 100644 --- a/packages/page-agent/tsconfig.json +++ b/packages/page-agent/tsconfig.json @@ -8,6 +8,7 @@ "outDir": "dist", "paths": { // + "@page-agent/llms": ["../llms/src/index.ts"], "@page-agent/page-controller": ["../page-controller/src/PageController.ts"], "@page-agent/ui": ["../ui/src/index.ts"] } @@ -16,6 +17,7 @@ "exclude": ["dist", "node_modules"], "references": [ // + { "path": "../llms" }, { "path": "../page-controller" }, { "path": "../ui" } ] diff --git a/packages/website/tsconfig.json b/packages/website/tsconfig.json index fe776e7..a1289af 100644 --- a/packages/website/tsconfig.json +++ b/packages/website/tsconfig.json @@ -12,6 +12,7 @@ // Simplified monorepo solution (raw npm workspace with hoisting) "page-agent": ["../page-agent/src/PageAgent.ts"], + "@page-agent/llms": ["../llms/src/index.ts"], "@page-agent/page-controller": ["../page-controller/src/PageController.ts"], "@page-agent/ui": ["../ui/src/index.ts"] } @@ -20,6 +21,7 @@ "exclude": ["dist", "node_modules"], "references": [ // + { "path": "../llms" }, { "path": "../page-agent" }, { "path": "../page-controller" }, { "path": "../ui" } diff --git a/packages/website/vite.config.js b/packages/website/vite.config.js index 529c63d..ab06d6e 100644 --- a/packages/website/vite.config.js +++ b/packages/website/vite.config.js @@ -22,6 +22,7 @@ export default defineConfig({ '@': resolve(__dirname, 'src'), // Monorepo packages (always bundle local code instead of npm versions) + '@page-agent/llms': resolve(__dirname, '../llms/src/index.ts'), '@page-agent/page-controller': resolve(__dirname, '../page-controller/src/PageController.ts'), '@page-agent/ui': resolve(__dirname, '../ui/src/index.ts'), 'page-agent': resolve(__dirname, '../page-agent/src/PageAgent.ts'), diff --git a/tsconfig.json b/tsconfig.json index 96843c8..a484530 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,6 +3,7 @@ "references": [ { "path": "./packages/page-controller" }, { "path": "./packages/ui" }, + { "path": "./packages/llms" }, { "path": "./packages/page-agent" }, { "path": "./packages/website" } ],