Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA standards. Use this skill to generate semantic ARIA for Web and accessibility traits for Web and Native platforms (iOS/Android).
日本語の概要は準備中です。原文の説明を表示しています。
Guides the usage of Gemini Interactions API on Gemini Enterprise Agent Platform. Use when the user wants to use the stateful, server-managed Interactions API for multi-turn conversations, background execution, streaming, structured output, and function calling on the Agent Platform.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
This skill provides instructions for authenticating, connecting to, and utilizing the stateful, server-managed Gemini Interactions API on Gemini Enterprise Agent Platform.
The Interactions API is the modern, recommended way to execute Generative AI agent conversations, background research tasks, multi-turn chats, and structured, multi-step workflows.
[!IMPORTANT] CRITICAL: Unified SDK & Latest Models
- Unified SDK: Use the Google Gen AI SDK (
google-genai >= 2.0.0for Python,@google/genai >= 2.0.0for JS/TS). Legacy SDKs likegoogle-cloud-aiplatform,@google-cloud/vertexai, andgoogle-generativeaiare strictly unsupported for Interactions.- Latest Models Only: Use
gemini-3.1-pro-preview,gemini-3.1-flash-lite,gemini-3-flash-preview,gemini-2.5-pro, orgemini-2.5-flash. Refer to the latest model versions to check for new updates. Legacy models (gemini-2.0-*,gemini-1.5-*) are deprecated and do not support interactions.- Turn-Scoped Parameters: Parameters like
tools,system_instruction, andgeneration_configare turn-scoped. They MUST be passed with each interaction request.
Before running any code, ensure you are authenticated with Application Default Credentials (ADC) and have the necessary API enabled.
gcloud auth application-default login
gcloud services enable aiplatform.googleapis.com
You can initialize the client using environment variables (recommended) or by passing explicit configuration parameters.
Configure environment variables to let the SDK automatically resolve settings:
export GOOGLE_GENAI_USE_ENTERPRISE=true
export GOOGLE_CLOUD_PROJECT="your-project-id"
export GOOGLE_CLOUD_LOCATION="global"
from google import genai
# The SDK automatically picks up the environment variables
client = genai.Client()
import { GoogleGenAI } from "@google/genai";
// The SDK automatically picks up the environment variables
const ai = new GoogleGenAI();
Alternatively, pass configuration values directly inside your code:
from google import genai
import google.auth
_, project_id = google.auth.default()
client = genai.Client(enterprise=True, project=project_id, location="global")
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({
enterprise: {
project: "your-project-id",
location: "global"
}
});
Submit a single prompt and read the final text response. Under the modern schema, output content is retrieved from the steps list.
interaction = client.interactions.create(
model="gemini-3-flash-preview",
input="Explain serverless computing in one sentence."
)
# Output text is located under steps
print(interaction.steps[-1].content[0].text)
const interaction = await ai.interactions.create({
model: "gemini-3-flash-preview",
input: "Explain serverless computing in one sentence."
});
console.log(interaction.steps[interaction.steps.length - 1].content[0].text);
Interactions are stateful by default. Store the conversation state in the cloud and reference it in the subsequent turn using previous_interaction_id.
# Turn 1: Introduce ourselves
turn1 = client.interactions.create(
model="gemini-3-flash-preview",
input="Hi! My name is John. I am working on AI agents.",
store=True
)
print(f"Turn 1: {turn1.steps[-1].content[0].text}")
# Turn 2: Refer back to the stored turn state
turn2 = client.interactions.create(
model="gemini-3-flash-preview",
input="What is my name?",
previous_interaction_id=turn1.id
)
print(f"Turn 2: {turn2.steps[-1].content[0].text}")
// Turn 1
const turn1 = await ai.interactions.create({
model: "gemini-3-flash-preview",
input: "Hi! My name is John. I am working on AI agents.",
store: true
});
// Turn 2
const turn2 = await ai.interactions.create({
model: "gemini-3-flash-preview",
input: "What is my name?",
previousInteractionId: turn1.id
});
console.log(turn2.steps[turn2.steps.length - 1].content[0].text);
Stream responses in real-time. Passing stream=True returns an iterable chunk generator.
response = client.interactions.create(
model="gemini-3-flash-preview",
input="Write a short poem about debugging.",
stream=True
)
for chunk in response:
if chunk.steps:
step = chunk.steps[-1]
if step.content and step.content[0].text:
print(step.content[0].text, end="", flush=True)
print()
const responseStream = await ai.interactions.create({
model: "gemini-3-flash-preview",
input: "Write a short poem about debugging.",
stream: true
});
for await (const chunk of responseStream) {
if (chunk.steps) {
const step = chunk.steps[chunk.steps.length - 1];
if (step.content && step.content[0].text) {
process.stdout.write(step.content[0].text);
}
}
}
console.log();
response_format)Retrieve structured, type-safe JSON matching a schema. Under the modern Interactions API, a polymorphic response_format argument directly takes the target schema structure.
from pydantic import BaseModel, Field
class Book(BaseModel):
title: str = Field(description="The title of the book")
author: str = Field(description="The book's author")
year_published: int
interaction = client.interactions.create(
model="gemini-3-flash-preview",
input="Recommend one famous sci-fi book.",
response_format=Book
)
# The text will be a valid JSON matching the Book schema
print(interaction.steps[-1].content[0].text)
import { Type } from "@google/genai";
const BookSchema = {
type: Type.OBJECT,
properties: {
title: { type: Type.STRING, description: "The title of the book" },
author: { type: Type.STRING, description: "The book's author" },
yearPublished: { type: Type.INTEGER }
},
required: ["title", "author", "yearPublished"]
};
const interaction = await ai.interactions.create({
model: "gemini-3-flash-preview",
input: "Recommend one famous sci-fi book.",
responseFormat: BookSchema
});
console.log(interaction.steps[interaction.steps.length - 1].content[0].text);
Define local tools (functions) and submit execution results to the stateful interaction history.
def get_stock_price(ticker: str) -> float:
"""Gets the stock price for a given ticker symbol."""
if ticker.upper() == "GOOG":
return 175.50
return 100.0
# Turn 1: Pass tools to the model
interaction = client.interactions.create(
model="gemini-3-flash-preview",
input="What is the stock price of GOOG?",
tools=[get_stock_price]
)
last_step = interaction.steps[-1]
# Check if the model requested a function call
if last_step.tool_calls:
for call in last_step.tool_calls:
if call.name == "get_stock_price":
ticker_arg = call.args.get("ticker")
price = get_stock_price(ticker_arg)
# Turn 2: Submit function execution result statefully
final_turn = client.interactions.create(
model="gemini-3-flash-preview",
input=f"The stock price for {ticker_arg} is ${price}.",
previous_interaction_id=interaction.id
)
print(final_turn.steps[-1].content[0].text)
import { Type } from "@google/genai";
// Define local tool
function getStockPrice({ ticker }: { ticker: string }): number {
if (ticker.toUpperCase() === "GOOG") {
return 175.50;
}
return 100.00;
}
// Turn 1: Pass tools to the model
const interaction = await ai.interactions.create({
model: "gemini-3-flash-preview",
input: "What is the stock price of GOOG?",
tools: [{
functionDeclarations: [{
name: "getStockPrice",
description: "Gets the stock price for a given ticker symbol.",
parameters: {
type: Type.OBJECT,
properties: {
ticker: { type: Type.STRING, description: "The stock ticker symbol" }
},
required: ["ticker"]
}
}]
}]
});
const lastStep = interaction.steps[interaction.steps.length - 1];
// Check if the model requested a function call
if (lastStep.toolCalls) {
for (const call of lastStep.toolCalls) {
if (call.name === "getStockPrice") {
const tickerArg = call.args.ticker as string;
const price = getStockPrice({ ticker: tickerArg });
// Turn 2: Submit function execution result statefully
const finalTurn = await ai.interactions.create({
model: "gemini-3-flash-preview",
input: `The stock price for ${tickerArg} is $${price}.`,
previousInteractionId: interaction.id
});
console.log(finalTurn.steps[finalTurn.steps.length - 1].content[0].text);
}
}
}
For shell-based scripts, debugging, or non-Python/JS environments, you can communicate with the stateful Interactions API directly using raw HTTP/REST requests via curl.
The REST API endpoint for interactions is:
POST https://aiplatform.googleapis.com/v1beta1/projects/{PROJECT_ID}/locations/{LOCATION}/interactions
global (or custom region if required).Set your target agent ID (e.g., model or custom agent path) and access token generated from Application Default Credentials:
AGENT_ID="your-agent-id"
ACCESS_TOKEN=$(gcloud auth print-access-token)
Send a request to start an interaction using the agent variable:
curl -X POST "https://aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/global/interactions" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"agent": "'"${AGENT_ID}"'",
"input": [{
"role": "user",
"content": [{
"type": "text",
"text": "Explain serverless computing in one sentence."
}]
}]
}'
A synchronous POST request returns a JSON object containing the conversation step details and unique identifiers:
{
"id": "your-interaction-id",
"status": "completed",
"steps": [
{
"role": "model",
"content": [
{
"type": "text",
"text": "Serverless computing is a cloud execution model where the cloud provider dynamically manages the allocation and provisioning of servers, charging customers based on actual usage rather than pre-purchased capacity."
}
]
}
],
"usage": {
"total_tokens": 24751,
"total_input_tokens": 23894,
"total_output_tokens": 857
},
"created": "2026-05-08T10:44:43Z",
"updated": "2026-05-08T10:44:43Z",
"environment_id": "your-environment-id",
"object": "interaction"
}
To continue an existing conversation statefully, specify the previous_interaction_id in the JSON payload:
curl -X POST "https://aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/global/interactions" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"agent": "'"${AGENT_ID}"'",
"store": true,
"previous_interaction_id": "YOUR_PREVIOUS_INTERACTION_ID",
"input": [{
"role": "user",
"content": [{
"type": "text",
"text": "Can you elaborate on that?"
}]
}]
}'
To stream updates in real time (Server-Sent Events format), pass "stream": true in the payload:
curl -X POST "https://aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/global/interactions" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"agent": "'"${AGENT_ID}"'",
"stream": true,
"input": [{
"role": "user",
"content": [{
"type": "text",
"text": "Write a long story about space travel."
}]
}]
}'
The endpoint will return a chunked stream where each event begins with data: containing JSON updates with the event_type and step contents.
How
curlhandles streaming: By default, when"stream": trueis passed, the server responds withTransfer-Encoding: chunkedandContent-Type: text/event-stream(Server-Sent Events).curlwill automatically keep the connection open and print the incoming data chunks tostdoutin real time as they are pushed by the server. The user does not need to poll or pull further; the complete sequence of events streams continuously until completion.
まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA standards. Use this skill to generate semantic ARIA for Web and accessibility traits for Web and Native platforms (iOS/Android).
日本語の概要は準備中です。原文の説明を表示しています。
Whole site or product — a full web accessibility (a11y) audit against WCAG 2.2, following the WCAG-EM methodology. Defines scope, samples representative pages and flows, runs the automated tier (`accessibility-scan`) and the hands-on manual tier (`accessibility-inspect`), and produces one conformance report. Grades each finding by severity and evidence basis, and states per-criterion conformance as pass, fail, or undetermined (needs a human). Use it for 'audit my site for accessibility', 'is this product accessible', 'a11y audit', 'WCAG or Section 508 conformance report', or any multi-page assessment. Assesses; does not fix (use `accessibility-fix`) or diff (use `accessibility-diff`). For a single page use `accessibility-scan`; for hands-on keyboard and screen-reader checks use `accessibility-inspect`.
日本語の概要は準備中です。原文の説明を表示しています。
Regression check — diff a live page's web accessibility (a11y) violations against a baseline. By default it compares your uncommitted changes (stash-based); pass `--branch [<name>]` to compare against a branch. Reports the new WCAG violations introduced, the ones fixed, and the count of pre-existing ones. Use it for 'did my change break accessibility', 'what a11y issues did this PR add', or as a CI gate. For a full scan of one page use `accessibility-scan`; for a whole site use `accessibility-audit`.
日本語の概要は準備中です。原文の説明を表示しています。
Remediation only — repair web accessibility (a11y) violations against WCAG 2.2 with a baseline, edit, and verify loop. Takes a target (URL, files, directory) or a findings worklist from `accessibility-scan`/`accessibility-inspect`/`accessibility-audit`, applies mechanical fixes as given, leaves TODOs for visual or contextual judgment, and verifies by re-running the baseline check. It only fixes. To find issues use `accessibility-scan` (one page, automated), `accessibility-inspect` (one page, manual), or `accessibility-audit` (whole site, WCAG-EM); to check for regressions use `accessibility-diff`. Use it for 'fix the a11y issues in X', 'make this accessible', 'add missing alt text and labels', 'apply these accessibility fixes', 'remediate these violations'.
日本語の概要は準備中です。原文の説明を表示しています。
One page, hands-on manual tier — drive a live page through the web accessibility (a11y) checks a rule engine can't decide: keyboard operation and focus order, screen-reader names, roles and states from the accessibility tree, reflow and zoom, reduced motion, form errors, and target size. Grades each finding by evidence basis (verified / confirm-with-a-human / human-required) and severity, and closes every criterion in a ledger: verified, flagged, not exercised, or N/A. Locates and assesses; does not fix (use `accessibility-fix`). Use it for keyboard testing, focus-order checks, screen-reader or a11y-tree review, reflow and zoom at 200%, or 'is this operable, not just lint-clean'. The automated tier is `accessibility-scan`; `accessibility-audit` runs both across a sampled site.
日本語の概要は準備中です。原文の説明を表示しています。
One page, automated tier — run the web accessibility (a11y) rule engine against a live page and locate every violation it can detect mechanically. Pass a URL, a config target name (e.g. `accesslint:accessibility-scan dev`), or nothing to use the default target from `accesslint.config.json`. Ensures a debuggable Chrome, runs the @accesslint/core engine over CDP, and returns a worklist of live-DOM WCAG 2.2 violations, each grounded to its DOM selector and source `file:line`. Locates; doesn't edit. Use it for 'is this page accessible', 'check a11y on this URL', 'find contrast and alt-text issues', or to verify a UI change. For hands-on keyboard and screen-reader checks use `accessibility-inspect`; for a whole site or product use `accessibility-audit`; to diff against uncommitted changes or a branch use `accessibility-diff`.
日本語の概要は準備中です。原文の説明を表示しています。