Git cloned as the installer had the same problem.
Ran through the manual install steps, ran the doctor, and had the following issue:
python3 scripts/doctor.py
UltraCode-Shim doctor
repo: /home/ray/UltraCode-Shim
[ok] python 3.10.12
[ok] proxy.py present and compiles
[ok] claude CLI on PATH: /home/ray/.local/bin/claude
[note] no config.json yet - validating config.example.json (the launcher copies it to config.json on first run)
[ok] config parses: config.example.json
[ok] config has 14 model(s) and 14 route(s)
[ok] all advertised model ids are discoverable and routed
[ok] stock Claude models (Opus/Sonnet/Haiku) will also appear in /model (real Claude never drops out; disable with UC_INCLUDE_STOCK_MODELS=0)
[ok] stock-model auto-learning is ON - the proxy learns new Claude ids from upstream /v1/models, so a future Opus shows up automatically (disable with UC_STOCK_LEARN=0)
[note] route 'claude-gpt-5.5-codex': no /home/ray/.codex/auth.json - run `codex login` before using it
[note] route 'claude-minimax-m3': auth still has a placeholder (Bearer REPLACE_WITH_YOUR_MINIMAX_KEY) - put your real key there
[note] route 'claude-mimo': auth still has a placeholder (Bearer REPLACE_WITH_YOUR_MIMO_KEY) - put your real key there
[note] route 'claude-deepseek-v4-pro': auth still has a placeholder (Bearer REPLACE_WITH_YOUR_DEEPSEEK_KEY) - put your real key there
[note] route 'claude-deepseek-v4-flash': auth still has a placeholder (Bearer REPLACE_WITH_YOUR_DEEPSEEK_KEY) - put your real key there
[note] route 'claude-step-flash': auth still has a placeholder (Bearer REPLACE_WITH_YOUR_STEPFUN_KEY) - put your real key there
[note] route 'claude-ollama-cloud': auth still has a placeholder (Bearer REPLACE_WITH_YOUR_OLLAMA_KEY) - put your real key there
[note] route 'claude-opencode': auth still has a placeholder (Bearer REPLACE_WITH_YOUR_OPENCODE_KEY) - put your real key there
[note] route 'claude-openrouter': auth still has a placeholder (Bearer REPLACE_WITH_YOUR_OPENROUTER_KEY) - put your real key there
[note] route 'claude-requesty': REQUESTY_API_KEY not set yet (example backend; set it once you keep this route)
[note] route 'claude-composer': cursor-agent not found - install it and run `cursor-agent login` (this backend is experimental)
[ok] router: picker 'claude-auto' is a model + type:auto route
[ok] router: threshold 0.70
[ok] router: 4 candidate backend(s) available
[ok] router: classifier 'claude-mimo' is configured
[ok] directives: present but disabled (no-op)
[ok] port 8141 is free
running offline self-test (test_proxy.py)...
[ok] healthz + codex helper importable
[ok] /v1/models discovery merge (stock + custom, deduped): ['claude-opus-4-8', 'claude-opus-4-7', 'claude-sonnet-4-6', 'claude-haiku-4-5', 'claude-mock', 'claude-retry', 'claude-auto', 'claude-cheap', 'claude-strong', 'claude-pass[1m]', 'claude-passkeep[1m]', 'claude-worker-mock', 'claude-worker-retry', 'claude-worker-auto', 'claude-worker-cheap', 'claude-worker-strong', 'claude-worker-pass', 'claude-worker-passkeep']
[ok] healthz reports Auto Router config
[ok] UltraCode envelope on passthrough (xhigh/adaptive/64k/reminder)
[ok] openai_compat streaming tool-call -> Anthropic tool_use
[ok] empty turn auto-retried -> recovered (upstream hit 2x)
[ok] auto router: trivial task -> cheapest viable candidate (claude-cheap)
[ok] auto router: hard task escalates to the strong candidate (claude-strong)
[ok] ${ENV} expansion in route auth
[ok] stock Claude models: fallback list, disable toggle, override parsing
[ok] stock auto-learn: learn-from-upstream, cache persist/reload, override+disable
[ok] auto router unit: selection / image-reject / score-parse / signal
[09:48:44] directives: 10 alias(es) over claude-auto, claude-composer, claude-gpt-5.5-codex, claude-opus; planner=claude-opus
[09:48:44] directives: 6 alias(es) over claude-gpt-5.5-codex, claude-ollama
[ok] routing directives: opt-in default-off / NL opt-in / surgical strip / planner-gated / gpt-collision / dispatch / [1m] strip + advertise
[ok] openai_compat long-context hygiene: tool-only content=null + context hint
[ok] rejected/partial tool calls stay valid for strict backends (issue #3)
[ok] image forwarding: user image -> openai_compat image_url + codex input_image
[ok] tool_result images forwarded (computer-use/screenshots) -> user image + codex input_image
[09:48:44] orchestrator+worker enabled: 2 model(s), worker ids: claude-worker-mimo, claude-worker-mock
[ok] orchestrator+worker: picker entries, tier routing, stock-traffic capture
[ok] /uc/select endpoint: GET lists models, POST pre-sets tiers
[ok] #19 loopback Host-header guard: 403 on non-local Host
Traceback (most recent call last):
File "/usr/lib/python3.10/urllib/request.py", line 1348, in do_open
h.request(req.get_method(), req.selector, req.data, headers,
File "/usr/lib/python3.10/http/client.py", line 1312, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/usr/lib/python3.10/http/client.py", line 1358, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/usr/lib/python3.10/http/client.py", line 1307, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/usr/lib/python3.10/http/client.py", line 1106, in _send_output
self.send(chunk)
File "/usr/lib/python3.10/http/client.py", line 1028, in send
self.sock.sendall(data)
BrokenPipeError: [Errno 32] Broken pipe
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/ray/UltraCode-Shim/test_proxy.py", line 813, in <module>
sys.exit(main())
File "/home/ray/UltraCode-Shim/test_proxy.py", line 703, in main
urllib.request.urlopen(urllib.request.Request(
File "/usr/lib/python3.10/urllib/request.py", line 216, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python3.10/urllib/request.py", line 519, in open
response = self._open(req, data)
File "/usr/lib/python3.10/urllib/request.py", line 536, in _open
result = self._call_chain(self.handle_open, protocol, protocol +
File "/usr/lib/python3.10/urllib/request.py", line 496, in _call_chain
result = func(*args)
File "/usr/lib/python3.10/urllib/request.py", line 1377, in http_open
return self.do_open(http.client.HTTPConnection, req)
File "/usr/lib/python3.10/urllib/request.py", line 1351, in do_open
raise URLError(err)
urllib.error.URLError: <urlopen error [Errno 32] Broken pipe>
[FAIL] self-test failed (see output above)
Result: 14 ok, 12 notes, 1 failures
Fix the [FAIL] lines above, then re-run: python3 scripts/doctor.py
Looking at the trouble-shooting steps, I ran with the --no-test:
python3 scripts/doctor.py --no-test
UltraCode-Shim doctor
repo: /home/ray/UltraCode-Shim
[ok] python 3.10.12
[ok] proxy.py present and compiles
[ok] claude CLI on PATH: /home/ray/.local/bin/claude
[note] no config.json yet - validating config.example.json (the launcher copies it to config.json on first run)
[ok] config parses: config.example.json
[ok] config has 14 model(s) and 14 route(s)
[ok] all advertised model ids are discoverable and routed
[ok] stock Claude models (Opus/Sonnet/Haiku) will also appear in /model (real Claude never drops out; disable with UC_INCLUDE_STOCK_MODELS=0)
[ok] stock-model auto-learning is ON - the proxy learns new Claude ids from upstream /v1/models, so a future Opus shows up automatically (disable with UC_STOCK_LEARN=0)
[note] route 'claude-gpt-5.5-codex': no /home/ray/.codex/auth.json - run `codex login` before using it
[note] route 'claude-minimax-m3': auth still has a placeholder (Bearer REPLACE_WITH_YOUR_MINIMAX_KEY) - put your real key there
[note] route 'claude-mimo': auth still has a placeholder (Bearer REPLACE_WITH_YOUR_MIMO_KEY) - put your real key there
[note] route 'claude-deepseek-v4-pro': auth still has a placeholder (Bearer REPLACE_WITH_YOUR_DEEPSEEK_KEY) - put your real key there
[note] route 'claude-deepseek-v4-flash': auth still has a placeholder (Bearer REPLACE_WITH_YOUR_DEEPSEEK_KEY) - put your real key there
[note] route 'claude-step-flash': auth still has a placeholder (Bearer REPLACE_WITH_YOUR_STEPFUN_KEY) - put your real key there
[note] route 'claude-ollama-cloud': auth still has a placeholder (Bearer REPLACE_WITH_YOUR_OLLAMA_KEY) - put your real key there
[note] route 'claude-opencode': auth still has a placeholder (Bearer REPLACE_WITH_YOUR_OPENCODE_KEY) - put your real key there
[note] route 'claude-openrouter': auth still has a placeholder (Bearer REPLACE_WITH_YOUR_OPENROUTER_KEY) - put your real key there
[note] route 'claude-requesty': REQUESTY_API_KEY not set yet (example backend; set it once you keep this route)
[note] route 'claude-composer': cursor-agent not found - install it and run `cursor-agent login` (this backend is experimental)
[ok] router: picker 'claude-auto' is a model + type:auto route
[ok] router: threshold 0.70
[ok] router: 4 candidate backend(s) available
[ok] router: classifier 'claude-mimo' is configured
[ok] directives: present but disabled (no-op)
[ok] port 8141 is free
Result: 14 ok, 12 notes, 0 failures
Looks good. Run the installer to set up config.json + the `ultracode` command:
mac/linux/WSL: ./install.sh
windows: .\install.ps1
I then performed a git pull
git pull
Already up to date.
I then ran the proxy test on its own
python3 test_proxy.py
[ok] healthz + codex helper importable
[ok] /v1/models discovery merge (stock + custom, deduped): ['claude-opus-4-8', 'claude-opus-4-7', 'claude-sonnet-4-6', 'claude-haiku-4-5', 'claude-mock', 'claude-retry', 'claude-auto', 'claude-cheap', 'claude-strong', 'claude-pass[1m]', 'claude-passkeep[1m]', 'claude-worker-mock', 'claude-worker-retry', 'claude-worker-auto', 'claude-worker-cheap', 'claude-worker-strong', 'claude-worker-pass', 'claude-worker-passkeep']
[ok] healthz reports Auto Router config
[ok] UltraCode envelope on passthrough (xhigh/adaptive/64k/reminder)
[ok] openai_compat streaming tool-call -> Anthropic tool_use
[ok] empty turn auto-retried -> recovered (upstream hit 2x)
[ok] auto router: trivial task -> cheapest viable candidate (claude-cheap)
[ok] auto router: hard task escalates to the strong candidate (claude-strong)
[ok] ${ENV} expansion in route auth
[ok] stock Claude models: fallback list, disable toggle, override parsing
[ok] stock auto-learn: learn-from-upstream, cache persist/reload, override+disable
[ok] auto router unit: selection / image-reject / score-parse / signal
[09:54:56] directives: 10 alias(es) over claude-auto, claude-composer, claude-gpt-5.5-codex, claude-opus; planner=claude-opus
[09:54:56] directives: 6 alias(es) over claude-gpt-5.5-codex, claude-ollama
[ok] routing directives: opt-in default-off / NL opt-in / surgical strip / planner-gated / gpt-collision / dispatch / [1m] strip + advertise
[ok] openai_compat long-context hygiene: tool-only content=null + context hint
[ok] rejected/partial tool calls stay valid for strict backends (issue #3)
[ok] image forwarding: user image -> openai_compat image_url + codex input_image
[ok] tool_result images forwarded (computer-use/screenshots) -> user image + codex input_image
[09:54:56] orchestrator+worker enabled: 2 model(s), worker ids: claude-worker-mimo, claude-worker-mock
[ok] orchestrator+worker: picker entries, tier routing, stock-traffic capture
[ok] /uc/select endpoint: GET lists models, POST pre-sets tiers
[ok] #19 loopback Host-header guard: 403 on non-local Host
Traceback (most recent call last):
File "/usr/lib/python3.10/urllib/request.py", line 1348, in do_open
h.request(req.get_method(), req.selector, req.data, headers,
File "/usr/lib/python3.10/http/client.py", line 1312, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/usr/lib/python3.10/http/client.py", line 1358, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/usr/lib/python3.10/http/client.py", line 1307, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/usr/lib/python3.10/http/client.py", line 1106, in _send_output
self.send(chunk)
File "/usr/lib/python3.10/http/client.py", line 1028, in send
self.sock.sendall(data)
BrokenPipeError: [Errno 32] Broken pipe
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/ray/UltraCode-Shim/test_proxy.py", line 813, in <module>
sys.exit(main())
File "/home/ray/UltraCode-Shim/test_proxy.py", line 703, in main
urllib.request.urlopen(urllib.request.Request(
File "/usr/lib/python3.10/urllib/request.py", line 216, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python3.10/urllib/request.py", line 519, in open
response = self._open(req, data)
File "/usr/lib/python3.10/urllib/request.py", line 536, in _open
result = self._call_chain(self.handle_open, protocol, protocol +
File "/usr/lib/python3.10/urllib/request.py", line 496, in _call_chain
result = func(*args)
File "/usr/lib/python3.10/urllib/request.py", line 1377, in http_open
return self.do_open(http.client.HTTPConnection, req)
File "/usr/lib/python3.10/urllib/request.py", line 1351, in do_open
raise URLError(err)
urllib.error.URLError: <urlopen error [Errno 32] Broken pipe>
Git cloned as the installer had the same problem.
Ran through the manual install steps, ran the doctor, and had the following issue:
Looking at the trouble-shooting steps, I ran with the
--no-test:I then performed a
git pullI then ran the proxy test on its own