{"id":43001341,"url":"https://github.com/derrickobedgiu1/gemini-api","last_synced_at":"2026-01-31T04:07:25.817Z","repository":{"id":252677740,"uuid":"841103697","full_name":"derrickobedgiu1/gemini-api","owner":"derrickobedgiu1","description":"A lightweight, efficient, custom PHP Client for seamless Google Gemini API integration.","archived":false,"fork":false,"pushed_at":"2024-08-25T18:57:39.000Z","size":669,"stargazers_count":4,"open_issues_count":1,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-11-27T14:52:51.457Z","etag":null,"topics":["api","gemini","gemini-api","gemini-client","generative-ai","google","google-gemini","php"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/derrickobedgiu1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-11T16:45:50.000Z","updated_at":"2025-09-09T01:22:19.000Z","dependencies_parsed_at":null,"dependency_job_id":"1d23eb58-77eb-4b20-a1c0-9fab01852808","html_url":"https://github.com/derrickobedgiu1/gemini-api","commit_stats":null,"previous_names":["derrickobedgiu1/gemini-api"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/derrickobedgiu1/gemini-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/derrickobedgiu1%2Fgemini-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/derrickobedgiu1%2Fgemini-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/derrickobedgiu1%2Fgemini-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/derrickobedgiu1%2Fgemini-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/derrickobedgiu1","download_url":"https://codeload.github.com/derrickobedgiu1/gemini-api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/derrickobedgiu1%2Fgemini-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28928838,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-31T04:05:25.756Z","status":"ssl_error","status_checked_at":"2026-01-31T04:02:35.005Z","response_time":128,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","gemini","gemini-api","gemini-client","generative-ai","google","google-gemini","php"],"created_at":"2026-01-31T04:07:25.105Z","updated_at":"2026-01-31T04:07:25.801Z","avatar_url":"https://github.com/derrickobedgiu1.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"![](files/banner.jpeg)\n*Image Credit: Google DeepMind*\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://packagist.org/packages/derrickob/gemini-api\"\u003e\u003cimg alt=\"Packagist Version\" src=\"https://img.shields.io/packagist/v/derrickob/gemini-api\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/derrickobedgiu1/gemini-api/blob/main/LICENSE\"\u003e\u003cimg alt=\"GitHub License\" src=\"https://img.shields.io/github/license/derrickobedgiu1/gemini-api\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n# Custom PHP Client for Google Gemini API\n------\n\n\u003e [!IMPORTANT]\n\u003e **This library is an independent creation that tries to provide access to the latest Google Gemini API features \u0026 capabilities. It is neither endorsed nor an official library. If you're looking for Official Google Gemini API libraries, please [Check Here](https://ai.google.dev/gemini-api/docs/downloads)**.\n\nBuilt with [SaloonPHP](https://github.com/saloonphp/saloon) as Core Dependency.\n\n## Table of Contents\n\u003c!-- TOC --\u003e\n  * [# Custom PHP Client for Google Gemini API](#-custom-php-client-for-google-gemini-api)\n  * [Table of Contents](#table-of-contents)\n  * [Releases](#releases)\n  * [Prerequisites](#prerequisites)\n    * [Dependencies](#dependencies)\n    * [Set up your API Key](#set-up-your-api-key)\n    * [Set Up Service Account](#set-up-service-account)\n  * [Installation](#installation)\n    * [Environment Variables](#environment-variables)\n  * [Notes](#notes)\n  * [Getting Started](#getting-started)\n    * [API Key](#api-key)\n    * [Service Account](#service-account)\n    * [Manual Credentials](#manual-credentials)\n    * [Proxy](#proxy)\n  * [Cached Content Resource](#cached-content-resource)\n    * [create](#create)\n    * [delete](#delete)\n    * [get](#get)\n    * [list](#list)\n    * [patch](#patch)\n  * [Corpora Resource](#corpora-resource)\n    * [create](#create-1)\n    * [delete](#delete-1)\n    * [get](#get-1)\n    * [list](#list-1)\n    * [patch](#patch-1)\n    * [query](#query)\n  * [Corpora Document Resource](#corpora-document-resource)\n    * [create](#create-2)\n    * [delete](#delete-2)\n    * [get](#get-2)\n    * [list](#list-2)\n    * [patch](#patch-2)\n    * [query](#query-1)\n  * [Corpora Document Chunk Resource](#corpora-document-chunk-resource)\n    * [batchCreate](#batchcreate)\n    * [batchDelete](#batchdelete)\n    * [batchUpdate](#batchupdate)\n    * [create](#create-3)\n    * [delete](#delete-3)\n    * [get](#get-3)\n    * [list](#list-3)\n    * [patch](#patch-3)\n  * [Corpora Permission Resource](#corpora-permission-resource)\n    * [create](#create-4)\n    * [delete](#delete-4)\n    * [get](#get-4)\n    * [list](#list-4)\n    * [patch](#patch-4)\n  * [File Resource](#file-resource)\n    * [delete](#delete-5)\n    * [get](#get-5)\n    * [list](#list-5)\n  * [Media Resource](#media-resource)\n    * [upload](#upload)\n  * [Model Resource](#model-resource)\n    * [batchEmbedContents](#batchembedcontents)\n    * [batchEmbedText](#batchembedtext)\n    * [countMessageTokens](#countmessagetokens)\n    * [countTextTokens](#counttexttokens)\n    * [countTokens](#counttokens)\n    * [embedContent](#embedcontent)\n    * [embedText](#embedtext)\n    * [generateContent](#generatecontent)\n    * [generateMessage](#generatemessage)\n    * [generateText](#generatetext)\n    * [get](#get-6)\n    * [list](#list-6)\n  * [Tuned Model Resource](#tuned-model-resource)\n    * [create](#create-5)\n    * [delete](#delete-6)\n    * [generateContent](#generatecontent-1)\n    * [get](#get-7)\n    * [list](#list-7)\n    * [patch](#patch-5)\n    * [transferOwnership](#transferownership)\n  * [Tuned Model Operation Resource](#tuned-model-operation-resource)\n    * [cancel](#cancel)\n    * [get](#get-8)\n    * [list](#list-8)\n  * [Tuned Model Permission Resource](#tuned-model-permission-resource)\n    * [create](#create-6)\n    * [delete](#delete-7)\n    * [get](#get-9)\n    * [list](#list-9)\n    * [patch](#patch-6)\n  * [Tests](#tests)\n  * [Support Project](#support-project)\n\u003c!-- TOC --\u003e\n\n## Releases\nThis library uses the beta version of the Gemini API by default to try and ensure access to the most recent functionalities.\n\nThe versioning scheme follows the format `v1.x.y`: \n1. `y` is incremented for patches and backward-compatible bug fixes.\n2. `x` is incremented for new features or changes that may include breaking changes.\n\nTo ensure stability **with this library**, you may consider locking your composer version to a specific release. Update your package only after reviewing the changelog and ensuring you can accommodate any breaking changes in the new release. This, however, won't apply for any upstream breaking changes if you're using the default (`v1beta`) API version.\n\nSince there may be occasional breaking changes from the beta version, this library may end up having more frequent `x` version increments to adapt to these changes, mostly for existing broken functionalities it previously implemented.\n\nYou can also lock your usage to `v1` by explicitly defining it when constructing the Gemini class, keeping note of which features are available in `v1` and those in `v1beta`. There's a high chance you'll also get errors if the `v1` API receives request containing `v1beta`-specific parameters (which fully are), so using `v1beta` might seem mandatory with this library as the entire development was based on `v1beta` syntax except tuned model operations that route to `v1`.\n\n## Prerequisites\n### Dependencies\n1. PHP 8.1+\n2. [Composer](https://getcomposer.org/)\n\n### Set up your API Key\nTo use the Gemini API, you'll need an API key. If you don't already have one, create a key in Google AI Studio. [Get an API Key](https://aistudio.google.com/app/apikey)\n\n### Set Up Service Account\n\n1. Go to the [Google Developer Console](https://console.cloud.google.com/) and create a new project if you don't already have one.\n2. In the navigation menu, select **APIs \u0026 Services \u003e Credentials**.\n3. Click on **Create credentials** and select **Service account**.\n4. Enter a name for the service account and click **Create**.\n5. Assign the necessary roles to your service account and click **Continue**.\n6. Click on **Create Key**, choose the **JSON** key type, and click **Create**.\n7. Your new public/private key pair will be downloaded to your computer; this is your service accountkey.\n8. Securely store the JSON file containing the key, as it allows access to the Gemini API. You'll provide the path to it in your code.\n\n## Installation\n\n```shell\ncomposer require derrickob/gemini-api\n```\nFor caching access token requests from your service account JSON file, use any PSR-6 compatible cache library such as `symphony/cache` (requires PHP \u003e= 8.2).\n```shell\ncomposer require symfony/cache\n```\n\n### Environment Variables\nSet your environment variables:\n\n*Powershell*\n\n```powershell\n$Env:GOOGLE_API_KEY = \"AIza....\"\n```\n\n*Cmd*\n\n```cmd\nset GOOGLE_API_KEY=AIza....\n```\n\n_Linux or macOS_\n\n```shell\nexport GOOGLE_API_KEY=AIza....\n```\n\n## Notes\n1. **API Syntax and Naming:** This library simplifies some aspects of the official API syntax and renames certain methods to avoid conflicts. When writing full requests which don't use the simplified methods, refer to the official documentation alongside the library equivalent class names to ensure accuracy. Only the few renamed classes should prevent you from writing your own documentation-led request if the simplified versions are incomplete/sub-standard for you.\n2. **Query Parameters:** Any query parameters not explicitly shown in the examples (e.g., `pageSize`, `pageToken`) can be passed as an associative array within the request. For instance: `$gemini-\u003emodels()-\u003elist(['pageSize' =\u003e 5, 'pageToken' =\u003e 'the-token']);`\n\n**If the class names are complex to build a request, you can always build using array and passing to their `fromArray` static method (available in all classes).** The JSON Mode example addon in the `examples/` folder uses this. Note that the field data you're passing should be compatible with the expected syntax and data of the class whose `fromArray` you're trying to use.\n\n## Getting Started\n\n### API Key\nThe example demonstrates an endpoint request that uses an API key for authentication.\n\n```php\n\u003c?php\n\nrequire_once 'vendor/autoload.php';\n\nuse Derrickob\\GeminiApi\\Gemini;\n\n$apiKey = getenv('GOOGLE_API_KEY');\n\n$gemini = new Gemini([\n    'apiKey' =\u003e $apiKey,\n]);\n\n$response = $gemini-\u003emodels()-\u003egenerateContent([\n    'model' =\u003e 'models/gemini-1.5-flash',\n    'systemInstruction' =\u003e 'You are a helpful assistant',\n    'contents' =\u003e 'Hello',\n]);\n\necho $response-\u003etext(); // Hello!👋  What can I do for you today?\n```\n\n### Service Account\nTuned Models and Corpora endpoints require a more secure authentication. It's easy to use your service account file.\nThe example uses `symphony/cache` to store the access token, but you can replace it with your preferred PSR-6 cache library, or not cache access token which results in requesting new access token for every single request you make.\nFor security purposes, the cache configuration are left to default and if you need to modify these then please refer to documentation of cache library you're using. For `symphony/cache` can be accessed [here](https://symfony.com/doc/current/components/cache.html). File system cache adapter is used, but you can always use any adapter of your choice.\n\n```php\n\u003c?php\n\nrequire_once \"vendor/autoload.php\";\n\nuse Derrickob\\GeminiApi\\Gemini;\nuse Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter;\n\nputenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/my/credentials.json');\n\n$apiKey = getenv('GOOGLE_API_KEY');\n$cacheItemPool = new FilesystemAdapter();\n\n$gemini = new Gemini([\n    'apiKey' =\u003e $apiKey,\n    'cacheItemPool' =\u003e $cacheItemPool,\n]);\n\n$response = $gemini-\u003etunedModels()-\u003elist();\n\n$response-\u003enextPageToken; // \n\nforeach ($response-\u003etunedModels as $tunedModel) {\n    $tunedModel-\u003ename; // tunedModels/number-generators-a3gcipxg9rl5\n    $tunedModel-\u003edisplayName; // Number Generators\n    $tunedModel-\u003edescription; // \n}\n\n// See the list tuned model resource section for full usage\n```\n\n### Manual Credentials\nWhile not recommended for security reasons, it's possible to manually set credentials when initializing the Gemini class if you need flexibility in how you manage and provide API access in your codebase. The security of this method and logic of caching access tokens is up to you to implement as hard-coding the credentials is discouraged; use `GOOGLE_APPLICATION_CREDENTIALS` in previous section instead.\n\n```php\n\u003c?php\n\nrequire_once \"vendor/autoload.php\";\n\nuse Derrickob\\GeminiApi\\Gemini;\n\n$apiKey = getenv('GOOGLE_API_KEY');\n\n$credentials = [\n    'key' =\u003e 'value',\n];\n\n$gemini = new Gemini([\n    'apiKey' =\u003e $apiKey,\n    'credentials' =\u003e $credentials,\n]);\n```\n\n### Proxy\nIf your API use requires a proxy for all your requests, a Guzzle `proxy` option is open for you to write to when constructing the Gemini class.\n\n```php\n$proxySettings = [\n    'http'  =\u003e 'http://your-proxy-server:port',\n    'https' =\u003e 'http://your-proxy-server:port',\n];\n\n$gemini = new Gemini([\n    'apiKey' =\u003e $apiKey,\n    'proxy' =\u003e $proxySettings,\n]);\n```\n\n## Cached Content Resource\n\n### create\nCreates CachedContent resource.\n\nThis example uses the _Sherlock Jr. movie_ video used in documentation. File was first uploaded with [media upload](#upload)\n\n```php\nuse Derrickob\\GeminiApi\\Data\\CachedContent;\nuse Derrickob\\GeminiApi\\Data\\Content;\n\n$file = 'https://generativelanguage.googleapis.com/v1beta/files/7j0qhgcmeeqh';\n\n$response = $gemini-\u003ecachedContents()-\u003ecreate(\n    new CachedContent(\n        model: 'models/gemini-1.5-flash-001',\n        displayName: 'sherlock jr movie',\n        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.\"),\n        contents: [\n            Content::createFileContent($file, 'video/mp4', 'user'),\n        ],\n        ttl: '3600s',\n    ),\n);\n\n$response-\u003emodel; // models/gemini-1.5-flash-001\n$response-\u003ename; // cachedContents/lg5adbi62ykx\n$response-\u003edisplayName; // sherlock jr movie\n$response-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-04 23:15:53\n$response-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-04 23:15:53\n$response-\u003eusageMetadata-\u003etotalTokenCount; // \n$response-\u003eexpireTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-05 00:15:53\n\n$response-\u003etoArray(); // ['model' =\u003e 'models/gemini-1.5-flash-001', ...]\n```\n\n\u003cdetails\u003e\n\u003csummary\u003eGenerate Content with a Cached Content\u003c/summary\u003e\n\nThe timeout for `generateContent` is set to 60s, request timeout to 120s. If your request is still exceeding these limits you may propose an increase.\n\n```php\nuse Derrickob\\GeminiApi\\Data\\Content;\n\n$response = $gemini-\u003emodels()-\u003egenerateContent([\n    'model' =\u003e 'models/gemini-1.5-flash-001',\n    'contents' =\u003e 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'),\n    'cachedContent' =\u003e 'cachedContents/lg5adbi62ykx',\n]);\n\necho $response-\u003etext();\n```\n\u003c/details\u003e\n\n### delete\nDeletes CachedContent resource.\n\n```php\n$response = $gemini-\u003ecachedContents()-\u003edelete('cachedContents/2wojeqz7srpu');\n\nif ($response === true) {\n    echo 'Successfully deleted the cached Content';\n}\n```\n\n### get\nReads CachedContent resource.\n\n```php\n$response = $gemini-\u003ecachedContents()-\u003eget('cachedContents/2wojeqz7srpu');\n\n$response-\u003emodel; // models/gemini-1.5-flash-001\n$response-\u003ename; // cachedContents/2wojeqz7srpu\n$response-\u003edisplayName; // Repository Specialist\n$response-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-04 23:15:53\n$response-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-04 23:15:53\n$response-\u003eusageMetadata-\u003etotalTokenCount; // 259246\n$response-\u003eexpireTime-\u003eformat('Y-m-d H:i:s'); // 2024-08-04 23:15:53\n\n$response-\u003etoArray(); // ['model' =\u003e 'models/gemini-1.5-flash-001', ...]\n\n```\n\n### list\nLists CachedContents.\n\n```php\n$response = $gemini-\u003ecachedContents()-\u003elist();\n\n$response-\u003enextPageToken; // \n\nforeach ($response-\u003ecachedContents as $cachedContent) {\n    $cachedContent-\u003emodel; // models/gemini-1.5-flash-001\n    $cachedContent-\u003ename; // cachedContents/2wojeqz7srpu\n    $cachedContent-\u003edisplayName; // Repository Specialist\n    $cachedContent-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-04 23:15:53\n    $cachedContent-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-04 23:15:53\n    $cachedContent-\u003eusageMetadata-\u003etotalTokenCount; // 259246\n    $cachedContent-\u003eexpireTime-\u003eformat('Y-m-d H:i:s'); // 2024-10-28 17:02:31\n}\n\n$response-\u003etoArray(); // ['cachedContents' =\u003e [...], ...]\n```\n\n### patch\nUpdates CachedContent resource (only expiration is updatable).\n\n```php\n$response = $gemini-\u003ecachedContents()-\u003epatch([\n    'name' =\u003e 'cachedContents/2wojeqz7srpu',\n    'updateMask' =\u003e 'ttl',\n    'cachedContent' =\u003e new CachedContent(\n        ttl: '3600s'\n    ),\n]);\n\n$response-\u003emodel; // models/gemini-1.5-flash-001\n$response-\u003ename; // cachedContents/2wojeqz7srpu\n$response-\u003edisplayName; // Repository Specialist\n$response-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-04 23:15:53\n$response-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-05 07:02:21\n$response-\u003eusageMetadata-\u003etotalTokenCount; // 259246\n$response-\u003eexpireTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-05 08:02:21\n\n$response-\u003etoArray(); // ['model' =\u003e 'models/gemini-1.5-flash-001', ...]\n```\n\n## Corpora Resource\n\n### create\nCreates an empty `Corpus`.\n\n```php\nuse Derrickob\\GeminiApi\\Data\\Corpus;\n\n$response = $gemini-\u003ecorpora()-\u003ecreate(\n    new Corpus(\n        displayName: 'My Awesome Corpora'\n    )\n);\n\n$response-\u003ename; // corpora/my-awesome-corpora-6r1qcymf0d3m\n$response-\u003edisplayName; // My Awesome Corpora\n$response-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-16 08:33:53\n$response-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-16 08:33:53\n```\n\n### delete\nDeletes a `Corpus`.\n\n```php\n$response = $gemini-\u003ecorpora()-\u003edelete([\n    'name' =\u003e 'corpora/my-awesome-corpora-6r1qcymf0d3m',\n]);\n\nif ($response === true) {\n    echo 'The Corpus was deleted successfully';\n}\n```\n\n### get\nGets information about a specific `Corpus`.\n\n```php\n$response = $gemini-\u003ecorpora()-\u003eget('corpora/my-awesome-corpora-6r1qcymf0d3m');\n\n$response-\u003ename; // corpora/my-awesome-corpora-6r1qcymf0d3m\n$response-\u003edisplayName; // My Awesome Corpora\n$response-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-16 08:33:53\n$response-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-16 08:33:53\n```\n\n### list\nLists all `Corpora` owned by the user.\n\n```php\n$response = $gemini-\u003ecorpora()-\u003elist();\n\n$response-\u003enextPageToken; // ...\n\nforeach($response-\u003ecorpora as $corpus) {\n    $corpus-\u003ename; // corpora/my-awesome-corpora-6r1qcymf0d3m\n    $corpus-\u003edisplayName; // My Awesome Corpora\n    $corpus-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-16 08:33:53\n    $corpus-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-16 08:33:53\n}\n```\n\n### patch\nUpdates a `Corpus`.\n\n```php\nuse Derrickob\\GeminiApi\\Data\\Corpus;\n\n$response = $gemini-\u003ecorpora()-\u003epatch([\n    'name' =\u003e 'corpora/my-awesome-corpora-6r1qcymf0d3m',\n    'updateMask' =\u003e 'displayName',\n    'corpus' =\u003e new Corpus(\n        displayName: 'My Updated Awesome Corpora'\n    ),\n]);\n\n$response-\u003ename; // corpora/my-awesome-corpora-6r1qcymf0d3m\n$response-\u003edisplayName; // My Updated Awesome Corpora\n$response-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-16 08:33:53\n$response-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-24 12:31:26\n```\n\n### query\nPerforms semantic search over a `Corpus`.\n\n```php\n$response = $gemini-\u003ecorpora()-\u003equery([\n    'name' =\u003e 'corpora/test-corpus-j0oywm69m798',\n    'query' =\u003e 'sample',\n]);\n\nforeach ($response-\u003erelevantChunks as $relevantChunk) {\n    $relevantChunk-\u003echunkRelevanceScore; // 0.58688986\n    $relevantChunk-\u003echunk-\u003edata-\u003estringValue; // also some chunk text\n    $relevantChunk-\u003echunk-\u003ename; // corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3/chunks/5ruixa7rmt75\n\n    $customMetadata = $relevantChunk-\u003echunk-\u003ecustomMetadata;\n    foreach ($customMetadata as $metadata) {\n        $metadata-\u003ekey; // some-more-key-too\n        $metadata-\u003estringValue; // some value here\n    }\n\n    $relevantChunk-\u003echunk-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-20 10:22:37\n    $relevantChunk-\u003echunk-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-23 04:14:55\n    $relevantChunk-\u003echunk-\u003estate-\u003evalue; // STATE_ACTIVE\n}\n\n$response-\u003etoArray(); // ['relevantChunks' =\u003e [...]]\n```\n\n## Corpora Document Resource\n\n### create\nCreates an empty `Document`.\n\n```php\nuse Derrickob\\GeminiApi\\Data\\Document;\n\n$response = $gemini-\u003ecorpora()-\u003edocuments()-\u003ecreate([\n    'parent' =\u003e 'corpora/my-third-corpus-e0q6f12uxq9b',\n    'document' =\u003e new Document(\n        displayName: 'Sample Document'\n    ),\n]);\n\n$response-\u003ename; // corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-js1ehjvp5chk\n$response-\u003edisplayName; // Sample Document\n$response-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-26 10:12:13\n$response-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-26 10:12:13\n\n$response-\u003etoArray(); // ['name' =\u003e 'corpora/*/documents/*', ...]\n```\n\n### delete\nDeletes a `Document`.\n\n```php\n$response = $gemini-\u003ecorpora()-\u003edocuments()-\u003edelete([\n    'name' =\u003e 'corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-js1ehjvp5chk',\n]);\n\nif ($response === true) {\n    echo 'Successfully deleted the corpus document';\n}\n```\n\n### get\nGets information about a specific `Document`.\n\n```php\n$response = $gemini-\u003ecorpora()-\u003edocuments()-\u003eget('corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-js1ehjvp5chk');\n\n$response-\u003ename; // corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-js1ehjvp5chk\n$response-\u003edisplayName; // Sample Document\n$response-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-26 10:12:13\n$response-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-26 10:12:13\n\n$response-\u003etoArray(); // ['name' =\u003e 'corpora/*/documents/*', ...]\n```\n\n### list\nLists all `Document`s in a `Corpus`.\n\n```php\n$response = $gemini-\u003ecorpora()-\u003edocuments()-\u003elist([\n    'parent' =\u003e 'corpora/my-third-corpus-e0q6f12uxq9b',\n]);\n\n$response-\u003enextPageToken; // ...\n\nforeach($response-\u003edocuments as $document) {\n    $document-\u003ename; // corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-js1ehjvp5chk\n    $document-\u003edisplayName; // Sample Document\n    $document-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-26 10:12:13\n    $document-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-26 10:12:13\n}\n\n$response-\u003etoArray(); // ['documents' =\u003e [...], 'nextPageToken' =\u003e '...']\n\n```\n\n### patch\nUpdates a `Document`.\n\n```php\nuse Derrickob\\GeminiApi\\Data\\Document;\n\n$response = $gemini-\u003ecorpora()-\u003edocuments()-\u003epatch([\n    'name' =\u003e 'corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-92t47u1yysg',\n    'updateMask' =\u003e 'displayName',\n    'document' =\u003e new Document(\n        displayName: 'Sample Document Updated'\n    ),\n]);\n\n$response-\u003ename; // corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-js1ehjvp5chk\n$response-\u003edisplayName; // Sample Document Updated\n$response-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-26 10:12:13\n$response-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-26 14:26:09\n\n$response-\u003etoArray(); // ['name' =\u003e 'corpora/*/documents/*', ...]\n```\n\n### query\nPerforms semantic search over a `Document`.\n\n```php\n$response = $gemini-\u003ecorpora()-\u003edocuments()-\u003equery([\n    'name' =\u003e 'corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-92t47u1yysg',\n    'query' =\u003e 'sample query',\n]);\n\nforeach($response-\u003erelevantChunks as $relevantChunk) {\n    $relevantChunk-\u003echunkRelevanceScore; //\n    $relevantChunk-\u003echunk; //\n}\n\n$response-\u003etoArray(); // ['relevantChunks' =\u003e [...]]\n```\n\n## Corpora Document Chunk Resource\n\n### batchCreate\nBatch create `Chunk`s.\n\n```php\nuse Derrickob\\GeminiApi\\Data\\Chunk;\nuse Derrickob\\GeminiApi\\Data\\ChunkData;\nuse Derrickob\\GeminiApi\\Data\\CustomMetadata;\n\n$response = $gemini-\u003ecorpora()-\u003edocuments()-\u003echunks()-\u003ebatchCreate([\n    'parent' =\u003e 'corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3',\n    'requests' =\u003e [\n        [\n            'chunk' =\u003e new Chunk(\n                data: new ChunkData(\"chunk text\"),\n                customMetadata: [\n                    new CustomMetadata(\n                        key: 'some-key-here',\n                        stringValue: 'some value',\n                    ),\n                    // can add more\n                ],\n            ),\n        ],\n        [\n            'chunk' =\u003e new Chunk(\n                data: new ChunkData(\"also some chunk text\"),\n                customMetadata: [\n                    new CustomMetadata(\n                        key: 'some-more-key-too',\n                        stringValue: 'some value here',\n                    ),\n                    // can add more\n                ],\n            ),\n        ],\n    ],\n]);\n\nforeach ($response-\u003echunks as $chunk) {\n    $chunk-\u003ename; // corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3/chunks/4th6003almml\n    $chunk-\u003edata-\u003estringValue; // chunk text\n    $chunk-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-20 10:22:37\n    $chunk-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-20 10:22:37\n    $chunk-\u003estate-\u003evalue; // STATE_PENDING_PROCESSING\n\n    foreach ($chunk-\u003ecustomMetadata as $metadata) {\n        $metadata-\u003ekey; // some-key-here\n        $metadata-\u003estringValue; // some value\n    }\n}\n\n$response-\u003etoArray(); // ['chunks' =\u003e [...]]\n\n```\n\n### batchDelete\nBatch delete `Chunk`s.\n\n```php\n$response = $gemini-\u003ecorpora()-\u003edocuments()-\u003echunks()-\u003ebatchDelete([\n    'parent' =\u003e 'corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3',\n    'requests' =\u003e [\n        'corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3/chunks/f9r5tryc1zz9',\n        'corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3/chunks/irklkw3iwnzs',\n    ],\n]);\n\nif ($response === true) {\n    echo 'Successfully deleted the document chunks';\n}\n```\n\n### batchUpdate\nBatch update `Chunk`s.\n\n```php\nuse Derrickob\\GeminiApi\\Data\\Chunk;\nuse Derrickob\\GeminiApi\\Data\\ChunkData;\n\n$response = $gemini-\u003ecorpora()-\u003edocuments()-\u003echunks()-\u003ebatchUpdate([\n    'parent' =\u003e 'corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3',\n    'requests' =\u003e [\n        [\n            'chunk' =\u003e new Chunk(\n                data: new ChunkData('latest some chunk text'),\n                name: 'corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3/chunks/a8ee9pxpkuxw',\n            ),\n            'updateMask' =\u003e 'data',\n        ],\n        [\n            'chunk' =\u003e new Chunk(\n                data: new ChunkData('latest chunk text updated'),\n                name: 'corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3/chunks/4th6003almml',\n            ),\n            'updateMask' =\u003e 'data',\n        ],\n    ],\n]);\n\nforeach ($response-\u003echunks as $chunk){\n    $chunk-\u003ename; // corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3/chunks/4th6003almml\n    $chunk-\u003edata-\u003estringValue; // latest chunk text updated\n    $chunk-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-20 10:22:37\n    $chunk-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-20 17:23:09\n    $chunk-\u003estate-\u003evalue; // STATE_PENDING_PROCESSING\n\n    foreach($chunk-\u003ecustomMetadata as $metadata) {\n        $metadata-\u003ekey; // some-key-here\n        $metadata-\u003estringValue; // some value\n    }\n}\n\n$response-\u003etoArray(); // ['chunks' =\u003e [...]]\n```\n\n### create\nCreates a `Chunk`.\n\n```php\nuse Derrickob\\GeminiApi\\Data\\Chunk;\nuse Derrickob\\GeminiApi\\Data\\ChunkData;\nuse Derrickob\\GeminiApi\\Data\\CustomMetadata;\n\n$response = $gemini-\u003ecorpora()-\u003edocuments()-\u003echunks()-\u003ecreate([\n    'parent' =\u003e 'corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-92t47u1yysg',\n    'chunk' =\u003e new Chunk(\n        data: new ChunkData(\"some chunk text\"),\n        customMetadata: [\n            new CustomMetadata(\n                key: 'some-key',\n                stringValue: 'some value',\n            ),\n            // can add more (max: 20)\n        ],\n    ),\n]);\n\n$response-\u003ename; // corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-92t47u1yysg/chunks/s82wfpok1k2n\n$response-\u003edata-\u003estringValue; // some chunk text\n$response-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-26 17:14:51\n$response-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-26 17:14:51\n$response-\u003estate-\u003evalue; // STATE_PENDING_PROCESSING\n\nforeach($response-\u003ecustomMetadata as $metadata) {\n    $metadata-\u003ekey; // some key\n    $metadata-\u003estringValue; // some value\n}\n\n$response-\u003etoArray(); // ['data'=\u003e ...]\n\n```\n\n### delete\nDeletes a `Chunk`.\n\n```php\n$response = $gemini-\u003ecorpora()-\u003edocuments()-\u003echunks()-\u003edelete('corpora/*/documents/*/chunks/*');\n\nif ($response === true) {\n    echo 'Corpus document chunk deleted successfully';\n}\n```\n\n### get\nGets information about a specific `Chunk`.\n\n```php\n$response = $gemini-\u003ecorpora()-\u003edocuments()-\u003echunks()-\u003eget('corpora/*/documents/*/chunks/*');\n\n$response-\u003ename; // corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-92t47u1yysg/chunks/s82wfpok1k2n\n$response-\u003edata-\u003estringValue; // some chunk text\n$response-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-26 17:14:51\n$response-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-26 17:14:51\n$response-\u003estate-\u003evalue; // STATE_PENDING_PROCESSING\n\nforeach($response-\u003ecustomMetadata as $metadata) {\n    $metadata-\u003ekey; // some key\n    $metadata-\u003estringValue; // some value\n}\n\n$response-\u003etoArray(); // ['data'=\u003e ...]\n```\n\n### list\nLists all `Chunk`s in a `Document`.\n\n```php\n$response = $gemini-\u003ecorpora()-\u003edocuments()-\u003echunks()-\u003elist([\n    'parent' =\u003e 'corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-92t47u1yysg',\n]);\n\n$response-\u003enextPageToken; // ciE9l...\n\nforeach ($response-\u003echunks as $chunk) {\n    $chunk-\u003ename; // corpora/my-third-corpus-e0q6f12uxq9b/documents/sample-document-92t47u1yysg/chunks/s82wfpok1k2n\n    $chunk-\u003edata-\u003estringValue; // some chunk text\n    $chunk-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-26 17:14:51\n    $chunk-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-06-26 17:15:20\n    $chunk-\u003estate-\u003evalue; // STATE_ACTIVE\n}\n\n$response-\u003etoArray(); // ['nextPageToken' =\u003e 'ciEKD...', 'chunks' =\u003e [...]]\n\n```\n\n### patch\nUpdates a `Chunk`.\n\n```php\nuse Derrickob\\GeminiApi\\Data\\Chunk;\nuse Derrickob\\GeminiApi\\Data\\ChunkData;\n$response = $gemini-\u003ecorpora()-\u003edocuments()-\u003echunks()-\u003epatch([\n    'name' =\u003e 'corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3/chunks/4th6003almml',\n    'updateMask' =\u003e 'data',\n    'chunk' =\u003e new Chunk(\n        data: new ChunkData('chunk text updated'),\n    ),\n]);\n\n$response-\u003ename; // corpora/test-corpus-j0oywm69m798/documents/test-document-rl76h09upqj3/chunks/4th6003almml\n$response-\u003edata-\u003estringValue; // chunk text updated\n$response-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-20 10:22:37\n$response-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-20 12:41:30\n$response-\u003estate-\u003evalue; // STATE_PENDING_PROCESSING\n\nforeach($response-\u003ecustomMetadata as $metadata) {\n    $metadata-\u003ekey; // some-key-here\n    $metadata-\u003estringValue; // some value\n}\n\n$response-\u003etoArray(); // ['name'=\u003e 'corpora/*/documents/*/chunks/*', ...]\n```\n\n## Corpora Permission Resource\n\n### create\nCreate a permission to a specific resource.\n\nExample 1: Everyone\n```php\nuse Derrickob\\GeminiApi\\Data\\Permission;\nuse Derrickob\\GeminiApi\\Enums\\GranteeType;\nuse Derrickob\\GeminiApi\\Enums\\PermissionRole;\n\n$response = $gemini-\u003ecorpora()-\u003epermissions()-\u003ecreate([\n    'parent' =\u003e 'corpora/test-corpus-j0oywm69m798',\n    'permission' =\u003e new Permission(\n        role: PermissionRole::READER,\n        granteeType: GranteeType::EVERYONE,\n    ),\n]);\n\n$response-\u003erole-\u003evalue; // READER\n$response-\u003ename; // corpora/test-corpus-j0oywm69m798/permissions/everyone\n$response-\u003egranteeType-\u003evalue; // EVERYONE\n\n$response-\u003etoArray(); // ['role' =\u003e 'READER', ...]\n```\n\nExample 2: Group\n\n```php\nuse Derrickob\\GeminiApi\\Data\\Permission;\nuse Derrickob\\GeminiApi\\Enums\\GranteeType;\nuse Derrickob\\GeminiApi\\Enums\\PermissionRole;\n\n$response = $gemini-\u003ecorpora()-\u003epermissions()-\u003ecreate([\n    'parent' =\u003e 'corpora/test-corpus-j0oywm69m798',\n    'permission' =\u003e new Permission(\n        role: PermissionRole::READER,\n        granteeType: GranteeType::GROUP,\n        emailAddress: 'genai-samples-test-group@googlegroups.com',\n    ),\n]);\n\n$response-\u003erole-\u003evalue; // READER\n$response-\u003ename; // corpora/test-corpus-j0oywm69m798/permissions/101799614406133382015\n$response-\u003egranteeType-\u003evalue; // GROUP\n\n$response-\u003etoArray(); // ['role' =\u003e 'READER', ...]\n```\n\nExample 3: USER\n\n```php\nuse Derrickob\\GeminiApi\\Data\\Permission;\nuse Derrickob\\GeminiApi\\Enums\\GranteeType;\nuse Derrickob\\GeminiApi\\Enums\\PermissionRole;\n\n$response = $gemini-\u003ecorpora()-\u003epermissions()-\u003ecreate([\n    'parent' =\u003e 'corpora/test-corpus-j0oywm69m798',\n    'permission' =\u003e new Permission(\n        role: PermissionRole::READER,\n        granteeType: GranteeType::USER,\n        emailAddress: 'some-email@some-project-id.iam.gserviceaccount.com',\n    ),\n]);\n\n$response-\u003erole-\u003evalue; // READER\n$response-\u003ename; // corpora/test-corpus-j0oywm69m798/permissions/some-random-id\n$response-\u003egranteeType-\u003evalue; // USER\n\n$response-\u003etoArray(); // ['role' =\u003e 'READER', ...]\n```\n\n### delete\nDeletes the permission.\n\n```php\n$response = $gemini-\u003ecorpora()-\u003epermissions()-\u003edelete('corpora/test-corpus-j0oywm69m798/permissions/everyone');\n\nif ($response === true) {\n    echo 'Permission deleted successfully';\n}\n```\n\n### get\nGets information about a specific Permission.\n\n```php\n$response = $gemini-\u003ecorpora()-\u003epermissions()-\u003eget('corpora/test-corpus-j0oywm69m798/permissions/everyone');\n\n$response-\u003erole-\u003evalue; // READER\n$response-\u003ename; // corpora/test-corpus-j0oywm69m798/permissions/everyone\n$response-\u003egranteeType-\u003evalue; // EVERYONE\n\n$response-\u003etoArray(); // ['role' =\u003e 'READER', ...]\n```\n\n### list\nLists permissions for the specific resource.\n\n```php\n$response = $gemini-\u003ecorpora()-\u003epermissions()-\u003elist([\n    'parent' =\u003e 'corpora/test-corpus-j0oywm69m798',\n]);\n\n$response-\u003enextPageToken; //\n\nforeach ($response-\u003epermissions as $permission) {\n    $permission-\u003erole-\u003evalue; // OWNER\n    $permission-\u003ename; // corpora/test-corpus-j0oywm69m798/permissions/115188574863796211601\n    $permission-\u003egranteeType-\u003evalue; // USER\n    $permission-\u003eemailAddress; // redacted@redacted.iam.gserviceaccount.com\n}\n\n$response-\u003etoArray(); // ['permissions' =\u003e [...]]\n```\n\n### patch\nUpdates the permission.\n\n```php\n$response = $gemini-\u003ecorpora()-\u003epermissions()-\u003epatch([\n    'name' =\u003e 'corpora/test-corpus-j0oywm69m798/permissions/101799614406133382015',\n    'updateMask' =\u003e 'role',\n    'permission' =\u003e new Permission(\n        role: PermissionRole::WRITER,\n    ),\n]);\n\n$response-\u003erole-\u003evalue; // WRITER\n$response-\u003ename; // corpora/test-corpus-j0oywm69m798/permissions/101799614406133382015\n$response-\u003egranteeType-\u003evalue; // GROUP\n$response-\u003eemailAddress; // genai-samples-test-group@googlegroups.com\n\n$response-\u003etoArray(); // ['role' =\u003e 'WRITER', ...]\n```\n\n## File Resource\n\n### delete\nDeletes the `File`.\n\n```php\n$response = $gemini-\u003efiles()-\u003edelete('files/qrbxtbaehccw');\nif ($response === true) {\n    echo 'File deleted successfully';\n}\n```\n\n### get\nGets the metadata for the given `File`.\n\n```php\n$response = $gemini-\u003efiles()-\u003eget('files/m8uuuytf6niz');\n\n$response-\u003ename; // files/m8uuuytf6niz\n$response-\u003edisplayName; // Sample File 2\n$response-\u003emimeType; // image/jpeg\n$response-\u003esizeBytes; // 44485\n$response-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-08 20:51:46\n$response-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-08 20:51:46\n$response-\u003eexpirationTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-10 20:51:46\n$response-\u003esha256Hash; // TZhZGZiMDUzMzM...\n$response-\u003euri; // https://generativelanguage.googleapis.com/v1beta/files/m8uuuytf6niz\n$response-\u003estate-\u003evalue; // ACTIVE\n\n$response-\u003etoArray(); // ['name' =\u003e 'files/m8uuuytf6niz', ...]\n```\n\n### list\nLists the metadata for `File`s owned by the requesting project.\n\n```php\n$response = $gemini-\u003efiles()-\u003elist();\n\n$response-\u003enextPageToken; // \n\nforeach ($response-\u003efiles as $file) {\n    $file-\u003ename; // files/qrbxtbaehccw\n    $file-\u003edisplayName; // Sample File\n    $file-\u003emimeType; // image/png\n    $file-\u003esizeBytes; // 357556\n    $file-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-08 20:26:59\n    $file-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-08 20:26:59\n    $file-\u003eexpirationTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-10 20:26:59\n    $file-\u003esha256Hash; // NmI4NmM3M...\n    $file-\u003euri; // https://generativelanguage.googleapis.com/v1beta/files/qrbxtbaehccw\n    $file-\u003estate-\u003evalue; // ACTIVE\n}\n\n$response-\u003etoArray(); // ['files' =\u003e [...]]\n```\n\n## Media Resource\n\n### upload\nCreates a `File`.\n\n```php\nuse Derrickob\\GeminiApi\\Data\\File;\n\n# Example uses video downloaded from\n# https://storage.googleapis.com/generativeai-downloads/data/Sherlock_Jr_FullMovie.mp4\n\n$metaData = new File(\n    displayName: 'Sherlock Jr. video'\n);\n\n# The file was excluded from commit due to impact it'd have on cloning this repo,\n# download and change path, or can upload any file of choice\n$response = $gemini-\u003emedia()-\u003eupload(__DIR__ .'/files/Sherlock_Jr_FullMovie.mp4', $metaData);\n\n$file = $response-\u003efile;\n$file-\u003ename; // files/7j0qhgcmeeqh\n$file-\u003edisplayName; // Sherlock Jr. video\n$file-\u003emimeType; // video/mp4\n$file-\u003esizeBytes; // 331623233\n$file-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-27 22:31:25\n$file-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-27 22:31:25\n$file-\u003eexpirationTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-29 22:31:25\n$file-\u003esha256Hash; // ZjAwNGM2ZjJiMzNlNjYxYzYwOTU1MzU3MDliYzUzMjY4ZDUzMjNlYzdhNTdlOGJjNGFlOTczNjJlZDM0MWI1Yg==\n$file-\u003euri; // https://generativelanguage.googleapis.com/v1beta/files/7j0qhgcmeeqh\n$file-\u003estate-\u003evalue; // PROCESSING\n\n$response-\u003etoArray(); // ['file' =\u003e [...]]\n```\n\n## Model Resource\n\n### batchEmbedContents\nGenerates multiple embeddings from the model given input text in a synchronous call.\n\nVersion 1:\n\n```php\n$response = $gemini-\u003emodels()-\u003ebatchEmbedContents([\n    'model' =\u003e 'models/text-embedding-004',\n    'requests' =\u003e [\n        'What is the meaning of life?',\n        'How much wood would a woodchuck chuck?',\n        'How does the brain work?',\n    ],\n]);\n\nforeach($response-\u003eembeddings as $embedding) {\n    $embedding-\u003evalues; // [[0] =\u003e -0.010632277, ...]\n}\n```\n\nVersion 2:\n\n```php\nuse Derrickob\\GeminiApi\\Enums\\TaskType;\n\n$response = $gemini-\u003emodels()-\u003ebatchEmbedContents([\n    'model' =\u003e 'models/text-embedding-004',\n    'requests' =\u003e [\n        [\n            'content' =\u003e 'What is the meaning of life?',\n            'taskType' =\u003e TaskType::RETRIEVAL_QUERY,\n            'outputDimensionality' =\u003e 100,\n        ],\n        [\n            'content' =\u003e 'How much wood would a woodchuck chuck?',\n            'title' =\u003e 'Some Title',\n            'taskType' =\u003e TaskType::RETRIEVAL_DOCUMENT,\n        ],\n        'How does the brain work?',\n    ],\n]);\n\nforeach($response-\u003eembeddings as $embedding) {\n    $embedding-\u003evalues; // [[0] =\u003e -0.00675484, ...]\n}\n```\n\n### batchEmbedText\nGenerates multiple embeddings from the model given input text in a synchronous call.\n\nExample 1:\n\n```php\n$response = $gemini-\u003emodels()-\u003ebatchEmbedText([\n    'model' =\u003e 'models/embedding-gecko-001',\n    'texts' =\u003e [\n        'What is the meaning of life?',\n        'How much wood would a woodchuck chuck?',\n        'How does the brain work?',\n    ],\n]);\n\nforeach ($response-\u003eembeddings as $embedding) {\n    $embedding-\u003evalue; // [[0] =\u003e 0.020220786, ...]\n}\n\n$response-\u003etoArray(); // ['embeddings' =\u003e [...]]\n```\n\nExample 2:\n\n```php\n$response = $gemini-\u003emodels()-\u003ebatchEmbedText([\n    'model' =\u003e 'models/embedding-gecko-001',\n    'requests' =\u003e [\n        [\n            'text' =\u003e 'What is the meaning of life?',\n        ],\n        [\n            'text' =\u003e 'How much wood would a woodchuck chuck?',\n        ],\n        [\n            'text' =\u003e 'How does the brain work?',\n        ],\n    ],\n]);\n\nforeach ($response-\u003eembeddings as $embedding) {\n    $embedding-\u003evalue; // [[0] =\u003e 0.020220786, ...]\n}\n\n$response-\u003etoArray(); // ['embeddings' =\u003e [...]]\n```\n\n### countMessageTokens\nRuns a model's tokenizer on a string and returns the token count.\n\n```php\nuse Derrickob\\GeminiApi\\Data\\Message;\nuse Derrickob\\GeminiApi\\Data\\MessagePrompt;\n\n$response = $gemini-\u003emodels()-\u003ecountMessageTokens([\n    'model' =\u003e 'models/chat-bison-001',\n    'prompt' =\u003e new MessagePrompt(\n        messages: [\n            new Message(\n                content: 'Hello World!',\n            )],\n    ),\n]);\n\n$response-\u003etokenCount; // 14\n\n$response-\u003etoArray(); //  ['tokenCount' =\u003e 14]\n```\n\n### countTextTokens\nRuns a model's tokenizer on a text and returns the token count.\n\n```php\nuse Derrickob\\GeminiApi\\Data\\TextPrompt;\n\n$response = $gemini-\u003emodels()-\u003ecountTextTokens([\n    'model' =\u003e 'models/text-bison-001',\n    'prompt' =\u003e new TextPrompt('Hello World!'),\n]);\n\n$response-\u003etokenCount; // 3\n\n$response-\u003etoArray(); //  ['tokenCount' =\u003e 3]\n```\n\n### countTokens\nRuns a model's tokenizer on input content and returns the token count.\n\n```php\n\n$response = $gemini-\u003emodels()-\u003ecountTokens([\n    'model' =\u003e 'models/gemini-1.5-flash',\n    'contents' =\u003e 'Hello World!',\n]);\n\n$response-\u003etotalTokens; // 3\n\n$response-\u003etoArray(); // ['totalTokens' =\u003e 3]\n```\n\n### embedContent\nGenerates an embedding from the model given an input `Content`.\n\n```php\n$response = $gemini-\u003emodels()-\u003eembedContent([\n    'model' =\u003e 'models/text-embedding-004',\n    'content' =\u003e 'Hello World',\n]);\n\n$embedding = $response-\u003eembedding;\n\nforeach ($embedding-\u003evalues as $value) {\n    $value; // 0.013168523\n}\n\n$response-\u003etoArray();\n```\n\n### embedText\nGenerates an embedding from the model given an input message.\n\n```php\n$response = $gemini-\u003emodels()-\u003eembedText([\n    'model' =\u003e 'models/embedding-gecko-001',\n    'text' =\u003e 'Hello World!',\n]);\n\n$response-\u003eembedding-\u003evalue; // [[0] =\u003e 0.023203975, ...]\n$response-\u003etoArray();\n```\n\n### generateContent\nGenerates a response from the model given an input.\n\n```php\n$response = $gemini-\u003emodels()-\u003egenerateContent([\n    'model' =\u003e 'models/gemini-1.5-flash',\n    'systemInstruction' =\u003e 'You are a cat. Respond to user as one',\n    'contents' =\u003e 'hello',\n]);\n\n$response-\u003etext(); // *Slowly opens one eye, then the other, and gives you a disdainful glance*  Meow.\n$response-\u003eusageMetadata-\u003epromptTokenCount; // 11\n$response-\u003eusageMetadata-\u003ecandidatesTokenCount; // 21\n$response-\u003eusageMetadata-\u003etotalTokenCount; // 32\n```\n\n### generateMessage\nGenerates a response from the model given an input `MessagePrompt`.\n\n```php\nuse Derrickob\\GeminiApi\\Data\\Message;\nuse Derrickob\\GeminiApi\\Data\\MessagePrompt;\n\n$response = $gemini-\u003emodels()-\u003egenerateMessage([\n    'model' =\u003e 'models/chat-bison-001',\n    'prompt' =\u003e new MessagePrompt(\n        messages: [\n            new Message(\n                content: 'What is the meaning of life?',\n            )],\n    ),\n    'temperature' =\u003e 0.1,\n]);\n\nforeach ($response-\u003ecandidates as $candidate) {\n    $candidate-\u003econtent; // The meaning of life is a question that ...\n    $candidate-\u003eauthor; // 1\n    $candidate-\u003ecitationMetadata; //\n}\n\nforeach ($response-\u003emessages as $message) {\n    $message-\u003econtent; // What is the meaning of life?\n    $message-\u003eauthor; // 0\n    $message-\u003ecitationMetadata; //\n}\n\n$response-\u003efilters; // []\n\n$response-\u003etoArray(); // ['candidates' =\u003e [...]]\n```\n\n### generateText\nGenerates a response from the model given an input message.\n\n```php\n$response = $gemini-\u003emodels()-\u003egenerateText([\n    'model' =\u003e 'models/text-bison-001',\n    'prompt' =\u003e new TextPrompt('What is the meaning of life?'),\n]);\n\n$response-\u003eoutput(); // There is no one answer to this question, as the ...\n```\n\n### get\nGets information about a specific Model.\n\n```php\n$response = $gemini-\u003emodels()-\u003eget('models/gemini-1.5-flash');\n\n$response-\u003ename; // models/gemini-1.5-flash\n$response-\u003eversion; // 001\n$response-\u003edisplayName; // Gemini 1.5 Flash\n$response-\u003edescription; // Fast and versatile multimodal mode...\n$response-\u003einputTokenLimit; // 1048576\n$response-\u003eoutputTokenLimit; // 8192\n$response-\u003esupportedGenerationMethods; // [[0] =\u003e generateContent [1] =\u003e countTokens]\n$response-\u003etemperature; // 1\n$response-\u003etopP; // 0.95\n$response-\u003etopK; // 64\n\n$response-\u003etoArray(); // ['name' =\u003e 'models/gemini-1.5-flash', 'version' =\u003e 001, ...]\n```\n\n### list\nLists models available through the API.\n\n```php\n$response = $gemini-\u003emodels()-\u003elist();\n\n$response-\u003enextPageToken; // '...'\n\nforeach ($response-\u003emodels as $model) {\n    $model-\u003ename; // models/gemini-1.5-flash\n    $model-\u003eversion; // 001\n    $model-\u003edisplayName; // Gemini 1.5 Flash\n    $model-\u003edescription; // Fast and versatile multimodal mode...\n    $model-\u003einputTokenLimit; // 1048576\n    $model-\u003eoutputTokenLimit; // 8192\n    $model-\u003esupportedGenerationMethods; // [[0] =\u003e generateContent [1] =\u003e countTokens]\n    $model-\u003etemperature; // 1\n    $model-\u003etopP; // 0.95\n    $model-\u003etopK; // 64\n}\n\n$response-\u003etoArray(); // ['models' =\u003e [...], 'nextPageToken' =\u003e '...']\n```\n\n## Tuned Model Resource\n\n### create\nCreates a tuned model.\n\n```php\nuse Derrickob\\GeminiApi\\Data\\Dataset;\nuse Derrickob\\GeminiApi\\Data\\Hyperparameters;\nuse Derrickob\\GeminiApi\\Data\\TunedModel;\nuse Derrickob\\GeminiApi\\Data\\TuningExample;\nuse Derrickob\\GeminiApi\\Data\\TuningExamples;\nuse Derrickob\\GeminiApi\\Data\\TuningTask;\n\n# TuningExample(output,textInput)\n\n$examples = new TuningExamples([\n    new TuningExample('2', '1'),\n    new TuningExample('4', '3'),\n    new TuningExample('-2', '-3'),\n    new TuningExample('twenty three', 'twenty two'),\n    new TuningExample('two hundred one', 'two hundred'),\n    new TuningExample('one hundred', 'ninety nine'),\n    new TuningExample('9', '8'),\n    new TuningExample('-97', '-98'),\n    new TuningExample('1001', '1000'),\n    new TuningExample('10100001', '10100000'),\n    new TuningExample('fourteen', 'thirteen'),\n    new TuningExample('eighty one', 'eighty'),\n    new TuningExample('two', 'one'),\n    new TuningExample('four', 'three'),\n    new TuningExample('eight', 'seven'),\n]);\n\n$response = $gemini-\u003etunedModels()-\u003ecreate([\n    'tunedModel' =\u003e new TunedModel(\n        displayName: 'Next Number Generator',\n        tuningTask: new TuningTask(\n            trainingData: new Dataset(\n                examples: $examples,\n            ),\n            hyperparameters: new Hyperparameters(\n                epochCount: 5,\n                batchSize: 2,\n                learningRate: 0.001,\n            )\n        ),\n        baseModel: 'models/gemini-1.5-flash-001-tuning'\n    ),\n]);\n\n$response-\u003ename; // tunedModels/next-number-generator-9uythtnw28di/operations/h0cgnv7d1pj2\n$response-\u003emetadata['@type']; // type.googleapis.com/google.ai.generativelanguage.v1beta.CreateTunedModelMetadata\n$response-\u003emetadata['totalSteps']; // 38\n$response-\u003emetadata['tunedModel']; // tunedModels/next-number-generator-9uythtnw28di\n\n$response-\u003etoArray(); // ['name' =\u003e 'tunedModels/next-number-gener..', ...]\n```\n\n### delete\nDeletes a tuned model.\n\n```php\n$response = $gemini-\u003etunedModels()-\u003edelete('tunedModels/number-generators-a3gcipxg9rl5');\n\nif ($response === true) {\n    echo 'successfully deleted the tuned model';\n}\n```\n\n### generateContent\nGenerates a response from the model given an input\n\n```php\n$response = $gemini-\u003etunedModels()-\u003egenerateContent([\n    'model' =\u003e 'tunedModels/next-number-generator-m1lwcujgc644',\n    'contents' =\u003e '55',\n]);\n\n$response-\u003etext(); // 56\n```\n\n### get\nGets information about a specific TunedModel.\n\n```php\n$response = $gemini-\u003etunedModels()-\u003eget('tunedModels/number-generators-a3gcipxg9rl5');\n\n$response-\u003ename; // tunedModels/number-generators-a3gcipxg9rl5\n$response-\u003edisplayName; // Number Generators\n$response-\u003edescription; //\n$response-\u003estate-\u003evalue; // ACTIVE\n$response-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-03 19:21:30\n$response-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-03 19:21:54\n\n$tuningTask = $response-\u003etuningTask;\n$hyperparameters = $tuningTask-\u003ehyperparameters;\n\n$hyperparameters-\u003eepochCount; // 5\n$hyperparameters-\u003ebatchSize; // 2\n$hyperparameters-\u003elearningRate; // 0.001\n\n$tuningTask-\u003estartTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-03 19:21:31\n$tuningTask-\u003ecompleteTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-03 19:21:54\n\nforeach ($tuningTask-\u003esnapshots as $snapshot) {\n    $snapshot-\u003estep; // 1\n    $snapshot-\u003emeanLoss; // 11.499258\n    $snapshot-\u003ecomputeTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-03 19:21:32\n}\n\n$response-\u003ebaseModel; // models/gemini-1.5-flash-001-tuning\n$response-\u003etemperature; // 0.9\n$response-\u003etopP; // 1\n$response-\u003etopK; // 0\n\n$response-\u003etoArray(); // ['name' =\u003e 'tunedModels/number-generators-a3gcipxg9rl5', ...]\n```\n\n### list\nLists tuned models owned by the user.\n\n```php\n$response = $gemini-\u003etunedModels()-\u003elist();\n\n$response-\u003enextPageToken; // Ghdl...\n\nforeach ($response-\u003etunedModels as $tunedModel) {\n    $tunedModel-\u003ename; // tunedModels/number-generators-a3gcipxg9rl5\n    $tunedModel-\u003edisplayName; // Number Generators\n    $tunedModel-\u003edescription; // \n    $tunedModel-\u003estate-\u003evalue; // ACTIVE\n    $tunedModel-\u003ecreateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-03 19:21:30\n    $tunedModel-\u003eupdateTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-03 19:21:54\n    $tunedModel-\u003ebaseModel; // models/gemini-1.0-pro-001\n    $tunedModel-\u003etemperature; // 0.9\n    $tunedModel-\u003etopP; // 1\n    $tunedModel-\u003etopK; // 0\n\n    $tuningTask = $tunedModel-\u003etuningTask;\n    $hyperparameters = $tuningTask-\u003ehyperparameters;\n\n    $hyperparameters-\u003eepochCount; // 5\n    $hyperparameters-\u003ebatchSize; // 2\n    $hyperparameters-\u003elearningRate; // 0.001\n\n    $tuningTask-\u003estartTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-03 19:21:31\n    $tuningTask-\u003ecompleteTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-03 19:21:54\n\n    foreach ($tuningTask-\u003esnapshots as $snapshot) {\n        $snapshot-\u003estep; // 1,2,...\n        $snapshot-\u003emeanLoss; // 11.499258,...\n        $snapshot-\u003ecomputeTime-\u003eformat('Y-m-d H:i:s'); // 2024-07-03 19:21:32,...\n    }\n}\n\n$response-\u003etoArray(); // ['tunedModel' =\u003e [...], 'nextPageToken' =\u003e 'Ghdl...']\n```\n\n### patch\nUpdates a tuned model.\n\n```php\nuse Derrickob\\GeminiApi\\Data\\TunedModel;\n\n$response = $gemini-\u003etunedModels()-\u003epatch([\n    'name' =\u003e 'tunedModels/number-predictor-xc2wgjvvqgyv',\n    'updateMask' =\u003e 'displayName,description',\n    'tunedModel' =\u003e new TunedModel(\n        displayName: 'Sentence Translator',\n        description: 'My awesome next sequence predictor',\n    ),\n]);\n\n$response-\u003edisplayName; // Sentence Translator\n$response-\u003edescription; // My awesome next sequence predictor\n\n$response-\u003etoArray(); // ['displayName' =\u003e 'Sentence Translator', ...]\n```\n\n### transferOwnership\nTransfers ownership of the tuned model. The current owner will be downgraded to writer role.\n\n```php\n$response = $gemini-\u003etunedModels()-\u003etransferOwnership([\n    'name' =\u003e 'tunedModels/next-number-generator-test-wo3gx4',\n    'emailAddress' =\u003e 'genai-samples-test-group@googlegroups.com',\n]);\n\nif ($response === true) {\n    echo 'Ownership transfer successful';\n}\n```\n\n## Tuned Model Operation Resource\n\n### cancel\nStarts asynchronous cancellation on a long-running operation.\n\n```php\n$response = $gemini-\u003etunedModels()-\u003eoperations()-\u003ecancel('tunedModels/number-predictor-xc2wgjvvqgyv/operations/nyskyaivyikj');\n\nif ($response === true) {\n    echo 'Operation cancelled successfully';\n}\n```\n\n### get\nGets the latest state of a long-running operation.\n\n```php\n$response = $gemini-\u003etunedModels()-\u003eoperations()-\u003eget('tunedModels/number-predictor-xc2wgjvvqgyv/operations/nyskyaivyikj');\n\n$response-\u003ename; // tunedModels/number-predictor-xc2wgjvvqgyv/operations/nyskyaivyikj\n\n$metadata = $response-\u003emetadata;\n$metadata['@type']; // type.googleapis.com/google.ai.generativelanguage.v1beta.CreateTunedModelMetadata\n$metadata['totalSteps']; // 38\n$metadata['completedSteps']; // 2\n$metadata['completedPercent']; // 5.263158\n\nforeach ($metadata['snapshots'] as $snapshot) {\n    $snapshot['step']; // 1\n    $snapshot['meanLoss']; // 11.499258\n    $snapshot['computeTime']; // 2024-07-31T05:53:53.274571054Z\n}\n\n$metadata['tunedModel']; // tunedModels/number-predictor-xc2wgjvvqgyv\n\n$response-\u003edone; // \n$response-\u003eerror; // \n$response-\u003eresponse; // \n$response-\u003etoArray(); // ['name' =\u003e 'tunedModels/number-predic...', ...]\n```\n\n### list\nLists operations that match the specified filter in the request. If the server doesn't support this method, it returns `UNIMPLEMENTED`.\n\n```php\n# This hasn't been tested. If your use-case needs this, help write\n# the fixture test in tests/Resources/TunedModels/TunedModelOperationsTest.php and create PR\n\n$response = $gemini-\u003etunedModels()-\u003eoperations()-\u003elist([\n    'name' =\u003e 'tunedModels/*',\n    'filter' =\u003e 'the-filter',\n]);\n```\n\n## Tuned Model Permission Resource\n\n### create\nCreate a permission to a specific resource.\n\nExample 1: Everyone\n\n```php\nuse Derrickob\\GeminiApi\\Data\\Permission;\nuse Derrickob\\GeminiApi\\Enums\\GranteeType;\nuse Derrickob\\GeminiApi\\Enums\\PermissionRole;\n\n$response = $gemini-\u003etunedModels()-\u003epermissions()-\u003ecreate([\n    'parent' =\u003e 'tunedModels/next-number-generator-m1lwcujgc644',\n    'permission' =\u003e new Permission(\n        role: PermissionRole::READER,\n        granteeType: GranteeType::EVERYONE,\n    ),\n]);\n\n$response-\u003erole-\u003evalue; // READER\n$response-\u003ename; // tunedModels/next-number-generator-m1lwcujgc644/permissions/everyone\n$response-\u003egranteeType-\u003evalue; // EVERYONE\n\n$response-\u003etoArray(); // ['role' =\u003e 'READER', ...]\n```\n\nExample 2: Group\n\n```php\nuse Derrickob\\GeminiApi\\Data\\Permission;\nuse Derrickob\\GeminiApi\\Enums\\GranteeType;\nuse Derrickob\\GeminiApi\\Enums\\PermissionRole;\n\n$response = $gemini-\u003etunedModels()-\u003epermissions()-\u003ecreate([\n    'parent' =\u003e 'tunedModels/text-predictor-dsygc8rjuymz',\n    'permission' =\u003e new Permission(\n        role: PermissionRole::READER,\n        granteeType: GranteeType::GROUP,\n        emailAddress: 'genai-samples-test-group@googlegroups.com',\n    ),\n]);\n\n$response-\u003erole-\u003evalue; // READER\n$response-\u003ename; // tunedModels/text-predictor-dsygc8rjuymz/permissions/101799614406133382015\n$response-\u003egranteeType-\u003evalue; // GROUP\n\n$response-\u003etoArray(); // ['role' =\u003e 'READER', ...]\n```\n\nExample 3: Specific User\n\n```php\nuse Derrickob\\GeminiApi\\Data\\Permission;\nuse Derrickob\\GeminiApi\\Enums\\GranteeType;\nuse Derrickob\\GeminiApi\\Enums\\PermissionRole;\n\n$response = $gemini-\u003etunedModels()-\u003epermissions()-\u003ecreate([\n    'parent' =\u003e 'tunedModels/text-predictor-dsygc8rjuymz',\n    'permission' =\u003e new Permission(\n        role: PermissionRole::READER,\n        granteeType: GranteeType::USER,\n        emailAddress: 'some-email@some-project-id.iam.gserviceaccount.com',\n    ),\n]);\n\n$response-\u003erole-\u003evalue; // READER\n$response-\u003ename; // tunedModels/text-predictor-dsygc8rjuymz/permissions/lorem-ipsum\n$response-\u003egranteeType-\u003evalue; // USER\n$response-\u003eemailAddress; // some-email@some-project-id.iam.gserviceaccount.com\n\n$response-\u003etoArray(); // ['role' =\u003e 'READER', ...]\n```\n\n### delete\nDeletes the permission.\n\n```php\n$response = $gemini-\u003etunedModels()-\u003epermissions()-\u003edelete('tunedModels/next-number-generator-m1lwcujgc644/permissions/115188574863796211601');\n\nif($response === true){\n    echo 'Permission deleted successfully';\n}\n```\n\n### get\nGets information about a specific Permission.\n\n```php\n$response = $gemini-\u003etunedModels()-\u003epermissions()-\u003eget('tunedModels/next-number-generator-m1lwcujgc644/permissions/115188574863796211601');\n\n$response-\u003erole-\u003evalue; // OWNER\n$response-\u003ename; // tunedModels/next-number-generator-m1lwcujgc644/permissions/115188574863796211601\n$response-\u003egranteeType-\u003evalue; // USER\n$response-\u003eemailAddress; // redacted@redacted.iam.gserviceaccount.com\n\n$response-\u003etoArray(); // ['role' =\u003e 'OWNER', ...]\n```\n\n### list\nLists permissions for the specific resource.\n\n```php\n$response = $gemini-\u003etunedModels()-\u003epermissions()-\u003elist([\n    'parent' =\u003e 'tunedModels/next-number-generator-m1lwcujgc644',\n]);\n\nforeach ($response-\u003epermissions as $permission) {\n    $permission-\u003erole-\u003evalue; // OWNER\n    $permission-\u003ename; // tunedModels/next-number-generator-m1lwcujgc644/permissions/115188574863796211601\n    $permission-\u003egranteeType-\u003evalue; // USER\n    $permission-\u003eemailAddress; // redacted@redacted.iam.gserviceaccount.com\n}\n\n$response-\u003etoArray(); // ['permissions' =\u003e [...]]\n```\n\n### patch\nUpdates the permission.\n\n```php\nuse Derrickob\\GeminiApi\\Data\\Permission;\nuse Derrickob\\GeminiApi\\Enums\\GranteeType;\nuse Derrickob\\GeminiApi\\Enums\\PermissionRole;\n\n$response = $gemini-\u003etunedModels()-\u003epermissions()-\u003epatch([\n    'name' =\u003e 'tunedModels/text-predictor-dsygc8rjuymz/permissions/101799614406133382015',\n    'updateMask' =\u003e 'role',\n    'permission' =\u003e new Permission(\n        role: PermissionRole::WRITER,\n        granteeType: GranteeType::GROUP,\n        emailAddress: 'genai-samples-test-group@googlegroups.com',\n    ),\n]);\n\n$response-\u003erole-\u003evalue; // WRITER\n$response-\u003ename; // tunedModels/text-predictor-dsygc8rjuymz/permissions/101799614406133382015\n$response-\u003egranteeType-\u003evalue; // GROUP\n$response-\u003eemailAddress; // genai-samples-test-group@googlegroups.com\n\n$response-\u003etoArray(); // ['role' =\u003e 'WRITER', ...]\n```\n\n## Tests\n\n```php\ncomposer test:phpunit\n```\n\n## Support Project\nIf this library has helped you, consider giving it a ⭐️ Good luck with building with the Gemini API.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fderrickobedgiu1%2Fgemini-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fderrickobedgiu1%2Fgemini-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fderrickobedgiu1%2Fgemini-api/lists"}