Conversation Lifecycle
Tworzenie odpowiedzi
Dział zatytułowany „Tworzenie odpowiedzi”sequenceDiagram participant FE as Frontend participant T as Tauri participant SR as ServiceResolver participant P as Provider
FE->>T: safeInvoke('unified_ai_chat', payload) T->>SR: validate + route SR->>P: POST /v1/responses P-->>SR: response.id + events stream SR-->>T: response_id + output T-->>FE: ai-stream-* eventsWymagany payload
Dział zatytułowany „Wymagany payload”{ "session_id": "sess_123", "visit_id": "vis_456", "metadata": {"context_id": "chat"}, "input": [ {"role": "user", "content": [{"type": "input_text", "text": "..."}]} ]}Zapisywanie i wznawianie
Dział zatytułowany „Zapisywanie i wznawianie”Backend
Dział zatytułowany „Backend”src-tauri/src/unified_ai/chat/chat_history.rs zapisuje:
response_idwai_conversation_snapshots.response_id- Pełny
ResponseEnvelope
Frontend
Dział zatytułowany „Frontend”sessionArchiveService.ts mirroruje:
response_idoutput
Następny turn (useChatPanelViewModel) wysyła previous_response_id bez przepychania całej historii.
Detached windows
Dział zatytułowany „Detached windows”Po odświeżeniu UI pobiera response_id z archiwum i wysyła previous_response_id przy następnym safeInvoke.
Status implementacji
Dział zatytułowany „Status implementacji”| Warstwa | Działanie | Status |
|---|---|---|
| Frontend (TS) | ConversationState + useChatPanelViewModel przechowują responseId i wysyłają previous_response_id | ✅ |
| Backend (Rust) | unified_ai_chat i unified_ai_chat_stream przyjmują previous_response_id | ✅ |
| Detached windows | sessionArchiveService.hydrate() odzyskuje response_id | ✅ (web), 🔄 (mobile TBD) |
Polling & background tasks
Dział zatytułowany „Polling & background tasks”Część workflow (SOAP, slash tasks) działa w tle:
sequenceDiagram participant FE as Frontend participant TM as TaskManager participant AI as UnifiedAIService
FE->>TM: start_soap_generation TM-->>FE: task_id loop Until completed/failed TM->>AI: poll_response(model, response_id) AI-->>TM: status end TM-->>FE: resultStreamowanie eventów po wznowieniu
Dział zatytułowany „Streamowanie eventów po wznowieniu”safeInvoke('unified_ai_list_response_events', { response_id, starting_after})Przechowywanie reasoning / usage
Dział zatytułowany „Przechowywanie reasoning / usage”Responses API pozwala decydować o przechowywaniu historii (store=true/false).
Tryb stateless
Dział zatytułowany „Tryb stateless”W trybie stateless musimy sami trzymać:
response_idinput/output
Przy ponownym wywołaniu dołączamy:
previous_response_id- Wszystkie
function_call_output, które model powinien znać
Implementacja w Vista
Dział zatytułowany „Implementacja w Vista”SessionArchiveServicezapisuje pełnyResponseEnvelope(persistSnapshot)safeInvoke('unified_ai_list_response_events')korzysta zstarting_afterUnifiedAIClientudostępnia helperlistResponseEvents(responseId, { startingAfter })
pnpm test:invoke zawiera scenariusze:
conversationSync- synchronizacjaresponse_idclient- pilnowanieprevious_response_id