## Summary - Closes [#33](#33) — per-user `use_conversation_context` boolean on `CustomUser` (default `false`, opt-in). - Migration `0034_customuser_use_conversation_context`. - `GET/POST /api/conversation_preferences` reads/writes the flag; POST sets absolute boolean without toggling `conversation_order` when only this field is sent. - Chat + document RAG paths skip prior-turn history when the flag is off (`AsyncLLMService`, `AsyncRAGService`, both WS consumers). ## Frontend contract - Field: `use_conversation_context` (boolean, default false) - Read: `GET /api/conversation_preferences` → `{ order, use_conversation_context }` - Write: `POST /api/conversation_preferences` with `{ "use_conversation_context": true|false }` - Tooltip copy: use previous conversations to better customize the experience - Counterpart: [chat_web_app#66](ai_ml_operations/chat_web_app#66) ## Test plan - [ ] `manage.py test chat_backend.tests.test_models chat_backend.tests.test_views_conversations.ConversationPreferencesTestCase chat_backend.tests.test_services_llm chat_backend.tests.test_services_rag` - [ ] New user / unset flag → `use_conversation_context` is false; history empty in LLM/RAG prompts - [ ] Enable via preferences API → prior turns appear in history - [ ] Disable again → history skipped; order preference unchanged when posting only the context flagReviewed-on: #73
This commit was merged in pull request #73.
This commit is contained in:
1 parent
bef151c92c
commit
ab3dfffa6b
13 files changed
+213
-40
No files matched your search
@@ -305,7 +305,14 @@ async def generation_node(state: ChatState) -> ChatState:
|
||||
service = AsyncRAGService()
|
||||
workspace = await get_workspace(conversation_id, user=chat_user)
|
||||
await emit_status("retrieving_docs")
|
||||
generator = service.generate_response(messages, prompt_instance.message, workspace)
|
||||
generator = service.generate_response(
|
||||
messages,
|
||||
prompt_instance.message,
|
||||
workspace,
|
||||
use_conversation_context=bool(
|
||||
getattr(chat_user, "use_conversation_context", False)
|
||||
),
|
||||
)
|
||||
await emit_status("refining")
|
||||
return {"response_generator": generator}
|
||||
|
||||
@@ -320,11 +327,15 @@ async def generation_node(state: ChatState) -> ChatState:
|
||||
else:
|
||||
# GENERAL_CHAT / SEARCH / UNKNOWN — always-on grounding (#62).
|
||||
# FAST selects a smaller model; it no longer skips search.
|
||||
chat_user = state.get("chat_user")
|
||||
grounded = await prepare_grounded_chat(
|
||||
message=state["message"],
|
||||
messages=messages,
|
||||
model_name=state.get("model_name"),
|
||||
conversation_id=conversation_id,
|
||||
use_conversation_context=bool(
|
||||
getattr(chat_user, "use_conversation_context", False)
|
||||
),
|
||||
)
|
||||
if grounded.error:
|
||||
return {
|
||||
|
||||
Reference in new issue
Block a user