Add PromptFeedback API for per-message thumbs ratings (#67) (#70)
Deploy Beta / unit-tests (push) Successful in 10s
Unit Tests / test (push) Successful in 11s
Deploy Beta / docker (push) Successful in 22s
Deploy Beta / deploy-beta (push) Successful in 49s

## Summary
- Closes [#67](#67) — new `PromptFeedback` model (unique on `(prompt, user)`) with `rating` (`up`|`down`), optional `reason` / `comment`, and timestamps via `TimeInfoBase`.
- `POST /api/prompt_feedback` upserts `{ prompt_id, rating, reason?, comment? }`; `DELETE /api/prompt_feedback?prompt_id=` clears the caller's vote.
- `GET conversation_details` now nests the caller's `feedback: { rating, reason, comment }` (or `null`) on each prompt so [chat_web_app#101](ai_ml_operations/chat_web_app#101) can rehydrate thumbs UI.
- Auth required; users can only rate assistant prompts in their own non-deleted conversations. Distinct from app-wide `POST /feedbacks/`.
- Joinable to `PromptMetric` via `prompt_id` for per-model accuracy slices.

## Test plan
- [ ] `uv run python manage.py test chat_backend.tests.test_views_prompt_feedback`
- [ ] Upsert thumbs up, then down with reason/comment — one row updated
- [ ] DELETE clears vote; second DELETE → 404
- [ ] Rating another user's prompt → 404; rating a user message → 400
- [ ] Reload conversation details → assistant prompts show caller feedback only
- [ ] Companion FE [chat_web_app#101](ai_ml_operations/chat_web_app#101) thumbs + reason popover against this APIReviewed-on: #70
This commit was merged in pull request #70.
This commit is contained in:
2026-08-04 03:23:58 -07:00
parent bf3fffa343
commit 2aeb95136a
7 changed files with 479 additions and 5 deletions
+10
View File
@@ -8,6 +8,7 @@ from .models import (
Conversation,
Prompt,
Feedback,
PromptFeedback,
PromptMetric,
DocumentWorkspace,
Document,
@@ -134,6 +135,14 @@ class FeedbackAdmin(admin.ModelAdmin):
list_display = ("status", "get_user_email", "title", "category")
class PromptFeedbackAdmin(admin.ModelAdmin):
model = PromptFeedback
list_display = ("id", "prompt", "user", "rating", "reason", "created")
list_filter = ("rating", "reason")
search_fields = ("user__email", "comment", "prompt__message")
raw_id_fields = ("prompt", "user")
class LLMModelsAdmin(admin.ModelAdmin):
model = LLMModels
list_display = ("name", "port", "description")
@@ -259,6 +268,7 @@ admin.site.register(Conversation, ConversationAdmin)
admin.site.register(Prompt, PromptAdmin)
admin.site.register(PromptMetric, PromptMetricAdmin)
admin.site.register(Feedback, FeedbackAdmin)
admin.site.register(PromptFeedback, PromptFeedbackAdmin)
admin.site.register(DocumentWorkspace, DocumentWorkspaceAdmin)
admin.site.register(Document, DocumentAdmin)