[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M698Y4NNARKFN1KJM00MW912":3,"skill-same:01M698Y4NNARKFN1KJM00MW912":118},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":51,"linkOnly":52,"markdownContent":53,"markdownBody":54,"frontMatter":55,"refName":59,"commitSha":60,"skillDirectory":61,"forksCount":62,"repositoryHtmlUrl":63,"repositoryHomepageUrl":6,"ownerHtmlUrl":64,"ownerBlogUrl":65,"ownerDescription":66,"updatedAt":67,"install":68,"resources":81},"01M698Y4NNARKFN1KJM00MW912","agent-platform-deploy",null,"Deploy open models or custom weights from Model Garden to Agent Platform endpoints, check the status of an in-progress deployment operation, or clean up resources by undeploying models and deleting endpoints. Use when asked to actively deploy a model, list the Model Garden CATALOG of available models, check if a specific model is deployable (`gcloud ai model-garden models list-deployment-config`), query deployment cost, troubleshoot deployment errors (like quota limits), or undeploy\u002Fclean up endpoints. Also use when copying and deploying a 1P Tuned Model. Don't use for pure listing\u002Fdiscovery questions of the form \"is X deployed?\", \"list my endpoints\", or \"which regions have models running?\" — for those use `agent-platform-endpoint-management`. Don't use for running model evaluations (use `agent-platform-eval-flywheel` skill).","google\u002Fskills","google","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1342004?v=4","01M698VYEFDM0VJBZDYYJ2T83S","Google","01M698WR0H76ENHE587T9EJT89",24122,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcloud\u002Fagent-platform-deploy\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50],"platform","deploy","agent platform deploy","agent platform","limits","listing","when","endpoint","my","list","status","troubleshoot","config","agent-platform","progress","query","open","errors","eval","clean","up","model","resources","which","2026-11-10 10:12:30",false,"---\nname: agent-platform-deploy\nmetadata:\n  version: \"1.0.5\"\n  category: AiAndMachineLearning\ndescription: >-\n  Deploy open models or custom weights from Model Garden to Agent Platform\n  endpoints, check the status of an in-progress deployment operation, or clean\n  up resources by undeploying models and deleting endpoints. Use when asked to\n  actively deploy a model, list the Model Garden CATALOG of available models,\n  check if a specific model is deployable\n  (`gcloud ai model-garden models list-deployment-config`), query deployment\n  cost, troubleshoot deployment errors (like quota limits), or undeploy\u002Fclean\n  up endpoints. Also use when copying and deploying a 1P Tuned Model. Don't\n  use for pure listing\u002Fdiscovery questions of the form \"is X deployed?\",\n  \"list my endpoints\", or \"which regions have models running?\" — for those\n  use `agent-platform-endpoint-management`. Don't use for running model evaluations\n  (use `agent-platform-eval-flywheel` skill).\n---\n\n# Agent Platform Model Garden Deploy Skill\n\nThis skill provides instructions for deploying Open Models from Agent Platform\nModel Garden to endpoints, and subsequently undeploying them to clean up\nresources.\n\n## Attribution\n\n**MUST READ**: Before executing any `gcloud`, REST API, or MCP command, you MUST\nread [Usage Attribution](references\u002Fattribution.md). For commands executed\ndirectly in the terminal (never in generated scripts, Terraform, or user code),\nprefix `gcloud` with `CLOUDSDK_METRICS_REQUEST_ATTRIBUTION` and append the\nattribution suffix to `User-Agent` headers:\n\n```text\nCLOUDSDK_METRICS_REQUEST_ATTRIBUTION=\"agent-skills\u002F1.0 (skill:agent-platform-deploy)\"\nUser-Agent: \u003Cexisting_user_agent> agent-skills\u002F1.0 (skill:agent-platform-deploy)\n```\n\n## 1P Tuned Model Copy & Deployment\n\nIf you need to copy a **1P (First-Party) Tuned Model** from a source project to\na destination region or project and deploy it to a newly created endpoint, refer\nto the\n[1P Tuned Model Copy & Deployment Guide](references\u002Fcopy_deploy_guide.md).\n\n## Safety & Confirmation Tiers (CRITICAL)\n\nBefore executing any commands on behalf of the user, you MUST adhere to the\nfollowing safety tiers based on the action requested:\n\n1.  **Tier R: Read-only (`list`, `describe`, `list-deployment-config`)**\n    *   **Rule**: No confirmation needed. You may execute these commands\n        immediately to gather information for the user.\n2.  **Tier M: Mutating & Reversible (`deploy`, `undeploy-model`)**\n    *   **Rule**: This requires explicit user confirmation. You MUST present a\n        clear dry-run confirmation card containing:\n\n        1.  Exact proposed `gcloud` command code block (`gcloud ai model-garden\n            models deploy ... --asynchronous`).\n        2.  Model identifier, destination project ID, and target region.\n        3.  Machine type and accelerator configuration.\n        4.  Estimated hourly cost ($\u002Fhr).\n        5.  Endpoint display name.\n        6.  Explicit confirmation prompt asking the user to approve before\n            execution.\n        You MUST wait for their explicit confirmation before executing. For\n        `undeploy-model`, you MUST first verify that the endpoint and deployed\n        model exist; if `describe` or `list` returns a 404 or empty result, you\n        MUST halt and inform the user rather than attempting undeployment.\n    *   **Same-turn restriction**: Do not run the command in the same turn as\n        presenting the confirmation prompt. End your turn after asking and wait\n        for the user's reply; only execute after explicit approval. Printing a\n        preview and then calling the tool before the user can answer does not\n        count as obtaining confirmation.\n3.  **Tier D: Destructive & Irreversible (`delete`)**\n    *   **Rule**: This requires **explicit typed confirmation**. You MUST output\n        a text message explaining the irreversible nature of endpoint or model\n        deletion and asking the user to type \"I confirm\" or \"Yes, delete it\"\n        before executing the deletion command.\n\n> [!IMPORTANT]\n>\n> **Always Output Complete Text Response (NEVER Emit Empty Text)**: After\n> executing any tool call (such as `gcloud ai model-garden models deploy`,\n> `gcloud ai endpoints delete`, `gcloud ai endpoints list`, or status checks),\n> you MUST formulate and return a complete, informative textual response to the\n> user. Explicitly report the operation name, endpoint name\u002FID, error message,\n> or list of resources. **NEVER finish a turn with empty text or silence**.\n\n## 1. Prerequisites\n\nBefore deploying, ensure you have the correct project and region set. The\ncommands below use placeholder variables `PROJECT_ID` and `LOCATION_ID`.\n\nEnsure you are authenticated:\n\n```bash\ngcloud auth login\ngcloud auth application-default login\ngcloud config set project $PROJECT_ID\n```\n\n## 2. Discovering Deployable Models\n\nYou can list models available in Model Garden and check if they can be\nself-deployed.\n\n```bash\ngcloud ai model-garden models list\n```\n\nTo see what machine types and accelerators are supported for a specific model,\npass a `MODEL_ID` you obtained from the `models list` output above. Substitute\n`\u003CPUBLISHER>\u002F\u003CFAMILY>@\u003CVERSION-ID>` below with the exact string from the catalog\noutput — the placeholder is deliberately not a real model ID:\n\n```bash\ngcloud ai model-garden models list-deployment-config \\\n    --model=\"\u003CPUBLISHER>\u002F\u003CFAMILY>@\u003CVERSION-ID>\"\n```\n\n> [!NOTE] Some models, especially Hugging Face models, might require a Hugging\n> Face Access Token for deployment.\n\n> [!TIP] **Model Recommendation Instructions:** Whenever you are about to name a\n> specific model version in a response, do NOT recommend from memory. This\n> applies in all of the following situations — not just direct deploy requests:\n>\n> *   The user asks to deploy a model without naming one.\n> *   You are volunteering a next-step suggestion after a `list`, `describe`, or\n>     `undeploy` operation (e.g. \"Would you like me to deploy `\u003Cmodel>` to this\n>     endpoint?\").\n> *   The user asks a general \"what should I use?\" \u002F \"what's a good model for\n>     X?\" question.\n> *   You are filling in a `MODEL_ID` value in an example command you are\n>     showing the user (as opposed to a placeholder like\n>     `\u003CPUBLISHER>\u002F\u003CFAMILY>@\u003CVERSION-ID>`).\n>\n> New model versions ship frequently and older ones may be deprecated, so\n> training-corpus knowledge of which models exist is unreliable. Follow this\n> procedure:\n>\n> 1.  **Clarify the use case** if it isn't already clear from context (task\n>     type, quality vs. latency vs. cost priorities, hardware\u002Fquota constraints,\n>     license constraints). Skip if the user has already given enough signal.\n> 2.  **Query the live catalog** with `gcloud ai model-garden models list`.\n>     Narrow with `--filter` when appropriate (e.g. `--filter=\"name~gemma\"`,\n>     `--filter=\"name~llama\"`, `--filter=\"name~qwen\"`,\n>     `--filter=\"name~deepseek\"`). Never name a specific model version to the\n>     user until you have seen it in the catalog output for this project.\n> 3.  **Pick the latest generally-available version** in the family that fits\n>     the use case. When multiple size variants exist, pick the one that matches\n>     the user's hardware\u002Fcost tolerance. Prefer a newer major version over an\n>     older one unless it is marked preview\u002Fexperimental and the user explicitly\n>     asked for a stable option.\n> 4.  **Verify the exact model ID is deployable** with `gcloud ai model-garden\n>     models list-deployment-config --model=\"\u003Cpublisher>\u002F\u003Cfamily>@\u003Cversion>\"`\n>     before naming it in your response.\n> 5.  **Cite the model ID verbatim** in your recommendation, exactly as it\n>     appears in the catalog. Do not paraphrase to a family label (\"Gemma\",\n>     \"Llama\").\n>\n> The `MODEL_ID` values in the §3 examples below are intentionally\n> non-substantive placeholders (`\u003CPUBLISHER>\u002F\u003CFAMILY>@\u003CVERSION-ID>`). Do NOT\n> replace them with a remembered model name for a user-facing recommendation —\n> always re-run steps 2-4 first, then cite the exact string from the catalog.\n\n## 2.1 Region Availability Check (Gemini + LoRA only)\n\n> For first-party Gemini or LoRA deploys, you must verify region availability\n> before proceeding. Load the full instructions with\n> `load_skill_resource(skill_name='agent-platform-deploy',\n> file_path='references\u002Fregion_availability.md')`.\n>\n> **Skip this** for open-weights models (Gemma, Llama, DeepSeek, Qwen) and for\n> Gemini-tuned models — they have no per-region publisher endpoint restriction.\n> Go straight to §3.\n\n## 3. Deploying a Model\n\n> [!WARNING] Deploying models, especially large ones, consumes significant\n> compute resources and incurs costs.\n>\n> 1.  You **MUST** compute an hourly $ estimate for the requested\n>     `--machine-type` before proposing a deploy. Try each source below in\n>     order, falling through to the next on any failure:\n>\n>     -   Run `scripts\u002Fcalculate_cost.py`. The accelerator type and count are\n>         fixed per machine type in Model Garden and derived automatically.\n>         Example:\n>\n>         ```bash\n>         python3 scripts\u002Fcalculate_cost.py \\\n>             --machine-type=g2-standard-48\n>         ```\n>\n>         If the script exits non-zero (unknown `--machine-type` — a routine\n>         state for machines in the Model Garden catalog but not yet in the\n>         price snapshot, e.g. A4\u002FB200 today), fall through to the next source.\n>         Do NOT invent a number.\n>\n>     -   Fall back to\n>         [Agent Platform prediction pricing](https:\u002F\u002Fcloud.google.com\u002Fproducts\u002Fgemini-enterprise-agent-platform\u002Fpricing?hl=en#prediction-and-explanation)\n> if no source above produced a\n>         number. Read the accelerator + hourly rate directly off that page and\n>         cite the URL in the estimate you present to the user.\n>\n> 2.  You **MUST** present this cost estimation to the user and warn them that\n>     this is the **list price**, which may differ from their actual bill due to\n>     potential discounts, reservations, or non-`us-central1` regions.\n> 3.  You **MUST ALWAYS** request explicit confirmation from the user agreeing\n>     to the estimated cost before executing any `deploy` command.\n\nTo deploy a model, use the `deploy` command. It is highly recommended to use the\n`--asynchronous` flag for long-running deployments, and then poll the status if\nnecessary.\n\n> [!IMPORTANT]\n>\n> -   **Cost Pushback & Hardware Renegotiation**: If the user pushes back on\n>     cost (e.g., \"That is too expensive, can you try a smaller\n>     configuration?\"), or requests an invalid or unsupported hardware\n>     combination (e.g. `g2-standard-48g` with 4x H100 GPUs), explain the\n>     constraint or invalidity clearly, check `list-deployment-config` to\n>     identify the supported alternative (e.g., `g2-standard-24` with 2x L4 or\n>     `g2-standard-12` with 1x L4), compute its cost estimate with a single\n>     query, and **immediately render a complete Tier M dry-run confirmation\n>     card** for that recommended configuration in the same response.\n> -   **Region Failover & Quota Exhaustion**: When a deployment fails due to\n>     quota or capacity in the requested region (e.g. `QUOTA_EXCEEDED` or\n>     `RESOURCE_EXHAUSTED`), identify an alternative supported region (e.g.\n>     `us-east4` or `us-east1`), compute its cost estimate with a single query,\n>     and **immediately render a complete Tier M dry-run confirmation card with\n>     the new `--region` and exact command in the same response**. State the\n>     alternative region directly without making unverified capacity claims.\n> -   **Efficient Tool Execution (No Redundant Calls)**: Do NOT execute\n>     redundant `models list`, `list-deployment-config`, or `--help` commands if\n>     the model ID, region, or hardware configuration are already known or\n>     resolved. Run each discovery command strictly once.\n> -   **Single Status Check & Response Formatting (CRITICAL)**:\n>     -   When initiating an asynchronous deployment (`gcloud ai model-garden\n>         models deploy ... --asynchronous`), the command output immediately\n>         returns the operation name. **Formulate and return your textual\n>         confirmation response with the operation name and endpoint display\n>         name immediately**. Do NOT call `operations describe` in the same turn\n>         as deployment initiation.\n>     -   When the user explicitly asks to check deployment status (e.g.,\n>         \"Please check to see the status of the deployment\" or \"Can you check\n>         if the deployment has finished?\"):\n>         -   **NEVER run `sleep` commands, `while` loops, or repeated polling\n>             calls**.\n>         -   Execute `gcloud ai operations describe \u003COPERATION_NAME>`, the full\n>             operation name the deploy command printed, **strictly ONCE**.\n>         -   **ALWAYS output a full textual response** reporting the operation\n>             status (e.g. \"The deployment operation\n>             `projects\u002F...\u002Foperations\u002F...` is currently in progress \u002F running\n>             (created at `...`). Asynchronous model deployment typically takes\n>             10–15 minutes to complete\").\n>         -   Only proceed with sending a test prediction if the status check\n>             confirms the endpoint is already serving and ready.\n> -   **Alphanumeric Project ID**: Always specify the alphanumeric Project ID\n>     (e.g. `my-gcp-project`) for `--project`, NOT the numeric project number\n>     (e.g. `123456789012`). If given a numeric project number and its Project\n>     ID is not available, pass the number inside a fully-qualified resource\n>     name, e.g. `gcloud ai endpoints list\n>     --region=projects\u002F123456789012\u002Flocations\u002Fus-central1`, or as a positional\n>     resource, `gcloud ai endpoints describe\n>     projects\u002F123456789012\u002Flocations\u002Fus-central1\u002Fendpoints\u002F\u003CENDPOINT_ID>\n>     --region=us-central1`. If `gcloud ai` still refuses because `core\u002Fproject`\n>     is set to a project number, ask the user for the Project ID rather than\n>     retrying.\n> -   **Valid User-Specified Hardware Priority**: When the user specifies an\n>     explicit, valid hardware configuration (e.g. `g2-standard-96` with 8\n>     `NVIDIA_L4` GPUs, or `g2-standard-12` with 1 `NVIDIA_L4` GPU), honor that\n>     requested configuration for the dry-run preview and cost estimation rather\n>     than overriding it with default recommendations. However, if the requested\n>     configuration is **invalid or unsupported** (e.g. mismatched GPU count\n>     such as `g2-standard-12` with 2 L4 GPUs, or non-existent machine shapes),\n>     follow the **Cost Pushback & Hardware Renegotiation** rule above: explain\n>     the invalidity clearly, identify the supported alternative (e.g.\n>     `g2-standard-24` with 2 L4 GPUs), calculate its cost, and immediately\n>     present the confirmation card for the valid alternative.\n> -   **Endpoint Display Name**: If the user specifies or requests an endpoint\n>     name or display name (e.g. `'usersim-gemma-eval-...'`), you MUST always\n>     include `--endpoint-display-name=\"\u003CNAME>\"` in the `deploy` command.\n\n### Example: Deploying an open-weights model from Model Garden\n\nHere is a typical bash script to deploy a model. You can run this block\ndirectly.\n\n```bash\n#!\u002Fbin\u002Fbash\n# Example script to deploy an open-weights model from Model Garden.\n#\n# NOTE: MODEL_ID below is a PLACEHOLDER, not a real model ID. Substitute it\n# with a value from a live `gcloud ai model-garden models list` (see §2)\n# before running this script, and do NOT quote the placeholder back to the\n# user as a recommended model.\n#\n# IMPORTANT FOR deploy_config[\"command\"]: when building the curl command for\n# the deploy confirmation card, inline ALL values as literals — do NOT leave\n# ${PROJECT_ID}, ${LOCATION_ID}, or ${PUBLISHER_MODEL} as shell variables.\n# The server rejects commands with unresolved variables at render time.\n# The only allowed substitution is $(gcloud auth print-access-token).\n\nPROJECT_ID=$(gcloud config get-value project)\n# `gcloud ai` needs the alphanumeric Project ID, not the project number.\n: \"${PROJECT_ID:?no project ID is set; ask the user for the Project ID}\"\nLOCATION_ID=\"us-central1\" # Recommended default region\n# Replace placeholder with exact ID from `gcloud ai model-garden models list`:\nMODEL_ID=\"\u003CPUBLISHER>\u002F\u003CFAMILY>@\u003CVERSION-ID>\"\n\necho \"Deploying model $MODEL_ID to project $PROJECT_ID in $LOCATION_ID...\"\n\n# Hardware params can be omitted to select recommended default config.\n# Comprehensive command with supported parameters:\ngcloud ai model-garden models deploy \\\n    --project=$PROJECT_ID \\\n    --region=$LOCATION_ID \\\n    --model=$MODEL_ID \\\n    --machine-type=\"g2-standard-12\" \\\n    --accelerator-type=\"NVIDIA_L4\" \\\n    --accelerator-count=1 \\\n    --endpoint-display-name=\"my-open-model-deployment\" \\\n    --asynchronous\n\necho \"Deployment initiated asynchronously.\"\n```\n\nWith `--asynchronous` the command prints the full operation name,\n`projects\u002F\u003CPROJECT>\u002Flocations\u002F\u003CREGION>\u002Foperations\u002F\u003COP_ID>`. Pass that to §4: a\nbare `\u003COP_ID>` works only when gcloud has a project.\n\n-   Include `--hugging-face-access-token=\"\u003CHF_TOKEN>\"` when deploying gated\n    Hugging Face models that require authentication.\n-   Include `--reservation-affinity` (e.g. `none` or\n    `reservation-affinity-type=specific-reservation,...`) if using reserved\n    compute.\n\n### 1P Tuned Model Cross-Region Copy and Deployment\n\n> For the detailed tuned model copy and deployment workflow, load\n> `load_skill_resource(skill_name='agent-platform-deploy',\n> file_path='references\u002Fcopy_deploy_guide.md')`. That guide covers the execution\n> sequence, tier assignments for copy\u002Fdeploy\u002Fdelete commands, hardware\n> renegotiation, test prediction verification, and the in-progress operation\n> lock.\n\n## 4. Checking Deployment Status\n\nWhen you deploy a model asynchronously using the `--asynchronous` flag, the\n`deploy` command returns an operation name. Pass the full name to check the\nongoing status of the deployment.\n\n```bash\ngcloud ai operations describe YOUR_OPERATION_NAME\n```\n\n> [!IMPORTANT]\n>\n> **Single Status Check Only (No Sleep \u002F Polling Loops)**: Model deployment\n> operations take 10–30 minutes. NEVER run `sleep` commands (e.g. `sleep 45 &&\n> ...`) or loop `operations describe` repeatedly in a turn. Run `gcloud ai\n> operations describe` **strictly ONCE**. If `done` is not true, immediately\n> return the operation name and in-progress status to the user and explain that\n> deployment takes 10–15 minutes.\n\nNote: Large models (roughly 20B+ parameters) may take 15-20 minutes to fully\ndeploy and start serving.\n\n### Verifying Deployment\n\nIf the model is successfully deployed, verify by making a prediction call to\ntest. Because Model Garden models are often deployed to Dedicated Endpoints, you\nshouldn't use `gcloud ai endpoints predict`. Instead, you must fetch the\nendpoint's dedicated DNS name and send a `curl` request.\n\n> [!TIP] Ask the user to try using their own prompt to see the results.\n> Otherwise use the default.\n\nUse the following script:\n\n```bash\n#!\u002Fbin\u002Fbash\nPROJECT_ID=$(gcloud config get-value project)\n: \"${PROJECT_ID:?no gcloud project is set; ask the user for the Project ID}\"\nLOCATION_ID=\"us-central1\"\nENDPOINT_ID=\"YOUR_ENDPOINT_ID\"\nPROMPT=${1:-\"Explain quantum computing in simple terms.\"}\n\necho \"Fetching dedicated Endpoint DNS...\"\nENDPOINT_URL=$(gcloud ai endpoints describe $ENDPOINT_ID \\\n    --project=$PROJECT_ID \\\n    --region=$LOCATION_ID \\\n    --format=\"value(dedicatedEndpointDns)\")\n\nif [ -z \"$ENDPOINT_URL\" ]; then\n    echo \"Error: Could not retrieve dedicated endpoint URL for $ENDPOINT_ID.\"\n    exit 1\nfi\n\necho \"Sending prediction request to $ENDPOINT_URL...\"\n\ncurl -X POST \\\n  -H \"Authorization: Bearer $(gcloud auth print-access-token)\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  \"https:\u002F\u002F${ENDPOINT_URL}\u002Fv1beta1\u002Fprojects\u002F${PROJECT_ID}\u002Flocations\u002F${LOCATION_ID}\u002Fendpoints\u002F${ENDPOINT_ID}\u002Fchat\u002Fcompletions\" \\\n  -d '{\n    \"model\": \"'\"$ENDPOINT_ID\"'\",\n    \"messages\": [\n      {\n        \"role\": \"user\",\n        \"content\": \"'\"$PROMPT\"'\"\n      }\n    ]\n  }'\n\n```\n\n## 5. Undeploying and Cleaning Up\n\n> For the full undeploy and cleanup procedure (find endpoint, undeploy model,\n> delete endpoint, delete model), load\n> `load_skill_resource(skill_name='agent-platform-deploy',\n> file_path='references\u002Fundeploy_guide.md')`.\n\n> [!WARNING] Failing to undeploy a model will result in continuous charges for\n> the allocated compute resources, even if you are not sending prediction\n> requests. Always clean up after testing.\n\n## 6. Troubleshooting\n\n> For troubleshooting quota\u002Fresource exhausted errors and hardware fallback,\n> load `load_skill_resource(skill_name='agent-platform-deploy',\n> file_path='references\u002Ftroubleshooting.md')`.\n","# Agent Platform Model Garden Deploy Skill\n\nThis skill provides instructions for deploying Open Models from Agent Platform\nModel Garden to endpoints, and subsequently undeploying them to clean up\nresources.\n\n## Attribution\n\n**MUST READ**: Before executing any `gcloud`, REST API, or MCP command, you MUST\nread [Usage Attribution](references\u002Fattribution.md). For commands executed\ndirectly in the terminal (never in generated scripts, Terraform, or user code),\nprefix `gcloud` with `CLOUDSDK_METRICS_REQUEST_ATTRIBUTION` and append the\nattribution suffix to `User-Agent` headers:\n\n```text\nCLOUDSDK_METRICS_REQUEST_ATTRIBUTION=\"agent-skills\u002F1.0 (skill:agent-platform-deploy)\"\nUser-Agent: \u003Cexisting_user_agent> agent-skills\u002F1.0 (skill:agent-platform-deploy)\n```\n\n## 1P Tuned Model Copy & Deployment\n\nIf you need to copy a **1P (First-Party) Tuned Model** from a source project to\na destination region or project and deploy it to a newly created endpoint, refer\nto the\n[1P Tuned Model Copy & Deployment Guide](references\u002Fcopy_deploy_guide.md).\n\n## Safety & Confirmation Tiers (CRITICAL)\n\nBefore executing any commands on behalf of the user, you MUST adhere to the\nfollowing safety tiers based on the action requested:\n\n1.  **Tier R: Read-only (`list`, `describe`, `list-deployment-config`)**\n    *   **Rule**: No confirmation needed. You may execute these commands\n        immediately to gather information for the user.\n2.  **Tier M: Mutating & Reversible (`deploy`, `undeploy-model`)**\n    *   **Rule**: This requires explicit user confirmation. You MUST present a\n        clear dry-run confirmation card containing:\n\n        1.  Exact proposed `gcloud` command code block (`gcloud ai model-garden\n            models deploy ... --asynchronous`).\n        2.  Model identifier, destination project ID, and target region.\n        3.  Machine type and accelerator configuration.\n        4.  Estimated hourly cost ($\u002Fhr).\n        5.  Endpoint display name.\n        6.  Explicit confirmation prompt asking the user to approve before\n            execution.\n        You MUST wait for their explicit confirmation before executing. For\n        `undeploy-model`, you MUST first verify that the endpoint and deployed\n        model exist; if `describe` or `list` returns a 404 or empty result, you\n        MUST halt and inform the user rather than attempting undeployment.\n    *   **Same-turn restriction**: Do not run the command in the same turn as\n        presenting the confirmation prompt. End your turn after asking and wait\n        for the user's reply; only execute after explicit approval. Printing a\n        preview and then calling the tool before the user can answer does not\n        count as obtaining confirmation.\n3.  **Tier D: Destructive & Irreversible (`delete`)**\n    *   **Rule**: This requires **explicit typed confirmation**. You MUST output\n        a text message explaining the irreversible nature of endpoint or model\n        deletion and asking the user to type \"I confirm\" or \"Yes, delete it\"\n        before executing the deletion command.\n\n> [!IMPORTANT]\n>\n> **Always Output Complete Text Response (NEVER Emit Empty Text)**: After\n> executing any tool call (such as `gcloud ai model-garden models deploy`,\n> `gcloud ai endpoints delete`, `gcloud ai endpoints list`, or status checks),\n> you MUST formulate and return a complete, informative textual response to the\n> user. Explicitly report the operation name, endpoint name\u002FID, error message,\n> or list of resources. **NEVER finish a turn with empty text or silence**.\n\n## 1. Prerequisites\n\nBefore deploying, ensure you have the correct project and region set. The\ncommands below use placeholder variables `PROJECT_ID` and `LOCATION_ID`.\n\nEnsure you are authenticated:\n\n```bash\ngcloud auth login\ngcloud auth application-default login\ngcloud config set project $PROJECT_ID\n```\n\n## 2. Discovering Deployable Models\n\nYou can list models available in Model Garden and check if they can be\nself-deployed.\n\n```bash\ngcloud ai model-garden models list\n```\n\nTo see what machine types and accelerators are supported for a specific model,\npass a `MODEL_ID` you obtained from the `models list` output above. Substitute\n`\u003CPUBLISHER>\u002F\u003CFAMILY>@\u003CVERSION-ID>` below with the exact string from the catalog\noutput — the placeholder is deliberately not a real model ID:\n\n```bash\ngcloud ai model-garden models list-deployment-config \\\n    --model=\"\u003CPUBLISHER>\u002F\u003CFAMILY>@\u003CVERSION-ID>\"\n```\n\n> [!NOTE] Some models, especially Hugging Face models, might require a Hugging\n> Face Access Token for deployment.\n\n> [!TIP] **Model Recommendation Instructions:** Whenever you are about to name a\n> specific model version in a response, do NOT recommend from memory. This\n> applies in all of the following situations — not just direct deploy requests:\n>\n> *   The user asks to deploy a model without naming one.\n> *   You are volunteering a next-step suggestion after a `list`, `describe`, or\n>     `undeploy` operation (e.g. \"Would you like me to deploy `\u003Cmodel>` to this\n>     endpoint?\").\n> *   The user asks a general \"what should I use?\" \u002F \"what's a good model for\n>     X?\" question.\n> *   You are filling in a `MODEL_ID` value in an example command you are\n>     showing the user (as opposed to a placeholder like\n>     `\u003CPUBLISHER>\u002F\u003CFAMILY>@\u003CVERSION-ID>`).\n>\n> New model versions ship frequently and older ones may be deprecated, so\n> training-corpus knowledge of which models exist is unreliable. Follow this\n> procedure:\n>\n> 1.  **Clarify the use case** if it isn't already clear from context (task\n>     type, quality vs. latency vs. cost priorities, hardware\u002Fquota constraints,\n>     license constraints). Skip if the user has already given enough signal.\n> 2.  **Query the live catalog** with `gcloud ai model-garden models list`.\n>     Narrow with `--filter` when appropriate (e.g. `--filter=\"name~gemma\"`,\n>     `--filter=\"name~llama\"`, `--filter=\"name~qwen\"`,\n>     `--filter=\"name~deepseek\"`). Never name a specific model version to the\n>     user until you have seen it in the catalog output for this project.\n> 3.  **Pick the latest generally-available version** in the family that fits\n>     the use case. When multiple size variants exist, pick the one that matches\n>     the user's hardware\u002Fcost tolerance. Prefer a newer major version over an\n>     older one unless it is marked preview\u002Fexperimental and the user explicitly\n>     asked for a stable option.\n> 4.  **Verify the exact model ID is deployable** with `gcloud ai model-garden\n>     models list-deployment-config --model=\"\u003Cpublisher>\u002F\u003Cfamily>@\u003Cversion>\"`\n>     before naming it in your response.\n> 5.  **Cite the model ID verbatim** in your recommendation, exactly as it\n>     appears in the catalog. Do not paraphrase to a family label (\"Gemma\",\n>     \"Llama\").\n>\n> The `MODEL_ID` values in the §3 examples below are intentionally\n> non-substantive placeholders (`\u003CPUBLISHER>\u002F\u003CFAMILY>@\u003CVERSION-ID>`). Do NOT\n> replace them with a remembered model name for a user-facing recommendation —\n> always re-run steps 2-4 first, then cite the exact string from the catalog.\n\n## 2.1 Region Availability Check (Gemini + LoRA only)\n\n> For first-party Gemini or LoRA deploys, you must verify region availability\n> before proceeding. Load the full instructions with\n> `load_skill_resource(skill_name='agent-platform-deploy',\n> file_path='references\u002Fregion_availability.md')`.\n>\n> **Skip this** for open-weights models (Gemma, Llama, DeepSeek, Qwen) and for\n> Gemini-tuned models — they have no per-region publisher endpoint restriction.\n> Go straight to §3.\n\n## 3. Deploying a Model\n\n> [!WARNING] Deploying models, especially large ones, consumes significant\n> compute resources and incurs costs.\n>\n> 1.  You **MUST** compute an hourly $ estimate for the requested\n>     `--machine-type` before proposing a deploy. Try each source below in\n>     order, falling through to the next on any failure:\n>\n>     -   Run `scripts\u002Fcalculate_cost.py`. The accelerator type and count are\n>         fixed per machine type in Model Garden and derived automatically.\n>         Example:\n>\n>         ```bash\n>         python3 scripts\u002Fcalculate_cost.py \\\n>             --machine-type=g2-standard-48\n>         ```\n>\n>         If the script exits non-zero (unknown `--machine-type` — a routine\n>         state for machines in the Model Garden catalog but not yet in the\n>         price snapshot, e.g. A4\u002FB200 today), fall through to the next source.\n>         Do NOT invent a number.\n>\n>     -   Fall back to\n>         [Agent Platform prediction pricing](https:\u002F\u002Fcloud.google.com\u002Fproducts\u002Fgemini-enterprise-agent-platform\u002Fpricing?hl=en#prediction-and-explanation)\n> if no source above produced a\n>         number. Read the accelerator + hourly rate directly off that page and\n>         cite the URL in the estimate you present to the user.\n>\n> 2.  You **MUST** present this cost estimation to the user and warn them that\n>     this is the **list price**, which may differ from their actual bill due to\n>     potential discounts, reservations, or non-`us-central1` regions.\n> 3.  You **MUST ALWAYS** request explicit confirmation from the user agreeing\n>     to the estimated cost before executing any `deploy` command.\n\nTo deploy a model, use the `deploy` command. It is highly recommended to use the\n`--asynchronous` flag for long-running deployments, and then poll the status if\nnecessary.\n\n> [!IMPORTANT]\n>\n> -   **Cost Pushback & Hardware Renegotiation**: If the user pushes back on\n>     cost (e.g., \"That is too expensive, can you try a smaller\n>     configuration?\"), or requests an invalid or unsupported hardware\n>     combination (e.g. `g2-standard-48g` with 4x H100 GPUs), explain the\n>     constraint or invalidity clearly, check `list-deployment-config` to\n>     identify the supported alternative (e.g., `g2-standard-24` with 2x L4 or\n>     `g2-standard-12` with 1x L4), compute its cost estimate with a single\n>     query, and **immediately render a complete Tier M dry-run confirmation\n>     card** for that recommended configuration in the same response.\n> -   **Region Failover & Quota Exhaustion**: When a deployment fails due to\n>     quota or capacity in the requested region (e.g. `QUOTA_EXCEEDED` or\n>     `RESOURCE_EXHAUSTED`), identify an alternative supported region (e.g.\n>     `us-east4` or `us-east1`), compute its cost estimate with a single query,\n>     and **immediately render a complete Tier M dry-run confirmation card with\n>     the new `--region` and exact command in the same response**. State the\n>     alternative region directly without making unverified capacity claims.\n> -   **Efficient Tool Execution (No Redundant Calls)**: Do NOT execute\n>     redundant `models list`, `list-deployment-config`, or `--help` commands if\n>     the model ID, region, or hardware configuration are already known or\n>     resolved. Run each discovery command strictly once.\n> -   **Single Status Check & Response Formatting (CRITICAL)**:\n>     -   When initiating an asynchronous deployment (`gcloud ai model-garden\n>         models deploy ... --asynchronous`), the command output immediately\n>         returns the operation name. **Formulate and return your textual\n>         confirmation response with the operation name and endpoint display\n>         name immediately**. Do NOT call `operations describe` in the same turn\n>         as deployment initiation.\n>     -   When the user explicitly asks to check deployment status (e.g.,\n>         \"Please check to see the status of the deployment\" or \"Can you check\n>         if the deployment has finished?\"):\n>         -   **NEVER run `sleep` commands, `while` loops, or repeated polling\n>             calls**.\n>         -   Execute `gcloud ai operations describe \u003COPERATION_NAME>`, the full\n>             operation name the deploy command printed, **strictly ONCE**.\n>         -   **ALWAYS output a full textual response** reporting the operation\n>             status (e.g. \"The deployment operation\n>             `projects\u002F...\u002Foperations\u002F...` is currently in progress \u002F running\n>             (created at `...`). Asynchronous model deployment typically takes\n>             10–15 minutes to complete\").\n>         -   Only proceed with sending a test prediction if the status check\n>             confirms the endpoint is already serving and ready.\n> -   **Alphanumeric Project ID**: Always specify the alphanumeric Project ID\n>     (e.g. `my-gcp-project`) for `--project`, NOT the numeric project number\n>     (e.g. `123456789012`). If given a numeric project number and its Project\n>     ID is not available, pass the number inside a fully-qualified resource\n>     name, e.g. `gcloud ai endpoints list\n>     --region=projects\u002F123456789012\u002Flocations\u002Fus-central1`, or as a positional\n>     resource, `gcloud ai endpoints describe\n>     projects\u002F123456789012\u002Flocations\u002Fus-central1\u002Fendpoints\u002F\u003CENDPOINT_ID>\n>     --region=us-central1`. If `gcloud ai` still refuses because `core\u002Fproject`\n>     is set to a project number, ask the user for the Project ID rather than\n>     retrying.\n> -   **Valid User-Specified Hardware Priority**: When the user specifies an\n>     explicit, valid hardware configuration (e.g. `g2-standard-96` with 8\n>     `NVIDIA_L4` GPUs, or `g2-standard-12` with 1 `NVIDIA_L4` GPU), honor that\n>     requested configuration for the dry-run preview and cost estimation rather\n>     than overriding it with default recommendations. However, if the requested\n>     configuration is **invalid or unsupported** (e.g. mismatched GPU count\n>     such as `g2-standard-12` with 2 L4 GPUs, or non-existent machine shapes),\n>     follow the **Cost Pushback & Hardware Renegotiation** rule above: explain\n>     the invalidity clearly, identify the supported alternative (e.g.\n>     `g2-standard-24` with 2 L4 GPUs), calculate its cost, and immediately\n>     present the confirmation card for the valid alternative.\n> -   **Endpoint Display Name**: If the user specifies or requests an endpoint\n>     name or display name (e.g. `'usersim-gemma-eval-...'`), you MUST always\n>     include `--endpoint-display-name=\"\u003CNAME>\"` in the `deploy` command.\n\n### Example: Deploying an open-weights model from Model Garden\n\nHere is a typical bash script to deploy a model. You can run this block\ndirectly.\n\n```bash\n#!\u002Fbin\u002Fbash\n# Example script to deploy an open-weights model from Model Garden.\n#\n# NOTE: MODEL_ID below is a PLACEHOLDER, not a real model ID. Substitute it\n# with a value from a live `gcloud ai model-garden models list` (see §2)\n# before running this script, and do NOT quote the placeholder back to the\n# user as a recommended model.\n#\n# IMPORTANT FOR deploy_config[\"command\"]: when building the curl command for\n# the deploy confirmation card, inline ALL values as literals — do NOT leave\n# ${PROJECT_ID}, ${LOCATION_ID}, or ${PUBLISHER_MODEL} as shell variables.\n# The server rejects commands with unresolved variables at render time.\n# The only allowed substitution is $(gcloud auth print-access-token).\n\nPROJECT_ID=$(gcloud config get-value project)\n# `gcloud ai` needs the alphanumeric Project ID, not the project number.\n: \"${PROJECT_ID:?no project ID is set; ask the user for the Project ID}\"\nLOCATION_ID=\"us-central1\" # Recommended default region\n# Replace placeholder with exact ID from `gcloud ai model-garden models list`:\nMODEL_ID=\"\u003CPUBLISHER>\u002F\u003CFAMILY>@\u003CVERSION-ID>\"\n\necho \"Deploying model $MODEL_ID to project $PROJECT_ID in $LOCATION_ID...\"\n\n# Hardware params can be omitted to select recommended default config.\n# Comprehensive command with supported parameters:\ngcloud ai model-garden models deploy \\\n    --project=$PROJECT_ID \\\n    --region=$LOCATION_ID \\\n    --model=$MODEL_ID \\\n    --machine-type=\"g2-standard-12\" \\\n    --accelerator-type=\"NVIDIA_L4\" \\\n    --accelerator-count=1 \\\n    --endpoint-display-name=\"my-open-model-deployment\" \\\n    --asynchronous\n\necho \"Deployment initiated asynchronously.\"\n```\n\nWith `--asynchronous` the command prints the full operation name,\n`projects\u002F\u003CPROJECT>\u002Flocations\u002F\u003CREGION>\u002Foperations\u002F\u003COP_ID>`. Pass that to §4: a\nbare `\u003COP_ID>` works only when gcloud has a project.\n\n-   Include `--hugging-face-access-token=\"\u003CHF_TOKEN>\"` when deploying gated\n    Hugging Face models that require authentication.\n-   Include `--reservation-affinity` (e.g. `none` or\n    `reservation-affinity-type=specific-reservation,...`) if using reserved\n    compute.\n\n### 1P Tuned Model Cross-Region Copy and Deployment\n\n> For the detailed tuned model copy and deployment workflow, load\n> `load_skill_resource(skill_name='agent-platform-deploy',\n> file_path='references\u002Fcopy_deploy_guide.md')`. That guide covers the execution\n> sequence, tier assignments for copy\u002Fdeploy\u002Fdelete commands, hardware\n> renegotiation, test prediction verification, and the in-progress operation\n> lock.\n\n## 4. Checking Deployment Status\n\nWhen you deploy a model asynchronously using the `--asynchronous` flag, the\n`deploy` command returns an operation name. Pass the full name to check the\nongoing status of the deployment.\n\n```bash\ngcloud ai operations describe YOUR_OPERATION_NAME\n```\n\n> [!IMPORTANT]\n>\n> **Single Status Check Only (No Sleep \u002F Polling Loops)**: Model deployment\n> operations take 10–30 minutes. NEVER run `sleep` commands (e.g. `sleep 45 &&\n> ...`) or loop `operations describe` repeatedly in a turn. Run `gcloud ai\n> operations describe` **strictly ONCE**. If `done` is not true, immediately\n> return the operation name and in-progress status to the user and explain that\n> deployment takes 10–15 minutes.\n\nNote: Large models (roughly 20B+ parameters) may take 15-20 minutes to fully\ndeploy and start serving.\n\n### Verifying Deployment\n\nIf the model is successfully deployed, verify by making a prediction call to\ntest. Because Model Garden models are often deployed to Dedicated Endpoints, you\nshouldn't use `gcloud ai endpoints predict`. Instead, you must fetch the\nendpoint's dedicated DNS name and send a `curl` request.\n\n> [!TIP] Ask the user to try using their own prompt to see the results.\n> Otherwise use the default.\n\nUse the following script:\n\n```bash\n#!\u002Fbin\u002Fbash\nPROJECT_ID=$(gcloud config get-value project)\n: \"${PROJECT_ID:?no gcloud project is set; ask the user for the Project ID}\"\nLOCATION_ID=\"us-central1\"\nENDPOINT_ID=\"YOUR_ENDPOINT_ID\"\nPROMPT=${1:-\"Explain quantum computing in simple terms.\"}\n\necho \"Fetching dedicated Endpoint DNS...\"\nENDPOINT_URL=$(gcloud ai endpoints describe $ENDPOINT_ID \\\n    --project=$PROJECT_ID \\\n    --region=$LOCATION_ID \\\n    --format=\"value(dedicatedEndpointDns)\")\n\nif [ -z \"$ENDPOINT_URL\" ]; then\n    echo \"Error: Could not retrieve dedicated endpoint URL for $ENDPOINT_ID.\"\n    exit 1\nfi\n\necho \"Sending prediction request to $ENDPOINT_URL...\"\n\ncurl -X POST \\\n  -H \"Authorization: Bearer $(gcloud auth print-access-token)\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  \"https:\u002F\u002F${ENDPOINT_URL}\u002Fv1beta1\u002Fprojects\u002F${PROJECT_ID}\u002Flocations\u002F${LOCATION_ID}\u002Fendpoints\u002F${ENDPOINT_ID}\u002Fchat\u002Fcompletions\" \\\n  -d '{\n    \"model\": \"'\"$ENDPOINT_ID\"'\",\n    \"messages\": [\n      {\n        \"role\": \"user\",\n        \"content\": \"'\"$PROMPT\"'\"\n      }\n    ]\n  }'\n\n```\n\n## 5. Undeploying and Cleaning Up\n\n> For the full undeploy and cleanup procedure (find endpoint, undeploy model,\n> delete endpoint, delete model), load\n> `load_skill_resource(skill_name='agent-platform-deploy',\n> file_path='references\u002Fundeploy_guide.md')`.\n\n> [!WARNING] Failing to undeploy a model will result in continuous charges for\n> the allocated compute resources, even if you are not sending prediction\n> requests. Always clean up after testing.\n\n## 6. Troubleshooting\n\n> For troubleshooting quota\u002Fresource exhausted errors and hardware fallback,\n> load `load_skill_resource(skill_name='agent-platform-deploy',\n> file_path='references\u002Ftroubleshooting.md')`.\n",{"name":5,"metadata":56,"description":7},{"version":57,"category":58},"1.0.5","AiAndMachineLearning","main","071c4f7eba880767a647ce778650db8dbf7e16fc","skills\u002Fcloud\u002Fagent-platform-deploy",2005,"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills","https:\u002F\u002Fgithub.com\u002Fgoogle","https:\u002F\u002Fopensource.google\u002F","Google ❤️ Open Source","2026-11-14 01:51:35",{"source":8,"skillName":5,"commands":69,"prompt":79,"zipAvailable":80},[70,73,76],{"tool":71,"command":72},"npx","npx skills add google\u002Fskills --skill agent-platform-deploy",{"tool":74,"command":75},"bunx","bunx skills add google\u002Fskills --skill agent-platform-deploy",{"tool":77,"command":78},"pnpm","pnpm dlx skills add google\u002Fskills --skill agent-platform-deploy","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcloud\u002Fagent-platform-deploy\u002FSKILL.md",true,[82,88,92,96,100,104,108,114],{"path":83,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":86,"sourceHtmlUrl":87},"references\u002Fattribution.md","REFERENCE","参考文档",1937,"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcloud\u002Fagent-platform-deploy\u002Freferences\u002Fattribution.md",{"path":89,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":90,"sourceHtmlUrl":91},"references\u002Fcopy_deploy_guide.md",11246,"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcloud\u002Fagent-platform-deploy\u002Freferences\u002Fcopy_deploy_guide.md",{"path":93,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":94,"sourceHtmlUrl":95},"references\u002Fregion_availability.md",3625,"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcloud\u002Fagent-platform-deploy\u002Freferences\u002Fregion_availability.md",{"path":97,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":98,"sourceHtmlUrl":99},"references\u002Ftroubleshooting.md",1013,"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcloud\u002Fagent-platform-deploy\u002Freferences\u002Ftroubleshooting.md",{"path":101,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":102,"sourceHtmlUrl":103},"references\u002Fundeploy_guide.md",2179,"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcloud\u002Fagent-platform-deploy\u002Freferences\u002Fundeploy_guide.md",{"path":105,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":106,"sourceHtmlUrl":107},"references\u002Fusage.md",367,"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcloud\u002Fagent-platform-deploy\u002Freferences\u002Fusage.md",{"path":109,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":112,"sourceHtmlUrl":113},"scripts\u002Fcalculate_cost.py","SCRIPT","脚本",6664,"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcloud\u002Fagent-platform-deploy\u002Fscripts\u002Fcalculate_cost.py",{"path":115,"resourceType":110,"resourceTypeDesc":111,"sizeBytes":116,"sourceHtmlUrl":117},"scripts\u002Fconfig_gcloud_cli.sh",1296,"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcloud\u002Fagent-platform-deploy\u002Fscripts\u002Fconfig_gcloud_cli.sh",[119,155,183,211,238,261],{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":131,"publishedAt":51},"01M6998S2EZKD3GEJ7F943RZTE","sign-in-with-google-web","Implement, configure, and secure Sign In With Google (SiwG) using Google Identity Services (GIS \u002F `https:\u002F\u002Faccounts.google.com\u002Fgsi\u002Fclient`) across web architectures. Use when creating Google sign-in buttons, implementing Google One Tap with FedCM, integrating GIS in React\u002FNext.js\u002FAngular\u002FHTML, verifying ID tokens on backend runtimes (Python\u002FNode.js\u002FGo\u002FJava), enforcing Google Workspace domain restrictions (`hd`), securing client-side ID tokens via WebCrypto nonces or encrypted IndexedDB, embedding in cross-origin iframes via the Intermediate Iframe API (`https:\u002F\u002Faccounts.google.com\u002Fgsi\u002Fintermediate`), configuring Content Security Policy (CSP), COOP, and Permissions Policy (`identity-credentials-get`) headers, or handling sign-out and revocation. Don't use for legacy Google Sign-In (`gapi.auth2`), Google Cloud IAM service accounts, or Android\u002FiOS native Credential Manager.","https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fidentity\u002Fsign-in-with-google-web\u002FSKILL.md",[125,128],{"categoryNo":126,"categoryName":127,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":129,"categoryName":130,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",[9,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154],"sign in with google web","sign","with","web","android","go","security","google workspace","google cloud","implement","policy","python","implementing","react","iam","permissions","buttons","secure","manager","identity","architectures","domain","runtimes",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":168,"publishedAt":51},"01M6998PHPDCAD684VW5WRG83D","dpop-adoption","Implement and debug OAuth 2.0 DPoP (RFC 9449) refresh token sender-constraining for WebCrypto, Node.js ES6, and browser runtimes integrating with Google's OAuth platform. Use when configuring non-extractable asymmetric key pairs (P-256), generating DPoP Proof JWTs for authorization code exchange and token refresh, or handling 400 use_dpop_nonce challenge retry loops at oauth2.googleapis.com\u002Ftoken. Don't use for unconstrained OAuth 2.0 flows (where refresh tokens are not bound to a client key pair), or for Google Cloud IAM \u002F service account authentication.","https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fidentity\u002Fdpop-adoption\u002FSKILL.md",[161,162,163],{"categoryNo":129,"categoryName":130,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":164,"categoryName":165,"taxonomyType":166,"taxonomyTypeDesc":167},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[169,170,9,140,171,172,173,174,175,176,146,177,178,179,180,181,182,151,154,27,33],"dpop adoption","adoption","es6","retry","authentication","flows","challenge","code","browser","loops","at","node","token","pair",{"skillNo":184,"name":185,"nameZh":6,"description":186,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":187,"categories":188,"keywords":195,"publishedAt":51},"01M6998M72TC73EEAQH4XC7EXW","retrieving-developer-knowledge","Searches, retrieves, and synthesizes official Google developer documentation across Google Cloud, AI\u002FGemini, Android, Chrome, Web, Flutter, Go, Firebase, and other Google developer platforms. Integrates with the Developer Knowledge MCP server (search_documents, get_documents, answer_query) or the Developer Knowledge REST API fallback. Use when searching for gcloud CLI commands, API syntax, IAM permissions, official documentation, architectural comparisons, or product choice overviews. Don't use for local filesystem lookups or non-Google documentation.","https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdevelopers\u002Fretrieving-developer-knowledge\u002FSKILL.md",[189,190,193,194],{"categoryNo":129,"categoryName":130,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":191,"categoryName":192,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000021","资料检索与研究",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":164,"categoryName":165,"taxonomyType":166,"taxonomyTypeDesc":167},[196,197,198,199,140,200,201,202,203,204,205,206,207,33,42,208,209,146,210,147],"retrieving developer knowledge","knowledge","developer","MCP","mcp server","official","developer documentation","get","search","local","choice","documents","api","across","documentation",{"skillNo":212,"name":213,"nameZh":6,"description":214,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":215,"categories":216,"keywords":217,"publishedAt":51},"01M6998J2CZEXS9BES9S3WWFKC","migrate-to-rust","Clones, analyzes, plans, and migrates legacy codebases (C++, Fortran, Java, Python, C, Shell) from a GitHub URL or local directory to a modern, high-performance, deterministic, 100% Safe Rust architecture, tracking live telemetry across every task bucket, test failure\u002Ffix cycle, and Profile-Guided Optimization (PGO) stage, and producing a first-person AI storytelling report and interactive HTML infographic. Use when migrating a GitHub repository or local codebase to Rust, porting legacy C++, Fortran, Python, or Java workloads to memory-safe Rust, designing Struct-of-Arrays (SoA) or SIMD Rust architectures, or optimizing Rust ports with LLVM PGO. Don't use for unrelated non-Rust refactoring or single-line syntax questions.","https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdevelopers\u002Fmigrate-to-rust\u002FSKILL.md",[],[218,219,220,221,222,223,224,225,143,226,227,228,229,230,231,205,232,233,234,33,235,236,209,237],"migrate to rust","rust","migrate","github","memory","performance","directory","safe","ports","llvm","soa","cycle","porting","fix","arrays","infographic","high-performance","URL","architecture","unrelated",{"skillNo":239,"name":240,"nameZh":6,"description":241,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":242,"categories":243,"keywords":247,"publishedAt":51},"01M6998GCC3K29WZ82KXMB9E02","finding-google-skills","Google platform decision and setup guidance, loaded on demand from Google's skill catalog. Use when a developer is choosing or setting up part of their stack, such as where to run a service, a database, storage, messaging, authentication, analytics, ads, or AI model serving, and a Google product is a reasonable candidate - whether or not a vendor is named - or when a request names a Google product or API. Brings in the matching Google skill so the answer can weigh Google options, their trade-offs, and when they are not the right fit. Skip when the stack is already settled on another provider and no Google product is named, or the task involves no platform choice.","https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdevelopers\u002Ffinding-google-skills\u002FSKILL.md",[244,245,246],{"categoryNo":129,"categoryName":130,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":164,"categoryName":165,"taxonomyType":166,"taxonomyTypeDesc":167},[9,248,249,250,251,27,48,252,253,254,255,173,256,47,257,206,258,259,33,260,208],"finding google skills","storage","as","messaging","trade-offs","provider","answer","fit","catalog","decision","use","database","candidate",{"skillNo":262,"name":263,"nameZh":6,"description":264,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":265,"categories":266,"keywords":269,"publishedAt":51},"01M6998DWNHTH0BS6W1CY8ZXMP","workload-manager-basics","Use this skill to manage Google Cloud Workload Manager evaluations, rules, scanned resources, and validation results by using public client libraries and the REST API. Use when you need to inspect workload best-practice rules, create and run evaluations for Google Cloud general best practices, SAP, SQL Server, or custom organizational rules, review violations, export results to BigQuery, or automate Workload Manager through client libraries because no service-specific public CLI or MCP server is available. Don't use for general Google Compute Engine instance management, VPC configuration, or standard IAM auditing.","https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcloud\u002Fworkload-manager-basics\u002FSKILL.md",[267,268],{"categoryNo":129,"categoryName":130,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[270,271,150,272,9,199,273,140,200,274,275,49,276,33,277,208,146,278,279,280,281],"workload manager basics","workload","basics","cli","review","vpc","inspect","you","create","libraries","server","run"]