{"record":{"id":"8deecce19fc16778","repo":"iflytek/astron-agent","slug":"audio-data-must-be-valid-base64-encoded-string","errorCode":null,"errorMessage":"audio_data must be valid base64 encoded string","messagePattern":"audio_data must be valid base64 encoded string","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"core/plugin/aitools/service/ise/ise_evaluate_service.py","lineNumber":55,"sourceCode":"    @field_validator(\"group\")\n    @classmethod\n    def validate_group(cls, value: str) -> str:\n        \"\"\"Validate group\"\"\"\n        valid_groups = [\"pupil\", \"youth\", \"adult\"]\n        if value not in valid_groups:\n            raise ValueError(f\"Invalid group: {value}. Valid options: {valid_groups}\")\n        return value\n\n    @field_validator(\"audio_data\")\n    @classmethod\n    def validate_audio_data(cls, value: str) -> str:\n        \"\"\"Validate audio_data\"\"\"\n        if not value:\n            raise ValueError(\"audio_data cannot be empty\")\n        try:\n            base64.b64decode(value)\n        except Exception as exc:\n            raise ValueError(\"audio_data must be valid base64 encoded string\") from exc\n        return value\n\n\n@api_service(\n    method=\"POST\",\n    path=\"/aitools/v1/ise\",\n    query=None,\n    body=ISEInput,\n    response=BaseResponse,\n    summary=\"ISE Evaluation\",\n    description=\"ISE Evaluation\",\n    tags=[\"public_cn\"],\n    deprecated=True,\n)\nasync def ise_evaluate_service(body: ISEInput, request: Request) -> BaseResponse:\n    \"\"\"ISE Evaluation Service\"\"\"\n    credentials = get_iflytek_open_platform_credentials()\n","sourceCodeStart":37,"sourceCodeEnd":73,"githubUrl":"https://github.com/iflytek/astron-agent/blob/5e758547a83371a5a4b29dadf4ac03e8dd527635/core/plugin/aitools/service/ise/ise_evaluate_service.py#L37-L73","documentation":"Pydantic field_validator on audio_data: the provided string fails base64.b64decode, so the request is rejected as malformed. Clients must send properly base64-encoded audio bytes for the ISE oral evaluation.","triggerScenarios":"Passing raw binary bytes str-ified, a data-URI ('data:audio/wav;base64,...'), whitespace-corrupted, or otherwise malformed base64 in audio_data.","commonSituations":"Including the 'data:' URI prefix from a browser FileReader result; double-encoding; newline characters injected by JSON transports; sending hex instead of base64.","solutions":["Send only the raw base64 payload (strip any 'data:...;base64,' prefix)","Encode with base64.b64encode(audio_bytes).decode('ascii')","Verify with base64.b64decode(value, validate=True) before sending; remove embedded newlines"],"exampleFix":"// before\naudio_data = 'data:audio/wav;base64,' + b64  # fails decode\n// after\naudio_data = base64.b64encode(audio_bytes).decode('ascii')","handlingStrategy":"validation","validationCode":"import base64, binascii\ntry:\n    base64.b64decode(audio_data, validate=True)\nexcept (binascii.Error, ValueError):\n    raise ValueError('audio_data must be plain base64, no data: URI prefix')","typeGuard":null,"tryCatchPattern":"try:\n    req = IseEvaluateRequest(audio_data=audio_data, text=text)\nexcept ValidationError as e:\n    if any('base64' in str(err['msg']) for err in e.errors()):\n        audio_data = audio_data.split(',', 1)[-1].replace('\\n', '')\n        req = IseEvaluateRequest(audio_data=audio_data, text=text)","preventionTips":["Always produce base64 via base64.b64encode(...).decode('ascii')","Strip 'data:...;base64,' prefixes from browser FileReader output","Validate with b64decode(value, validate=True) in tests"],"tags":["base64","validation","audio"],"backgroundTag":"invalid-argument-format","analyzedSha":"5e758547a83371a5a4b29dadf4ac03e8dd527635","analyzedAt":"2026-09-12T08:03:51.356Z","contentChangedAt":"2026-09-12T08:03:51.356Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}