Dev Assistant
总体概述
Quarkus Dev Assistant 是直接内置于 Quarkus Dev Mode 的 AI 驱动助手。它的目标是通过帮助您解决问题和协助开发任务来提高您的工作效率。
该助手仅在开发模式下运行,且绝不会影响您的生产应用程序。
它能做什么?
Dev Assistant 可以帮助您
-
排查异常和堆栈跟踪
-
生成示例客户端代码(例如,REST 端点的
javascript
客户端) -
为您的代码生成 javadoc
-
为您的应用程序生成测试代码
-
为您的应用程序生成测试数据
-
解释您应用程序中的现有代码
-
完成代码中的
//TODO
部分 -
… 还有更多功能即将推出!
如何添加 Dev Assistant
要在您的 Quarkus 项目中启用 Dev Assistant,请添加 quarkus-chappie
扩展。
<dependency>
<groupId>io.quarkiverse.chappie</groupId>
<artifactId>quarkus-chappie</artifactId>
<version>${chappie-extension-version}</version> (1)
</dependency>
1 | 将 ${chappie-extension-version} 替换为最新可用版本。您可以在 search.maven.org 上找到最新版本。 |
添加后,打开 Dev UI 即可开始使用该助手。
助手接口定义在 Quarkus "core" 中,但其实现在 Quarkiverse (Chappie) 中。如果需要,您可以提供助手的替代实现。 |
配置和提供程序
默认情况下,助手在配置之前是禁用的。您可以从支持的 AI 提供程序中进行选择
-
OpenAI(例如,ChatGPT、Openshift AI、Podman AI Lab 等)
-
Ollama(本地模型,如
llama3
)
可以通过助手设置窗格直接在 Dev UI 中进行配置。您将需要
-
API 密钥(适用于 OpenAI)
-
本地运行的模型(适用于 Ollama 或 Podman AI)
设置将按浏览器存储在本地存储中。

扩展开发人员指南
Quarkus 扩展可以通过为 Dev Assistant 做出贡献来增强开发人员体验。本节将介绍如何将您的扩展与 Dev Assistant 集成,包括
-
基于工作区的助手操作
-
助手专用页面
-
通过 JSON-RPC 进行后端集成
-
助手感知组件的 UI 功能
扩展可以定义助手功能,而无需直接依赖 Chappie。接口和相关结构位于 assistant
扩展中。
工作区参与
您可以使用与常规 工作区操作相同的方法将助手函数添加到工作区项,但有一个关键区别:您使用 .assistantFunction(…)
而不是 .function(…)
。
Action.actionBuilder()
.label("Joke AI")
.assistantFunction((a, p) -> { (1)
Assistant assistant = (Assistant) a;
Map params = (Map) p;
return assistant.assistBuilder()
.systemMessage(JOKE_SYSTEM_MESSAGE) (2)
.userMessage(JOKE_USER_MESSAGE) (3)
.variables(params)
.assist();
})
.display(Display.split)
.displayType(DisplayType.markdown)
.filter(Patterns.JAVA_SRC));
1 | 使用 assistantFunction 来接收 Assistant 实例和 输入 参数。 |
2 | 提供可选的系统消息来指导助手的行为。 |
3 | 提供用户消息作为主要提示。 |
助手页面
要将独立的助手驱动页面添加到 Dev UI,请使用 CardPageBuildItem
和 Page.assistantPageBuilder()
。
cardPageBuildItem.addPage(Page.assistantPageBuilder() (1)
.title("AI Joke")
.componentLink("qwc-jokes-ai.js"));
1 | 使用助手页面构建器。 |
与后端通信
您可以使用标准的 Dev UI JSON-RPC 模式从后端代码调用助手,既可以针对运行时类路径,也可以针对部署类路径。
针对运行时类路径的 JsonRPC
要在运行时类路径上的 JsonRpcService
中使用助手,请像这样注入 Assistant
:
public class JokesJsonRPCService {
@Inject
Optional<Assistant> assistant; (1)
1 | 将助手注入为可选的,只有当提供了提供程序并进行了配置时,它才会存在。 |
现在您可以在任何 JsonRPC 方法中使用此助手,例如:
public CompletionStage<Map<String, String>> getAiJoke() {
if (assistant.isPresent()) {
return assistant.get().assistBuilder()
.userMessage("Tell me a funny joke")
.assist();
}
return CompletableFuture.failedStage(new RuntimeException("Assistant is not available"));
}
针对部署类路径的 JsonRPC
在部署时代码中,使用 BuildTimeActionBuildItem
并通过 .addAssistantAction(…)
注册助手操作。
BuildTimeActionBuildItem bta = new BuildTimeActionBuildItem();
bta.addAssistantAction("getAIJokeInDeployment", (a, p) -> { (1)
Assistant assistant = (Assistant) a;
return assistant.assistBuilder()
.userMessage(USER_MESSAGE)
.variables(p)
.assist();
});
buildTimeActionProducer.produce(bta);
1 | 使用 addAssistantAction 而不是 addAction 来访问助手上下文。 |
UI 中的助手状态
要在您的 Web Component 中有条件地渲染助手 UI,您可以使用助手状态来检查助手状态。状态可以是:
-
notAvailable:没有助手实现(如 Chappie)。
-
available:助手可用但尚未配置。
-
ready:助手已配置并准备使用。
要在您的页面中使用此状态:
import { observeState } from 'lit-element-state'; (1)
import { assistantState } from 'assistant-state'; (2)
export class QwcExtentionPage extends observeState(LitElement) { (3)
1 | 从 LitState 库导入 observeState。 |
2 | 导入您感兴趣的状态,这里是助手状态。 |
3 | 将 LitElement 包装在 observerState 中。 |
现在您可以在页面的任何位置访问助手状态,并且当状态更改时,它将与本地状态完全相同 - 重新渲染页面的相关部分。
render() {
if(assistantState.current.isConfigured){
return html`<div class="assistantfeature">
<span> Magic happends here</span>
</div>`;
}
}