Konfiguracja AIConfiguration
Plik aiconfiguration.json oraz jego warianty środowiskowe (np. aiconfiguration.Staging.json, aiconfiguration.Production.json) zawierają konfigurację połączeń z dostawcami AI, definicje modeli oraz mapowanie typów operacji na konkretne modele. Ten rozdział wyjaśnia strukturę, sposób przygotowania i walidacji konfiguracji.
Celem jest opisanie struktury i kluczowych sekcji: ProviderConnections, ProviderModels i MethodTypesConfiguration oraz dostarczenie przykładów oraz listy kontrolnej do szybkiej walidacji konfiguracji.
Wyjaśnienie kluczowych sekcji
ProviderConnections
Sekcja ProviderConnections zawiera listę skonfigurowanych połączeń z dostawcami AI. Każdy wpis zawiera:
- Description - opis połączenia,
- Type - typ dostawcy (np.
Gemini,OpenAi,Azure), - ProviderConfiguration - obiekt konfiguracyjny zawierający nazwy sekretów Key Vault (NIE rzeczywiste sekrety).
Wartości w ProviderConfiguration to nazwy sekretów Key Vault, a nie faktyczne klucze API. W trybie Self-hosted (przy braku Azure Key Vault) ustawiamy tutaj rzeczywisty sekret.
ProviderModels
Sekcja ProviderModels to tablica definicji modeli mapowanych do ConnectionName. Każdy wpis zawiera:
- ConnectionName - nazwa połączenia z
ProviderConnections, - Priority - priorytet modelu (wyższa wartość = wyższy priorytet przy wyborze modelu),
- Name - unikalna nazwa modelu (używana w mapowaniu
MethodTypesConfiguration), - TextModel - obiekt zawierający
ModelNamedla operacji tekstowych, - ImageModel (opcjonalnie) - obiekt zawierający
ModelNamedla operacji obrazowych. Wymagany przy generowaniu obrazów, - AudioModel (opcjonalnie) - obiekt zawierający
ModelNamedla operacji audio. Wymagany do akcji AudioTranscrabie, - EmbeddingModel (opcjonalnie) - obiekt zawierający
ModelNamedla operacji embedding. Wymagany przy generowaniu embeddingów.
MethodTypesConfiguration
Sekcja MethodTypesConfiguration mapuje logiczne typy metod (np. ConciergePrompt, ConciergeExecuteTool, AgentPrompt) na uporządkowane tablice nazw modeli z ProviderModels. Określa to preferowane modele dla każdego typu operacji.
Kolejność w tablicy ma znaczenie - aplikacja próbuje użyć pierwszego modelu, a w przypadku niedostępności przechodzi do następnego.
Przykład konfiguracji
Poniżej znajduje się przykład bazujący na aiconfiguration.Staging.json:
{
"ProviderConnections": {
"GoogleVertex": {
"Description": "Google Connector Provider",
"Type": "Gemini",
"ProviderConfiguration": {
"ApiKey": "AiGeminiTestEnvironment",
"ServiceAccount": "AiVertexAiServiceAccountJson",
"ProjectId": "AiVertexAiProjectId",
"Region": "AiVertexAiRegion",
"BucketName": "AiGoogleCloudBucketName"
}
},
"OpenAi": {
"Description": "OpenAi Connector Provider",
"Type": "OpenAi",
"ProviderConfiguration": {
"ApiKey": "AiOpenAiTestEnvironment"
}
}
},
"ProviderModels": [
{
"ConnectionName": "GoogleVertex",
"Priority": 4,
"Name": "Gemini 2.0-flash-lite-001",
"TextModel": { "ModelName": "gemini-2.0-flash-lite-001" }
},
{
"ConnectionName": "OpenAi",
"Priority": 1,
"Name": "OpenAi BasicTier",
"TextModel": { "ModelName": "gpt-4o-mini-2024-07-18" },
"ImageModel": { "ModelName": "dall-e-3" }
}
],
"MethodTypesConfiguration": {
"ConciergePrompt": [
"Gemini 2.0-flash-lite-001",
"Vertex gemini 2.5-flash-lite"
],
"ConciergeExecuteTool": [
"Gemini 2.0-flash-lite-001",
"Vertex gemini 2.5-flash"
],
"AgentPrompt": [
"OpenAi BasicTier"
]
}
}
Lista kontrolna przygotowania (kroki dla supportu)
Krok 1: Walidacja lokalizacji i nazwy pliku
- Potwierdź, że edytujesz właściwy plik dla środowiska:
aiconfiguration.json,aiconfiguration.Staging.jsonlubaiconfiguration.Production.json.
Krok 2: Potwierdzenie braku sekretów w jawnym tekście
- Wszystkie wartości sekretów w
ProviderConfigurationmuszą być nazwami sekretów w Key Vault (np.AiOpenAiTestEnvironment), a nie rzeczywistymi kluczami API. - NIGDY nie umieszczaj faktycznych kluczy API w pliku konfiguracyjnym.
Krok 3: Weryfikacja istnienia sekretów w Key Vault
- Dla każdej nazwy Key Vault wymienionej w konfiguracji sprawdź, czy instancja Key Vault zawiera sekret o oczekiwanej nazwie.
- Typowe klucze Key Vault do weryfikacji (z przykładu):
AiGeminiTestEnvironmentAiVertexAiServiceAccountJsonAiVertexAiProjectIdAiOpenAiTestEnvironment
Krok 4: Sprawdzenie spójności ProviderModels
- Upewnij się, że każdy
ProviderModel.ConnectionNameodpowiada kluczowi wProviderConnections. - Potwierdź, że kolejność
Priorityjest zamierzona (wyższa wartość = wyższy priorytet przy wyborze modeli). - Zweryfikuj poprawność wartości
ModelNamedla danego dostawcy (np. prawidłowa konwencja nazewnictwa dla Vertex/OpenAI).
Krok 5: Walidacja MethodTypesConfiguration
- Upewnij się, że wartości
Namemodeli wymienione tutaj dokładnie odpowiadają ciągomProviderModels[].Name. - Kolejność określa preferencje zapasowe - potwierdź, że kolejność odzwierciedla pożądane zachowanie.
- Sprawdź, czy wszystkie typy metod używane przez aplikację mają odpowiednie mapowanie.
Krok 6: Kontrola JSON
- Uruchom linter/walidator JSON, aby upewnić się, że plik jest poprawnie sformatowany.
- Sprawdź poprawność przecinków, nawiasów i cudzysłowów.
Krok 7: Wdrożenie / przeładowanie aplikacji
- Po zmianach aplikacja wymaga przeładowania konfiguracji poprzez ponowne uruchomienie.
- Zweryfikuj pipeline wdrożeniowy lub procedurę restartu usługi w danym środowisku.
Typowe błędy i rozwiązywanie problemów
Użycie rzeczywistych kluczy API w aiconfiguration zamiast nazw sekretów Key Vault.
Objawy:
- ryzyko bezpieczeństwa (sekrety trafiają do repozytorium),
- brak możliwości centralnego zarządzania sekretami.
Rozwiązanie:
- zastąp wartość w jawnym tekście nazwą sekretu z Key Vault,
- przechowuj rzeczywisty klucz w Key Vault.
Literówka w ProviderModels.Name w nazwie modelu powoduje niedopasowanie w MethodTypesConfiguration.
Objawy:
- wybór modelu kończy się niepowodzeniem lub działa nieoczekiwanie,
- błędy w logach o braku modelu.
Rozwiązanie:
- zapewnij dokładne dopasowanie ciągów znaków,
- ponownie wdróż / przeładuj konfigurację.
ConnectionName nie odpowiada kluczowi ProviderConnections.
Objawy:
- wybór modelu nie może znaleźć ustawień dostawcy,
- błędy inicjalizacji connectora.
Rozwiązanie:
- popraw
ConnectionNamelub dodaj wpis dostawcy wProviderConnections.
Użycie niewłaściwej wartości Type dla dostawcy (np. Gemini vs Vertex, gdy connector oczekuje konkretnej wartości).
Objawy:
- fabryka connectorów nie może skonstruować dostawcy,
- błędy inicjalizacji podczas startu aplikacji.
Rozwiązanie:
- użyj typu dostawcy obsługiwanego przez implementację connectora,
- w razie wątpliwości sprawdź kod
Modules/AiConnector.
Runbook supportu (krok po kroku)
- Otwórz plik konfiguracyjny specyficzny dla środowiska (np.
aiconfiguration.Staging.json). - Uruchom walidację JSON.
- Sprawdź każdą wartość właściwości
ProviderConfigurationwzględem wpisów w Key Vault. - Zweryfikuj nazwy modeli i mapowania method-type pod kątem literówek.
- Jeśli wymagane są zmiany, zaktualizuj plik JSON w gałęzi repozytorium dla środowiska i utwórz PR.
- Po merge upewnij się, że pipeline wdrożeniowy działa i usługa się restartuje (lub uruchom restart ręcznie).
- Monitoruj logi pod kątem błędów: dostęp do Key Vault, inicjalizacja connectora, ostrzeżenia wyboru modelu.
Najlepsze praktyki
- Zawsze używaj Key Vault - nie przechowuj sekretów w plikach konfiguracyjnych.
- Dokumentuj zmiany - dodawaj komentarze o zmianach w konfiguracji w commit message.
- Testuj w staging - testuj zmiany w konfiguracji na środowisku staging.
- Monitoruj po wdrożeniu - sprawdzaj logi i metryki po każdej zmianie w konfiguracji.
- Wersjonowanie - utrzymuj historię zmian w systemie kontroli wersji.
- Backup - zachowuj kopie zapasowe działających konfiguracji.