How to test the self-hosted sim-copilot-proxy (OpenRouter) on a white-labeled Sim Studio instance.
RAILWAY_API_KEY — Railway API token for inspecting service status and logsOPENROUTER_API_KEY env var on the proxy service in Railway)The Copilot chat flow:
/workspace/{id}/home)/api/mothership/chat on the Sim serverSIM_AGENT_API_URL env varqwen/qwen3.5-plus-02-15)start — stream beginschat_id — chat identifier (triggers URL change to /task/{chatId})content — response text chunksreasoning — model thinking/reasoning textdone — stream completeerror — error occurredcurl https://<proxy-url>/healthExpect: {"status":"ok","version":"2.0.0",...}
Use Railway API to verify all 6 services are running:
The simstudio service's SIM_AGENT_API_URL env var must point to the proxy's Railway URL, NOT https://www.copilot.sim.ai.
The Sim Studio Home page uses a React-controlled <textarea> for chat input. The browser tool's type action sets the DOM value but does NOT trigger React's synthetic event system, so the send button stays disabled.
// Step 1: Set value via native setter
const textarea = document.querySelector('textarea');
textarea.focus();
const text = 'Your message here';
const nativeInputValueSetter = Object.getOwnPropertyDescriptor(
window.HTMLTextAreaElement.prototype, 'value'
).set;
nativeInputValueSetter.call(textarea, text);
// Step 2: Dispatch InputEvent to trigger React state update
const inputEvent = new InputEvent('input', {
bubbles: true, cancelable: false,
inputType: 'insertText', data: text
});
textarea.dispatchEvent(inputEvent);After this, the send button becomes enabled (no disabled attribute). Click it via the browser tool's click action using its devinid.
If CDP is available at http://localhost:29229, Playwright's textarea.fill() method properly triggers React state updates. However, CDP may not always be available on the VM.
/home to /task/{uuid} (proves chat_id SSE event was received)Ask "What AI model are you?" — if the response says "Claude", the proxy might not be working and requests may be falling through to copilot.sim.ai. The proxy routes through OpenRouter, so the response should NOT self-identify as Claude.
phase:"thinking" but the browser expects phase:"start"/phase:"end" boundary markers. Reasoning content renders as plain text instead of in a collapsible thinking block. This is cosmetic only.{data: {requestId}} but browser expects a string. Only affects logging, not user-facing behavior./api/mothership endpoint. This was added in PR #1.REDIS_URL is correct on simstudio, realtime, and sim-worker services.itsablabla/jada-ironman
5667aa0
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.