Add opt-in use_conversation_context flag for chat history (#33) (#73)
Unit Tests / test (push) Successful in 11s
Deploy Beta / unit-tests (push) Successful in 11s
Deploy Beta / docker (push) Successful in 29s
Deploy Beta / deploy-beta (push) Successful in 7m24s

## 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:
westfarn committed 2026-08-04 06:27:44 -07:00
1 parent bef151c92c
commit ab3dfffa6b
13 files changed
+213 -40

No files matched your search

+12 -1
View File
@@ -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 {