Ohhnews

分类导航

$ cd ..
foojay原文

BoxLang AI 3.4.0发布:网关、人在回路与完整安全栈

#boxlang ai#ai代理#人在回路#安全防护#网关

BoxLang AI 3.4.0 是一个围绕单一主题的重大版本:信任。在真实应用中运行的 AI 智能体需要能够在重大决策中让人参与,并管理可能不可信的输入。此版本引入了网关、重构后且具有持久化决策的人在回路(Human-in-the-Loop)子系统、分层安全控制、批量审批、跨提供商规范化推理,以及更广泛的 AWS Bedrock 支持。

以下各节遵循原始 BoxLang AI 3.4.0 版本公告,并保留其所有代码示例。完整变更日志见 BoxLang AI 3.4.0 发布历史。

网关 SPI:IGateway

网关提供双向交互层:它将来自特定平台的事件转换为智能体的规范化输入,并将智能体事件(包括审批请求)转换为该平台可以向用户展示的内容。网关实现 IGateway,并且对于不需要的能力可以依赖安全默认值。

// Core gateways resolve by name
cli  = aiGateway( "cli" )
http = aiGateway( "http", { secret: "shared-hmac-secret" } )

// External gateway modules register under their own name
aiGatewayRegistry().register( new MyPlatformGateway(), "my-platform" )
myGateway = aiGateway( "my-platform" )

// Attach any gateway to HITL middleware
aiAgent(
    middleware  : new HumanInTheLoopMiddleware( gateway: aiGateway( "http" ) ),
    checkpointer: aiMemory( "cache" )
)

三个网关已包含:

网关用途
CliGateway参考 CLI 实现,使用阻塞式 stdin/stdout 审批提示,包括 approve_always 和 approve_session 决策。
HttpGateway使用 HMAC-SHA256 签名的交互,带时间戳校验、nonce 去重、待处理交互 TTL 和原子决策声明。
MockGateway用于测试和示例的内存实现。

其他平台可以实现独立的网关模块,而无需让智能体本身依赖特定消息平台。

人在回路与持久化审批授权

人在回路(HITL)功能现在将审批策略(IApprovalPolicy)与交互流程(HumanInteractionCoordinator)分离。中间件成为使用这些组件的适配器。

import bxModules.bxai.models.middleware.core.HumanInTheLoopMiddleware;

// Simple: match by tool name (default policy)
hitl = new HumanInTheLoopMiddleware( toolsRequiringApproval: [ "deleteRecord" ] )

// Or supply any IApprovalPolicy, risk-based, callback-based, composite, or your own
hitl = new HumanInTheLoopMiddleware(
    policy : new RiskLevelApprovalPolicy( minLevel: "high" ),
    gateway: aiGateway( "http" )
)

agent = aiAgent( middleware: [ hitl ], checkpointer: aiMemory( "cache" ) )

当人工授予长期有效的审批时,由缓存、JDBC 或文件支持的 IDecisionStore 可以将该决策保留到当前运行之外,包括跨重启。

store = aiDecisionStore( "jdbc", { datasource: "myDSN", table: "ai_decisions" } )
hitl  = new HumanInTheLoopMiddleware( toolsRequiringApproval: [ "placeOrder" ], decisionStore: store )

批量审批:一次挂起,而不是每次调用一次

当一个智能体轮次请求多个需要授权的工具时,这些待处理调用现在会在单个检查点中挂起。恢复时,已保存的助手消息会被处理,而无需重放模型调用。调用方可以一起批准所有调用,也可以逐个决定。

agent = aiAgent(
    tools       : [ getWeatherTool, sendEmailTool ],
    middleware  : [ new HumanInTheLoopMiddleware( toolsRequiringApproval: [ "get_weather", "send_email" ] ) ],
    checkpointer: aiMemory( "cache" )
)

result = agent.run( "Check the weather in KC and email me the result", {}, { threadId: "t1" } )
// result.isSuspended() == true, with BOTH tool calls pending in ONE checkpoint

// One decision applies to every pending call...
final = agent.resume( "approve", "t1" )

// ...or resolve each one individually
final = agent.resume(
    [
        { decision: "approve" },
        { decision: "reject", reason: "not needed" }
    ],
    "t1"
)

批量审批在 OpenAI、Claude、Bedrock 和 Cohere 上均受支持。此版本还包括针对 OpenAI 和 Claude 的流式批处理。

安全与护栏:三个阶段,选择启用

BoxLang AI 3.4.0 增加了针对提示注入和数据丢失的分层控制。核心安全设置是选择启用的,开发人员还可以将中间件附加到单个智能体。以下示例复现了发布文章中的设置结构。

{
  "modules": {
    "bxai": {
      "settings": {
        "security": {
          "enabled": false,
          "input": {
            "enabled": true,
            "action": "flag",
            "detectors": [],
            "customPatterns": [],
            "normalizeUnicode": true,
            "stripZeroWidth": true,
            "scanToolResults": true
          },
          "fencing": {
            "enabled": true,
            "fenceContext": true,
            "escapeBindings": true,
            "preamble": ""
          }
        }
      }
    }
  }
}

打开 security.enabled 后,安全中间件可以通过 aiChat()、aiModel() 和 aiAgent() 自动附加到请求。单个请求可以通过 { secure: false } 选择退出。即使更广泛的安全功能关闭,Unicode 规范化和零宽字符清理也会生效。

阶段 1 —— 输入净化: InputSanitizerMiddleware 检查传入的用户文本,并可选检查工具/MCP 结果,以发现指令覆盖、角色冒充、隐藏 Unicode、可疑编码字符串和类似数据外泄的 URL 等模式。可用操作包括 block、strip、flag 和 log。

sanitizer = new bxModules.bxai.models.middleware.security.InputSanitizerMiddleware(
    action         : "strip",
    detectors      : [ "instructionOverride", "jailbreak" ],
    customPatterns : [ { name: "internalCodes", regex: "(?i)PROJ-[0-9]{4}" } ],
    scanToolResults: true
)

agent = aiAgent( name: "support-bot", middleware: [ sanitizer ] )

阶段 2 —— 不可信内容围栏: 检索到的文档、网页或工具响应应被视为不可信输入,而不是指令。aiFence() 会在这些内容周围添加明确边界。

context = aiFence( retrievedDoc, "knowledge-base" )
answer  = aiChat( "Answer using this context: #context#" )

模板绑定围栏与转义提供了进一步保护,以防将检索数据与可信指令混淆;发布文档描述了即使主安全选项被禁用时也会适用的行为。

阶段 3 —— 输出防护: OutputGuardMiddleware 可以脱敏敏感值,并从生成的输出中移除选定的、类似数据外泄的 Markdown。这种本地处理不需要另一次模型调用。

guard = new bxModules.bxai.models.middleware.security.OutputGuardMiddleware( action: "redact" )
aiAgent( name: "support", middleware: [ guard ] )

对于额外的基于模型的分类,LLMGuardMiddleware 可以要求另一个提供商(通常是更小或本地模型)对内容进行分类。

guard = new LLMGuardMiddleware( judge: { provider: "ollama", model: "llama-guard3" } )
aiAgent( name: "support-bot", middleware: [ guard ] )

还包含一个确定性的离线模拟提供商,用于在 CI 中测试 AI 中间件、HITL 和护栏,而无需实时凭据。

跨提供商的规范化推理

兼容模型支持的推理现在可以一致地以 message.reasoning 获取,或者在流式传输期间以 delta.reasoning 获取。它不同于模型的最终内容,并且不会存储在对话记忆中。

result = aiChat( "Solve this step by step: ...", params: {
    thinking: { type: "enabled", budget_tokens: 10000 }
}, options: { returnFormat: "raw" } )
reasoning = result.choices[1].message.reasoning ?: ""
answer    = result.choices[1].message.content

提供商支持和对推理数据的访问取决于模型可用的功能与策略。

智能体运行控制:cancelRun() 和 steerRun()

智能体支持取消或引导已在进行中的工作,通过 threadId 标识。

agent.cancelRun( threadId )                        // stop at the next checkpoint
agent.steerRun( threadId, "actually, focus on X" )  // splice a message into the live turn

使用 aiGatewaySession() 的网关会话

网关会话将一个智能体连接到一个或多个通道,将传入消息路由到智能体,并通过发起网关返回输出。

session = aiGatewaySession(
    agent   : myAgent,
    gateways: [ "cli", "http" ],
    policy  : "queue"
)
session.start()

如果智能体忙碌时另一条消息到达,会话可以 reject、queue(默认)、steer 或 interrupt 现有轮次。

AWS Bedrock 提供商对等性

此版本扩展了 Bedrock 身份验证,以包括 bearer-token 支持和 AWS 凭据链(显式凭据、环境、ECS/EKS 容器(包括 EKS Pod Identity)和 EC2 IMDSv2),并具有感知过期的缓存。它还增加了 Guardrails 支持、可配置的 baseURL、Cohere/Titan-v2 嵌入,以及 Claude-on-Bedrock 工具使用。

// Bearer token, simplest path, no SigV4 signing required
result = aiChat( "Hello", provider: "bedrock", options: {
    providerOptions: { region: "us-east-1", bearerToken: "..." }
} )

// Or let the default credential chain resolve automatically
result = aiChat( "Hello", provider: "bedrock", options: {
    providerOptions: { region: "us-east-1" }
} )

记忆:基于 Token 的摘要

SummaryMemory 现在可以使用估算的 token 数而不是消息数作为压缩触发条件。

memory = aiMemory(
    memory: "summary",
    config: { maxTokens: 4000, maxMessages: 0, summaryThreshold: 10 }
)

maxTokens 和 maxMessages 是替代触发条件:配置其中一个,而不是两个都配置。summarize() 方法现在是 IAiMemory 接口的一部分,并由内置记忆类型实现。

重要修复

此版本还解决了若干提供商和中间件不一致问题:

  • 在 Claude、Bedrock 和 Cohere 上,工具调用中间件钩子被绕过;现在它们都使用与 OpenAI 相同的中间件管道。
  • Claude 扩展思考此前会导致同步 aiChat() 路径选择错误的响应块;现在它会正确选择第一个文本块。
  • approve_always 和 approve_session 授权在异步、非 CLI 网关上不会持久化;此问题已解决。
  • 由于缺少默认 schema 方法,MCP 工具使用在 Claude 和 Bedrock 上可能失败。
  • 从配置文件加载的 AWS 凭据因函数名拼写错误而失败。

完整修复列表见官方发布历史。

更新后的默认值与迁移说明

此版本将默认 AI 请求超时从 45 秒增加到 90 秒,并更新了若干提供商的默认模型。如发布历史中详述,除指定的 Unicode 清理外,安全默认关闭;旧版 mode: "cli" 和 mode: "web" HITL 设置仍然兼容,而对于新的平台特定设置,gateway: 是首选方法。使用单个决策调用 agent.resume() 仍然受支持;按调用决策数组是一项新增功能。

有关更多迁移细节,请参阅 BoxLang AI 迁移指南。

立即获取

使用 CommandBox:

box install bx-ai

或使用 BoxLang 安装程序:

install-bx-module bx-ai

其他资源:BoxLang AI 文档 和 bx-ai 源代码仓库。## 想深入了解?五篇技术深度解析

本文概览收录了发布公告中的示例。对于关注架构决策、实现细节以及更完整实战案例的读者,Ortus 团队还发布了五篇专题技术深度解析:

  1. 第 1 篇:网关——一个接口,适配任意平台
  2. 第 2 篇:全面革新的人机协同(HITL)
  3. 第 3 篇:批量审批
  4. 第 4 篇:锁死提示词注入
  5. 第 5 篇:告别猜测的推理能力

BoxLang AI 由 Ortus Solutions 团队维护,是更广泛的 BoxLang 生态的一部分。
分享此页面

发现错误或有内容补充?在 GitHub 上编辑此页面 [LOADING...]
作者

Luis Majano

Ortus Solutions 首席执行官 — 工程师 — 作者 — ColdBox HMVC、BoxLang JVM 语言、ContentBox CMS 等项目的创造者。

加入讨论