{"record":{"id":"a3cb66eb3ee2801b","repo":"mudler/LocalAI","slug":"inline-reward-function-name-has-no-code","errorCode":null,"errorMessage":"Inline reward function '{name}' has no code","messagePattern":"Inline reward function '(.+?)' has no code","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"backend/python/trl/reward_functions.py","lineNumber":251,"sourceCode":"                        try:\n                            typed_params[k] = float(v)\n                        except (ValueError, TypeError):\n                            typed_params[k] = v\n                func = functools.partial(func, **typed_params)\n            reward_funcs.append(func)\n\n        elif spec_type == \"inline\":\n            if not _inline_rewards_allowed():\n                raise ValueError(\n                    f\"Inline reward function '{name}' rejected: inline reward code \"\n                    f\"executes arbitrary Python and is disabled by default. Set \"\n                    f\"{ALLOW_INLINE_ENV}=true on the backend to enable it (only on a \"\n                    f\"trusted, access-controlled instance), or use a builtin reward \"\n                    f\"function instead.\"\n                )\n            code = spec.get(\"code\", \"\")\n            if not code.strip():\n                raise ValueError(f\"Inline reward function '{name}' has no code\")\n            func = compile_inline_reward(name, code)\n            reward_funcs.append(func)\n\n        else:\n            raise ValueError(f\"Unknown reward function type '{spec_type}'. Use 'builtin' or 'inline'\")\n\n    return reward_funcs\n","sourceCodeStart":233,"sourceCodeEnd":259,"githubUrl":"https://github.com/mudler/LocalAI/blob/44413a9d06bf5bc52ce088ba8ca74e5a2e8bee26/backend/python/trl/reward_functions.py#L233-L259","documentation":"An inline reward spec passed the enablement gate but its 'code' field is empty or whitespace-only, so there is nothing to compile into _user_reward_<name>. The check runs before compile_inline_reward, failing fast with the spec's name.","triggerScenarios":"spec = {'type':'inline','name':'my_reward'} with code omitted; code='' after template substitution or string stripping removed everything; JSON key typo 'Code' vs 'code'.","commonSituations":"Templated request builders that insert code conditionally; YAML configs where the block scalar was accidentally empty; case-sensitive key mismatch.","solutions":["Provide a non-empty code string defining def _user_reward_<name>(...).","Verify the JSON key is exactly 'code' (lowercase).","Test the spec dict before sending: assert spec.get('code','').strip()."],"exampleFix":"# before\n{\"type\": \"inline\", \"name\": \"len\"}\n# after\n{\"type\": \"inline\", \"name\": \"len\", \"code\": \"def _user_reward_len(c, **kw):\\n    return [float(len(x)) for x in c]\"}","handlingStrategy":"validation","validationCode":"def inline_spec_has_code(spec: dict) -> bool:\n    return bool(str(spec.get(\"code\", \"\")).strip())","typeGuard":null,"tryCatchPattern":"try:\n    func = compile_inline_reward(name, code)\nexcept ValueError as e:\n    if \"has no code\" in str(e):\n        return validation_error(field=\"code\", message=\"inline reward needs a non-empty code body\")\n    raise","preventionTips":["Assert spec['code'].strip() in request builders.","Use lint/CI on reward snippet strings.","Keep key names lowercase ('code', 'name', 'type')."],"tags":["trl","reward-functions","inline-code","validation","localai"],"backgroundTag":null,"analyzedSha":"44413a9d06bf5bc52ce088ba8ca74e5a2e8bee26","analyzedAt":"2026-08-15T10:13:50.291Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}