3.0 KiB
3.0 KiB
Интеграция AI
Паттерн: FallbackChain
Запрос → Provider 1 → Успех → результат
Ошибка → Provider 2 → Успех → результат
Ошибка → Fallback результат
Реализация
class FallbackChain:
def __init__(self, providers: list[AIProvider], max_retries: int = 2):
self.providers = providers
self.max_retries = max_retries
async def analyze(self, prompt: str, **kwargs) -> AIResult:
last_error = None
for provider in self.providers:
for attempt in range(self.max_retries + 1):
try:
result = await provider.analyze(prompt, **kwargs)
if result.success:
return result
last_error = result
except Exception as e:
last_error = AIResult(success=False, error=str(e))
if attempt < self.max_retries:
await asyncio.sleep(2 if attempt == 0 else 5)
return last_error or AIResult(success=False, error="All providers failed")
Таймауты и ретраи (следуя §12 правил)
1. Попытка (timeout: 10s)
2. Успех → return
3. Таймаут → retry 1 (через 2s)
4. Таймаут → retry 2 (через 5s)
5. 4xx → WARNING, return fallback
6. 5xx → ERROR, retry → fallback
7. Все retry исчерпаны → return fallback
Хранение промптов
Рекомендуемый формат: YAML (docs/agent_prompts.yaml)
coordinator:
system_prompt: "Ты — координатор проекта..."
provider: yandex_gpt
temperature: 0.7
max_tokens: 2000
business_analyst:
system_prompt: "Ты — бизнес-аналитик..."
provider: yandex_gpt
temperature: 0.5
max_tokens: 3000
Альтернатива: MD-файлы в docs/specs/agents/ (для детальных спецификаций)
Провайдеры
| Провайдер | Когда | Аутентификация |
|---|---|---|
| Yandex GPT | РФ, хорошая русская речь | IAM token или API key |
| GigaChat (Sber) | РФ, юридические/финансовые темы | OAuth client credentials |
| OpenAI | Международные проекты | API key |
| Локальная модель | Оффлайн, конфиденциальность | Не требуется |
[ASK]
- Какие AI провайдеры нужны? (рекомендация: минимум 2 для fallback)
- Нужен ли fallback chain? (да — обязателен для отказоустойчивости)
- Где хранить промпты? (рекомендация: YAML — простота редактирования)
- Нужен ли локальный AI? (да, если конфиденциальность критична)