Skip to content

Commit 58f28a2

Browse files
committed
WIP show reasoning in AI Assistant UI
1 parent 20ff622 commit 58f28a2

File tree

5 files changed

+27
-0
lines changed

5 files changed

+27
-0
lines changed

packages/ai-bot/lib/responder.ts

+3
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,9 @@ export class Responder {
131131
if (contentSnapshot?.length) {
132132
contentSnapshot = cleanContent(contentSnapshot);
133133
if (this.latestContent !== contentSnapshot) {
134+
if (this.latestReasoning === thinkingMessage) {
135+
this.latestReasoning = '';
136+
}
134137
this.latestContent = contentSnapshot;
135138
await this.sendMessageEventWithThrottling();
136139
}

packages/host/app/components/ai-assistant/message/index.gts

+13
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ interface Signature {
6060
Element: HTMLDivElement;
6161
Args: {
6262
formattedMessage: SafeString;
63+
formattedReasoningContent?: SafeString | null;
6364
datetime: Date;
6465
isFromAssistant: boolean;
6566
isStreaming: boolean;
@@ -229,6 +230,12 @@ export default class AiAssistantMessage extends Component<Signature> {
229230
</div>
230231
{{/if}}
231232

233+
{{#if @formattedReasoningContent}}
234+
<div class='reasoning-content'>
235+
{{@formattedReasoningContent}}
236+
</div>
237+
{{/if}}
238+
232239
<div class='content' data-test-ai-message-content>
233240
{{#if (and @isFromAssistant @isStreaming)}}
234241
<FormattedMessage
@@ -407,6 +414,12 @@ export default class AiAssistantMessage extends Component<Signature> {
407414
margin-top: var(--boxel-sp);
408415
}
409416
417+
.reasoning-content {
418+
font-size: var(--boxel-font-xs);
419+
letter-spacing: var(--boxel-lsp-xs);
420+
color: var(--boxel-450);
421+
}
422+
410423
.error-container {
411424
display: grid;
412425
grid-template-columns: auto 1fr auto;

packages/host/app/components/matrix/room-message.gts

+3
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ export default class RoomMessage extends Component<Signature> {
105105
@formattedMessage={{htmlSafe
106106
(markdownToHtml this.message.formattedMessage)
107107
}}
108+
@formattedReasoningContent={{htmlSafe
109+
(markdownToHtml this.message.reasoningContent)
110+
}}
108111
@monacoSDK={{@monacoSDK}}
109112
@datetime={{this.message.created}}
110113
@index={{@index}}

packages/host/app/lib/matrix-classes/message-builder.ts

+5
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ export default class MessageBuilder {
7979
eventId: this.builderContext.effectiveEventId,
8080
index: this.builderContext.index,
8181
attachedFiles: this.attachedFiles,
82+
reasoningContent:
83+
(this.event.content as CardMessageContent)['app.boxel.reasoning'] ||
84+
null,
8285
});
8386
}
8487

@@ -156,6 +159,8 @@ export default class MessageBuilder {
156159

157160
message.message = this.event.content.body;
158161
message.formattedMessage = this.event.content.formatted_body;
162+
message.reasoningContent =
163+
(this.event.content as CardMessageContent)['app.boxel.reasoning'] || null;
159164
message.isStreamingFinished =
160165
'isStreamingFinished' in this.event.content
161166
? this.event.content.isStreamingFinished

packages/host/app/lib/matrix-classes/message.ts

+3
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,15 @@ interface RoomMessageOptional {
4646
index?: number;
4747
errorMessage?: string;
4848
clientGeneratedId?: string | null;
49+
reasoningContent?: string | null;
4950
}
5051

5152
export class Message implements RoomMessageInterface {
5253
@tracked formattedMessage: string;
5354
@tracked message: string;
5455
@tracked commands: TrackedArray<MessageCommand>;
5556
@tracked isStreamingFinished?: boolean;
57+
@tracked reasoningContent?: string | null;
5658

5759
attachedCardIds?: string[] | null;
5860
attachedFiles?: FileDef[];
@@ -83,6 +85,7 @@ export class Message implements RoomMessageInterface {
8385
this.status = init.status;
8486
this.roomId = init.roomId;
8587
this.attachedFiles = init.attachedFiles;
88+
this.reasoningContent = init.reasoningContent;
8689
this.commands = new TrackedArray<MessageCommand>();
8790
this.instanceId = guidFor(this);
8891
}

0 commit comments

Comments
 (0)