Skip to content

Commit abbdfa9

Browse files
committed
feat: Add ability to fetch step from data layer
This is useful for pulling message metadata from an on_feedback callback, for instance.
1 parent f4bcb69 commit abbdfa9

File tree

2 files changed

+92
-0
lines changed

2 files changed

+92
-0
lines changed

backend/chainlit/data/chainlit_data_layer.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,21 @@ async def delete_step(self, step_id: str):
408408
'DELETE FROM "Step" WHERE id = $1', {"step_id": step_id}
409409
)
410410

411+
async def get_step(self, step_id: str) -> Optional[StepDict]:
412+
# Get step and related feedback
413+
query = """
414+
SELECT s.*,
415+
f.id feedback_id,
416+
f.value feedback_value,
417+
f."comment" feedback_comment
418+
FROM "Step" s left join "Feedback" f on s.id = f."stepId"
419+
WHERE s.id = $1
420+
"""
421+
result = await self.execute_query(query, {"step_id": step_id})
422+
if not result:
423+
return None
424+
return self._convert_step_row_to_dict(result[0])
425+
411426
async def get_thread_author(self, thread_id: str) -> str:
412427
query = """
413428
SELECT u.identifier

backend/chainlit/data/sql_alchemy.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,83 @@ async def delete_step(self, step_id: str):
415415
await self.execute_sql(query=elements_query, parameters=parameters)
416416
await self.execute_sql(query=steps_query, parameters=parameters)
417417

418+
async def get_step(self, step_id: str) -> Optional["StepDict"]:
419+
if self.show_logger:
420+
logger.info(f"SQLAlchemy: get_step, step_id={step_id}")
421+
steps_feedbacks_query = """
422+
SELECT
423+
s."id" AS step_id,
424+
s."name" AS step_name,
425+
s."type" AS step_type,
426+
s."threadId" AS step_threadid,
427+
s."parentId" AS step_parentid,
428+
s."streaming" AS step_streaming,
429+
s."waitForAnswer" AS step_waitforanswer,
430+
s."isError" AS step_iserror,
431+
s."metadata" AS step_metadata,
432+
s."tags" AS step_tags,
433+
s."input" AS step_input,
434+
s."output" AS step_output,
435+
s."createdAt" AS step_createdat,
436+
s."start" AS step_start,
437+
s."end" AS step_end,
438+
s."generation" AS step_generation,
439+
s."showInput" AS step_showinput,
440+
s."language" AS step_language,
441+
f."value" AS feedback_value,
442+
f."comment" AS feedback_comment,
443+
f."id" AS feedback_id
444+
FROM steps s LEFT JOIN feedbacks f ON s."id" = f."forId"
445+
WHERE s."id" = :step_id
446+
"""
447+
steps_feedbacks = await self.execute_sql(
448+
query=steps_feedbacks_query, parameters={"step_id": step_id}
449+
)
450+
451+
if not isinstance(steps_feedbacks, list) or not steps_feedbacks:
452+
return None
453+
454+
step_feedback = steps_feedbacks[0]
455+
456+
feedback = None
457+
if step_feedback["feedback_value"] is not None:
458+
feedback = FeedbackDict(
459+
forId=step_feedback["step_id"],
460+
id=step_feedback.get("feedback_id"),
461+
value=step_feedback["feedback_value"],
462+
comment=step_feedback.get("feedback_comment"),
463+
)
464+
return StepDict(
465+
id=step_feedback["step_id"],
466+
name=step_feedback["step_name"],
467+
type=step_feedback["step_type"],
468+
threadId=step_feedback.get("step_threadid"),
469+
parentId=step_feedback.get("step_parentid"),
470+
streaming=step_feedback.get("step_streaming", False),
471+
waitForAnswer=step_feedback.get("step_waitforanswer"),
472+
isError=step_feedback.get("step_iserror"),
473+
metadata=(
474+
step_feedback["step_metadata"]
475+
if step_feedback.get("step_metadata") is not None
476+
else {}
477+
),
478+
tags=step_feedback.get("step_tags"),
479+
input=(
480+
step_feedback.get("step_input", "")
481+
if step_feedback.get("step_showinput")
482+
not in [None, "false"]
483+
else ""
484+
),
485+
output=step_feedback.get("step_output", ""),
486+
createdAt=step_feedback.get("step_createdat"),
487+
start=step_feedback.get("step_start"),
488+
end=step_feedback.get("step_end"),
489+
generation=step_feedback.get("step_generation"),
490+
showInput=step_feedback.get("step_showinput"),
491+
language=step_feedback.get("step_language"),
492+
feedback=feedback,
493+
)
494+
418495
###### Feedback ######
419496
async def upsert_feedback(self, feedback: Feedback) -> str:
420497
if self.show_logger:

0 commit comments

Comments
 (0)