{"record":{"id":"832939dd2ef360a4","repo":"xtekky/gpt4free","slug":"data-code-data-details","errorCode":null,"errorMessage":"{data['code']}:{data['details']}","messagePattern":"\\{data\\['code'\\]\\}:\\{data\\['details'\\]\\}","errorType":"exception","errorClass":"RateLimitError","httpStatus":null,"severity":"error","filePath":"g4f/Provider/Qwen.py","lineNumber":334,"sourceCode":"            file_name = file_name or f\"file-{len(data_bytes)}{extension}\"\r\n            file_size = len(data_bytes)\r\n\r\n            # Get File Url\r\n            async with session.post(\r\n                f\"{cls.url}/api/v2/files/getstsToken\",\r\n                json={\r\n                    \"filename\": file_name,\r\n                    \"filesize\": file_size,\r\n                    \"filetype\": file_type,\r\n                },\r\n                headers=headers,\r\n            ) as r:\r\n                await raise_for_status(r, \"Create file failed\")\r\n                res_data = await r.json()\r\n                data = res_data.get(\"data\")\r\n\r\n                if res_data[\"success\"] is False:\r\n                    raise RateLimitError(f\"{data['code']}:{data['details']}\")\r\n                file_url = data.get(\"file_url\")\r\n                file_id = data.get(\"file_id\")\r\n\r\n            # Put File into Url\r\n            str_date = datetime.datetime.now(datetime.timezone.utc).strftime(\r\n                \"%Y%m%dT%H%M%SZ\"\r\n            )\r\n            headers_put = get_oss_headers(\"PUT\", str_date, data, file_type)\r\n            async with session.put(\r\n                file_url.split(\"?\")[0], data=data_bytes, headers=headers_put\r\n            ) as response:\r\n                await raise_for_status(response)\r\n\r\n            file_class: Literal[\"default\", \"vision\", \"video\", \"audio\", \"document\"]\r\n            _type: Literal[\"file\", \"image\", \"video\", \"audio\"]\r\n            show_type: Literal[\"file\", \"image\", \"video\", \"audio\"]\r\n            if \"image\" in file_type:\r\n                _type = \"image\"\r","sourceCodeStart":316,"sourceCodeEnd":352,"githubUrl":"https://github.com/xtekky/gpt4free/blob/973504e1770928ed5fb82f43da528f441ad9ddc3/g4f/Provider/Qwen.py#L316-L352","documentation":"Raised as RateLimitError during Qwen's file registration step: the POST that registers filename/size/type returned success=false with code and details fields (raise_for_status passed, so HTTP was 2xx but the API refused). The embedded 'code:details' string names the upstream reason — commonly quota, file-type, or rate limits.","triggerScenarios":"Calling Qwen with media attachments when chat.qwen.ai's create-file API rejects the registration: free-tier file quota exhausted, too many uploads in a short window, unsupported file type, or invalid/expired cookies making the API refuse instead of 401.","commonSituations":"Repeated runs uploading the same files (quota accumulates); anonymous cookie jar (generate_cookies) flagged; large batches of media; g4f's OSS upload flow out of sync with API changes.","solutions":["Read the embedded code:details — 'rate limit' means wait/retry; quota means clean up uploaded files on chat.qwen.ai or wait for reset.","Reduce number/size of attachments per request.","Retry after a delay; the outer loop invalidates state but file quota errors need time.","Update g4f for current Qwen API behavior."],"exampleFix":"# before\nresp = await Qwen.create_async_generator(model, msgs, media=[('big.png', png_bytes), ('big2.png', png2_bytes)])\n\n# after - one attachment, retry on RateLimitError\nfor attempt in range(3):\n    try:\n        resp = await Qwen.create_async_generator(model, msgs, media=[('big.png', png_bytes)])\n        break\n    except RateLimitError:\n        await asyncio.sleep(60)","handlingStrategy":"retry","validationCode":"from pathlib import Path\n\ndef qwen_file_ok(name: str, size: int) -> bool:\n    return Path(name).suffix.lower() in {'.png','.jpg','.jpeg','.pdf','.txt','.md'} and size <= 20*1024*1024","typeGuard":null,"tryCatchPattern":"from g4f.errors import RateLimitError\ntry:\n    resp = await Qwen.create_async_generator(model, msgs, media=media)\nexcept RateLimitError as e:\n    if 'file' in str(e).lower() or ':' in str(e):\n        await asyncio.sleep(120)\n        resp = await Qwen.create_async_generator(model, msgs, media=media)\n    else:\n        raise","preventionTips":["Limit attachments per request","Wait out quota windows instead of immediate retries","Read embedded code:details to separate quota vs rate-limit","Clean up uploaded files on chat.qwen.ai periodically"],"tags":["qwen","file-upload","rate-limit","quota","media"],"backgroundTag":null,"analyzedSha":"973504e1770928ed5fb82f43da528f441ad9ddc3","analyzedAt":"2026-08-14T23:45:32.408Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}