{"record":{"id":"67a5da2974f9d330","repo":"can1357/oh-my-pi","slug":"set-model-returned-an-empty-payload","errorCode":null,"errorMessage":"set_model returned an empty payload","messagePattern":"set_model returned an empty payload","errorType":"exception","errorClass":"RpcError","httpStatus":null,"severity":"error","filePath":"python/omp-rpc/src/omp_rpc/client.py","lineNumber":928,"sourceCode":"            \"id\": request_id,\n            \"cancelled\": True,\n        }\n        if timed_out:\n            payload[\"timedOut\"] = True\n        self._send_notification(payload)\n\n    def get_state(self) -> SessionState:\n        payload = self._request(\"get_state\")\n        return parse_session_state(payload)\n\n    def set_fast_mode(self, enabled: bool) -> FastModeResult:\n        return parse_fast_mode_result(self._request(\"set_fast_mode\", enabled=enabled))\n\n    def set_model(self, provider: str, model_id: str) -> ModelInfo:\n        payload = self._request(\"set_model\", provider=provider, modelId=model_id)\n        model = parse_model_info(payload)\n        if model is None:\n            raise RpcError(\"set_model returned an empty payload\")\n        return model\n\n    def cycle_model(self) -> ModelCycleResult | None:\n        return parse_model_cycle_result(self._request(\"cycle_model\"))\n\n    def get_available_models(self) -> tuple[ModelInfo, ...]:\n        payload = self._request(\"get_available_models\")\n        models = cast(list[JsonObject], payload.get(\"models\") or [])\n        return tuple(filter(None, (parse_model_info(model) for model in models)))\n\n    def set_thinking_level(self, level: ThinkingLevel) -> None:\n        self._request(\"set_thinking_level\", level=level)\n\n    def cycle_thinking_level(self) -> ThinkingLevelCycleResult | None:\n        return parse_thinking_level_cycle_result(self._request(\"cycle_thinking_level\"))\n\n    def set_steering_mode(self, mode: SteeringMode) -> None:\n        self._request(\"set_steering_mode\", mode=mode)","sourceCodeStart":910,"sourceCodeEnd":946,"githubUrl":"https://github.com/can1357/oh-my-pi/blob/969062200754ea02cfac922e5ebb8c608c079e15/python/omp-rpc/src/omp_rpc/client.py#L910-L946","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","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"],"exampleFix":"# before: unchecked ids\nclient.set_model(\"anthro\", \"cluad-3\")  # server returns empty payload\n\n# after: validate against the server's known models\nmodels = client.get_available_models()\nmatch = next((m for m in models if m.provider == \"anthropic\" and \"claude-3\" in m.model_id), None)\nif match:\n    client.set_model(match.provider, match.model_id)","handlingStrategy":"validation","validationCode":"models = client.get_available_models()\nvalid = any(m.provider == provider and m.model_id == model_id for m in models)\nif not valid:\n    raise ValueError(f\"unknown model {provider}/{model_id}\")\n","typeGuard":"def has_model_info(payload: object) -> bool:\n    return isinstance(payload, dict) and bool(payload.get(\"modelId\") or payload.get(\"model\"))\n","tryCatchPattern":"try:\n    model = client.set_model(provider, model_id)\nexcept RpcError as e:\n    if \"empty payload\" in str(e):\n        model = None  # verify via get_available_models / retry with corrected ids\n    else:\n        raise\n","preventionTips":["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"],"tags":["rpc","response-validation","model-selection","schema-mismatch"],"backgroundTag":"empty-rpc-response-payload","analyzedSha":"969062200754ea02cfac922e5ebb8c608c079e15","analyzedAt":"2026-08-31T10:29:35.737Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}