PythonでDeepSeek-R1 APIを呼び出す完全ガイド：インストールから成功実行まで


## 一、準備作業
### API Keyの取得
1. まず[DeepSeekコンソール](https://platform.deepseek.com/)にログインし、アカウントがない場合は登録してください。
![deepseek-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968588/8bac72be-dc93-4672-9976-785072a99593.png)

2. 「API Keys」ページで「Create new API key」をクリックして、API Keyを取得します。生成されたキー（例：sk-123456789abc）をコピーして保存してください。忘れたり紛失した場合は、新しいAPI Keyを再作成する必要があります。
![deepseek-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968588/c4ff0e81-b298-49a5-8e49-c7de859798d5.png)


:::note info
DeepSeek-R1 APIを呼び出す際、Apidogは欠かせないツールです。[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2qiita2)は、DeepSeek-R1とDeepSeek-V3 APIの呼び出しをサポートし、直感的なインターフェースと強力な機能を備えています。これにより、API呼び出しが簡単かつ効率的になり、煩雑な設定が不要になります。開発者にとって、Apidogは作業効率を向上させ、開発プロセスを簡素化する最適な選択です。初心者から経験豊富な開発者まで、[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2qiita2)はシームレスなAPI管理体験を提供します。
:::

![apidog-client-JP-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968588/b46c7b29-f1b6-4b87-9cba-336de8c7b29a.png)



## 二、Python呼び出しステップ

### 1. 環境準備：Pythonのインストール（既にインストール済みの場合はスキップ）
- コンピュータにPython環境がない場合は、まずPython環境をインストールする必要があります（macOSにはPython3環境が標準でインストールされています）。[python.org](https://www.python.org/)からダウンロードしてインストールできます。
- 最新版（3.8以上推奨）をダウンロード
- インストール時に必ず `Add Python to PATH` を選択

### 2. requestsライブラリのインストール（既にインストール済みの場合はスキップ）
VSCodeまたは他のIDEAツールで新しいプロジェクトフォルダを作成し、ターミナル（トップメニュー：ターミナル → 新しいターミナル）を開いて以下のコマンドを実行します：

```
pip install requests

# または

pip3 install requests

# または

python3 -m pip install pyopenssl

```
![python3-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968588/2a88d5e8-a922-4fbc-a471-13189ef41783.png)

コマンドが成功すると、以下のようなメッセージが表示されます：

```
Successfully installed requests-x.x.x...
```
![python3-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968588/0ee55c5c-f357-413b-a23d-90f900857b11.png)

インストールが失敗し、コンピュータにPython環境がある場合、システムに複数のPythonバージョンが存在し、異なる環境で異なるPythonバージョンを使用している可能性があります。そのため、`requests`ライブラリが特定のバージョンの環境にのみインストールされている可能性があります。

ページの右下でバージョンを切り替えることができます。
![python3-5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968588/9e5c6494-7c8e-4c62-b11a-a1ce733c2442.jpeg)

これらのエラーを処理できない場合は、記事の最後のセクションにジャンプしてください。そこでは、より簡単にDeepSeek-R1 APIを呼び出す方法を提供しています。

![Kapture1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968588/52ef321a-a041-4aad-8b37-ac3cf3c74e78.gif)

### 3. 基本的な呼び出しコード

上記のコマンドが成功した後、プロジェクト内に `.py` で終わるファイルを新規作成し、例えば `deepseek.py` ファイルを作成し、以下のコードをコピーして貼り付けます（`sk-あなたの密钥` を置き換えることを忘れないでください）。

```python
# deepseek.py 

import requests

# あなたのAPI Keyを記入
API_KEY = "sk-あなたの密钥"  

url = "https://api.deepseek.com/chat/completions"
headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {API_KEY}"
}

data = {
    "model": "deepseek-reasoner",  # R1モデル（deepseek-reasoner）またはV3モデル（deepseek-chat）を指定
    "messages": [
        {"role": "system", "content": "あなたはプロのアシスタントです"},
        {"role": "user", "content": "あなたは誰ですか？"}
    ],
    "stream": False  # ストリーミングをオフにする
}

response = requests.post(url, headers=headers, json=data)

if response.status_code == 200:
    result = response.json()
    print(result['choices'][0]['message']['content'])
else:
    print("リクエストが失敗しました。エラーコード：", response.status_code)
```

:::note info
`model='deepseek-chat'`を指定することでDeepSeek-V3を呼び出すことができます。
`model='deepseek-reasoner'`を指定することでDeepSeek-R1を呼び出すことができます。
:::


### 4. コードの実行方法

- 右上の「▶」ボタンをクリックしてコードを実行
- コンソールで `python3 deepseek.py` または `python deepseek.py` を使用してコードを実行
- 「右クリックエディタ → Run Python File in Terminal」でコードを実行

![python3-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968588/86948d23-c913-4ef3-8c49-36cf143765d2.png)

### 5. 成功した場合の出力

以下のような出力が表示されれば、呼び出しが成功したことを示します。

```
こんにちは！私はDeepSeek-R1で、深層思考（DeepSeek）社によって開発されたAIアシスタントです。質問や問題解決のお手伝いをすることが得意で、幅広いトピックについて情報提供やサポートを行います。検索、データ分析、アイデア出し、学習支援など、さまざまなタスクに対応できます。どうぞお気軽にご相談ください！
```

## 三、コード解析

### 1. 重要なパラメータの説明

| パラメータ | 説明 |
|:-----------|------------:|
|   model     |   `deepseek-reasoner`はR1モデルを示します |
|   messages  |   会話履歴（複数回の会話をサポート）    |
|   stream    |   `True`でストリーミング出力を有効に（長文に適しています） |

### 2. 複数回の会話の例

```python
messages = [
    {"role": "system", "content": "あなたは詩人です"},
    {"role": "user", "content": "春についての詩を書いてください"},
    {"role": "assistant", "content": "春風が頬を撫で、柳の枝が長く..."},
    {"role": "user", "content": "第二段を続けてください"}
]
```

## 四、ストリーミングモード

以下のパラメータを変更することで有効にできます：

```python
data["stream"] = True

response = requests.post(url, headers=headers, json=data, stream=True)

for line in response.iter_lines():
    if line:
        decoded_line = line.decode('utf-8')
        print(decoded_line)
```

完全なコード：

```python
# deepseek.py 

import requests

# あなたのAPI Keyを記入
API_KEY = "sk-あなたのAPI Key"  

url = "https://api.deepseek.com/chat/completions"
headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {API_KEY}"
}

data = {
    "model": "deepseek-chat",  # R1モデル（deepseek-reasoner）またはV3モデル（deepseek-chat）を指定
    "messages": [
        {"role": "system", "content": "あなたはプロのアシスタントです"},
        {"role": "user", "content": "あなたは誰ですか？"}
    ],
    "stream": False  # ストリーミングをオフにする
}

data["stream"] = True

response = requests.post(url, headers=headers, json=data, stream=True)

for line in response.iter_lines():
    if line:
        decoded_line = line.decode('utf-8')
        print(decoded_line)
```

以下はV3モデル（deepseek-chat）を使用した出力結果です。なぜR1を使わないのか？非常に人気があり、応答がないことが多いからです。

![apidog-deepseek.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968588/d064f99f-dbce-4cbd-9521-353663e7e0d3.png)

## 五、よくある質問
### Q1：V3とR1モデルの違いは？
- V3：`model: "deepseek-chat"`
- R1：`model: "deepseek-reasoner"`
   
### Q2：401エラーが発生した場合？
- API Keyが正しく入力されているか確認
- キーが期限切れでないことを確認

### Q3：「No module named 'requests'」が表示された場合？以下を確認：
- 正しいターミナルでpip install requestsを実行したか（上記参照）
- VSCodeが正しいPythonインタプリタを使用しているか（上記参照）

### Q4：requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1が表示された場合？

うーん、「サーバーが忙しい」と同じ理由で、利用者が多すぎて応答が失敗した可能性があります。

エラーメッセージ`Expecting value: line 1 column 1 (char 0)`は、`json()`メソッドが有効なJSONデータを受け取ることを期待しているが、実際には空の内容を受け取ったことを示しています。これは、APIがデータを返さなかったか、空の応答ボディを返した可能性があります。

### Q5：ストリーミング出力を有効にした後、keep-aliveが表示され続けるのはなぜですか？

うーん、「サーバーが忙しい」と同じ理由で、利用者が多すぎて、長時間接続状態が続いている可能性があります。

## 六、より簡単なDeepSeek-R1 APIの呼び出し方法（推奨）
[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2qiita2)でDeepSeek-R1 APIまたはDeepSeek-V3 APIを呼び出すことができます。[Apidog](http://www.apidog.com/jp/?utm_source=opr&utm_medium=a2qiita2)を使用してストリーミング出力結果を取得することもできます：
![apidog-deepseek-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968588/00ff4b78-5168-40e5-9dde-186fc01413a9.png)

または全体の出力結果を取得することもできます：
![apidog-deepseek-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968588/1d2c928e-712f-4640-aef0-402f422e7340.png)