derrickob/gemini-api

一个轻量级、高效的定制PHP客户端,用于无缝集成Google Gemini API。

v1.1.2 2024-08-25 18:56 UTC

This package is auto-updated.

Last update: 2024-09-19 12:59:00 UTC


README

图片来自:Google DeepMind

Packagist Version GitHub License

Google Gemini API的定制PHP客户端

重要

这个库是一个独立的创作,旨在提供访问最新Google Gemini API功能和功能。它既不受到认可,也不是官方库。如果您正在寻找官方Google Gemini API库,请在此检查.

核心依赖项为SaloonPHP。

目录

版本

此库默认使用Gemini API的beta版本,以确保访问最新的功能。

版本方案遵循格式v1.x.y

  1. y在修补和向后兼容的错误修复时增加。
  2. x在新增功能或可能包含破坏性更改的更改时增加。

为了确保与该库的稳定性,您可以考虑将composer版本锁定到特定版本。在审查变更日志并确保您能够适应新版本中的任何破坏性更改后,再更新您的包。然而,如果您使用默认的(v1beta)API版本,则这不会适用于任何上游的破坏性更改。

由于可能存在偶尔的破坏性更改,此库可能需要更频繁的x版本增加来适应这些更改,这主要针对它之前实施过的现有损坏功能。

您还可以通过在构建Gemini类时显式定义它来将您的使用锁定为v1,并注意在v1v1beta中哪些功能可用。如果您在v1 API中收到包含v1beta-特定参数(完全是)的请求,那么您很可能会遇到错误,因此使用v1beta似乎对于此库来说是强制性的,因为整个开发都是基于v1beta语法进行的,除了调整模型操作路由到v1之外。

先决条件

依赖项

  1. PHP 8.1+
  2. Composer

设置您的API密钥

要使用Gemini API,您需要一个API密钥。如果您还没有,请在Google AI Studio中创建一个密钥。 获取API密钥

设置服务帐户

  1. 访问Google开发者控制台,如果您还没有,则创建一个新的项目。
  2. 在导航菜单中,选择APIs & Services > 凭据
  3. 点击创建凭据并选择服务帐户
  4. 为服务帐户输入一个名称,然后点击创建
  5. 为您的服务帐户分配必要的角色,然后点击继续
  6. 点击创建密钥,选择JSON密钥类型,然后点击创建
  7. 您的新公钥/私钥对将下载到您的计算机上;这是您的服务帐户密钥。
  8. 安全地存储包含密钥的JSON文件,因为它允许访问Gemini API。您需要在代码中提供它的路径。

安装

composer require derrickob/gemini-api

为了从您的服务帐户JSON文件缓存访问令牌请求,请使用任何PSR-6兼容的缓存库,如symphony/cache(需要PHP >= 8.2)。

composer require symfony/cache

环境变量

设置您的环境变量

Powershell

$Env:GOOGLE_API_KEY = "AIza...."

Cmd

set GOOGLE_API_KEY=AIza....

Linux或macOS

export GOOGLE_API_KEY=AIza....

注意

  1. API语法和命名:此库简化了官方API语法的一些方面,并对某些方法进行了重命名以避免冲突。在编写不使用简化方法的完整请求时,请参考官方文档以及库中的等效类名以确保准确性。只有少数重命名的类可能会阻止您编写自己的基于文档的请求,如果简化版本对您来说不完整或不达标。
  2. 查询参数:在示例中未明确显示的任何查询参数(例如,pageSizepageToken)都可以作为关联数组在请求中传递。例如:$gemini->models()->list(['pageSize' => 5, 'pageToken' => 'the-token']);

如果类名复杂难以构建请求,您始终可以使用数组并通过其fromArray静态方法(在所有类中均可用)构建请求。示例中的examples/文件夹中的JSON模式示例插件就使用了这种方法。请注意,您传递的字段数据应与您要使用的fromArray的类的预期语法和数据兼容。

入门

API密钥

此示例演示了使用API密钥进行身份验证的端点请求。

<?php

require_once 'vendor/autoload.php';

use Derrickob\GeminiApi\Gemini;

$apiKey = getenv('GOOGLE_API_KEY');

$gemini = new Gemini([
    'apiKey' => $apiKey,
]);

$response = $gemini->models()->generateContent([
    'model' => 'models/gemini-1.5-flash',
    'systemInstruction' => 'You are a helpful assistant',
    'contents' => 'Hello',
]);

echo $response->text(); // Hello!👋  What can I do for you today?

服务帐户

调整过的模型和语料库端点需要更安全的身份验证。使用您的服务帐户文件非常容易。示例使用symphony/cache存储访问令牌,但您可以替换为您喜欢的PSR-6缓存库,或者不缓存访问令牌,这会导致您对每个请求都请求新的访问令牌。出于安全原因,缓存配置保留为默认设置,如果您需要修改这些配置,请参考您使用的缓存库的文档。有关symphony/cache的文档,请参阅此处。使用文件系统缓存适配器,但您始终可以使用您选择的任何适配器。

<?php

require_once "vendor/autoload.php";

use Derrickob\GeminiApi\Gemini;
use Symfony\Component\Cache\Adapter\FilesystemAdapter;

putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/my/credentials.json');

$apiKey = getenv('GOOGLE_API_KEY');
$cacheItemPool = new FilesystemAdapter();

$gemini = new Gemini([
    'apiKey' => $apiKey,
    'cacheItemPool' => $cacheItemPool,
]);

$response = $gemini->tunedModels()->list();

$response->nextPageToken; // 

foreach ($response->tunedModels as $tunedModel) {
    $tunedModel->name; // tunedModels/number-generators-a3gcipxg9rl5
    $tunedModel->displayName; // Number Generators
    $tunedModel->description; // 
}

// See the list tuned model resource section for full usage

手动凭据

出于安全原因,不建议手动在初始化Gemini类时设置凭据,如果您需要在代码库中灵活管理并提供API访问。此方法的安全性以及缓存访问令牌的逻辑取决于您自己实现,因为不建议硬编码凭据;请使用上一节中的GOOGLE_APPLICATION_CREDENTIALS

<?php

require_once "vendor/autoload.php";

use Derrickob\GeminiApi\Gemini;

$apiKey = getenv('GOOGLE_API_KEY');

$credentials = [
    'key' => 'value',
];

$gemini = new Gemini([
    'apiKey' => $apiKey,
    'credentials' => $credentials,
]);

代理

如果您的API使用需要为所有请求使用代理,则构造Gemini类时可以打开Guzzle proxy选项进行编写。

$proxySettings = [
    'http'  => 'http://your-proxy-server:port',
    'https' => 'http://your-proxy-server:port',
];

$gemini = new Gemini([
    'apiKey' => $apiKey,
    'proxy' => $proxySettings,
]);

缓存内容资源

创建

创建缓存的Content资源。

此示例使用文档中使用的Sherlock Jr.电影视频。文件首次使用媒体上传上传。

use Derrickob\GeminiApi\Data\CachedContent;
use Derrickob\GeminiApi\Data\Content;

$file = 'https://generativelanguage.googleapis.com/v1beta/files/7j0qhgcmeeqh';

$response = $gemini->cachedContents()->create(
    new CachedContent(
        model: 'models/gemini-1.5-flash-001',
        displayName: 'sherlock jr movie',
        systemInstruction: Content::createTextContent("You are an expert video analyzer, and your job is to answer the user\'s query based on the video file you have access to."),
        contents: [
            Content::createFileContent($file, 'video/mp4', 'user'),
        ],
        ttl: '3600s',
    ),
);

$response->model; // models/gemini-1.5-flash-001
$response->name; // cachedContents/lg5adbi62ykx
$response->displayName; // sherlock jr movie
$response->createTime->format('Y-m-d H:i:s'); // 2024-07-04 23:15:53
$response->updateTime->format('Y-m-d H:i:s'); // 2024-07-04 23:15:53
$response->usageMetadata->totalTokenCount; // 
$response->expireTime->format('Y-m-d H:i:s'); // 2024-07-05 00:15:53

$response->toArray(); // ['model' => 'models/gemini-1.5-flash-001', ...]
使用缓存的Content生成内容

generateContent 的超时时间设置为 60 秒,请求超时设置为 120 秒。如果您的请求仍然超出这些限制,您可以提出增加。

use Derrickob\GeminiApi\Data\Content;

$response = $gemini->models()->generateContent([
    'model' => 'models/gemini-1.5-flash-001',
    'contents' => Content::createTextContent('Introduce different characters in the movie by describing their personality, looks, and names. Also list the timestamps they were introduced for the first time.', 'user'),
    'cachedContent' => 'cachedContents/lg5adbi62ykx',
]);

echo $response->text();

删除

删除 CachedContent 资源。

$response = $gemini->cachedContents()->delete('cachedContents/2wojeqz7srpu');

if ($response === true) {
    echo 'Successfully deleted the cached Content';
}

获取

读取 CachedContent 资源。

$response = $gemini->cachedContents()->get('cachedContents/2wojeqz7srpu');

$response->model; // models/gemini-1.5-flash-001
$response->name; // cachedContents/2wojeqz7srpu
$response->displayName; // Repository Specialist
$response->createTime->format('Y-m-d H:i:s'); // 2024-07-04 23:15:53
$response->updateTime->format('Y-m-d H:i:s'); // 2024-07-04 23:15:53
$response->usageMetadata->totalTokenCount; // 259246
$response->expireTime->format('Y-m-d H:i:s'); // 2024-08-04 23:15:53

$response->toArray(); // ['model' => 'models/gemini-1.5-flash-001', ...]

列表

列出 CachedContents。

$response = $gemini->cachedContents()->list();

$response->nextPageToken; // 

foreach ($response->cachedContents as $cachedContent) {
    $cachedContent->model; // models/gemini-1.5-flash-001
    $cachedContent->name; // cachedContents/2wojeqz7srpu
    $cachedContent->displayName; // Repository Specialist
    $cachedContent->createTime->format('Y-m-d H:i:s'); // 2024-07-04 23:15:53
    $cachedContent->updateTime->format('Y-m-d H:i:s'); // 2024-07-04 23:15:53
    $cachedContent->usageMetadata->totalTokenCount; // 259246
    $cachedContent->expireTime->format('Y-m-d H:i:s'); // 2024-10-28 17:02:31
}

$response->toArray(); // ['cachedContents' => [...], ...]

修补

更新 CachedContent 资源(只有过期时间可更新)。

$response = $gemini->cachedContents()->patch([
    'name' => 'cachedContents/2wojeqz7srpu',
    'updateMask' => 'ttl',
    'cachedContent' => new CachedContent(
        ttl: '3600s'
    ),
]);

$response->model; // models/gemini-1.5-flash-001
$response->name; // cachedContents/2wojeqz7srpu
$response->displayName; // Repository Specialist
$response->createTime->format('Y-m-d H:i:s'); // 2024-07-04 23:15:53
$response->updateTime->format('Y-m-d H:i:s'); // 2024-07-05 07:02:21
$response->usageMetadata->totalTokenCount; // 259246
$response->expireTime->format('Y-m-d H:i:s'); // 2024-07-05 08:02:21

$response->toArray(); // ['model' => 'models/gemini-1.5-flash-001', ...]

语料库资源

创建

创建一个空的 Corpus

use Derrickob\GeminiApi\Data\Corpus;

$response = $gemini->corpora()->create(
    new Corpus(
        displayName: 'My Awesome Corpora'
    )
);

$response->name; // corpora/my-awesome-corpora-6r1qcymf0d3m
$response->displayName; // My Awesome Corpora
$response->createTime->format('Y-m-d H:i:s'); // 2024-06-16 08:33:53
$response->updateTime->format('Y-m-d H:i:s'); // 2024-06-16 08:33:53

删除

删除一个 Corpus

$response = $gemini->corpora()->delete([
    'name' => 'corpora/my-awesome-corpora-6r1qcymf0d3m',
]);

if ($response === true) {
    echo 'The Corpus was deleted successfully';
}

获取

获取特定 Corpus 的信息。

$response = $gemini->corpora()->get('corpora/my-awesome-corpora-6r1qcymf0d3m');

$response->name; // corpora/my-awesome-corpora-6r1qcymf0d3m
$response->displayName; // My Awesome Corpora
$response->createTime->format('Y-m-d H:i:s'); // 2024-06-16 08:33:53
$response->updateTime->format('Y-m-d H:i:s'); // 2024-06-16 08:33:53

列表

列出用户拥有的所有 Corpora

$response = $gemini->corpora()->list();

$response->nextPageToken; // ...

foreach($response->corpora as $corpus) {
    $corpus->name; // corpora/my-awesome-corpora-6r1qcymf0d3m
    $corpus->displayName; // My Awesome Corpora
    $corpus->createTime->format('Y-m-d H:i:s'); // 2024-06-16 08:33:53
    $corpus->updateTime->format('Y-m-d H:i:s'); // 2024-06-16 08:33:53
}

修补

更新一个 Corpus

use Derrickob\GeminiApi\Data\Corpus;

$response = $gemini->corpora()->patch([
    'name' => 'corpora/my-awesome-corpora-6r1qcymf0d3m',
    'updateMask' => 'displayName',
    'corpus' => new Corpus(
        displayName: 'My Updated Awesome Corpora'
    ),
]);

$response->name; // corpora/my-awesome-corpora-6r1qcymf0d3m
$response->displayName; // My Updated Awesome Corpora
$response->createTime->format('Y-m-d H:i:s'); // 2024-06-16 08:33:53
$response->updateTime->format('Y-m-d H:i:s'); // 2024-06-24 12:31:26

查询

Corpus 上执行语义搜索。

$response = $gemini->corpora()->query([
    'name' => 'corpora/test-corpus-j0oywm69m798',
    'query' => 'sample',
]);

foreach ($response->relevantChunks as $relevantChunk) {
    $relevantChunk->chunkRelevanceScore; // 0.58688986
    $relevantChunk->chunk->data->stringValue; // also some chunk text
    $relevantChunk->chunk->name; // corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3/chunks/5ruixa7rmt75

    $customMetadata = $relevantChunk->chunk->customMetadata;
    foreach ($customMetadata as $metadata) {
        $metadata->key; // some-more-key-too
        $metadata->stringValue; // some value here
    }

    $relevantChunk->chunk->createTime->format('Y-m-d H:i:s'); // 2024-07-20 10:22:37
    $relevantChunk->chunk->updateTime->format('Y-m-d H:i:s'); // 2024-07-23 04:14:55
    $relevantChunk->chunk->state->value; // STATE_ACTIVE
}

$response->toArray(); // ['relevantChunks' => [...]]

语料库文档资源

创建

创建一个空的 Document

use Derrickob\GeminiApi\Data\Document;

$response = $gemini->corpora()->documents()->create([
    'parent' => 'corpora/my-third-corpus-e0q6f12uxq9b',
    'document' => new Document(
        displayName: 'Sample Document'
    ),
]);

$response->name; // corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-js1ehjvp5chk
$response->displayName; // Sample Document
$response->createTime->format('Y-m-d H:i:s'); // 2024-06-26 10:12:13
$response->updateTime->format('Y-m-d H:i:s'); // 2024-06-26 10:12:13

$response->toArray(); // ['name' => 'corpora/*/documents/*', ...]

删除

删除一个 Document

$response = $gemini->corpora()->documents()->delete([
    'name' => 'corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-js1ehjvp5chk',
]);

if ($response === true) {
    echo 'Successfully deleted the corpus document';
}

获取

获取特定 Document 的信息。

$response = $gemini->corpora()->documents()->get('corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-js1ehjvp5chk');

$response->name; // corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-js1ehjvp5chk
$response->displayName; // Sample Document
$response->createTime->format('Y-m-d H:i:s'); // 2024-06-26 10:12:13
$response->updateTime->format('Y-m-d H:i:s'); // 2024-06-26 10:12:13

$response->toArray(); // ['name' => 'corpora/*/documents/*', ...]

列表

列出 Corpus 中的所有 Document

$response = $gemini->corpora()->documents()->list([
    'parent' => 'corpora/my-third-corpus-e0q6f12uxq9b',
]);

$response->nextPageToken; // ...

foreach($response->documents as $document) {
    $document->name; // corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-js1ehjvp5chk
    $document->displayName; // Sample Document
    $document->createTime->format('Y-m-d H:i:s'); // 2024-06-26 10:12:13
    $document->updateTime->format('Y-m-d H:i:s'); // 2024-06-26 10:12:13
}

$response->toArray(); // ['documents' => [...], 'nextPageToken' => '...']

修补

更新一个 Document

use Derrickob\GeminiApi\Data\Document;

$response = $gemini->corpora()->documents()->patch([
    'name' => 'corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-92t47u1yysg',
    'updateMask' => 'displayName',
    'document' => new Document(
        displayName: 'Sample Document Updated'
    ),
]);

$response->name; // corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-js1ehjvp5chk
$response->displayName; // Sample Document Updated
$response->createTime->format('Y-m-d H:i:s'); // 2024-06-26 10:12:13
$response->updateTime->format('Y-m-d H:i:s'); // 2024-06-26 14:26:09

$response->toArray(); // ['name' => 'corpora/*/documents/*', ...]

查询

Document 上执行语义搜索。

$response = $gemini->corpora()->documents()->query([
    'name' => 'corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-92t47u1yysg',
    'query' => 'sample query',
]);

foreach($response->relevantChunks as $relevantChunk) {
    $relevantChunk->chunkRelevanceScore; //
    $relevantChunk->chunk; //
}

$response->toArray(); // ['relevantChunks' => [...]]

语料库文档块资源

批量创建

批量创建 Chunk

use Derrickob\GeminiApi\Data\Chunk;
use Derrickob\GeminiApi\Data\ChunkData;
use Derrickob\GeminiApi\Data\CustomMetadata;

$response = $gemini->corpora()->documents()->chunks()->batchCreate([
    'parent' => 'corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3',
    'requests' => [
        [
            'chunk' => new Chunk(
                data: new ChunkData("chunk text"),
                customMetadata: [
                    new CustomMetadata(
                        key: 'some-key-here',
                        stringValue: 'some value',
                    ),
                    // can add more
                ],
            ),
        ],
        [
            'chunk' => new Chunk(
                data: new ChunkData("also some chunk text"),
                customMetadata: [
                    new CustomMetadata(
                        key: 'some-more-key-too',
                        stringValue: 'some value here',
                    ),
                    // can add more
                ],
            ),
        ],
    ],
]);

foreach ($response->chunks as $chunk) {
    $chunk->name; // corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3/chunks/4th6003almml
    $chunk->data->stringValue; // chunk text
    $chunk->createTime->format('Y-m-d H:i:s'); // 2024-07-20 10:22:37
    $chunk->updateTime->format('Y-m-d H:i:s'); // 2024-07-20 10:22:37
    $chunk->state->value; // STATE_PENDING_PROCESSING

    foreach ($chunk->customMetadata as $metadata) {
        $metadata->key; // some-key-here
        $metadata->stringValue; // some value
    }
}

$response->toArray(); // ['chunks' => [...]]

批量删除

批量删除 Chunk

$response = $gemini->corpora()->documents()->chunks()->batchDelete([
    'parent' => 'corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3',
    'requests' => [
        'corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3/chunks/f9r5tryc1zz9',
        'corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3/chunks/irklkw3iwnzs',
    ],
]);

if ($response === true) {
    echo 'Successfully deleted the document chunks';
}

批量更新

批量更新 Chunk

use Derrickob\GeminiApi\Data\Chunk;
use Derrickob\GeminiApi\Data\ChunkData;

$response = $gemini->corpora()->documents()->chunks()->batchUpdate([
    'parent' => 'corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3',
    'requests' => [
        [
            'chunk' => new Chunk(
                data: new ChunkData('latest some chunk text'),
                name: 'corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3/chunks/a8ee9pxpkuxw',
            ),
            'updateMask' => 'data',
        ],
        [
            'chunk' => new Chunk(
                data: new ChunkData('latest chunk text updated'),
                name: 'corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3/chunks/4th6003almml',
            ),
            'updateMask' => 'data',
        ],
    ],
]);

foreach ($response->chunks as $chunk){
    $chunk->name; // corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3/chunks/4th6003almml
    $chunk->data->stringValue; // latest chunk text updated
    $chunk->createTime->format('Y-m-d H:i:s'); // 2024-07-20 10:22:37
    $chunk->updateTime->format('Y-m-d H:i:s'); // 2024-07-20 17:23:09
    $chunk->state->value; // STATE_PENDING_PROCESSING

    foreach($chunk->customMetadata as $metadata) {
        $metadata->key; // some-key-here
        $metadata->stringValue; // some value
    }
}

$response->toArray(); // ['chunks' => [...]]

创建

创建一个 Chunk

use Derrickob\GeminiApi\Data\Chunk;
use Derrickob\GeminiApi\Data\ChunkData;
use Derrickob\GeminiApi\Data\CustomMetadata;

$response = $gemini->corpora()->documents()->chunks()->create([
    'parent' => 'corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-92t47u1yysg',
    'chunk' => new Chunk(
        data: new ChunkData("some chunk text"),
        customMetadata: [
            new CustomMetadata(
                key: 'some-key',
                stringValue: 'some value',
            ),
            // can add more (max: 20)
        ],
    ),
]);

$response->name; // corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-92t47u1yysg/chunks/s82wfpok1k2n
$response->data->stringValue; // some chunk text
$response->createTime->format('Y-m-d H:i:s'); // 2024-06-26 17:14:51
$response->updateTime->format('Y-m-d H:i:s'); // 2024-06-26 17:14:51
$response->state->value; // STATE_PENDING_PROCESSING

foreach($response->customMetadata as $metadata) {
    $metadata->key; // some key
    $metadata->stringValue; // some value
}

$response->toArray(); // ['data'=> ...]

删除

删除一个 Chunk

$response = $gemini->corpora()->documents()->chunks()->delete('corpora/*/documents/*/chunks/*');

if ($response === true) {
    echo 'Corpus document chunk deleted successfully';
}

获取

获取特定 Chunk 的信息。

$response = $gemini->corpora()->documents()->chunks()->get('corpora/*/documents/*/chunks/*');

$response->name; // corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-92t47u1yysg/chunks/s82wfpok1k2n
$response->data->stringValue; // some chunk text
$response->createTime->format('Y-m-d H:i:s'); // 2024-06-26 17:14:51
$response->updateTime->format('Y-m-d H:i:s'); // 2024-06-26 17:14:51
$response->state->value; // STATE_PENDING_PROCESSING

foreach($response->customMetadata as $metadata) {
    $metadata->key; // some key
    $metadata->stringValue; // some value
}

$response->toArray(); // ['data'=> ...]

列表

列出 Document 中的所有 Chunk

$response = $gemini->corpora()->documents()->chunks()->list([
    'parent' => 'corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-92t47u1yysg',
]);

$response->nextPageToken; // ciE9l...

foreach ($response->chunks as $chunk) {
    $chunk->name; // corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-92t47u1yysg/chunks/s82wfpok1k2n
    $chunk->data->stringValue; // some chunk text
    $chunk->createTime->format('Y-m-d H:i:s'); // 2024-06-26 17:14:51
    $chunk->updateTime->format('Y-m-d H:i:s'); // 2024-06-26 17:15:20
    $chunk->state->value; // STATE_ACTIVE
}

$response->toArray(); // ['nextPageToken' => 'ciEKD...', 'chunks' => [...]]

修补

更新一个 Chunk

use Derrickob\GeminiApi\Data\Chunk;
use Derrickob\GeminiApi\Data\ChunkData;
$response = $gemini->corpora()->documents()->chunks()->patch([
    'name' => 'corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3/chunks/4th6003almml',
    'updateMask' => 'data',
    'chunk' => new Chunk(
        data: new ChunkData('chunk text updated'),
    ),
]);

$response->name; // corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3/chunks/4th6003almml
$response->data->stringValue; // chunk text updated
$response->createTime->format('Y-m-d H:i:s'); // 2024-07-20 10:22:37
$response->updateTime->format('Y-m-d H:i:s'); // 2024-07-20 12:41:30
$response->state->value; // STATE_PENDING_PROCESSING

foreach($response->customMetadata as $metadata) {
    $metadata->key; // some-key-here
    $metadata->stringValue; // some value
}

$response->toArray(); // ['name'=> 'corpora/*/documents/*/chunks/*', ...]

语料库权限资源

创建

为特定资源创建权限。

示例 1:所有人

use Derrickob\GeminiApi\Data\Permission;
use Derrickob\GeminiApi\Enums\GranteeType;
use Derrickob\GeminiApi\Enums\PermissionRole;

$response = $gemini->corpora()->permissions()->create([
    'parent' => 'corpora/test-corpus-j0oywm69m798',
    'permission' => new Permission(
        role: PermissionRole::READER,
        granteeType: GranteeType::EVERYONE,
    ),
]);

$response->role->value; // READER
$response->name; // corpora/test-corpus-j0oywm69m798/permissions/everyone
$response->granteeType->value; // EVERYONE

$response->toArray(); // ['role' => 'READER', ...]

示例 2:组

use Derrickob\GeminiApi\Data\Permission;
use Derrickob\GeminiApi\Enums\GranteeType;
use Derrickob\GeminiApi\Enums\PermissionRole;

$response = $gemini->corpora()->permissions()->create([
    'parent' => 'corpora/test-corpus-j0oywm69m798',
    'permission' => new Permission(
        role: PermissionRole::READER,
        granteeType: GranteeType::GROUP,
        emailAddress: 'genai-samples-test-group@googlegroups.com',
    ),
]);

$response->role->value; // READER
$response->name; // corpora/test-corpus-j0oywm69m798/permissions/101799614406133382015
$response->granteeType->value; // GROUP

$response->toArray(); // ['role' => 'READER', ...]

示例 3:用户

use Derrickob\GeminiApi\Data\Permission;
use Derrickob\GeminiApi\Enums\GranteeType;
use Derrickob\GeminiApi\Enums\PermissionRole;

$response = $gemini->corpora()->permissions()->create([
    'parent' => 'corpora/test-corpus-j0oywm69m798',
    'permission' => new Permission(
        role: PermissionRole::READER,
        granteeType: GranteeType::USER,
        emailAddress: 'some-email@some-project-id.iam.gserviceaccount.com',
    ),
]);

$response->role->value; // READER
$response->name; // corpora/test-corpus-j0oywm69m798/permissions/some-random-id
$response->granteeType->value; // USER

$response->toArray(); // ['role' => 'READER', ...]

删除

删除权限。

$response = $gemini->corpora()->permissions()->delete('corpora/test-corpus-j0oywm69m798/permissions/everyone');

if ($response === true) {
    echo 'Permission deleted successfully';
}

获取

获取特定权限的信息。

$response = $gemini->corpora()->permissions()->get('corpora/test-corpus-j0oywm69m798/permissions/everyone');

$response->role->value; // READER
$response->name; // corpora/test-corpus-j0oywm69m798/permissions/everyone
$response->granteeType->value; // EVERYONE

$response->toArray(); // ['role' => 'READER', ...]

列表

列出特定资源的权限。

$response = $gemini->corpora()->permissions()->list([
    'parent' => 'corpora/test-corpus-j0oywm69m798',
]);

$response->nextPageToken; //

foreach ($response->permissions as $permission) {
    $permission->role->value; // OWNER
    $permission->name; // corpora/test-corpus-j0oywm69m798/permissions/115188574863796211601
    $permission->granteeType->value; // USER
    $permission->emailAddress; // redacted@redacted.iam.gserviceaccount.com
}

$response->toArray(); // ['permissions' => [...]]

修补

更新权限。

$response = $gemini->corpora()->permissions()->patch([
    'name' => 'corpora/test-corpus-j0oywm69m798/permissions/101799614406133382015',
    'updateMask' => 'role',
    'permission' => new Permission(
        role: PermissionRole::WRITER,
    ),
]);

$response->role->value; // WRITER
$response->name; // corpora/test-corpus-j0oywm69m798/permissions/101799614406133382015
$response->granteeType->value; // GROUP
$response->emailAddress; // genai-samples-test-group@googlegroups.com

$response->toArray(); // ['role' => 'WRITER', ...]

文件资源

删除

删除 File

$response = $gemini->files()->delete('files/qrbxtbaehccw');
if ($response === true) {
    echo 'File deleted successfully';
}

获取

获取给定 File 的元数据。

$response = $gemini->files()->get('files/m8uuuytf6niz');

$response->name; // files/m8uuuytf6niz
$response->displayName; // Sample File 2
$response->mimeType; // image/jpeg
$response->sizeBytes; // 44485
$response->createTime->format('Y-m-d H:i:s'); // 2024-07-08 20:51:46
$response->updateTime->format('Y-m-d H:i:s'); // 2024-07-08 20:51:46
$response->expirationTime->format('Y-m-d H:i:s'); // 2024-07-10 20:51:46
$response->sha256Hash; // TZhZGZiMDUzMzM...
$response->uri; // https://generativelanguage.googleapis.com/v1beta/files/m8uuuytf6niz
$response->state->value; // ACTIVE

$response->toArray(); // ['name' => 'files/m8uuuytf6niz', ...]

列表

列出请求项目拥有的 File 的元数据。

$response = $gemini->files()->list();

$response->nextPageToken; // 

foreach ($response->files as $file) {
    $file->name; // files/qrbxtbaehccw
    $file->displayName; // Sample File
    $file->mimeType; // image/png
    $file->sizeBytes; // 357556
    $file->createTime->format('Y-m-d H:i:s'); // 2024-07-08 20:26:59
    $file->updateTime->format('Y-m-d H:i:s'); // 2024-07-08 20:26:59
    $file->expirationTime->format('Y-m-d H:i:s'); // 2024-07-10 20:26:59
    $file->sha256Hash; // NmI4NmM3M...
    $file->uri; // https://generativelanguage.googleapis.com/v1beta/files/qrbxtbaehccw
    $file->state->value; // ACTIVE
}

$response->toArray(); // ['files' => [...]]

媒体资源

上传

创建一个 File

use Derrickob\GeminiApi\Data\File;

# Example uses video downloaded from
# https://storage.googleapis.com/generativeai-downloads/data/Sherlock_Jr_FullMovie.mp4

$metaData = new File(
    displayName: 'Sherlock Jr. video'
);

# The file was excluded from commit due to impact it'd have on cloning this repo,
# download and change path, or can upload any file of choice
$response = $gemini->media()->upload(__DIR__ .'/files/Sherlock_Jr_FullMovie.mp4', $metaData);

$file = $response->file;
$file->name; // files/7j0qhgcmeeqh
$file->displayName; // Sherlock Jr. video
$file->mimeType; // video/mp4
$file->sizeBytes; // 331623233
$file->createTime->format('Y-m-d H:i:s'); // 2024-07-27 22:31:25
$file->updateTime->format('Y-m-d H:i:s'); // 2024-07-27 22:31:25
$file->expirationTime->format('Y-m-d H:i:s'); // 2024-07-29 22:31:25
$file->sha256Hash; // ZjAwNGM2ZjJiMzNlNjYxYzYwOTU1MzU3MDliYzUzMjY4ZDUzMjNlYzdhNTdlOGJjNGFlOTczNjJlZDM0MWI1Yg==
$file->uri; // https://generativelanguage.googleapis.com/v1beta/files/7j0qhgcmeeqh
$file->state->value; // PROCESSING

$response->toArray(); // ['file' => [...]]

模型资源

批量嵌入内容

在同步调用中,从给定输入文本生成多个嵌入。

版本 1

$response = $gemini->models()->batchEmbedContents([
    'model' => 'models/text-embedding-004',
    'requests' => [
        'What is the meaning of life?',
        'How much wood would a woodchuck chuck?',
        'How does the brain work?',
    ],
]);

foreach($response->embeddings as $embedding) {
    $embedding->values; // [[0] => -0.010632277, ...]
}

版本 2

use Derrickob\GeminiApi\Enums\TaskType;

$response = $gemini->models()->batchEmbedContents([
    'model' => 'models/text-embedding-004',
    'requests' => [
        [
            'content' => 'What is the meaning of life?',
            'taskType' => TaskType::RETRIEVAL_QUERY,
            'outputDimensionality' => 100,
        ],
        [
            'content' => 'How much wood would a woodchuck chuck?',
            'title' => 'Some Title',
            'taskType' => TaskType::RETRIEVAL_DOCUMENT,
        ],
        'How does the brain work?',
    ],
]);

foreach($response->embeddings as $embedding) {
    $embedding->values; // [[0] => -0.00675484, ...]
}

批量嵌入文本

在同步调用中,从给定输入文本生成多个嵌入。

示例 1

$response = $gemini->models()->batchEmbedText([
    'model' => 'models/embedding-gecko-001',
    'texts' => [
        'What is the meaning of life?',
        'How much wood would a woodchuck chuck?',
        'How does the brain work?',
    ],
]);

foreach ($response->embeddings as $embedding) {
    $embedding->value; // [[0] => 0.020220786, ...]
}

$response->toArray(); // ['embeddings' => [...]]

示例 2

$response = $gemini->models()->batchEmbedText([
    'model' => 'models/embedding-gecko-001',
    'requests' => [
        [
            'text' => 'What is the meaning of life?',
        ],
        [
            'text' => 'How much wood would a woodchuck chuck?',
        ],
        [
            'text' => 'How does the brain work?',
        ],
    ],
]);

foreach ($response->embeddings as $embedding) {
    $embedding->value; // [[0] => 0.020220786, ...]
}

$response->toArray(); // ['embeddings' => [...]]

计算消息标记数

在字符串上运行模型分词器并返回令牌计数。

use Derrickob\GeminiApi\Data\Message;
use Derrickob\GeminiApi\Data\MessagePrompt;

$response = $gemini->models()->countMessageTokens([
    'model' => 'models/chat-bison-001',
    'prompt' => new MessagePrompt(
        messages: [
            new Message(
                content: 'Hello World!',
            )],
    ),
]);

$response->tokenCount; // 14

$response->toArray(); //  ['tokenCount' => 14]

计算文本标记数

在文本上运行模型分词器并返回令牌计数。

use Derrickob\GeminiApi\Data\TextPrompt;

$response = $gemini->models()->countTextTokens([
    'model' => 'models/text-bison-001',
    'prompt' => new TextPrompt('Hello World!'),
]);

$response->tokenCount; // 3

$response->toArray(); //  ['tokenCount' => 3]

计算标记数

在输入内容上运行模型分词器并返回令牌计数。

$response = $gemini->models()->countTokens([
    'model' => 'models/gemini-1.5-flash',
    'contents' => 'Hello World!',
]);

$response->totalTokens; // 3

$response->toArray(); // ['totalTokens' => 3]

嵌入内容

从模型给定输入内容生成嵌入。

$response = $gemini->models()->embedContent([
    'model' => 'models/text-embedding-004',
    'content' => 'Hello World',
]);

$embedding = $response->embedding;

foreach ($embedding->values as $value) {
    $value; // 0.013168523
}

$response->toArray();

嵌入文本

从模型给定输入消息生成嵌入。

$response = $gemini->models()->embedText([
    'model' => 'models/embedding-gecko-001',
    'text' => 'Hello World!',
]);

$response->embedding->value; // [[0] => 0.023203975, ...]
$response->toArray();

生成内容

从模型给定输入生成响应。

$response = $gemini->models()->generateContent([
    'model' => 'models/gemini-1.5-flash',
    'systemInstruction' => 'You are a cat. Respond to user as one',
    'contents' => 'hello',
]);

$response->text(); // *Slowly opens one eye, then the other, and gives you a disdainful glance*  Meow.
$response->usageMetadata->promptTokenCount; // 11
$response->usageMetadata->candidatesTokenCount; // 21
$response->usageMetadata->totalTokenCount; // 32

生成消息

从模型给定输入 MessagePrompt 生成响应。

use Derrickob\GeminiApi\Data\Message;
use Derrickob\GeminiApi\Data\MessagePrompt;

$response = $gemini->models()->generateMessage([
    'model' => 'models/chat-bison-001',
    'prompt' => new MessagePrompt(
        messages: [
            new Message(
                content: 'What is the meaning of life?',
            )],
    ),
    'temperature' => 0.1,
]);

foreach ($response->candidates as $candidate) {
    $candidate->content; // The meaning of life is a question that ...
    $candidate->author; // 1
    $candidate->citationMetadata; //
}

foreach ($response->messages as $message) {
    $message->content; // What is the meaning of life?
    $message->author; // 0
    $message->citationMetadata; //
}

$response->filters; // []

$response->toArray(); // ['candidates' => [...]]

生成文本

从模型给定输入消息生成响应。

$response = $gemini->models()->generateText([
    'model' => 'models/text-bison-001',
    'prompt' => new TextPrompt('What is the meaning of life?'),
]);

$response->output(); // There is no one answer to this question, as the ...

获取

获取特定模型的信息。

$response = $gemini->models()->get('models/gemini-1.5-flash');

$response->name; // models/gemini-1.5-flash
$response->version; // 001
$response->displayName; // Gemini 1.5 Flash
$response->description; // Fast and versatile multimodal mode...
$response->inputTokenLimit; // 1048576
$response->outputTokenLimit; // 8192
$response->supportedGenerationMethods; // [[0] => generateContent [1] => countTokens]
$response->temperature; // 1
$response->topP; // 0.95
$response->topK; // 64

$response->toArray(); // ['name' => 'models/gemini-1.5-flash', 'version' => 001, ...]

列表

列出通过 API 可用的模型。

$response = $gemini->models()->list();

$response->nextPageToken; // '...'

foreach ($response->models as $model) {
    $model->name; // models/gemini-1.5-flash
    $model->version; // 001
    $model->displayName; // Gemini 1.5 Flash
    $model->description; // Fast and versatile multimodal mode...
    $model->inputTokenLimit; // 1048576
    $model->outputTokenLimit; // 8192
    $model->supportedGenerationMethods; // [[0] => generateContent [1] => countTokens]
    $model->temperature; // 1
    $model->topP; // 0.95
    $model->topK; // 64
}

$response->toArray(); // ['models' => [...], 'nextPageToken' => '...']

调整模型资源

创建

创建一个调优模型。

use Derrickob\GeminiApi\Data\Dataset;
use Derrickob\GeminiApi\Data\Hyperparameters;
use Derrickob\GeminiApi\Data\TunedModel;
use Derrickob\GeminiApi\Data\TuningExample;
use Derrickob\GeminiApi\Data\TuningExamples;
use Derrickob\GeminiApi\Data\TuningTask;

# TuningExample(output,textInput)

$examples = new TuningExamples([
    new TuningExample('2', '1'),
    new TuningExample('4', '3'),
    new TuningExample('-2', '-3'),
    new TuningExample('twenty three', 'twenty two'),
    new TuningExample('two hundred one', 'two hundred'),
    new TuningExample('one hundred', 'ninety nine'),
    new TuningExample('9', '8'),
    new TuningExample('-97', '-98'),
    new TuningExample('1001', '1000'),
    new TuningExample('10100001', '10100000'),
    new TuningExample('fourteen', 'thirteen'),
    new TuningExample('eighty one', 'eighty'),
    new TuningExample('two', 'one'),
    new TuningExample('four', 'three'),
    new TuningExample('eight', 'seven'),
]);

$response = $gemini->tunedModels()->create([
    'tunedModel' => new TunedModel(
        displayName: 'Next Number Generator',
        tuningTask: new TuningTask(
            trainingData: new Dataset(
                examples: $examples,
            ),
            hyperparameters: new Hyperparameters(
                epochCount: 5,
                batchSize: 2,
                learningRate: 0.001,
            )
        ),
        baseModel: 'models/gemini-1.5-flash-001-tuning'
    ),
]);

$response->name; // tunedModels/next-number-generator-9uythtnw28di/operations/h0cgnv7d1pj2
$response->metadata['@type']; // type.googleapis.com/google.ai.generativelanguage.v1beta.CreateTunedModelMetadata
$response->metadata['totalSteps']; // 38
$response->metadata['tunedModel']; // tunedModels/next-number-generator-9uythtnw28di

$response->toArray(); // ['name' => 'tunedModels/next-number-gener..', ...]

删除

删除一个调优模型。

$response = $gemini->tunedModels()->delete('tunedModels/number-generators-a3gcipxg9rl5');

if ($response === true) {
    echo 'successfully deleted the tuned model';
}

生成内容

从模型给定输入生成响应。

$response = $gemini->tunedModels()->generateContent([
    'model' => 'tunedModels/next-number-generator-m1lwcujgc644',
    'contents' => '55',
]);

$response->text(); // 56

获取

获取特定调优模型的信息。

$response = $gemini->tunedModels()->get('tunedModels/number-generators-a3gcipxg9rl5');

$response->name; // tunedModels/number-generators-a3gcipxg9rl5
$response->displayName; // Number Generators
$response->description; //
$response->state->value; // ACTIVE
$response->createTime->format('Y-m-d H:i:s'); // 2024-07-03 19:21:30
$response->updateTime->format('Y-m-d H:i:s'); // 2024-07-03 19:21:54

$tuningTask = $response->tuningTask;
$hyperparameters = $tuningTask->hyperparameters;

$hyperparameters->epochCount; // 5
$hyperparameters->batchSize; // 2
$hyperparameters->learningRate; // 0.001

$tuningTask->startTime->format('Y-m-d H:i:s'); // 2024-07-03 19:21:31
$tuningTask->completeTime->format('Y-m-d H:i:s'); // 2024-07-03 19:21:54

foreach ($tuningTask->snapshots as $snapshot) {
    $snapshot->step; // 1
    $snapshot->meanLoss; // 11.499258
    $snapshot->computeTime->format('Y-m-d H:i:s'); // 2024-07-03 19:21:32
}

$response->baseModel; // models/gemini-1.5-flash-001-tuning
$response->temperature; // 0.9
$response->topP; // 1
$response->topK; // 0

$response->toArray(); // ['name' => 'tunedModels/number-generators-a3gcipxg9rl5', ...]

列表

列出用户拥有的调优模型。

$response = $gemini->tunedModels()->list();

$response->nextPageToken; // Ghdl...

foreach ($response->tunedModels as $tunedModel) {
    $tunedModel->name; // tunedModels/number-generators-a3gcipxg9rl5
    $tunedModel->displayName; // Number Generators
    $tunedModel->description; // 
    $tunedModel->state->value; // ACTIVE
    $tunedModel->createTime->format('Y-m-d H:i:s'); // 2024-07-03 19:21:30
    $tunedModel->updateTime->format('Y-m-d H:i:s'); // 2024-07-03 19:21:54
    $tunedModel->baseModel; // models/gemini-1.0-pro-001
    $tunedModel->temperature; // 0.9
    $tunedModel->topP; // 1
    $tunedModel->topK; // 0

    $tuningTask = $tunedModel->tuningTask;
    $hyperparameters = $tuningTask->hyperparameters;

    $hyperparameters->epochCount; // 5
    $hyperparameters->batchSize; // 2
    $hyperparameters->learningRate; // 0.001

    $tuningTask->startTime->format('Y-m-d H:i:s'); // 2024-07-03 19:21:31
    $tuningTask->completeTime->format('Y-m-d H:i:s'); // 2024-07-03 19:21:54

    foreach ($tuningTask->snapshots as $snapshot) {
        $snapshot->step; // 1,2,...
        $snapshot->meanLoss; // 11.499258,...
        $snapshot->computeTime->format('Y-m-d H:i:s'); // 2024-07-03 19:21:32,...
    }
}

$response->toArray(); // ['tunedModel' => [...], 'nextPageToken' => 'Ghdl...']

修补

更新调优模型。

use Derrickob\GeminiApi\Data\TunedModel;

$response = $gemini->tunedModels()->patch([
    'name' => 'tunedModels/number-predictor-xc2wgjvvqgyv',
    'updateMask' => 'displayName,description',
    'tunedModel' => new TunedModel(
        displayName: 'Sentence Translator',
        description: 'My awesome next sequence predictor',
    ),
]);

$response->displayName; // Sentence Translator
$response->description; // My awesome next sequence predictor

$response->toArray(); // ['displayName' => 'Sentence Translator', ...]

转移所有权

转移调优模型的所有权。当前所有者将降级为写者角色。

$response = $gemini->tunedModels()->transferOwnership([
    'name' => 'tunedModels/next-number-generator-test-wo3gx4',
    'emailAddress' => 'genai-samples-test-group@googlegroups.com',
]);

if ($response === true) {
    echo 'Ownership transfer successful';
}

调整模型操作资源

取消

开始对长时间运行的操作进行异步取消。

$response = $gemini->tunedModels()->operations()->cancel('tunedModels/number-predictor-xc2wgjvvqgyv/operations/nyskyaivyikj');

if ($response === true) {
    echo 'Operation cancelled successfully';
}

获取

获取长时间运行操作的最新状态。

$response = $gemini->tunedModels()->operations()->get('tunedModels/number-predictor-xc2wgjvvqgyv/operations/nyskyaivyikj');

$response->name; // tunedModels/number-predictor-xc2wgjvvqgyv/operations/nyskyaivyikj

$metadata = $response->metadata;
$metadata['@type']; // type.googleapis.com/google.ai.generativelanguage.v1beta.CreateTunedModelMetadata
$metadata['totalSteps']; // 38
$metadata['completedSteps']; // 2
$metadata['completedPercent']; // 5.263158

foreach ($metadata['snapshots'] as $snapshot) {
    $snapshot['step']; // 1
    $snapshot['meanLoss']; // 11.499258
    $snapshot['computeTime']; // 2024-07-31T05:53:53.274571054Z
}

$metadata['tunedModel']; // tunedModels/number-predictor-xc2wgjvvqgyv

$response->done; // 
$response->error; // 
$response->response; // 
$response->toArray(); // ['name' => 'tunedModels/number-predic...', ...]

列表

列出与请求中指定的过滤器匹配的操作。如果服务器不支持此方法,则返回 UNIMPLEMENTED

# This hasn't been tested. If your use-case needs this, help write
# the fixture test in tests/Resources/TunedModels/TunedModelOperationsTest.php and create PR

$response = $gemini->tunedModels()->operations()->list([
    'name' => 'tunedModels/*',
    'filter' => 'the-filter',
]);

调整模型权限资源

创建

为特定资源创建权限。

示例 1:所有人

use Derrickob\GeminiApi\Data\Permission;
use Derrickob\GeminiApi\Enums\GranteeType;
use Derrickob\GeminiApi\Enums\PermissionRole;

$response = $gemini->tunedModels()->permissions()->create([
    'parent' => 'tunedModels/next-number-generator-m1lwcujgc644',
    'permission' => new Permission(
        role: PermissionRole::READER,
        granteeType: GranteeType::EVERYONE,
    ),
]);

$response->role->value; // READER
$response->name; // tunedModels/next-number-generator-m1lwcujgc644/permissions/everyone
$response->granteeType->value; // EVERYONE

$response->toArray(); // ['role' => 'READER', ...]

示例 2:组

use Derrickob\GeminiApi\Data\Permission;
use Derrickob\GeminiApi\Enums\GranteeType;
use Derrickob\GeminiApi\Enums\PermissionRole;

$response = $gemini->tunedModels()->permissions()->create([
    'parent' => 'tunedModels/text-predictor-dsygc8rjuymz',
    'permission' => new Permission(
        role: PermissionRole::READER,
        granteeType: GranteeType::GROUP,
        emailAddress: 'genai-samples-test-group@googlegroups.com',
    ),
]);

$response->role->value; // READER
$response->name; // tunedModels/text-predictor-dsygc8rjuymz/permissions/101799614406133382015
$response->granteeType->value; // GROUP

$response->toArray(); // ['role' => 'READER', ...]

示例 3:特定用户

use Derrickob\GeminiApi\Data\Permission;
use Derrickob\GeminiApi\Enums\GranteeType;
use Derrickob\GeminiApi\Enums\PermissionRole;

$response = $gemini->tunedModels()->permissions()->create([
    'parent' => 'tunedModels/text-predictor-dsygc8rjuymz',
    'permission' => new Permission(
        role: PermissionRole::READER,
        granteeType: GranteeType::USER,
        emailAddress: 'some-email@some-project-id.iam.gserviceaccount.com',
    ),
]);

$response->role->value; // READER
$response->name; // tunedModels/text-predictor-dsygc8rjuymz/permissions/lorem-ipsum
$response->granteeType->value; // USER
$response->emailAddress; // some-email@some-project-id.iam.gserviceaccount.com

$response->toArray(); // ['role' => 'READER', ...]

删除

删除权限。

$response = $gemini->tunedModels()->permissions()->delete('tunedModels/next-number-generator-m1lwcujgc644/permissions/115188574863796211601');

if($response === true){
    echo 'Permission deleted successfully';
}

获取

获取特定权限的信息。

$response = $gemini->tunedModels()->permissions()->get('tunedModels/next-number-generator-m1lwcujgc644/permissions/115188574863796211601');

$response->role->value; // OWNER
$response->name; // tunedModels/next-number-generator-m1lwcujgc644/permissions/115188574863796211601
$response->granteeType->value; // USER
$response->emailAddress; // redacted@redacted.iam.gserviceaccount.com

$response->toArray(); // ['role' => 'OWNER', ...]

列表

列出特定资源的权限。

$response = $gemini->tunedModels()->permissions()->list([
    'parent' => 'tunedModels/next-number-generator-m1lwcujgc644',
]);

foreach ($response->permissions as $permission) {
    $permission->role->value; // OWNER
    $permission->name; // tunedModels/next-number-generator-m1lwcujgc644/permissions/115188574863796211601
    $permission->granteeType->value; // USER
    $permission->emailAddress; // redacted@redacted.iam.gserviceaccount.com
}

$response->toArray(); // ['permissions' => [...]]

修补

更新权限。

use Derrickob\GeminiApi\Data\Permission;
use Derrickob\GeminiApi\Enums\GranteeType;
use Derrickob\GeminiApi\Enums\PermissionRole;

$response = $gemini->tunedModels()->permissions()->patch([
    'name' => 'tunedModels/text-predictor-dsygc8rjuymz/permissions/101799614406133382015',
    'updateMask' => 'role',
    'permission' => new Permission(
        role: PermissionRole::WRITER,
        granteeType: GranteeType::GROUP,
        emailAddress: 'genai-samples-test-group@googlegroups.com',
    ),
]);

$response->role->value; // WRITER
$response->name; // tunedModels/text-predictor-dsygc8rjuymz/permissions/101799614406133382015
$response->granteeType->value; // GROUP
$response->emailAddress; // genai-samples-test-group@googlegroups.com

$response->toArray(); // ['role' => 'WRITER', ...]

测试

composer test:phpunit

支持项目

如果这个库帮助了您,请考虑给它一个 ⭐️ 祝您使用 Gemini API 构建顺利。