{"id":"7e409ab2-c24f-48b6-b0fa-b6274175d7db","shortId":"3yHDDf","kind":"skill","title":"pydantic-ai","tagline":"Build production-ready AI agents with PydanticAI — type-safe tool use, structured outputs, dependency injection, and multi-model support.","description":"# PydanticAI — Typed AI Agents in Python\n\n## Overview\n\nPydanticAI is a Python agent framework from the Pydantic team that brings the same type-safety and validation guarantees as Pydantic to LLM-based applications. It supports structured outputs (validated with Pydantic models), dependency injection for testability, streamed responses, multi-turn conversations, and tool use — across OpenAI, Anthropic, Google Gemini, Groq, Mistral, and Ollama. Use this skill when building production AI agents, chatbots, or LLM pipelines where correctness and testability matter.\n\n## When to Use This Skill\n\n- Use when building Python AI agents that call tools and return structured data\n- Use when you need validated, typed LLM outputs (not raw strings)\n- Use when you want to write unit tests for agent logic without hitting a real LLM\n- Use when switching between LLM providers without rewriting agent code\n- Use when the user asks about `Agent`, `@agent.tool`, `RunContext`, `ModelRetry`, or `result_type`\n\n## How It Works\n\n### Step 1: Installation\n\n```bash\npip install pydantic-ai\n\n# Install extras for specific providers\npip install 'pydantic-ai[openai]'       # OpenAI / Azure OpenAI\npip install 'pydantic-ai[anthropic]'    # Anthropic Claude\npip install 'pydantic-ai[gemini]'       # Google Gemini\npip install 'pydantic-ai[groq]'         # Groq\npip install 'pydantic-ai[vertexai]'     # Google Vertex AI\n```\n\n### Step 2: A Minimal Agent\n\n```python\nfrom pydantic_ai import Agent\n\n# Simple agent — returns a plain string\nagent = Agent(\n    'anthropic:claude-sonnet-4-6',\n    system_prompt='You are a helpful assistant. Be concise.',\n)\n\nresult = agent.run_sync('What is the capital of Japan?')\nprint(result.data)  # \"Tokyo\"\nprint(result.usage())  # Usage(requests=1, request_tokens=..., response_tokens=...)\n```\n\n### Step 3: Structured Output with Pydantic Models\n\n```python\nfrom pydantic import BaseModel\nfrom pydantic_ai import Agent\n\nclass MovieReview(BaseModel):\n    title: str\n    year: int\n    rating: float  # 0.0 to 10.0\n    summary: str\n    recommended: bool\n\nagent = Agent(\n    'openai:gpt-4o',\n    result_type=MovieReview,\n    system_prompt='You are a film critic. Return structured reviews.',\n)\n\nresult = agent.run_sync('Review Inception (2010)')\nreview = result.data  # Fully typed MovieReview instance\nprint(f\"{review.title} ({review.year}): {review.rating}/10\")\nprint(f\"Recommended: {review.recommended}\")\n```\n\n### Step 4: Tool Use\n\nRegister tools with `@agent.tool` — the LLM can call them during a run:\n\n```python\nfrom pydantic_ai import Agent, RunContext\nfrom pydantic import BaseModel\nimport httpx\n\nclass WeatherReport(BaseModel):\n    city: str\n    temperature_c: float\n    condition: str\n\nweather_agent = Agent(\n    'anthropic:claude-sonnet-4-6',\n    result_type=WeatherReport,\n    system_prompt='Get current weather for the requested city.',\n)\n\n@weather_agent.tool\nasync def get_temperature(ctx: RunContext, city: str) -> dict:\n    \"\"\"Fetch the current temperature for a city from the weather API.\"\"\"\n    async with httpx.AsyncClient() as client:\n        r = await client.get(f'https://wttr.in/{city}?format=j1')\n        data = r.json()\n        return {\n            'temp_c': float(data['current_condition'][0]['temp_C']),\n            'description': data['current_condition'][0]['weatherDesc'][0]['value'],\n        }\n\nimport asyncio\nresult = asyncio.run(weather_agent.run('What is the weather in Tokyo?'))\nprint(result.data)\n```\n\n### Step 5: Dependency Injection\n\nInject services (database, HTTP clients, config) into agents for testability:\n\n```python\nfrom dataclasses import dataclass\nfrom pydantic_ai import Agent, RunContext\nfrom pydantic import BaseModel\n\n@dataclass\nclass Deps:\n    db: Database\n    user_id: str\n\nclass SupportResponse(BaseModel):\n    message: str\n    escalate: bool\n\nsupport_agent = Agent(\n    'openai:gpt-4o-mini',\n    deps_type=Deps,\n    result_type=SupportResponse,\n    system_prompt='You are a support agent. Use the tools to help customers.',\n)\n\n@support_agent.tool\nasync def get_order_history(ctx: RunContext[Deps]) -> list[dict]:\n    \"\"\"Fetch recent orders for the current user.\"\"\"\n    return await ctx.deps.db.get_orders(ctx.deps.user_id, limit=5)\n\n@support_agent.tool\nasync def create_refund(ctx: RunContext[Deps], order_id: str, reason: str) -> dict:\n    \"\"\"Initiate a refund for a specific order.\"\"\"\n    return await ctx.deps.db.create_refund(order_id, reason, ctx.deps.user_id)\n\n# Usage\nasync def handle_support(user_id: str, message: str):\n    deps = Deps(db=get_db(), user_id=user_id)\n    result = await support_agent.run(message, deps=deps)\n    return result.data\n```\n\n### Step 6: Testing with TestModel\n\nWrite unit tests without real LLM calls:\n\n```python\nfrom pydantic_ai.models.test import TestModel\n\ndef test_support_agent_escalates():\n    with support_agent.override(model=TestModel()):\n        # TestModel returns a minimal valid response matching result_type\n        result = support_agent.run_sync(\n            'I want to cancel my account',\n            deps=Deps(db=FakeDb(), user_id='user-123'),\n        )\n    # Test the structure, not the LLM's exact words\n    assert isinstance(result.data, SupportResponse)\n    assert isinstance(result.data.escalate, bool)\n```\n\n**FunctionModel** for deterministic test responses:\n\n```python\nfrom pydantic_ai.models.function import FunctionModel, ModelContext\n\ndef my_model(messages, info):\n    return ModelResponse(parts=[TextPart('Always this response')])\n\nwith agent.override(model=FunctionModel(my_model)):\n    result = agent.run_sync('anything')\n```\n\n### Step 7: Streaming Responses\n\n```python\nimport asyncio\nfrom pydantic_ai import Agent\n\nagent = Agent('anthropic:claude-sonnet-4-6')\n\nasync def stream_response():\n    async with agent.run_stream('Write a haiku about Python') as result:\n        async for chunk in result.stream_text():\n            print(chunk, end='', flush=True)\n    print()  # newline\n    print(f\"Total tokens: {result.usage()}\")\n\nasyncio.run(stream_response())\n```\n\n### Step 8: Multi-Turn Conversations\n\n```python\nfrom pydantic_ai import Agent\nfrom pydantic_ai.messages import ModelMessagesTypeAdapter\n\nagent = Agent('openai:gpt-4o', system_prompt='You are a helpful assistant.')\n\n# First turn\nresult1 = agent.run_sync('My name is Alice.')\nhistory = result1.all_messages()\n\n# Second turn — passes conversation history\nresult2 = agent.run_sync('What is my name?', message_history=history)\nprint(result2.data)  # \"Your name is Alice.\"\n```\n\n## Examples\n\n### Example 1: Code Review Agent\n\n```python\nfrom pydantic import BaseModel, Field\nfrom pydantic_ai import Agent\nfrom typing import Literal\n\nclass CodeReview(BaseModel):\n    quality: Literal['excellent', 'good', 'needs_work', 'poor']\n    issues: list[str] = Field(default_factory=list)\n    suggestions: list[str] = Field(default_factory=list)\n    approved: bool\n\ncode_review_agent = Agent(\n    'anthropic:claude-sonnet-4-6',\n    result_type=CodeReview,\n    system_prompt=\"\"\"\n    You are a senior engineer performing code review.\n    Evaluate code quality, identify issues, and provide actionable suggestions.\n    Set approved=True only for good or excellent quality code with no security issues.\n    \"\"\",\n)\n\ndef review_code(diff: str) -> CodeReview:\n    result = code_review_agent.run_sync(f\"Review this code:\\n\\n{diff}\")\n    return result.data\n```\n\n### Example 2: Agent with Retry Logic\n\n```python\nfrom pydantic_ai import Agent, ModelRetry\nfrom pydantic import BaseModel, field_validator\n\nclass StrictJson(BaseModel):\n    value: int\n\n    @field_validator('value')\n    def must_be_positive(cls, v):\n        if v <= 0:\n            raise ValueError('value must be positive')\n        return v\n\nagent = Agent('openai:gpt-4o-mini', result_type=StrictJson)\n\n@agent.result_validator\nasync def validate_result(ctx, result: StrictJson) -> StrictJson:\n    if result.value > 1000:\n        raise ModelRetry('Value must be under 1000. Try again with a smaller number.')\n    return result\n```\n\n### Example 3: Multi-Agent Pipeline\n\n```python\nfrom pydantic_ai import Agent\nfrom pydantic import BaseModel\n\nclass ResearchSummary(BaseModel):\n    key_points: list[str]\n    conclusion: str\n\nclass BlogPost(BaseModel):\n    title: str\n    body: str\n    meta_description: str\n\nresearcher = Agent('openai:gpt-4o', result_type=ResearchSummary)\nwriter = Agent('anthropic:claude-sonnet-4-6', result_type=BlogPost)\n\nasync def research_and_write(topic: str) -> BlogPost:\n    # Stage 1: research\n    research = await researcher.run(f'Research the topic: {topic}')\n\n    # Stage 2: write based on research\n    post = await writer.run(\n        f'Write a blog post about: {topic}\\n\\nResearch:\\n' +\n        '\\n'.join(f'- {p}' for p in research.data.key_points) +\n        f'\\n\\nConclusion: {research.data.conclusion}'\n    )\n    return post.data\n```\n\n## Best Practices\n\n- ✅ Always define `result_type` with a Pydantic model — avoid returning raw strings in production\n- ✅ Use `deps_type` with a dataclass for dependency injection — makes agents testable\n- ✅ Use `TestModel` in unit tests — never hit a real LLM in CI\n- ✅ Add `@agent.result_validator` for business-logic checks beyond Pydantic validation\n- ✅ Use `run_stream` for long outputs in user-facing applications to show progressive results\n- ❌ Don't put secrets (API keys) in `Agent()` arguments — use environment variables\n- ❌ Don't share a single `Agent` instance across async tasks if deps differ — create per-request instances or use `agent.run()` with per-call `deps`\n- ❌ Don't catch `ValidationError` broadly — let PydanticAI retry with `ModelRetry` for recoverable LLM output errors\n\n## Security & Safety Notes\n\n- Set API keys via environment variables (`OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, etc.) — never hardcode them.\n- Validate all tool inputs before passing to external systems — use Pydantic models or manual checks.\n- Tools that mutate data (write to DB, send emails, call payment APIs) should require explicit user confirmation before the agent invokes them in production.\n- Log `result.all_messages()` for audit trails when agents perform consequential actions.\n- Set `retries=` limits on `Agent()` to prevent runaway loops on persistent validation failures.\n\n## Common Pitfalls\n\n- **Problem:** `ValidationError` on every LLM response — structured output never validates\n  **Solution:** Simplify `result_type` fields. Use `Optional` and `default` where appropriate. The model may struggle with overly strict schemas.\n\n- **Problem:** Tool is never called by the LLM\n  **Solution:** Write a clear, specific docstring for the tool function — PydanticAI sends the docstring as the tool description to the LLM.\n\n- **Problem:** `RunContext` dependency is `None` inside a tool\n  **Solution:** Pass `deps=` when calling `agent.run()` or `agent.run_sync()`. Dependencies are not set globally.\n\n- **Problem:** `asyncio.run()` error when calling `agent.run()` inside FastAPI\n  **Solution:** Use `await agent.run()` directly in async FastAPI route handlers — don't wrap in `asyncio.run()`.\n\n## Related Skills\n\n- `@langchain-architecture` — Alternative Python AI framework (more flexible, less type-safe)\n- `@llm-application-dev-ai-assistant` — General LLM application development patterns\n- `@fastapi-templates` — Serving PydanticAI agents via FastAPI endpoints\n- `@agent-orchestration-multi-agent-optimize` — Orchestrating multiple PydanticAI agents\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["pydantic","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity-skills"],"capabilities":["skill","source-sickn33","skill-pydantic-ai","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/pydantic-ai","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34616 github stars · SKILL.md body (11,667 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-23T00:51:26.791Z","embedding":null,"createdAt":"2026-04-18T21:43:02.289Z","updatedAt":"2026-04-23T00:51:26.791Z","lastSeenAt":"2026-04-23T00:51:26.791Z","tsv":"'-123':694 '-6':257,409,764,919,1107 '/10':357 '0':465,472,474,1009 '0.0':314 '1':179,283,865,1120 '10.0':316 '1000':1040,1047 '2':234,975,1131 '2010':345 '3':289,1057 '4':256,363,408,763,918,1106 '4o':326,539,822,1023,1096 '5':490,585 '6':644 '7':746 '8':802 'account':686 'across':81,1249 'action':940,1351 'add':1204 'agent':9,29,37,97,117,145,160,168,237,243,245,250,251,304,321,322,383,402,403,500,512,534,535,553,663,756,757,758,812,817,818,868,879,912,913,976,985,1018,1019,1060,1067,1092,1101,1190,1237,1247,1336,1348,1356,1501,1506,1509,1514 'agent-orchestration-multi-agent-optim':1505 'agent.override':736 'agent.result':1028,1205 'agent.run':268,341,742,771,833,848,1262,1438,1440,1452,1458 'agent.tool':169,369 'ai':3,8,28,96,116,186,196,205,213,221,228,232,241,302,381,510,754,810,877,983,1065,1477,1489 'alic':838,862 'altern':1475 'alway':732,1166 'anthrop':83,206,207,252,404,759,914,1102,1295 'anyth':744 'api':442,1234,1287,1293,1296,1328 'applic':59,1225,1487,1493 'appropri':1387 'approv':908,943 'architectur':1474 'argument':1238 'ask':166,1548 'assert':704,708 'assist':264,829,1490 'async':423,443,561,587,617,765,769,780,1030,1111,1250,1461 'asyncio':477,751 'asyncio.run':479,798,1448,1469 'audit':1345 'avoid':1174 'await':449,579,608,636,1123,1137,1457 'azur':199 'base':58,1133 'basemodel':299,307,388,393,517,528,873,886,990,995,1071,1074,1083 'bash':181 'best':1164 'beyond':1212 'blog':1142 'blogpost':1082,1110,1118 'bodi':1086 'bool':320,532,711,909 'boundari':1556 'bring':44 'broad':1272 'build':4,94,114 'busi':1209 'business-log':1208 'c':397,460,467 'call':119,373,654,1266,1326,1400,1437,1451 'cancel':684 'capit':273 'catch':1270 'chatbot':98 'check':1211,1316 'chunk':782,787 'ci':1203 'citi':394,421,429,438,453 'clarif':1550 'class':305,391,519,526,884,993,1072,1081 'claud':208,254,406,761,916,1104 'claude-sonnet':253,405,760,915,1103 'clear':1407,1523 'client':447,497 'client.get':450 'cls':1005 'code':161,866,910,931,934,951,958,968 'code_review_agent.run':963 'codereview':885,922,961 'common':1365 'concis':266 'conclus':1079 'condit':399,464,471 'config':498 'confirm':1333 'consequenti':1350 'convers':77,806,845 'correct':103 'creat':589,1255 'criteria':1559 'critic':336 'ctx':427,566,591,1034 'ctx.deps.db.create':609 'ctx.deps.db.get':580 'ctx.deps.user':582,614 'current':416,434,463,470,576 'custom':559 'data':124,456,462,469,1320 'databas':495,522 'dataclass':505,507,518,1185 'db':521,628,630,689,1323 'def':424,562,588,618,660,723,766,956,1001,1031,1112 'default':898,905,1385 'defin':1167 'dep':520,541,543,568,593,626,627,639,640,687,688,1181,1253,1267,1435 'depend':19,68,491,1187,1427,1442 'describ':1527 'descript':468,1089,1421 'determinist':714 'dev':1488 'develop':1494 'dict':431,570,599 'diff':959,971 'differ':1254 'direct':1459 'docstr':1409,1417 'email':1325 'end':788 'endpoint':1504 'engin':929 'environ':1240,1290,1539 'environment-specif':1538 'error':1282,1449 'escal':531,664 'etc':1298 'evalu':933 'everi':1370 'exact':702 'exampl':863,864,974,1056 'excel':889,949 'expert':1544 'explicit':1331 'extern':1309 'extra':188 'f':353,359,451,794,965,1125,1139,1151,1158 'face':1224 'factori':899,906 'failur':1364 'fakedb':690 'fastapi':1454,1462,1497,1503 'fastapi-templ':1496 'fetch':432,571 'field':874,897,904,991,998,1381 'film':335 'first':830 'flexibl':1480 'float':313,398,461 'flush':789 'format':454 'framework':38,1478 'fulli':348 'function':1413 'functionmodel':712,721,738 'gemini':85,214,216 'general':1491 'get':415,425,563,629 'global':1446 'good':890,947 'googl':84,215,230 'gpt':325,538,821,1022,1095 'gpt-4o':324,820,1094 'gpt-4o-mini':537,1021 'groq':86,222,223 'guarante':52 'haiku':775 'handl':619 'handler':1464 'hardcod':1300 'help':263,558,828 'histori':565,839,846,855,856 'hit':148,1198 'http':496 'httpx':390 'httpx.asyncclient':445 'id':524,583,595,612,615,622,632,634,692 'identifi':936 'import':242,298,303,382,387,389,476,506,511,516,658,720,750,755,811,815,872,878,882,984,989,1066,1070 'incept':344 'info':727 'initi':600 'inject':20,69,492,493,1188 'input':1305,1553 'insid':1430,1453 'instal':180,183,187,193,202,210,218,225 'instanc':351,1248,1259 'int':311,997 'invok':1337 'isinst':705,709 'issu':894,937,955 'j1':455 'japan':275 'join':1150 'key':1075,1235,1288,1294,1297 'langchain':1473 'langchain-architectur':1472 'less':1481 'let':1273 'limit':584,1354,1515 'list':569,895,900,902,907,1077 'liter':883,888 'llm':57,100,131,151,156,371,653,700,1201,1280,1371,1403,1424,1486,1492 'llm-application-dev-ai-assist':1485 'llm-base':56 'log':1341 'logic':146,979,1210 'long':1219 'loop':1360 'make':1189 'manual':1315 'match':675,1524 'matter':106 'may':1390 'messag':529,624,638,726,841,854,1343 'meta':1088 'mini':540,1024 'minim':236,672 'miss':1561 'mistral':87 'model':24,67,294,667,725,737,740,1173,1313,1389 'modelcontext':722 'modelmessagestypeadapt':816 'modelrespons':729 'modelretri':171,986,1042,1277 'moviereview':306,329,350 'multi':23,75,804,1059,1508 'multi-ag':1058 'multi-model':22 'multi-turn':74,803 'multipl':1512 'must':1002,1013,1044 'mutat':1319 'n':969,970,1146,1148,1149,1159 'name':836,853,860 'nconclus':1160 'need':128,891 'never':1197,1299,1375,1399 'newlin':792 'none':1429 'note':1285 'nresearch':1147 'number':1053 'ollama':89 'openai':82,197,198,200,323,536,819,1020,1093,1292 'optim':1510 'option':1383 'orchestr':1507,1511 'order':564,573,581,594,606,611 'output':18,63,132,291,1220,1281,1374,1533 'over':1393 'overview':32 'p':1152,1154 'part':730 'pass':844,1307,1434 'pattern':1495 'payment':1327 'per':1257,1265 'per-cal':1264 'per-request':1256 'perform':930,1349 'permiss':1554 'persist':1362 'pip':182,192,201,209,217,224 'pipelin':101,1061 'pitfal':1366 'plain':248 'point':1076,1157 'poor':893 'posit':1004,1015 'post':1136,1143 'post.data':1163 'practic':1165 'prevent':1358 'print':276,279,352,358,487,786,791,793,857 'problem':1367,1396,1425,1447 'product':6,95,1179,1340 'production-readi':5 'progress':1228 'prompt':259,331,414,548,824,924 'provid':157,191,939 'put':1232 'pydant':2,41,54,66,185,195,204,212,220,227,240,293,297,301,380,386,509,515,753,809,871,876,982,988,1064,1069,1172,1213,1312 'pydantic-ai':1,184,194,203,211,219,226 'pydantic_ai.messages':814 'pydantic_ai.models.function':719 'pydantic_ai.models.test':657 'pydanticai':11,26,33,1274,1414,1500,1513 'python':31,36,115,238,295,378,503,655,717,749,777,807,869,980,1062,1476 'qualiti':887,935,950 'r':448 'r.json':457 'rais':1010,1041 'rate':312 'raw':134,1176 'readi':7 'real':150,652,1200 'reason':597,613 'recent':572 'recommend':319,360 'recover':1279 'refund':590,602,610 'regist':366 'relat':1470 'request':282,284,420,1258 'requir':1330,1552 'research':1091,1113,1121,1122,1126,1135 'research.data.conclusion':1161 'research.data.key':1156 'researcher.run':1124 'researchsummari':1073,1099 'respons':73,286,674,716,734,748,768,800,1372 'result':173,267,327,340,410,478,544,635,676,678,741,779,920,962,1025,1033,1035,1055,1097,1108,1168,1229,1379 'result.all':1342 'result.data':277,347,488,642,706,973 'result.data.escalate':710 'result.stream':784 'result.usage':280,797 'result.value':1039 'result1':832 'result1.all':840 'result2':847 'result2.data':858 'retri':978,1275,1353 'return':122,246,337,458,578,607,641,670,728,972,1016,1054,1162,1175 'review':339,343,346,867,911,932,957,966,1545 'review.rating':356 'review.recommended':361 'review.title':354 'review.year':355 'rewrit':159 'rout':1463 'run':377,1216 'runaway':1359 'runcontext':170,384,428,513,567,592,1426 'safe':14,1484 'safeti':49,1284,1555 'schema':1395 'scope':1526 'second':842 'secret':1233 'secur':954,1283 'send':1324,1415 'senior':928 'serv':1499 'servic':494 'set':942,1286,1352,1445 'share':1244 'show':1227 'simpl':244 'simplifi':1378 'singl':1246 'skill':92,111,1471,1518 'skill-pydantic-ai' 'smaller':1052 'solut':1377,1404,1433,1455 'sonnet':255,407,762,917,1105 'source-sickn33' 'specif':190,605,1408,1540 'stage':1119,1130 'step':178,233,288,362,489,643,745,801 'stop':1546 'str':309,318,395,400,430,525,530,596,598,623,625,896,903,960,1078,1080,1085,1087,1090,1117 'stream':72,747,767,772,799,1217 'strict':1394 'strictjson':994,1027,1036,1037 'string':135,249,1177 'structur':17,62,123,290,338,697,1373 'struggl':1391 'substitut':1536 'success':1558 'suggest':901,941 'summari':317 'support':25,61,533,552,620,662 'support_agent.override':666 'support_agent.run':637,679 'support_agent.tool':560,586 'supportrespons':527,546,707 'switch':154 'sync':269,342,680,743,834,849,964,1441 'system':258,330,413,547,823,923,1310 'task':1251,1522 'team':42 'temp':459,466 'temperatur':396,426,435 'templat':1498 'test':143,645,650,661,695,715,1196,1542 'testabl':71,105,502,1191 'testmodel':647,659,668,669,1193 'text':785 'textpart':731 'titl':308,1084 'token':285,287,796 'tokyo':278,486 'tool':15,79,120,364,367,556,1304,1317,1397,1412,1420,1432 'topic':1116,1128,1129,1145 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'total':795 'trail':1346 'treat':1531 'tri':1048 'true':790,944 'turn':76,805,831,843 'type':13,27,48,130,174,328,349,411,542,545,677,881,921,1026,1098,1109,1169,1182,1380,1483 'type-saf':12,1482 'type-safeti':47 'unit':142,649,1195 'usag':281,616 'use':16,80,90,109,112,125,136,152,162,365,554,1180,1192,1215,1239,1261,1311,1382,1456,1516 'user':165,523,577,621,631,633,691,693,1223,1332 'user-fac':1222 'v':1006,1008,1017 'valid':51,64,129,673,992,999,1029,1032,1206,1214,1302,1363,1376,1541 'validationerror':1271,1368 'valu':475,996,1000,1012,1043 'valueerror':1011 'variabl':1241,1291 'vertex':231 'vertexai':229 'via':1289,1502 'want':139,682 'weather':401,417,441,484 'weather_agent.run':480 'weather_agent.tool':422 'weatherdesc':473 'weatherreport':392,412 'without':147,158,651 'word':703 'work':177,892 'wrap':1467 'write':141,648,773,1115,1132,1140,1321,1405 'writer':1100 'writer.run':1138 'wttr.in':452 'year':310","prices":[{"id":"4223f3ed-8166-40ed-8586-24569f292d0f","listingId":"7e409ab2-c24f-48b6-b0fa-b6274175d7db","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:43:02.289Z"}],"sources":[{"listingId":"7e409ab2-c24f-48b6-b0fa-b6274175d7db","source":"github","sourceId":"sickn33/antigravity-awesome-skills/pydantic-ai","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/pydantic-ai","isPrimary":false,"firstSeenAt":"2026-04-18T21:43:02.289Z","lastSeenAt":"2026-04-23T00:51:26.791Z"}],"details":{"listingId":"7e409ab2-c24f-48b6-b0fa-b6274175d7db","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"pydantic-ai","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34616,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-22T06:40:00Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"7023fd49be27fd6bb6cf1756283380b1915cb876","skill_md_path":"skills/pydantic-ai/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/pydantic-ai"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"pydantic-ai","description":"Build production-ready AI agents with PydanticAI — type-safe tool use, structured outputs, dependency injection, and multi-model support."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/pydantic-ai"},"updatedAt":"2026-04-23T00:51:26.791Z"}}