[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EM4S7DBNA8CDY1BDJDMRPZ":3,"skill-same:01M6EM4S7DBNA8CDY1BDJDMRPZ":83},{"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":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":49,"ownerHtmlUrl":50,"ownerBlogUrl":6,"ownerDescription":51,"updatedAt":52,"install":53,"resources":66},"01M6EM4S7DBNA8CDY1BDJDMRPZ","streaming-llm-responses",null,"Implement real-time streaming UI patterns for AI chat applications. Use when adding response\nlifecycle handlers, progress indicators, client effects, or thread state synchronization.\nCovers onResponseStart\u002FEnd, onEffect, ProgressUpdateEvent, and client tools.\nNOT when building basic chat without real-time feedback.","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\u002Faiskillstore\u002Fmarketplace\u002Fasmayaseen\u002Fstreaming-llm-responses\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"streaming llm responses","streaming","synchronization","client","progress","basic","end","time","chat","patterns","use","implement","feedback","lifecycle","applications","indicators","real-time","Tools","ui","state","2026-11-10 10:12:30",false,"---\r\nname: streaming-llm-responses\r\ndescription: |\r\n  Implement real-time streaming UI patterns for AI chat applications. Use when adding response\r\n  lifecycle handlers, progress indicators, client effects, or thread state synchronization.\r\n  Covers onResponseStart\u002FEnd, onEffect, ProgressUpdateEvent, and client tools.\r\n  NOT when building basic chat without real-time feedback.\r\n---\r\n\r\n# Streaming LLM Responses\r\n\r\nBuild responsive, real-time chat interfaces with streaming feedback.\r\n\r\n## Quick Start\r\n\r\n```typescript\r\nimport { useChatKit } from \"@openai\u002Fchatkit-react\";\r\n\r\nconst chatkit = useChatKit({\r\n  api: { url: API_URL, domainKey: DOMAIN_KEY },\r\n\r\n  onResponseStart: () => setIsResponding(true),\r\n  onResponseEnd: () => setIsResponding(false),\r\n\r\n  onEffect: ({ name, data }) => {\r\n    if (name === \"update_status\") updateUI(data);\r\n  },\r\n});\r\n```\r\n\r\n---\r\n\r\n## Response Lifecycle\r\n\r\n```\r\nUser sends message\r\n    ↓\r\nonResponseStart() fires\r\n    ↓\r\n[Streaming: tokens arrive, ProgressUpdateEvents shown]\r\n    ↓\r\nonResponseEnd() fires\r\n    ↓\r\nUI unlocks, ready for next interaction\r\n```\r\n\r\n---\r\n\r\n## Core Patterns\r\n\r\n### 1. Response Lifecycle Handlers\r\n\r\nLock UI during AI response to prevent race conditions:\r\n\r\n```typescript\r\nfunction ChatWithLifecycle() {\r\n  const [isResponding, setIsResponding] = useState(false);\r\n  const lockInteraction = useAppStore((s) => s.lockInteraction);\r\n  const unlockInteraction = useAppStore((s) => s.unlockInteraction);\r\n\r\n  const chatkit = useChatKit({\r\n    api: { url: API_URL, domainKey: DOMAIN_KEY },\r\n\r\n    onResponseStart: () => {\r\n      setIsResponding(true);\r\n      lockInteraction(); \u002F\u002F Disable map\u002Fcanvas\u002Fform interactions\r\n    },\r\n\r\n    onResponseEnd: () => {\r\n      setIsResponding(false);\r\n      unlockInteraction();\r\n    },\r\n\r\n    onError: ({ error }) => {\r\n      console.error(\"ChatKit error:\", error);\r\n      setIsResponding(false);\r\n      unlockInteraction();\r\n    },\r\n  });\r\n\r\n  return (\r\n    \u003Cdiv>\r\n      {isResponding && \u003CLoadingOverlay \u002F>}\r\n      \u003CChatKit control={chatkit.control} \u002F>\r\n    \u003C\u002Fdiv>\r\n  );\r\n}\r\n```\r\n\r\n### 2. Client Effects (Fire-and-Forget)\r\n\r\nServer sends effects to update client UI without expecting a response:\r\n\r\n**Backend - Streaming Effects:**\r\n\r\n```python\r\nfrom chatkit.types import ClientEffectEvent\r\n\r\nasync def respond(self, thread, item, context):\r\n    # ... agent processing ...\r\n\r\n    # Fire client effect to update UI\r\n    yield ClientEffectEvent(\r\n        name=\"update_status\",\r\n        data={\r\n            \"state\": {\"energy\": 80, \"happiness\": 90},\r\n            \"flash\": \"Status updated!\"\r\n        }\r\n    )\r\n\r\n    # Another effect\r\n    yield ClientEffectEvent(\r\n        name=\"show_notification\",\r\n        data={\"message\": \"Task completed!\"}\r\n    )\r\n```\r\n\r\n**Frontend - Handling Effects:**\r\n\r\n```typescript\r\nconst chatkit = useChatKit({\r\n  api: { url: API_URL, domainKey: DOMAIN_KEY },\r\n\r\n  onEffect: ({ name, data }) => {\r\n    switch (name) {\r\n      case \"update_status\":\r\n        applyStatusUpdate(data.state);\r\n        if (data.flash) setFlashMessage(data.flash);\r\n        break;\r\n\r\n      case \"add_marker\":\r\n        addMapMarker(data);\r\n        break;\r\n\r\n      case \"select_mode\":\r\n        setSelectionMode(data.mode);\r\n        break;\r\n    }\r\n  },\r\n});\r\n```\r\n\r\n### 3. Progress Updates\r\n\r\nShow \"Searching...\", \"Loading...\", \"Analyzing...\" during long operations:\r\n\r\n```python\r\nfrom chatkit.types import ProgressUpdateEvent\r\n\r\n@function_tool\r\nasync def search_articles(ctx: AgentContext, query: str) -> str:\r\n    \"\"\"Search for articles matching the query.\"\"\"\r\n\r\n    yield ProgressUpdateEvent(message=\"Searching articles...\")\r\n\r\n    results = await article_store.search(query)\r\n\r\n    yield ProgressUpdateEvent(message=f\"Found {len(results)} articles...\")\r\n\r\n    for i, article in enumerate(results):\r\n        if i % 5 == 0:\r\n            yield ProgressUpdateEvent(\r\n                message=f\"Processing article {i+1}\u002F{len(results)}...\"\r\n            )\r\n\r\n    return format_results(results)\r\n```\r\n\r\n### 4. Thread Lifecycle Events\r\n\r\nTrack thread changes for persistence and UI updates:\r\n\r\n```typescript\r\nconst chatkit = useChatKit({\r\n  api: { url: API_URL, domainKey: DOMAIN_KEY },\r\n\r\n  onThreadChange: ({ threadId }) => {\r\n    setThreadId(threadId);\r\n    if (threadId) localStorage.setItem(\"lastThreadId\", threadId);\r\n    clearSelections();\r\n  },\r\n\r\n  onThreadLoadStart: ({ threadId }) => {\r\n    setIsLoadingThread(true);\r\n  },\r\n\r\n  onThreadLoadEnd: ({ threadId }) => {\r\n    setIsLoadingThread(false);\r\n  },\r\n});\r\n```\r\n\r\n### 5. Client Tools (State Query)\r\n\r\nAI needs to read client-side state to make decisions:\r\n\r\n**Backend - Defining Client Tool:**\r\n\r\n```python\r\n@function_tool(name_override=\"get_selected_items\")\r\nasync def get_selected_items(ctx: AgentContext) -> dict:\r\n    \"\"\"Get the items currently selected on the canvas.\r\n\r\n    This is a CLIENT TOOL - executed in browser, result comes back.\r\n    \"\"\"\r\n    yield ProgressUpdateEvent(message=\"Reading selection...\")\r\n    pass  # Actual execution happens on client\r\n```\r\n\r\n**Frontend - Handling Client Tools:**\r\n\r\n```typescript\r\nconst chatkit = useChatKit({\r\n  api: { url: API_URL, domainKey: DOMAIN_KEY },\r\n\r\n  onClientTool: ({ name, params }) => {\r\n    switch (name) {\r\n      case \"get_selected_items\":\r\n        return { itemIds: selectedItemIds };\r\n\r\n      case \"get_current_viewport\":\r\n        return {\r\n          center: mapRef.current.getCenter(),\r\n          zoom: mapRef.current.getZoom(),\r\n        };\r\n\r\n      case \"get_form_data\":\r\n        return { values: formRef.current.getValues() };\r\n\r\n      default:\r\n        throw new Error(`Unknown client tool: ${name}`);\r\n    }\r\n  },\r\n});\r\n```\r\n\r\n---\r\n\r\n## Client Effects vs Client Tools\r\n\r\n| Type | Direction | Response Required | Use Case |\r\n|------|-----------|-------------------|----------|\r\n| **Client Effect** | Server → Client | No (fire-and-forget) | Update UI, show notifications |\r\n| **Client Tool** | Server → Client → Server | Yes (return value) | Get client state for AI decision |\r\n\r\n---\r\n\r\n## Common Patterns by Use Case\r\n\r\n### Interactive Map\u002FCanvas\r\n\r\n```typescript\r\nonResponseStart: () => lockCanvas(),\r\nonResponseEnd: () => unlockCanvas(),\r\nonEffect: ({ name, data }) => {\r\n  if (name === \"add_marker\") addMarker(data);\r\n  if (name === \"pan_to\") panTo(data.location);\r\n},\r\nonClientTool: ({ name }) => {\r\n  if (name === \"get_selection\") return getSelectedItems();\r\n},\r\n```\r\n\r\n### Form-Based UI\r\n\r\n```typescript\r\nonResponseStart: () => setFormDisabled(true),\r\nonResponseEnd: () => setFormDisabled(false),\r\nonClientTool: ({ name }) => {\r\n  if (name === \"get_form_values\") return form.getValues();\r\n},\r\n```\r\n\r\n### Game\u002FSimulation\r\n\r\n```typescript\r\nonResponseStart: () => pauseSimulation(),\r\nonResponseEnd: () => resumeSimulation(),\r\nonEffect: ({ name, data }) => {\r\n  if (name === \"update_entity\") updateEntity(data);\r\n  if (name === \"show_notification\") showToast(data.message);\r\n},\r\n```\r\n\r\n---\r\n\r\n## Thread Title Generation\r\n\r\nDynamically update thread title based on conversation:\r\n\r\n```python\r\nclass TitleAgent:\r\n    async def generate_title(self, first_message: str) -> str:\r\n        result = await Runner.run(\r\n            Agent(\r\n                name=\"TitleGenerator\",\r\n                instructions=\"Generate a 3-5 word title.\",\r\n                model=\"gpt-4o-mini\",  # Fast model\r\n            ),\r\n            input=f\"First message: {first_message}\",\r\n        )\r\n        return result.final_output\r\n\r\n# In ChatKitServer\r\nasync def respond(self, thread, item, context):\r\n    if not thread.title and item:\r\n        title = await self.title_agent.generate_title(item.content)\r\n        thread.title = title\r\n        await self.store.save_thread(thread, context)\r\n```\r\n\r\n---\r\n\r\n## Anti-Patterns\r\n\r\n1. **Not locking UI during response** - Leads to race conditions\r\n2. **Blocking in effects** - Effects should be fire-and-forget\r\n3. **Heavy computation in onEffect** - Use requestAnimationFrame for DOM updates\r\n4. **Missing error handling** - Always handle onError to unlock UI\r\n5. **Not persisting thread state** - Use onThreadChange to save context\r\n\r\n---\r\n\r\n## Verification\r\n\r\nRun: `python3 scripts\u002Fverify.py`\r\n\r\nExpected: `✓ streaming-llm-responses skill ready`\r\n\r\n## If Verification Fails\r\n\r\n1. Check: references\u002F folder has streaming-patterns.md\r\n2. **Stop and report** if still failing\r\n\r\n## References\r\n\r\n- [references\u002Fstreaming-patterns.md](references\u002Fstreaming-patterns.md) - Complete streaming configuration","# Streaming LLM Responses\r\n\r\nBuild responsive, real-time chat interfaces with streaming feedback.\r\n\r\n## Quick Start\r\n\r\n```typescript\r\nimport { useChatKit } from \"@openai\u002Fchatkit-react\";\r\n\r\nconst chatkit = useChatKit({\r\n  api: { url: API_URL, domainKey: DOMAIN_KEY },\r\n\r\n  onResponseStart: () => setIsResponding(true),\r\n  onResponseEnd: () => setIsResponding(false),\r\n\r\n  onEffect: ({ name, data }) => {\r\n    if (name === \"update_status\") updateUI(data);\r\n  },\r\n});\r\n```\r\n\r\n---\r\n\r\n## Response Lifecycle\r\n\r\n```\r\nUser sends message\r\n    ↓\r\nonResponseStart() fires\r\n    ↓\r\n[Streaming: tokens arrive, ProgressUpdateEvents shown]\r\n    ↓\r\nonResponseEnd() fires\r\n    ↓\r\nUI unlocks, ready for next interaction\r\n```\r\n\r\n---\r\n\r\n## Core Patterns\r\n\r\n### 1. Response Lifecycle Handlers\r\n\r\nLock UI during AI response to prevent race conditions:\r\n\r\n```typescript\r\nfunction ChatWithLifecycle() {\r\n  const [isResponding, setIsResponding] = useState(false);\r\n  const lockInteraction = useAppStore((s) => s.lockInteraction);\r\n  const unlockInteraction = useAppStore((s) => s.unlockInteraction);\r\n\r\n  const chatkit = useChatKit({\r\n    api: { url: API_URL, domainKey: DOMAIN_KEY },\r\n\r\n    onResponseStart: () => {\r\n      setIsResponding(true);\r\n      lockInteraction(); \u002F\u002F Disable map\u002Fcanvas\u002Fform interactions\r\n    },\r\n\r\n    onResponseEnd: () => {\r\n      setIsResponding(false);\r\n      unlockInteraction();\r\n    },\r\n\r\n    onError: ({ error }) => {\r\n      console.error(\"ChatKit error:\", error);\r\n      setIsResponding(false);\r\n      unlockInteraction();\r\n    },\r\n  });\r\n\r\n  return (\r\n    \u003Cdiv>\r\n      {isResponding && \u003CLoadingOverlay \u002F>}\r\n      \u003CChatKit control={chatkit.control} \u002F>\r\n    \u003C\u002Fdiv>\r\n  );\r\n}\r\n```\r\n\r\n### 2. Client Effects (Fire-and-Forget)\r\n\r\nServer sends effects to update client UI without expecting a response:\r\n\r\n**Backend - Streaming Effects:**\r\n\r\n```python\r\nfrom chatkit.types import ClientEffectEvent\r\n\r\nasync def respond(self, thread, item, context):\r\n    # ... agent processing ...\r\n\r\n    # Fire client effect to update UI\r\n    yield ClientEffectEvent(\r\n        name=\"update_status\",\r\n        data={\r\n            \"state\": {\"energy\": 80, \"happiness\": 90},\r\n            \"flash\": \"Status updated!\"\r\n        }\r\n    )\r\n\r\n    # Another effect\r\n    yield ClientEffectEvent(\r\n        name=\"show_notification\",\r\n        data={\"message\": \"Task completed!\"}\r\n    )\r\n```\r\n\r\n**Frontend - Handling Effects:**\r\n\r\n```typescript\r\nconst chatkit = useChatKit({\r\n  api: { url: API_URL, domainKey: DOMAIN_KEY },\r\n\r\n  onEffect: ({ name, data }) => {\r\n    switch (name) {\r\n      case \"update_status\":\r\n        applyStatusUpdate(data.state);\r\n        if (data.flash) setFlashMessage(data.flash);\r\n        break;\r\n\r\n      case \"add_marker\":\r\n        addMapMarker(data);\r\n        break;\r\n\r\n      case \"select_mode\":\r\n        setSelectionMode(data.mode);\r\n        break;\r\n    }\r\n  },\r\n});\r\n```\r\n\r\n### 3. Progress Updates\r\n\r\nShow \"Searching...\", \"Loading...\", \"Analyzing...\" during long operations:\r\n\r\n```python\r\nfrom chatkit.types import ProgressUpdateEvent\r\n\r\n@function_tool\r\nasync def search_articles(ctx: AgentContext, query: str) -> str:\r\n    \"\"\"Search for articles matching the query.\"\"\"\r\n\r\n    yield ProgressUpdateEvent(message=\"Searching articles...\")\r\n\r\n    results = await article_store.search(query)\r\n\r\n    yield ProgressUpdateEvent(message=f\"Found {len(results)} articles...\")\r\n\r\n    for i, article in enumerate(results):\r\n        if i % 5 == 0:\r\n            yield ProgressUpdateEvent(\r\n                message=f\"Processing article {i+1}\u002F{len(results)}...\"\r\n            )\r\n\r\n    return format_results(results)\r\n```\r\n\r\n### 4. Thread Lifecycle Events\r\n\r\nTrack thread changes for persistence and UI updates:\r\n\r\n```typescript\r\nconst chatkit = useChatKit({\r\n  api: { url: API_URL, domainKey: DOMAIN_KEY },\r\n\r\n  onThreadChange: ({ threadId }) => {\r\n    setThreadId(threadId);\r\n    if (threadId) localStorage.setItem(\"lastThreadId\", threadId);\r\n    clearSelections();\r\n  },\r\n\r\n  onThreadLoadStart: ({ threadId }) => {\r\n    setIsLoadingThread(true);\r\n  },\r\n\r\n  onThreadLoadEnd: ({ threadId }) => {\r\n    setIsLoadingThread(false);\r\n  },\r\n});\r\n```\r\n\r\n### 5. Client Tools (State Query)\r\n\r\nAI needs to read client-side state to make decisions:\r\n\r\n**Backend - Defining Client Tool:**\r\n\r\n```python\r\n@function_tool(name_override=\"get_selected_items\")\r\nasync def get_selected_items(ctx: AgentContext) -> dict:\r\n    \"\"\"Get the items currently selected on the canvas.\r\n\r\n    This is a CLIENT TOOL - executed in browser, result comes back.\r\n    \"\"\"\r\n    yield ProgressUpdateEvent(message=\"Reading selection...\")\r\n    pass  # Actual execution happens on client\r\n```\r\n\r\n**Frontend - Handling Client Tools:**\r\n\r\n```typescript\r\nconst chatkit = useChatKit({\r\n  api: { url: API_URL, domainKey: DOMAIN_KEY },\r\n\r\n  onClientTool: ({ name, params }) => {\r\n    switch (name) {\r\n      case \"get_selected_items\":\r\n        return { itemIds: selectedItemIds };\r\n\r\n      case \"get_current_viewport\":\r\n        return {\r\n          center: mapRef.current.getCenter(),\r\n          zoom: mapRef.current.getZoom(),\r\n        };\r\n\r\n      case \"get_form_data\":\r\n        return { values: formRef.current.getValues() };\r\n\r\n      default:\r\n        throw new Error(`Unknown client tool: ${name}`);\r\n    }\r\n  },\r\n});\r\n```\r\n\r\n---\r\n\r\n## Client Effects vs Client Tools\r\n\r\n| Type | Direction | Response Required | Use Case |\r\n|------|-----------|-------------------|----------|\r\n| **Client Effect** | Server → Client | No (fire-and-forget) | Update UI, show notifications |\r\n| **Client Tool** | Server → Client → Server | Yes (return value) | Get client state for AI decision |\r\n\r\n---\r\n\r\n## Common Patterns by Use Case\r\n\r\n### Interactive Map\u002FCanvas\r\n\r\n```typescript\r\nonResponseStart: () => lockCanvas(),\r\nonResponseEnd: () => unlockCanvas(),\r\nonEffect: ({ name, data }) => {\r\n  if (name === \"add_marker\") addMarker(data);\r\n  if (name === \"pan_to\") panTo(data.location);\r\n},\r\nonClientTool: ({ name }) => {\r\n  if (name === \"get_selection\") return getSelectedItems();\r\n},\r\n```\r\n\r\n### Form-Based UI\r\n\r\n```typescript\r\nonResponseStart: () => setFormDisabled(true),\r\nonResponseEnd: () => setFormDisabled(false),\r\nonClientTool: ({ name }) => {\r\n  if (name === \"get_form_values\") return form.getValues();\r\n},\r\n```\r\n\r\n### Game\u002FSimulation\r\n\r\n```typescript\r\nonResponseStart: () => pauseSimulation(),\r\nonResponseEnd: () => resumeSimulation(),\r\nonEffect: ({ name, data }) => {\r\n  if (name === \"update_entity\") updateEntity(data);\r\n  if (name === \"show_notification\") showToast(data.message);\r\n},\r\n```\r\n\r\n---\r\n\r\n## Thread Title Generation\r\n\r\nDynamically update thread title based on conversation:\r\n\r\n```python\r\nclass TitleAgent:\r\n    async def generate_title(self, first_message: str) -> str:\r\n        result = await Runner.run(\r\n            Agent(\r\n                name=\"TitleGenerator\",\r\n                instructions=\"Generate a 3-5 word title.\",\r\n                model=\"gpt-4o-mini\",  # Fast model\r\n            ),\r\n            input=f\"First message: {first_message}\",\r\n        )\r\n        return result.final_output\r\n\r\n# In ChatKitServer\r\nasync def respond(self, thread, item, context):\r\n    if not thread.title and item:\r\n        title = await self.title_agent.generate_title(item.content)\r\n        thread.title = title\r\n        await self.store.save_thread(thread, context)\r\n```\r\n\r\n---\r\n\r\n## Anti-Patterns\r\n\r\n1. **Not locking UI during response** - Leads to race conditions\r\n2. **Blocking in effects** - Effects should be fire-and-forget\r\n3. **Heavy computation in onEffect** - Use requestAnimationFrame for DOM updates\r\n4. **Missing error handling** - Always handle onError to unlock UI\r\n5. **Not persisting thread state** - Use onThreadChange to save context\r\n\r\n---\r\n\r\n## Verification\r\n\r\nRun: `python3 scripts\u002Fverify.py`\r\n\r\nExpected: `✓ streaming-llm-responses skill ready`\r\n\r\n## If Verification Fails\r\n\r\n1. Check: references\u002F folder has streaming-patterns.md\r\n2. **Stop and report** if still failing\r\n\r\n## References\r\n\r\n- [references\u002Fstreaming-patterns.md](references\u002Fstreaming-patterns.md) - Complete streaming configuration",{"name":5,"description":7},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faiskillstore\u002Fmarketplace\u002Fasmayaseen\u002Fstreaming-llm-responses",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":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill streaming-llm-responses",{"tool":59,"command":60},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill streaming-llm-responses",{"tool":62,"command":63},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill streaming-llm-responses","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fasmayaseen\u002Fstreaming-llm-responses\u002FSKILL.md",true,[67,73,79],{"path":68,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":71,"sourceHtmlUrl":72},"references\u002Fstreaming-patterns.md","REFERENCE","参考文档",5439,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fasmayaseen\u002Fstreaming-llm-responses\u002Freferences\u002Fstreaming-patterns.md",{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"scripts\u002Fverify.py","SCRIPT","脚本",619,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fasmayaseen\u002Fstreaming-llm-responses\u002Fscripts\u002Fverify.py",{"path":80,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":81,"sourceHtmlUrl":82},"skill-report.json",9106,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fasmayaseen\u002Fstreaming-llm-responses\u002Fskill-report.json",[84,98,108,117,123,130],{"skillNo":85,"name":86,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":87,"categories":88,"keywords":94,"publishedAt":39},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[89],{"categoryNo":90,"categoryName":91,"taxonomyType":92,"taxonomyTypeDesc":93},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[95,96,97],"model","model hierarchy","model hierarchy skill",{"skillNo":99,"name":100,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":104,"publishedAt":39},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[103],{"categoryNo":90,"categoryName":91,"taxonomyType":92,"taxonomyTypeDesc":93},[105,106,107],"MCP","zoom","zoom mcp",{"skillNo":109,"name":110,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":113,"publishedAt":39},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[114,115,116,106],"sdk","zoom apps sdk","apps",{"skillNo":118,"name":119,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":122,"publishedAt":39},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[119],{"skillNo":124,"name":125,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":129,"publishedAt":39},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[128],{"categoryNo":90,"categoryName":91,"taxonomyType":92,"taxonomyTypeDesc":93},[125],{"skillNo":131,"name":132,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":135,"publishedAt":39},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[132]]