{"record":{"id":"a12877dfed33cf1c","repo":"xtekky/gpt4free","slug":"curl-cffi-formdata-is-not-available-on-this-platfo","errorCode":null,"errorMessage":"curl_cffi FormData is not available on this platform","messagePattern":"curl_cffi FormData is not available on this platform","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"g4f/requests/curl_cffi.py","lineNumber":165,"sourceCode":"\n    class StreamSession:\n        def __init__(self, *args, **kwargs):\n            raise ImportError(\"curl_cffi is not available on this platform\")\n\n\nif has_curl_cffi and has_curl_mime:\n\n    class FormData(CurlMime):\n        def add_field(\n            self, name, data=None, content_type: str = None, filename: str = None\n        ) -> None:\n            self.addpart(name, content_type=content_type, filename=filename, data=data)\n\nelse:\n\n    class FormData:\n        def __init__(self) -> None:\n            raise RuntimeError(\"curl_cffi FormData is not available on this platform\")\n\n\nif has_curl_cffi and has_curl_ws:\n\n    class WebSocket:\n        def __init__(self, session, url, **kwargs) -> None:\n            self.session: StreamSession = session\n            self.url: str = url\n            if \"autoping\" in kwargs:\n                del kwargs[\"autoping\"]\n            self.options: dict = kwargs\n\n        async def __aenter__(self):\n            self.inner = await self.session._ws_connect(self.url, **self.options)\n            return self\n\n        async def __aexit__(self, *args):\n            await self.inner.aclose() if hasattr(","sourceCodeStart":147,"sourceCodeEnd":183,"githubUrl":"https://github.com/xtekky/gpt4free/blob/973504e1770928ed5fb82f43da528f441ad9ddc3/g4f/requests/curl_cffi.py#L147-L183","documentation":"Constructor of the stub FormData class in g4f/requests/curl_cffi.py, used when curl_cffi is missing OR the extra symbol CurlMime could not be imported (has_curl_mime is a separate flag). Instantiating it raises RuntimeError('curl_cffi FormData is not available on this platform'). FormData wraps CurlMime for multipart uploads, so multipart support depends on both curl_cffi itself and its CurlMime API being present.","triggerScenarios":"Calling FormData() (or a g4f request path that uploads files) when curl_cffi is entirely absent, or when an installed curl_cffi version is old enough that `from curl_cffi import CurlMime` fails while the base package imports fine.","commonSituations":"Old pinned curl_cffi versions predating CurlMime; minimal installs; attempting file-upload providers on aiohttp-only environments where the curl_cffi FormData was imported unconditionally.","solutions":["pip install -U curl_cffi to get a version that exposes CurlMime.","Check both flags if diagnosing in code: g4f.requests.curl_cffi.has_curl_cffi and has_curl_mime.","If multipart is required but curl_cffi cannot work on the platform, use the aiohttp FormData equivalent from the fallback backend instead."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"from g4f.requests.curl_cffi import has_curl_cffi, has_curl_mime\n\nmultipart_ok = has_curl_cffi and has_curl_mime","typeGuard":null,"tryCatchPattern":"try:\n    form = FormData()\nexcept RuntimeError as e:\n    if \"FormData\" in str(e):\n        from aiohttp import FormData as AiohttpFormData\n        form = AiohttpFormData()  # fallback multipart container\n    else:\n        raise","preventionTips":["Require a recent curl_cffi (CurlMime present) in requirements when uploads are needed.","Check has_curl_mime before building multipart payloads.","Run CI on all platforms where uploads happen to catch stub classes early."],"tags":["curl-cffi","multipart","form-data","version-mismatch","missing-dependency"],"backgroundTag":null,"analyzedSha":"973504e1770928ed5fb82f43da528f441ad9ddc3","analyzedAt":"2026-08-14T23:45:32.408Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}