EasyAI

OIE · OpenIntegrationEngine 的 AI 大脑

为开源医疗集成引擎注入智能,实现通道的自动化设计、数据类型智选、
连接器配置生成、过滤器与转换器的 AI 辅助编码

ServicePlugin ChannelPlugin REST API LLM Gateway

传统通道开发的痛点

Mirth Connect / OIE 是医疗信息集成的核心引擎,但通道开发依然高度依赖人工经验。 每个通道涉及 数据类型选择、连接器配置、过滤器编写、转换器脚本 等大量手工操作。

8+
种数据类型需要人工判断选择
HL7v2 / HL7v3 / FHIR / XML / JSON / DICOM / EDI / Delimited
20+
种连接器类型需要手动配置参数
TCP / HTTP / MLLP / File / DB / JMS / DICOM / WS ...
N × M
过滤器与转换器的组合爆炸
JavaScript / Mapper / MessageBuilder / XSLT / RuleBuilder
~2h
平均每条复杂通道的手工配置耗时
含调试与测试,不含需求分析

EasyAI 插件四层架构

遵循 OIE/Mirth Connect 标准 Extension 架构,EasyAI 由 Shared、Server、Client、Distribution 四个 Maven 模块组成, 同时引入独立的 AI Gateway 层对接大模型服务。

easyai-client

Swing Administrator UI Extension
EasyAiPanel.java
AI 侧边面板 — 嵌入通道编辑器右侧,展示 AI 建议、对话窗口和一键应用按钮
AiChatWidget.java
智能对话组件 — 用户用自然语言描述需求,AI 返回通道配置建议
AiSuggestionRenderer.java
建议渲染器 — 将 AI 返回的 JSON Diff 可视化为可审批的配置变更卡片

easyai-shared

JAX-RS Interfaces & Shared Models
EasyAiServletInterface
REST API 契约接口
/api/extensions/easyai/*
AiSuggestion.java
AI 建议模型 — 包含推荐配置、置信度、理由说明
ChannelIntent.java
通道意图模型 — 用户的自然语言需求的结构化表示
AiCodeGenRequest.java
代码生成请求 — 含上下文、目标类型和约束条件

easyai-server

ServicePlugin + ChannelPlugin + REST Servlet
EasyAiServicePlugin.java
核心服务插件 — 实现 ServicePlugin 接口,管理 AI 引擎生命周期、配置和 LLM 连接池
EasyAiChannelPlugin.java
通道钩子 — 实现 ChannelPlugin,在通道保存/部署时自动执行 AI 验证与优化建议
EasyAiServlet.java
REST 服务端实现 — 处理来自 Client 的所有 AI 请求,extends MirthServlet
DataTypeAdvisor
数据类型智选引擎
ConnectorConfigurator
连接器配置生成器
FilterTransformerGen
过滤器/转换器生成器
TemplateUpgrader
模板智能升级器

ai-gateway (内嵌)

LLM Abstraction Layer — 可插拔的多模型适配
LlmProvider (SPI)
统一的 LLM 提供者接口,支持 OpenAI / Claude / 本地模型热切换
PromptTemplateEngine
Prompt 模板引擎 — 按场景加载预构建的专家级提示词模板
ContextBuilder
上下文构建器 — 从当前通道状态提取精简上下文送入 LLM
ResponseParser
响应解析器 — 将 LLM 输出解析为类型安全的 AiSuggestion 对象
plugin.xml — Extension Manifest
<!-- EasyAI Plugin Manifest for OIE --> <pluginMetaData path="easyai"> <name>EasyAI - Intelligent Channel Assistant</name> <author>OIE Community</author> <pluginVersion>1.0.0</pluginVersion> <mirthVersion>4.5.0,4.6.0</mirthVersion> <description>AI-powered channel design assistant</description> <extensionType>SERVER_PLUGIN</extensionType> <serverClasses> <string>com.oie.plugins.easyai.server.EasyAiServicePlugin</string> <string>com.oie.plugins.easyai.server.EasyAiChannelPlugin</string> </serverClasses> <clientClasses> <string>com.oie.plugins.easyai.client.EasyAiClientPlugin</string> </clientClasses> <apiProvider type="SERVLET_INTERFACE" name="com.oie.plugins.easyai.shared.EasyAiServletInterface"/> <library type="SERVER" path="lib/ai-gateway.jar"/> <library type="SERVER" path="lib/okhttp-4.12.jar"/> <library type="SERVER" path="lib/jackson-databind.jar"/> </pluginMetaData>

六大智能模块

EasyAI 的核心能力被拆分为六个独立的 AI 模块,每个模块负责通道开发生命周期中的一个关键阶段。 模块之间松耦合,可独立使用也可链式编排。

DataType Advisor — 数据类型智选引擎

用户提供样本消息或描述业务场景,AI 自动识别最优数据类型并推荐序列化/反序列化参数。

INPUT
// 用户粘贴样本消息片段 MSH|^~\&|HIS|HOSP|LIS|LAB|202603.. PID|1||12345^^^MRN||张三^^^^^||... OBR|1|ORD001||CBC^全血计数^L|||... // 或自然语言: "接收HIS发来的检验申请"
OUTPUT → AiSuggestion
{ "dataType": "HL7V2", "version": "2.4", "messageType": "ORM^O01", "confidence": 0.96, "serializerProps": { "handleRepetitions": true, "convertLFtoCR": true, "stripNamespaces": false }, "reasoning": "检测到HL7v2管道分隔格式..." }

Connector Configurator — 连接器自动配置

根据用户描述的数据流向(源系统 → 目标系统),AI 推荐最佳的 Source/Destination 连接器类型、 传输协议、端口配置、认证方式,并生成完整的 ConnectorProperties。

Source 端推荐
根据 "HIS通过MLLP发送" → 自动选择 TCP Listener + MLLP Mode,配置端口、TLS、ACK模板
Destination 端推荐
根据 "写入FHIR服务器" → 选择 HTTP Sender,配置 Base URL、Content-Type、OAuth2 Bearer
多目标编排
支持一次生成多个 Destination:DB归档 + HTTP转发 + File备份,自动设置 waitForPrevious 顺序

Filter Generator — 过滤器智能生成

用自然语言描述过滤条件,AI 自动生成对应的 Filter Rule 链。支持 JavaScript Rule、Rule Builder 和 External Script 三种输出模式。

// 用户输入: "只处理门诊患者(PV1-2=O)的检验申请,排除取消的订单(ORC-1=CA)" // AI 生成 → JavaScript Filter Rule: var patientClass = msg['PV1']['PV1.2']['PV1.2.1'].toString(); var orderControl = msg['ORC']['ORC.1']['ORC.1.1'].toString(); if (patientClass === 'O' && orderControl !== 'CA') { return true; // 接受消息 } else { return false; // 过滤掉 }

Transformer Generator — 转换器自动编码

核心模块。支持四种转换器步骤的自动生成:JavaScript Step、Mapper Step、Message Builder Step、XSLT Step。 用户描述数据映射关系,AI 生成完整的 Transformer 步骤链。

场景: HL7v2 → FHIR Bundle
// AI 生成的 Transformer Step (JavaScript) // Step 1: 构建 FHIR Patient Resource var patient = {}; patient.resourceType = "Patient"; patient.identifier = [{ system: "urn:oid:1.2.156.xxxxx", value: msg['PID']['PID.3']['PID.3.1'] .toString() }]; patient.name = [{ family: msg['PID']['PID.5']['PID.5.1'] .toString(), given: [msg['PID']['PID.5']['PID.5.2'] .toString()] }]; // Step 2: 映射到 channelMap channelMap.put('fhirPatient', JSON.stringify(patient));
场景: Mapper 步骤批量生成
// AI 分析源消息结构后 // 自动生成 Mapper Step 定义: [ { "variable": "patientId", "mapping": "msg['PID']['PID.3']['PID.3.1']", "defaultValue": "" }, { "variable": "patientName", "mapping": "msg['PID']['PID.5']['PID.5.1']", "defaultValue": "UNKNOWN" }, { "variable": "orderDateTime", "mapping": "msg['OBR']['OBR.7']['OBR.7.1']", "defaultValue": "" } ]

Response Transformer — 响应转换器自动生成

根据 Source 端期望的响应格式和 Destination 的实际返回,自动生成 Response Transformer。 支持 ACK 消息构建、HTTP 响应解析、错误码映射等常见场景。

HL7 ACK 生成
根据原始 MSH 段自动构建 ACK^A01 应答消息,映射 MSA 段错误码
HTTP→HL7 响应转换
将 FHIR REST API 的 HTTP 201/4xx 响应映射为 HL7 AA/AE/AR 应答
错误处理策略
AI 根据业务场景推荐重试策略、错误队列路由和告警触发逻辑

Template Upgrader — 模板智能升级

将从社区下载的通道模板(Channel Template XML)导入后,AI 自动分析并执行: 版本适配(旧版API迁移)、安全加固(TLS配置、凭证外置)、性能优化(批处理、线程调优)、 本地化适配(中文医疗标准字段映射)。

版本迁移 安全加固 性能调优 国标适配 代码质量 文档生成

端到端智能工作流

用户从"一句话描述"开始,EasyAI 按流水线依次调用各模块,最终输出完整的可部署通道配置。 每一步都支持人工审批与修改,保证 Human-in-the-Loop 控制。

需求输入 — Natural Language Intent

用户在 AI Chat 面板中输入自然语言描述。EasyAI 的 IntentParser 解析出结构化的 ChannelIntent 对象。

用户输入:
"我需要一个通道,接收HIS通过MLLP发来的HL7检验申请(ORM^O01),过滤掉取消的订单, 把患者信息和检验项目转换成FHIR格式,POST到LIS的FHIR服务器,同时把原始消息归档到PostgreSQL。"

意图解构 — Intent Decomposition

{ "channelName": "HIS-to-LIS-ORM", "source": { "protocol": "MLLP", "system": "HIS", "dataType": "HL7V2", "messageType": "ORM^O01" }, "filters": [{ "condition": "排除 ORC-1 == CA", "action": "REJECT" }], "transformations": [{ "from": "HL7V2", "to": "FHIR", "resources": ["Patient", "ServiceRequest"] }], "destinations": [ { "name": "LIS-FHIR", "protocol": "HTTP", "method": "POST", "target": "LIS FHIR Server" }, { "name": "DB-Archive", "protocol": "JDBC", "target": "PostgreSQL" } ] }

AI 编排生成 — Orchestrated Generation

服务端 ChannelOrchestrator 按依赖顺序调用各 AI 模块:

DataType
Advisor
Connector
Config
Filter &
Transformer
Response
Transformer
Channel XML
Assembly
Validation
& Review

人工审批 — Human-in-the-Loop Review

AI 生成的完整通道配置以 Diff 视图 展示在 EasyAI Panel 中。 用户可以逐项审批:接受、修改或拒绝每一个配置建议。确认后,EasyAI 通过 OIE Server API 将通道配置写入引擎。支持 "解释为什么" 按钮,AI 阐释每个决策的依据。

部署与学习 — Deploy & Feedback Loop

通道部署后,EasyAI 的 ChannelPlugin 钩子持续监控运行状态。 如果出现消息处理错误,AI 主动分析错误日志并推送优化建议。用户的每次修改都作为反馈数据 存入本地知识库,持续优化后续推荐质量。

API 接口设计

EasyAI 通过标准 JAX-RS Servlet Interface 暴露 REST API,路径前缀为 /api/extensions/easyai/。所有接口遵循 OIE 权限模型。

POST /api/extensions/easyai/chat

自然语言对话接口 — 支持流式响应(SSE),用于交互式通道设计

// Request Body { "sessionId": "uuid", "message": "接收HIS的HL7检验申请...", "channelId": "可选-当前通道ID" } // Response (SSE stream) data: { "type": "thinking", "content": "分析消息类型..." } data: { "type": "suggestion", "payload": { /* AiSuggestion */ } } data: { "type": "done" }
POST /api/extensions/easyai/analyze/datatype

分析样本消息,返回推荐的数据类型与序列化参数

POST /api/extensions/easyai/generate/filter

根据自然语言条件生成 Filter Rule 链(JavaScript / RuleBuilder)

POST /api/extensions/easyai/generate/transformer

生成 Transformer 步骤链 — 支持指定输出步骤类型(JS/Mapper/MessageBuilder/XSLT)

POST /api/extensions/easyai/generate/channel

一键生成完整通道 XML — 从 ChannelIntent 直接编排全部模块输出完整配置

POST /api/extensions/easyai/upgrade/template

上传通道模板 XML,AI 分析后返回优化建议和升级后的通道配置

POST /api/extensions/easyai/explain

解释已有通道的某个组件 — 用于学习和排错("这段 transformer 脚本在做什么?")

GET PUT /api/extensions/easyai/config

获取/更新 EasyAI 配置 — LLM Provider、API Key、模型选择、Prompt 模板路径等

EasyAiServletInterface.java — JAX-RS 契约
@Path("/extensions/easyai") @Api("EasyAI Services") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public interface EasyAiServletInterface extends BaseServletInterface { @POST @Path("/chat") @Produces(MediaType.SERVER_SENT_EVENTS) @MirthOperation(name = "aiChat", display = "AI Chat") EventOutput chat(AiChatRequest request) throws ClientException; @POST @Path("/analyze/datatype") AiSuggestion<DataTypeRecommendation> analyzeDataType(SampleMessage sample); @POST @Path("/generate/filter") AiSuggestion<Filter> generateFilter(AiCodeGenRequest request); @POST @Path("/generate/transformer") AiSuggestion<Transformer> generateTransformer(AiCodeGenRequest request); @POST @Path("/generate/channel") AiSuggestion<Channel> generateChannel(ChannelIntent intent); @POST @Path("/upgrade/template") AiSuggestion<ChannelUpgradeReport> upgradeTemplate(ChannelTemplate template); @POST @Path("/explain") AiExplanation explain(ExplainRequest request); @GET @Path("/config") EasyAiConfig getConfig(); @PUT @Path("/config") void updateConfig(EasyAiConfig config); }

技术栈与 Prompt 工程

Server Side

Java 17+ (与 OIE 4.x 保持一致)
JAX-RS 2.1 (Jersey) — REST API 层
OkHttp 4.x — LLM HTTP Client (支持 SSE)
Jackson — JSON 序列化/反序列化
Caffeine Cache — LLM 响应缓存
SPI (ServiceLoader) — LLM Provider 插拔

Client Side (Swing)

Swing + FlatLaf — 现代化暗色主题 UI
RSyntaxTextArea — 代码预览与 Diff 高亮
JEditorPane (HTML) — Markdown 渲染
SwingWorker — 异步 AI 调用不阻塞 UI
DashboardPanelPlugin — 嵌入式面板注入

Prompt 模板体系

EasyAI 的核心竞争力在于领域专精的 Prompt 模板。每个 AI 模块配备专用的 System Prompt, 内嵌 OIE/Mirth Connect 的领域知识(数据类型规范、连接器参数 schema、HL7/FHIR 标准)。

transformer-gen-system-prompt.md — 示例
# System Prompt: Mirth Connect Transformer Generator You are an expert Mirth Connect integration engineer. Your task is to generate Transformer Steps for OIE channels. ## Context - Source data type: {{source_datatype}} (with serializer props: {{source_props}}) - Destination data type: {{dest_datatype}} - Available variables in scope: {{channel_maps}} - Current channel context: {{channel_xml_snippet}} ## Rules 1. Use msg['SEGMENT']['SEGMENT.FIELD']['SEGMENT.FIELD.COMPONENT'] syntax for HL7v2 2. Use msg.xpath() for XML/HL7v3 data types 3. Always null-check with .toString() before string operations 4. Store intermediate results in channelMap.put(key, value) 5. For FHIR output, generate valid FHIR R4 JSON resources 6. Output MUST be a JSON array of TransformerStep objects: {{ transformer_step_schema }} ## Output Format Return ONLY valid JSON. No markdown fences. No explanation outside JSON.
LlmProvider.java — 可插拔模型适配接口
/** * SPI interface for pluggable LLM backends. * Implementations loaded via ServiceLoader. */ public interface LlmProvider { String getName(); // "openai", "claude", "ollama", "azure-openai" /** Synchronous completion */ LlmResponse complete(LlmRequest request) throws LlmException; /** Streaming completion via callback */ void streamComplete(LlmRequest request, StreamCallback callback) throws LlmException; /** Test connectivity and model availability */ boolean healthCheck(); /** Configuration schema for the admin UI */ Map<String, ConfigField> getConfigSchema(); } // Built-in implementations: // - OpenAiProvider (GPT-4o, GPT-4.1) // - ClaudeProvider (Claude 3.5/4) // - OllamaProvider (本地部署, Llama/Qwen/DeepSeek) // - AzureOpenAiProvider(企业级合规部署)

实施路线图

PHASE 1 — 基础框架

插件骨架 & AI Gateway

搭建 Maven 四模块项目骨架
实现 ServicePlugin 生命周期管理
AI Gateway SPI 接口 + OpenAI Provider
Prompt 模板引擎 (Mustache)
Settings 面板(API Key 配置)
基础 REST API 框架
PHASE 2 — 核心能力

六大 AI 模块

DataType Advisor 数据类型智选
Connector Configurator 连接器配置
Filter Generator 过滤器生成
Transformer Generator 转换器生成
Response Transformer 响应转换生成
Channel Orchestrator 端到端编排
PHASE 3 — 高级特性

智能升级 & 持续学习

Template Upgrader 模板升级
ChannelPlugin 运行时监控钩子
本地知识库 (Embedding + SQLite)
Ollama/本地模型 Provider
AI Chat 对话式开发
社区 Prompt 模板市场
Maven 项目结构
oie-plugin-easyai/ ├── pom.xml # Parent POM (multi-module) ├── easyai-shared/ │ └── src/main/java/com/oie/plugins/easyai/shared/ │ ├── EasyAiServletInterface.java # JAX-RS REST contract │ ├── model/ │ │ ├── AiSuggestion.java # Generic AI response wrapper │ │ ├── ChannelIntent.java # Structured user intent │ │ ├── AiChatRequest.java # Chat message model │ │ ├── AiCodeGenRequest.java # Code gen request context │ │ └── EasyAiConfig.java # Plugin configuration model │ └── constants/ │ └── EasyAiConstants.java # Permission names, paths ├── easyai-server/ │ └── src/main/java/com/oie/plugins/easyai/server/ │ ├── EasyAiServicePlugin.java # ServicePlugin — lifecycle, config │ ├── EasyAiChannelPlugin.java # ChannelPlugin — deploy/save hooks │ ├── EasyAiServlet.java # REST endpoint implementation │ ├── ai/ │ │ ├── DataTypeAdvisor.java # Module 1: Data type analysis │ │ ├── ConnectorConfigurator.java# Module 2: Connector config gen │ │ ├── FilterGenerator.java # Module 3: Filter rule generation │ │ ├── TransformerGenerator.java # Module 4: Transformer step gen │ │ ├── ResponseTransformerGen.java# Module 5: Response transformer │ │ ├── TemplateUpgrader.java # Module 6: Template upgrade │ │ └── ChannelOrchestrator.java # End-to-end pipeline orchestrator │ └── gateway/ │ ├── LlmProvider.java # SPI interface │ ├── LlmRequest.java # Unified request model │ ├── LlmResponse.java # Unified response model │ ├── PromptTemplateEngine.java # Mustache-based prompt renderer │ ├── ContextBuilder.java # Channel context extractor │ ├── ResponseParser.java # LLM output → typed objects │ └── providers/ │ ├── OpenAiProvider.java # GPT-4o / GPT-4.1 │ ├── ClaudeProvider.java # Claude 3.5 / 4 │ └── OllamaProvider.java # Local LLM (Qwen/DeepSeek) ├── easyai-client/ │ └── src/main/java/com/oie/plugins/easyai/client/ │ ├── EasyAiClientPlugin.java # ClientPlugin — UI registration │ ├── EasyAiPanel.java # Main sidebar panel │ ├── AiChatWidget.java # Chat input/output component │ ├── AiSuggestionRenderer.java # Diff view & approval cards │ └── EasyAiSettingsPanel.java # Settings tab (API key, model) ├── easyai-distribution/ │ ├── plugin.xml # Extension manifest │ └── pom.xml # Assembly zip packaging └── prompts/ # Prompt template files ├── system-datatype-advisor.md ├── system-connector-config.md ├── system-filter-generator.md ├── system-transformer-generator.md ├── system-response-transformer.md ├── system-template-upgrader.md └── system-channel-orchestrator.md