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

  1. Verify provider and modelId against get_available_models() output before calling set_model
  2. Upgrade the server so set_model returns a full ModelInfo payload
  3. Log the raw set_model payload to see what the server returned
  4. 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

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


AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31). Data as JSON: /api/errors/67a5da2974f9d330. Report an issue: GitHub.