Hiện tại Google chưa cung cấp một SDK chính thức dành riêng cho PHP để tương tác trực tiếp với API của Gemini. Tuy nhiên, bạn vẫn có thể tích hợp bằng cách sử dụng các thư viện HTTP client của PHP để gửi các yêu cầu API đến các endpoint của Gemini.
Dưới đây là hướng dẫn chi tiết các bước và ví dụ cụ thể để bạn có thể bắt đầu:
Bước 1: Chuẩn bị API Key của Gemini
Trước khi bắt đầu, bạn cần có API key để xác thực các yêu cầu đến API của Gemini. Bạn có thể tạo API key theo các bước sau:
- Truy cập vào Google Cloud Console.
- Nếu bạn chưa có dự án, hãy tạo một dự án mới.
- Trong dự án của bạn, hãy tìm kiếm và kích hoạt “Generative Language API”.
- Sau khi kích hoạt, truy cập vào mục “Credentials” (Thông tin xác thực).
- Nhấp vào “Create credentials” (Tạo thông tin xác thực) và chọn “API key”.
- Sao chép API key mà bạn vừa tạo. Hãy giữ API key này an toàn và không chia sẻ nó công khai.
Bước 2: Cài đặt HTTP Client cho PHP
PHP có nhiều thư viện HTTP client mạnh mẽ mà bạn có thể sử dụng. Một trong những thư viện phổ biến và dễ sử dụng là Guzzle HTTP. Bạn có thể cài đặt Guzzle bằng Composer:
composer require guzzlehttp/guzzle
Đảm bảo bạn đã cài đặt Composer trên hệ thống của mình. Nếu chưa, bạn có thể tải và cài đặt từ trang chủ của Composer.
Bước 3: Xây dựng hàm tương tác với API của Gemini
Bây giờ, bạn có thể tạo một hàm PHP để gửi yêu cầu đến API của Gemini. Dưới đây là một ví dụ cơ bản để gửi một yêu cầu tạo văn bản (text generation):
<?php
require 'vendor/autoload.php'; // Đảm bảo đường dẫn đến autoloader của Composer là đúng
use GuzzleHttp\Client;
function generateTextWithGemini(string $prompt, string $apiKey): ?string
{
$client = new Client([
'base_uri' => 'https://generativelanguage.googleapis.com/v1beta/',
'timeout' => 10, // Thời gian chờ tối đa cho mỗi yêu cầu (giây)
]);
try {
$response = $client->post('models/gemini-2.0-flash:generateContent?key=' . $apiKey , [
'headers' => ['Content-Type' => 'application/json'],
'json' => [
'contents' => [
[
'parts' => [['text' => $prompt]],
],
],
],
]);
$body = $response->getBody();
$data = json_decode($body, true);
// Kiểm tra xem có dữ liệu phản hồi và có text được tạo hay không
if (isset($data['candidates'][0]['content']['parts'][0]['text'])) {
return $data['candidates'][0]['content']['parts'][0]['text'];
} else {
return null; // Hoặc xử lý lỗi khác tùy theo nhu cầu
}
} catch (\GuzzleHttp\Exception\GuzzleException $e) {
// Xử lý lỗi khi gọi API
error_log("Lỗi khi gọi API Gemini: " . $e->getMessage());
return null;
}
}
// Sử dụng hàm
$apiKey = 'YOUR_API_KEY'; // Thay YOUR_API_KEY bằng API key thực tế của bạn
$userPrompt = 'Viết một đoạn thơ ngắn về vẻ đẹp của Hồ Gươm.';
$generatedText = generateTextWithGemini($userPrompt, $apiKey);
if ($generatedText !== null) {
echo "Câu hỏi: " . htmlspecialchars($userPrompt) . "<br>";
echo "Câu trả lời từ Gemini: " . nl2br(htmlspecialchars($generatedText));
} else {
echo "Không thể tạo văn bản từ Gemini.";
}
?>
Giải thích đoạn code:
require 'vendor/autoload.php';
: Dòng này bao gồm autoloader của Composer để có thể sử dụng các thư viện đã cài đặt.use GuzzleHttp\Client;
: Khai báo lớpClient
từ thư viện Guzzle HTTP.generateTextWithGemini(string $prompt, string $apiKey): ?string
: Hàm này nhận vào prompt (nội dung bạn muốn Gemini xử lý) và API key, sau đó trả về chuỗi văn bản được tạo hoặcnull
nếu có lỗi.$client = new Client([...])
: Khởi tạo một instance của Guzzle HTTP client với cấu hình base URI của API Gemini và thời gian chờ.$client->post(...)
: Gửi một yêu cầu POST đến endpointmodels/gemini-pro:generateContent
.headers
: Đặt headerContent-Type
làapplication/json
vì chúng ta đang gửi dữ liệu JSON.json
: Định dạng dữ liệu yêu cầu dưới dạng JSON. Trong trường hợp này, chúng ta gửi mộtcontents
array chứa một phần tử là mộtparts
array, và mỗi phần tử củaparts
là một object chứatext
với nội dung prompt.
$response->getBody()
: Lấy phần body của phản hồi từ API.json_decode($body, true)
: Giải mã chuỗi JSON phản hồi thành một mảng PHP.- Kiểm tra dữ liệu phản hồi: Đoạn code kiểm tra xem phản hồi có chứa dữ liệu mong muốn (
candidates[0]['content']['parts'][0]['text']
) hay không. try...catch
: Sử dụng khốitry...catch
để xử lý các exception có thể xảy ra trong quá trình gọi API (ví dụ: lỗi mạng, lỗi server).- Sử dụng hàm: Phần cuối của script minh họa cách gọi hàm
generateTextWithGemini
với một prompt ví dụ và in ra kết quả.
Các endpoint khác của Gemini API:
Ngoài việc tạo văn bản, Gemini còn có các endpoint khác cho các tác vụ khác, ví dụ như:
models/gemini-pro-vision:generateContent
: Để xử lý cả văn bản và hình ảnh (multimodal). Bạn sẽ cần điều chỉnh cấu trúc JSON trong phầnjson
của yêu cầu để bao gồm cả dữ liệu hình ảnh (thường là base64 encoded).models/{model}:streamGenerateContent
: Để nhận phản hồi theo luồng (streaming). Điều này phức tạp hơn một chút trong việc xử lý phản hồi.
Bạn có thể tham khảo tài liệu chính thức của Google Generative AI API để biết thêm chi tiết về các endpoint và cấu trúc dữ liệu: https://ai.google.dev/docs
Lưu ý quan trọng:
- Bảo mật API Key: Tuyệt đối không nhúng trực tiếp API key vào mã nguồn client-side (ví dụ: JavaScript). Hãy luôn xử lý API key ở phía server-side (PHP trong trường hợp này).
- Xử lý lỗi: Đoạn code ví dụ chỉ xử lý lỗi cơ bản. Trong ứng dụng thực tế, bạn nên xử lý lỗi chi tiết hơn (ví dụ: ghi log, thông báo cho người dùng).
- Giới hạn và chi phí: Hãy lưu ý về các giới hạn sử dụng và chi phí liên quan đến việc sử dụng Google Generative Language API.
- Input Validation: Luôn kiểm tra và làm sạch dữ liệu đầu vào (prompt) từ người dùng để tránh các vấn đề bảo mật hoặc hành vi không mong muốn.
- Asynchronous Requests: Đối với các ứng dụng có lưu lượng truy cập lớn, bạn có thể cân nhắc sử dụng các thư viện PHP hỗ trợ asynchronous HTTP requests để không làm chậm quá trình xử lý của server.