キーワードを入力して検索

📝

Claude APIとPHP連携の実践ガイド - AIチャット機能を30分で実装

齊木祐介 齊木祐介 1,106 views

Claude APIとPHP連携の実践ガイド

はじめに

Claude APIをPHPアプリケーションに統合する方法を、実践的なコード例とともに解説します。初心者でも30分で実装できる内容です。

環境準備

# Composer でGuzzleをインストール
composer require guzzlehttp/guzzle
// .env ファイル
ANTHROPIC_API_KEY=sk-ant-xxxxx

基本的な実装

1. APIクライアントの作成

<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;

class ClaudeAPI {
    private $client;
    private $apiKey;
    
    public function __construct($apiKey) {
        $this->apiKey = $apiKey;
        $this->client = new Client([
            'base_uri' => 'https://api.anthropic.com',
            'timeout' => 60.0
        ]);
    }
    
    public function chat($message, $systemPrompt = '') {
        $response = $this->client->post('/v1/messages', [
            'headers' => [
                'x-api-key' => $this->apiKey,
                'anthropic-version' => '2023-06-01',
                'content-type' => 'application/json'
            ],
            'json' => [
                'model' => 'claude-3-5-sonnet-20241022',
                'max_tokens' => 4000,
                'system' => $systemPrompt,
                'messages' => [
                    ['role' => 'user', 'content' => $message]
                ]
            ]
        ]);
        
        $data = json_decode($response->getBody(), true);
        return $data['content'][0]['text'];
    }
}

2. 使用例

// APIキーを取得
$apiKey = getenv('ANTHROPIC_API_KEY');
$claude = new ClaudeAPI($apiKey);

// システムプロンプトを設定
$systemPrompt = "あなたは親切なプログラミングアシスタントです。";

// メッセージを送信
$response = $claude->chat(
    "PHPでファイルアップロード機能を実装する方法を教えて",
    $systemPrompt
);

echo $response;

実践例: AIチャットボット

<?php
session_start();

// 会話履歴を保持
if (!isset($_SESSION['conversation'])) {
    $_SESSION['conversation'] = [];
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $userMessage = $_POST['message'] ?? '';
    
    // ユーザーメッセージを履歴に追加
    $_SESSION['conversation'][] = [
        'role' => 'user',
        'content' => $userMessage
    ];
    
    // Claude APIに送信
    $claude = new ClaudeAPI(getenv('ANTHROPIC_API_KEY'));
    $response = $claude->chatWithHistory(
        $_SESSION['conversation'],
        "あなたはカスタマーサポート担当です。"
    );
    
    // Claudeの返答を履歴に追加
    $_SESSION['conversation'][] = [
        'role' => 'assistant',
        'content' => $response
    ];
    
    echo json_encode(['response' => $response]);
    exit;
}
// フロントエンド (JavaScript)
async function sendMessage() {
    const message = document.getElementById('userInput').value;
    
    const response = await fetch('chat.php', {
        method: 'POST',
        headers: {'Content-Type': 'application/x-www-form-urlencoded'},
        body: `message=${encodeURIComponent(message)}`
    });
    
    const data = await response.json();
    displayMessage('assistant', data.response);
}

エラーハンドリング

public function chat($message, $systemPrompt = '') {
    try {
        $response = $this->client->post('/v1/messages', [
            // ... 設定 ...
        ]);
        
        $data = json_decode($response->getBody(), true);
        
        // エラーチェック
        if (isset($data['error'])) {
            throw new Exception($data['error']['message']);
        }
        
        return $data['content'][0]['text'];
        
    } catch (GuzzleHttp\Exception\RequestException $e) {
        // APIエラー
        error_log("Claude API Error: " . $e->getMessage());
        return "申し訳ございません。一時的にサービスが利用できません。";
        
    } catch (Exception $e) {
        error_log("Error: " . $e->getMessage());
        return "エラーが発生しました。";
    }
}

ストリーミング対応

public function chatStream($message, $callback) {
    $this->client->post('/v1/messages', [
        'headers' => [
            'x-api-key' => $this->apiKey,
            'anthropic-version' => '2023-06-01',
            'content-type' => 'application/json'
        ],
        'json' => [
            'model' => 'claude-3-5-sonnet-20241022',
            'max_tokens' => 4000,
            'stream' => true,
            'messages' => [
                ['role' => 'user', 'content' => $message]
            ]
        ],
        'stream' => true,
        'sink' => fopen('php://temp', 'r+')
    ]);
}

パフォーマンス最適化

1. キャッシング

// Redisでレスポンスをキャッシュ
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$cacheKey = 'claude_' . md5($message);
$cached = $redis->get($cacheKey);

if ($cached) {
    return $cached;
}

$response = $claude->chat($message);
$redis->setex($cacheKey, 3600, $response); // 1時間キャッシュ

2. 非同期処理

// ジョブキューに追加
$job = [
    'message' => $message,
    'user_id' => $userId
];
file_put_contents('/var/queue/claude_' . time() . '.json', json_encode($job));

セキュリティ考慮事項

  • APIキー管理: 環境変数で管理
  • レート制限: Redis等で実装
  • 入力検証: XSS対策
  • ログ記録: 全リクエストを記録
// レート制限の例
function checkRateLimit($userId) {
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    
    $key = "rate_limit_$userId";
    $count = $redis->incr($key);
    
    if ($count === 1) {
        $redis->expire($key, 60); // 1分
    }
    
    if ($count > 10) {
        throw new Exception('レート制限を超えました');
    }
}

まとめ

Claude APIとPHPの連携により、高度なAI機能を簡単に実装できます。本記事のコードをベースに、自社サービスに合わせてカスタマイズしてください。

実装例

タグ: #Claude #PHP #API #AI開発 #チャットボット

齊木祐介

Discussion

0
または

8文字以上で入力してください

または

パスワードをリセット

登録したメールアドレスを入力してください。パスワードリセット用のリンクをお送りします。