[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EFYNEARDQCTHDH90ESRKXT":3,"skill-same:01M6EFYNEARDQCTHDH90ESRKXT":46},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":21,"frontMatter":22,"refName":23,"commitSha":24,"skillDirectory":25,"forksCount":26,"repositoryHtmlUrl":27,"repositoryHomepageUrl":28,"ownerHtmlUrl":29,"ownerBlogUrl":6,"ownerDescription":30,"updatedAt":31,"install":32,"resources":45},"01M6EFYNEARDQCTHDH90ESRKXT","pydantic",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Fpydantic\u002FSKILL.md",[],[18],"Pydantic","2026-11-10 10:12:30",false,"# Pydantic\n\n## Overview\n\nPydantic is a data validation library that uses Python type hints. Define a model class, and Pydantic validates inputs, coerces types, and serializes outputs automatically. Used by FastAPI, LangChain, and most modern Python frameworks.\n\n## Instructions\n\n### Step 1: Basic Models\n\n```python\n# schemas.py — Data models with validation\nfrom pydantic import BaseModel, Field, EmailStr, field_validator\nfrom datetime import datetime\n\nclass UserCreate(BaseModel):\n    name: str = Field(min_length=2, max_length=100)\n    email: EmailStr\n    age: int = Field(ge=13, le=120)\n    role: str = Field(default=\"member\", pattern=\"^(admin|member|viewer)$\")\n\nclass UserResponse(BaseModel):\n    id: str\n    name: str\n    email: str\n    role: str\n    created_at: datetime\n\n    model_config = {\"from_attributes\": True}    # works with ORM objects\n\n# Usage\nuser = UserCreate(name=\"Alice\", email=\"alice@example.com\", age=28)\nprint(user.model_dump())            # {\"name\": \"Alice\", \"email\": \"alice@example.com\", ...}\nprint(user.model_dump_json())       # JSON string\n\n# Validation error\ntry:\n    UserCreate(name=\"A\", email=\"not-an-email\", age=5)\nexcept ValidationError as e:\n    print(e.errors())\n    # [{\"type\": \"string_too_short\", \"loc\": [\"name\"], ...}, ...]\n```\n\n### Step 2: Custom Validators\n\n```python\nfrom pydantic import BaseModel, field_validator, model_validator\n\nclass ProjectCreate(BaseModel):\n    name: str\n    slug: str\n    start_date: datetime\n    end_date: datetime | None = None\n\n    @field_validator(\"slug\")\n    @classmethod\n    def validate_slug(cls, v: str) -> str:\n        if not v.replace(\"-\", \"\").isalnum():\n            raise ValueError(\"Slug must contain only letters, numbers, and hyphens\")\n        return v.lower()\n\n    @model_validator(mode=\"after\")\n    def validate_dates(self):\n        if self.end_date and self.end_date \u003C= self.start_date:\n            raise ValueError(\"End date must be after start date\")\n        return self\n```\n\n### Step 3: Settings from Environment\n\n```python\n# config.py — App configuration from env vars\nfrom pydantic_settings import BaseSettings\n\nclass Settings(BaseSettings):\n    database_url: str\n    redis_url: str = \"redis:\u002F\u002Flocalhost:6379\"\n    secret_key: str\n    debug: bool = False\n    allowed_origins: list[str] = [\"http:\u002F\u002Flocalhost:3000\"]\n    max_upload_mb: int = 10\n\n    model_config = {\n        \"env_file\": \".env\",\n        \"env_file_encoding\": \"utf-8\",\n    }\n\nsettings = Settings()   # auto-reads from .env and environment variables\n```\n\n### Step 4: Discriminated Unions\n\n```python\n# events.py — Polymorphic event types\nfrom pydantic import BaseModel\nfrom typing import Literal\n\nclass TaskCreated(BaseModel):\n    type: Literal[\"task.created\"] = \"task.created\"\n    task_id: str\n    project_id: str\n    title: str\n\nclass TaskCompleted(BaseModel):\n    type: Literal[\"task.completed\"] = \"task.completed\"\n    task_id: str\n    completed_by: str\n    duration_hours: float\n\nclass CommentAdded(BaseModel):\n    type: Literal[\"comment.added\"] = \"comment.added\"\n    comment_id: str\n    task_id: str\n    body: str\n\n# Discriminated union — Pydantic picks the right type based on \"type\" field\nWebhookEvent = TaskCreated | TaskCompleted | CommentAdded\n\n# Parse any event\nevent = WebhookEvent.model_validate({\"type\": \"task.completed\", \"task_id\": \"123\", ...})\n# Returns TaskCompleted instance\n```\n\n## Guidelines\n\n- Pydantic v2 is 5-50x faster than v1 — rewritten in Rust (pydantic-core).\n- Use `Field(...)` for constraints: `min_length`, `max_length`, `ge`, `le`, `pattern`.\n- `from_attributes = True` enables direct serialization of ORM objects (SQLAlchemy, Django).\n- Use `pydantic-settings` for type-safe configuration from environment variables.\n- Discriminated unions handle polymorphic data — Pydantic picks the right model based on a field value.\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002FTerminalSkills\u002Fskills\u002Fpydantic",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":7,"skillName":5,"commands":33,"prompt":43,"zipAvailable":44},[34,37,40],{"tool":35,"command":36},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill pydantic",{"tool":38,"command":39},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill pydantic",{"tool":41,"command":42},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill pydantic","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Fpydantic\u002FSKILL.md",true,[],[47,61,71,80,86,93],{"skillNo":48,"name":49,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":50,"categories":51,"keywords":57,"publishedAt":19},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[52],{"categoryNo":53,"categoryName":54,"taxonomyType":55,"taxonomyTypeDesc":56},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[58,59,60],"model","model hierarchy","model hierarchy skill",{"skillNo":62,"name":63,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":64,"categories":65,"keywords":67,"publishedAt":19},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[66],{"categoryNo":53,"categoryName":54,"taxonomyType":55,"taxonomyTypeDesc":56},[68,69,70],"MCP","zoom","zoom mcp",{"skillNo":72,"name":73,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":76,"publishedAt":19},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[77,78,79,69],"sdk","zoom apps sdk","apps",{"skillNo":81,"name":82,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":85,"publishedAt":19},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[82],{"skillNo":87,"name":88,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":92,"publishedAt":19},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[91],{"categoryNo":53,"categoryName":54,"taxonomyType":55,"taxonomyTypeDesc":56},[88],{"skillNo":94,"name":95,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":98,"publishedAt":19},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[95]]