mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-25 18:26:35 +00:00
Add support for intent-progress assist events (#24143)
This commit is contained in:
parent
1b3d4b77d3
commit
f3d55447ca
@ -295,10 +295,12 @@ export class HaAssistChat extends LitElement {
|
|||||||
this._addMessage(userMessage);
|
this._addMessage(userMessage);
|
||||||
this.requestUpdate("_audioRecorder");
|
this.requestUpdate("_audioRecorder");
|
||||||
|
|
||||||
const hassMessage: AssistMessage = {
|
let hassMessage = {
|
||||||
who: "hass",
|
who: "hass",
|
||||||
text: "…",
|
text: "…",
|
||||||
|
error: false,
|
||||||
};
|
};
|
||||||
|
let currentDeltaRole = "";
|
||||||
// To make sure the answer is placed at the right user text, we add it before we process it
|
// To make sure the answer is placed at the right user text, we add it before we process it
|
||||||
try {
|
try {
|
||||||
const unsub = await runAssistPipeline(
|
const unsub = await runAssistPipeline(
|
||||||
@ -328,6 +330,43 @@ export class HaAssistChat extends LitElement {
|
|||||||
this._addMessage(hassMessage);
|
this._addMessage(hassMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (event.type === "intent-progress") {
|
||||||
|
const delta = event.data.chat_log_delta;
|
||||||
|
|
||||||
|
// new message
|
||||||
|
if (delta.role) {
|
||||||
|
// If currentDeltaRole exists, it means we're receiving our
|
||||||
|
// second or later message. Let's add it to the chat.
|
||||||
|
if (currentDeltaRole && delta.role && hassMessage.text !== "…") {
|
||||||
|
// Remove progress indicator of previous message
|
||||||
|
hassMessage.text = hassMessage.text.substring(
|
||||||
|
0,
|
||||||
|
hassMessage.text.length - 1
|
||||||
|
);
|
||||||
|
|
||||||
|
hassMessage = {
|
||||||
|
who: "hass",
|
||||||
|
text: "…",
|
||||||
|
error: false,
|
||||||
|
};
|
||||||
|
this._addMessage(hassMessage);
|
||||||
|
}
|
||||||
|
currentDeltaRole = delta.role;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
currentDeltaRole === "assistant" &&
|
||||||
|
"content" in delta &&
|
||||||
|
delta.content
|
||||||
|
) {
|
||||||
|
hassMessage.text =
|
||||||
|
hassMessage.text.substring(0, hassMessage.text.length - 1) +
|
||||||
|
delta.content +
|
||||||
|
"…";
|
||||||
|
this.requestUpdate("_conversation");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (event.type === "intent-end") {
|
if (event.type === "intent-end") {
|
||||||
this._conversationId = event.data.intent_output.conversation_id;
|
this._conversationId = event.data.intent_output.conversation_id;
|
||||||
const plain = event.data.intent_output.response.speech?.plain;
|
const plain = event.data.intent_output.response.speech?.plain;
|
||||||
@ -435,28 +474,71 @@ export class HaAssistChat extends LitElement {
|
|||||||
this._processing = true;
|
this._processing = true;
|
||||||
this._audio?.pause();
|
this._audio?.pause();
|
||||||
this._addMessage({ who: "user", text });
|
this._addMessage({ who: "user", text });
|
||||||
const message: AssistMessage = {
|
let hassMessage = {
|
||||||
who: "hass",
|
who: "hass",
|
||||||
text: "…",
|
text: "…",
|
||||||
|
error: false,
|
||||||
};
|
};
|
||||||
|
let currentDeltaRole = "";
|
||||||
// To make sure the answer is placed at the right user text, we add it before we process it
|
// To make sure the answer is placed at the right user text, we add it before we process it
|
||||||
this._addMessage(message);
|
this._addMessage(hassMessage);
|
||||||
try {
|
try {
|
||||||
const unsub = await runAssistPipeline(
|
const unsub = await runAssistPipeline(
|
||||||
this.hass,
|
this.hass,
|
||||||
(event) => {
|
(event) => {
|
||||||
|
if (event.type === "intent-progress") {
|
||||||
|
const delta = event.data.chat_log_delta;
|
||||||
|
|
||||||
|
// new message and previous message has content
|
||||||
|
if (delta.role) {
|
||||||
|
// If currentDeltaRole exists, it means we're receiving our
|
||||||
|
// second or later message. Let's add it to the chat.
|
||||||
|
if (
|
||||||
|
currentDeltaRole &&
|
||||||
|
delta.role === "assistant" &&
|
||||||
|
hassMessage.text !== "…"
|
||||||
|
) {
|
||||||
|
// Remove progress indicator of previous message
|
||||||
|
hassMessage.text = hassMessage.text.substring(
|
||||||
|
0,
|
||||||
|
hassMessage.text.length - 1
|
||||||
|
);
|
||||||
|
|
||||||
|
hassMessage = {
|
||||||
|
who: "hass",
|
||||||
|
text: "…",
|
||||||
|
error: false,
|
||||||
|
};
|
||||||
|
this._addMessage(hassMessage);
|
||||||
|
}
|
||||||
|
currentDeltaRole = delta.role;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
currentDeltaRole === "assistant" &&
|
||||||
|
"content" in delta &&
|
||||||
|
delta.content
|
||||||
|
) {
|
||||||
|
hassMessage.text =
|
||||||
|
hassMessage.text.substring(0, hassMessage.text.length - 1) +
|
||||||
|
delta.content +
|
||||||
|
"…";
|
||||||
|
this.requestUpdate("_conversation");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (event.type === "intent-end") {
|
if (event.type === "intent-end") {
|
||||||
this._conversationId = event.data.intent_output.conversation_id;
|
this._conversationId = event.data.intent_output.conversation_id;
|
||||||
const plain = event.data.intent_output.response.speech?.plain;
|
const plain = event.data.intent_output.response.speech?.plain;
|
||||||
if (plain) {
|
if (plain) {
|
||||||
message.text = plain.speech;
|
hassMessage.text = plain.speech;
|
||||||
}
|
}
|
||||||
this.requestUpdate("_conversation");
|
this.requestUpdate("_conversation");
|
||||||
unsub();
|
unsub();
|
||||||
}
|
}
|
||||||
if (event.type === "error") {
|
if (event.type === "error") {
|
||||||
message.text = event.data.message;
|
hassMessage.text = event.data.message;
|
||||||
message.error = true;
|
hassMessage.error = true;
|
||||||
this.requestUpdate("_conversation");
|
this.requestUpdate("_conversation");
|
||||||
unsub();
|
unsub();
|
||||||
}
|
}
|
||||||
@ -470,8 +552,8 @@ export class HaAssistChat extends LitElement {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
} catch {
|
} catch {
|
||||||
message.text = this.hass.localize("ui.dialogs.voice_command.error");
|
hassMessage.text = this.hass.localize("ui.dialogs.voice_command.error");
|
||||||
message.error = true;
|
hassMessage.error = true;
|
||||||
this.requestUpdate("_conversation");
|
this.requestUpdate("_conversation");
|
||||||
} finally {
|
} finally {
|
||||||
this._processing = false;
|
this._processing = false;
|
||||||
|
@ -108,6 +108,34 @@ interface PipelineIntentStartEvent extends PipelineEventBase {
|
|||||||
intent_input: string;
|
intent_input: string;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface ConversationChatLogAssistantDelta {
|
||||||
|
role: "assistant";
|
||||||
|
content: string;
|
||||||
|
tool_calls: {
|
||||||
|
id: string;
|
||||||
|
tool_name: string;
|
||||||
|
tool_args: Record<string, unknown>;
|
||||||
|
}[];
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ConversationChatLogToolResultDelta {
|
||||||
|
role: "tool_result";
|
||||||
|
agent_id: string;
|
||||||
|
tool_call_id: string;
|
||||||
|
tool_name: string;
|
||||||
|
tool_result: unknown;
|
||||||
|
}
|
||||||
|
interface PipelineIntentProgressEvent extends PipelineEventBase {
|
||||||
|
type: "intent-progress";
|
||||||
|
data: {
|
||||||
|
chat_log_delta:
|
||||||
|
| Partial<ConversationChatLogAssistantDelta>
|
||||||
|
// These always come in 1 chunk
|
||||||
|
| ConversationChatLogToolResultDelta;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
interface PipelineIntentEndEvent extends PipelineEventBase {
|
interface PipelineIntentEndEvent extends PipelineEventBase {
|
||||||
type: "intent-end";
|
type: "intent-end";
|
||||||
data: {
|
data: {
|
||||||
@ -141,6 +169,7 @@ export type PipelineRunEvent =
|
|||||||
| PipelineSTTStartEvent
|
| PipelineSTTStartEvent
|
||||||
| PipelineSTTEndEvent
|
| PipelineSTTEndEvent
|
||||||
| PipelineIntentStartEvent
|
| PipelineIntentStartEvent
|
||||||
|
| PipelineIntentProgressEvent
|
||||||
| PipelineIntentEndEvent
|
| PipelineIntentEndEvent
|
||||||
| PipelineTTSStartEvent
|
| PipelineTTSStartEvent
|
||||||
| PipelineTTSEndEvent;
|
| PipelineTTSEndEvent;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user