[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FAD97C93WZ2D58Q9CVYATW":3,"skill-same:01M6FAD97C93WZ2D58Q9CVYATW":73},{"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":50,"commitSha":51,"skillDirectory":52,"forksCount":53,"repositoryHtmlUrl":54,"repositoryHomepageUrl":55,"ownerHtmlUrl":56,"ownerBlogUrl":6,"ownerDescription":57,"updatedAt":58,"install":59,"resources":72},"01M6FAD97C93WZ2D58Q9CVYATW","exa-reliability-patterns",null,"Implement Exa reliability patterns: query fallback chains, circuit breakers, and graceful degradation.\nUse when building fault-tolerant Exa integrations, implementing fallback strategies,\nor adding resilience to production search services.\nTrigger with phrases like \"exa reliability\", \"exa circuit breaker\",\n\"exa fallback\", \"exa resilience\", \"exa graceful degradation\".","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\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fexa-reliability-patterns\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"reliability","exa reliability patterns","patterns","exa","saas","integrations","read","write","edit","use","openclaw","fallback","search","code","query","strategies","Circuit Breaker","io","trigger","resilience","2026-11-10 10:12:30",false,"---\nname: exa-reliability-patterns\ndescription: |\n  Implement Exa reliability patterns: query fallback chains, circuit breakers, and graceful degradation.\n  Use when building fault-tolerant Exa integrations, implementing fallback strategies,\n  or adding resilience to production search services.\n  Trigger with phrases like \"exa reliability\", \"exa circuit breaker\",\n  \"exa fallback\", \"exa resilience\", \"exa graceful degradation\".\nallowed-tools: Read, Write, Edit\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\ncompatible-with: claude-code, codex, openclaw\ntags: [saas, exa, reliability, resilience]\n\n---\n# Exa Reliability Patterns\n\n## Overview\nProduction reliability patterns for Exa neural search. Exa-specific failure modes include: empty result sets (query too narrow), content retrieval failures (sites block crawling), variable latency by search type, and 429 rate limits at 10 QPS default.\n\n## Instructions\n\n### Step 1: Query Fallback Chain\n```typescript\nimport Exa from \"exa-js\";\n\nconst exa = new Exa(process.env.EXA_API_KEY);\n\n\u002F\u002F If neural search returns too few results, fall back through search types\nasync function resilientSearch(\n  query: string,\n  minResults = 3,\n  opts: any = {}\n) {\n  \u002F\u002F Try 1: Neural search (best quality)\n  let results = await exa.searchAndContents(query, {\n    type: \"neural\",\n    numResults: 10,\n    ...opts,\n  });\n  if (results.results.length >= minResults) return results;\n\n  \u002F\u002F Try 2: Auto search (Exa picks best approach)\n  results = await exa.searchAndContents(query, {\n    type: \"auto\",\n    numResults: 10,\n    ...opts,\n  });\n  if (results.results.length >= minResults) return results;\n\n  \u002F\u002F Try 3: Keyword search (different index)\n  results = await exa.searchAndContents(query, {\n    type: \"keyword\",\n    numResults: 10,\n    ...opts,\n  });\n  if (results.results.length >= minResults) return results;\n\n  \u002F\u002F Try 4: Remove filters and broaden\n  const broadOpts = { ...opts };\n  delete broadOpts.startPublishedDate;\n  delete broadOpts.endPublishedDate;\n  delete broadOpts.includeDomains;\n  delete broadOpts.includeText;\n\n  return exa.searchAndContents(query, {\n    type: \"auto\",\n    numResults: 10,\n    ...broadOpts,\n  });\n}\n```\n\n### Step 2: Retry with Exponential Backoff\n```typescript\nasync function searchWithRetry(\n  query: string,\n  opts: any,\n  maxRetries = 3\n) {\n  for (let attempt = 0; attempt \u003C= maxRetries; attempt++) {\n    try {\n      return await exa.searchAndContents(query, opts);\n    } catch (err: any) {\n      const status = err.status || 0;\n\n      \u002F\u002F Only retry on rate limits (429) and server errors (5xx)\n      if (status !== 429 && (status \u003C 500 || status >= 600)) throw err;\n      if (attempt === maxRetries) throw err;\n\n      const delay = 1000 * Math.pow(2, attempt) + Math.random() * 500;\n      console.log(`[Exa] ${status} 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\n### Step 3: Circuit Breaker\n```typescript\nclass ExaCircuitBreaker {\n  private failures = 0;\n  private lastFailure = 0;\n  private state: \"closed\" | \"open\" | \"half-open\" = \"closed\";\n  private readonly threshold = 5;       \u002F\u002F failures before opening\n  private readonly resetTimeMs = 30000; \u002F\u002F 30s before half-open\n\n  async execute\u003CT>(fn: () => Promise\u003CT>, fallback?: () => T): Promise\u003CT> {\n    \u002F\u002F Check if circuit should reset\n    if (this.state === \"open\") {\n      if (Date.now() - this.lastFailure > this.resetTimeMs) {\n        this.state = \"half-open\";\n      } else if (fallback) {\n        return fallback();\n      } else {\n        throw new Error(\"Exa circuit breaker is open\");\n      }\n    }\n\n    try {\n      const result = await fn();\n      if (this.state === \"half-open\") {\n        this.state = \"closed\";\n        this.failures = 0;\n      }\n      return result;\n    } catch (err: any) {\n      this.failures++;\n      this.lastFailure = Date.now();\n\n      if (this.failures >= this.threshold) {\n        this.state = \"open\";\n        console.warn(`[Exa] Circuit breaker OPEN after ${this.failures} failures`);\n      }\n\n      if (fallback && this.state === \"open\") return fallback();\n      throw err;\n    }\n  }\n\n  getState() {\n    return { state: this.state, failures: this.failures };\n  }\n}\n\nconst circuitBreaker = new ExaCircuitBreaker();\n\n\u002F\u002F Usage with fallback to cached results\nconst result = await circuitBreaker.execute(\n  () => exa.searchAndContents(\"query\", { numResults: 5, text: true }),\n  () => getCachedResults(\"query\") \u002F\u002F fallback when circuit is open\n);\n```\n\n### Step 4: Graceful Degradation\n```typescript\ninterface SearchResultWithMeta {\n  results: any[];\n  degraded: boolean;\n  source: \"live\" | \"cache\" | \"fallback\";\n  searchType: string;\n}\n\nasync function degradableSearch(\n  query: string,\n  opts: any = {}\n): Promise\u003CSearchResultWithMeta> {\n  \u002F\u002F Level 1: Full search with contents\n  try {\n    const results = await searchWithRetry(query, {\n      type: \"neural\",\n      numResults: 10,\n      text: { maxCharacters: 2000 },\n      highlights: { maxCharacters: 500 },\n      ...opts,\n    }, 2);\n    return { results: results.results, degraded: false, source: \"live\", searchType: \"neural\" };\n  } catch {}\n\n  \u002F\u002F Level 2: Fast search without content (less expensive)\n  try {\n    const results = await exa.search(query, {\n      type: \"fast\",\n      numResults: 5,\n    });\n    return { results: results.results, degraded: true, source: \"live\", searchType: \"fast\" };\n  } catch {}\n\n  \u002F\u002F Level 3: Return cached results\n  const cached = getCachedResults(query);\n  if (cached) {\n    return { results: cached, degraded: true, source: \"cache\", searchType: \"cached\" };\n  }\n\n  \u002F\u002F Level 4: Return empty with degradation flag\n  return { results: [], degraded: true, source: \"fallback\", searchType: \"none\" };\n}\n```\n\n### Step 5: Result Quality Monitoring\n```typescript\nclass SearchQualityMonitor {\n  private stats = { total: 0, empty: 0, lowScore: 0 };\n\n  record(results: any[]) {\n    this.stats.total++;\n    if (results.length === 0) this.stats.empty++;\n    if (results[0]?.score \u003C 0.5) this.stats.lowScore++;\n  }\n\n  isHealthy(): boolean {\n    if (this.stats.total \u003C 10) return true; \u002F\u002F not enough data\n    const emptyRate = this.stats.empty \u002F this.stats.total;\n    const lowScoreRate = this.stats.lowScore \u002F this.stats.total;\n    return emptyRate \u003C 0.2 && lowScoreRate \u003C 0.3;\n  }\n\n  getReport() {\n    return {\n      ...this.stats,\n      emptyRate: `${((this.stats.empty \u002F this.stats.total) * 100).toFixed(1)}%`,\n      lowScoreRate: `${((this.stats.lowScore \u002F this.stats.total) * 100).toFixed(1)}%`,\n      healthy: this.isHealthy(),\n    };\n  }\n}\n```\n\n## Error Handling\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| Empty results | Query too specific | Use fallback chain with broader query |\n| Slow responses | Neural on complex query | Degrade to `fast` type |\n| 429 rate limit | Burst traffic | Circuit breaker + backoff |\n| Content retrieval fails | Site blocks crawling | Fall back to highlights or summary |\n| Quality degradation | Query drift | Monitor empty\u002Flow-score rates |\n\n## Resources\n- [Exa API Reference](https:\u002F\u002Fdocs.exa.ai\u002Freference\u002Fsearch)\n- [Exa Error Codes](https:\u002F\u002Fdocs.exa.ai\u002Freference\u002Ferror-codes)\n- [Circuit Breaker Pattern](https:\u002F\u002Fmartinfowler.com\u002Fbliki\u002FCircuitBreaker.html)\n\n## Next Steps\nFor policy guardrails, see `exa-policy-guardrails`. For architecture variants, see `exa-architecture-variants`.\n\n","# Exa Reliability Patterns\n\n## Overview\nProduction reliability patterns for Exa neural search. Exa-specific failure modes include: empty result sets (query too narrow), content retrieval failures (sites block crawling), variable latency by search type, and 429 rate limits at 10 QPS default.\n\n## Instructions\n\n### Step 1: Query Fallback Chain\n```typescript\nimport Exa from \"exa-js\";\n\nconst exa = new Exa(process.env.EXA_API_KEY);\n\n\u002F\u002F If neural search returns too few results, fall back through search types\nasync function resilientSearch(\n  query: string,\n  minResults = 3,\n  opts: any = {}\n) {\n  \u002F\u002F Try 1: Neural search (best quality)\n  let results = await exa.searchAndContents(query, {\n    type: \"neural\",\n    numResults: 10,\n    ...opts,\n  });\n  if (results.results.length >= minResults) return results;\n\n  \u002F\u002F Try 2: Auto search (Exa picks best approach)\n  results = await exa.searchAndContents(query, {\n    type: \"auto\",\n    numResults: 10,\n    ...opts,\n  });\n  if (results.results.length >= minResults) return results;\n\n  \u002F\u002F Try 3: Keyword search (different index)\n  results = await exa.searchAndContents(query, {\n    type: \"keyword\",\n    numResults: 10,\n    ...opts,\n  });\n  if (results.results.length >= minResults) return results;\n\n  \u002F\u002F Try 4: Remove filters and broaden\n  const broadOpts = { ...opts };\n  delete broadOpts.startPublishedDate;\n  delete broadOpts.endPublishedDate;\n  delete broadOpts.includeDomains;\n  delete broadOpts.includeText;\n\n  return exa.searchAndContents(query, {\n    type: \"auto\",\n    numResults: 10,\n    ...broadOpts,\n  });\n}\n```\n\n### Step 2: Retry with Exponential Backoff\n```typescript\nasync function searchWithRetry(\n  query: string,\n  opts: any,\n  maxRetries = 3\n) {\n  for (let attempt = 0; attempt \u003C= maxRetries; attempt++) {\n    try {\n      return await exa.searchAndContents(query, opts);\n    } catch (err: any) {\n      const status = err.status || 0;\n\n      \u002F\u002F Only retry on rate limits (429) and server errors (5xx)\n      if (status !== 429 && (status \u003C 500 || status >= 600)) throw err;\n      if (attempt === maxRetries) throw err;\n\n      const delay = 1000 * Math.pow(2, attempt) + Math.random() * 500;\n      console.log(`[Exa] ${status} 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\n### Step 3: Circuit Breaker\n```typescript\nclass ExaCircuitBreaker {\n  private failures = 0;\n  private lastFailure = 0;\n  private state: \"closed\" | \"open\" | \"half-open\" = \"closed\";\n  private readonly threshold = 5;       \u002F\u002F failures before opening\n  private readonly resetTimeMs = 30000; \u002F\u002F 30s before half-open\n\n  async execute\u003CT>(fn: () => Promise\u003CT>, fallback?: () => T): Promise\u003CT> {\n    \u002F\u002F Check if circuit should reset\n    if (this.state === \"open\") {\n      if (Date.now() - this.lastFailure > this.resetTimeMs) {\n        this.state = \"half-open\";\n      } else if (fallback) {\n        return fallback();\n      } else {\n        throw new Error(\"Exa circuit breaker is open\");\n      }\n    }\n\n    try {\n      const result = await fn();\n      if (this.state === \"half-open\") {\n        this.state = \"closed\";\n        this.failures = 0;\n      }\n      return result;\n    } catch (err: any) {\n      this.failures++;\n      this.lastFailure = Date.now();\n\n      if (this.failures >= this.threshold) {\n        this.state = \"open\";\n        console.warn(`[Exa] Circuit breaker OPEN after ${this.failures} failures`);\n      }\n\n      if (fallback && this.state === \"open\") return fallback();\n      throw err;\n    }\n  }\n\n  getState() {\n    return { state: this.state, failures: this.failures };\n  }\n}\n\nconst circuitBreaker = new ExaCircuitBreaker();\n\n\u002F\u002F Usage with fallback to cached results\nconst result = await circuitBreaker.execute(\n  () => exa.searchAndContents(\"query\", { numResults: 5, text: true }),\n  () => getCachedResults(\"query\") \u002F\u002F fallback when circuit is open\n);\n```\n\n### Step 4: Graceful Degradation\n```typescript\ninterface SearchResultWithMeta {\n  results: any[];\n  degraded: boolean;\n  source: \"live\" | \"cache\" | \"fallback\";\n  searchType: string;\n}\n\nasync function degradableSearch(\n  query: string,\n  opts: any = {}\n): Promise\u003CSearchResultWithMeta> {\n  \u002F\u002F Level 1: Full search with contents\n  try {\n    const results = await searchWithRetry(query, {\n      type: \"neural\",\n      numResults: 10,\n      text: { maxCharacters: 2000 },\n      highlights: { maxCharacters: 500 },\n      ...opts,\n    }, 2);\n    return { results: results.results, degraded: false, source: \"live\", searchType: \"neural\" };\n  } catch {}\n\n  \u002F\u002F Level 2: Fast search without content (less expensive)\n  try {\n    const results = await exa.search(query, {\n      type: \"fast\",\n      numResults: 5,\n    });\n    return { results: results.results, degraded: true, source: \"live\", searchType: \"fast\" };\n  } catch {}\n\n  \u002F\u002F Level 3: Return cached results\n  const cached = getCachedResults(query);\n  if (cached) {\n    return { results: cached, degraded: true, source: \"cache\", searchType: \"cached\" };\n  }\n\n  \u002F\u002F Level 4: Return empty with degradation flag\n  return { results: [], degraded: true, source: \"fallback\", searchType: \"none\" };\n}\n```\n\n### Step 5: Result Quality Monitoring\n```typescript\nclass SearchQualityMonitor {\n  private stats = { total: 0, empty: 0, lowScore: 0 };\n\n  record(results: any[]) {\n    this.stats.total++;\n    if (results.length === 0) this.stats.empty++;\n    if (results[0]?.score \u003C 0.5) this.stats.lowScore++;\n  }\n\n  isHealthy(): boolean {\n    if (this.stats.total \u003C 10) return true; \u002F\u002F not enough data\n    const emptyRate = this.stats.empty \u002F this.stats.total;\n    const lowScoreRate = this.stats.lowScore \u002F this.stats.total;\n    return emptyRate \u003C 0.2 && lowScoreRate \u003C 0.3;\n  }\n\n  getReport() {\n    return {\n      ...this.stats,\n      emptyRate: `${((this.stats.empty \u002F this.stats.total) * 100).toFixed(1)}%`,\n      lowScoreRate: `${((this.stats.lowScore \u002F this.stats.total) * 100).toFixed(1)}%`,\n      healthy: this.isHealthy(),\n    };\n  }\n}\n```\n\n## Error Handling\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| Empty results | Query too specific | Use fallback chain with broader query |\n| Slow responses | Neural on complex query | Degrade to `fast` type |\n| 429 rate limit | Burst traffic | Circuit breaker + backoff |\n| Content retrieval fails | Site blocks crawling | Fall back to highlights or summary |\n| Quality degradation | Query drift | Monitor empty\u002Flow-score rates |\n\n## Resources\n- [Exa API Reference](https:\u002F\u002Fdocs.exa.ai\u002Freference\u002Fsearch)\n- [Exa Error Codes](https:\u002F\u002Fdocs.exa.ai\u002Freference\u002Ferror-codes)\n- [Circuit Breaker Pattern](https:\u002F\u002Fmartinfowler.com\u002Fbliki\u002FCircuitBreaker.html)\n\n## Next Steps\nFor policy guardrails, see `exa-policy-guardrails`. For architecture variants, see `exa-architecture-variants`.\n\n",{"name":5,"tags":44,"author":45,"license":15,"version":46,"description":47,"allowed-tools":48,"compatible-with":49},[23,22,19,38],"Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Implement Exa reliability patterns: query fallback chains, circuit breakers, and graceful degradation.\nUse when building fault-tolerant Exa integrations, implementing fallback strategies,\nor adding resilience to production search services.\nTrigger with phrases like \"exa reliability\", \"exa circuit breaker\",\n\"exa fallback\", \"exa resilience\", \"exa graceful degradation\".\n","Read, Write, Edit","claude-code, codex, openclaw","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fexa-reliability-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":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill exa-reliability-patterns",{"tool":65,"command":66},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill exa-reliability-patterns",{"tool":68,"command":69},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill exa-reliability-patterns","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fexa-reliability-patterns\u002FSKILL.md",true,[],[74,88,98,107,113,120],{"skillNo":75,"name":76,"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":77,"categories":78,"keywords":84,"publishedAt":39},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[79],{"categoryNo":80,"categoryName":81,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[85,86,87],"model","model hierarchy","model hierarchy skill",{"skillNo":89,"name":90,"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":91,"categories":92,"keywords":94,"publishedAt":39},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[93],{"categoryNo":80,"categoryName":81,"taxonomyType":82,"taxonomyTypeDesc":83},[95,96,97],"MCP","zoom","zoom mcp",{"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":103,"publishedAt":39},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[104,105,106,96],"sdk","zoom apps sdk","apps",{"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":39},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[109],{"skillNo":114,"name":115,"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":116,"categories":117,"keywords":119,"publishedAt":39},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[118],{"categoryNo":80,"categoryName":81,"taxonomyType":82,"taxonomyTypeDesc":83},[115],{"skillNo":121,"name":122,"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":123,"categories":124,"keywords":125,"publishedAt":39},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[122]]