文章 Shengzhi Wu · 十月 28 13m read

在线体验:http://43.139.159.100:8082/paymentguard/

——仪表盘、REST API 与背后的互操作生产全程在线,灰色地带决策由 DeepSeek 实时作出。

本文是英文参赛文章的中文版。源码:github.com/Dylan5237/payment-guard-ai。

以下是正文:


支付授权,本质上是个决策问题。

大多数支付没什么可纠结的:老客户、熟悉的金额、常用的设备,几条确定性规则微秒级就能放行或拦下。真正难的是中间那片灰色地带——新设备、不常见的国家、比平时高出一截的金额、KYC 还没过审的客户。人工分析师的时间基本都耗在这里,而这恰恰是大模型 Agent 能帮上忙的地方——前提是它手里有真工具,查得到真数据。

PaymentGuard AI 做的事就这么直接:把一个真实的 IRIS AI Hub Agent(%AI.Agent)当成一个业务操作,塞进一条普通的互操作生产里。Agent 不瞎猜——它通过 AI Hub 的 SQL 工具直接查支付平台自己的 IRIS 库,查完按严格的 JSON 格式给结论;剩下的路由、审计、算 token 成本,生产全接管。

混合决策:规则打头,Agent 收尾

每笔支付进生产后走三段:

  • 确定性规则先上。 制裁地区、黑名单、硬性限额、速率尖峰,命中即拦;完全可信的客户加小额加常用设备加本地,直接放行。
0
1 24
InterSystems开发者社区
与开发者和专家交流,提出问题、寻找答案,并分享有关 InterSystems 技术、产品和解决方案的知识。 了解更多
28,948 名开发者,社区仍在不断壮大
文章 John Pan · 十月 28 16m read

为什么同一个人有两条记录,名字却不同?当相似的记录包含相互冲突的标识符时,系统应如何处理?当关键信息缺失时,系统应给出建议,还是应向来源方索取更多证据?

这些问题促使我开发了“患者身份冲突审查助手”。我希望在互操作性工作流中嵌入一个人工智能代理,供人工审查并可随时暂停。该代理负责收集证据并推荐处理方案;而人工审查员则负责授权记录之间的关联。

该应用程序使用了InterSystems IRIS Community AI Hub EAP 版本 154 中的原生 ObjectScript SDK。本文描述的是 pi-review1.1.0版本(提交编号 ab53930)。 所有案例和源数据均为合成数据,与任何医院均无关联。模型使用情况来自保存的实时呼叫记录。

项目链接:GitHub 代码库·Open Exchange 应用程序 (1.1.0)·带版本号的安装指南。下文所述的实现基于已固定的 1.1.0 源代码。

从一个缺失数据案例开始

合成案例 c6 最初缺少身份标识符和出生日期。一名操作员明确启动了调查。代理读取了该案例,验证了其来源,检索了治理规则,并返回了 NEEDS_DATA。随后,生产环境通过原生 MCP 请求了数据丰富处理。

当操作员获取数据丰富结果时,服务器在更新案例前检查了收据、来源范围和版本。随后,操作员显式地启动了另一项调查

0
1 20
文章 John Pan · 3 小时 前 5m read

Hugging Face 提供了一个庞大的数据集集合,涵盖自然语言处理、分类、问答以及其他机器学习任务。要在 InterSystems IRIS 中使用这些数据集之一,开发人员通常需要下载该数据集,将其字段映射到 SQL 数据类型,创建表,并加载数据行。

iris-hf-import简化了这一流程。它允许您通过单个 ObjectScript 调用,将 Hugging Face 数据集导入到 IRIS SQL 表中。

该项目实现了Ideas Portal 中的 DPI-I-543 提案:将 Hugging Face 数据集加载到 IRIS 中,并为社区赏金计划的第三轮而创建。

导入数据集

安装包后,打开 IRIS 终端并运行:

write ##class(dc.hfloader.Loader).Load("hitorilabs/iris", "train")

该命令将加载数据集 hitorilabs/iris 的 train 分割集,创建目标表,并插入相关行。

在我的测试环境中,该调用返回了如下结果:

{
  "status": "success",
  "error": "",
  "dataset": "hitorilabs/iris",
  "config": "default",
  "split": "train",
  "table": "HFData.iris",
  "rowsWritten": 150,
  "columns": 5
}
0
0 4
文章 cheng yu · 3 小时 前 10m read

人工智能代理即使出错,依然可能很有用

回复丢失了,但变更依然生效。我觉得我以前遇到过这种情况。

一个管理请求可以成功到达 InterSystems IRIS,修改配置,但在返回途中丢失了响应。操作员看到一条错误提示,但配置变更实际上已经生效。如果软件将无响应视为失败并重新发送请求,那么自动化反而会引发下一起故障事件。

这一切始于“请求超时。IRIS 是否已更改?”。首要任务是让不确定性保持可见,并防止因回复丢失而导致重复操作。现在,我们要求代理协助调查这种不确定性,同时仍坚持对证据的相同要求。

在《让创造力引领》一文中 让执行可追溯》一文中,我曾探讨如何在给予人员和代理创新空间的同时,确保最终工作结果能经得起证据检验。在那一阶段,Battery 已具备合成演示环境和经过测试的实时只读连接。下一步是进行真实的配置变更,通过原生 AI Hub 进行审查,并找出我们的信心超前于实际实现的环节。

这就是接下来的这一步。代理出错了,我们的代码也出错了。但我们继续前行。

这正是我希望Armada Battery去面对的问题。我打算通过让机器对其行为负责来取得成功。这当然不是什么特殊的设计难题,但很少有人会将此视为一项耀眼的成就。这是一个值得坚守的真理:怀疑并非弱点。批判性的眼光比盲目的崇拜更有价值。

那个比响应更持久的变更

我们的联机测试使用了 IRIS AI Hub EAP 109 版的一次性安装环境。

0
0 5
文章 John Pan · 3 小时 前 5m read

大多数 IRIS 开发人员每天都在使用 $LISTBUILD —— 往往自己都浑然不觉。

它不仅仅是一个用于构建列表的便捷函数,更是数据库引擎内部用于存储行数据、全局值以及许多中间结构的默认格式。

尽管如此,关于 $LISTBUILD 值的实际二进制表示形式却鲜少被提及。大多数开发者仅依赖其行为表现,却从未探究过数据究竟是如何存储的。

本文严格聚焦于**$LISTBUILD 值的** 二进制布局 ,并基于通过 zzdump 进行的直接检查。


元素结构

一个 值是由一系列元素组成的序列。每个元素的编码形式如下:

[length][type][payload]

对于较小的元素:

  • length 占用 1 字节,并包含该元素的全部内容
  • type 表示 1 字节
  • payload 长度可变

示例:


字节序

更新:感谢 @Steven Hobbs

本文中的所有示例均采用小端字节序——这绝非偶然。

尽管 IRIS 内部同时支持小端和大数据字节序平台,但 对所有二进制有效载荷都采用统一的小端编码。

这适用于:

  • 整数值
  • 十进制尾数
  • 浮点数值 (08, 09)
  • UTF-16 字符串(UTF-16LE)

例如:

0
0 4
文章 Lilian Huang · 9 小时 前 13m read

大家好,社区的朋友们!

在本系列的第一部分中,我们使用 HL7 消息类型构建了一个生产环境,并创建了一个 BPL 业务流程,该流程会在将传入的 HL7 消息传递给路由引擎之前,在消息中添加 %DynamicObject 进行丰富。 如果您尚未阅读第 1 部分,请先从那里开始。该部分全面介绍了生产环境的设置、上下文属性以及“构建动态对象代码”活动。

本文将重点探讨在生产环境中开始使用 %DynamicObject 之后会发生什么。 有七个具体的属性访问陷阱,每个开发人员迟早都会遇到。它们都有一个令人沮丧的共同特征:既没有错误,事件日志中也没有警告,只是出现了一个空值,导致您的路由规则转而执行默认操作,却完全不知道原因。

为了解决这个问题,我们在第一部分中的同一 Demo.HL7Router BPL 中添加了第二个“代码”活动。随后,我们通过可运行的代码演示了这七个陷阱,并在事件日志和可视化跟踪中验证了结果。


简而言之

  • 这七个常见的 %DynamicObject 陷阱都会产生相同的症状:值为空,无错误,无警告。
  • 属性名中包含下划线、大小写错误以及嵌套对象访问是前三大常见问题;针对所有这些问题,请使用 %Get()。
  • 使用 %IsDefined() 检查属性是否存在,使用 %GetIterator() 遍历属性,使用 %GetTypeOf() 区分 null 和空字符串。
0
0 3
文章 cheng yu · 13 小时 前 2m read

……你并不孤单。 

有帮助可寻。

我花了一段时间才弄明白这一点,我想可能还有其他人也在为此苦恼。 我仔细研究了所有关于 Entra 的资料,试图设置一个客户端凭据工作流,以便通过 Microsoft 365 账户发送电子邮件。虽然我成功获取了令牌,但始终无法使用 %Net.SMTP 类通过 SMTP 服务器进行身份验证。解决这个问题主要涉及两个方面。

首先,身份验证器的访问令牌不能仅仅是访问令牌本身。它必须采用以下格式:

set smtp.authenticator.AccessToken = "user="_emailaddress_$C(1)_"auth=Bearer "_token_$C(1,1)

其中 emailaddress 是您用于发送邮件的邮箱地址,token 是从服务器获取的 OAuth 令牌。

其次,默认的 %Net.SASL.XOAUTH2 机制的行为方式与 SMTP 服务器所期望的不一致。 具体来说,它不会向服务器发送初始响应就直接开始身份验证,但服务器期望立即收到该访问令牌。为解决此问题,您需要创建一个继承自 %Net.SASL.XOAUTH2 的类,并重写一个简单的方法:

Class User.MSOAUTH2 Extends %Net.SASL.XOAUTH2
{

/// Start authentication based on UserName and AccessToken using the XOAUTH2 SASL mechanism.
Method Start(ByRef response As %String) As %Boolean
{
 if (..AccessToken="") quit 0
 set response=..AccessToken		;in the original class, no response is sent here
 set ..state=1
 quit 1
}

}
0
0 6
文章 cheng yu · 13 小时 前 8m read

这是两篇系列文章中的第二篇,我将带您逐步了解:

  • 第一部分——简介与快速导览(上一篇文章)
    • 这是什么?
    • 部署 InterSystems IRIS Cloud Document
    • 通过服务用户界面快速浏览该服务
  • 第二部分——示例(基于 Docker 的)Java 应用程序(本文)
    • 获取连接详细信息和 TLS 证书
    • 审阅一个简单的 Java 示例,该示例用于创建集合、插入文档并查询文档
    • 配置并运行 Java(Docker 化)端到端示例

如前所述,我们的目标是为您提供流畅的“首次运行”体验。

0
0 4
文章 John Pan · 15 小时 前 7m read

Supabase 是一款基于 Postgres 的流行后端即服务(BaaS)平台。它为您的数据表提供了 API、身份验证、Studio 以及 Edge Functions 功能。然而,大量有价值的数据存储在InterSystems IRIS中, 且不会迁移。 本文将介绍iris-supabase-fdw,这是我针对社区奖励计划*“从创意到应用”(第三轮)*中Ideas Portal 创意“为 Supabase 添加 InterSystems 封装层”(DPI-I-663)所做的实现。 它使 IRIS 表在 Supabase 中以普通 Postgres 表的形式呈现,因此您可以对其进行查询、连接和 更新操作。

select p.name, a.startsat, a.doctor
from iris.appointment a
join iris.patient p on p.id = a.patient
where p.city = 'Roma' and a.status = 'scheduled';

iris.appointment 和 iris.patient 是 IRIS 表。数据绝不会被复制。

0
0 8
文章 John Pan · 15 小时 前 7m read

某交易伙伴在凌晨2点更改了订单的日期格式。到了早上,你收到了五十条警报,每条对应一笔失败的订单。而你真正想要的只是一条通知:哪里出了问题、原因是什么,以及如何解决。

这正是我开发 OcuTalon 的初衷。 OcuTalon 是一款在 InterSystems IRIS 环境中作为互操作性生产环境运行的个人助理。它会监控您的生产环境,在出现需要您处理的问题时及时通知您,并提出待您确认的修复方案。其代理程序是 IRIS AI Hub 代理,相关工作记录会显示在 Visual Trace 中——这正是您目前用于管理数据流的工具。

the OcuTalon page on the online demo, with the incident card for 50 failed orders and the Simulated phone showing the same approval request

无需安装,两分钟即可体验

访问demo.ocutalon.com。登录信息显示在启动画面上。该演示运行的是实时模型 Claude Haiku 5.5:您所看到的并非录屏内容。演示中的 Visual Trace 处于共享状态,因此请勿输入任何个人信息。

页面顶部的演示指南包含五个步骤:观看、提醒、中断数据流、批准和打开跟踪记录。

1. 监控。点击“发送”,指南会以通俗语言向 OcuTalon 发出指令:“监控‘订单’生产流程,仅在需要我介入时通知我。”‘订单’是一个由模拟合作伙伴提供数据的小型演示生产环境。步骤 2(提醒)为可选操作。

2. 中断数据流。点击“中断数据流”。合作伙伴将以新的日期格式发送 50 份订单,这些订单会在“订单”生产环境中真实地失败。

0
0 10
文章 Murilo Przybyloviecz · 23 小时 前 7m read
安全往往要拖到应用快要上线时才被考虑。对初学者来说,这种推迟会让身份验证、角色、资源和审计看起来像是互不相关的管理任务。更好的做法是,在一个小巧且可复现的示例中把它们一起引入。

我仍然是 InterSystems IRIS 的初学者,这也是我写这篇文章的主要动机之一。在学习这个平台的过程中,我希望通过亲手构建、测试和观察来理解安全,而不是只阅读各种定义。看到同一个端点从 401 Unauthorized 变为 403 Forbidden,最终变为 200 OK,让我明白了不同的安全层是如何协同工作的。我决定把这段经历记录下来,让其他初学者也能复现这个过程,并从同样的递进中学到东西。

在本文中,我在 InterSystems IRIS 中构建了一个最小化的 REST API,并用它演示三种不同的安全结果:

不带凭据的请求会收到 401 Unauthorized。
已通过身份验证但没有所需权限的用户会收到 403 Forbidden。
已通过身份验证且已获授权的用户会收到 200 OK 以及虚构的数据。

最后,我会在 IRIS 审计数据库中验证这次成功的请求。这个示例刻意保持小巧,但它用到了与大型应用相同的安全概念。

本演示返回的所有名称和记录均为虚构。该项目是一个教学示例,而不是生产环境的患者 API。

示例包含的内容

该项目使用三个 ObjectScript 类:

SecurityDemo.REST 提供 GET /security-demo/api/patients。
SecurityDemo.Installer 创建受保护的资源、角色、审计事件和 REST Web 应用。
SecurityDemo.Audit 写入安全的审计记录,不存储密码、令牌或患者数据。

授权模型使用一个名为 SecurityDemo.PatientData 的自定义资源和一个名为 SecurityDemoReader 的角色。该角色授予对该自定义资源的 READ 权限。由于这个本地示例把类存放在 USER 数据库中,该角色还被授予 %DB_USER:READ,这是加载 REST 类所必需的。

第二项权限是一个重要的设计细节。对于这个隔离的本地实验环境,这样做是可以接受的,但生产应用通常应使用专用的数据库和命名空间,这样它的数据库权限就不会覆盖无关的代码或数据。

实验环境设置

在这个实验中,我使用了本地的 InterSystems IRIS 实例和 USER 命名空间。一个小型的安装类创建了演示所需的安全元素:

SecurityDemo.PatientData 资源;
SecurityDemoReader 角色;
SecurityDemo/PatientAPI/ReadPatients 审计事件;
/security-demo/api Web 应用。

该 Web 应用使用密码身份验证,并且不启用未经身份验证的访问。这样设置的目的并不是展示一个完整的应用或安装教程,而是提供一个可控的环境,使每一种安全结果都能被清楚地观察到。

技巧 1:把身份验证和授权当作两种不同的检查

身份验证回答的是:是谁在发出请求?

授权回答的是:这个身份被允许做什么?

当我们在三种条件下调用同一个端点时,这种区别就变得清晰了。

首先,我发送了一个不带凭据的请求:

objectscript
curl.exe -i "http://localhost:52773/security-demo/api/patients"

IRIS 返回了 401 Unauthorized。

Mostrar Imagem

图 1 — InterSystems IRIS 以 HTTP 401 Unauthorized 拒绝不带凭据的请求。

这个响应发生在返回任何应用数据之前。客户端尚未建立 IRIS 可以信任的身份。

技巧 2:使用普通用户而不是管理员进行测试

在下一个测试中,我在 System Administration > Security > Users 下创建了一个已启用的账户,名为 ArticleUser。起初我没有给它分配 SecurityDemoReader。

使用管理员会让这个测试产生误导。特别是,拥有 %All 的用户持有所有权限,因此无法复现授权失败的情形。

我再次调用了该端点,并让 curl 提示输入密码,而不是把密码直接写在命令里:

objectscript
curl.exe -i --user ArticleUser "http://localhost:52773/security-demo/api/patients"

这一次身份验证成功了,但由于该用户没有所需的权限,IRIS 返回了 403 Forbidden。

Mostrar Imagem

图 2 — InterSystems IRIS 阻止了没有所需权限的已验证用户。

这种区分在排查问题时很有用:

401 通常意味着身份没有被成功建立。
403 意味着身份已知,但该操作未获授权。
技巧 3:用资源而不是用户名来保护操作

REST 类中不包含 If $Username = "ArticleUser" 这样的逻辑。把用户名硬编码进去既难以维护,也无法扩展。

相反,端点检查的是一个安全资源:

objectscript
ClassMethod Patients() As %Status
{
    Set allowed = $System.Security.Check("SecurityDemo.PatientData", "READ")
    Do ##class(SecurityDemo.Audit).Record(allowed)

    If 'allowed {
        Quit ..WriteError(403, "FORBIDDEN", "The SecurityDemoReader role is required.")
    }

    // Build and return fictional records.
}

用户通过角色获得权限,而应用检查的是资源,并不需要知道哪些具体用户应该被允许。这种分离使得添加或移除用户时无需修改应用代码。

在管理门户中,我把 SecurityDemoReader 分配给了 ArticleUser。然后我重复了同样的请求,并建立了一个新的已验证连接。IRIS 返回了 200 OK 和两条虚构的记录:

Mostrar Imagem

图 3 — 拥有 SecurityDemoReader 角色的用户成功访问了受保护的 REST 端点。

响应中还包含两个小而有用的防御性标头:

objectscript
Cache-Control: no-store
X-Content-Type-Options: nosniff

no-store 告诉客户端和中间节点不要保留该响应。nosniff 告诉浏览器不要重新解释所声明的内容类型。这些标头不能取代身份验证、授权或 TLS,但对于返回敏感信息的 API 来说,它们是合理的补充。

该演示还禁用了跨源处理,因为它不需要来自其他源的浏览器客户端。在没有实际需求的情况下启用 CORS 会带来不必要的暴露。

技巧 4:审计有意义的应用事件

身份验证和授权决定一个操作能否发生。审计则有助于回答事后发生了什么。

该演示定义了一个用户审计事件,其标识符如下:

objectscript
Event Source: SecurityDemo
Event Type: PatientAPI
Event Name: ReadPatients

审计辅助方法只记录用户名和授权结果:

objectscript
ClassMethod Record(allowed As %Boolean) As %Status
{
    Set outcome = $Select(allowed:"Allowed", 1:"Denied")
    Set eventData = "username=" _ ..SafeValue($Username, 64) _ ";outcome=" _ outcome
    Set description = "Patient list access " _ outcome

    Quit $System.Security.Audit("SecurityDemo", "PatientAPI", "ReadPatients", eventData, description)
}

这段代码刻意避免记录密码、授权标头、返回的记录或其他敏感内容。审计日志本身就是安全资产;收集不必要的机密信息,会让审计轨迹变成另一个风险来源。

我打开了 System Administration > Security > Auditing > View Audit Database,找到了由这次成功请求产生的事件。

Mostrar Imagem

图 4 — IRIS 审计轨迹记录了已验证的用户以及对受保护端点的成功访问。

该记录标明了 ArticleUser、PatientAPI 事件类型、ReadPatients 事件以及 Allowed 结果。这证明了受保护的操作是由一个已通过身份验证且已获授权的身份执行的。

技巧 5:如实说明演示与生产环境安全的差距

这个实验聚焦于一个狭窄的学习目标。真正的部署还需要额外的控制措施,包括:

对每一个承载凭据或敏感数据的连接使用 TLS;
适合所在组织的身份验证机制,例如 OAuth 2.0、OpenID Connect、Kerberos 或 LDAP;
专用的应用数据库和命名空间;
使用密钥管理,而不是把凭据放在源代码或脚本中;
数据库加密以及有文档记录的密钥管理流程;
审计日志的监控、保留、保护和审查;
禁用未使用的服务和应用;
定期审查用户、角色和权限;
同时针对成功访问和预期的安全失败进行测试。

最重要的一课是,安全应当是可观察、可测试的。仅仅创建一个角色并假定它有效是不够的。请分别使用无凭据、权限不足以及具备预期角色的方式发出请求。验证确切的 HTTP 结果,然后在审计轨迹中确认相应的活动。

结论

仅用一个小小的 REST 端点,这个示例就演示了 IRIS 的若干核心安全概念,而无需一个完整的应用:

身份验证拒绝匿名请求;
授权区分了已验证用户和已授权用户;
资源描述了被保护的对象;
角色把应用用户所需的权限归为一组;
编程式检查在靠近受保护操作的地方强制执行访问控制;
审计提供了有意义活动的踪迹。

对初学者来说,401 → 403 → 200 这个序列是理解这些层如何协同工作的实用方法。它还能产生可重复的证据,证明安全配置按预期运行。

构建并测试这个小项目,让我对 IRIS 安全的理解比分别学习每个概念时清晰得多。作为初学者,能够在一个实验中同时看到身份验证、授权、角色、资源和审计的运作,尤其令人受到鼓舞。我希望这份演练能为其他开发者提供一个简单的起点,并鼓励他们探索 InterSystems IRIS 中更广泛的安全功能。

官方文档
InterSystems IRIS Security
Privileges and Permissions
Securing REST Services
Managing Applications
Auditing

作者:Murilo Przybyloviecz
0
0 7
文章 John Pan · 十一月 4 8m read

管理门户是我们大多数人管理 IRIS 的地方,它经过多次版本更新已日趋完善。 当InterSystems邀请社区成员构建我们自己的管理门户时,我希望一举解答两个问题: 如果我们今天从头开始构建,这个门户会是什么样子?以及,要让一个AI 代理在无需信任的情况下协助运行IRIS实例,需要满足哪些条件?

最终成果便是OcuPilot:这是一个针对竞赛所列六个领域重新构建的管理门户,每个界面 旁都配有一个智能代理。它能够解释您当前所见的内容,并为您调整设置——但只有 在您审阅了更改内容并点击“确认”之后,它才会执行操作。

只需两分钟即可体验

打开ocupilot.org,使用用户名 demo 和密码 ocupilot-demo 登录。该系统运行在真实的 IRIS for Health 实例上。

  • **无需模型密钥。**该演示的代理运行在 Claude Opus 5.5 上。
  • **更改需要片刻时间。**涉及更改的请求最多可能需要一分钟。
  • **该实例为共享模式。**所有用户均使用同一实例,因此如果 /csp/myapp 已启用,请先让 代理将其禁用。该功能每整点重置一次,重置期间系统将离线几分钟 。
  • 请勿输入任何私人信息。
0
0 10
文章 John Pan · 十一月 4 4m read

当计划任务运行缓慢时,其执行历史记录是一个有用的切入点。系统消息和资源观察结果则提供了背景信息。将它们一起保存下来,便可以将此次事件与后续的运行情况进行对比。

Harbor 会存储调查过程中所需的各项资料:诊断快照、笔记、检查清单以及管理变更的链接。本分步指南将演示如何创建调查,并在不更改 IRIS 配置的情况下比较两个快照。

源代码库包含安装说明、操作指南和验证记录。

运行 Harbor

提供的软件栈需要配备 Compose v2 的 Docker 以及 Linux 容器,至少 4 GB 的可用内存和约 5 GB 的可用磁盘空间。

git clone https://github.com/Igorandor/harbor.git
cd harbor
docker compose up -d --build
docker compose ps

首次构建需要几分钟时间。打开 http://localhost:3100,并使用 HarborLocal-2026! 以 SuperUser 的身份登录。这些是捆绑实例的公共快速入门凭据。 两个已发布的端口均绑定到回环地址;请将此堆栈保留在您自己的机器上。若要进行共享部署,则需要使用您自己的账户、HTTPS 以及部署指南中的设置。

该捆绑镜像固定为 IRIS Community 2026.2 版本。

0
0 10
文章 John Pan · 十一月 4 6m read

在一项针对模拟医疗决策的随机研究中,仅凭大型语言模型(LLM)的强劲表现,并不能直接转化为使用这些模型的人员做出更优的决策。 阅读《自然·医学》上的这项研究。

**AI辅助使得构思和构建软件变得更加容易。**一个人可以描述一个问题,智能代理可以提出架构方案,双方共同探索那些在僵化的规格说明中可能永远无法涌现的解决方案。他们不同的声音、品味和建立联系的方式,正是创造力的源泉。

一个听起来合理的想法,并不意味着系统就行为正确。

语言模型可能自信地描述一个并不存在的API,从成功的HTTP响应中推断出成功,或者为它从未验证过的结果给出看似合理的解释。 人在疲劳、时间压力或信息不完整的情况下,也会犯类似的错误。当二者快速协作时,彼此的自信会相互强化。此时,产品就需要一种独立的方式来回答:请求了什么?实际发生了什么?还有哪些未知?

一起公开事件让这一区别难以被忽视。2025年, SaaStr创始人杰森·莱姆金(Jason Lemkin)描述了Replit的一款编码代理在宣布的代码冻结期间删除了其应用程序的生产数据库。 Replit的首席执行官承认了此次删除事件,并宣布将着手分离开发数据库和生产数据库。我从中得到的启示是:对话中的指令无法完全承担技术边界的全部责任。一个代理不应仅仅因为承诺过不触碰生产数据,就能够访问生产数据。

0
0 7
文章 cheng yu · 十一月 4 9m read

MyOwn Portal 将一个 AI 代理部署在 InterSystems IRIS 互操作性生产环境中:该代理会分析事件和访问请求,解释其发现的情况,并提出变更建议,但最终决策始终由人类做出。 本文介绍了我们如何利用 AI Hub(版本 2026.3.0AI.154.0)构建该系统,以参与“互操作性工作流中的 AI 代理”竞赛。

问题与核心思路

IRIS 管理员需要处理各种需要关注的信号:磁盘空间不足、任务失败、日志警报以及角色请求。 AI 代理可协助进行分诊;然而,授予其写入权限是我们不愿承担的风险。项目规则很简单:代理仅提出建议。它拥有只读工具,且任何变更仅以带有效期的建议形式存在,需由人员使用其自有凭据进行确认。

MyOwn Portal 是我们上一届竞赛中的管理门户。如今,它已拥有 MyOwn.Production.Main 生产环境,其中 AI Hub 代理作为工作流中的一个步骤。

链接

0
0 6
文章 John Pan · 十一月 4 3m read

背景

2024 年,国家卫生健康委员会发布了 WS/T 846-2024《医院信息平台交互标准》系列标准,共 11 个部分,覆盖了医院信息平台中个人信息、医疗机构、医护人员、术语、文档、就诊、医嘱、预约、状态等各类业务场景的数据交互规范。

这些标准定义了各系统间交换信息的 XML 消息格式(基于 HL7 V3),但在实际集成开发中,XML 的冗长和复杂解析过程往往让开发者头疼。更不用说那些动辄几十上百页的 PDF 文档——你需要先对着 PDF 把 XML 结构抄下来,再逐个字段替换成测试数据,整个过程繁琐且容易出错。

于是就有了 HL7V3ToJson 这个项目。

项目做了什么

简单来说,它把 WS/T 846-2024 系列标准中所有的 XML 消息格式转换成了 JSON,并提供两套数据:

json-examples/ (72 个 JSON 文件)

带有字段注释的完整示例数据,适合学习和理解消息结构。每个字段都标注了类型、必填性和取值说明。

json-demo/ (61 个 JSON 文件)

去掉注释的纯净测试数据,可以直接 curl -d @文件.json 发给接口做联调测试,无需再手工构造请求体。

0
0 10
文章 John Pan · 十一月 4 7m read

Open Exchange 应用 iris-inbox-triage 有两篇开发者社区文章。第一篇介绍了该应用的功能以及如何运行它。本文则讲述了我在 IRIS AI Hub 早期访问版本上构建该应用时遇到的问题。 如果您正在为互操作性生产环境编写 IRIS AI Hub 代理,本文或许能帮您节省一些时间。

关于 iris-inbox-triage

该应用允许您轮询 IMAP 收件箱。每封电子邮件都会成为生产环境中的一个消息。一个业务操作(Business Operation)会托管一个 %AI.Agent,并在消息到达时对其进行处理。简而言之:一封邮件进,一个判定出。

BPL 将邮件路由至归档、草稿回复、警报或审核。审核路由会将其作为任务转发至工作流,由人工进行分类处理。IRIS Vector Search 中的先例会记录该邮件及其对应的处理结果。

我最初在 2026.3.0AI.154.0 版本上开始构建 iris-inbox-triage,并在 2027.1.0AI.109.0 版本上重新测试了该程序,且无需修改任何代码。 以下问题中的三项(1、2 和 4)在该构建版本上仍可复现。

  1. 编译顺序

IRIS AI Hub 代理中的 ToolSets 包含 Query 个用于从 SQL 表中查询信息的工具。SQL 语句在编译时会进行验证。但该表只有在相关类编译完成后才会存在。

0
0 7
文章 cheng yu · 十一月 4 18m read

葡萄牙语译文

11月1日验证更新,经审计的v7结果

在一项最终确定的、在任何输出产生前已冻结的12个案例测试中(案例和评分标准由一名评审员设定,另一名评审员预先冻结了确定性基线,在两次基础设施中断且无案例输出后,允许进行一次运行), 原生代理在12个案例中的11个案例中给出了正确的原始提案,而采用“安全弃权”规则的方案为7个,确定性基线为8个,且未出现任何不安全的代理决策。预先注册的标准(正确决策数至少比两个基线多两个,零不安全决策,所有控制条件均满足)已达成。 基线模型做出了一个不安全决策(合成双重退款)。代理的一个正确退款被安全拦截,原因是测试账本不接受该异常标签,且代理遗漏了一次必需的证据缺失声明。仅针对这些案例的描述性证据:非盲测,非总体估计,非普遍优越性。 估算成本为0.026美元,非正式发票。

次要有效决策读数方面,代理为10/12,规则为7/12,确定性基线为8/12。已提交黄金数据中的r4“符合条件的效果”标签属于编写错误;该标签保持不变,并在有效读数中仍计入代理的负面结果。 测试账本仅在出现 duplicate_payment 或 duplicate_charge 时执行重复退款,绝不会因模型描述要求更广泛的操作而执行。

0
0 5
文章 cheng yu · 十一月 4 20m read

钾离子检测结果为6.8 mmol/L时,绝不能拖延。既不能等候排队,也不能等候审核人员,更不能等候语言模型完成回答。 而血糖值180 mg/dL则另当别论:该数值已超出参考范围,可能无碍,也可能需要人工审核。我正是想通过这种中间情况来检验AI Hub代理能否提供帮助,同时确保其绝不会处理那些不容耽搁的检测结果。

LabTriage Agent 是我为“互操作性工作流中的 AI 代理”竞赛提交的参赛作品,也是我首次参加 InterSystems 举办的竞赛。 该代理在 IRIS for Health 生产环境中读取 HL7 v2 ORU^R01 实验室结果,并将每项检查归类到以下三类列表之一:RELEASE(发布)、HOLD_FOR_REVIEW(待审核)或 CRITICAL(危急)。其设计理念的核心在于顺序。确定性规则优先执行,并决定哪些结果属于危急情况。 该代理仅处理规则无法裁定的结果。最终决策权由人工通过“互操作性工作流收件箱”行使。

本文将追踪一条消息在这些层级中的流转过程,展示如何在无需 API 密钥的情况下运行整个项目,并最后分享我关于 AI Hub 154 版本的一些观察。

项目中的所有数据均为合成数据,临界值也均为虚构。这仅是一个演示,并非临床工具。

0
0 9
问题 cheng yu · 十一月 4

大家好。

我从主生产视图中了解到,可以在旧版和新版界面之间切换,但像规则编辑器这类功能是否有类似的切换选项?

我曾在其他地方看到,早期版本可以通过禁用/启用 Web 应用来切换界面,但在 2026.1 版本中我找不到这个功能,而且那些帖子中提供的文档链接现在已经过时,无法跳转到文档的相应部分。

这主要是为了应对某些功能在新界面中尚未完全优化完善的情况,或者为了让我们的开发人员熟悉新旧界面之间的差异。

1
0 9
文章 cheng yu · 十一月 4 8m read

本文介绍了“互操作性工作流中的AI代理”竞赛中的一份参赛作品。

iris-inbox-triage 项目展示了一个分拣代理,该代理将收到的电子邮件路由至 alert、draft_reply、archive 或 。

本文将介绍该项目的运作原理、其功能以及如何在 IRIS AI Hub 上运行它。如果您是希望使用 IRIS AI 代理构建互操作性生产系统的开发者,请继续阅读。否则,您不妨观看这段视频演示:

https://youtu.be/ht88cOoM4Ng

我是一名自由开发者。我撰写技术文章,并从事小型自动化工作。我使用同一个邮箱处理所有与工作相关的邮件。此外,还有关于项目提案、主机服务和邮件列表的邮件。这就是我决定构建自己的邮箱监控工具的原因。

iris-inbox-triage 项目正是以我自己的收件箱监控工具为蓝本开发的。该项目包含:

  • 一个用于接收来信的互操作性服务
  • 一个 IRIS AI 代理,用于对收到的邮件进行分类
  • 一个工作流任务,供人工审核内容不明确的邮件

iris-inbox-triage 项目作为开源软件发布。您可以在 GitHub 的works-on-my-box/iris-inbox-triage 代码库中找到该项目的源代码。该项目还可在Open Exchange上获取,并作为 IPM 软件包 iris-inbox-triage 提供。

它有什么作用?

0
0 8
问题 cheng yu · 十一月 4

大家好,

我正在搭建一个本地环境,用于练习 IRIS for Health 系统的管理,包括 Linux 服务、日志、Apache 和 SELinux。

我的环境:

  • 主机:Apple Silicon Mac
  • 虚拟机:运行 RHEL 9.8(aarch64)的 UTM
  • 产品:IRIS for Health 社区版 2026.2
  • 安装类型:原生安装(非 Docker)

根据官方文档,RHEL 9 ARM64 属于受支持的平台。然而,评估门户仅提供 x64 安装程序(IRISHealth_Community-2026.2.0.221.0-lnxrh9x64.tar.gz)。

我还尝试过 InterSystems 软件分发门户,但我的账户无法访问下载资源。

请问有人知道 IRIS for Health 社区版是否有原生 ARM64 安装包,以及如何获取吗?还是说原生 ARM64 安装仅在持有其他许可证的情况下才可用?

先谢了!

1
0 10
文章 John Pan · 十一月 3 11m read

使用新的 OAuth2.ResourceServer 类保护 REST API

OAuth 2.0 是保护 REST API 的常用方法,但过去将 InterSystems IRIS® 应用程序配置为 OAuth 2.0 资源服务器时,通常需要进行多项配置,并且在许多情况下还需编写自定义身份验证代码。

从InterSystems IRIS 2025.2 开始,提供了一种更简便的方法:全新的OAuth2.ResourceServer类。

本文将逐步介绍如何将 IRIS REST 应用程序配置为 OAuth 2.0 资源服务器,并使用访问令牌来保护 REST 端点。

我们的目标是什么?

假设我们有一个由 IRIS Web 应用程序暴露的 REST API:

https://iris.example.com/myapi

我们希望对该 API 的请求必须提供 OAuth 2.0 访问令牌:

GET /myapi/patients/123 HTTP/1.1

Host: iris.example.com

Authorization: Bearer eyJhbGciOi...

授权服务器会签发访问令牌。IRIS 充当资源服务器:它接收令牌、验证其有效性、确认该令牌是针对此 API 的,并确定与该请求关联的 IRIS 用户及其角色。


关于旧方法的简要说明

0
0 6
文章 Nicky Zhu · 十一月 3 6m read

在上一篇中,Agent B 根据集成需求提出了组件拓扑。但这份设计还不是 IRIS Production,也不是正在运行的配置。它还需要参数化、渲染、编译并启动。

本文沿着这段转换过程展开,并以 SQL→SOAP 管道为例说明。需要先划清边界:Production 能编译并启动,并不能单凭这一点证明每条消息都能正确转换并持久化到目标端。

1. 拓扑是设计,不是运行配置

拓扑描述管道中应该有哪些组件,以及它们之间的关系。一个组件条目可以包含组件类型、名称、IRIS 类、所属类别和设置。Agent B 提出组件构成与顺序;平台代码负责解析已登记的实现类,并补充与连接相关的配置。

以 SQL→SOAP 为例,拓扑可能包含 SQL Service、转换 BP 和 SOAP Operation。拓扑还必须提供 IRIS 实例化这些组件所需的配置:例如 SQL 端的 JDBC DSN 和查询语句、目标 WSDL 导入生成的 BO 类,以及目标端点。

平台不会要求 Agent B 凭空发明这些部署细节。它会对 AI 输出进行归一化,根据已登记的模板和当前连接信息补充参数,检查完整性,并在适用时补齐必需组件。多管道请求会将各组整合到 Production 拓扑中,同时保留仍符合并入条件、且本次未替换的既有管道组。

2. 根据拓扑渲染一个 Production

后端会保存供 IRIS 使用的有效拓扑。demo.PipelineGenerator

0
0 9
文章 cheng yu · 十一月 3 6m read

本文旨在为希望在 Web 应用程序中原生使用 OAuth2 的初学者提供入门指南。

这里有一个配套的视频/演示,可能会对您有所帮助: 

您还可以使用随附的 Open Exchange 应用程序在本地重现此示例。

OAuth 2.0 作为 Web 应用程序的原生身份验证类型

OAuth(开放授权)2.0 是一种标准机制,允许一个应用程序在不共享用户名和密码的情况下调用另一个应用程序的 API。客户端无需在每次请求中发送凭据,而是发送一个访问令牌(通常位于 Authorization: Bearer ... 请求头中)。

OAuth2 侧重于授权(客户端被允许执行哪些操作)。如果您还需用户登录和身份声明,OAuth2 通常会与 OpenID Connect(OIDC)配合使用——但本文将重点讨论 OAuth2 访问令牌和作用域。

如果您想快速复习一下,这段短视频提供了一个很好的概述:《OAuth 2.0 概述》

0
0 9
文章 cheng yu · 十一月 3 2m read

InterSystems 官方的 VS Code 扩展功能丰富,让使用 InterSystems 产品进行开发变得轻而易举。今天,我想重点介绍一些您可能忽略了的小而实用的功能。

显示所有类成员

只需点击一个按钮,即可查看当前类的所有成员,包括继承的成员。只需点击编辑器窗口右上角的类图标,就会出现一个可筛选的所有成员列表。点击其中一个成员,它就会在编辑器标签页中显示出来。

显示执行计划

在 ObjectScript 代码中使用 SQL 是充分利用 InterSystems IRIS 强大多模型功能的一种常见方式。然而,编写高性能的 SQL 查询可能颇具挑战。 正因如此,InterSystems 新增了一项功能,让您只需在编辑器标签页中单击一下,即可查看 SQL 语句的执行计划。只需点击类查询和嵌入式 SQL 语句上方的 Show Plan 按钮,代码旁边就会出现一个显示执行计划的 Web 视图。

打开 InterSystems 文档

VS Code 的一项便捷功能是允许您同时打开多个根文件夹。此外,每个文件夹中通常包含大量文件,这使得使用资源管理器界面导航到特定文件时有时会显得繁琐。 虽然 VS Code 提供了按文件名快速打开文件的命令,但文件名通常与 InterSystems 文档的名称不同(例如,User.Test.cls 的文件路径通常为 /User/Test.cls)。

0
0 9
文章 cheng yu · 十一月 3 4m read

概述

需要通过FHIR捕获、存储和共享患者层面的质量或风险调整指标结果的组织,可以通过扩展HealthShare SDA并启用向FHIRMeasureReport资源的转换来实现。

本文介绍了如何配置 HealthShare 以支持《达芬奇风险调整(RA)实施指南》,具体方法是启用针对单个患者或成员的MeasureReport资源的存储及基于 FHIR 的交换功能。

 

此配置的效果是能够将MeasureReport 数据持久化存储在 SDA 中,并按照达芬奇 RA 配置文件的要求通过 FHIR R4 进行公开。

 

解决方案概要

该解决方案引入了一个自定义的 SDA3 容器来存储每位患者的 MeasureReport 数据,并配置 HealthShare 将该数据转换为 FHIR R4 MeasureReport 资源。

0
0 8