Przejdź do głównej zawartości

Provider Contract

Vista kieruje cały ruch AI przez warstwę Tauri (ServiceResolver). Frontend wywołuje unified_ai_* komendy, które dostarczają wspólny kontrakt dla LLM, STT i TTS.

ServiceResolver::new() buduje registry na podstawie unified_ai/service_resolver/provider_registry.rs:

KategoriaProvideryZmienna kolejności
STTstt-primary, stt-fallback, stt-vistascribeAI_PROVIDER_ORDER_STT
LLMllm-primary, llm-fallbackAI_PROVIDER_ORDER_LLM
TTStts-primary, tts-fallbackAI_PROVIDER_ORDER_TTS

Każdy provider posiada:

  • URL endpointu
  • Metodę (Json lub Multipart)
  • Klucz API (opcjonalny)
  • Typ API (AiApiKind::Responses vs legacy chat)
NazwaPrzykładUwagi
AI_CHAT_PRIMARY_ENDPOINThttps://api.openai.com/v1/responsesHarmony Responses API
AI_CHAT_PRIMARY_MODELgpt-4.1Model primary
AI_CHAT_FALLBACK_ENDPOINThttps://api.libraxis.cloud/llm/v1/responsesLibrAxis gateway
AI_CHAT_FALLBACK_MODELchatModel fallback
AI_AI_SUGGESTIONS_*Analogiczne pary dla sugestii
AI_SOAP_*Analogiczne pary dla SOAP
AI_MASTER_*Analogiczne pary dla master pipeline
NazwaPrzykład
AI_TRANSCRIPTION_PRIMARY_ENDPOINThttps://api.openai.com/v1/audio/transcriptions
AI_TRANSCRIPTION_FALLBACK_ENDPOINThttps://api.libraxis.cloud/stt/v1/audio/transcriptions
VISTASCRIBE_URLhttp://127.0.0.1:8237
NazwaUwagi
VOICE_TTS_PRIMARY_*OpenAI / DeepInfra
VOICE_TTS_FALLBACK_*Fallback provider
VOICE_DISABLE_TTStrue wyłącza całą gałąź
ZmiennaHost
OPENAI_API_KEYapi.openai.com
LIBRAXIS_API_KEY*.libraxis.cloud
DEEPINFRA_API_KEYDeepInfra
OPENROUTER_API_KEYOpenRouter
COHERE_API_KEYCohere
ZmiennaOpis
LIBRAXIS_API_KEYKlucz API
LIBRAXIS_CLIENT_IDID klienta
LIBRAXIS_SESSION_IDID sesji
LIBRAXIS_HMAC_SECRETSekret HMAC do podpisywania
ZmiennaOpis
AI_HEALTH_*Cache statusu providerów
AI_PRIMARY_JSON_TIMEOUT_SECSTimeout JSON (primary)
AI_FALLBACK_JSON_TIMEOUT_SECSTimeout JSON (fallback)
AI_PRIMARY_STREAM_TIMEOUT_SECSTimeout stream (primary)
AI_FALLBACK_STREAM_TIMEOUT_SECSTimeout stream (fallback)

Resolver dodaje Authorization: Bearer <API_KEY> gdy host odpowiada wpisowi w BASE_HOST_KEY_PAIRS (provider_contract_base.rs).

Jeżeli LIBRAXIS_HMAC_SECRET jest ustawiony, request jest podpisywany:

  • X-Client-ID
  • X-Signature
  • X-Timestamp
  • X-Session-Id (opcjonalnie)

Preferowany nagłówek dla hostów *.libraxis.cloud. apply_api_key_header wybiera x-api-key, a Bearer jest pomijany (chyba że podpisujemy HMAC).

flowchart LR
FE[Frontend] -->|withSessionPayload| SI[safeInvoke]
SI -->|vista_meta.session_context| SR[ServiceResolver]
SR -->|AiApiKind::Responses| H[Harmony payload]
SR -->|Legacy| CC[chat completions + harmony_input]
  • Responses: payload Harmony (input[], metadata, stream)
  • Legacy fallback: chat completions + harmony_input (LibrAxis gateway normalizuje server-side)
  • Stream: oczekujemy Harmony eventów (response.delta, response.completed) lub [DONE]
  • ProviderHealthDecision bazuje na cache (AI_HEALTH_*)
  • Po sukcesie przywracamy providera primary
  • Logi: ai.provider.call / ai.provider.fail przez secure_logger
KomendaOpis
pnpm smoke:allSTT/LLM/TTS pingi do OpenAI i LibrAxis
pnpm api:libraxis:curlTest LibrAxis-only
pnpm contract:checkPorównanie require_session z FE service listami
pnpm contract:syncSync po dodaniu nowego providera
FeatureStatusNotes
Request queue persistenceQueue in-memory, restart = utrata pending
TTS smoke tests⚠️Minimalne coverage
Fallback edge cases⚠️Częściowe SSE/niepoprawny JSON wymagają ręcznych retry
Legacy header cleanupTylko x-api-key (lub HMAC)
Harmony normalizationNon-Responses → harmony_input
Provider orderPełna konfiguracja przez AI_PROVIDER_ORDER_*
HMAC signatureWspierane dla LibrAxis
  1. Dodając nowego dostawcę:

    • Zaktualizuj provider_contract_base.rs
    • Zaktualizuj .env.example
    • Odpal pnpm contract:sync
    • Zaktualizuj tę dokumentację
  2. Przy zmianach Responses:

    • Upewnij się, że VistaRequest::ensure_chat_responses_format() wspiera nowe pola
    • Sprawdź FE (unifiedAI) dla metadata.tools, previous_response_id
  3. Każda zmiana sekretów wymaga:

    • Aktualizacji env-secrets-policy.md
    • Smoke testów