{
  "@context": "https://schema.org",
  "@id": "https://aggr.aymericbeaumet.com/items/philschmid-de/2026-09-28-credentials-api-for-gemini-managed-agents/#webpage",
  "@type": [
    "WebPage",
    "ArchiveComponent"
  ],
  "articleBody": "We recently shipped the [Credentials API](https://aistudio.google.com/docs/agent-credentials) for [Managed Agents](https://aistudio.google.com/docs/agents) ([`antigravity-preview-09-2026`](https://aistudio.google.com/docs/antigravity-agent)). It lets your agent authenticate with external services like GitHub, Notion, or the Gemini API without putting raw secrets inside the [Linux sandbox](https://aistudio.google.com/docs/agent-environment).\n\n![Credentials API end-to-end flow](https://www.philschmid.de/static/blog/managed-agents-credentials/credentials_flow.png)![](https://www.philschmid.de/static/blog/managed-agents-credentials/credentials_flow_dark.png)\n\nIf you pass an API key as a normal environment variable, any dependency or script inside the sandbox can read `os.environ` and leak it. With the Credentials API, the secret stays on the server and is injected on the wire by the egress proxy.\n\n## How it works\n\n### 1\\. Store the secret once\n\nRegister a credential with [`credentials.create()`](https://aistudio.google.com/docs/agent-credentials#create-a-credential). Secrets are write-only and encrypted at rest; API responses only return metadata (`id`, `type`, `status`, timestamps).\n\n![Step 1: Store the secret once](https://www.philschmid.de/static/blog/managed-agents-credentials/step1_store_once.png)![](https://www.philschmid.de/static/blog/managed-agents-credentials/step1_store_once_dark.png)\n\nThere are [3 credential types](https://aistudio.google.com/docs/agent-credentials#credential-types):\n\n- **[`bearer_token`](https://aistudio.google.com/docs/agent-credentials#bearer-token)**: Static tokens and API keys injected as HTTP headers (`Authorization: Bearer <token>` by default, or custom `header_name` and `prefix`).\n- **[`oauth2`](https://aistudio.google.com/docs/agent-credentials#oauth2)**: Refresh tokens (`client_id`, `client_secret`, `refresh_token`, `token_url`). Gemini exchanges and refreshes access tokens automatically before expiry.\n- **[`environment_variable`](https://aistudio.google.com/docs/agent-credentials#environment-variable)**: For CLIs and SDKs that read secrets from the process environment. The container receives a placeholder (`__GEMINI_CRED_<id>__`), and the egress proxy swaps in the real value only for requests to `trusted_domains`.\n\n### 2\\. Reference it by ID\n\nPass the credential `id` when defining a reusable agent with [`agents.create()`](https://aistudio.google.com/docs/custom-agents#create-a-managed-agent) (or per run in [`interactions.create()`](https://aistudio.google.com/docs/interactions)) on a remote [`mcp_server`](https://aistudio.google.com/docs/agent-credentials#use-credentials-with-mcp-servers) tool, a domain in [`network.allowlist`](https://aistudio.google.com/docs/agent-credentials#use-credentials-in-the-network-allowlist), or a variable in [`base_environment.env`](https://aistudio.google.com/docs/agent-credentials#use-credentials-as-environment-variables).\n\n![Step 2: Reference it by ID](https://www.philschmid.de/static/blog/managed-agents-credentials/step2_reference_by_id.png)![](https://www.philschmid.de/static/blog/managed-agents-credentials/step2_reference_by_id_dark.png)\n\n### 3\\. Injected on the wire\n\nWhen the agent calls an [MCP tool](https://aistudio.google.com/docs/antigravity-agent#mcp-servers) or makes an outbound HTTP request from the [sandbox](https://aistudio.google.com/docs/agent-environment#network-configuration), the egress proxy checks the target domain and injects the real credential on the wire.\n\n![Step 3: Injected on the wire](https://www.philschmid.de/static/blog/managed-agents-credentials/step3_injected_on_wire.png)![](https://www.philschmid.de/static/blog/managed-agents-credentials/step3_injected_on_wire_dark.png)\n\n## Example Reviewing and smoke-testing GitHub PRs\n\nHere is a practical examples on a reusable [custom agent](https://aistudio.google.com/docs/custom-agents) that manages [`google-gemini/cookbook`](https://github.com/google-gemini/cookbook) via the Github MCP server and can make securte Gemini API calls. The `GEMINI_API_KEY` is bound as a credential, untrusted code in the sandbox can call `generativelanguage.googleapis.com` without ever seeing the real API key.\n\n![Architecture diagram: GitHub MCP bearer_token plus sandbox GEMINI_API_KEY environment_variable](https://www.philschmid.de/static/blog/managed-agents-credentials/credentials_mcp_allowlist_architecture.png)![](https://www.philschmid.de/static/blog/managed-agents-credentials/credentials_mcp_allowlist_architecture_dark.png)\n\n### Create a read-only GitHub token\n\n1. Open [GitHub Fine-grained Personal Access Tokens](https://github.com/settings/personal-access-tokens) and click **Generate new token**.\n2. Scope **Repository access** to your target repositories and set **Pull requests** and **Contents** permissions to *Read-only*.\n3. Export `GITHUB_PAT` and [`GEMINI_API_KEY`](https://aistudio.google.com/docs/interactions/api-key) locally.\n\n### Run the agent\n\nInstall the SDK (`bun add @google/genai`) and run:\n\nTypeScript\n\n```typescript\nimport { GoogleGenAI } from \"@google/genai\";\n \nconst ai = new GoogleGenAI({});\n \n// 1. Store credentials once\nconst github = await ai.credentials.create({\n  id: \"github-mcp\",\n  type: \"bearer_token\",\n  token: process.env.GITHUB_PAT!,\n});\n \nconst geminiKey = await ai.credentials.create({\n  id: \"gemini-key\",\n  type: \"environment_variable\",\n  value: process.env.GEMINI_API_KEY!,\n  injection_location: [\"header\", \"query\"],\n  trusted_domains: [\"generativelanguage.googleapis.com\"],\n});\n \n// 2. Define a reusable agent wired to both credentials\nconst agent = await ai.agents.create({\n  id: \"cookbook-pr-reviewer\",\n  base_agent: \"antigravity-preview-09-2026\",\n  system_instruction:\n    \"You are a maintainer for google-gemini/cookbook. Use the github tools to inspect pull requests, and use the sandbox to smoke-test Gemini API snippets and draft release notes.\",\n  tools: [\n    { type: \"code_execution\" },\n    {\n      type: \"mcp_server\",\n      name: \"github\",\n      url: \"https://api.githubcopilot.com/mcp/\",\n      credential: github.id,\n    },\n  ],\n  base_environment: {\n    type: \"remote\",\n    env: {\n      GEMINI_API_KEY: { credential: geminiKey.id },\n    },\n  },\n});\n \n// 3. Run the agent\nconst interaction = await ai.interactions.create(\n  {\n    agent: agent.id,\n    environment: \"remote\",\n    input:\n      \"Draft a release note for the 3 most recently merged PRs in google-gemini/cookbook, and run a live smoke test against gemini-3.8-flash in the sandbox to verify the code snippet works.\",\n  },\n  { timeout: 300000 },\n);\n \nconsole.log(interaction.output_text);\n```\n\nOutput:\n\nMarkdown\n\n```markdown\n# Release Notes: `google-gemini/cookbook`\n \n### 1. [PR #1347](https://github.com/google-gemini/cookbook/pull/1347) - Zero-Cloud Local Hybrid RAG Recipe with SQLite FTS5 & Gemini\n- **Author:** @Cagrik34 | **Merged At:** 2026-09-28 10:49:52 UTC\n- **Summary:** Combines SQLite FTS5 (`unicode61`) BM25 search with `text-embedding-004` dense vectors and Reciprocal Rank Fusion (RRF, k=60) in `examples/Zero_Cloud_Hybrid_RAG_SQLite_FTS5_Gemini.ipynb`.\n \n### 2. [PR #1383](https://github.com/google-gemini/cookbook/pull/1383) - Fix `musicGenerationConfig` Schema in Lyria RealTime Notebook\n- **Author:** @kkorpal | **Merged At:** 2026-09-28 10:29:00 UTC\n- **Summary:** Updates `music_generation_config` to `musicGenerationConfig` and flattens the payload in `quickstarts/Get_started_LyriaRealTime.ipynb`.\n \n### 3. [PR #1384](https://github.com/google-gemini/cookbook/pull/1384) - Fix HTTP 400 BadRequest via File API in Prompting Notebook\n- **Author:** @kkorpal | **Merged At:** 2026-09-25 12:29:48 UTC\n- **Summary:** Switches multimodal image upload in `quickstarts/Prompting.ipynb` to `client.files.upload`.\n```\n\nWhat happens during the run:\n\n1. **GitHub MCP (`github-mcp`)**: Connects to `api.githubcopilot.com/mcp/` and calls `github:list_pull_requests` and `github:pull_request_read` to inspect the latest merged PRs (`#1347`, `#1383`, `#1384`).\n2. **Sandbox execution (`gemini-key`)**: Inside the container, `$GEMINI_API_KEY` is `__GEMINI_CRED_gemini-key__`. When the smoke test calls `generativelanguage.googleapis.com`, the egress proxy swaps the placeholder for the real key on the wire.\n3. **Domain restriction**: Any request carrying `__GEMINI_CRED_gemini-key__` to a domain outside `trusted_domains` is blocked (`403`).\n\n### Rotate or delete credentials\n\n[Update a credential](https://aistudio.google.com/docs/agent-credentials#rotate-a-credential) by ID to rotate its secret without changing your agent definition, or [delete it](https://aistudio.google.com/docs/agent-credentials#delete-a-credential) when it is no longer needed:\n\nTypeScript\n\n```typescript\nawait ai.credentials.update(\"github-mcp\", {\n  type: \"bearer_token\",\n  token: process.env.GITHUB_PAT_NEW!,\n});\n \nawait ai.credentials.delete(\"github-mcp\");\nawait ai.credentials.delete(\"gemini-key\");\n```\n\nSee the [Credentials API docs](https://aistudio.google.com/docs/agent-credentials), [Custom Agents guide](https://aistudio.google.com/docs/custom-agents), and [Managed Agents Quickstart](https://aistudio.google.com/docs/managed-agents-quickstart) for full details.\n\nThanks for reading! If you have any questions or feedback, please let me know on [Twitter](https://twitter.com/_philschmid) or [LinkedIn](https://www.linkedin.com/in/philipp-schmid-a6a2bb196/).\n",
  "authors": [],
  "captured_at": "2026-09-28T15:21:52.698000543+00:00",
  "category": "programming",
  "content_html": "<p>We recently shipped the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/agent-credentials\">Credentials API</a> for <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/agents\">Managed Agents</a> (<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/antigravity-agent\"><code>antigravity-preview-09-2026</code></a>). It lets your agent authenticate with external services like GitHub, Notion, or the Gemini API without putting raw secrets inside the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/agent-environment\">Linux sandbox</a>.</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.philschmid.de/static/blog/managed-agents-credentials/credentials_flow.png\" alt=\"Credentials API end-to-end flow\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.philschmid.de/static/blog/managed-agents-credentials/credentials_flow_dark.png\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>If you pass an API key as a normal environment variable, any dependency or script inside the sandbox can read <code>os.environ</code> and leak it. With the Credentials API, the secret stays on the server and is injected on the wire by the egress proxy.</p>\n<h2>How it works</h2>\n<h3>1. Store the secret once</h3>\n<p>Register a credential with <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/agent-credentials#create-a-credential\"><code>credentials.create()</code></a>. Secrets are write-only and encrypted at rest; API responses only return metadata (<code>id</code>, <code>type</code>, <code>status</code>, timestamps).</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.philschmid.de/static/blog/managed-agents-credentials/step1_store_once.png\" alt=\"Step 1: Store the secret once\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.philschmid.de/static/blog/managed-agents-credentials/step1_store_once_dark.png\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>There are <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/agent-credentials#credential-types\">3 credential types</a>:</p>\n<ul>\n<li><strong><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/agent-credentials#bearer-token\"><code>bearer_token</code></a></strong>: Static tokens and API keys injected as HTTP headers (<code>Authorization: Bearer &lt;token&gt;</code> by default, or custom <code>header_name</code> and <code>prefix</code>).</li>\n<li><strong><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/agent-credentials#oauth2\"><code>oauth2</code></a></strong>: Refresh tokens (<code>client_id</code>, <code>client_secret</code>, <code>refresh_token</code>, <code>token_url</code>). Gemini exchanges and refreshes access tokens automatically before expiry.</li>\n<li><strong><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/agent-credentials#environment-variable\"><code>environment_variable</code></a></strong>: For CLIs and SDKs that read secrets from the process environment. The container receives a placeholder (<code>__GEMINI_CRED_&lt;id&gt;__</code>), and the egress proxy swaps in the real value only for requests to <code>trusted_domains</code>.</li>\n</ul>\n<h3>2. Reference it by ID</h3>\n<p>Pass the credential <code>id</code> when defining a reusable agent with <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/custom-agents#create-a-managed-agent\"><code>agents.create()</code></a> (or per run in <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/interactions\"><code>interactions.create()</code></a>) on a remote <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/agent-credentials#use-credentials-with-mcp-servers\"><code>mcp_server</code></a> tool, a domain in <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/agent-credentials#use-credentials-in-the-network-allowlist\"><code>network.allowlist</code></a>, or a variable in <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/agent-credentials#use-credentials-as-environment-variables\"><code>base_environment.env</code></a>.</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.philschmid.de/static/blog/managed-agents-credentials/step2_reference_by_id.png\" alt=\"Step 2: Reference it by ID\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.philschmid.de/static/blog/managed-agents-credentials/step2_reference_by_id_dark.png\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<h3>3. Injected on the wire</h3>\n<p>When the agent calls an <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/antigravity-agent#mcp-servers\">MCP tool</a> or makes an outbound HTTP request from the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/agent-environment#network-configuration\">sandbox</a>, the egress proxy checks the target domain and injects the real credential on the wire.</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.philschmid.de/static/blog/managed-agents-credentials/step3_injected_on_wire.png\" alt=\"Step 3: Injected on the wire\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.philschmid.de/static/blog/managed-agents-credentials/step3_injected_on_wire_dark.png\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<h2>Example Reviewing and smoke-testing GitHub PRs</h2>\n<p>Here is a practical examples on a reusable <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/custom-agents\">custom agent</a> that manages <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/google-gemini/cookbook\"><code>google-gemini/cookbook</code></a> via the Github MCP server and can make securte Gemini API calls. The <code>GEMINI_API_KEY</code> is bound as a credential, untrusted code in the sandbox can call <code>generativelanguage.googleapis.com</code> without ever seeing the real API key.</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.philschmid.de/static/blog/managed-agents-credentials/credentials_mcp_allowlist_architecture.png\" alt=\"Architecture diagram: GitHub MCP bearer_token plus sandbox GEMINI_API_KEY environment_variable\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.philschmid.de/static/blog/managed-agents-credentials/credentials_mcp_allowlist_architecture_dark.png\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<h3>Create a read-only GitHub token</h3>\n<ol>\n<li>Open <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/settings/personal-access-tokens\">GitHub Fine-grained Personal Access Tokens</a> and click <strong>Generate new token</strong>.</li>\n<li>Scope <strong>Repository access</strong> to your target repositories and set <strong>Pull requests</strong> and <strong>Contents</strong> permissions to <em>Read-only</em>.</li>\n<li>Export <code>GITHUB_PAT</code> and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/interactions/api-key\"><code>GEMINI_API_KEY</code></a> locally.</li>\n</ol>\n<h3>Run the agent</h3>\n<p>Install the SDK (<code>bun add @google/genai</code>) and run:</p>\n<p>TypeScript</p>\n<pre><code class=\"language-typescript\"><span class=\"code-snippet\" data-language=\"TypeScript\"><span class=\"syntax-source syntax-js\"><span class=\"syntax-meta syntax-import syntax-js\"><span class=\"syntax-keyword syntax-control syntax-import-export syntax-js\">import</span> <span class=\"syntax-meta syntax-block syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">GoogleGenAI</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span> <span class=\"syntax-keyword syntax-control syntax-import-export syntax-js\">from</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>@google/genai<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n \n<span class=\"syntax-storage syntax-type syntax-js\">const</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">ai</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-js\">=</span> <span class=\"syntax-meta syntax-instance syntax-constructor syntax-js\"><span class=\"syntax-keyword syntax-operator syntax-word syntax-new syntax-js\">new</span><span class=\"syntax-meta syntax-function-call syntax-constructor syntax-js\"> <span class=\"syntax-variable syntax-type syntax-js\">GoogleGenAI</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n \n<span class=\"syntax-comment syntax-line syntax-double-slash syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-js\">//</span> 1. Store credentials once\n</span><span class=\"syntax-storage syntax-type syntax-js\">const</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">github</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-js\">=</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">await</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">ai</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">credentials</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">create</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">id</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>github-mcp<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">type</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>bearer_token<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">token</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-support syntax-type syntax-object syntax-process syntax-js\">process</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-support syntax-type syntax-object syntax-process syntax-js\">env</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">GITHUB_PAT</span>!<span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n<span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n \n<span class=\"syntax-storage syntax-type syntax-js\">const</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">geminiKey</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-js\">=</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">await</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">ai</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">credentials</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">create</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">id</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>gemini-key<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">type</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>environment_variable<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">value</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-support syntax-type syntax-object syntax-process syntax-js\">process</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-support syntax-type syntax-object syntax-process syntax-js\">env</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">GEMINI_API_KEY</span>!<span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">injection_location</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-meta syntax-sequence syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">[</span><span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>header<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>query<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">]</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">trusted_domains</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-meta syntax-sequence syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">[</span><span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>generativelanguage.googleapis.com<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">]</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n<span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n \n<span class=\"syntax-comment syntax-line syntax-double-slash syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-js\">//</span> 2. Define a reusable agent wired to both credentials\n</span><span class=\"syntax-storage syntax-type syntax-js\">const</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">agent</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-js\">=</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">await</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">ai</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">agents</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">create</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">id</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>cookbook-pr-reviewer<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">base_agent</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>antigravity-preview-09-2026<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">system_instruction</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span>\n    <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>You are a maintainer for google-gemini/cookbook. Use the github tools to inspect pull requests, and use the sandbox to smoke-test Gemini API snippets and draft release notes.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">tools</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-meta syntax-sequence syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">[</span>\n    <span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">type</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>code_execution<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n    <span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span>\n      <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">type</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>mcp_server<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n      <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">name</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>github<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n      <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">url</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>https://api.githubcopilot.com/mcp/<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n      <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">credential</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">github</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">id</span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n    <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-punctuation syntax-section syntax-brackets syntax-js\">]</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">base_environment</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span>\n    <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">type</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>remote<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n    <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">env</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span>\n      <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">GEMINI_API_KEY</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">credential</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">geminiKey</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">id</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n    <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n<span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n \n<span class=\"syntax-comment syntax-line syntax-double-slash syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-js\">//</span> 3. Run the agent\n</span><span class=\"syntax-storage syntax-type syntax-js\">const</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">interaction</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-js\">=</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-js\">await</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">ai</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">interactions</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">create</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span>\n    <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">agent</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">agent</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">id</span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n    <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">environment</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>remote<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n    <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">input</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span>\n      <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>Draft a release note for the 3 most recently merged PRs in google-gemini/cookbook, and run a live smoke test against gemini-3.8-flash in the sandbox to verify the code snippet works.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span> <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">timeout</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-constant syntax-numeric syntax-js\">300000</span> <span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n \n<span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-support syntax-type syntax-object syntax-console syntax-js\">console</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-support syntax-function syntax-console syntax-js\">log</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-variable syntax-other syntax-object syntax-js\">interaction</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">output_text</span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n</span></span></code></pre>\n<p>Output:</p>\n<p>Markdown</p>\n<pre><code class=\"language-markdown\"><span class=\"code-snippet\" data-language=\"Markdown\"><span class=\"syntax-text syntax-html syntax-markdown\"><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-1 syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">#</span> </span><span class=\"syntax-markup syntax-heading syntax-1 syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Release Notes: <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>google-gemini/cookbook<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span></span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span> \n<span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">1. <span class=\"syntax-meta syntax-link syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-link syntax-begin syntax-markdown\">[</span></span><span class=\"syntax-meta syntax-link syntax-inline syntax-description syntax-markdown\">PR #1347</span><span class=\"syntax-meta syntax-link syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-link syntax-end syntax-markdown\">]</span></span><span class=\"syntax-meta syntax-link syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-metadata syntax-begin syntax-markdown\">(</span><span class=\"syntax-markup syntax-underline syntax-link syntax-markdown\">https://github.com/google-gemini/cookbook/pull/1347</span><span class=\"syntax-punctuation syntax-definition syntax-metadata syntax-end syntax-markdown\">)</span></span> - Zero-Cloud Local Hybrid RAG Recipe with SQLite FTS5 <span class=\"syntax-meta syntax-other syntax-valid-ampersand syntax-markdown\">&amp;</span> Gemini</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-meta syntax-table syntax-header syntax-markdown\">- <span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>Author:<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span> @Cagrik34 <span class=\"syntax-punctuation syntax-separator syntax-table-cell syntax-markdown\">|</span> <span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>Merged At:<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span> 2026-09-28 10:49:52 UTC\n</span><span class=\"syntax-meta syntax-table syntax-header-separator syntax-markdown\"><span class=\"syntax-punctuation syntax-section syntax-table-header syntax-markdown\">-</span> **Summary<span class=\"syntax-punctuation syntax-definition syntax-table-cell-alignment syntax-markdown\">:</span>** Combines SQLite FTS5 (`unicode61`) BM25 search with `text<span class=\"syntax-punctuation syntax-section syntax-table-header syntax-markdown\">-</span>embedding<span class=\"syntax-punctuation syntax-section syntax-table-header syntax-markdown\">-</span>004` dense vectors and Reciprocal Rank Fusion (RRF, k=60) in `examples/Zero_Cloud_Hybrid_RAG_SQLite_FTS5_Gemini.ipynb`.\n</span><span class=\"syntax-meta syntax-table syntax-markdown\"></span></span> \n<span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">2. <span class=\"syntax-meta syntax-link syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-link syntax-begin syntax-markdown\">[</span></span><span class=\"syntax-meta syntax-link syntax-inline syntax-description syntax-markdown\">PR #1383</span><span class=\"syntax-meta syntax-link syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-link syntax-end syntax-markdown\">]</span></span><span class=\"syntax-meta syntax-link syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-metadata syntax-begin syntax-markdown\">(</span><span class=\"syntax-markup syntax-underline syntax-link syntax-markdown\">https://github.com/google-gemini/cookbook/pull/1383</span><span class=\"syntax-punctuation syntax-definition syntax-metadata syntax-end syntax-markdown\">)</span></span> - Fix <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>musicGenerationConfig<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> Schema in Lyria RealTime Notebook</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-meta syntax-table syntax-header syntax-markdown\">- <span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>Author:<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span> @kkorpal <span class=\"syntax-punctuation syntax-separator syntax-table-cell syntax-markdown\">|</span> <span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>Merged At:<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span> 2026-09-28 10:29:00 UTC\n</span><span class=\"syntax-meta syntax-table syntax-header-separator syntax-markdown\"><span class=\"syntax-punctuation syntax-section syntax-table-header syntax-markdown\">-</span> **Summary<span class=\"syntax-punctuation syntax-definition syntax-table-cell-alignment syntax-markdown\">:</span>** Updates `music_generation_config` to `musicGenerationConfig` and flattens the payload in `quickstarts/Get_started_LyriaRealTime.ipynb`.\n</span><span class=\"syntax-meta syntax-table syntax-markdown\"></span></span> \n<span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">3. <span class=\"syntax-meta syntax-link syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-link syntax-begin syntax-markdown\">[</span></span><span class=\"syntax-meta syntax-link syntax-inline syntax-description syntax-markdown\">PR #1384</span><span class=\"syntax-meta syntax-link syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-link syntax-end syntax-markdown\">]</span></span><span class=\"syntax-meta syntax-link syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-metadata syntax-begin syntax-markdown\">(</span><span class=\"syntax-markup syntax-underline syntax-link syntax-markdown\">https://github.com/google-gemini/cookbook/pull/1384</span><span class=\"syntax-punctuation syntax-definition syntax-metadata syntax-end syntax-markdown\">)</span></span> - Fix HTTP 400 BadRequest via File API in Prompting Notebook</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-meta syntax-table syntax-header syntax-markdown\">- <span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>Author:<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span> @kkorpal <span class=\"syntax-punctuation syntax-separator syntax-table-cell syntax-markdown\">|</span> <span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>Merged At:<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span> 2026-09-25 12:29:48 UTC\n</span><span class=\"syntax-meta syntax-table syntax-header-separator syntax-markdown\"><span class=\"syntax-punctuation syntax-section syntax-table-header syntax-markdown\">-</span> **Summary<span class=\"syntax-punctuation syntax-definition syntax-table-cell-alignment syntax-markdown\">:</span>** Switches multimodal image upload in `quickstarts/Prompting.ipynb` to `client.files.upload`.\n</span><span class=\"syntax-meta syntax-table syntax-markdown\"></span></span></span></span></code></pre>\n<p>What happens during the run:</p>\n<ol>\n<li><strong>GitHub MCP (<code>github-mcp</code>)</strong>: Connects to <code>api.githubcopilot.com/mcp/</code> and calls <code>github:list_pull_requests</code> and <code>github:pull_request_read</code> to inspect the latest merged PRs (<code>#1347</code>, <code>#1383</code>, <code>#1384</code>).</li>\n<li><strong>Sandbox execution (<code>gemini-key</code>)</strong>: Inside the container, <code>$GEMINI_API_KEY</code> is <code>__GEMINI_CRED_gemini-key__</code>. When the smoke test calls <code>generativelanguage.googleapis.com</code>, the egress proxy swaps the placeholder for the real key on the wire.</li>\n<li><strong>Domain restriction</strong>: Any request carrying <code>__GEMINI_CRED_gemini-key__</code> to a domain outside <code>trusted_domains</code> is blocked (<code>403</code>).</li>\n</ol>\n<h3>Rotate or delete credentials</h3>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/agent-credentials#rotate-a-credential\">Update a credential</a> by ID to rotate its secret without changing your agent definition, or <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/agent-credentials#delete-a-credential\">delete it</a> when it is no longer needed:</p>\n<p>TypeScript</p>\n<pre><code class=\"language-typescript\"><span class=\"code-snippet\" data-language=\"TypeScript\"><span class=\"syntax-source syntax-js\"><span class=\"syntax-keyword syntax-control syntax-flow syntax-js\">await</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">ai</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">credentials</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">update</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>github-mcp<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span> <span class=\"syntax-meta syntax-object-literal syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">{</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">type</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>bearer_token<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n  <span class=\"syntax-meta syntax-object-literal syntax-key syntax-js\">token</span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-js\">:</span> <span class=\"syntax-support syntax-type syntax-object syntax-process syntax-js\">process</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-support syntax-type syntax-object syntax-process syntax-js\">env</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">GITHUB_PAT_NEW</span>!<span class=\"syntax-punctuation syntax-separator syntax-comma syntax-js\">,</span>\n<span class=\"syntax-punctuation syntax-section syntax-block syntax-js\">}</span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n \n<span class=\"syntax-keyword syntax-control syntax-flow syntax-js\">await</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">ai</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">credentials</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">delete</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>github-mcp<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n<span class=\"syntax-keyword syntax-control syntax-flow syntax-js\">await</span> <span class=\"syntax-variable syntax-other syntax-object syntax-js\">ai</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-property syntax-object syntax-js\">credentials</span><span class=\"syntax-punctuation syntax-accessor syntax-js\">.</span><span class=\"syntax-meta syntax-function-call syntax-method syntax-js\"><span class=\"syntax-variable syntax-function syntax-js\">delete</span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">(</span><span class=\"syntax-string syntax-quoted syntax-double syntax-js\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-js\">&quot;</span>gemini-key<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-js\">&quot;</span></span></span><span class=\"syntax-meta syntax-group syntax-js\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-js\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-statement syntax-js\">;</span>\n</span></span></code></pre>\n<p>See the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/agent-credentials\">Credentials API docs</a>, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/custom-agents\">Custom Agents guide</a>, and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/docs/managed-agents-quickstart\">Managed Agents Quickstart</a> for full details.</p>\n<p>Thanks for reading! If you have any questions or feedback, please let me know on <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://twitter.com/_philschmid\">Twitter</a> or <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.linkedin.com/in/philipp-schmid-a6a2bb196/\">LinkedIn</a>.</p>\n",
  "content_markdown": "We recently shipped the [Credentials API](https://aistudio.google.com/docs/agent-credentials) for [Managed Agents](https://aistudio.google.com/docs/agents) ([`antigravity-preview-09-2026`](https://aistudio.google.com/docs/antigravity-agent)). It lets your agent authenticate with external services like GitHub, Notion, or the Gemini API without putting raw secrets inside the [Linux sandbox](https://aistudio.google.com/docs/agent-environment).\n\n![Credentials API end-to-end flow](https://www.philschmid.de/static/blog/managed-agents-credentials/credentials_flow.png)![](https://www.philschmid.de/static/blog/managed-agents-credentials/credentials_flow_dark.png)\n\nIf you pass an API key as a normal environment variable, any dependency or script inside the sandbox can read `os.environ` and leak it. With the Credentials API, the secret stays on the server and is injected on the wire by the egress proxy.\n\n## How it works\n\n### 1\\. Store the secret once\n\nRegister a credential with [`credentials.create()`](https://aistudio.google.com/docs/agent-credentials#create-a-credential). Secrets are write-only and encrypted at rest; API responses only return metadata (`id`, `type`, `status`, timestamps).\n\n![Step 1: Store the secret once](https://www.philschmid.de/static/blog/managed-agents-credentials/step1_store_once.png)![](https://www.philschmid.de/static/blog/managed-agents-credentials/step1_store_once_dark.png)\n\nThere are [3 credential types](https://aistudio.google.com/docs/agent-credentials#credential-types):\n\n- **[`bearer_token`](https://aistudio.google.com/docs/agent-credentials#bearer-token)**: Static tokens and API keys injected as HTTP headers (`Authorization: Bearer <token>` by default, or custom `header_name` and `prefix`).\n- **[`oauth2`](https://aistudio.google.com/docs/agent-credentials#oauth2)**: Refresh tokens (`client_id`, `client_secret`, `refresh_token`, `token_url`). Gemini exchanges and refreshes access tokens automatically before expiry.\n- **[`environment_variable`](https://aistudio.google.com/docs/agent-credentials#environment-variable)**: For CLIs and SDKs that read secrets from the process environment. The container receives a placeholder (`__GEMINI_CRED_<id>__`), and the egress proxy swaps in the real value only for requests to `trusted_domains`.\n\n### 2\\. Reference it by ID\n\nPass the credential `id` when defining a reusable agent with [`agents.create()`](https://aistudio.google.com/docs/custom-agents#create-a-managed-agent) (or per run in [`interactions.create()`](https://aistudio.google.com/docs/interactions)) on a remote [`mcp_server`](https://aistudio.google.com/docs/agent-credentials#use-credentials-with-mcp-servers) tool, a domain in [`network.allowlist`](https://aistudio.google.com/docs/agent-credentials#use-credentials-in-the-network-allowlist), or a variable in [`base_environment.env`](https://aistudio.google.com/docs/agent-credentials#use-credentials-as-environment-variables).\n\n![Step 2: Reference it by ID](https://www.philschmid.de/static/blog/managed-agents-credentials/step2_reference_by_id.png)![](https://www.philschmid.de/static/blog/managed-agents-credentials/step2_reference_by_id_dark.png)\n\n### 3\\. Injected on the wire\n\nWhen the agent calls an [MCP tool](https://aistudio.google.com/docs/antigravity-agent#mcp-servers) or makes an outbound HTTP request from the [sandbox](https://aistudio.google.com/docs/agent-environment#network-configuration), the egress proxy checks the target domain and injects the real credential on the wire.\n\n![Step 3: Injected on the wire](https://www.philschmid.de/static/blog/managed-agents-credentials/step3_injected_on_wire.png)![](https://www.philschmid.de/static/blog/managed-agents-credentials/step3_injected_on_wire_dark.png)\n\n## Example Reviewing and smoke-testing GitHub PRs\n\nHere is a practical examples on a reusable [custom agent](https://aistudio.google.com/docs/custom-agents) that manages [`google-gemini/cookbook`](https://github.com/google-gemini/cookbook) via the Github MCP server and can make securte Gemini API calls. The `GEMINI_API_KEY` is bound as a credential, untrusted code in the sandbox can call `generativelanguage.googleapis.com` without ever seeing the real API key.\n\n![Architecture diagram: GitHub MCP bearer_token plus sandbox GEMINI_API_KEY environment_variable](https://www.philschmid.de/static/blog/managed-agents-credentials/credentials_mcp_allowlist_architecture.png)![](https://www.philschmid.de/static/blog/managed-agents-credentials/credentials_mcp_allowlist_architecture_dark.png)\n\n### Create a read-only GitHub token\n\n1. Open [GitHub Fine-grained Personal Access Tokens](https://github.com/settings/personal-access-tokens) and click **Generate new token**.\n2. Scope **Repository access** to your target repositories and set **Pull requests** and **Contents** permissions to *Read-only*.\n3. Export `GITHUB_PAT` and [`GEMINI_API_KEY`](https://aistudio.google.com/docs/interactions/api-key) locally.\n\n### Run the agent\n\nInstall the SDK (`bun add @google/genai`) and run:\n\nTypeScript\n\n```typescript\nimport { GoogleGenAI } from \"@google/genai\";\n \nconst ai = new GoogleGenAI({});\n \n// 1. Store credentials once\nconst github = await ai.credentials.create({\n  id: \"github-mcp\",\n  type: \"bearer_token\",\n  token: process.env.GITHUB_PAT!,\n});\n \nconst geminiKey = await ai.credentials.create({\n  id: \"gemini-key\",\n  type: \"environment_variable\",\n  value: process.env.GEMINI_API_KEY!,\n  injection_location: [\"header\", \"query\"],\n  trusted_domains: [\"generativelanguage.googleapis.com\"],\n});\n \n// 2. Define a reusable agent wired to both credentials\nconst agent = await ai.agents.create({\n  id: \"cookbook-pr-reviewer\",\n  base_agent: \"antigravity-preview-09-2026\",\n  system_instruction:\n    \"You are a maintainer for google-gemini/cookbook. Use the github tools to inspect pull requests, and use the sandbox to smoke-test Gemini API snippets and draft release notes.\",\n  tools: [\n    { type: \"code_execution\" },\n    {\n      type: \"mcp_server\",\n      name: \"github\",\n      url: \"https://api.githubcopilot.com/mcp/\",\n      credential: github.id,\n    },\n  ],\n  base_environment: {\n    type: \"remote\",\n    env: {\n      GEMINI_API_KEY: { credential: geminiKey.id },\n    },\n  },\n});\n \n// 3. Run the agent\nconst interaction = await ai.interactions.create(\n  {\n    agent: agent.id,\n    environment: \"remote\",\n    input:\n      \"Draft a release note for the 3 most recently merged PRs in google-gemini/cookbook, and run a live smoke test against gemini-3.8-flash in the sandbox to verify the code snippet works.\",\n  },\n  { timeout: 300000 },\n);\n \nconsole.log(interaction.output_text);\n```\n\nOutput:\n\nMarkdown\n\n```markdown\n# Release Notes: `google-gemini/cookbook`\n \n### 1. [PR #1347](https://github.com/google-gemini/cookbook/pull/1347) - Zero-Cloud Local Hybrid RAG Recipe with SQLite FTS5 & Gemini\n- **Author:** @Cagrik34 | **Merged At:** 2026-09-28 10:49:52 UTC\n- **Summary:** Combines SQLite FTS5 (`unicode61`) BM25 search with `text-embedding-004` dense vectors and Reciprocal Rank Fusion (RRF, k=60) in `examples/Zero_Cloud_Hybrid_RAG_SQLite_FTS5_Gemini.ipynb`.\n \n### 2. [PR #1383](https://github.com/google-gemini/cookbook/pull/1383) - Fix `musicGenerationConfig` Schema in Lyria RealTime Notebook\n- **Author:** @kkorpal | **Merged At:** 2026-09-28 10:29:00 UTC\n- **Summary:** Updates `music_generation_config` to `musicGenerationConfig` and flattens the payload in `quickstarts/Get_started_LyriaRealTime.ipynb`.\n \n### 3. [PR #1384](https://github.com/google-gemini/cookbook/pull/1384) - Fix HTTP 400 BadRequest via File API in Prompting Notebook\n- **Author:** @kkorpal | **Merged At:** 2026-09-25 12:29:48 UTC\n- **Summary:** Switches multimodal image upload in `quickstarts/Prompting.ipynb` to `client.files.upload`.\n```\n\nWhat happens during the run:\n\n1. **GitHub MCP (`github-mcp`)**: Connects to `api.githubcopilot.com/mcp/` and calls `github:list_pull_requests` and `github:pull_request_read` to inspect the latest merged PRs (`#1347`, `#1383`, `#1384`).\n2. **Sandbox execution (`gemini-key`)**: Inside the container, `$GEMINI_API_KEY` is `__GEMINI_CRED_gemini-key__`. When the smoke test calls `generativelanguage.googleapis.com`, the egress proxy swaps the placeholder for the real key on the wire.\n3. **Domain restriction**: Any request carrying `__GEMINI_CRED_gemini-key__` to a domain outside `trusted_domains` is blocked (`403`).\n\n### Rotate or delete credentials\n\n[Update a credential](https://aistudio.google.com/docs/agent-credentials#rotate-a-credential) by ID to rotate its secret without changing your agent definition, or [delete it](https://aistudio.google.com/docs/agent-credentials#delete-a-credential) when it is no longer needed:\n\nTypeScript\n\n```typescript\nawait ai.credentials.update(\"github-mcp\", {\n  type: \"bearer_token\",\n  token: process.env.GITHUB_PAT_NEW!,\n});\n \nawait ai.credentials.delete(\"github-mcp\");\nawait ai.credentials.delete(\"gemini-key\");\n```\n\nSee the [Credentials API docs](https://aistudio.google.com/docs/agent-credentials), [Custom Agents guide](https://aistudio.google.com/docs/custom-agents), and [Managed Agents Quickstart](https://aistudio.google.com/docs/managed-agents-quickstart) for full details.\n\nThanks for reading! If you have any questions or feedback, please let me know on [Twitter](https://twitter.com/_philschmid) or [LinkedIn](https://www.linkedin.com/in/philipp-schmid-a6a2bb196/).\n",
  "dateCreated": "2026-09-28T15:21:52.698000543+00:00",
  "date_created": "2026-09-28T00:00:00+00:00",
  "date_modified": "2026-09-28T00:00:00+00:00",
  "date_published": "2026-09-28T00:00:00+00:00",
  "description": "Store secrets once with the Credentials API, reference them by ID, and let the egress proxy inject them on the wire so they never enter the agent sandbox.",
  "external_url": "https://www.philschmid.de/managed-agents-credentials",
  "git": {
    "commit": "ebb0941c5c06a2ab2377342d607535262a3e969e",
    "path": "items/philschmid-de/2026/09/2026-09-28-credentials-api-for-gemini-managed-agents.md",
    "permalink": "https://github.com/aymericbeaumet/aggr-instance/blob/ebb0941c5c06a2ab2377342d607535262a3e969e/items/philschmid-de/2026/09/2026-09-28-credentials-api-for-gemini-managed-agents.md"
  },
  "id": "urn:aggr:item:5248e714ed27126618dfd2cd3e23e7240c4969fa",
  "isBasedOn": {
    "@id": "https://www.philschmid.de/managed-agents-credentials"
  },
  "mainEntity": {
    "@id": "https://www.philschmid.de/managed-agents-credentials",
    "@type": "CreativeWork",
    "archivedAt": {
      "@id": "https://aggr.aymericbeaumet.com/items/philschmid-de/2026-09-28-credentials-api-for-gemini-managed-agents/#webpage"
    },
    "dateModified": "2026-09-28T00:00:00+00:00",
    "datePublished": "2026-09-28T00:00:00+00:00",
    "headline": "Credentials API for Gemini Managed Agents",
    "timeRequired": "PT4M",
    "url": "https://www.philschmid.de/managed-agents-credentials",
    "wordCount": 819
  },
  "name": "Archived snapshot: Credentials API for Gemini Managed Agents",
  "preview": null,
  "reading_minutes": 4,
  "replicated_at": null,
  "source": "philschmid-de",
  "source_name": "philschmid.de - RSS feed",
  "summary": "Store secrets once with the Credentials API, reference them by ID, and let the egress proxy inject them on the wire so they never enter the agent sandbox.",
  "tags": [],
  "temporalCoverage": "2026-09-28T15:21:52.698000543+00:00",
  "title": "Credentials API for Gemini Managed Agents",
  "url": "https://aggr.aymericbeaumet.com/items/philschmid-de/2026-09-28-credentials-api-for-gemini-managed-agents/",
  "word_count": 819
}