From b67d44ac8b6f885d71dde5f788d85c3d0897bd9c Mon Sep 17 00:00:00 2001 From: rob Date: Tue, 30 Dec 2025 01:25:15 -0400 Subject: [PATCH] Clean up OpenCode ProviderModelNotFoundError messages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Detect ProviderModelNotFoundError and show clean message - Extract provider and model IDs from error - Suggest: connect provider in opencode, use --provider flag, or edit in UI - Truncate other stderr to 200 chars to avoid code dumps 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- src/smarttools/providers.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/smarttools/providers.py b/src/smarttools/providers.py index 5097884..fadabaf 100644 --- a/src/smarttools/providers.py +++ b/src/smarttools/providers.py @@ -199,7 +199,28 @@ def call_provider(provider_name: str, prompt: str, timeout: int = 300) -> Provid # Warn if output is empty (provider ran but returned nothing) if not result.stdout.strip(): - stderr_hint = f" (stderr: {result.stderr.strip()})" if result.stderr.strip() else "" + stderr = result.stderr.strip() + + # Check for OpenCode's ProviderModelNotFoundError + if "ProviderModelNotFoundError" in stderr or "ModelNotFoundError" in stderr: + # Extract provider and model info if possible + import re + provider_match = re.search(r'providerID:\s*"([^"]+)"', stderr) + model_match = re.search(r'modelID:\s*"([^"]+)"', stderr) + provider_id = provider_match.group(1) if provider_match else "unknown" + model_id = model_match.group(1) if model_match else "unknown" + + return ProviderResult( + text="", + success=False, + error=f"Model '{model_id}' from provider '{provider_id}' is not available.\n\n" + f"To fix this, either:\n" + f" 1. Run 'opencode' to connect the {provider_id} provider\n" + f" 2. Use --provider to pick a different model (e.g., --provider opencode-pickle)\n" + f" 3. Run 'smarttools ui' to edit the tool's default provider" + ) + + stderr_hint = f" (stderr: {stderr[:200]}...)" if len(stderr) > 200 else (f" (stderr: {stderr})" if stderr else "") return ProviderResult( text="", success=False,