Przejdź do głównej zawartości

Conversation Lifecycle

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-* events
{
"session_id": "sess_123",
"visit_id": "vis_456",
"metadata": {"context_id": "chat"},
"input": [
{"role": "user", "content": [{"type": "input_text", "text": "..."}]}
]
}

src-tauri/src/unified_ai/chat/chat_history.rs zapisuje:

  • response_id w ai_conversation_snapshots.response_id
  • Pełny ResponseEnvelope

sessionArchiveService.ts mirroruje:

  • response_id
  • output

Następny turn (useChatPanelViewModel) wysyła previous_response_id bez przepychania całej historii.

Po odświeżeniu UI pobiera response_id z archiwum i wysyła previous_response_id przy następnym safeInvoke.

WarstwaDziałanieStatus
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 windowssessionArchiveService.hydrate() odzyskuje response_id✅ (web), 🔄 (mobile TBD)

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: result
safeInvoke('unified_ai_list_response_events', {
response_id,
starting_after
})

Responses API pozwala decydować o przechowywaniu historii (store=true/false).

W trybie stateless musimy sami trzymać:

  • response_id
  • input / output

Przy ponownym wywołaniu dołączamy:

  • previous_response_id
  • Wszystkie function_call_output, które model powinien znać
  1. SessionArchiveService zapisuje pełny ResponseEnvelope (persistSnapshot)
  2. safeInvoke('unified_ai_list_response_events') korzysta z starting_after
  3. UnifiedAIClient udostępnia helper listResponseEvents(responseId, { startingAfter })

pnpm test:invoke zawiera scenariusze:

  • conversationSync - synchronizacja response_id
  • client - pilnowanie previous_response_id