Leitfaden — Benutzerdefinierte Modell-Provider
Umfang
Dieses Dokument fasst die Schritte und Kriterien für benutzerdefinierte Modell-Provider mit dem Strands Agents SDK in Shell Sentinel zusammen. Es ergänzt die offizielle Dokumentation als interne Checkliste.
Voraussetzungen
- Kenntnis der Hierarchie
strands.models.Model(z. B.BedrockModel). - Verständnis von
Messages,StreamEventundToolSpec. - Python-Client für den proprietären LLM-Dienst.
- Deklarative Konfiguration in
conf/und Credentials über Umgebungsvariablen.
Implementierungsablauf
- Konfiguration definieren: typisierte
ModelConfigmitget_config/update_config. - Client initialisieren: Credentials sicher auflösen, Remote-Client instanziieren, Logging registrieren.
stream(...)implementieren: Eingaben konvertieren,StreamEventanpassen, Fehler behandeln; bei sync SDKasyncio.to_threadnutzen.- Tools unterstützen:
streaminstructured_output(...)mit Pydantic-ToolSpec. - Provider registrieren in
smart_ai_sys_admin.agentundconf/agent.conf.
Zusätzliche Hinweise
DEBUG-Logging für Troubleshooting.- Neue Parameter in Benutzerhandbüchern dokumentieren, wenn Operatoren betroffen sind.
- Keine Tokens oder Endpoints hardcoden.
- Smoke-Tests vor TUI-Integration.
Praxisbeispiel: OpenAI Responses API
providers.openai.api unterstützt chat_completions (Standard,
/v1/chat/completions) und responses (/v1/responses).
max_tokens wird für Chat Completions zu max_completion_tokens oder für
Responses zu max_output_tokens; reasoning_effort und
reasoning.effort werden ebenfalls an den Endpoint angepasst.
Die Migration behebt einen HTTP 400, wenn gpt-5.6-sol über Chat Completions Function
Tools mit aktivem Reasoning erhält. reasoning_effort: "none" verhindert den Fehler
nur durch deaktiviertes Reasoning (reasoning_tokens=0). Responses unterstützt
Function Tools mit Reasoning medium ohne diese Einschränkung.
Das aktuelle Beispiel verwendet GPT-6.1 Sol. Dieses Modell
benötigt Responses für Function Tools und unterstützt Reasoning medium;
none wird nicht unterstützt. Der obige GPT-5.6-Workaround gilt nicht für GPT-6.1 Sol.
{
"model_id": "gpt-6.1-sol",
"api": "responses",
"params": {"reasoning_effort": "medium", "max_tokens": 32768}
}
Die effektive Anfrage nutzt reasoning.effort und max_output_tokens; die
reale Konfiguration nutzt 65536. OPENAI_API_KEY kommt aus der Umgebung.
Optionales stateful kann previous_response_id nutzen, aber rekonstruiertes
Multi-Turn-reasoningContent behält noch keine vollständige Reasoning-Kontinuität.
Praxisbeispiel: LM Studio
- OpenAI-kompatibler lokaler Server (
/v1/*);base_url,api_key,model_idkonfigurieren. - Start mit
lms server start;client_argsfür Timeouts. - Native REST-API (
/api/v0/*) für Metriken undmax_context_length.
Praxisbeispiel: Mistral AI (Pfad A+)
ShellMistralModelumschließt StrandsMistralModel(offiziellesmistralaiv2 SDK).providers.mistralmit Standardreasoning_effort: highundmax_tokens: 16184.make test-mistralausführen, wennMISTRAL_API_KEYgesetzt ist.
Für Mistral Large 4 setze provider: "mistral", providers.mistral.model_id:
"mistral-large-4" und reasoning_effort: "high"; behalte max_tokens:
16184 bei und hinterlege MISTRAL_API_KEY in der Umgebung. Mistral Large 4 Reasoning
unterstützt none nicht. Starte die Live-TUI-Tests mit RUN_E2E=1
SHELL_SENTINEL_E2E_PROVIDERS=mistral-large-4 make test-e2e-live.
Praxisbeispiel: Google Gemini
- Strands'
GeminiModel(Extragemini, offiziellesgoogle-genai-SDK) wird direkt genutzt; kein eigener Wrapper. providers.geminimitmodel_id(gemini-3.8-flash),params(max_tokenswird zumax_output_tokens) undclient_argskonfigurieren.- Schlüssel aus
api_key_env(GEMINI_API_KEY, dannGOOGLE_API_KEY);api_keyim JSON wird abgelehnt.client_args.vertexai: truenutzt Google-Cloud-Anmeldedaten. - Thoughts kommen als
reasoningContent(show_thinking);cached_content_token_countwird aufcacheReadInputTokensabgebildet. KeinCacheConfig, daher startet der Blockcachedeaktiviert. - Die Live-e2e-Registry enthält eine Zeile
gemini:make test-e2e-livedeckt sie ab, sobaldGEMINI_API_KEYgesetzt ist.
Prompt-Caching
- Optionaler Block
cachepro Provider (enabled,strategy,ttl,system_prompt_ttl,tools_ttl,cache_key), abgebildet auf Strands'CacheConfig. - Bedrock: standardmäßig
enabled: true+strategy: "auto"; Cache-Points nur bei Claude-Modell-IDs. - OpenAI und Mistral: standardmäßig
enabled: true; es wird nur ein stabilerprompt_cache_keyaus Konfigurationspfad undmodel_idgesendet (cache_key: falsedeaktiviert ihn). - LM Studio ist standardmäßig deaktiviert; Ollama, Cerebras und Gemini ignorieren den Block mit einer Warnung im Log.
/statuszeigt gecachte gegenüber gesamten Eingabe-Tokens des letzten Turns.
Turn-Limit pro Anweisung
agent.max_turns(Standard25,null/0deaktiviert) wird als positive Ganzzahl validiert und vonAgentRuntime.invokealslimits={"turns": N}an den Strands-Agenten übergeben.- Beim Erreichen des Limits liefert Strands
stop_reason == "limit_turns", statt weiter zu rekursieren; die Runtime hängt die lokalisierte Warnungagent.invoke.turn_limitan den Modelltext an und protokolliert ein WARNING. Keine providerspezifische Arbeit nötig.
Praxisbeispiel: Cerebras
cerebras_cloud_sdkmit SSE-Streaming integrieren.providers.cerebrasmitmodel_id,params,client_args,api_key_env.ChatChunkResponsein native Events mitmetadatafür Nutzung und Zeiten.- Für strukturierte Ausgaben eine
ToolSpecerzeugen undtool_call.function.argumentsparsen.