Ohhnews

分类导航

$ cd ..
foojay原文

BoxLang AI 3.6 发布:智能体现已拥有眼睛、耳朵和声音

#boxlang ai#浏览器自动化#语音合成#mcp#向量记忆

Ortus Solutions 宣布推出 BoxLang AI 3.6,这一版本将 AI 框架连接到 BoxLang 生产力平台的其他部分。你的智能体现在可以通过 bx-playwright 驱动真实浏览器,通过 bx-audio 进行语音输出和音频母带处理,以逐 token 的方式流式输出文本转语音,通过 stdio 与任意 MCP 服务器通信——并且全部使用它们一贯熟悉的流畅 BoxLang 语法完成。

$ bash
install-bx-module bx-ai

生产力平台走向成熟

BoxLang 是一个软件生产力平台,让开发者和 AI 智能体协同构建、现代化改造和运行应用。平台的每个组件都以连接为设计目标,而 3.6 是这些连接变得更加紧密的版本。

与 3.6 一同发布的两个主要模块:

  • bx-playwright 1.0 —— 由 Microsoft Playwright 提供支持的 BoxLang 真实浏览器自动化与测试。可驱动 Chromium、Firefox 和 WebKit,测试完整用户旅程,并让智能体拥有一个实时浏览器来验证其构建的应用。
  • bx-audio 1.0 —— JVM 上的 83 个音频函数:合成、混音、母带处理、语音、视频配乐、游戏音频与分析。无需安装任何原生依赖。

BoxLang AI 3.6 将两者都接入智能体框架。以下是实际意义。


智能体获得眼睛:通过 stdio 使用 bx-playwright

bx-playwright 附带一个 MCP 服务器,只需一条命令即可启动:

$ bash
bxplaywright mcp --headless

BoxLang AI 3.6 新增了 stdio MCP 客户端,可将任意 MCP 服务器作为子进程启动,并通过 stdin 和 stdout 与其通信——无需配置 HTTP 服务器,也无需管理端口。可直接将 bx-playwright 接入智能体:

agent = aiAgent(
    name        : "QAAgent",
    description : "Verifies that UI changes work correctly in a real browser.",
    instructions: "
        Use the browser tools to navigate, interact, and assert.
        Take a screenshot whenever you find something unexpected.
        Report findings clearly with the page URL and element details.
    ",
    mcpServers  : [
        MCP( { command: [ "bxplaywright", "mcp", "--headless" ] } )
    ]
)

result = agent.run( "Log in as [email protected], go to the dashboard, and confirm the revenue chart loads." )
println( result )

智能体会通过 listTools() 自动发现 browser_visit、browser_snapshot、browser_click、browser_fill、browser_screenshot 等工具。它可以构建登录页并立即打开,像用户一样点击浏览,并证明其正常工作——全部在一次运行中完成。

这就是缺失的一环:构建、运行、浏览、断言、修复——原生支持 BoxLang,运行在 JVM 上,无需在旁边再附加一个 JavaScript 测试项目。

stdio 客户端如何工作

进程在首次工具调用时启动。BoxLang AI 处理 MCP 初始化握手、版本协商和保活。一个后台线程读取 stdout,并将每个 JSON-RPC 响应路由回等待其 id 的调用方,因此多个工具调用可以共享一个服务器。服务器失效后会自动重启,最多重启 maxRestarts 次。当模块卸载或 JVM 关闭时,已打开的客户端会被干净地关闭。

// Any MCP server, any command — not just bx-playwright
agent = aiAgent(
    name      : "DataAgent",
    mcpServers: [
        MCP( { command: [ "npx", "-y", "@modelcontextprotocol/server-filesystem", "/data" ] } ),
        MCP( { command: [ "bxplaywright", "mcp", "--headless" ] } )
    ]
)

内置安全控制。模块设置 mcp.stdio.allowedCommands 限制可启动的可执行文件名称。空数组(默认值)允许任意可执行文件。在生产环境中,请使用显式允许列表,并优先使用固定二进制文件。请注意,allowedCommands 验证的是可执行文件名称,而不是完整参数列表,因此像 npx 这样的命令仍可通过后续参数选择包。如需更严格的控制,请使用验证完整命令数组的命令守卫。不使用 shell;命令以数组形式传递,而不是 shell 字符串。


智能体获得声音:bx-audio 与流式语音

bx-audio 在模块加载时立即在全局工具注册表中以 name@bxaudio 注册 26 个音频工具。任何 BoxLang AI 智能体都可以立即使用它们:

agent = aiAgent(
    name  : "StudioAgent",
    description: "Audio production assistant. Can inspect, edit, master and create audio files.",
    tools : [
        "audioInfo@bxaudio",
        "audioTrim@bxaudio",
        "audioNormalize@bxaudio",
        "audioMaster@bxaudio",
        "audioSpeak@bxaudio"
    ]
)

agent.run( "Load intro.wav, trim the first 3 seconds of silence, normalize to -14 LUFS and save as intro-clean.wav" )

或者把整个工作室交给智能体:

agent = aiAgent(
    name  : "FullStudio",
    tools : aiToolRegistry().getByModule( "bxaudio" )
)

安全机制内置于 bx-audio 一侧:每个路径都会根据 ai.allowedPaths 进行验证,符号链接和 ../ 无法逃逸这些路径,工具绝不会覆盖现有文件或其自身输入。

流式文本转语音:aiSpeakStream()

3.6 新增 aiSpeakStream()——一个由 IAiSpeechStreamService 接口和 speechStream 提供方能力支持的新 BIF。音频在生成时逐块流式传输,因此你可以实时将其转发到浏览器、游戏或语音界面,而无需等待完整渲染:

aiSpeakStream(
    "Welcome to the BoxLang productivity platform.",
    ( chunk ) => {
        if ( chunk.type == "audio" ) {
            // relay chunk.data (binary) to the client as it arrives
            writeOutput( chunk.data )
            bx:flush;
        }
        if ( chunk.type == "done" ) {
            println( "Streamed #chunk.bytes# bytes in #chunk.chunks# chunks" )
        }
    },
    params  : { voice: "nova" },
    options : { provider: "openai" }
)

回调会接收带类型的事件:{ type: "audio", data, format, sampleRate, sequence }、{ type: "timestamps", ... },以及最终的 { type: "done", chunks, bytes }。从回调返回 false 可提前停止。目前由 OpenAI、ElevenLabs、Cartesia、Mistral 和 Gemini 支持。

或使用链式构建器:

aiSpeak()
    .text( "Hello from BoxLang AI." )
    .provider( "cartesia" )
    .asMP3()
    .stream( chunk => writeOutput( chunk.data ) )

Cartesia:新的音频提供方

3.6 新增 Cartesia,作为文本转语音和转录的完全支持提供方。设置 CARTESIA_API_KEY,并在任何调用 aiSpeak() 或 aiSpeakStream() 的地方使用它:

$ cat
{
    "modules": {
        "bxai": {
            "settings": {
                "provider": "cartesia",
                "apiKey": "${CARTESIA_API_KEY}"
            }
        }
    }
}

Cartesia 支持 mp3、wav、pcm、mulaw 和 alaw 输出,并在流式路径上支持词级时间戳。


MCP stdio:任意服务器、任意工具、任意语言

stdio 客户端并不限于 bx-playwright。任何支持 stdio 传输的 MCP 服务器都可以工作——通过 npx 运行的 Node.js 服务器、通过 uvx 运行的 Python 服务器,或你自己的 BoxLang MCP 服务器:

// Node.js filesystem server
agent = aiAgent(
    mcpServers: [
        MCP( { command: [ "npx", "-y", "@modelcontextprotocol/server-filesystem", "/workspace" ] } )
    ]
)

// Python server
agent = aiAgent(
    mcpServers: [
        MCP( { command: [ "uvx", "mcp-server-git", "--repository", "/repos/my-project" ] } )
    ]
)

// BoxLang MCP server
agent = aiAgent(
    mcpServers: [
        MCP( { command: [ "boxlang", "my-tools-server.bxs" ] } )
    ]
)

MCP() BIF 现在返回 IMCPClient——要么是 MCPHttpClient(现有),要么是新的 MCPStdioClient。使用该 BIF 的代码无需更改即可工作。直接构造 MCPClient 的代码必须迁移到 MCP( url )。

分页工具发现

HTTP 客户端新增 listTools( cursor ),用于从对工具列表进行分页的服务器读取工具——新客户端会自动逐页读取(最多五页、100 个工具):

client = MCP( "http://my-mcp-server:3000" )
tools  = client.listTools()     // reads all pages automatically
println( tools.len() & " tools discovered" )

MariaDB 向量记忆

3.6 新增 MariaDBVectorMemory——在 MariaDB 11.7+ 上使用原生 VECTOR(n) 类型、HNSW 索引以及 VEC_DISTANCE_COSINE / VEC_DISTANCE_EUCLIDEAN 函数进行向量存储和语义搜索。排序在数据库中运行。需要 bx-mariadb 模块。

memory = aiMemory( "mariadb", config: {
    collection : "knowledge_base",
    dimensions : 1536,
    metric     : "COSINE",
    autoCreate : true
} )

agent = aiAgent(
    name        : "SupportBot",
    description : "Customer support agent grounded in the knowledge base.",
    memory      : memory
)

MariaDB 加入了 ChromaDB、Pinecone、PostgreSQL、OpenSearch、MySQL 以及其他向量记忆方案的行列。选择适合你基础设施的方案——你的智能体代码保持不变。


3.6 中还有什么

跨所有提供方的标准化推理。 所有具备推理能力的模型(Claude 扩展思考、OpenAI reasoning effort、DeepSeek、Ollama)现在都在同一个键上暴露其思考内容——流式传输时为 choices[].delta.reasoning,同步时为 choices[].message.reasoning——无论提供方在通信协议中如何称呼它。你的代码永远不需要按提供方分支。推理内容绝不会被并入记忆,也不会被回传给模型。

默认模型已更新。 OpenAI 升级到 gpt-5.6-luna,Claude 升级到 claude-sonnet-5,Groq 从已弃用的 llama-3.1-8b-instant 迁移到 openai/gpt-oss-20b。

默认超时提高到 90 秒。 之前的 45 秒对于负载下较慢的提供方来说过于紧张,会产生令人困惑的 JSON 解析错误,而不是清晰的超时错误。仍可按请求或按提供方覆盖。

${ context } 现在默认会自动加上防护边界。 你通过 options.context 或 ${ context } 传入的任何内容都会自动包裹在防篡改边界标记中。这可以防止间接提示注入——攻击者将指令隐藏在你的智能体检索到的知识库文档或网页中。无需配置;如需按消息退出该保护,可使用 aiMessage().setContextTrust( true )。

OutputGuardMiddleware 现在覆盖推理内容。 机密信息和 PII 会在模型的思考内容以及回答到达你的应用之前,从二者中脱敏。


平台,逐个组件来看

┌──────────────────────────────────────────────────────────────────┐
│               BoxLang Productivity Platform                      │
│                                                                  │
│  ┌─────────────┐   ┌──────────────┐   ┌─────────────────────┐   │
│  │  bx-audio   │   │ bx-playwright│   │  BoxLang AI 3.6     │   │
│  │  83 audio   │   │  Real browser│   │  Agents · MCP ·     │   │
│  │  functions  │◄──│  automation  │◄──│  Memory · RAG ·     │   │
│  │  26 AI tools│   │  MCP server  │   │  Streaming · Skills │   │
│  └─────────────┘   └──────────────┘   └─────────────────────┘   │
│         │                  │                      │               │
│         └──────────────────┴──────────────────────┘              │
│                            │                                      │
│              ┌─────────────▼─────────────┐                       │
│              │         BoxLang           │                       │
│              │   Modern JVM Language     │                       │
│              └───────────────────────────┘                       │
└──────────────────────────────────────────────────────────────────┘

你的智能体过去只能对文本进行推理并调用数据 API。借助 3.6,它还可以打开浏览器并点击操作 UI、大声说出响应、对音频文件进行母带处理、创作配乐,并通过它已经在使用的同一套工具调用机制完成所有这些事情。平台负责连接。你编写领域逻辑。


开始使用

要求: BoxLang 1.18+、Java 21+。使用 npx 的可选 MCP 示例需要 Node.js/npm,而使用 uvx 的示例需要 uv。

$ bash
# Install BoxLang AI
install-bx-module bx-ai --local

# Add browser automation
install-bx-module bx-playwright --local
bxplaywright install    # downloads driver + browsers

# Add audio
install-bx-module bx-audio --local
bx-audio doctor        # verifies setup

# Wire them together
agent = aiAgent(
    name      : "FullStackAgent",
    mcpServers: [ MCP( { command: [ "bxplaywright", "mcp", "--headless" ] } ) ],
    tools     : aiToolRegistry().getByModule( "bxaudio" )
)

完整设置请参阅 BoxLang AI 文档 和 AI BootCamp。

*** ** * ** ***## 资源

你的智能体可以编写代码、浏览应用、朗读结果并为其评分。🎙️