The previous repair pass rewrote any non-parseable arguments string to
"{}", which clobbered legitimate accumulator contents in
test_stream_response_yields_events_for_tool_call (concatenated raw
deltas like "arg1arg2"). Narrow the guard: only when the stripped
buffer starts with "{" or "[" *and* fails to parse do we replace it
with "{}". Everything else is left untouched.
A streaming tool call cut off after the opening brace would leave
state.function_calls[i].arguments = "{". CAI persisted that into
conversation history verbatim, and on the next turn the upstream
litellm proxy strict-parsed it as JSON and rejected the whole
request with HTTP 400 ("unexpected end of data: line 1 column 2"),
wedging the session.
- openai_chatcompletions.py: at end-of-stream, validate every
accumulated function_call.arguments string. If empty or not
valid JSON, normalize to "{}" before emitting events.
- message_builder.py: same guard when replaying assistant tool_calls
out of memory, so a poisoned history loaded from disk also recovers.
Rich console.input still echoed ^M after prompt_toolkit even with cooked
TTY restore. Route compact confirmation through prompt_toolkit like the
main CAI> prompt and other interactive agent flows.
Force cooked canonical TTY mode after prompt_toolkit and route /compact
confirmation through read_repl_yes_no, which restores the terminal and
strips stray carriage returns from the answer.
Restore cooked TTY state after prompt_toolkit exits so Rich console.input
and other follow-up prompts (e.g. /compact confirmation) accept Enter normally.
* docs: add Supporting Other CLIs section with Claude Code, Codex and OpenCode
Adds a new documentation section covering how to use the Alias API
with third-party scaffoldings (Claude Code via proxy, Codex CLI, and
OpenCode). Includes privacy/security warning banners and support
disclaimers on each page.
* docs: update Claude Code setup to use env vars instead of proxy
* docs: clarify usage data collection scope and GDPR basis
Expand the Usage Data Collection section to explicitly mention model
training and evaluation as purposes of data collection, separate the
GDPR legal basis into its own paragraph for readability, and refine
the closing note about CAI_TELEMETRY.
Remove council page and nav; drop obsolete slash commands from docs (/config,
/context, /platform, /kill, /model-show); document /env, /model show, and
CLI examples. Update README, MkDocs, and PRO pages for usage visibility.
- Document /help, /help var, and /config for in-session env discovery
(environment_variables.md, configuration.md, FAQ, CLI reference pages).
- Add Values/When columns and a field guide aligned with REPL /help tables.
Co-authored-by: Rufino Cabrera <rufino@aliasrobotics.com>
docs: add Supporting Other CLIs section with Claude Code, Codex and OpenCode
Adds a new documentation section covering how to use the Alias API
with third-party scaffoldings (Claude Code via proxy, Codex CLI, and
OpenCode). Includes privacy/security warning banners and support
disclaimers on each page.
* Block dangerous flags in find_file function
Added a set of dangerous flags to prevent RCE and file manipulation in the find_file function.
* Fix typo in error message for dangerous flags
* Fix typo in README.md for 'Agents'
Correcting typo and adjusting diagram
* Update banner title from Alias0 to Alias1
* Fix formatting issues in README diagram
This was a formating missmatch that now is fixed
---------
Co-authored-by: UnaiAlias <52742669+UnaiAlias@users.noreply.github.com>
* feat: Add Ollama Cloud integration with ollama_cloud/ prefix
- Added support for Ollama Cloud models via AsyncOpenAI
- Models use ollama_cloud/ prefix (e.g., ollama_cloud/gpt-oss:120b)
- Reads OLLAMA_API_KEY and OLLAMA_API_BASE for cloud authentication
- Added predefined Ollama Cloud models to /model-show
- Filtered obsolete ollama/*-cloud models from LiteLLM database
- Updated authentication headers in completer, banner, and toolbar
- Added concise English documentation in docs/providers/
- Adapted to new global model cache architecture from #371
Modified files:
- src/cai/sdk/agents/models/openai_chatcompletions.py
- src/cai/repl/commands/model.py (adapted to global cache)
- src/cai/util.py
- src/cai/repl/commands/completer.py
- src/cai/repl/ui/banner.py
- src/cai/repl/ui/toolbar.py
- docs/providers/ollama.md
- docs/providers/ollama_cloud.md
All existing functionality preserved (backward compatible).
* fix: Add missing Ollama Cloud models and get_ollama_auth_headers
- Added Ollama Cloud models to get_predefined_model_categories()
- Added get_ollama_auth_headers() function to util.py
- Added Ollama Cloud to category_to_provider mapping
- Imported get_ollama_auth_headers in model.py
This fixes the issue where predefined models weren't showing in /model-show.
* fix: Display predefined models first in /model-show
- Added loop to display predefined models (Alias, Claude, OpenAI, DeepSeek, Ollama Cloud) before LiteLLM models
- Models #1-14 now correctly show predefined models
- LiteLLM models start from #15+ as expected
- Added get_ollama_auth_headers() function in util.py for Ollama Cloud auth
- Fixed model numbering to be consistent with global cache
This resolves the issue where predefined models were skipped and only LiteLLM models appeared starting from #15.
* fix: Restore correct import of cai.caibench instead of pentestperf
During rebase, the import was incorrectly changed from 'import cai.caibench as ptt'
to 'import pentestperf as ptt'. This commit restores the correct import.
The original code uses cai.caibench, not an external pentestperf module.
fix: consistent model numbering between /model and /model-show for Ollama
When using OLLAMA_API_BASE, model selection by number was incorrect.
/model-show displayed Ollama models with certain numbers, but /model <number>
selected different models from LiteLLM instead.
This happened because both commands used separate caches with inconsistent
numbering. Now they share a global cache that loads models in consistent order:
predefined → LiteLLM → Ollama.
Fixes model number mismatch when selecting Ollama models by number.
Add idle detection to prevent CAI from freezing when executing
interactive tools (cat, python -i, gdb, radare2) that wait for
user input indefinitely.
- Add non-blocking I/O with asyncio.wait_for() timeouts
- Add 10s idle timeout to terminate idle processes
- Apply to streaming and non-streaming execution paths
- Add select.select() to ShellSession._read_output()
Resolves blocking I/O issue where interactive tools would hang
CAI for the full timeout period (100s).
This release introduces significant enhancements to CAI's web security testing capabilities,
improves MCP server support, and substantially expands documentation coverage.
New Features
- Add web_pentester_agent for professional web application security testing (#353)
- Add HTTP header support to /mcp load command for SSE servers (#350)
- Implement custom tool example for agent extensibility (#347)
- Support for reasoning tokens in response processing (#318)
- Docker container based on Kali Linux for enhanced tooling (#308)
Documentation
- Add comprehensive CAI PRO documentation and CLI section (#333)
- Add four new case studies: Unitree G1, Dragos CTF, HackerOne, PortSwigger (#345)
- Add environment variables reference guide (#330)
- Add installation guides for CAI Pro v0.5 and v0.6 (#312)
- Document parallel agents functionality (#337)
- Document --continue mode for session resumption
- Document open router selection capabilities
- Add CAI_TOOL_TIMEOUT to environment docs
- Add Azure OpenAI provider configuration (#273)
Bug fixes
- Fix missing import sys error (#335)
- Fix TUI documentation issues and CAI-Pro links (#328)
- Various stability improvements and error handling enhancements
Adds --header/-H flag support to `/mcp load` for authenticated MCP servers
like Hack The Box. Handles long Bearer tokens that wrap across terminal lines.
Changes:
- Added --header/-H flag parsing in mcp.py handle_load() method
- Parse "Key: Value" format headers and strip quotes
- Pass headers to MCPServerSseParams
- Fix CLI command parsing to handle newlines from terminal wrapping
- Use shlex.split() for proper quote handling in pasted commands
Example usage:
/mcp load https://mcp.ai.hackthebox.com/v1/ctf/sse htb --header "Authorization: Bearer TOKEN"
Tested with HTB MCP server - successfully connects with 13 tools.
Developed by Claude Sonnet 4 with guidance from @AgeOfAlgorithms
Co-authored-by: AgeOfAlgorithms <AgeOfAlgorithms@pm.me>