[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F7FD23K3CW1R3H7X1CD3W9":3,"skill-same:01M6F7FD23K3CW1R3H7X1CD3W9":82},{"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":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":59,"commitSha":60,"skillDirectory":61,"forksCount":62,"repositoryHtmlUrl":63,"repositoryHomepageUrl":64,"ownerHtmlUrl":65,"ownerBlogUrl":6,"ownerDescription":66,"updatedAt":67,"install":68,"resources":81},"01M6F7FD23K3CW1R3H7X1CD3W9","assemblyai-sdk-patterns",null,"Apply production-ready AssemblyAI SDK patterns for TypeScript and Python.\nUse when implementing AssemblyAI integrations, refactoring SDK usage,\nor establishing team coding standards for transcription workflows.\nTrigger with phrases like \"assemblyai SDK patterns\", \"assemblyai best practices\",\n\"assemblyai code patterns\", \"idiomatic assemblyai\".","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\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fassemblyai-sdk-patterns\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"sdk","assemblyai sdk patterns","assemblyai","patterns","coding standards","team","refactoring","text","integrations","coding","read","write","edit","ready","standards","code","io","code patterns","workflows","typescript","2026-11-10 10:12:30",false,"---\nname: assemblyai-sdk-patterns\ndescription: |\n  Apply production-ready AssemblyAI SDK patterns for TypeScript and Python.\n  Use when implementing AssemblyAI integrations, refactoring SDK usage,\n  or establishing team coding standards for transcription workflows.\n  Trigger with phrases like \"assemblyai SDK patterns\", \"assemblyai best practices\",\n  \"assemblyai code patterns\", \"idiomatic assemblyai\".\nallowed-tools: Read, Write, Edit\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\ntags: [saas, ai, speech-to-text, assemblyai, transcription]\ncompatible-with: claude-code\n---\n\n# AssemblyAI SDK Patterns\n\n## Overview\nProduction-ready patterns for the `assemblyai` npm package covering client initialization, type-safe wrappers, error handling, and multi-tenant architectures.\n\n## Prerequisites\n- `assemblyai` package installed (`npm install assemblyai`)\n- Familiarity with async\u002Fawait and TypeScript generics\n\n## Instructions\n\n### Step 1: Type-Safe Singleton Client\n\n```typescript\n\u002F\u002F src\u002Fassemblyai\u002Fclient.ts\nimport { AssemblyAI } from 'assemblyai';\n\nlet instance: AssemblyAI | null = null;\n\nexport function getAssemblyAI(): AssemblyAI {\n  if (!instance) {\n    const apiKey = process.env.ASSEMBLYAI_API_KEY;\n    if (!apiKey) throw new Error('ASSEMBLYAI_API_KEY is required');\n    instance = new AssemblyAI({ apiKey });\n  }\n  return instance;\n}\n```\n\n### Step 2: Transcription Service Wrapper\n\n```typescript\n\u002F\u002F src\u002Fassemblyai\u002Ftranscription-service.ts\nimport { AssemblyAI, type Transcript, type TranscriptParams } from 'assemblyai';\n\nexport interface TranscriptionResult {\n  id: string;\n  text: string;\n  duration: number;\n  words: Array\u003C{ text: string; start: number; end: number; confidence: number }>;\n  speakers?: Array\u003C{ speaker: string; text: string }>;\n}\n\nexport class TranscriptionService {\n  constructor(private client: AssemblyAI) {}\n\n  async transcribe(\n    audio: string,\n    options: Partial\u003CTranscriptParams> = {}\n  ): Promise\u003CTranscriptionResult> {\n    const transcript = await this.client.transcripts.transcribe({\n      audio,\n      ...options,\n    });\n\n    if (transcript.status === 'error') {\n      throw new Error(`Transcription failed: ${transcript.error}`);\n    }\n\n    return {\n      id: transcript.id,\n      text: transcript.text ?? '',\n      duration: transcript.audio_duration ?? 0,\n      words: (transcript.words ?? []).map(w => ({\n        text: w.text,\n        start: w.start,\n        end: w.end,\n        confidence: w.confidence,\n      })),\n      speakers: transcript.utterances?.map(u => ({\n        speaker: u.speaker,\n        text: u.text,\n      })),\n    };\n  }\n\n  async getTranscript(id: string): Promise\u003CTranscript> {\n    return this.client.transcripts.get(id);\n  }\n\n  async listTranscripts(params?: { limit?: number; status?: string }) {\n    const page = await this.client.transcripts.list(params);\n    return page.transcripts;\n  }\n\n  async deleteTranscript(id: string): Promise\u003Cvoid> {\n    await this.client.transcripts.delete(id);\n  }\n}\n```\n\n### Step 3: Error Handling Wrapper\n\n```typescript\n\u002F\u002F src\u002Fassemblyai\u002Ferrors.ts\n\nexport class AssemblyAIServiceError extends Error {\n  constructor(\n    message: string,\n    public readonly statusCode?: number,\n    public readonly retryable: boolean = false,\n    public readonly transcriptId?: string\n  ) {\n    super(message);\n    this.name = 'AssemblyAIServiceError';\n  }\n}\n\nexport async function safeTranscribe\u003CT>(\n  operation: () => Promise\u003CT>\n): Promise\u003C{ data: T | null; error: AssemblyAIServiceError | null }> {\n  try {\n    const data = await operation();\n    return { data, error: null };\n  } catch (err: any) {\n    const statusCode = err.status ?? err.statusCode;\n    const retryable = statusCode === 429 || (statusCode >= 500 && statusCode \u003C 600);\n\n    return {\n      data: null,\n      error: new AssemblyAIServiceError(\n        err.message ?? 'Unknown AssemblyAI error',\n        statusCode,\n        retryable\n      ),\n    };\n  }\n}\n\n\u002F\u002F Usage\nconst { data, error } = await safeTranscribe(() =>\n  client.transcripts.transcribe({ audio: audioUrl })\n);\nif (error?.retryable) {\n  \u002F\u002F Implement retry logic\n}\n```\n\n### Step 4: Retry with Exponential Backoff\n\n```typescript\nexport async function withRetry\u003CT>(\n  operation: () => Promise\u003CT>,\n  maxRetries = 3,\n  baseDelayMs = 1000\n): Promise\u003CT> {\n  for (let attempt = 0; attempt \u003C= maxRetries; attempt++) {\n    try {\n      return await operation();\n    } catch (err: any) {\n      if (attempt === maxRetries) throw err;\n\n      const status = err.status ?? err.statusCode;\n      \u002F\u002F Only retry on rate limits (429) and server errors (5xx)\n      if (status && status !== 429 && (status \u003C 500 || status >= 600)) throw err;\n\n      const delay = baseDelayMs * Math.pow(2, attempt) + Math.random() * 500;\n      console.warn(`Retry ${attempt + 1}\u002F${maxRetries} in ${delay.toFixed(0)}ms`);\n      await new Promise(r => setTimeout(r, delay));\n    }\n  }\n  throw new Error('Unreachable');\n}\n\n\u002F\u002F Usage\nconst transcript = await withRetry(() =>\n  client.transcripts.transcribe({ audio: audioUrl })\n);\n```\n\n### Step 5: Multi-Tenant Client Factory\n\n```typescript\n\u002F\u002F For apps serving multiple customers with their own API keys\nconst clients = new Map\u003Cstring, AssemblyAI>();\n\nexport function getClientForTenant(tenantId: string): AssemblyAI {\n  if (!clients.has(tenantId)) {\n    const apiKey = getTenantApiKey(tenantId); \u002F\u002F from your secrets store\n    clients.set(tenantId, new AssemblyAI({ apiKey }));\n  }\n  return clients.get(tenantId)!;\n}\n```\n\n### Python Patterns\n\n```python\nimport assemblyai as aai\nfrom dataclasses import dataclass\nfrom typing import Optional\n\naai.settings.api_key = os.environ[\"ASSEMBLYAI_API_KEY\"]\n\n@dataclass\nclass TranscriptionResult:\n    id: str\n    text: str\n    duration: float\n    status: str\n\ndef transcribe_audio(audio_url: str, speaker_labels: bool = False) -> TranscriptionResult:\n    config = aai.TranscriptionConfig(speaker_labels=speaker_labels)\n    transcriber = aai.Transcriber()\n    transcript = transcriber.transcribe(audio_url, config=config)\n\n    if transcript.status == aai.TranscriptStatus.error:\n        raise RuntimeError(f\"Transcription failed: {transcript.error}\")\n\n    return TranscriptionResult(\n        id=transcript.id,\n        text=transcript.text,\n        duration=transcript.audio_duration,\n        status=transcript.status.value,\n    )\n```\n\n## Output\n- Type-safe singleton client with environment validation\n- Transcription service wrapper with clean return types\n- Error handling wrapper that classifies retryable vs non-retryable errors\n- Exponential backoff with jitter for rate limits\n- Multi-tenant client factory pattern\n\n## Error Handling\n| Pattern | Use Case | Benefit |\n|---------|----------|---------|\n| `safeTranscribe` | All API calls | Prevents uncaught exceptions, classifies errors |\n| `withRetry` | Rate-limited operations | Auto-retry on 429 and 5xx |\n| Service wrapper | Domain logic | Clean types, hides SDK internals |\n| Multi-tenant factory | SaaS apps | Per-customer isolation |\n\n## Resources\n- [AssemblyAI Node SDK Reference](https:\u002F\u002Fassemblyai.github.io\u002Fassemblyai-node-sdk\u002F)\n- [AssemblyAI TypeScript Types](https:\u002F\u002Fgithub.com\u002FAssemblyAI\u002Fassemblyai-node-sdk\u002Ftree\u002Fmain\u002Fsrc\u002Ftypes)\n- [AssemblyAI API Reference](https:\u002F\u002Fwww.assemblyai.com\u002Fdocs\u002Fapi-reference\u002Foverview)\n\n## Next Steps\nApply patterns in `assemblyai-core-workflow-a` (async transcription) and `assemblyai-core-workflow-b` (real-time streaming).\n\n","# AssemblyAI SDK Patterns\n\n## Overview\nProduction-ready patterns for the `assemblyai` npm package covering client initialization, type-safe wrappers, error handling, and multi-tenant architectures.\n\n## Prerequisites\n- `assemblyai` package installed (`npm install assemblyai`)\n- Familiarity with async\u002Fawait and TypeScript generics\n\n## Instructions\n\n### Step 1: Type-Safe Singleton Client\n\n```typescript\n\u002F\u002F src\u002Fassemblyai\u002Fclient.ts\nimport { AssemblyAI } from 'assemblyai';\n\nlet instance: AssemblyAI | null = null;\n\nexport function getAssemblyAI(): AssemblyAI {\n  if (!instance) {\n    const apiKey = process.env.ASSEMBLYAI_API_KEY;\n    if (!apiKey) throw new Error('ASSEMBLYAI_API_KEY is required');\n    instance = new AssemblyAI({ apiKey });\n  }\n  return instance;\n}\n```\n\n### Step 2: Transcription Service Wrapper\n\n```typescript\n\u002F\u002F src\u002Fassemblyai\u002Ftranscription-service.ts\nimport { AssemblyAI, type Transcript, type TranscriptParams } from 'assemblyai';\n\nexport interface TranscriptionResult {\n  id: string;\n  text: string;\n  duration: number;\n  words: Array\u003C{ text: string; start: number; end: number; confidence: number }>;\n  speakers?: Array\u003C{ speaker: string; text: string }>;\n}\n\nexport class TranscriptionService {\n  constructor(private client: AssemblyAI) {}\n\n  async transcribe(\n    audio: string,\n    options: Partial\u003CTranscriptParams> = {}\n  ): Promise\u003CTranscriptionResult> {\n    const transcript = await this.client.transcripts.transcribe({\n      audio,\n      ...options,\n    });\n\n    if (transcript.status === 'error') {\n      throw new Error(`Transcription failed: ${transcript.error}`);\n    }\n\n    return {\n      id: transcript.id,\n      text: transcript.text ?? '',\n      duration: transcript.audio_duration ?? 0,\n      words: (transcript.words ?? []).map(w => ({\n        text: w.text,\n        start: w.start,\n        end: w.end,\n        confidence: w.confidence,\n      })),\n      speakers: transcript.utterances?.map(u => ({\n        speaker: u.speaker,\n        text: u.text,\n      })),\n    };\n  }\n\n  async getTranscript(id: string): Promise\u003CTranscript> {\n    return this.client.transcripts.get(id);\n  }\n\n  async listTranscripts(params?: { limit?: number; status?: string }) {\n    const page = await this.client.transcripts.list(params);\n    return page.transcripts;\n  }\n\n  async deleteTranscript(id: string): Promise\u003Cvoid> {\n    await this.client.transcripts.delete(id);\n  }\n}\n```\n\n### Step 3: Error Handling Wrapper\n\n```typescript\n\u002F\u002F src\u002Fassemblyai\u002Ferrors.ts\n\nexport class AssemblyAIServiceError extends Error {\n  constructor(\n    message: string,\n    public readonly statusCode?: number,\n    public readonly retryable: boolean = false,\n    public readonly transcriptId?: string\n  ) {\n    super(message);\n    this.name = 'AssemblyAIServiceError';\n  }\n}\n\nexport async function safeTranscribe\u003CT>(\n  operation: () => Promise\u003CT>\n): Promise\u003C{ data: T | null; error: AssemblyAIServiceError | null }> {\n  try {\n    const data = await operation();\n    return { data, error: null };\n  } catch (err: any) {\n    const statusCode = err.status ?? err.statusCode;\n    const retryable = statusCode === 429 || (statusCode >= 500 && statusCode \u003C 600);\n\n    return {\n      data: null,\n      error: new AssemblyAIServiceError(\n        err.message ?? 'Unknown AssemblyAI error',\n        statusCode,\n        retryable\n      ),\n    };\n  }\n}\n\n\u002F\u002F Usage\nconst { data, error } = await safeTranscribe(() =>\n  client.transcripts.transcribe({ audio: audioUrl })\n);\nif (error?.retryable) {\n  \u002F\u002F Implement retry logic\n}\n```\n\n### Step 4: Retry with Exponential Backoff\n\n```typescript\nexport async function withRetry\u003CT>(\n  operation: () => Promise\u003CT>,\n  maxRetries = 3,\n  baseDelayMs = 1000\n): Promise\u003CT> {\n  for (let attempt = 0; attempt \u003C= maxRetries; attempt++) {\n    try {\n      return await operation();\n    } catch (err: any) {\n      if (attempt === maxRetries) throw err;\n\n      const status = err.status ?? err.statusCode;\n      \u002F\u002F Only retry on rate limits (429) and server errors (5xx)\n      if (status && status !== 429 && (status \u003C 500 || status >= 600)) throw err;\n\n      const delay = baseDelayMs * Math.pow(2, attempt) + Math.random() * 500;\n      console.warn(`Retry ${attempt + 1}\u002F${maxRetries} in ${delay.toFixed(0)}ms`);\n      await new Promise(r => setTimeout(r, delay));\n    }\n  }\n  throw new Error('Unreachable');\n}\n\n\u002F\u002F Usage\nconst transcript = await withRetry(() =>\n  client.transcripts.transcribe({ audio: audioUrl })\n);\n```\n\n### Step 5: Multi-Tenant Client Factory\n\n```typescript\n\u002F\u002F For apps serving multiple customers with their own API keys\nconst clients = new Map\u003Cstring, AssemblyAI>();\n\nexport function getClientForTenant(tenantId: string): AssemblyAI {\n  if (!clients.has(tenantId)) {\n    const apiKey = getTenantApiKey(tenantId); \u002F\u002F from your secrets store\n    clients.set(tenantId, new AssemblyAI({ apiKey }));\n  }\n  return clients.get(tenantId)!;\n}\n```\n\n### Python Patterns\n\n```python\nimport assemblyai as aai\nfrom dataclasses import dataclass\nfrom typing import Optional\n\naai.settings.api_key = os.environ[\"ASSEMBLYAI_API_KEY\"]\n\n@dataclass\nclass TranscriptionResult:\n    id: str\n    text: str\n    duration: float\n    status: str\n\ndef transcribe_audio(audio_url: str, speaker_labels: bool = False) -> TranscriptionResult:\n    config = aai.TranscriptionConfig(speaker_labels=speaker_labels)\n    transcriber = aai.Transcriber()\n    transcript = transcriber.transcribe(audio_url, config=config)\n\n    if transcript.status == aai.TranscriptStatus.error:\n        raise RuntimeError(f\"Transcription failed: {transcript.error}\")\n\n    return TranscriptionResult(\n        id=transcript.id,\n        text=transcript.text,\n        duration=transcript.audio_duration,\n        status=transcript.status.value,\n    )\n```\n\n## Output\n- Type-safe singleton client with environment validation\n- Transcription service wrapper with clean return types\n- Error handling wrapper that classifies retryable vs non-retryable errors\n- Exponential backoff with jitter for rate limits\n- Multi-tenant client factory pattern\n\n## Error Handling\n| Pattern | Use Case | Benefit |\n|---------|----------|---------|\n| `safeTranscribe` | All API calls | Prevents uncaught exceptions, classifies errors |\n| `withRetry` | Rate-limited operations | Auto-retry on 429 and 5xx |\n| Service wrapper | Domain logic | Clean types, hides SDK internals |\n| Multi-tenant factory | SaaS apps | Per-customer isolation |\n\n## Resources\n- [AssemblyAI Node SDK Reference](https:\u002F\u002Fassemblyai.github.io\u002Fassemblyai-node-sdk\u002F)\n- [AssemblyAI TypeScript Types](https:\u002F\u002Fgithub.com\u002FAssemblyAI\u002Fassemblyai-node-sdk\u002Ftree\u002Fmain\u002Fsrc\u002Ftypes)\n- [AssemblyAI API Reference](https:\u002F\u002Fwww.assemblyai.com\u002Fdocs\u002Fapi-reference\u002Foverview)\n\n## Next Steps\nApply patterns in `assemblyai-core-workflow-a` (async transcription) and `assemblyai-core-workflow-b` (real-time streaming).\n\n",{"name":5,"tags":49,"author":54,"license":15,"version":55,"description":56,"allowed-tools":57,"compatible-with":58},[50,51,52,26,53],"saas","ai","speech-to-text","transcription","Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Apply production-ready AssemblyAI SDK patterns for TypeScript and Python.\nUse when implementing AssemblyAI integrations, refactoring SDK usage,\nor establishing team coding standards for transcription workflows.\nTrigger with phrases like \"assemblyai SDK patterns\", \"assemblyai best practices\",\n\"assemblyai code patterns\", \"idiomatic assemblyai\".\n","Read, Write, Edit","claude-code","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fassemblyai-sdk-patterns",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":69,"prompt":79,"zipAvailable":80},[70,73,76],{"tool":71,"command":72},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill assemblyai-sdk-patterns",{"tool":74,"command":75},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill assemblyai-sdk-patterns",{"tool":77,"command":78},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill assemblyai-sdk-patterns","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fassemblyai-sdk-patterns\u002FSKILL.md",true,[],[83,97,107,115,121,128],{"skillNo":84,"name":85,"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":86,"categories":87,"keywords":93,"publishedAt":44},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[88],{"categoryNo":89,"categoryName":90,"taxonomyType":91,"taxonomyTypeDesc":92},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[94,95,96],"model","model hierarchy","model hierarchy skill",{"skillNo":98,"name":99,"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":100,"categories":101,"keywords":103,"publishedAt":44},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[102],{"categoryNo":89,"categoryName":90,"taxonomyType":91,"taxonomyTypeDesc":92},[104,105,106],"MCP","zoom","zoom mcp",{"skillNo":108,"name":109,"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":110,"categories":111,"keywords":112,"publishedAt":44},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[24,113,114,105],"zoom apps sdk","apps",{"skillNo":116,"name":117,"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":118,"categories":119,"keywords":120,"publishedAt":44},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[117],{"skillNo":122,"name":123,"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":124,"categories":125,"keywords":127,"publishedAt":44},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[126],{"categoryNo":89,"categoryName":90,"taxonomyType":91,"taxonomyTypeDesc":92},[123],{"skillNo":129,"name":130,"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":131,"categories":132,"keywords":133,"publishedAt":44},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[130]]