Conversation
…r implementation with streaming support and image upload functionality Signed-off-by: OEvortex <[email protected]>
Signed-off-by: OEvortex <[email protected]>
…S module Signed-off-by: OEvortex <[email protected]>
…ests 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]>
… enhancing task orchestration instructions
- 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
There was a problem hiding this comment.
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) |
There was a problem hiding this comment.
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.
| raise APIError( | ||
| f"Invalid message at index {i}: {str(e)}", | ||
| HTTP_422_UNPROCESSABLE_ENTITY, | ||
| HTTP_422_UNPROCESSABLE_CONTENT, |
There was a problem hiding this comment.
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.
| custom_fences: | ||
| - name: mermaid | ||
| class: mermaid | ||
| format: format |
There was a problem hiding this comment.
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.
| format: format | |
| format: !!python/name:pymdownx.superfences.fence_code_format |
| - **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`) |
There was a problem hiding this comment.
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).
| - 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`) |
|
|
||
| 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)** |
There was a problem hiding this comment.
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.
| ## 📚 **[Complete Documentation Index →](DOCUMENTATION_INDEX.md)** | |
| ## 📚 **[Complete Documentation Index →](README.md)** |
| from PIL import Image # type: ignore | ||
|
|
||
| PILLOW_AVAILABLE = True | ||
| except ImportError: |
There was a problem hiding this comment.
'except' clause does nothing but pass and there is no explanatory comment.
| from PIL import Image # type: ignore | ||
|
|
||
| PILLOW_AVAILABLE = True | ||
| except ImportError: |
There was a problem hiding this comment.
'except' clause does nothing but pass and there is no explanatory comment.
| if data.get("timestamp") == timestamp: | ||
| entry_data = data | ||
| break | ||
| except (json.JSONDecodeError, IOError): |
There was a problem hiding this comment.
'except' clause does nothing but pass and there is no explanatory comment.
| from PIL import Image # type: ignore | ||
|
|
||
| PILLOW_AVAILABLE = True | ||
| except ImportError: |
There was a problem hiding this comment.
'except' clause does nothing but pass and there is no explanatory comment.
| if models and len(models) > 0: | ||
| self.__class__.AVAILABLE_MODELS = models | ||
| cache.set(self.__class__.__name__, models) | ||
| except Exception: |
There was a problem hiding this comment.
'except' clause does nothing but pass and there is no explanatory comment.
| 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. |
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
.github/workflows/deploy-docs.yml) to automatically build and deploy documentation to GitHub Pages on pushes and pull requests, improving CI/CD for docs.docs/README.md, making it easier for users to find relevant information.Provider Infrastructure & Refactoring
webscout/Provider/OPENAIdirectory towebscout/Provider/Openai_compfor clarity and consistency across the codebase and documentation. [1] [2] [3]New Features & Provider Additions
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]webscout/model_fetcher.py) that improves provider startup performance and reliability.Testing & Quality Improvements
Documentation Updates & Removals
Prompts/ReverseEngineering.mddocumentation to streamline and declutter the docs.Provider.mdto reflect new and renamed providers. [1] [2]These changes collectively enhance the maintainability, clarity, and reliability of both the documentation and provider infrastructure.