[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EE8E4JDY792CMPKJE8F2AE":3,"skill-same:01M6EE8E4JDY792CMPKJE8F2AE":48},{"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":21,"linkOnly":22,"markdownContent":23,"markdownBody":23,"frontMatter":24,"refName":25,"commitSha":26,"skillDirectory":27,"forksCount":28,"repositoryHtmlUrl":29,"repositoryHomepageUrl":30,"ownerHtmlUrl":31,"ownerBlogUrl":6,"ownerDescription":32,"updatedAt":33,"install":34,"resources":47},"01M6EE8E4JDY792CMPKJE8F2AE","a2a-sdk",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",66,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Fa2a-sdk\u002FSKILL.md",[],[18,19,20],"a2a","sdk","a2a sdk","2026-11-10 10:12:30",false,"# A2A SDK — Agent-to-Agent Protocol\n\nYou are an expert in the A2A (Agent-to-Agent) Protocol, Google's open standard for inter-agent communication. You help developers build agents that discover, communicate, and delegate tasks to other agents across organizations and platforms — with agent cards for capability discovery, task lifecycle management, streaming updates, and push notifications, enabling a web of interoperable AI agents.\n\n## Core Capabilities\n\n### Agent Card (Discovery)\n\n```json\n\u002F\u002F .well-known\u002Fagent.json — Describes agent capabilities\n{\n  \"name\": \"Invoice Processing Agent\",\n  \"description\": \"Processes invoices, extracts data, and routes to accounting systems\",\n  \"url\": \"https:\u002F\u002Finvoices.example.com\u002Fa2a\",\n  \"version\": \"1.0.0\",\n  \"capabilities\": {\n    \"streaming\": true,\n    \"pushNotifications\": true,\n    \"stateTransitionHistory\": true\n  },\n  \"skills\": [\n    {\n      \"id\": \"extract-invoice\",\n      \"name\": \"Extract Invoice Data\",\n      \"description\": \"Extract structured data from PDF\u002Fimage invoices\",\n      \"tags\": [\"ocr\", \"extraction\", \"accounting\"],\n      \"examples\": [\"Process this invoice and extract the total, vendor, and line items\"]\n    },\n    {\n      \"id\": \"validate-invoice\",\n      \"name\": \"Validate Invoice\",\n      \"description\": \"Validate invoice data against PO and contracts\",\n      \"tags\": [\"validation\", \"compliance\"]\n    }\n  ],\n  \"authentication\": {\n    \"schemes\": [\"bearer\"]\n  }\n}\n```\n\n### A2A Server (Python)\n\n```python\n# server.py — A2A-compatible agent server\nfrom a2a.server import A2AServer, TaskHandler\nfrom a2a.types import Task, TaskState, Message, TextPart, DataPart\n\nclass InvoiceAgent(TaskHandler):\n    async def on_message(self, task: Task, message: Message) -> Task:\n        \"\"\"Handle incoming task messages.\"\"\"\n        user_text = next(\n            (p.text for p in message.parts if isinstance(p, TextPart)), \"\"\n        )\n\n        if \"extract\" in user_text.lower():\n            # Process invoice\n            task.state = TaskState.WORKING\n\n            # Get attached file\n            file_data = next(\n                (p for p in message.parts if isinstance(p, DataPart)), None\n            )\n\n            if file_data:\n                extracted = await self.extract_invoice(file_data.data)\n                task.add_message(Message(\n                    role=\"agent\",\n                    parts=[\n                        TextPart(text=f\"Extracted invoice data from {extracted['vendor']}\"),\n                        DataPart(\n                            data=extracted,\n                            mimeType=\"application\u002Fjson\",\n                        ),\n                    ],\n                ))\n                task.state = TaskState.COMPLETED\n            else:\n                task.add_message(Message(\n                    role=\"agent\",\n                    parts=[TextPart(text=\"Please attach an invoice file (PDF or image).\")],\n                ))\n                task.state = TaskState.INPUT_REQUIRED\n\n        return task\n\n    async def extract_invoice(self, file_data: bytes) -> dict:\n        \"\"\"OCR + LLM extraction pipeline.\"\"\"\n        text = await ocr_extract(file_data)\n        structured = await llm_extract(text)\n        return structured\n\nserver = A2AServer(handler=InvoiceAgent())\nserver.run(port=8080)\n```\n\n### A2A Client (Calling Other Agents)\n\n```python\n# client.py — Discover and call external agents\nfrom a2a.client import A2AClient\n\n# Discover agent capabilities\nclient = A2AClient(\"https:\u002F\u002Finvoices.example.com\")\nagent_card = await client.get_agent_card()\nprint(f\"Agent: {agent_card.name}\")\nprint(f\"Skills: {[s.name for s in agent_card.skills]}\")\n\n# Send task\ntask = await client.send_task(\n    message=Message(\n        role=\"user\",\n        parts=[\n            TextPart(text=\"Extract data from this invoice\"),\n            DataPart(data=invoice_bytes, mimeType=\"application\u002Fpdf\"),\n        ],\n    ),\n)\n\n# Poll for completion (or use streaming)\nwhile task.state not in (TaskState.COMPLETED, TaskState.FAILED):\n    task = await client.get_task(task.id)\n    await asyncio.sleep(1)\n\n# Get results\nfor msg in task.messages:\n    for part in msg.parts:\n        if isinstance(part, DataPart):\n            print(f\"Extracted data: {part.data}\")\n\n# Streaming\nasync for event in client.send_task_streaming(message=message):\n    if event.type == \"message\":\n        print(event.message.parts[0].text)\n    elif event.type == \"state_change\":\n        print(f\"State: {event.state}\")\n```\n\n### Multi-Agent Orchestration\n\n```python\n# orchestrator.py — Coordinate multiple A2A agents\nasync def process_invoice_pipeline(invoice_bytes: bytes):\n    # Agent 1: Extract invoice data\n    extractor = A2AClient(\"https:\u002F\u002Finvoices.example.com\")\n    extraction_task = await extractor.send_task(\n        message=Message(role=\"user\", parts=[\n            TextPart(text=\"Extract all data from this invoice\"),\n            DataPart(data=invoice_bytes, mimeType=\"application\u002Fpdf\"),\n        ]),\n    )\n    extracted_data = await wait_for_completion(extraction_task)\n\n    # Agent 2: Validate against PO\n    validator = A2AClient(\"https:\u002F\u002Fvalidation.example.com\")\n    validation_task = await validator.send_task(\n        message=Message(role=\"user\", parts=[\n            TextPart(text=\"Validate this invoice against purchase orders\"),\n            DataPart(data=extracted_data, mimeType=\"application\u002Fjson\"),\n        ]),\n    )\n    validation_result = await wait_for_completion(validation_task)\n\n    # Agent 3: Route to accounting\n    if validation_result[\"valid\"]:\n        accounting = A2AClient(\"https:\u002F\u002Faccounting.example.com\")\n        await accounting.send_task(\n            message=Message(role=\"user\", parts=[\n                TextPart(text=\"Book this validated invoice\"),\n                DataPart(data=extracted_data, mimeType=\"application\u002Fjson\"),\n            ]),\n        )\n```\n\n## Installation\n\n```bash\npip install a2a-sdk\n# Or build from Google's spec: https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fa2a-protocol\n```\n\n## Best Practices\n\n1. **Agent cards** — Publish `\u002F.well-known\u002Fagent.json` with clear skill descriptions; enables automatic discovery\n2. **Task lifecycle** — Use proper states: SUBMITTED → WORKING → COMPLETED\u002FFAILED\u002FINPUT_REQUIRED\n3. **Streaming** — Enable streaming for long tasks; clients get real-time progress updates\n4. **Multi-part messages** — Use TextPart for instructions, DataPart for structured data\u002Ffiles; separate concerns\n5. **Authentication** — Support bearer tokens; agents calling your agent need proper credentials\n6. **Idempotent tasks** — Tasks have unique IDs; handle duplicate submissions gracefully\n7. **Push notifications** — Configure push for async tasks; agent notifies client when complete\n8. **Composable pipelines** — Chain agents: extraction → validation → booking; each agent is independent and reusable\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002FTerminalSkills\u002Fskills\u002Fa2a-sdk",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":35,"prompt":45,"zipAvailable":46},[36,39,42],{"tool":37,"command":38},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill a2a-sdk",{"tool":40,"command":41},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill a2a-sdk",{"tool":43,"command":44},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill a2a-sdk","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Fa2a-sdk\u002FSKILL.md",true,[],[49,63,73,81,87,94],{"skillNo":50,"name":51,"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":52,"categories":53,"keywords":59,"publishedAt":21},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[54],{"categoryNo":55,"categoryName":56,"taxonomyType":57,"taxonomyTypeDesc":58},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[60,61,62],"model","model hierarchy","model hierarchy skill",{"skillNo":64,"name":65,"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":66,"categories":67,"keywords":69,"publishedAt":21},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[68],{"categoryNo":55,"categoryName":56,"taxonomyType":57,"taxonomyTypeDesc":58},[70,71,72],"MCP","zoom","zoom mcp",{"skillNo":74,"name":75,"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":76,"categories":77,"keywords":78,"publishedAt":21},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[19,79,80,71],"zoom apps sdk","apps",{"skillNo":82,"name":83,"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":84,"categories":85,"keywords":86,"publishedAt":21},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[83],{"skillNo":88,"name":89,"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":90,"categories":91,"keywords":93,"publishedAt":21},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[92],{"categoryNo":55,"categoryName":56,"taxonomyType":57,"taxonomyTypeDesc":58},[89],{"skillNo":95,"name":96,"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":97,"categories":98,"keywords":99,"publishedAt":21},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[96]]