feat: store submittedFeedback on assistant messages (#2622)

* feat: persist submittedFeedback on assistant messages

* style: fix prettier issues

---------

Co-authored-by: GitHub Action <action@github.com>
This commit is contained in:
Simon Farshid
2025-10-17 17:57:50 -04:00
committed by GitHub
parent 26c15c1590
commit 381e7f0fbb
13 changed files with 45 additions and 20 deletions
+4 -4
View File
@@ -55,16 +55,16 @@ const GlowingEffect = memo(
? "clientX" in e && typeof (e as any).clientX === "number"
? (e as any).clientX
: "x" in e && typeof (e as any).x === "number"
? (e as any).x
: lastPosition.current.x
? (e as any).x
: lastPosition.current.x
: lastPosition.current.x;
const mouseY =
e && typeof e === "object"
? "clientY" in e && typeof (e as any).clientY === "number"
? (e as any).clientY
: "y" in e && typeof (e as any).y === "number"
? (e as any).y
: lastPosition.current.y
? (e as any).y
: lastPosition.current.y
: lastPosition.current.y;
if (e) {
+1 -1
View File
@@ -33,7 +33,7 @@
"zustand": "^5.0.8"
},
"peerDependencies": {
"@assistant-ui/react": "^0.11.29",
"@assistant-ui/react": "^0.11.30",
"@types/react": "*",
"assistant-cloud": "*",
"react": "^18 || ^19 || ^19.0.0-rc"
+1 -1
View File
@@ -29,7 +29,7 @@
"zod": "^4.1.11"
},
"peerDependencies": {
"@assistant-ui/react": "^0.11.29",
"@assistant-ui/react": "^0.11.30",
"@types/react": "*",
"react": "^18 || ^19 || ^19.0.0-rc"
},
+1 -1
View File
@@ -25,7 +25,7 @@
"zod": "^4.1.11"
},
"peerDependencies": {
"@assistant-ui/react": "^0.11.29",
"@assistant-ui/react": "^0.11.30",
"@types/react": "*",
"react": "^18 || ^19 || ^19.0.0-rc",
"react-hook-form": "^7"
+1 -1
View File
@@ -29,7 +29,7 @@
"zod": "^4.1.11"
},
"peerDependencies": {
"@assistant-ui/react": "^0.11.29",
"@assistant-ui/react": "^0.11.30",
"@types/react": "*",
"react": "^18 || ^19 || ^19.0.0-rc"
},
+1 -1
View File
@@ -36,7 +36,7 @@
"react-markdown": "^10.1.0"
},
"peerDependencies": {
"@assistant-ui/react": "^0.11.29",
"@assistant-ui/react": "^0.11.30",
"@types/react": "*",
"react": "^18 || ^19 || ^19.0.0-rc"
},
@@ -26,7 +26,7 @@
"lint": "eslint ."
},
"peerDependencies": {
"@assistant-ui/react": "^0.11.29",
"@assistant-ui/react": "^0.11.30",
"@assistant-ui/react-markdown": "^0.11.1",
"@types/react": "*",
"@types/react-syntax-highlighter": "*",
+6
View File
@@ -1,5 +1,11 @@
# @assistant-ui/react
## 0.11.30
### Patch Changes
- feat: add submittedFeedback ThreadAssistantMessage
## 0.11.29
### Patch Changes
+1 -1
View File
@@ -28,7 +28,7 @@
"conversational-ui",
"conversational-ai"
],
"version": "0.11.29",
"version": "0.11.30",
"license": "MIT",
"type": "module",
"exports": {
@@ -106,7 +106,10 @@ export const ThreadMessageClient = resource(
branchNumber,
branchCount,
speech: undefined,
submittedFeedback: undefined,
submittedFeedback:
message.role === "assistant"
? message.metadata.submittedFeedback
: undefined,
isCopied: isCopiedState,
isHovering: isHoveringState,
};
@@ -1,4 +1,4 @@
import type { AppendMessage, Unsubscribe } from "../../../types";
import type { AppendMessage, ThreadMessage, Unsubscribe } from "../../../types";
import {
ExportedMessageRepository,
MessageRepository,
@@ -12,7 +12,6 @@ import {
ThreadRuntimeCore,
SpeechState,
RuntimeCapabilities,
SubmittedFeedback,
ThreadRuntimeEventType,
StartRunConfig,
ResumeRunConfig,
@@ -127,20 +126,33 @@ export abstract class BaseThreadRuntimeCore implements ThreadRuntimeCore {
return () => this._subscriptions.delete(callback);
}
private _submittedFeedback: Record<string, SubmittedFeedback> = {};
public getSubmittedFeedback(messageId: string) {
return this._submittedFeedback[messageId];
const messageData = this.repository.getMessage(messageId);
if (messageData.message.role === "assistant") {
return messageData.message.metadata.submittedFeedback;
}
return undefined;
}
public submitFeedback({ messageId, type }: SubmitFeedbackOptions) {
const adapter = this.adapters?.feedback;
if (!adapter) throw new Error("Feedback adapter not configured");
const { message } = this.repository.getMessage(messageId);
const { message, parentId } = this.repository.getMessage(messageId);
adapter.submit({ message, type });
this._submittedFeedback[messageId] = { type };
// Update the message metadata with the feedback
if (message.role === "assistant") {
const updatedMessage: ThreadMessage = {
...message,
metadata: {
...message.metadata,
submittedFeedback: { type },
},
};
this.repository.addOrUpdateMessage(parentId, updatedMessage);
}
this._notifySubscribers();
}
@@ -485,7 +485,10 @@ export class ThreadRuntimeImpl implements ThreadRuntime {
const thread = this._threadBinding.getState();
const branches = thread.getBranches(message.id);
const submittedFeedback = thread.getSubmittedFeedback(message.id);
const submittedFeedback =
message.role === "assistant"
? message.metadata.submittedFeedback
: undefined;
return {
...message,
@@ -118,6 +118,7 @@ export type ThreadAssistantMessage = MessageCommonProps & {
readonly unstable_annotations: readonly ReadonlyJSONValue[];
readonly unstable_data: readonly ReadonlyJSONValue[];
readonly steps: readonly ThreadStep[];
readonly submittedFeedback?: { readonly type: "positive" | "negative" };
readonly custom: Record<string, unknown>;
};
};