can1357/oh-my-pi · error · RpcError
set_model returned an empty payload
Error message
set_model returned an empty payload
What it means
set_model() sends a 'set_model' request and runs the payload through parse_model_info(). If the parser yields None (payload empty or missing the fields needed for a ModelInfo), the client raises this RpcError instead of returning a bogus/None model. It means the server acknowledged the switch but did not report back which model is active.
Source
Thrown at python/omp-rpc/src/omp_rpc/client.py:928
"id": request_id,
"cancelled": True,
}
if timed_out:
payload["timedOut"] = True
self._send_notification(payload)
def get_state(self) -> SessionState:
payload = self._request("get_state")
return parse_session_state(payload)
def set_fast_mode(self, enabled: bool) -> FastModeResult:
return parse_fast_mode_result(self._request("set_fast_mode", enabled=enabled))
def set_model(self, provider: str, model_id: str) -> ModelInfo:
payload = self._request("set_model", provider=provider, modelId=model_id)
model = parse_model_info(payload)
if model is None:
raise RpcError("set_model returned an empty payload")
return model
def cycle_model(self) -> ModelCycleResult | None:
return parse_model_cycle_result(self._request("cycle_model"))
def get_available_models(self) -> tuple[ModelInfo, ...]:
payload = self._request("get_available_models")
models = cast(list[JsonObject], payload.get("models") or [])
return tuple(filter(None, (parse_model_info(model) for model in models)))
def set_thinking_level(self, level: ThinkingLevel) -> None:
self._request("set_thinking_level", level=level)
def cycle_thinking_level(self) -> ThinkingLevelCycleResult | None:
return parse_thinking_level_cycle_result(self._request("cycle_thinking_level"))
def set_steering_mode(self, mode: SteeringMode) -> None:
self._request("set_steering_mode", mode=mode)View on GitHub (pinned to 9690622007)
Solutions
- Verify provider and modelId against get_available_models() output before calling set_model
- Upgrade the server so set_model returns a full ModelInfo payload
- Log the raw set_model payload to see what the server returned
- Fall back to cycle_model()/get_state() to confirm the active model after a failure
Example fix
# before: unchecked ids
client.set_model("anthro", "cluad-3") # server returns empty payload
# after: validate against the server's known models
models = client.get_available_models()
match = next((m for m in models if m.provider == "anthropic" and "claude-3" in m.model_id), None)
if match:
client.set_model(match.provider, match.model_id) Defensive patterns
Strategy: validation
Validate before calling
models = client.get_available_models()
valid = any(m.provider == provider and m.model_id == model_id for m in models)
if not valid:
raise ValueError(f"unknown model {provider}/{model_id}")
Type guard
def has_model_info(payload: object) -> bool:
return isinstance(payload, dict) and bool(payload.get("modelId") or payload.get("model"))
Try / catch
try:
model = client.set_model(provider, model_id)
except RpcError as e:
if "empty payload" in str(e):
model = None # verify via get_available_models / retry with corrected ids
else:
raise
Prevention
- Validate provider/modelId against get_available_models() before switching
- Keep client and server on matching versions
- Log the raw set_model payload when debugging
- Avoid mock servers that return bare acks for set_model
When it happens
Trigger: Calling set_model(provider, model_id) where the server responds with an empty object/null or a payload missing the model-info fields parse_model_info requires (e.g. unknown provider/model id on the server, or a server build whose set_model response schema differs).
Common situations: Typo'd or unsupported provider/modelId passed to an older server; server version whose set_model returns a bare ack without ModelInfo; mock servers returning {} for set_model.
Related errors
- get_messages_page response has an invalid totalMessages
- get_messages_page response has an invalid nextCursor
- set_host_tools response did not include toolNames
- set_host_uri_schemes response did not include schemes
- RPC response payload must be an object
AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31).
Data as JSON: /api/errors/67a5da2974f9d330.
Report an issue: GitHub.