derrickob / gemini-api
一个轻量级、高效的定制PHP客户端,用于无缝集成Google Gemini API。
Requires
- php: ^8.1
- ext-fileinfo: *
- google/auth: ^1.41.0
- google/protobuf: ^4.27.3
- saloonphp/saloon: ^3.10.0
Requires (Dev)
- fakerphp/faker: ^1.23.1
- friendsofphp/php-cs-fixer: ^3.62.0
- mockery/mockery: dev-main
- phpstan/phpstan: ^1.11.10
- phpunit/phpunit: ^9.6.20
- rector/rector: ^1.2.2
- vlucas/phpdotenv: ^5.6.1
README
Google Gemini API的定制PHP客户端
重要
这个库是一个独立的创作,旨在提供访问最新Google Gemini API功能和功能。它既不受到认可,也不是官方库。如果您正在寻找官方Google Gemini API库,请在此检查.
核心依赖项为SaloonPHP。
目录
- # Google Gemini API的定制PHP客户端
- 目录
- 版本
- 先决条件
- 安装
- 注意
- 入门
- 缓存内容资源
- 语料库资源
- 语料库文档资源
- 语料库文档块资源
- 语料库权限资源
- 文件资源
- 媒体资源
- 模型资源
- 调整模型资源
- 调整模型操作资源
- 调整模型权限资源
- 测试
- 支持项目
版本
此库默认使用Gemini API的beta版本,以确保访问最新的功能。
版本方案遵循格式v1.x.y
y
在修补和向后兼容的错误修复时增加。x
在新增功能或可能包含破坏性更改的更改时增加。
为了确保与该库的稳定性,您可以考虑将composer版本锁定到特定版本。在审查变更日志并确保您能够适应新版本中的任何破坏性更改后,再更新您的包。然而,如果您使用默认的(v1beta
)API版本,则这不会适用于任何上游的破坏性更改。
由于可能存在偶尔的破坏性更改,此库可能需要更频繁的x
版本增加来适应这些更改,这主要针对它之前实施过的现有损坏功能。
您还可以通过在构建Gemini类时显式定义它来将您的使用锁定为v1
,并注意在v1
和v1beta
中哪些功能可用。如果您在v1
API中收到包含v1beta
-特定参数(完全是)的请求,那么您很可能会遇到错误,因此使用v1beta
似乎对于此库来说是强制性的,因为整个开发都是基于v1beta
语法进行的,除了调整模型操作路由到v1
之外。
先决条件
依赖项
- PHP 8.1+
- Composer
设置您的API密钥
要使用Gemini API,您需要一个API密钥。如果您还没有,请在Google AI Studio中创建一个密钥。 获取API密钥
设置服务帐户
- 访问Google开发者控制台,如果您还没有,则创建一个新的项目。
- 在导航菜单中,选择APIs & Services > 凭据。
- 点击创建凭据并选择服务帐户。
- 为服务帐户输入一个名称,然后点击创建。
- 为您的服务帐户分配必要的角色,然后点击继续。
- 点击创建密钥,选择JSON密钥类型,然后点击创建。
- 您的新公钥/私钥对将下载到您的计算机上;这是您的服务帐户密钥。
- 安全地存储包含密钥的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....
注意
- API语法和命名:此库简化了官方API语法的一些方面,并对某些方法进行了重命名以避免冲突。在编写不使用简化方法的完整请求时,请参考官方文档以及库中的等效类名以确保准确性。只有少数重命名的类可能会阻止您编写自己的基于文档的请求,如果简化版本对您来说不完整或不达标。
- 查询参数:在示例中未明确显示的任何查询参数(例如,
pageSize
,pageToken
)都可以作为关联数组在请求中传递。例如:$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 构建顺利。