Table of Contents

🇬🇧 English version

Fournisseurs LLM

HttpLlmProviderBase (Orkeon.Infrastructure.LLMs.Base) fournit la base abstraite pour tous les fournisseurs LLM. Elle intègre la gestion HTTP (IHttpClientFactory), les politiques de résilience Polly (retry, circuit breaker, timeout), et la sérialisation JSON.

Budget de retry. Llm:MaxRetries (10 par défaut) couvre les échecs qui reviennent en quelques secondes — erreurs de requête, 5xx, 429. Un appel bufferisé qui atteint Llm:TimeoutSeconds est réessayé une fois (ResilienceDefaults.LlmTimeoutRetries : chaque tentative coûte le délai entier), puis le provider répond par un échec qui nomme le réglage et les deux issues (un délai plus long, la réflexion coupée) ; une annulation de l'appelant n'est jamais réessayée. Un appel échoué voyage en LlmResponse.Error et, à travers l'adaptateur de chat client, en exception — il n'est jamais confondu avec une réponse vide, si bien que la boucle agent fait échouer la tâche immédiatement avec la raison du provider au lieu de relancer sans outils (LLM-11).

Fournisseurs implémentés :

Fournisseur Classe Namespace
OpenAI OpenAIProvider (via OpenAICompatibleProviderBase) Orkeon.Infrastructure.LLMs
Anthropic AnthropicLlmProvider Orkeon.Infrastructure.LLMs
Azure OpenAI AzureOpenAILlmProvider Orkeon.Infrastructure.LLMs
Ollama OllamaLlmProvider Orkeon.Infrastructure.LLMs
Together AI TogetherAiLlmProvider Orkeon.Infrastructure.LLMs
DeepSeek DeepSeekLlmProvider Orkeon.Infrastructure.LLMs
HuggingFace HuggingFaceLlmProvider Orkeon.Infrastructure.LLMs
Kimi KimiLlmProvider Orkeon.Infrastructure.LLMs
Qwen QwenLlmProvider Orkeon.Infrastructure.LLMs
Mistral AI MistralLlmProvider Orkeon.Infrastructure.LLMs
Z.AI (Zhipu GLM) ZaiLlmProvider Orkeon.Infrastructure.LLMs
Google Gemini GeminiLlmProvider Orkeon.Infrastructure.LLMs
Grok (x.AI) GrokLlmProvider Orkeon.Infrastructure.LLMs
MiniMax MiniMaxLlmProvider Orkeon.Infrastructure.LLMs
OpenRouter (agrégateur) OpenRouterLlmProvider Orkeon.Infrastructure.LLMs
Mammouth AI (agrégateur) MammouthLlmProvider Orkeon.Infrastructure.LLMs

Des adaptateurs génériques (ChatClientToLlmProviderAdapter, LlmProviderToChatClientAdapter, ChatClientToBasicLlmProviderAdapter) sont disponibles dans Orkeon.Infrastructure.LLMs.Adapters pour intégrer d'autres fournisseurs compatibles avec l'interface IChatClient.

LlmProviderFactory (Orkeon.Infrastructure.LLMs) résout automatiquement le fournisseur à partir de la LlmConfig (détection par URL, nom de modèle, ou clé API).

Capacités déclarées

Chaque provider déclare un value object LlmProviderCapabilities (Domain, exposé sur ILlmProvider ; la base vaut LlmProviderCapabilities.Unknown par défaut) : ResponseFormat (None/JsonObject/JsonSchema), Thinking (None/EffortOnly/Toggle/Budget), Vision, ExplicitPromptCaching, RequiresJsonKeywordInPrompt, ReplaysReasoningContent. OpenAICompatibleProviderBase traduit la déclaration en dialecte OpenAI une seule fois (payloads vision, response_format, thinking, les diagnostics CapabilityMismatchHint) ; Anthropic, Ollama et Qwen surchargent le hook pour leur propre dialecte. Une option qu'un provider ne peut pas honorer produit un avertissement structuré — jamais un abandon silencieux. Le cas miroir — une contrainte que seul le serveur peut énoncer — a son propre point d'extension : OpenAICompatibleProviderBase.TryAdaptRejectedPayload donne au provider une chance d'adapter une charge utile refusée en 4xx et de la ré-émettre une seule fois (chemins generate et chat ; le streaming ne réessaie jamais). Kimi s'en sert pour le invalid temperature: only 1 is allowed for this model de Moonshot — la valeur imposée est lue dans le refus lui-même (quels modèles l'exigent est décidé côté serveur, une liste en dur dériverait) et la substitution est journalisée en avertissement structuré. Deux coutures de dialecte supplémentaires servent les agrégateurs (LLM-09) : ReasoningFieldName nomme le champ vendeur où la trace de raisonnement est lue (reasoning_content par défaut, reasoning chez OpenRouter — la clé de métadonnée Orkeon reste reasoning_content), et usage.cost devient la métadonnée cost partout où un vendeur facture dans la réponse. Un chunk portant un error racine après le HTTP 200 termine un flux comme un refus pré-flux — métadonnée error sur le flux chat, HttpRequestException sur le flux texte — jamais comme une complétion propre. Les 16 providers sont des IStreamingLlmProvider, et RateLimitedLlmProvider décore n'importe lequel d'entre eux. La matrice par provider vit dans le comparatif des providers.

Valider un fournisseur contre son API réelle

Tous les tests unitaires de ce domaine parlent à un handler HTTP mocké : ils prouvent qu'Orkeon envoie ce qu'on croit, pas que le fournisseur l'accepte. La seconde preuve se construit avec le kit de campagne llmproviders-test/ :

llmproviders-test/run-campaign.sh --provider ollama --model llama3.2   # premier run, coût nul
llmproviders-test/run-campaign.sh --all --config providers.local.json --dry-run

Il pilote orkeon llm probe sur les modes M1–M10, M12 et M13 du protocole de test des fournisseurs (matrice interne des mainteneurs) et archive un rapport Markdown par campagne. orkeon llm models -p <fournisseur> --filter 'gpt-5.6-*' liste ce qu'un fournisseur sert réellement : aucune campagne ne dépend d'une liste de modèles maintenue à la main.


Voir aussi : Système de mémoire · Sécurité · Retour à l'index