news 2026/9/10 7:35:06

DBeaver 如何通过扩展点注册新的 AI 引擎与助手

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DBeaver 如何通过扩展点注册新的 AI 引擎与助手

DBeaver 如何通过扩展点注册新的 AI 引擎与助手

【免费下载链接】dbeaverFree universal database tool and SQL client项目地址: https://gitcode.com/GitHub_Trending/db/dbeaver

DBeaver 的 AI 能力(补全、SQL 生成、助手问答)并不写死在核心代码里,而是通过 OSGi 扩展点对外暴露。插件org.jkiss.dbeaver.model.ai在自己的 plugin.xml 中声明了 5 个扩展点,其中两个正是本文的目标:

  • com.dbeaver.ai.engine(AI integrations):注册 AI 引擎,对应模式文件 com.dbeaver.ai.engine.exsd;
  • com.dbeaver.ai.assistant(AI assistants):注册 AI 助手,对应模式文件 com.dbeaver.ai.assistant.exsd。

同一 plugin.xml 中还声明了com.dbeaver.ai.prompt(提示词生成器)、com.dbeaver.ai.function(AI 函数)和com.dbeaver.ai.credentialsProvider(授权)三个扩展点,本文只覆盖引擎与助手两条注册路径。

前提条件

  • 你能访问 DBeaver 源码,并准备一个可以贡献扩展的插件(自己的产品插件或 fork)。
  • 新插件必须依赖org.jkiss.dbeaver.model.ai,因为AIEngineAIEnginePropertiesAIAssistant等契约类都在这个插件的包org.jkiss.dbeaver.model.ai.engine/org.jkiss.dbeaver.model.ai中。
  • 注意 AI 功能的开关策略:plugin.xml 中org.jkiss.dbeaver.sqlCommand的 AI 命令由org.jkiss.dbeaver.core.ai.completion.enabled.by.policy控制,当工作区偏好设置了ai.disabled、环境变量设置了DBEAVER_AI_DISABLED,或org.jkiss.dbeaver.app.configid="ai"的功能特性未启用时,AI 命令不生效。你的引擎注册本身不受此影响,但验证功能时要先确认这些开关。

注册 AI 引擎:声明 completionEngine 扩展

参照org.jkiss.dbeaver.model.ai自身声明的两个引擎,plugin.xml中的写法是:

<extension point="com.dbeaver.ai.engine"> <completionEngine id="openai" label="OpenAI" icon="icons/engine_openai.svg" class="org.jkiss.dbeaver.model.ai.engine.openai.OpenAIEngine" properties="org.jkiss.dbeaver.model.ai.engine.openai.OpenAIProperties" promoted="true" default="true" supportsFunctions="true" fallbacks="openai-pro"/> <completionEngine id="copilot" label="Github Copilot" icon="icons/engine_copilot.svg" class="org.jkiss.dbeaver.model.ai.engine.copilot.CopilotCompletionEngine" properties="org.jkiss.dbeaver.model.ai.engine.copilot.CopilotProperties" promoted="true" supportsFunctions="false" fallbacks="copilot-pro"/> </extension>

各属性在现有声明中的用途:

属性用途
id引擎唯一标识,defaultfallbacks都引用它
label在引擎选择控件中显示的名称
icon图标资源,相对插件目录的路径
class引擎实现类,必须实现AIEngine接口
properties引擎属性类,必须实现AIEngineProperties接口
promotedtrue时引擎在引擎选择控件中排到普通引擎前面(见 com.dbeaver.ai.engine.exsd 中对promoted的文档说明)
default标记为默认引擎
supportsFunctions引擎是否支持函数调用
fallbacks降级到其他引擎的id列表

注册你的引擎时,把idlabelclassproperties换成自己的值;promoteddefaultsupportsFunctionsfallbacks按实际能力取舍,不需要照抄示例。

实现引擎类与属性类

引擎实现类需要满足 AIEngine.java 定义的接口:

public interface AIEngine<PROPS extends AIEngineProperties> extends AutoCloseable { @NotNull List<AIModel> getModels(@NotNull DBRProgressMonitor monitor) throws DBException; @NotNull AIEngineResponse requestCompletion( @NotNull DBRProgressMonitor monitor, @NotNull AIEngineRequest request ) throws DBException; void requestCompletionStream( @NotNull DBRProgressMonitor monitor, @NotNull AIEngineRequest request, @NotNull AIEngineResponseConsumer listener ) throws DBException; @NotNull PROPS getProperties(); int getContextWindowSize(@NotNull DBRProgressMonitor monitor) throws DBException; @Override void close() throws DBException; }

要点:

  • requestCompletionrequestCompletionStream(流式)都要实现;请求限流时按接口约定抛出TooManyRequestsException,表示请求可重试。
  • 包内提供了可继承的抽象基类 BaseCompletionEngine.java,以及 HTTP 客户端基类 AbstractHttpAIClient.java(OpenAI 引擎OpenAIEngine就是在这套基类上实现的),可以复用其骨架。

属性类需要实现 AIEngineProperties.java:

public interface AIEngineProperties { int DEFAULT_TIMEOUT = 30; String getModel(); Integer getContextWindowSize(); double getTemperature(); boolean isValidConfiguration(); boolean isLoggingEnabled(); void setLoggingEnabled(boolean loggingEnabled); int getTimeout(); void setTimeout(int timeout); void resolveSecrets(@NotNull AIConfigurationProfile profile) throws DBException; void saveSecrets(@NotNull AIConfigurationProfile profile) throws DBException; void deleteSecrets(@NotNull AIConfigurationProfile profile) throws DBException; }

isValidConfiguration()用于校验必填项是否齐全;resolveSecrets/saveSecrets/deleteSecrets负责把密钥在配置配置档(AIConfigurationProfile)中解析、保存与删除。已有属性类 BaseAIEngineProperties.java 可作为参考实现,例如 OpenAI 的属性类 OpenAIProperties.java。

注册 AI 助手:声明 assistant 扩展

助手扩展的声明见 plugin.xml:

<extension point="com.dbeaver.ai.assistant"> <assistant id="ce-assistant" priority="1" class="org.jkiss.dbeaver.model.ai.impl.AIAssistantImpl" sqlFormatter="org.jkiss.dbeaver.model.ai.impl.SimpleSqlFormatterImpl"/> </extension>
  • class:助手实现类,必须实现AIAssistant接口(AIAssistant.java),且提供以DBPWorkspace为参数的构造器——实例化时由描述符按此签名创建。
  • sqlFormatter:助手配套的 SQL 格式化类,实现AISqlFormatter接口。
  • priority:多个助手扩展共存时,AIAssistantRegistry 只保留priority最大的那一个作为全局助手;不写priority时按CommonUtils.toInt解析为 0。

助手的解析逻辑在 AIAssistantDescriptor.java:它读取class(创建助手)、sqlFormatter(创建格式化器)、priority三个属性。

验证注册结果

注册是否生效,按代码中的解析路径核对:

  1. 扩展被扫描到AIAssistantRegistry构造时遍历Platform.getExtensionRegistry()com.dbeaver.ai.assistant下所有assistant元素;如果启动后getDescriptor()返回null,说明扩展没被解析(检查pointid 拼写和元素名是否为assistant)。
  2. 助手可创建createAssistant通过描述符按AIAssistant.class+DBPWorkspace参数实例化。若创建抛DBException,会记录Error creating AI assistant错误日志并回退到内置的AIAssistantImpl——看到这条日志就说明你的class没写对或实现不满足接口。
  3. 引擎出现在选择控件中:引擎描述器同样由扩展注册表实例化class指向的AIEngine实现;promoted="true"的引擎会排在选择控件前列。如果你的引擎没有出现在 AI 引擎列表中,先确认class实现类可被平台加载,再确认 AI 功能开关(ai.disabled偏好、DBEAVER_AI_DISABLED环境变量、id="ai"功能特性)没有把 AI 命令禁用。

限制

  • 助手扩展只有一份全局生效(priority最高者胜出),同一工作区不会并行加载多个助手。
  • 引擎与助手的契约类(AIEngineAIEnginePropertiesAIAssistantAISqlFormatter)位于org.jkiss.dbeaver.model.ai插件,升级 DBeaver 时接口可能变化,TooManyRequestsExceptionAIEngineRequest/Response等类型都在同一包内,应随源码一起核对。
  • exsd模式文件中目前只文档化了classpromoted两个属性(引擎)和class(助手),其余属性(labeliconpropertiesdefaultsupportsFunctionsfallbacksprioritysqlFormatter)以现有声明为参考;PDE 提示校验以模式为准,属性值按描述符代码的实际读取逻辑解析。

【免费下载链接】dbeaverFree universal database tool and SQL client项目地址: https://gitcode.com/GitHub_Trending/db/dbeaver

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 7:34:12

基于类Sagnac干涉仪的矢量光束生成与VirtualLab Fusion仿真

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/10 7:33:12

PHP内存溢出排查与优化:从报错定位到分批处理实战

平时在群里看PHP开发者问得最多的问题&#xff0c;除了"这个报错啥意思"&#xff0c;大概就是内存溢出了。尤其像批量Excel处理、远程接口拉取大数据、图片压缩、视频处理这类脚本&#xff0c;跑着跑着突然弹出一句&#xff1a;PHP Fatal error: Allowed memory size…

作者头像 李华
网站建设 2026/9/10 7:32:52

2020电赛E题资料.zip深度解析:嵌入式实时信号处理实战指南

简介&#xff1a;本资源为2020年全国大学生电子设计竞赛E题&#xff08;无线充电器设计&#xff09;的完整实战资料包&#xff0c;面向电子类、自动化、通信等专业本科生及电赛备赛团队&#xff0c;聚焦高频功率变换、磁耦合谐振建模与闭环控制实现等核心难点。压缩包共200.77M…

作者头像 李华
网站建设 2026/9/10 7:32:31

Buzz 上手指南:本地离线转录,免费把录音转成文字和字幕

Buzz 上手指南&#xff1a;本地离线转录&#xff0c;免费把录音转成文字和字幕 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/buz/buzz …

作者头像 李华
网站建设 2026/9/10 7:32:01

2026大模型工程师实战路线:从本地部署到微调落地的技能地图

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/10 7:31:32

Flipper Zero 音乐播放器完整指南:从 RTTTL 到 FMF 的旋律改造

Flipper Zero 音乐播放器完整指南&#xff1a;从 RTTTL 到 FMF 的旋律改造 【免费下载链接】Flipper Playground (and dump) of stuff I make or modify for the Flipper Zero 项目地址: https://gitcode.com/GitHub_Trending/fl/Flipper 这个来自 fl/Flipper 仓库的 Mu…

作者头像 李华