Skip to content

New providers#114

Merged
OEvortex merged 12 commits intomainfrom
new-providers
Jan 31, 2026
Merged

New providers#114
OEvortex merged 12 commits intomainfrom
new-providers

Conversation

@OEvortex
Copy link
Owner

This pull request introduces several significant improvements and additions to the documentation and provider infrastructure, as well as important refactoring for clarity and consistency. The most notable changes include the addition of a GitHub Actions workflow for automated documentation deployment, renaming and restructuring of provider directories, enhancements to provider model fetching and caching, new provider implementations, and updates to documentation and testing practices.

Documentation & Workflow Automation

  • Added a new GitHub Actions workflow (.github/workflows/deploy-docs.yml) to automatically build and deploy documentation to GitHub Pages on pushes and pull requests, improving CI/CD for docs.
  • Enhanced documentation navigation by adding a comprehensive index link to docs/README.md, making it easier for users to find relevant information.

Provider Infrastructure & Refactoring

  • Renamed the webscout/Provider/OPENAI directory to webscout/Provider/Openai_comp for clarity and consistency across the codebase and documentation. [1] [2] [3]
  • Updated all references to the OpenAI-compatible providers in documentation and code samples to use the new directory name. [1] [2]

New Features & Provider Additions

  • Added new providers including AyeSoul AI Search (webscout/Provider/AISEARCH/ayesoul_search.py) and OpenAI-compatible Upstage (webscout/Provider/Openai_comp/upstage.py), with support for streaming, image uploads, and dynamic model fetching. [1] [2]
  • Introduced a thread-safe, file-based model fetching and caching infrastructure (webscout/model_fetcher.py) that improves provider startup performance and reliability.

Testing & Quality Improvements

  • Documented and enforced new testing guidelines for providers, specifying structure, mocking strategies, and naming conventions for unit tests.
  • Fixed 33 type errors and improved type safety across provider implementations to ensure compliance with strict type checking and linting.

Documentation Updates & Removals

  • Removed the outdated Prompts/ReverseEngineering.md documentation to streamline and declutter the docs.
  • Updated provider coverage tables and counts in Provider.md to reflect new and renamed providers. [1] [2]

These changes collectively enhance the maintainability, clarity, and reliability of both the documentation and provider infrastructure.

…r implementation with streaming support and image upload functionality

Signed-off-by: OEvortex <[email protected]>
…tionality

- Implemented Writecream provider with support for chat completions, including streaming and non-streaming responses.
- Added X0GPT provider with a comprehensive chat completion system, handling both streaming and non-streaming requests.
- Developed Zenmux provider, integrating chat completion capabilities and handling tool calls.
- Each provider includes error handling, token counting, and response formatting to ensure compatibility with existing interfaces.

Signed-off-by: OEvortex <[email protected]>
- Refactor Cerebras, DeepInfra, Groq, OpenRouter, and oivscode providers to defer model fetching to a background thread during initialization.
- Introduce BackgroundModelFetcher for managing asynchronous model fetching and caching.
- Add ModelCache for thread-safe caching of model lists with TTL support.
- Create comprehensive tests for the background model fetching system, covering cache behavior, timeout handling, error handling, and concurrent initialization.
- Update QwenLM provider to reflect new model versions.
…ment streaming support

fix: Update provider documentation and changelog for new Upstage integration
test: Add unit tests for Upstage provider functionality and response handling
refactor: Rename OPENAI directory to Openai_comp for consistency
…nd fetch

- Introduced BackgroundModelFetcher to enable asynchronous model fetching.
- Updated TogetherAI, Algion, HuggingFace, Nvidia, TextPollinations, Sambanova, and other providers to initiate model fetching in the background during initialization.
- Removed direct model fetching calls from constructors to improve responsiveness.
- Deleted unused oivscode provider implementation.
- Added a sample script (lol.py) demonstrating usage of the OpenAI client with Algion API.
… auto-fetching support

refactor: Update model fetcher cache to use system temp directory and add debug logging
chore: Remove unused lol.py file
docs: Update changelog with new ProxyManager details
Copilot AI review requested due to automatic review settings January 31, 2026 10:50
@OEvortex OEvortex merged commit cb36b3c into main Jan 31, 2026
7 of 9 checks passed
@OEvortex OEvortex deleted the new-providers branch January 31, 2026 10:51
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refactors the provider layout (notably moving OpenAI-compatible providers under Provider/Openai_comp), adds non-blocking model fetching with caching, introduces new providers and documentation infrastructure (MkDocs + GitHub Pages workflow), and updates docs/tests accordingly.

Changes:

  • Renames/restructures OpenAI-compatible provider package and updates imports/usages across server/client/providers/docs.
  • Adds background model fetching + file cache utilities and applies them across multiple providers.
  • Introduces MkDocs documentation site + deploy workflow, adds new docs pages, and updates provider lists/tests.

Reviewed changes

Copilot reviewed 133 out of 136 changed files in this pull request and generated 69 comments.

Show a summary per file
File Description
webscout/server/routes.py Updates error handling/status codes and OpenAPI example wiring for request models.
webscout/server/request_processing.py Updates OpenAI-compatible utils import path and error status constants.
webscout/server/request_models.py Migrates request models to Pydantic v2-style ConfigDict/model_config and updates imports.
webscout/server/providers.py Updates provider discovery to use Provider/Openai_comp.
webscout/scout/README.md Removes outdated dependency mention.
webscout/prompt_manager.py Simplifies HTTP session handling around curl_cffi.
webscout/model_fetcher.py Adds background model fetch + on-disk cache infrastructure.
webscout/client.py Updates dynamic discovery/import paths to Provider/Openai_comp.
webscout/init.py Minor formatting cleanup.
webscout/Provider/oivscode.py Removes deprecated provider (deleted).
webscout/Provider/meta.py Tightens typing for get_message.
webscout/Provider/llama3mitril.py Tightens typing for get_message.
webscout/Provider/julius.py Tightens typing for get_message.
webscout/Provider/geminiapi.py Switches to background model fetch.
webscout/Provider/cleeai.py Tightens typing for get_message.
webscout/Provider/cerebras.py Adds background model fetch.
webscout/Provider/ai4chat.py Tightens typing for get_message.
webscout/Provider/init.py Removes deprecated exports; adds Upstage.
webscout/Provider/UNFINISHED/liner.py Updates OpenAI-compatible import paths.
webscout/Provider/UNFINISHED/Youchat.py Adds type-ignore for cloudscraper import.
webscout/Provider/UNFINISHED/Humanizer/aihumanizer.py Changes printed output field access.
webscout/Provider/UNFINISHED/Grammer/grammerchecker.py Switches to CurlMime multipart usage.
webscout/Provider/UNFINISHED/ChutesAI.py Updates OpenAI-compatible import paths and type-ignore.
webscout/Provider/TwoAI.py Removes hardcoded API key from example usage.
webscout/Provider/TogetherAI.py Switches to background model fetch.
webscout/Provider/TextPollinationsAI.py Refactors model fetching to classmethod + background fetch.
webscout/Provider/TTS/sherpa.py Replaces httpx client with curl_cffi session.
webscout/Provider/TTS/qwen.py Replaces httpx client with curl_cffi session.
webscout/Provider/TTS/parler.py Replaces httpx client with curl_cffi session.
webscout/Provider/TTS/init.py Adds PocketTTS export.
webscout/Provider/TTI/pollinations.py Adds type-ignore hints for PIL imports.
webscout/Provider/TTI/magicstudio.py Adds type-ignore hints for PIL imports.
webscout/Provider/TTI/claudeonline.py Adds type-ignore hints for PIL imports.
webscout/Provider/Sambanova.py Refactors model fetching + background fetch; tightens typing.
webscout/Provider/STT/base.py Updates OpenAI-compatible utils import paths.
webscout/Provider/QwenLM.py Updates default/available model IDs.
webscout/Provider/Openai_comp/zenmux.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/x0gpt.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/writecream.py Adds new OpenAI-compatible provider implementation.
webscout/Provider/Openai_comp/wisecat.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/utils.py Updates Pydantic imports path.
webscout/Provider/Openai_comp/typliai.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/typefully.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/toolbaz.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/textpollinations.py Starts background model fetch on init.
webscout/Provider/Openai_comp/sonus.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/sambanova.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/pydantic_imports.py Adds OpenAI-compatible Pydantic re-export module.
webscout/Provider/Openai_comp/openrouter.py Defers model fetch to background.
webscout/Provider/Openai_comp/nvidia.py Defers model fetch to background.
webscout/Provider/Openai_comp/netwrck.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/meta.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/llmchatco.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/llmchat.py Tightens typing for streamed chunk handling.
webscout/Provider/Openai_comp/ibm.py Fixes possible None delta access in streaming aggregation.
webscout/Provider/Openai_comp/huggingface.py Defers model fetch to background.
webscout/Provider/Openai_comp/heckai.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/groq.py Defers model fetch to background.
webscout/Provider/Openai_comp/gradient.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/freeassist.py Updates docs string import path.
webscout/Provider/Openai_comp/exaai.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/elmo.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/e2b.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/deepinfra.py Defers model fetch to background.
webscout/Provider/Openai_comp/chatsandbox.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/chatgpt.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/cerebras.py Defers model fetch to background.
webscout/Provider/Openai_comp/base.py Adds _start_background_model_fetch() helper.
webscout/Provider/Openai_comp/ayle.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/algion.py Starts background model fetch and removes eager fetch at import time.
webscout/Provider/Openai_comp/akashgpt.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/ai4chat.py Updates OpenAI-compatible import paths and format_prompt import.
webscout/Provider/Openai_comp/init.py Adds new OpenAI-compatible package init and exports.
webscout/Provider/Openai_comp/TwoAI.py Updates OpenAI-compatible import paths.
webscout/Provider/Openai_comp/TogetherAI.py Starts background model fetch and cleans imports.
webscout/Provider/Openai_comp/README.md Updates code snippets to new import path.
webscout/Provider/Openai_comp/PI.py Updates format_prompt/count_tokens import paths.
webscout/Provider/Openai_comp/DeepAI.py Defers model fetch to background.
webscout/Provider/Openai.py Switches to background model fetch.
webscout/Provider/OpenRouter.py Switches to background model fetch.
webscout/Provider/OPENAI/oivscode.py Removes deprecated provider (deleted).
webscout/Provider/OPENAI/init.py Removes old OpenAI-compatible package (deleted).
webscout/Provider/OPENAI/K2Think.py Removes deprecated provider (deleted).
webscout/Provider/Nvidia.py Switches to background model fetch.
webscout/Provider/Netwrck.py Tightens typing for get_message.
webscout/Provider/K2Think.py Removes deprecated provider (deleted).
webscout/Provider/IBM.py Tightens typing for get_message.
webscout/Provider/HuggingFace.py Switches to background model fetch.
webscout/Provider/HeckAI.py Tightens typing for get_message.
webscout/Provider/Groq.py Switches to background model fetch.
webscout/Provider/Gradient.py Adjusts proxies typing and simplifies __main__ demo.
webscout/Provider/Gemini.py Tightens typing for get_message.
webscout/Provider/ExaAI.py Tightens typing for get_message.
webscout/Provider/Deepinfra.py Switches to background model fetch but clears static fallback list.
webscout/Provider/Cohere.py Tightens typing for get_message.
webscout/Provider/Andi.py Tightens typing for get_message.
webscout/Provider/Algion.py Switches to background model fetch and removes eager fetch at import time.
webscout/Provider/AISEARCH/brave_search.py Removes provider from active tree (deleted).
webscout/Provider/AISEARCH/ayesoul_search.py Adds new websocket-based AI search provider.
webscout/Provider/AISEARCH/init.py Replaces Brave export with AyeSoul.
webscout/Extra/proxy_manager.py Adds proxy rotation + monkey-patching utility.
webscout/Extra/gguf.py Adds type-ignore for optional huggingface_hub import.
webscout/Extra/init.py Exports new proxy_manager module.
webscout/AIbase.py Adds commented-out proxy meta scaffolding.
tests/test_ayle_models.py Removes interactive test (deleted).
tests/providers/test_upstage.py Adds unit tests for Upstage provider.
tests/providers/test_openai_deepinfra.py Removes tests relying on old OPENAI path (deleted).
tests/providers/test_brave_text.py Removes Brave parsing tests (deleted).
tests/providers/test_brave_images.py Removes Brave images tests (deleted).
test.py Adds local/manual test script at repo root.
pyproject.toml Updates dependencies and scripts.
mkdocs.yml Adds MkDocs config for docs site.
docs/scout.md Removes outdated dependency mention.
docs/index.md Adds new documentation landing page.
docs/getting-started.md Adds new getting started guide.
docs/examples/basic-chat.md Adds example content.
docs/examples/README.md Adds examples index page.
docs/README.md Adds link to documentation index (file missing in this PR).
changelog.md Adds release notes for the changes.
Provider.md Updates provider counts and examples.
Prompts/ReverseEngineering.md Removes outdated documentation (deleted).
AGENTS.md Updates agent guidance and references new provider path.
.gitignore Adds .claude ignore and formatting.
.github/workflows/deploy-docs.yml Adds GitHub Pages docs workflow.
Comments suppressed due to low confidence (142)

webscout/Provider/Nvidia.py:317

  • This comment appears to contain commented-out code.
    webscout/Provider/QwenLM.py:346
  • This comment appears to contain commented-out code.
    webscout/Provider/Openai_comp/e2b.py:2358
  • This comment appears to contain commented-out code.
    webscout/Provider/Openai_comp/utils.py:170
  • This comment appears to contain commented-out code.
    webscout/Provider/Andi.py:102
  • Variable conversation_prompt is not used.
    webscout/Provider/Gemini.py:105
  • Variable conversation_prompt is not used.
    webscout/Provider/Netwrck.py:116
  • Variable conversation_prompt is not used.
    webscout/Provider/TwoAI.py:252
  • Variable for_non_stream is not used.
    webscout/server/routes.py:542
  • Variable found is not used.
    webscout/AIbase.py:95
  • Overridden method signature does not match call, where it is passed too many arguments. Overriding method method PiAI.ask matches the call.
    Overridden method signature does not match call, where it is passed too many arguments. Overriding method method AI4Chat.ask matches the call.
    Overridden method signature does not match call, where it is passed too many arguments. Overriding method method LearnFast.ask matches the call.
    Overridden method signature does not match call, where it is passed an argument named 'voice'. Overriding method method PiAI.ask matches the call.
    Overridden method signature does not match call, where it is passed an argument named 'voice_name'. Overriding method method PiAI.ask matches the call.
    Overridden method signature does not match call, where it is passed an argument named 'output_file'. Overriding method method PiAI.ask matches the call.
    Overridden method signature does not match call, where it is passed an argument named 'country'. Overriding method method AI4Chat.ask matches the call.
    Overridden method signature does not match call, where it is passed an argument named 'country'. Overriding method method AI4Chat.ask matches the call.
    Overridden method signature does not match call, where it is passed an argument named 'user_id'. Overriding method method AI4Chat.ask matches the call.
    Overridden method signature does not match call, where it is passed an argument named 'user_id'. Overriding method method AI4Chat.ask matches the call.
    Overridden method signature does not match call, where it is passed an argument named 'image_path'. Overriding method method LearnFast.ask matches the call.
    def ask(
        self,
        prompt: str,
        stream: bool = False,
        raw: bool = False,
        optimizer: Optional[str] = None,
        conversationally: bool = False,
        **kwargs: Any,
    ) -> Response:

webscout/AIbase.py:106

  • Overridden method signature does not match call, where it is passed an argument named 'raw'. Overriding method method QodoAI.chat matches the call.
    Overridden method signature does not match call, where it is passed an argument named 'raw'. Overriding method method LearnFast.chat matches the call.
    Overridden method signature does not match call, where it is passed an argument named 'raw'. Overriding method method LLMChatCo.chat matches the call.
    Overridden method signature does not match call, where it is passed an argument named 'raw'. Overriding method method SearchChatAI.chat matches the call.
    Overridden method signature does not match call, where it is passed an argument named 'raw'. Overriding method method SonusAI.chat matches the call.
    def chat(
        self,
        prompt: str,
        stream: bool = False,
        optimizer: Optional[str] = None,
        conversationally: bool = False,
        **kwargs: Any,
    ) -> Union[str, Generator[str, None, None]]:

webscout/Provider/Openai_comp/PI.py:5

  • Module 'uuid' is imported with both 'import' and 'import from'.
    webscout/Provider/cleeai.py:7
  • Module 'webscout' is imported with both 'import' and 'import from'.
    webscout/init.py:3
  • Import pollutes the enclosing namespace, as the imported module webscout.AIauto does not define 'all'.
    webscout/init.py:4
  • Import pollutes the enclosing namespace, as the imported module webscout.AIutel does not define 'all'.
    webscout/init.py:6
  • Import pollutes the enclosing namespace, as the imported module webscout.Extra does not define 'all'.
    webscout/init.py:9
  • Import pollutes the enclosing namespace, as the imported module webscout.optimizers does not define 'all'.
    webscout/Extra/init.py:7
  • Import pollutes the enclosing namespace, as the imported module webscout.Extra.YTToolkit does not define 'all'.
from .YTToolkit import *

webscout/Provider/Openai_comp/DeepAI.py:9

  • Import of 'Response' is not used.
    webscout/Provider/Groq.py:2
  • Import of 'List' is not used.
    webscout/Provider/HuggingFace.py:2
  • Import of 'List' is not used.
    webscout/Provider/Nvidia.py:2
  • Import of 'List' is not used.
    webscout/Provider/OpenRouter.py:2
  • Import of 'List' is not used.
    webscout/Provider/Openai_comp/TogetherAI.py:8
  • Import of 'Response' is not used.
    webscout/Provider/Openai_comp/akashgpt.py:5
  • Import of 'cast' is not used.
    webscout/Provider/Openai_comp/base.py:9
  • Import of 'Response' is not used.
    Import of 'SimpleModelList' is not used.
    webscout/Provider/cerebras.py:6
  • Import of 'trio' is not used.
    webscout/Provider/Openai_comp/chatgpt.py:8
  • Import of 'cast' is not used.
    webscout/Provider/Openai_comp/deepinfra.py:4
  • Import of 'cast' is not used.
    webscout/Provider/Openai_comp/e2b.py:8
  • Import of 'cast' is not used.
    webscout/Provider/Openai_comp/elmo.py:4
  • Import of 'cast' is not used.
    webscout/Provider/Openai_comp/elmo.py:24
  • Import of 'LitAgent' is not used.
    webscout/Provider/Openai_comp/exaai.py:5
  • Import of 'cast' is not used.
    webscout/Provider/Openai_comp/gradient.py:11
  • Import of 'cast' is not used.
    webscout/Provider/Openai_comp/groq.py:4
  • Import of 'cast' is not used.
    webscout/Provider/Openai_comp/heckai.py:3
  • Import of 'cast' is not used.
    webscout/Provider/Openai_comp/huggingface.py:4
  • Import of 'cast' is not used.
    webscout/Provider/UNFINISHED/liner.py:27
  • Import of 'LitAgent' is not used.
    webscout/Provider/Openai_comp/llmchatco.py:4
  • Import of 'cast' is not used.
    webscout/Provider/Openai_comp/netwrck.py:4
  • Import of 'cast' is not used.
    webscout/Provider/Openai_comp/nvidia.py:4
  • Import of 'cast' is not used.
    webscout/Provider/Openai_comp/openrouter.py:4
  • Import of 'cast' is not used.
    webscout/Provider/TTS/parler.py:18
  • Import of 'utils' is not used.
    webscout/server/providers.py:7
  • Import of 'Optional' is not used.
    webscout/Provider/TTS/qwen.py:18
  • Import of 'utils' is not used.
    webscout/Provider/Openai_comp/sambanova.py:9
  • Import of 'cast' is not used.
    webscout/Provider/TTS/sherpa.py:18
  • Import of 'utils' is not used.
    webscout/Provider/Openai_comp/typefully.py:4
  • Import of 'cast' is not used.
    webscout/Provider/Openai_comp/utils.py:4
  • Import of 'cast' is not used.
    Import of 'Union' is not used.
    webscout/Provider/Openai_comp/wisecat.py:4
  • Import of 'cast' is not used.
    webscout/Provider/Openai_comp/zenmux.py:4
  • Import of 'cast' is not used.
    webscout/Provider/Andi.py:14
  • This class does not call Provider.init during initialization. (AndiSearch.init may be missing a call to a base class init)
    webscout/Provider/UNFINISHED/ChutesAI.py:264
  • This class does not call OpenAICompatibleProvider.init during initialization. (ChutesAI.init may be missing a call to a base class init)
    webscout/Provider/Cohere.py:12
  • This class does not call Provider.init during initialization. (Cohere.init may be missing a call to a base class init)
    webscout/Provider/ExaAI.py:13
  • This class does not call Provider.init during initialization. (ExaAI.init may be missing a call to a base class init)
    webscout/Provider/Gemini.py:27
  • This class does not call Provider.init during initialization. (GEMINI.init may be missing a call to a base class init)
    webscout/Provider/Gradient.py:15
  • This class does not call Provider.init during initialization. (Gradient.init may be missing a call to a base class init)
    webscout/Provider/HeckAI.py:14
  • This class does not call Provider.init during initialization. (HeckAI.init may be missing a call to a base class init)
    webscout/Provider/IBM.py:20
  • This class does not call Provider.init during initialization. (IBM.init may be missing a call to a base class init)
    webscout/Provider/Netwrck.py:14
  • This class does not call Provider.init during initialization. (Netwrck.init may be missing a call to a base class init)
    webscout/Provider/QwenLM.py:12
  • This class does not call Provider.init during initialization. (QwenLM.init may be missing a call to a base class init)
    webscout/Provider/TwoAI.py:13
  • This class does not call Provider.init during initialization. (TwoAI.init may be missing a call to a base class init)
    webscout/Provider/UNFINISHED/Youchat.py:13
  • This class does not call Provider.init during initialization. (YouChat.init may be missing a call to a base class init)
    webscout/Provider/ai4chat.py:10
  • This class does not call Provider.init during initialization. (AI4Chat.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/algion.py:226
  • This class does not call OpenAICompatibleProvider.init during initialization. (Algion.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/ayle.py:230
  • This class does not call OpenAICompatibleProvider.init during initialization. (Ayle.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/cerebras.py:226
  • This class does not call OpenAICompatibleProvider.init during initialization. (Cerebras.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/chatsandbox.py:185
  • This class does not call OpenAICompatibleProvider.init during initialization. (ChatSandbox.init may be missing a call to a base class init)
    webscout/Provider/cleeai.py:13
  • This class does not call Provider.init during initialization. (Cleeai.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/deepinfra.py:222
  • This class does not call OpenAICompatibleProvider.init during initialization. (DeepInfra.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/e2b.py:1937
  • This class does not call OpenAICompatibleProvider.init during initialization. (E2B.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/elmo.py:240
  • This class does not call OpenAICompatibleProvider.init during initialization. (Elmo.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/exaai.py:330
  • This class does not call OpenAICompatibleProvider.init during initialization. (ExaAI.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/freeassist.py:311
  • This class does not call OpenAICompatibleProvider.init during initialization. (FreeAssist.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/gradient.py:299
  • This class does not call OpenAICompatibleProvider.init during initialization. (Gradient.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/groq.py:242
  • This class does not call OpenAICompatibleProvider.init during initialization. (Groq.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/heckai.py:221
  • This class does not call OpenAICompatibleProvider.init during initialization. (HeckAI.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/huggingface.py:237
  • This class does not call OpenAICompatibleProvider.init during initialization. (HuggingFace.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/ibm.py:281
  • This class does not call OpenAICompatibleProvider.init during initialization. (IBM.init may be missing a call to a base class init)
    webscout/Provider/julius.py:13
  • This class does not call Provider.init during initialization. (Julius.init may be missing a call to a base class init)
    webscout/Provider/UNFINISHED/liner.py:203
  • This class does not call OpenAICompatibleProvider.init during initialization. (Liner.init may be missing a call to a base class init)
    webscout/Provider/llama3mitril.py:12
  • This class does not call Provider.init during initialization. (Llama3Mitril.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/llmchat.py:168
  • This class does not call OpenAICompatibleProvider.init during initialization. (LLMChat.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/llmchatco.py:278
  • This class does not call OpenAICompatibleProvider.init during initialization. (LLMChatCo.init may be missing a call to a base class init)
    webscout/Provider/meta.py:309
  • This class does not call Provider.init during initialization. (Meta.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/meta.py:369
  • This class does not call OpenAICompatibleProvider.init during initialization. (Meta.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/netwrck.py:208
  • This class does not call OpenAICompatibleProvider.init during initialization. (Netwrck.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/nvidia.py:232
  • This class does not call OpenAICompatibleProvider.init during initialization. (Nvidia.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/openrouter.py:243
  • This class does not call OpenAICompatibleProvider.init during initialization. (OpenRouter.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/sambanova.py:258
  • This class does not call OpenAICompatibleProvider.init during initialization. (Sambanova.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/sonus.py:205
  • This class does not call OpenAICompatibleProvider.init during initialization. (SonusAI.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/textpollinations.py:277
  • This class does not call OpenAICompatibleProvider.init during initialization. (TextPollinations.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/toolbaz.py:240
  • This class does not call OpenAICompatibleProvider.init during initialization. (Toolbaz.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/typefully.py:257
  • This class does not call OpenAICompatibleProvider.init during initialization. (TypefullyAI.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/typliai.py:185
  • This class does not call OpenAICompatibleProvider.init during initialization. (TypliAI.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/wisecat.py:261
  • This class does not call OpenAICompatibleProvider.init during initialization. (WiseCat.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/x0gpt.py:325
  • This class does not call OpenAICompatibleProvider.init during initialization. (X0GPT.init may be missing a call to a base class init)
    webscout/Provider/Openai_comp/zenmux.py:238
  • This class does not call OpenAICompatibleProvider.init during initialization. (Zenmux.init may be missing a call to a base class init)
    webscout/Provider/UNFINISHED/ChutesAI.py:209
  • This except block handling Exception is unreachable; as this except block also handles Exception.
    webscout/Provider/UNFINISHED/ChutesAI.py:256
  • This except block handling Exception is unreachable; as this except block also handles Exception.
    webscout/Provider/Cohere.py:160
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/Deepinfra.py:67
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/HuggingFace.py:52
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/Nvidia.py:51
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/OpenRouter.py:51
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/TogetherAI.py:62
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/Openai_comp/TogetherAI.py:266
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/TwoAI.py:213
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/UNFINISHED/Youchat.py:248
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/init.py:27
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/Openai_comp/chatgpt.py:259
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/TTI/claudeonline.py:291
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/TTI/claudeonline.py:293
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/TTI/claudeonline.py:299
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/TTI/claudeonline.py:319
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/TTI/claudeonline.py:325
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/client.py:79
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/client.py:81
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/client.py:129
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/client.py:131
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/client.py:189
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/client.py:197
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/client.py:208
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/client.py:636
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/Openai_comp/deepinfra.py:268
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Extra/gguf.py:311
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Extra/gguf.py:327
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Extra/gguf.py:343
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Extra/gguf.py:355
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/Openai_comp/heckai.py:191
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/TTI/magicstudio.py:194
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/TTI/magicstudio.py:223
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/Openai_comp/meta.py:180
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/Openai_comp/meta.py:434
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/Openai_comp/meta.py:463
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/TTI/pollinations.py:184
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/TTI/pollinations.py:215
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/server/routes.py:67
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/Openai_comp/zenmux.py:274
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/Openai_comp/zenmux.py:308
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/Provider/Openai_comp/zenmux.py:375
  • 'except' clause does nothing but pass and there is no explanatory comment.
    webscout/init.py:26
  • Print statement may execute during import.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

}
}
return JSONResponse(status_code=HTTP_422_UNPROCESSABLE_ENTITY, content=content)
return JSONResponse(status_code=HTTP_422_UNPROCESSABLE_CONTENT, content=content)
Copy link

Copilot AI Jan 31, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This response uses HTTP_422_UNPROCESSABLE_CONTENT, which is likely undefined in starlette.status and will crash at runtime. Use HTTP_422_UNPROCESSABLE_ENTITY (422) for request validation errors.

Copilot uses AI. Check for mistakes.
raise APIError(
f"Invalid message at index {i}: {str(e)}",
HTTP_422_UNPROCESSABLE_ENTITY,
HTTP_422_UNPROCESSABLE_CONTENT,
Copy link

Copilot AI Jan 31, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This code raises APIError with HTTP_422_UNPROCESSABLE_CONTENT, which is likely undefined in Starlette. Use HTTP_422_UNPROCESSABLE_ENTITY (422) to ensure the error path works.

Copilot uses AI. Check for mistakes.
custom_fences:
- name: mermaid
class: mermaid
format: format
Copy link

Copilot AI Jan 31, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pymdownx.superfences expects the mermaid fence format to be a callable (typically pymdownx.superfences.fence_code_format). format: format is not a valid reference and will likely break mkdocs build. Update this configuration to the standard callable reference.

Suggested change
format: format
format: !!python/name:pymdownx.superfences.fence_code_format

Copilot uses AI. Check for mistakes.
- **AyeSoul AI Search Provider**: `webscout/Provider/AISEARCH/ayesoul_search.py` - New provider using AyeSoul's WebSocket endpoint. Supports streaming/non-streaming, image uploads, and LitAgent-based user-agent generation.
- **OpenAI-compatible Upstage Provider**: `webscout/Provider/Openai_comp/upstage.py` - New OpenAI-compatible provider for Upstage AI with dynamic model fetching from `https://api.upstage.ai/v1/models` endpoint. Supports streaming and non-streaming modes with LitAgent browser fingerprinting.
- **Model Fetcher Infrastructure**: `webscout/model_fetcher.py` - Non-blocking model fetching with caching:
- Thread-safe `ModelFetcherCache` with file-based cache (`~/.webscout/model_cache.json`)
Copy link

Copilot AI Jan 31, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The changelog claims the model cache is stored at ~/.webscout/model_cache.json, but webscout/model_fetcher.py uses tempfile.gettempdir()/webscout/model_cache.json. Please update the changelog to match the actual cache location (or update the implementation if the changelog is the intended behavior).

Suggested change
- Thread-safe `ModelFetcherCache` with file-based cache (`~/.webscout/model_cache.json`)
- Thread-safe `ModelFetcherCache` with file-based cache (`<tempdir>/webscout/model_cache.json`, e.g. `/tmp/webscout/model_cache.json`)

Copilot uses AI. Check for mistakes.

Welcome to the central entry point for everything you need to know about Webscout. This hub is organized around the actual modules that live inside the repository so you can quickly jump from high-level concepts to concrete implementation details.

## 📚 **[Complete Documentation Index →](DOCUMENTATION_INDEX.md)**
Copy link

Copilot AI Jan 31, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doc links to DOCUMENTATION_INDEX.md, but that file is not present under docs/ in this PR. Either add the file, or update/remove the link to avoid broken navigation in the published docs.

Suggested change
## 📚 **[Complete Documentation Index →](DOCUMENTATION_INDEX.md)**
## 📚 **[Complete Documentation Index →](README.md)**

Copilot uses AI. Check for mistakes.
from PIL import Image # type: ignore

PILLOW_AVAILABLE = True
except ImportError:
Copy link

Copilot AI Jan 31, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

'except' clause does nothing but pass and there is no explanatory comment.

Copilot uses AI. Check for mistakes.
from PIL import Image # type: ignore

PILLOW_AVAILABLE = True
except ImportError:
Copy link

Copilot AI Jan 31, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

'except' clause does nothing but pass and there is no explanatory comment.

Copilot uses AI. Check for mistakes.
if data.get("timestamp") == timestamp:
entry_data = data
break
except (json.JSONDecodeError, IOError):
Copy link

Copilot AI Jan 31, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

'except' clause does nothing but pass and there is no explanatory comment.

Copilot uses AI. Check for mistakes.
from PIL import Image # type: ignore

PILLOW_AVAILABLE = True
except ImportError:
Copy link

Copilot AI Jan 31, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

'except' clause does nothing but pass and there is no explanatory comment.

Copilot uses AI. Check for mistakes.
if models and len(models) > 0:
self.__class__.AVAILABLE_MODELS = models
cache.set(self.__class__.__name__, models)
except Exception:
Copy link

Copilot AI Jan 31, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

'except' clause does nothing but pass and there is no explanatory comment.

Suggested change
except Exception:
except Exception:
# Intentionally ignore background fetch errors in tests:
# model caching is a best-effort optimization and failures
# here must not make tests flaky or change behavior.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant