- api.py: uvicorn.run was hardcoding port=7777 instead of using the
port variable populated from BACKEND_PORT env var, making BACKEND_PORT
ineffective when running python api.py directly
- searxSearch: add missing 'import sys' (caused NameError when run as
standalone script) and use constructor base_url arg with env var
fallback so searxSearch(base_url=...) actually takes effect
- Add 'anthropic' to available_providers and unsafe_providers so users can set
provider_name = anthropic in config.ini and use ANTHROPIC_API_KEY
- Add provider name alias normalization so 'togetherAI' (as documented in README)
is accepted as equivalent to 'together'
- Fix NameError in dsk_deepseek: add 'as e' to AuthenticationError, RateLimitError,
and NetworkError except clauses where 'e' was referenced but not bound
- Remove unreachable 'return thought' dead code at end of lm_studio_fn
- Update README to list Anthropic as a supported API provider
Previously, any unhandled exception during query processing caused the
entire backend server to exit via sys.exit(1), making the frontend show
'System offline. Deploy backend first.' until the container was restarted.
Also, is_generating was never reset to False on exception, permanently
blocking all subsequent queries with 429 responses.
- Replace sys.exit(1) with a proper HTTP 500 error response
- Move is_generating = False to the finally block so it always resets
Fixes#382
- Add MiniMax-M2.7 and MiniMax-M2.7-highspeed to supported models list
- Update docstring to list M2.7 models before M2.5
- Update README/README_CHS model references
- Add unit tests for M2.7 and M2.7-highspeed models
- Keep all previous models as alternatives
Add support for MiniMax M2.5 series models via OpenAI-compatible API:
- Add minimax_fn() to Provider class with configurable base URL
- Support both international and China mainland endpoints
- Update documentation in README.md and README_CHS.md
- Add MINIMAX_API_KEY and MINIMAX_BASE_URL to .env.example
- Add unit tests for MiniMax provider
Made-with: Cursor
Extend form handling to support:
- <select> dropdowns: detect options, select by visible text or value
- <textarea> fields: fill with text content
- <input type="file">: upload files by absolute path
- All element types are also discovered inside shadow DOM
Changes:
- find_inputs.js: discover <select> (with options) and <textarea>
- browser.py: import Select, handle new element types in
get_form_inputs() and fill_form_inputs()
Add version compatibility check before using existing ChromeDriver.
When the installed ChromeDriver major version does not match Chrome,
chromedriver_autoinstaller downloads the correct version automatically
instead of failing with a version mismatch error.
Add helper functions get_chromedriver_version() and
is_chromedriver_compatible() with tests for version matching logic.
Add try-except for json.JSONDecodeError in parse_agent_tasks() to
gracefully handle malformed JSON from LLM responses (e.g. Gemini 2.5
Flash via OpenRouter). Returns empty list on parse failure, which
triggers the existing retry mechanism in make_plan().
Add test suite for parse_agent_tasks() covering valid JSON, malformed
JSON, truncated JSON, and invalid agent name cases.
- Check ./chromedriver before system PATH or auto-installer
- Add Docker environment detection and fallback logic
- Provide debug messages for ChromeDriver source identification
- Improve compatibility with undetected_chromedriver in stealth mode
This resolves issues where undetected_chromedriver downloads its own
ChromeDriver version, bypassing mounted binaries in Docker environments.
The project root approach ensures users can manually place the correct
ChromeDriver version and have it reliably detected.