From daa3c63cfd35cbd7372011295d3c978d6ef8164f Mon Sep 17 00:00:00 2001 From: Hugues Chocart Date: Wed, 12 Feb 2025 12:45:55 +0000 Subject: [PATCH] fix: feedback in conversations (#761) --- packages/backend/src/api/v1/runs/index.ts | 13 ++++- packages/backend/src/utils/errors.ts | 1 + packages/e2e/logs.spec.ts | 1 + packages/frontend/pages/logs/index.tsx | 6 +-- packages/frontend/utils/datatable.tsx | 62 +++++++++++++++-------- 5 files changed, 56 insertions(+), 27 deletions(-) diff --git a/packages/backend/src/api/v1/runs/index.ts b/packages/backend/src/api/v1/runs/index.ts index 8cb75600..8b2231e2 100644 --- a/packages/backend/src/api/v1/runs/index.ts +++ b/packages/backend/src/api/v1/runs/index.ts @@ -177,6 +177,7 @@ export function formatRun(run: any) { isPublic: run.isPublic, feedback: run.feedback, parentFeedback: run.parentFeedback, + feedbacks: run.feedbacks, type: run.type, name: run.name, @@ -355,8 +356,16 @@ function getRunQuery(ctx: Context, isExport = false) { eu.last_seen as user_last_seen, eu.props as user_props, t.slug as template_slug, - rpfc.feedback as parent_feedback - from + rpfc.feedback as parent_feedback, + coalesce( + ( + select jsonb_agg(feedback) + from run + where parent_run_id = r.id + and type = 'chat' + ), '[]'::jsonb + ) as feedbacks + from public.run r left join external_user eu on r.external_user_id = eu.id left join run_parent_feedback_cache rpfc on r.id = rpfc.id diff --git a/packages/backend/src/utils/errors.ts b/packages/backend/src/utils/errors.ts index 5147b571..fc02b20e 100644 --- a/packages/backend/src/utils/errors.ts +++ b/packages/backend/src/utils/errors.ts @@ -13,6 +13,7 @@ export async function errorMiddleware(ctx: Context, next: Next) { ctx.status = 422; ctx.body = { error: "Error", message: error.errors[0].message }; console.error("ZOD ERROR", JSON.stringify(error.errors[0])); + console.error(error); return; } diff --git a/packages/e2e/logs.spec.ts b/packages/e2e/logs.spec.ts index d4be1c05..1f8292b5 100644 --- a/packages/e2e/logs.spec.ts +++ b/packages/e2e/logs.spec.ts @@ -106,6 +106,7 @@ test("test export csv", async ({ page }) => { "isPublic", "feedback", "parentFeedback", + "feedbacks", "type", "name", "createdAt", diff --git a/packages/frontend/pages/logs/index.tsx b/packages/frontend/pages/logs/index.tsx index a67279bf..e7843eb4 100644 --- a/packages/frontend/pages/logs/index.tsx +++ b/packages/frontend/pages/logs/index.tsx @@ -99,7 +99,7 @@ export const defaultColumns = { inputColumn("Prompt"), outputColumn("Result"), tagsColumn(), - feedbackColumn(), + feedbackColumn("llm"), templateColumn(), ], trace: [ @@ -107,7 +107,7 @@ export const defaultColumns = { nameColumn("Agent"), durationColumn(), userColumn(), - feedbackColumn(false), + feedbackColumn("traces"), tagsColumn(), inputColumn("Input"), outputColumn(), @@ -118,7 +118,7 @@ export const defaultColumns = { userColumn(), inputColumn("Last Message"), tagsColumn(), - feedbackColumn(false), + feedbackColumn("threads"), ], }; diff --git a/packages/frontend/utils/datatable.tsx b/packages/frontend/utils/datatable.tsx index f6a302c8..795f5d5e 100644 --- a/packages/frontend/utils/datatable.tsx +++ b/packages/frontend/utils/datatable.tsx @@ -210,33 +210,51 @@ export function costColumn() { }); } -export function feedbackColumn(withRelatedRuns = false) { - const cell = withRelatedRuns - ? (props) => { - const run = props.row.original; +export function feedbackColumn(type: "llm" | "traces" | "threads") { + let cell; + if (type === "traces") { + cell = (props) => { + const run = props.row.original; - const { data: relatedRuns } = useProjectSWR(`/runs/${run.id}/related`); + const { data: relatedRuns } = useProjectSWR(`/runs/${run.id}/related`); - const allFeedbacks = [run, ...(relatedRuns || [])] - .filter((run) => run.feedback) - .map((run) => run.feedback); + const allFeedbacks = [run, ...(relatedRuns || [])] + .filter((run) => run.feedback) + .map((run) => run.feedback) + .filter((feedback) => { + return feedback.thumb || feedback.comment; + }); - return ( - - {allFeedbacks?.map((feedback, i) => ( - - ))} - - ); - } - : (props) => { - const run = props.row.original; + return ( + + {allFeedbacks + ?.filter((feedback) => feedback) + .map((feedback, i) => )} + + ); + }; + } else if (type === "threads") { + cell = (props) => { + const run = props.row.original; + + return ( + + {run.feedbacks?.map((feedback, i) => ( + + ))} + + ); + }; + } else if (type === "llm") { + cell = (props) => { + const run = props.row.original; - const feedback = run.feedback || run.parentFeedback; - const isParentFeedback = !run.feedback && run.parentFeedback; + const feedback = run.feedback || run.parentFeedback; + const isParentFeedback = !run.feedback && run.parentFeedback; - return ; - }; + return ; + }; + } return columnHelper.accessor("feedback", { header: "Feedback",