[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7D6KXVQTPAMXD4ASEJQTCKC":3,"skill-same:01M7D6KXVQTPAMXD4ASEJQTCKC":129},{"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":16,"sourceHtmlUrl":17,"categories":18,"keywords":19,"publishedAt":20,"linkOnly":21,"markdownContent":22,"markdownBody":23,"frontMatter":24,"refName":28,"commitSha":29,"skillDirectory":5,"forksCount":30,"repositoryHtmlUrl":31,"repositoryHomepageUrl":32,"ownerHtmlUrl":33,"ownerBlogUrl":34,"ownerDescription":35,"updatedAt":36,"install":37,"resources":50},"01M7D6KXVQTPAMXD4ASEJQTCKC","developing-genkit-python",null,"Provides guidance on developing AI-powered applications using Genkit Python (0.13) and migrating Genkit Python 0.12 projects to 0.13. Use when building AI agents, flows, tools, structured outputs, or FastAPI routes in Python, upgrading from Genkit 0.12, or debugging Genkit imports, config errors, or traces. Don't use for Genkit in JavaScript\u002FTypeScript, Go, or Dart.","tangyixiao\u002Ftangyixiao-skills","tangyixiao","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F115929632?v=4","01M7D582YK6A4M63CAK4CSY4EW","Tang Yixiao","01M7D582Z64DMRSYR872SR34SA",2,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: developing-genkit-python\ndescription: Provides guidance on developing AI-powered applications using Genkit\n  Python (0.13) and migrating Genkit Python 0.12 projects to 0.13. Use when building\n  AI agents, flows, tools, structured outputs, or FastAPI routes in Python, upgrading\n  from Genkit 0.12, or debugging Genkit imports, config errors, or traces. Don't use\n  for Genkit in JavaScript\u002FTypeScript, Go, or Dart.\nmetadata:\n  version: 1.0.0\n  category: AiAndMachineLearning\n---\n\n# Genkit Python\n\nBuild AI features in Python — generation, structured output, streaming, tools,\nflows, and multi-turn agents — with Genkit Python 0.13.\n\n- **New project?** See [Setup](references\u002Fsetup.md) and\n  [Examples](references\u002Fexamples.md).\n- **Upgrading from 0.12 or fixing broken 0.12 imports\u002Fsignatures?** Read\n  [Migrating from 0.12 to 0.13](references\u002Fmigrating-from-0.12.md) first.\n\n## Prerequisites\n\n- Python **3.10+** and **`uv`**\n  ([install](https:\u002F\u002Fdocs.astral.sh\u002Fuv\u002Fgetting-started\u002Finstallation\u002F))\n- Genkit CLI: `npm install -g genkit-cli` if `genkit --version` is missing\n\n## Hello World\n\n```python\nfrom genkit import Genkit\nfrom genkit_google_genai import GoogleAI\n\nai = Genkit(\n    plugins=[GoogleAI()],\n    model=GoogleAI.gemini('gemini-flash-latest'),\n)\n\n\nasync def main() -> None:\n    response = await ai.generate(prompt='Suggest one seasonal pasta dish.')\n    if response.error:\n        raise RuntimeError(response.error.message)\n    print(response.text)\n    # => Lemony tagliatelle with asparagus, sweet peas, and herb ricotta\n\n\nif __name__ == '__main__':\n    ai.run_main(main())\n```\n\n`ai.generate` does not raise when the provider rejects or fails a call\n(`INVALID_ARGUMENT`, `UNAVAILABLE`, rate limits). It returns `response.error`\n(`Failure` with `.status` and `.message`), `finish_reason == 'failed'`, and\nempty text. Problems caught before the call raise: `GoogleAI()` raises\n`ValueError` without `GEMINI_API_KEY`; an unknown model, invalid key, or unknown\nconfig field raises `GenkitError`. See\n[Common Errors](references\u002Fcommon-errors.md).\n\n## Agents (Experimental)\n\nMulti-turn chats with history, typed state, human approval, branching, and\nbackground work live under `genkit.exp` and `genkit.exp.agent`. Start here:\n[Agents](references\u002Fagents.md).\n\n```python\nfrom genkit.exp import Genkit\nfrom genkit.exp.agent import InMemorySessionStore\nfrom genkit_google_genai import GoogleAI\n\nai = Genkit(plugins=[GoogleAI()], model=GoogleAI.gemini('gemini-flash-latest'))\nagent = ai.define_agent(\n    name='concierge',\n    system='You are a concise hotel concierge.',\n    store=InMemorySessionStore(),\n)\n\nchat = agent.chat()\nres = await chat.send('Recommend a quiet dinner spot.')  # AgentResponse\nprint(res.text)\n# => Try Osteria Lume on 5th; it has booths and low music.\n\nturn = chat.send_stream('Is it open past 10pm?')  # AgentTurn\nasync for chunk in turn.stream:\n    if chunk.text:\n        print(chunk.text, end='')\nfinal = await turn.response  # AgentResponse\n```\n\nMore: [sessions](references\u002Fagents-sessions.md) ·\n[HITL](references\u002Fagents-human-in-the-loop.md) ·\n[branching](references\u002Fagents-branching.md) ·\n[background](references\u002Fagents-background.md) ·\n[state](references\u002Fagents-state.md) ·\n[artifacts](references\u002Fagents-artifacts.md) ·\n[custom](references\u002Fagents-custom.md) ·\n[HTTP](references\u002Fagents-http.md)\n\n## Imports\n\nEvery symbol lives in one public module (never import private `_` submodules;\nsee [Migrating from 0.12 to 0.13](references\u002Fmigrating-from-0.12.md) if a 0.12\nsymbol moved):\n\n- **Core app**: `from genkit import Genkit, FlowContext, ToolContext, Message, Part, Role, Media, Document, MultipartToolResponse, PublicError, GenkitError, Failure, ErrorReason`\n- **Google GenAI & Vertex AI**: `from genkit_google_genai import GoogleAI, VertexAI, GeminiConfig, GeminiImageConfig, GeminiTtsConfig`\n- **Other providers**: `from genkit_vertexai import ModelGarden` ·\n  `from genkit_anthropic import Anthropic, AnthropicConfig` ·\n  `from genkit_openai import OpenAI, OpenAIConfig` ·\n  `from genkit_ollama import Ollama, OllamaConfig` ·\n  `from genkit_amazon_bedrock import Bedrock, BedrockConfig`\n- **Built-in middleware**: `from genkit_middleware import Middleware, Retry, Fallback, ToolApproval, Skills, Filesystem` (plus `from genkit_middleware.exp import Artifacts` for agent sessions)\n- **Writing custom middleware**:\n  `from genkit.middleware import Middleware, MiddlewareContext`\n- **FastAPI & HTTP**:\n  `from genkit_fastapi import serve_flow, genkit_fastapi_handler,\n  handle_genkit_request` · `from genkit_fastapi.exp import serve_agent` ·\n  `from genkit.web import RequestData, to_sse, error_body, error_status`\n- **Agents (experimental)**: `from genkit.exp import Genkit, current_session` · `from genkit.exp.agent import Agent, Session, InMemorySessionStore, FileSessionStore, remote_agent`\n- **Telemetry**: `from genkit_google_cloud import enable_google_cloud_telemetry`\n  · `from genkit.telemetry import configure_instrumentation` ·\n  `from genkit_otel import GenAiInstrumentation`\n- **MCP (Client & Host)**: `from genkit_mcp import define_mcp_client, define_mcp_host, McpClient, McpHost`\n- **Testing & Mocks**: `from genkit.testing import define_echo_model, define_scripted_model, EchoModel, ScriptedModel`\n- **Evaluators (0.13 only; cut from 1.0, additive later)**:\n  `from genkit_evaluators import register_genkit_evaluators` ·\n  `from genkit.evaluator import BaseDataPoint, EvaluatorResponse, Score,\n  ScoreDetails, ScoreStatus`\n\n## Workflow\n\n1. **Agent or flow?** Use `ai.define_agent` (on `genkit.exp.Genkit`, see\n   [Agents](references\u002Fagents.md)) for multi-turn chats, state, or\n   human-in-the-loop approval instead of hand-rolling a message loop inside a\n   flow. Use `@ai.flow()` on `genkit.Genkit` for stateless request\u002Fresponse or\n   streaming pipelines.\n2. **Configure credentials & model refs.** Set **`GEMINI_API_KEY`**. Prefer\n   typed refs (`GoogleAI.gemini('gemini-flash-latest')`) and typed flat configs\n   (`GeminiConfig(...)`) so your type checker validates fields before runtime.\n   Prefixed strings (`'googleai\u002Fgemini-flash-latest'`) also work.\n3. **Enter via `ai.run_main(main())`** for standalone scripts and CLI apps so\n   the process stays up for the Dev UI under `genkit start`. FastAPI apps skip\n   `run_main`; uvicorn keeps the process alive:\n   `genkit start -- uv run uvicorn main:app --reload`.\n4. **Run with [Dev Workflow](references\u002Fdev-workflow.md)** (`genkit start` + Dev\n   UI) and type-check with `pyright`, `mypy`, or `ty`.\n5. **Verify with traces**, not a blind `uv run`. See\n   [Genkit CLI](#genkit-cli-recommended).\n6. **Stuck?** Check [Gotchas](#gotchas),\n   [Common Errors](references\u002Fcommon-errors.md), or\n   [Migrating from 0.12 to 0.13](references\u002Fmigrating-from-0.12.md).\n\n## Gotchas\n\n- **Agents need `genkit.exp`**: `from genkit.exp import Genkit`. Stable\n  `genkit.Genkit` has no `define_agent`.\n- **Tools are async**: `@ai.tool()` raises `TypeError` on a plain `def`; use\n  `async def`.\n- **Check `response.error`**: provider failures come back on the response, not\n  as exceptions (see [Hello World](#hello-world)).\n- **Gemini thinking levels**: `GeminiConfig(thinking_level='MINIMAL')` fails on\n  `gemini-flash-latest`; use `'LOW'`, `'MEDIUM'`, or `'HIGH'`.\n- **Vertex AI model IDs**: Vertex does not serve `-latest` aliases. Pass a\n  pinned model ID to `VertexAI.gemini(...)`.\n- **Logging**: `genkit.get_logger` is structlog-based.\n  `enable_google_cloud_telemetry()` injects trace context for GCP log-trace\n  correlation.\n- **Cloud telemetry auth**: call `enable_google_cloud_telemetry()` with\n  Application Default Credentials or explicit `credentials=` (service account\n  dict or `Credentials` instance).\n\n## Genkit CLI (recommended)\n\n`genkit start` wraps any Python program that uses Genkit, capturing traces from\nevery action while forwarding stdio cleanly. Running `uv run` directly skips\ntrace capture.\n\n**Primary pattern (persistent server + Dev UI):**\n```bash\ngenkit start -- uv run src\u002Fmain.py\ngenkit start --noui -- uv run src\u002Fmain.py   # persistent runtime without opening the Dev UI\n```\n`genkit start` runs until stopped with Ctrl+C (even with `--noui`). Do **not**\nrun `genkit start` as a blocking step in automated\u002Fnon-interactive scripts; use\n`flow:run` instead.\n\n**Non-interactive use (agents\u002FCI):** pass `--non-interactive` before `--` so the\nCLI never blocks on prompts:\n```bash\ngenkit start --non-interactive -- uv run src\u002Fmain.py\n```\n\n**One-shot flow execution (`flow:run`):** spins up the runtime, invokes one\n`@ai.flow()` by name, prints a `Trace ID`, and exits:\n```bash\ngenkit flow:run myFlow '{\"data\": \"input\"}' -- uv run src\u002Fmain.py\n```\nNote: `flow:run` invokes flows (`@ai.flow()`), not agents (`ai.define_agent`).\nWrap a single agent turn in a helper flow to exercise it via `flow:run` (see\n[Agents](references\u002Fagents.md)).\n\n**Inspecting traces:**\n```bash\ngenkit trace:list                        # list recent trace IDs\ngenkit trace:get \u003CtraceId>               # human-readable trace inspection\ngenkit trace:get \u003CtraceId> --format json # machine-readable JSON for jq \u002F scripts\n```\nAlways pass `--format json` when piping into `jq` or other parsers.\n\nSee [Dev Workflow](references\u002Fdev-workflow.md) for the full pre-run checklist\nand Dev UI walkthrough.\n\n## References\n\n- [Migrating from 0.12 to 0.13](references\u002Fmigrating-from-0.12.md):\n  Deterministic 0.12 -> 0.13 renames, config flattening, `PublicError`, and\n  `exp` moves.\n- [Examples](references\u002Fexamples.md): Structured output, streaming, media parts,\n  flows, tools, interrupts, cancellation, embeddings.\n- [Setup](references\u002Fsetup.md): Project bootstrap with `uv`, version alignment,\n  and provider plugins.\n- [Common Errors](references\u002Fcommon-errors.md): Fast fixes for 0.13 validation\n  errors, HTTP 500 redaction, streaming, and sessions.\n- [FastAPI](references\u002Ffastapi.md): `serve_flow`, `serve_agent`, `PublicError`,\n  SSE streaming, and parallel flows.\n- [Dotprompt](references\u002Fdotprompt.md): `.prompt` files, schema validation,\n  variants, partials, and helpers.\n- [Evals](references\u002Fevals.md): 0.13 evaluator syntax (deprecated; removed in\n  1.0).\n- [Dev Workflow](references\u002Fdev-workflow.md): `genkit start`, Dev UI, and trace\n  verification checklist.\n- [Agents (Experimental)](references\u002Fagents.md): Multi-turn stateful agents\n  (`genkit.exp`).\n","# Genkit Python\n\nBuild AI features in Python — generation, structured output, streaming, tools,\nflows, and multi-turn agents — with Genkit Python 0.13.\n\n- **New project?** See [Setup](references\u002Fsetup.md) and\n  [Examples](references\u002Fexamples.md).\n- **Upgrading from 0.12 or fixing broken 0.12 imports\u002Fsignatures?** Read\n  [Migrating from 0.12 to 0.13](references\u002Fmigrating-from-0.12.md) first.\n\n## Prerequisites\n\n- Python **3.10+** and **`uv`**\n  ([install](https:\u002F\u002Fdocs.astral.sh\u002Fuv\u002Fgetting-started\u002Finstallation\u002F))\n- Genkit CLI: `npm install -g genkit-cli` if `genkit --version` is missing\n\n## Hello World\n\n```python\nfrom genkit import Genkit\nfrom genkit_google_genai import GoogleAI\n\nai = Genkit(\n    plugins=[GoogleAI()],\n    model=GoogleAI.gemini('gemini-flash-latest'),\n)\n\n\nasync def main() -> None:\n    response = await ai.generate(prompt='Suggest one seasonal pasta dish.')\n    if response.error:\n        raise RuntimeError(response.error.message)\n    print(response.text)\n    # => Lemony tagliatelle with asparagus, sweet peas, and herb ricotta\n\n\nif __name__ == '__main__':\n    ai.run_main(main())\n```\n\n`ai.generate` does not raise when the provider rejects or fails a call\n(`INVALID_ARGUMENT`, `UNAVAILABLE`, rate limits). It returns `response.error`\n(`Failure` with `.status` and `.message`), `finish_reason == 'failed'`, and\nempty text. Problems caught before the call raise: `GoogleAI()` raises\n`ValueError` without `GEMINI_API_KEY`; an unknown model, invalid key, or unknown\nconfig field raises `GenkitError`. See\n[Common Errors](references\u002Fcommon-errors.md).\n\n## Agents (Experimental)\n\nMulti-turn chats with history, typed state, human approval, branching, and\nbackground work live under `genkit.exp` and `genkit.exp.agent`. Start here:\n[Agents](references\u002Fagents.md).\n\n```python\nfrom genkit.exp import Genkit\nfrom genkit.exp.agent import InMemorySessionStore\nfrom genkit_google_genai import GoogleAI\n\nai = Genkit(plugins=[GoogleAI()], model=GoogleAI.gemini('gemini-flash-latest'))\nagent = ai.define_agent(\n    name='concierge',\n    system='You are a concise hotel concierge.',\n    store=InMemorySessionStore(),\n)\n\nchat = agent.chat()\nres = await chat.send('Recommend a quiet dinner spot.')  # AgentResponse\nprint(res.text)\n# => Try Osteria Lume on 5th; it has booths and low music.\n\nturn = chat.send_stream('Is it open past 10pm?')  # AgentTurn\nasync for chunk in turn.stream:\n    if chunk.text:\n        print(chunk.text, end='')\nfinal = await turn.response  # AgentResponse\n```\n\nMore: [sessions](references\u002Fagents-sessions.md) ·\n[HITL](references\u002Fagents-human-in-the-loop.md) ·\n[branching](references\u002Fagents-branching.md) ·\n[background](references\u002Fagents-background.md) ·\n[state](references\u002Fagents-state.md) ·\n[artifacts](references\u002Fagents-artifacts.md) ·\n[custom](references\u002Fagents-custom.md) ·\n[HTTP](references\u002Fagents-http.md)\n\n## Imports\n\nEvery symbol lives in one public module (never import private `_` submodules;\nsee [Migrating from 0.12 to 0.13](references\u002Fmigrating-from-0.12.md) if a 0.12\nsymbol moved):\n\n- **Core app**: `from genkit import Genkit, FlowContext, ToolContext, Message, Part, Role, Media, Document, MultipartToolResponse, PublicError, GenkitError, Failure, ErrorReason`\n- **Google GenAI & Vertex AI**: `from genkit_google_genai import GoogleAI, VertexAI, GeminiConfig, GeminiImageConfig, GeminiTtsConfig`\n- **Other providers**: `from genkit_vertexai import ModelGarden` ·\n  `from genkit_anthropic import Anthropic, AnthropicConfig` ·\n  `from genkit_openai import OpenAI, OpenAIConfig` ·\n  `from genkit_ollama import Ollama, OllamaConfig` ·\n  `from genkit_amazon_bedrock import Bedrock, BedrockConfig`\n- **Built-in middleware**: `from genkit_middleware import Middleware, Retry, Fallback, ToolApproval, Skills, Filesystem` (plus `from genkit_middleware.exp import Artifacts` for agent sessions)\n- **Writing custom middleware**:\n  `from genkit.middleware import Middleware, MiddlewareContext`\n- **FastAPI & HTTP**:\n  `from genkit_fastapi import serve_flow, genkit_fastapi_handler,\n  handle_genkit_request` · `from genkit_fastapi.exp import serve_agent` ·\n  `from genkit.web import RequestData, to_sse, error_body, error_status`\n- **Agents (experimental)**: `from genkit.exp import Genkit, current_session` · `from genkit.exp.agent import Agent, Session, InMemorySessionStore, FileSessionStore, remote_agent`\n- **Telemetry**: `from genkit_google_cloud import enable_google_cloud_telemetry`\n  · `from genkit.telemetry import configure_instrumentation` ·\n  `from genkit_otel import GenAiInstrumentation`\n- **MCP (Client & Host)**: `from genkit_mcp import define_mcp_client, define_mcp_host, McpClient, McpHost`\n- **Testing & Mocks**: `from genkit.testing import define_echo_model, define_scripted_model, EchoModel, ScriptedModel`\n- **Evaluators (0.13 only; cut from 1.0, additive later)**:\n  `from genkit_evaluators import register_genkit_evaluators` ·\n  `from genkit.evaluator import BaseDataPoint, EvaluatorResponse, Score,\n  ScoreDetails, ScoreStatus`\n\n## Workflow\n\n1. **Agent or flow?** Use `ai.define_agent` (on `genkit.exp.Genkit`, see\n   [Agents](references\u002Fagents.md)) for multi-turn chats, state, or\n   human-in-the-loop approval instead of hand-rolling a message loop inside a\n   flow. Use `@ai.flow()` on `genkit.Genkit` for stateless request\u002Fresponse or\n   streaming pipelines.\n2. **Configure credentials & model refs.** Set **`GEMINI_API_KEY`**. Prefer\n   typed refs (`GoogleAI.gemini('gemini-flash-latest')`) and typed flat configs\n   (`GeminiConfig(...)`) so your type checker validates fields before runtime.\n   Prefixed strings (`'googleai\u002Fgemini-flash-latest'`) also work.\n3. **Enter via `ai.run_main(main())`** for standalone scripts and CLI apps so\n   the process stays up for the Dev UI under `genkit start`. FastAPI apps skip\n   `run_main`; uvicorn keeps the process alive:\n   `genkit start -- uv run uvicorn main:app --reload`.\n4. **Run with [Dev Workflow](references\u002Fdev-workflow.md)** (`genkit start` + Dev\n   UI) and type-check with `pyright`, `mypy`, or `ty`.\n5. **Verify with traces**, not a blind `uv run`. See\n   [Genkit CLI](#genkit-cli-recommended).\n6. **Stuck?** Check [Gotchas](#gotchas),\n   [Common Errors](references\u002Fcommon-errors.md), or\n   [Migrating from 0.12 to 0.13](references\u002Fmigrating-from-0.12.md).\n\n## Gotchas\n\n- **Agents need `genkit.exp`**: `from genkit.exp import Genkit`. Stable\n  `genkit.Genkit` has no `define_agent`.\n- **Tools are async**: `@ai.tool()` raises `TypeError` on a plain `def`; use\n  `async def`.\n- **Check `response.error`**: provider failures come back on the response, not\n  as exceptions (see [Hello World](#hello-world)).\n- **Gemini thinking levels**: `GeminiConfig(thinking_level='MINIMAL')` fails on\n  `gemini-flash-latest`; use `'LOW'`, `'MEDIUM'`, or `'HIGH'`.\n- **Vertex AI model IDs**: Vertex does not serve `-latest` aliases. Pass a\n  pinned model ID to `VertexAI.gemini(...)`.\n- **Logging**: `genkit.get_logger` is structlog-based.\n  `enable_google_cloud_telemetry()` injects trace context for GCP log-trace\n  correlation.\n- **Cloud telemetry auth**: call `enable_google_cloud_telemetry()` with\n  Application Default Credentials or explicit `credentials=` (service account\n  dict or `Credentials` instance).\n\n## Genkit CLI (recommended)\n\n`genkit start` wraps any Python program that uses Genkit, capturing traces from\nevery action while forwarding stdio cleanly. Running `uv run` directly skips\ntrace capture.\n\n**Primary pattern (persistent server + Dev UI):**\n```bash\ngenkit start -- uv run src\u002Fmain.py\ngenkit start --noui -- uv run src\u002Fmain.py   # persistent runtime without opening the Dev UI\n```\n`genkit start` runs until stopped with Ctrl+C (even with `--noui`). Do **not**\nrun `genkit start` as a blocking step in automated\u002Fnon-interactive scripts; use\n`flow:run` instead.\n\n**Non-interactive use (agents\u002FCI):** pass `--non-interactive` before `--` so the\nCLI never blocks on prompts:\n```bash\ngenkit start --non-interactive -- uv run src\u002Fmain.py\n```\n\n**One-shot flow execution (`flow:run`):** spins up the runtime, invokes one\n`@ai.flow()` by name, prints a `Trace ID`, and exits:\n```bash\ngenkit flow:run myFlow '{\"data\": \"input\"}' -- uv run src\u002Fmain.py\n```\nNote: `flow:run` invokes flows (`@ai.flow()`), not agents (`ai.define_agent`).\nWrap a single agent turn in a helper flow to exercise it via `flow:run` (see\n[Agents](references\u002Fagents.md)).\n\n**Inspecting traces:**\n```bash\ngenkit trace:list                        # list recent trace IDs\ngenkit trace:get \u003CtraceId>               # human-readable trace inspection\ngenkit trace:get \u003CtraceId> --format json # machine-readable JSON for jq \u002F scripts\n```\nAlways pass `--format json` when piping into `jq` or other parsers.\n\nSee [Dev Workflow](references\u002Fdev-workflow.md) for the full pre-run checklist\nand Dev UI walkthrough.\n\n## References\n\n- [Migrating from 0.12 to 0.13](references\u002Fmigrating-from-0.12.md):\n  Deterministic 0.12 -> 0.13 renames, config flattening, `PublicError`, and\n  `exp` moves.\n- [Examples](references\u002Fexamples.md): Structured output, streaming, media parts,\n  flows, tools, interrupts, cancellation, embeddings.\n- [Setup](references\u002Fsetup.md): Project bootstrap with `uv`, version alignment,\n  and provider plugins.\n- [Common Errors](references\u002Fcommon-errors.md): Fast fixes for 0.13 validation\n  errors, HTTP 500 redaction, streaming, and sessions.\n- [FastAPI](references\u002Ffastapi.md): `serve_flow`, `serve_agent`, `PublicError`,\n  SSE streaming, and parallel flows.\n- [Dotprompt](references\u002Fdotprompt.md): `.prompt` files, schema validation,\n  variants, partials, and helpers.\n- [Evals](references\u002Fevals.md): 0.13 evaluator syntax (deprecated; removed in\n  1.0).\n- [Dev Workflow](references\u002Fdev-workflow.md): `genkit start`, Dev UI, and trace\n  verification checklist.\n- [Agents (Experimental)](references\u002Fagents.md): Multi-turn stateful agents\n  (`genkit.exp`).\n",{"name":5,"metadata":25,"description":7},{"version":26,"category":27},"1.0.0","AiAndMachineLearning","main","2a870f189175a48c39f5f7e26a6d93b0be9cd13b",0,"https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills","https:\u002F\u002Ftangyixiao.github.io\u002Ftangyixiao-skills\u002F","https:\u002F\u002Fgithub.com\u002Ftangyixiao","http:\u002F\u002Fwww.sxyz.net\u002F","I am Tang Yixiao, a student in Shaoxing No.1 High School. I am eager to learn on GitHub and contribute my part to this community.","2026-11-11 15:45:59",{"source":8,"skillName":5,"commands":38,"prompt":48,"zipAvailable":49},[39,42,45],{"tool":40,"command":41},"npx","npx skills add tangyixiao\u002Ftangyixiao-skills --skill developing-genkit-python",{"tool":43,"command":44},"bunx","bunx skills add tangyixiao\u002Ftangyixiao-skills --skill developing-genkit-python",{"tool":46,"command":47},"pnpm","pnpm dlx skills add tangyixiao\u002Ftangyixiao-skills --skill developing-genkit-python","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002FSKILL.md",true,[51,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125],{"path":52,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":55,"sourceHtmlUrl":56},"INSTALL-SOURCE.json","REFERENCE","参考文档",532,"https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002FINSTALL-SOURCE.json",{"path":58,"resourceType":58,"resourceTypeDesc":59,"sizeBytes":60,"sourceHtmlUrl":16},"LICENSE","许可证",11358,{"path":62,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":63,"sourceHtmlUrl":64},"references\u002Fagents-artifacts.md",4089,"https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002Freferences\u002Fagents-artifacts.md",{"path":66,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":67,"sourceHtmlUrl":68},"references\u002Fagents-background.md",6465,"https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002Freferences\u002Fagents-background.md",{"path":70,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":71,"sourceHtmlUrl":72},"references\u002Fagents-branching.md",3808,"https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002Freferences\u002Fagents-branching.md",{"path":74,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":75,"sourceHtmlUrl":76},"references\u002Fagents-custom.md",7780,"https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002Freferences\u002Fagents-custom.md",{"path":78,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":79,"sourceHtmlUrl":80},"references\u002Fagents-http.md",9056,"https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002Freferences\u002Fagents-http.md",{"path":82,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":83,"sourceHtmlUrl":84},"references\u002Fagents-human-in-the-loop.md",7128,"https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002Freferences\u002Fagents-human-in-the-loop.md",{"path":86,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":87,"sourceHtmlUrl":88},"references\u002Fagents-sessions.md",4281,"https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002Freferences\u002Fagents-sessions.md",{"path":90,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":91,"sourceHtmlUrl":92},"references\u002Fagents-state.md",6322,"https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002Freferences\u002Fagents-state.md",{"path":94,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":95,"sourceHtmlUrl":96},"references\u002Fagents.md",10853,"https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002Freferences\u002Fagents.md",{"path":98,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":99,"sourceHtmlUrl":100},"references\u002Fcommon-errors.md",15594,"https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002Freferences\u002Fcommon-errors.md",{"path":102,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":103,"sourceHtmlUrl":104},"references\u002Fdev-workflow.md",6153,"https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002Freferences\u002Fdev-workflow.md",{"path":106,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":107,"sourceHtmlUrl":108},"references\u002Fdotprompt.md",6745,"https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002Freferences\u002Fdotprompt.md",{"path":110,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":111,"sourceHtmlUrl":112},"references\u002Fevals.md",7447,"https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002Freferences\u002Fevals.md",{"path":114,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":115,"sourceHtmlUrl":116},"references\u002Fexamples.md",11378,"https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002Freferences\u002Fexamples.md",{"path":118,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":119,"sourceHtmlUrl":120},"references\u002Ffastapi.md",11530,"https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002Freferences\u002Ffastapi.md",{"path":122,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":123,"sourceHtmlUrl":124},"references\u002Fmigrating-from-0.12.md",26811,"https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002Freferences\u002Fmigrating-from-0.12.md",{"path":126,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":127,"sourceHtmlUrl":128},"references\u002Fsetup.md",3762,"https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fdeveloping-genkit-python\u002Freferences\u002Fsetup.md",[130,138,147,155,163,171],{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":134,"sourceHtmlUrl":135,"categories":136,"keywords":137,"publishedAt":20},"01M7D8JK8FYBFNNAJXWD89CFH7","xlsx","Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .xltx, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved.","https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fxlsx\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fxlsx\u002FSKILL.md",[],[],{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":142,"licenseFileUrl":143,"sourceHtmlUrl":144,"categories":145,"keywords":146,"publishedAt":20},"01M7D8JG8ERGGQQAMX0DWCG9GR","writing-shape","Writing, exploit: shape raw material into an article, paragraph by paragraph.","MIT","https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fwriting-shape\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fwriting-shape\u002FSKILL.md",[],[],{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":142,"licenseFileUrl":151,"sourceHtmlUrl":152,"categories":153,"keywords":154,"publishedAt":20},"01M7D8JE672GW3EHSE8EF185M4","writing-fragments","Writing, explore: mine raw fragments, no structure yet.","https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fwriting-fragments\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fwriting-fragments\u002FSKILL.md",[],[],{"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":142,"licenseFileUrl":159,"sourceHtmlUrl":160,"categories":161,"keywords":162,"publishedAt":20},"01M7D8JBK572YDFMND8Q6CEYJW","writing-for-agents","Writing documents for agents. Use when creating or editing skills, or modifying AGENTS.md or CLAUDE.md.","https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fwriting-for-agents\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fwriting-for-agents\u002FSKILL.md",[],[],{"skillNo":164,"name":165,"nameZh":6,"description":166,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":142,"licenseFileUrl":167,"sourceHtmlUrl":168,"categories":169,"keywords":170,"publishedAt":20},"01M7D8J5QPWEXX61EGBKYH73R8","writing-clearly-and-concisely","Use when writing prose humans will read—documentation, commit messages, error messages, explanations, reports, or UI text. Applies Strunk's timeless rules for clearer, stronger, more professional writing.","https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fwriting-clearly-and-concisely\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fwriting-clearly-and-concisely\u002FSKILL.md",[],[],{"skillNo":172,"name":173,"nameZh":6,"description":174,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":142,"licenseFileUrl":175,"sourceHtmlUrl":176,"categories":177,"keywords":178,"publishedAt":20},"01M7D8J36YWC8WZS5DK5AH03CD","writing-beats","Writing, exploit; assemble raw material into a journey of beats, grounding each term before a beat leans on it.","https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fwriting-beats\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Ftangyixiao\u002Ftangyixiao-skills\u002Fblob\u002Fmain\u002Fwriting-beats\u002FSKILL.md",[],[]]