話題の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 トークン ----------------------------------------
というわけで、以上です!