ChatPDF API 用 Python wrapper を作成してみた

# TL;DR

* この記事は ChatPDF ユーザー向けです。
* ChatPDF 用の簡単な Python wrapper module である [chatpdf-api-python](https://github.com/Surpris/chatpdf-api-python) を作成しました。
    * この module は **非公式** です。
* chatpdf-api-python は ChatPDF API token を使用します。**この module を利用するにあたり、利用者自身が API token を適切に管理してください。**
* **このモジュールの利用する・しないに関わらず、ChatPDF Backend API の利用回数に制限があることに注意してください。**

# 背景

[ChatPDF](https://www.chatpdf.com/) というサービスがあります。Web ブラウザ上で PDF をアップロードすると、そのファイルの内容を要約してくれたり、チャット形式で質疑応答ができるサービスです。

このサービスが 2023/6/26 に[バックエンド API](https://www.chatpdf.com/docs/api/backend) を公開しました。非常にシンプルな API です。主な機能は次の通りです：

* PDF をアップロードする
* URL を介して PDF をアップロードする
* PDF とチャットする
    * OpenAI GPT API と同じく、チャット履歴は記憶しません。
* アップロードした PDF を削除する

これらの API を利用するためのサンプルコードも API ドキュメントページに公開されています。Python の場合、`requests` モジュールを利用するサンプルコードが示されています。

頻繁に使うのであれば、都度 `requests` モジュールをインポートしてコードを書くというのは手間です。この手間を省く目的で、Python wrapper モジュールを作成しました。その名も [chatpdf-api-python](https://github.com/Surpris/chatpdf-api-python) です。このモジュールのライセンスは [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0) です。

# chatpdf-api-python の使い方

## chatpdf-api-python を使うにあたり留意していただきたい点 

このモジュールは、ユーザーにより提供される、またはユーザーにより OS の環境変数に設定される ChatPDF API token を使用します。ChatPDF API token の取扱いはユーザーの責任であり、その取扱いによって生じた結果について、このモジュールの開発者は一切の責任を負いません。ChatPDF API token は機密情報であるため、適切に管理し、無意識のうちに公開しないように注意してください。chatpdf-api-python およびその改変版の使用によって、ユーザーの ChatPDF API token が漏洩した場合、その結果についての責任は全てユーザーに帰属します。

## 要件

* Python 3.6+
    * `os`
    * `requests`
    * `typing`

## インストール方法

このモジュールは非公式であることを鑑みて PyPI に公開していません。利用する場合は、Git リポジトリを利用してインストールする一般的な手順に従います。一例を以下に示します：

```sh
pip install git+https://github.com/Surpris/chatpdf-api-python.git
```

## サンプル

2023/7/9 時点では、[Git リポジトリ中の examples](https://github.com/Surpris/chatpdf-api-python/tree/main/examples) ディレクトリに Jupyter Notebook を一つ入れております。

## how to use wrapper functions

### import and set API_KEY

```python
# import this module
import chatpdf_api_python as chatpdf

# set API_KEY if necessary.
# The API_KEY can be put in your OS environmental keys 'CHATPDF_API_KEY'
# prior to the import of this module.
chatpdf.API_KEY = '...'
```

### add PDF via a URL
```python
url = '...'

source_id = chatpdf.upload_url(url)
```

### add PDFs via file upload

```python
file_path_list = [
    '/path/to/your/file1.pdf',
    '/path/to/your/file2.pdf',
    ...
]

source_id = chatpdf.upload_files(file_path_list)
```

### chat: post messages

```python
messages = [
    { 'role': 'user', 'content': '...' },
    { 'role': 'user', 'content': '...' },
    ...
]
reference_sources = True

response = chatpdf.chat(source_id, messages, reference_sources=reference_sources)
```

### delete the uploaded files

```python
source_ids = [
    'source_id_1',
    'source_id_2',
    ...
]

response_code = chatpdf.delete_files(source_ids)
```

# まとめ

この記事では [ChatPDF](https://www.chatpdf.com/) の [Backend API](https://www.chatpdf.com/docs/api/backend) の自作 Python wrapper である [chatpdf-api-python](https://github.com/Surpris/chatpdf-api-python) について紹介しました。都度 `requests` モジュールで API を呼ぶコードを書くのが面倒な場合にご利用ください。なお、このモジュールを直接利用しなくても開発者としては全然問題ありません。皆様が ChatPDF Backend API を Python から利用する際の参考になれば幸いです。

# 最後に

**今回紹介した chatpdf-api-python モジュールに限らず、API token を利用する際には、その token が漏洩しないよう管理に十分注意することが重要です。**

**また、このモジュールの利用する・しないに関わらず、ChatPDF Backend API の利用回数に制限があることに注意してください。** 詳しくは [ChatPDF Backend API のドキュメント](https://www.chatpdf.com/docs/api/backend)をご確認ください。