[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F8BDPW4MPWD1CAWMM3QHNC":3,"skill-same:01M6F8BDPW4MPWD1CAWMM3QHNC":81},{"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":49,"linkOnly":50,"markdownContent":51,"markdownBody":52,"frontMatter":53,"refName":58,"commitSha":59,"skillDirectory":60,"forksCount":61,"repositoryHtmlUrl":62,"repositoryHomepageUrl":6,"ownerHtmlUrl":63,"ownerBlogUrl":64,"ownerDescription":65,"updatedAt":66,"install":67,"resources":80},"01M6F8BDPW4MPWD1CAWMM3QHNC","openevidence-common-errors",null,"Diagnose and resolve common OpenEvidence API errors.\nUse when encountering error codes, debugging failed requests,\nor implementing error handling for clinical queries.\nTrigger with phrases like \"openevidence error\", \"openevidence failing\",\n\"fix openevidence\", \"openevidence debug\", \"openevidence 4xx\", \"openevidence 5xx\".","Dicklesworthstone\u002Fpi_agent_rust","Dicklesworthstone","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F35050222?v=4","01M6CG26AR942CSVMN1M5E3DSE","Jeff Emanuel","01M6CG26EPP71PSHW1VDS71121",1979,"MIT","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Fopenevidence-pack\u002Fskills\u002Fopenevidence-common-errors\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,44,45,46,47,48],"common","openevidence common errors","errors","clinical","failing","when","for","implementing","api errors","with","codes","error","trigger","io","debug","queries","use","fix","edit","write","read","api","error handling","debugging","diagnose","2026-11-10 10:12:30",false,"---\nname: openevidence-common-errors\ndescription: |\n  Diagnose and resolve common OpenEvidence API errors.\n  Use when encountering error codes, debugging failed requests,\n  or implementing error handling for clinical queries.\n  Trigger with phrases like \"openevidence error\", \"openevidence failing\",\n  \"fix openevidence\", \"openevidence debug\", \"openevidence 4xx\", \"openevidence 5xx\".\nallowed-tools: Read, Write, Edit, Grep\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\n---\n\n# OpenEvidence Common Errors\n\n## Overview\nComprehensive guide to diagnosing and resolving OpenEvidence API errors with healthcare-specific considerations.\n\n## Prerequisites\n- OpenEvidence SDK installed\n- Access to application logs\n- Understanding of HTTP status codes\n\n## Error Code Reference\n\n### Authentication Errors (4xx)\n| Code | Error | Cause | Solution |\n|------|-------|-------|----------|\n| 401 | Invalid API Key | Key missing, malformed, or revoked | Verify `OPENEVIDENCE_API_KEY` is set correctly |\n| 401 | Organization Not Found | Invalid `orgId` | Check organization ID in dashboard |\n| 401 | BAA Not Signed | Business Associate Agreement required | Contact compliance@openevidence.com |\n| 403 | Forbidden | Insufficient permissions or suspended account | Check account status in dashboard |\n| 403 | IP Not Whitelisted | Request from non-approved IP | Add IP to allowlist in security settings |\n\n### Request Errors (4xx)\n| Code | Error | Cause | Solution |\n|------|-------|-------|----------|\n| 400 | Invalid Query | Malformed request body | Check request schema |\n| 400 | Query Too Short | Question too brief | Provide more clinical context |\n| 400 | Invalid Specialty | Unknown specialty code | Use valid specialty from enum |\n| 404 | Resource Not Found | Invalid consultId or endpoint | Verify ID and URL |\n| 422 | Unprocessable | Valid JSON but invalid clinical query | Rephrase question |\n| 429 | Rate Limited | Too many requests | Implement backoff, check quotas |\n\n### Server Errors (5xx)\n| Code | Error | Cause | Solution |\n|------|-------|-------|----------|\n| 500 | Internal Server Error | OpenEvidence backend issue | Retry with backoff, contact support if persists |\n| 502 | Bad Gateway | Upstream service issue | Wait and retry |\n| 503 | Service Unavailable | Maintenance or overload | Check status.openevidence.com |\n| 504 | Gateway Timeout | Request took too long | Simplify query, increase timeout |\n\n## Error Handling Implementation\n\n### Step 1: Custom Error Classes\n```typescript\n\u002F\u002F src\u002Fopenevidence\u002Ferrors.ts\nexport class OpenEvidenceError extends Error {\n  constructor(\n    message: string,\n    public readonly code: string,\n    public readonly statusCode: number,\n    public readonly retryable: boolean,\n    public readonly originalError?: Error\n  ) {\n    super(message);\n    this.name = 'OpenEvidenceError';\n  }\n\n  static fromApiError(error: any): OpenEvidenceError {\n    const statusCode = error.response?.status || 500;\n    const message = error.response?.data?.message || error.message;\n    const code = error.response?.data?.code || 'UNKNOWN_ERROR';\n\n    return new OpenEvidenceError(\n      message,\n      code,\n      statusCode,\n      isRetryable(statusCode),\n      error\n    );\n  }\n}\n\nexport class AuthenticationError extends OpenEvidenceError {\n  constructor(message: string, code: string) {\n    super(message, code, 401, false);\n    this.name = 'AuthenticationError';\n  }\n}\n\nexport class RateLimitError extends OpenEvidenceError {\n  constructor(\n    message: string,\n    public readonly retryAfter: number,\n    public readonly limit: number,\n    public readonly remaining: number\n  ) {\n    super(message, 'RATE_LIMITED', 429, true);\n    this.name = 'RateLimitError';\n  }\n}\n\nexport class QueryValidationError extends OpenEvidenceError {\n  constructor(\n    message: string,\n    public readonly validationErrors: string[]\n  ) {\n    super(message, 'VALIDATION_ERROR', 400, false);\n    this.name = 'QueryValidationError';\n  }\n}\n\nfunction isRetryable(statusCode: number): boolean {\n  return statusCode === 429 || statusCode >= 500;\n}\n```\n\n### Step 2: Error Handler Wrapper\n```typescript\n\u002F\u002F src\u002Fopenevidence\u002Ferror-handler.ts\nimport {\n  OpenEvidenceError,\n  AuthenticationError,\n  RateLimitError,\n  QueryValidationError,\n} from '.\u002Ferrors';\n\nexport async function withErrorHandling\u003CT>(\n  operation: () => Promise\u003CT>,\n  context?: { operation?: string; queryId?: string }\n): Promise\u003CT> {\n  try {\n    return await operation();\n  } catch (error: any) {\n    const oeError = classifyError(error);\n\n    \u002F\u002F Log for debugging (without PHI)\n    console.error(`[OpenEvidence Error]`, {\n      code: oeError.code,\n      statusCode: oeError.statusCode,\n      operation: context?.operation,\n      retryable: oeError.retryable,\n    });\n\n    throw oeError;\n  }\n}\n\nfunction classifyError(error: any): OpenEvidenceError {\n  const status = error.response?.status;\n  const data = error.response?.data;\n\n  switch (status) {\n    case 401:\n      return new AuthenticationError(\n        data?.message || 'Authentication failed',\n        data?.code || 'AUTH_FAILED'\n      );\n\n    case 429:\n      return new RateLimitError(\n        'Rate limit exceeded',\n        parseInt(error.response?.headers?.['retry-after'] || '60'),\n        parseInt(error.response?.headers?.['x-ratelimit-limit'] || '0'),\n        parseInt(error.response?.headers?.['x-ratelimit-remaining'] || '0')\n      );\n\n    case 400:\n    case 422:\n      return new QueryValidationError(\n        data?.message || 'Invalid query',\n        data?.errors || []\n      );\n\n    default:\n      return OpenEvidenceError.fromApiError(error);\n  }\n}\n```\n\n### Step 3: Retry Logic with Exponential Backoff\n```typescript\n\u002F\u002F src\u002Fopenevidence\u002Fretry.ts\nimport { OpenEvidenceError, RateLimitError } from '.\u002Ferrors';\n\ninterface RetryConfig {\n  maxRetries: number;\n  baseDelayMs: number;\n  maxDelayMs: number;\n  jitterMs: number;\n}\n\nconst DEFAULT_CONFIG: RetryConfig = {\n  maxRetries: 3,\n  baseDelayMs: 1000,\n  maxDelayMs: 30000,\n  jitterMs: 500,\n};\n\nexport async function withRetry\u003CT>(\n  operation: () => Promise\u003CT>,\n  config: Partial\u003CRetryConfig> = {}\n): Promise\u003CT> {\n  const cfg = { ...DEFAULT_CONFIG, ...config };\n\n  for (let attempt = 0; attempt \u003C= cfg.maxRetries; attempt++) {\n    try {\n      return await operation();\n    } catch (error) {\n      if (!(error instanceof OpenEvidenceError) || !error.retryable) {\n        throw error;\n      }\n\n      if (attempt === cfg.maxRetries) {\n        throw error;\n      }\n\n      \u002F\u002F Use Retry-After header for rate limits\n      let delay: number;\n      if (error instanceof RateLimitError && error.retryAfter > 0) {\n        delay = error.retryAfter * 1000;\n      } else {\n        delay = Math.min(\n          cfg.baseDelayMs * Math.pow(2, attempt) + Math.random() * cfg.jitterMs,\n          cfg.maxDelayMs\n        );\n      }\n\n      console.log(`Retry ${attempt + 1}\u002F${cfg.maxRetries} after ${delay}ms`);\n      await new Promise(r => setTimeout(r, delay));\n    }\n  }\n\n  throw new Error('Unreachable');\n}\n```\n\n### Step 4: User-Facing Error Messages\n```typescript\n\u002F\u002F src\u002Fopenevidence\u002Ferror-messages.ts\nimport { OpenEvidenceError, RateLimitError, QueryValidationError } from '.\u002Ferrors';\n\nexport function getUserFriendlyMessage(error: OpenEvidenceError): string {\n  switch (error.code) {\n    case 'AUTH_FAILED':\n    case 'INVALID_API_KEY':\n      return 'Unable to connect to medical evidence service. Please contact support.';\n\n    case 'BAA_REQUIRED':\n      return 'Service configuration required. Please contact your administrator.';\n\n    case 'RATE_LIMITED':\n      const rle = error as RateLimitError;\n      return `Service temporarily unavailable. Please try again in ${rle.retryAfter} seconds.`;\n\n    case 'VALIDATION_ERROR':\n      const qve = error as QueryValidationError;\n      return `Please rephrase your clinical question. ${qve.validationErrors.join('. ')}`;\n\n    case 'QUERY_TOO_SHORT':\n      return 'Please provide more details about your clinical question.';\n\n    case 'INVALID_SPECIALTY':\n      return 'Please select a valid medical specialty.';\n\n    case 'SERVICE_UNAVAILABLE':\n      return 'Medical evidence service is temporarily unavailable. Please try again later.';\n\n    default:\n      if (error.statusCode >= 500) {\n        return 'Medical evidence service is experiencing issues. Please try again later.';\n      }\n      return 'Unable to process your request. Please try again or contact support.';\n  }\n}\n```\n\n## Output\n- Classified errors with appropriate handling\n- Retry logic for transient failures\n- User-friendly error messages\n- Comprehensive error logging (without PHI)\n\n## Diagnostic Commands\n\n### Quick Health Check\n```bash\n# Check if OpenEvidence is reachable\ncurl -s -o \u002Fdev\u002Fnull -w \"%{http_code}\" \\\n  -H \"Authorization: Bearer ${OPENEVIDENCE_API_KEY}\" \\\n  https:\u002F\u002Fapi.openevidence.com\u002Fhealth\n\n# Expected: 200\n```\n\n### Check Rate Limit Status\n```bash\ncurl -s -D - \\\n  -H \"Authorization: Bearer ${OPENEVIDENCE_API_KEY}\" \\\n  https:\u002F\u002Fapi.openevidence.com\u002Fv1\u002Frate-limit \\\n  | grep -i \"x-ratelimit\"\n\n# Headers show current limits\n```\n\n## Error Handling\n| Error Pattern | Detection | Resolution |\n|--------------|-----------|------------|\n| Intermittent 5xx | > 5% error rate | Enable circuit breaker |\n| Persistent 401 | All requests fail | Rotate API key |\n| Spike in 429 | Rate limit headers | Implement request queuing |\n| Timeout errors | P99 > 30s | Check network, simplify queries |\n\n## Examples\n\n### Complete Error-Handled Query\n```typescript\nasync function safeClinicalQuery(question: string) {\n  try {\n    return await withRetry(\n      () => withErrorHandling(\n        () => client.query({ question, context: { specialty: 'internal-medicine', urgency: 'routine' } }),\n        { operation: 'clinical-query' }\n      ),\n      { maxRetries: 3 }\n    );\n  } catch (error) {\n    if (error instanceof OpenEvidenceError) {\n      return {\n        success: false,\n        error: getUserFriendlyMessage(error),\n        code: error.code,\n      };\n    }\n    throw error;\n  }\n}\n```\n\n## Resources\n- [OpenEvidence Status](https:\u002F\u002Fstatus.openevidence.com\u002F)\n- [OpenEvidence Support](mailto:support@openevidence.com)\n\n## Next Steps\nFor comprehensive debugging, see `openevidence-debug-bundle`.\n","# OpenEvidence Common Errors\n\n## Overview\nComprehensive guide to diagnosing and resolving OpenEvidence API errors with healthcare-specific considerations.\n\n## Prerequisites\n- OpenEvidence SDK installed\n- Access to application logs\n- Understanding of HTTP status codes\n\n## Error Code Reference\n\n### Authentication Errors (4xx)\n| Code | Error | Cause | Solution |\n|------|-------|-------|----------|\n| 401 | Invalid API Key | Key missing, malformed, or revoked | Verify `OPENEVIDENCE_API_KEY` is set correctly |\n| 401 | Organization Not Found | Invalid `orgId` | Check organization ID in dashboard |\n| 401 | BAA Not Signed | Business Associate Agreement required | Contact compliance@openevidence.com |\n| 403 | Forbidden | Insufficient permissions or suspended account | Check account status in dashboard |\n| 403 | IP Not Whitelisted | Request from non-approved IP | Add IP to allowlist in security settings |\n\n### Request Errors (4xx)\n| Code | Error | Cause | Solution |\n|------|-------|-------|----------|\n| 400 | Invalid Query | Malformed request body | Check request schema |\n| 400 | Query Too Short | Question too brief | Provide more clinical context |\n| 400 | Invalid Specialty | Unknown specialty code | Use valid specialty from enum |\n| 404 | Resource Not Found | Invalid consultId or endpoint | Verify ID and URL |\n| 422 | Unprocessable | Valid JSON but invalid clinical query | Rephrase question |\n| 429 | Rate Limited | Too many requests | Implement backoff, check quotas |\n\n### Server Errors (5xx)\n| Code | Error | Cause | Solution |\n|------|-------|-------|----------|\n| 500 | Internal Server Error | OpenEvidence backend issue | Retry with backoff, contact support if persists |\n| 502 | Bad Gateway | Upstream service issue | Wait and retry |\n| 503 | Service Unavailable | Maintenance or overload | Check status.openevidence.com |\n| 504 | Gateway Timeout | Request took too long | Simplify query, increase timeout |\n\n## Error Handling Implementation\n\n### Step 1: Custom Error Classes\n```typescript\n\u002F\u002F src\u002Fopenevidence\u002Ferrors.ts\nexport class OpenEvidenceError extends Error {\n  constructor(\n    message: string,\n    public readonly code: string,\n    public readonly statusCode: number,\n    public readonly retryable: boolean,\n    public readonly originalError?: Error\n  ) {\n    super(message);\n    this.name = 'OpenEvidenceError';\n  }\n\n  static fromApiError(error: any): OpenEvidenceError {\n    const statusCode = error.response?.status || 500;\n    const message = error.response?.data?.message || error.message;\n    const code = error.response?.data?.code || 'UNKNOWN_ERROR';\n\n    return new OpenEvidenceError(\n      message,\n      code,\n      statusCode,\n      isRetryable(statusCode),\n      error\n    );\n  }\n}\n\nexport class AuthenticationError extends OpenEvidenceError {\n  constructor(message: string, code: string) {\n    super(message, code, 401, false);\n    this.name = 'AuthenticationError';\n  }\n}\n\nexport class RateLimitError extends OpenEvidenceError {\n  constructor(\n    message: string,\n    public readonly retryAfter: number,\n    public readonly limit: number,\n    public readonly remaining: number\n  ) {\n    super(message, 'RATE_LIMITED', 429, true);\n    this.name = 'RateLimitError';\n  }\n}\n\nexport class QueryValidationError extends OpenEvidenceError {\n  constructor(\n    message: string,\n    public readonly validationErrors: string[]\n  ) {\n    super(message, 'VALIDATION_ERROR', 400, false);\n    this.name = 'QueryValidationError';\n  }\n}\n\nfunction isRetryable(statusCode: number): boolean {\n  return statusCode === 429 || statusCode >= 500;\n}\n```\n\n### Step 2: Error Handler Wrapper\n```typescript\n\u002F\u002F src\u002Fopenevidence\u002Ferror-handler.ts\nimport {\n  OpenEvidenceError,\n  AuthenticationError,\n  RateLimitError,\n  QueryValidationError,\n} from '.\u002Ferrors';\n\nexport async function withErrorHandling\u003CT>(\n  operation: () => Promise\u003CT>,\n  context?: { operation?: string; queryId?: string }\n): Promise\u003CT> {\n  try {\n    return await operation();\n  } catch (error: any) {\n    const oeError = classifyError(error);\n\n    \u002F\u002F Log for debugging (without PHI)\n    console.error(`[OpenEvidence Error]`, {\n      code: oeError.code,\n      statusCode: oeError.statusCode,\n      operation: context?.operation,\n      retryable: oeError.retryable,\n    });\n\n    throw oeError;\n  }\n}\n\nfunction classifyError(error: any): OpenEvidenceError {\n  const status = error.response?.status;\n  const data = error.response?.data;\n\n  switch (status) {\n    case 401:\n      return new AuthenticationError(\n        data?.message || 'Authentication failed',\n        data?.code || 'AUTH_FAILED'\n      );\n\n    case 429:\n      return new RateLimitError(\n        'Rate limit exceeded',\n        parseInt(error.response?.headers?.['retry-after'] || '60'),\n        parseInt(error.response?.headers?.['x-ratelimit-limit'] || '0'),\n        parseInt(error.response?.headers?.['x-ratelimit-remaining'] || '0')\n      );\n\n    case 400:\n    case 422:\n      return new QueryValidationError(\n        data?.message || 'Invalid query',\n        data?.errors || []\n      );\n\n    default:\n      return OpenEvidenceError.fromApiError(error);\n  }\n}\n```\n\n### Step 3: Retry Logic with Exponential Backoff\n```typescript\n\u002F\u002F src\u002Fopenevidence\u002Fretry.ts\nimport { OpenEvidenceError, RateLimitError } from '.\u002Ferrors';\n\ninterface RetryConfig {\n  maxRetries: number;\n  baseDelayMs: number;\n  maxDelayMs: number;\n  jitterMs: number;\n}\n\nconst DEFAULT_CONFIG: RetryConfig = {\n  maxRetries: 3,\n  baseDelayMs: 1000,\n  maxDelayMs: 30000,\n  jitterMs: 500,\n};\n\nexport async function withRetry\u003CT>(\n  operation: () => Promise\u003CT>,\n  config: Partial\u003CRetryConfig> = {}\n): Promise\u003CT> {\n  const cfg = { ...DEFAULT_CONFIG, ...config };\n\n  for (let attempt = 0; attempt \u003C= cfg.maxRetries; attempt++) {\n    try {\n      return await operation();\n    } catch (error) {\n      if (!(error instanceof OpenEvidenceError) || !error.retryable) {\n        throw error;\n      }\n\n      if (attempt === cfg.maxRetries) {\n        throw error;\n      }\n\n      \u002F\u002F Use Retry-After header for rate limits\n      let delay: number;\n      if (error instanceof RateLimitError && error.retryAfter > 0) {\n        delay = error.retryAfter * 1000;\n      } else {\n        delay = Math.min(\n          cfg.baseDelayMs * Math.pow(2, attempt) + Math.random() * cfg.jitterMs,\n          cfg.maxDelayMs\n        );\n      }\n\n      console.log(`Retry ${attempt + 1}\u002F${cfg.maxRetries} after ${delay}ms`);\n      await new Promise(r => setTimeout(r, delay));\n    }\n  }\n\n  throw new Error('Unreachable');\n}\n```\n\n### Step 4: User-Facing Error Messages\n```typescript\n\u002F\u002F src\u002Fopenevidence\u002Ferror-messages.ts\nimport { OpenEvidenceError, RateLimitError, QueryValidationError } from '.\u002Ferrors';\n\nexport function getUserFriendlyMessage(error: OpenEvidenceError): string {\n  switch (error.code) {\n    case 'AUTH_FAILED':\n    case 'INVALID_API_KEY':\n      return 'Unable to connect to medical evidence service. Please contact support.';\n\n    case 'BAA_REQUIRED':\n      return 'Service configuration required. Please contact your administrator.';\n\n    case 'RATE_LIMITED':\n      const rle = error as RateLimitError;\n      return `Service temporarily unavailable. Please try again in ${rle.retryAfter} seconds.`;\n\n    case 'VALIDATION_ERROR':\n      const qve = error as QueryValidationError;\n      return `Please rephrase your clinical question. ${qve.validationErrors.join('. ')}`;\n\n    case 'QUERY_TOO_SHORT':\n      return 'Please provide more details about your clinical question.';\n\n    case 'INVALID_SPECIALTY':\n      return 'Please select a valid medical specialty.';\n\n    case 'SERVICE_UNAVAILABLE':\n      return 'Medical evidence service is temporarily unavailable. Please try again later.';\n\n    default:\n      if (error.statusCode >= 500) {\n        return 'Medical evidence service is experiencing issues. Please try again later.';\n      }\n      return 'Unable to process your request. Please try again or contact support.';\n  }\n}\n```\n\n## Output\n- Classified errors with appropriate handling\n- Retry logic for transient failures\n- User-friendly error messages\n- Comprehensive error logging (without PHI)\n\n## Diagnostic Commands\n\n### Quick Health Check\n```bash\n# Check if OpenEvidence is reachable\ncurl -s -o \u002Fdev\u002Fnull -w \"%{http_code}\" \\\n  -H \"Authorization: Bearer ${OPENEVIDENCE_API_KEY}\" \\\n  https:\u002F\u002Fapi.openevidence.com\u002Fhealth\n\n# Expected: 200\n```\n\n### Check Rate Limit Status\n```bash\ncurl -s -D - \\\n  -H \"Authorization: Bearer ${OPENEVIDENCE_API_KEY}\" \\\n  https:\u002F\u002Fapi.openevidence.com\u002Fv1\u002Frate-limit \\\n  | grep -i \"x-ratelimit\"\n\n# Headers show current limits\n```\n\n## Error Handling\n| Error Pattern | Detection | Resolution |\n|--------------|-----------|------------|\n| Intermittent 5xx | > 5% error rate | Enable circuit breaker |\n| Persistent 401 | All requests fail | Rotate API key |\n| Spike in 429 | Rate limit headers | Implement request queuing |\n| Timeout errors | P99 > 30s | Check network, simplify queries |\n\n## Examples\n\n### Complete Error-Handled Query\n```typescript\nasync function safeClinicalQuery(question: string) {\n  try {\n    return await withRetry(\n      () => withErrorHandling(\n        () => client.query({ question, context: { specialty: 'internal-medicine', urgency: 'routine' } }),\n        { operation: 'clinical-query' }\n      ),\n      { maxRetries: 3 }\n    );\n  } catch (error) {\n    if (error instanceof OpenEvidenceError) {\n      return {\n        success: false,\n        error: getUserFriendlyMessage(error),\n        code: error.code,\n      };\n    }\n    throw error;\n  }\n}\n```\n\n## Resources\n- [OpenEvidence Status](https:\u002F\u002Fstatus.openevidence.com\u002F)\n- [OpenEvidence Support](mailto:support@openevidence.com)\n\n## Next Steps\nFor comprehensive debugging, see `openevidence-debug-bundle`.\n",{"name":5,"author":54,"license":15,"version":55,"description":56,"allowed-tools":57},"Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Diagnose and resolve common OpenEvidence API errors.\nUse when encountering error codes, debugging failed requests,\nor implementing error handling for clinical queries.\nTrigger with phrases like \"openevidence error\", \"openevidence failing\",\n\"fix openevidence\", \"openevidence debug\", \"openevidence 4xx\", \"openevidence 5xx\".\n","Read, Write, Edit, Grep","main","90b50ed0778745a80fd5bfb13b1843d45b9e82f7","tests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Fopenevidence-pack\u002Fskills\u002Fopenevidence-common-errors",231,"https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust","https:\u002F\u002Fgithub.com\u002FDicklesworthstone","https:\u002F\u002Fwww.jeffreyemanuel.com\u002F","Building in NY","2026-11-11 01:23:40",{"source":8,"skillName":5,"commands":68,"prompt":78,"zipAvailable":79},[69,72,75],{"tool":70,"command":71},"npx","npx skills add Dicklesworthstone\u002Fpi_agent_rust --skill openevidence-common-errors",{"tool":73,"command":74},"bunx","bunx skills add Dicklesworthstone\u002Fpi_agent_rust --skill openevidence-common-errors",{"tool":76,"command":77},"pnpm","pnpm dlx skills add Dicklesworthstone\u002Fpi_agent_rust --skill openevidence-common-errors","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Fopenevidence-pack\u002Fskills\u002Fopenevidence-common-errors\u002FSKILL.md",true,[],[82,121,144,170,197,219],{"skillNo":83,"name":84,"nameZh":6,"description":85,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":86,"licenseFileUrl":87,"sourceHtmlUrl":88,"categories":89,"keywords":95,"publishedAt":49},"01M6FEGPPK0ZTKCCM0R3E3KS33","web-artifacts-builder","Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn\u002Fui). Use for complex artifacts requiring state management, routing, or shadcn\u002Fui components - not for simple single-file HTML\u002FJSX artifacts.","Apache-2.0","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Futilities\u002Fweb-artifacts-builder\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Futilities\u002Fweb-artifacts-builder\u002FSKILL.md",[90],{"categoryNo":91,"categoryName":92,"taxonomyType":93,"taxonomyTypeDesc":94},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,40,114,115,116,117,118,30,119,120],"web artifacts builder","web","artifacts","artifacts builder","builder","frontend","css","components","react","component","routing","state management","state","shadcn","file","ui","Tools","Tailwind","html","single-file","simple","ui components","multi","jsx","suite",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":86,"licenseFileUrl":125,"sourceHtmlUrl":126,"categories":127,"keywords":132,"publishedAt":49},"01M6FEE9VTK1W4GY21AKREJXRG","webapp-testing","Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fsecurity\u002Fwebapp-testing\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fsecurity\u002Fwebapp-testing\u002FSKILL.md",[128,131],{"categoryNo":129,"categoryName":130,"taxonomyType":93,"taxonomyTypeDesc":94},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":91,"categoryName":92,"taxonomyType":93,"taxonomyTypeDesc":94},[133,134,135,101,136,137,97,47,138,139,111,140,141,142,143,33,30],"testing","webapp testing","webapp","screenshots","playwright","toolkit","browser","logs","applications","behavior","local",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":148,"sourceHtmlUrl":149,"categories":150,"keywords":151,"publishedAt":49},"01M6FE20F7ZTQBFWKF4MPJ2SBX","neuropixels-analysis","Neuropixels neural recording analysis. Load SpikeGLX\u002FOpenEphys data, preprocess, motion correction, Kilosort4 spike sorting, quality metrics, Allen\u002FIBL curation, AI-assisted visual analysis, for Neuropixels 1.0\u002F2.0 extracellular electrophysiology. Use when working with neural recordings, spike sorting, extracellular electrophysiology, or when the user mentions Neuropixels, SpikeGLX, Open Ephys, Kilosort, quality metrics, or unit curation.","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fneuropixels-analysis\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fneuropixels-analysis\u002FSKILL.md",[],[152,153,154,155,156,157,158,159,40,160,161,162,163,164,165,166,33,167,168,169,30,29],"analysis","neuropixels analysis","spike","metrics","data","open","quality","user","recordings","Neural","motion","visual","quality metrics","unit","sorting","curation","recording","load",{"skillNo":171,"name":172,"nameZh":6,"description":173,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":86,"licenseFileUrl":174,"sourceHtmlUrl":175,"categories":176,"keywords":180,"publishedAt":49},"01M6FDP0PDK6F1GGX395C7625Z","skill-creator","Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fskill-creator\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fskill-creator\u002FSKILL.md",[177],{"categoryNo":178,"categoryName":179,"taxonomyType":93,"taxonomyTypeDesc":94},"01JBSEEDCAT000000000000023","Skill与智能体开发",[181,182,183,184,185,186,187,188,189,190,191,192,193,194,33,30,195,29,196],"skill creator","creator","workflows","create","update","capabilities","knowledge","tool","integrations","specialized","guide","new skill","existing skill","users","Existing","new",{"skillNo":198,"name":199,"nameZh":6,"description":200,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":201,"sourceHtmlUrl":202,"categories":203,"keywords":205,"publishedAt":49},"01M6FDM8Y7VK7NYG9SM7QPA3PW","notebooklm","Use this skill to query your Google NotebookLM notebooks directly from Claude Code for source-grounded, citation-backed answers from Gemini. Browser automation, library management, persistent auth. Drastically reduced hallucinations through document-only responses.","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fnotebooklm\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fnotebooklm\u002FSKILL.md",[204],{"categoryNo":178,"categoryName":179,"taxonomyType":93,"taxonomyTypeDesc":94},[199,206,207,208,209,210,211,139,212,213,40,214,215,216,217,30,218],"google","browser automation","gemini","automation","auth","code","library","management","only","document","query","Citation","source",{"skillNo":220,"name":221,"nameZh":6,"description":222,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":86,"licenseFileUrl":223,"sourceHtmlUrl":224,"categories":225,"keywords":232,"publishedAt":49},"01M6FDHPXE10J3XGTCH5HBHS1M","slack-gif-creator","Knowledge and utilities for creating animated GIFs optimized for Slack. Provides constraints, validation tools, and animation concepts. Use when users request animated GIFs for Slack like \"make me a GIF of X doing Y for Slack.\"","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fenterprise-communication\u002Fslack-gif-creator\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fenterprise-communication\u002Fslack-gif-creator\u002FSKILL.md",[226,229],{"categoryNo":227,"categoryName":228,"taxonomyType":93,"taxonomyTypeDesc":94},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":230,"categoryName":231,"taxonomyType":93,"taxonomyTypeDesc":94},"01JBSEEDCAT000000000000016","图像与多媒体",[233,234,235,182,236,112,237,238,187,40,239,194,240,241,242,30,243,29],"slack gif creator","slack","gif","validation","constraints","Animation","me","make","Utilities","concepts","request"]