From 7525a95af0124a618f4460f7cb492486e7cbd82c Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sun, 19 Oct 2025 13:41:28 -0400 Subject: [PATCH] Fix excessive error logging for missing org-level microagents (#11425) Co-authored-by: openhands --- openhands/integrations/provider.py | 23 +++++++++++++++++------ openhands/runtime/base.py | 1 + 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/openhands/integrations/provider.py b/openhands/integrations/provider.py index 064309e372..7e68b95623 100644 --- a/openhands/integrations/provider.py +++ b/openhands/integrations/provider.py @@ -449,7 +449,10 @@ class ProviderHandler: return f'{provider.value}_token'.lower() async def verify_repo_provider( - self, repository: str, specified_provider: ProviderType | None = None + self, + repository: str, + specified_provider: ProviderType | None = None, + is_optional: bool = False, ) -> Repository: errors = [] @@ -468,19 +471,22 @@ class ProviderHandler: errors.append(f'{provider.value}: {str(e)}') # Log detailed error based on whether we had tokens or not + # For optional repositories (like org-level microagents), use debug level + log_fn = logger.debug if is_optional else logger.error + if not self.provider_tokens: - logger.error( + log_fn( f'Failed to access repository {repository}: No provider tokens available. ' f'provider_tokens dict is empty.' ) elif errors: - logger.error( + log_fn( f'Failed to access repository {repository} with all available providers. ' f'Tried providers: {list(self.provider_tokens.keys())}. ' f'Errors: {"; ".join(errors)}' ) else: - logger.error( + log_fn( f'Failed to access repository {repository}: Unknown error (no providers tried, no errors recorded)' ) raise AuthenticationError(f'Unable to access repo {repository}') @@ -626,17 +632,22 @@ class ProviderHandler: f'Microagent file {file_path} not found in {repository}' ) - async def get_authenticated_git_url(self, repo_name: str) -> str: + async def get_authenticated_git_url( + self, repo_name: str, is_optional: bool = False + ) -> str: """Get an authenticated git URL for a repository. Args: repo_name: Repository name (owner/repo) + is_optional: If True, logs at debug level instead of error level when repo not found Returns: Authenticated git URL if credentials are available, otherwise regular HTTPS URL """ try: - repository = await self.verify_repo_provider(repo_name) + repository = await self.verify_repo_provider( + repo_name, is_optional=is_optional + ) except AuthenticationError: raise Exception('Git provider authentication issue when getting remote URL') diff --git a/openhands/runtime/base.py b/openhands/runtime/base.py index bd81daa3e4..119b3c2172 100644 --- a/openhands/runtime/base.py +++ b/openhands/runtime/base.py @@ -747,6 +747,7 @@ fi self.provider_handler.get_authenticated_git_url, GENERAL_TIMEOUT, org_openhands_repo, + is_optional=True, ) except AuthenticationError as e: self.log(