ランダムアクセスメモリ

沖縄移住、マンガ、Web制作、ゲーム、生成AIの話をランダムに。※本サイトには一部アフィリエイトリンクもあります

DeepSeekのAPIをPHPで使う

話題のDeepSeekをPHPで利用しようと思ったけど、意外とうまくいかない。
Windsurfさんの力を借りてなんとか成功したのでソースコードをメモ代わりに残しておきたい。

※APIキーの取得方法などは、ほかのサイトを参考にしてください。
※利用モデルは「deepseek-chat」です。

<?php

/**
 * DeepseekのChat Completion APIを使用して対話を行うシンプルな実装
 * 
 * このスクリプトは以下の機能を提供します:
 * - DeepseekのAPIに直接アクセス
 * - プロンプトの送信と応答の受信
 * - 応答データの整形と表示
 * - エラーハンドリング
 */

// APIの基本設定
// APIキーは本来は環境変数や設定ファイルで管理すべきです
$apiKey = 'APIキーをここに入力';
$apiUrl = 'https://api.deepseek.com/v1/chat/completions';

// APIリクエストのパラメータを設定
$requestData = [
    'messages' => [
        [
            'role' => 'user',           // ユーザーからのメッセージ
            'content' => 'Deepseekさん、面白い話をして'  // プロンプト内容
        ]
    ],
    'model' => 'deepseek-chat',        // 使用するモデル
    'temperature' => 0.7,              // 応答のランダム性(0.0-1.0)
    'stream' => false                  // ストリーミングモードを無効化
];

try {
    // cURLセッションの初期化
    $ch = curl_init($apiUrl);
    
    // cURLオプションの設定
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,     // レスポンスを文字列として受け取る
        CURLOPT_POST => true,               // POSTリクエストを使用
        CURLOPT_POSTFIELDS => json_encode($requestData),  // リクエストボディをJSON化
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/json',
            'Authorization: Bearer ' . $apiKey  // 認証ヘッダー
        ]
    ]);
    
    // APIリクエストの実行
    $response = curl_exec($ch);
    
    // cURLエラーのチェック
    if (curl_errno($ch)) {
        throw new Exception('API呼び出しエラー: ' . curl_error($ch));
    }
    
    // HTTPステータスコードの確認
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    if ($httpCode !== 200) {
        throw new Exception('APIエラー: HTTPステータスコード ' . $httpCode);
    }
    
    // cURLセッションのクリーンアップ
    curl_close($ch);
    
    // JSONレスポンスをデコード
    $result = json_decode($response, true);
    
    // JSONデコードエラーのチェック
    if (json_last_error() !== JSON_ERROR_NONE) {
        throw new Exception('JSONデコードエラー: ' . json_last_error_msg());
    }
    
    // 応答の整形表示
    echo "\nDeepseek応答:\n";
    echo "----------------------------------------\n";
    echo "メッセージ: " . $result['choices'][0]['message']['content'] . "\n";
    echo "----------------------------------------\n";
    
    // 使用統計の表示
    echo "統計情報:\n";
    echo "- モデル: " . $result['model'] . "\n";
    echo "- トークン使用量:\n";
    echo "  - プロンプト: " . $result['usage']['prompt_tokens'] . " トークン\n";
    echo "  - 応答: " . $result['usage']['completion_tokens'] . " トークン\n";
    echo "  - 合計: " . $result['usage']['total_tokens'] . " トークン\n";
    echo "----------------------------------------\n";
    
} catch (Exception $e) {
    // エラーメッセージの表示
    echo "エラーが発生しました: " . $e->getMessage() . "\n";
}

ちなみにこのプロンプトの結果は

Deepseek応答: ---------------------------------------- メッセージ: もちろんです!面白い話を一つお届けしましょう。 昔々、ある小さな村に、とても賢いがちょっと風変わりな老人が住んでいました。この老人は、村人たちから「謎解きの達人」として尊敬されていました。どんなに難しい謎でも、彼の前では簡単に解けてしまうのです。 ある日、村に一人の旅人がやって来ました。この旅人は、自分が持っている謎を解ける者はいないと豪語していました。村人たちは老人に助けを求め、旅人との対決が始まりました。 旅人が出した謎はこうでした。 「私は始まりもなく、終わりもない。私は何でも包み込むが、何も持たない。私は全ての場所に存在するが、どこにもいない。私は何でしょう?」 村人たちは頭を抱えましたが、老人はにっこり笑って答えました。 「それは『空間』だね。」 旅人は驚き、さらに難しい謎を出しました。 「私は見えないが、感じられる。私は触れられないが、存在する。私は全ての生き物に必要だが、誰も私を手に入れることはできない。私は何でしょう?」 老人は少し考えてから、こう答えました。 「それは『空気』だね。」 旅人はますます驚き、最後の謎を出しました。 「私は全ての始まりであり、全ての終わりでもある。私は全ての物語に存在し、全ての時間を支配する。私は何でしょう?」 老人は深く考え、そして静かに答えました。 「それは『アルファベットのA』だね。始まりであり、終わりでもあるから。」 旅人は老人の賢さに感服し、村人たちは大喜びしました。そして、老人は再び村の英雄となったのでした。 どうでしたか?少し頭を使う謎解きの話でしたが、楽しんでいただけたでしょうか? ---------------------------------------- 統計情報: - モデル: deepseek-chat - トークン使用量: - プロンプト: 13 トークン - 応答: 438 トークン - 合計: 451 トークン ----------------------------------------

というわけで、以上です!