Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Error: filename doesn't exist (and docs are inconsistent with SDK) #155

Open
CakeCrusher opened this issue Jan 9, 2025 · 0 comments
Open

Comments

@CakeCrusher
Copy link

CakeCrusher commented Jan 9, 2025

(if you think this is solvable through the SDK alone, happy to submit a PR, in that instance any guidance would be awesome)
To reproduce:

from writerai import Writer
from dotenv import load_dotenv
import os

load_dotenv()

WRITER_API_KEY = os.getenv("WRITER_API_KEY")
WRITER_APP_ID = os.getenv("WRITER_APP_ID")
if not WRITER_API_KEY or not WRITER_APP_ID:
    raise ValueError("missing env vars")

client = Writer(api_key=WRITER_API_KEY)

file = client.files.upload(
  content=b'raw file contents',
  content_disposition='attachment; filename*=utf-8''test.txt',
  content_type='application/txt'
)

Error message:

---------------------------------------------------------------------------
BadRequestError                           Traceback (most recent call last)
Cell In[1], [line 14](vscode-notebook-cell:?execution_count=1&line=14)
     [10](vscode-notebook-cell:?execution_count=1&line=10)     raise ValueError("missing env vars")
     [12](vscode-notebook-cell:?execution_count=1&line=12) client = Writer(api_key=WRITER_API_KEY)
---> [14](vscode-notebook-cell:?execution_count=1&line=14) file = client.files.upload(
     [15](vscode-notebook-cell:?execution_count=1&line=15)   content=b'raw file contents',
     [16](vscode-notebook-cell:?execution_count=1&line=16)   content_disposition='attachment; filename*=utf-8''test.txt',
     [17](vscode-notebook-cell:?execution_count=1&line=17)   content_type='application/txt'
     [18](vscode-notebook-cell:?execution_count=1&line=18) )

File c:\Notes\writer\.venv\lib\site-packages\writerai\resources\files.py:291, in FilesResource.upload(self, content, content_disposition, content_type, extra_headers, extra_query, extra_body, timeout)
    [274](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/resources/files.py:274) """
    [275](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/resources/files.py:275) Upload file
    [276](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/resources/files.py:276) 
   (...)
    [284](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/resources/files.py:284)   timeout: Override the client-level default timeout for this request, in seconds
    [285](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/resources/files.py:285) """
    [286](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/resources/files.py:286) extra_headers = {
    [287](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/resources/files.py:287)     "Content-Disposition": content_disposition,
    [288](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/resources/files.py:288)     "Content-Type": content_type,
    [289](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/resources/files.py:289)     **(extra_headers or {}),
    [290](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/resources/files.py:290) }
--> [291](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/resources/files.py:291) return self._post(
    [292](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/resources/files.py:292)     "/v1/files",
    [293](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/resources/files.py:293)     options=make_request_options(
    [294](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/resources/files.py:294)         extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
    [295](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/resources/files.py:295)     ),
    [296](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/resources/files.py:296)     binary_request=content,
    [297](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/resources/files.py:297)     cast_to=File,
    [298](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/resources/files.py:298) )

File c:\Notes\writer\.venv\lib\site-packages\writerai\_base_client.py:1275, in SyncAPIClient.post(self, path, cast_to, body, options, files, binary_request, stream, stream_cls)
   [1255](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:1255) def post(
   [1256](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:1256)     self,
   [1257](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:1257)     path: str,
   (...)
   [1265](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:1265)     stream_cls: type[_StreamT] | None = None,
   [1266](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:1266) ) -> ResponseT | _StreamT:
   [1267](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:1267)     opts = FinalRequestOptions.construct(
   [1268](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:1268)         method="post",
   [1269](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:1269)         url=path,
   (...)
   [1273](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:1273)         **options,
   [1274](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:1274)     )
-> [1275](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:1275)     return cast(ResponseT, self.request(cast_to, opts, stream=stream, stream_cls=stream_cls))

File c:\Notes\writer\.venv\lib\site-packages\writerai\_base_client.py:958, in SyncAPIClient.request(self, cast_to, options, remaining_retries, stream, stream_cls)
    [955](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:955) else:
    [956](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:956)     retries_taken = 0
--> [958](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:958) return self._request(
    [959](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:959)     cast_to=cast_to,
    [960](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:960)     options=options,
    [961](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:961)     stream=stream,
    [962](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:962)     stream_cls=stream_cls,
    [963](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:963)     retries_taken=retries_taken,
    [964](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:964) )

File c:\Notes\writer\.venv\lib\site-packages\writerai\_base_client.py:1061, in SyncAPIClient._request(self, cast_to, options, retries_taken, stream, stream_cls)
   [1058](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:1058)         err.response.read()
   [1060](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:1060)     log.debug("Re-raising status error")
-> [1061](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:1061)     raise self._make_status_error_from_response(err.response) from None
   [1063](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:1063) return self._process_response(
   [1064](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:1064)     cast_to=cast_to,
   [1065](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:1065)     options=options,
   (...)
   [1069](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:1069)     retries_taken=retries_taken,
   [1070](file:///C:/Notes/writer/.venv/lib/site-packages/writerai/_base_client.py:1070) )

BadRequestError: Error code: 400 - {'tpe': 'fail.input.generic', 'errors': [{'description': "filename doesn't exist", 'key': 'fail.input.generic', 'extras': None}], 'extras': None}

Also docs are inconsistent with SDK.
the client.files.upload guidance on doc is missing required content_type
https://dev.writer.com/api-guides/knowledge-graph
image

@CakeCrusher CakeCrusher changed the title Error: filename doesn't exist Error: filename doesn't exist (and docs are inconsistent with SDK) Jan 9, 2025
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant