LogoLexmount 文档
LogoLexmount 文档
首页

介绍

使用指南OpenClaw 接入 Lexmount 说明Codex Skill 接入 Lexmount 说明
Node.js SDK快速开始核心能力示例与参考
X (Twitter)
Node.js SDK

核心能力

Node.js SDK 提供的 sessions、contexts、extensions、downloads、日志与错误处理能力。

核心能力

会话管理

创建会话

// 基础创建
const session = await client.sessions.create();

// 指定浏览器模式
const session = await client.sessions.create({
  browserMode: 'normal',
});

// 挂载已上传扩展
const session = await client.sessions.create({
  browserMode: 'normal',
  extensionIds: ['ext_11ff6ce20fb0'],
});

// 配置带认证的上游代理
const session = await client.sessions.create({
  proxy: {
    type: 'external',
    server: 'http://192.168.1.1:8080',
    username: 'user',
    password: 'pass',
  },
});

// 可选浏览器模式:
// - 'normal': 标准浏览器容器
// - 'light': 轻量浏览器模式

结合 Context 创建会话

const context = await client.contexts.create({
  metadata: { userId: '1001' },
});

const session = await client.sessions.create({
  context: { id: context.id, mode: 'readWrite' },
});

// SDK 也接受 'read_write'、'readOnly'、'read_only'
// 并会自动转换成 API 需要的格式。

查询会话

const result = await client.sessions.list();
console.log(`Total: ${result.pagination.totalCount}`);
console.log(`Active: ${result.pagination.activeCount}`);

for (const session of result) {
  console.log(`${session.id}: ${session.status}`);
}

const activeSessions = await client.sessions.list({ status: 'active' });
console.log(`Found ${activeSessions.length} active sessions`);

删除会话

await client.sessions.delete({ sessionId: 'session-id' });

// 或者直接使用会话对象上的辅助方法
await session.close();

会话超时行为

  • 会话超时由服务端根据该会话配置的时长统一判定。
  • 如果已经到达超时时间,但平台在最近 2 分钟内仍然观察到客户端 CDP 活跃消息,则不会立刻删除该会话,而是短暂保活。
  • 实际上,connectOverCDP、Playwright、Puppeteer 以及直接发送的 DevTools 协议消息,都会被视为 CDP 活跃。
  • 当 CDP 活跃停止超过 2 分钟后,这个已经超时的会话会在下一轮超时清理时被回收。

会话下载

在使用会话下载接口前,建议先显式配置远程浏览器的下载目录:

const browser = await chromium.connectOverCDP(session.connectUrl);
const cdp = await browser.newBrowserCDPSession();
await cdp.send('Browser.setDownloadBehavior', {
  behavior: 'allow',
  downloadPath: '/config/Downloads',
  eventsEnabled: true,
});

如果没有这一步,下载的文件可能只保留在 Playwright 的临时产物中,无法被会话下载 API 查询到。

const downloads = await client.sessions.downloads.list(session.id);
console.log(downloads.summary.count);

const fileBuffer = await client.sessions.downloads.get(session.id, 'download-id');
const archiveBuffer = await client.sessions.downloads.archive(session.id);

await client.sessions.downloads.delete(session.id);

Context 操作

const context = await client.contexts.create({
  metadata: { owner: 'demo' },
});

const contexts = await client.contexts.list({
  status: 'available',
  limit: 20,
});

const details = await client.contexts.get(context.id);
console.log(details.status);

await client.contexts.forceRelease(context.id);
await client.contexts.delete(context.id);
  • client.contexts.create(metadata=...) 创建服务端持久化浏览器配置。
  • client.contexts.list(status=..., limit=...) 列出可用或被锁定的 contexts。
  • client.contexts.get(contextId) 获取单个 context。
  • client.contexts.delete(contextId) 删除单个 context。
  • client.contexts.forceRelease(contextId) 在异常场景下强制释放锁。

扩展管理

const extension = await client.extensions.upload('/absolute/path/to/extension.zip', {
  name: 'demo-extension',
});

const extensions = await client.extensions.list({ limit: 10 });
for (const item of extensions) {
  console.log(item.id, item.name);
}

const details = await client.extensions.get(extension.id);
await client.extensions.delete(extension.id);

错误处理

import {
  APIError,
  AuthenticationError,
  ContextLockedError,
  ContextNotFoundError,
  NetworkError,
  TimeoutError,
} from 'lexmount';

try {
  await client.sessions.create({
    context: { id: 'ctx_123', mode: 'readWrite' },
  });
} catch (error) {
  if (error instanceof AuthenticationError) {
    console.error('鉴权失败');
  } else if (error instanceof ContextNotFoundError) {
    console.error('Context 不存在');
  } else if (error instanceof ContextLockedError) {
    console.error(error.activeSessionId, error.retryAfter);
  } else if (error instanceof TimeoutError || error instanceof NetworkError) {
    console.error('网络或超时异常');
  } else if (error instanceof APIError) {
    console.error(error.statusCode);
  } else {
    throw error;
  }
}

日志

import { disableLogging, enableLogging, setLogLevel } from 'lexmount';

setLogLevel('DEBUG');
enableLogging('INFO');
disableLogging();

可用日志级别:

  • DEBUG
  • INFO
  • WARNING
  • ERROR
  • CRITICAL
  • SILENT

API 入口

本页列出包对外暴露的主要公共 API 入口。

Client

  • Lexmount

Sessions

  • SessionsResource
  • SessionInfo
  • SessionListResponse
  • PaginationInfo
  • SessionDownloadsResource
  • SessionDownloadInfo
  • SessionDownloadsListResponse
  • SessionDownloadsDeleteResponse

Contexts

  • ContextsResource
  • ContextInfo
  • ContextListResponse

Extensions

  • ExtensionsResource
  • ExtensionInfo

Exceptions

  • LexmountError
  • AuthenticationError
  • SessionNotFoundError
  • ContextNotFoundError
  • ContextLockedError
  • APIError
  • NetworkError
  • ValidationError
  • TimeoutError

Logging

  • LexmountLogger
  • setLogLevel
  • enableLogging
  • disableLogging
  • getLogger

快速开始

安装 SDK、配置凭证,并使用 Playwright 连接远程浏览器。

示例与参考

可直接运行的示例脚本与执行方式。

目录

核心能力
会话管理
Context 操作
扩展管理
错误处理
日志
API 入口
Client
Sessions
Contexts
Extensions
Exceptions
Logging