[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F6ABKPB91MMTFMEXR2GMXP":3,"skill-same:01M6F6ABKPB91MMTFMEXR2GMXP":74},{"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":42,"linkOnly":43,"markdownContent":44,"markdownBody":45,"frontMatter":46,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":6,"ownerHtmlUrl":56,"ownerBlogUrl":57,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M6F6ABKPB91MMTFMEXR2GMXP","deepgram-migration-deep-dive",null,"Deep dive into complex Deepgram migrations and provider transitions.\nUse when migrating from other transcription providers, planning large-scale\nmigrations, or implementing phased rollout strategies.\nTrigger with phrases like \"deepgram migration\", \"switch to deepgram\",\n\"migrate transcription\", \"deepgram from AWS\", \"deepgram from Google\".","Dicklesworthstone\u002Fpi_agent_rust","Dicklesworthstone","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F35050222?v=4","01M6CG26AR942CSVMN1M5E3DSE","Jeff Emanuel","01M6CG26EPP71PSHW1VDS71121",1981,"MIT","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Fdeepgram-pack\u002Fskills\u002Fdeepgram-migration-deep-dive\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41],"deep dive","deepgram migration deep dive","deepgram","deep","migration","when","google","implementing","trigger","io","strategies","switch","provider","rollout","use","edit","write","read","migrate","Bash","Providers","kubectl","planning","2026-11-10 10:12:30",false,"---\nname: deepgram-migration-deep-dive\ndescription: |\n  Deep dive into complex Deepgram migrations and provider transitions.\n  Use when migrating from other transcription providers, planning large-scale\n  migrations, or implementing phased rollout strategies.\n  Trigger with phrases like \"deepgram migration\", \"switch to deepgram\",\n  \"migrate transcription\", \"deepgram from AWS\", \"deepgram from Google\".\nallowed-tools: Read, Write, Edit, Bash(kubectl:*), Bash(curl:*)\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\n---\n\n# Deepgram Migration Deep Dive\n\n## Overview\nComprehensive guide for migrating to Deepgram from other transcription providers or legacy systems.\n\n## Common Migration Sources\n\n| Source Provider | Complexity | Key Differences |\n|-----------------|------------|-----------------|\n| AWS Transcribe | Medium | Async-first vs sync options |\n| Google Cloud STT | Medium | Different model naming |\n| Azure Speech | Medium | Authentication model |\n| OpenAI Whisper | Low | Self-hosted vs API |\n| Rev.ai | Low | Similar API structure |\n| AssemblyAI | Low | Similar feature set |\n\n## Migration Strategy\n\n### Phase 1: Assessment\n- Audit current usage\n- Map features to Deepgram equivalents\n- Estimate costs\n- Plan timeline\n\n### Phase 2: Parallel Running\n- Run both providers simultaneously\n- Compare results\n- Build confidence\n\n### Phase 3: Gradual Rollout\n- Shift traffic incrementally\n- Monitor quality\n- Address issues\n\n### Phase 4: Cutover\n- Complete migration\n- Decommission old provider\n- Documentation update\n\n## Implementation\n\n### Migration Adapter Pattern\n```typescript\n\u002F\u002F adapters\u002Ftranscription-adapter.ts\nexport interface TranscriptionResult {\n  transcript: string;\n  confidence: number;\n  words?: Array\u003C{\n    word: string;\n    start: number;\n    end: number;\n    confidence: number;\n  }>;\n  speakers?: Array\u003C{\n    speaker: number;\n    start: number;\n    end: number;\n  }>;\n  language?: string;\n  provider: string;\n}\n\nexport interface TranscriptionOptions {\n  language?: string;\n  diarization?: boolean;\n  punctuation?: boolean;\n  profanityFilter?: boolean;\n}\n\nexport interface TranscriptionAdapter {\n  name: string;\n  transcribe(\n    audioUrl: string,\n    options: TranscriptionOptions\n  ): Promise\u003CTranscriptionResult>;\n  transcribeFile(\n    audioBuffer: Buffer,\n    options: TranscriptionOptions\n  ): Promise\u003CTranscriptionResult>;\n}\n```\n\n### Deepgram Adapter\n```typescript\n\u002F\u002F adapters\u002Fdeepgram-adapter.ts\nimport { createClient } from '@deepgram\u002Fsdk';\nimport { TranscriptionAdapter, TranscriptionResult, TranscriptionOptions } from '.\u002Ftranscription-adapter';\n\nexport class DeepgramAdapter implements TranscriptionAdapter {\n  name = 'deepgram';\n  private client;\n\n  constructor(apiKey: string) {\n    this.client = createClient(apiKey);\n  }\n\n  async transcribe(\n    audioUrl: string,\n    options: TranscriptionOptions\n  ): Promise\u003CTranscriptionResult> {\n    const { result, error } = await this.client.listen.prerecorded.transcribeUrl(\n      { url: audioUrl },\n      {\n        model: 'nova-2',\n        language: options.language || 'en',\n        diarize: options.diarization ?? false,\n        punctuate: options.punctuation ?? true,\n        profanity_filter: options.profanityFilter ?? false,\n        smart_format: true,\n      }\n    );\n\n    if (error) throw error;\n\n    return this.normalizeResult(result);\n  }\n\n  async transcribeFile(\n    audioBuffer: Buffer,\n    options: TranscriptionOptions\n  ): Promise\u003CTranscriptionResult> {\n    const { result, error } = await this.client.listen.prerecorded.transcribeFile(\n      audioBuffer,\n      {\n        model: 'nova-2',\n        language: options.language || 'en',\n        diarize: options.diarization ?? false,\n        punctuate: options.punctuation ?? true,\n        smart_format: true,\n      }\n    );\n\n    if (error) throw error;\n\n    return this.normalizeResult(result);\n  }\n\n  private normalizeResult(result: any): TranscriptionResult {\n    const channel = result.results.channels[0];\n    const alternative = channel.alternatives[0];\n\n    return {\n      transcript: alternative.transcript,\n      confidence: alternative.confidence,\n      words: alternative.words?.map((w: any) => ({\n        word: w.punctuated_word || w.word,\n        start: w.start,\n        end: w.end,\n        confidence: w.confidence,\n      })),\n      language: channel.detected_language,\n      provider: this.name,\n    };\n  }\n}\n```\n\n### AWS Transcribe Adapter (for comparison)\n```typescript\n\u002F\u002F adapters\u002Faws-transcribe-adapter.ts\nimport {\n  TranscribeClient,\n  StartTranscriptionJobCommand,\n  GetTranscriptionJobCommand,\n} from '@aws-sdk\u002Fclient-transcribe';\nimport { S3Client, GetObjectCommand } from '@aws-sdk\u002Fclient-s3';\nimport { TranscriptionAdapter, TranscriptionResult, TranscriptionOptions } from '.\u002Ftranscription-adapter';\n\nexport class AWSTranscribeAdapter implements TranscriptionAdapter {\n  name = 'aws-transcribe';\n  private transcribe: TranscribeClient;\n  private s3: S3Client;\n\n  constructor() {\n    this.transcribe = new TranscribeClient({});\n    this.s3 = new S3Client({});\n  }\n\n  async transcribe(\n    audioUrl: string,\n    options: TranscriptionOptions\n  ): Promise\u003CTranscriptionResult> {\n    const jobName = `job-${Date.now()}`;\n\n    \u002F\u002F Start transcription job\n    await this.transcribe.send(new StartTranscriptionJobCommand({\n      TranscriptionJobName: jobName,\n      Media: { MediaFileUri: audioUrl },\n      LanguageCode: options.language || 'en-US',\n      Settings: {\n        ShowSpeakerLabels: options.diarization,\n        MaxSpeakerLabels: options.diarization ? 10 : undefined,\n      },\n    }));\n\n    \u002F\u002F Poll for completion\n    const result = await this.waitForJob(jobName);\n\n    return this.normalizeResult(result);\n  }\n\n  async transcribeFile(\n    audioBuffer: Buffer,\n    options: TranscriptionOptions\n  ): Promise\u003CTranscriptionResult> {\n    \u002F\u002F AWS requires S3, so upload first\n    throw new Error('Use transcribe() with S3 URL for AWS Transcribe');\n  }\n\n  private async waitForJob(jobName: string): Promise\u003Cany> {\n    while (true) {\n      const { TranscriptionJob } = await this.transcribe.send(\n        new GetTranscriptionJobCommand({ TranscriptionJobName: jobName })\n      );\n\n      if (TranscriptionJob?.TranscriptionJobStatus === 'COMPLETED') {\n        \u002F\u002F Fetch result from S3\n        const resultUrl = TranscriptionJob.Transcript?.TranscriptFileUri;\n        \u002F\u002F Parse and return\n        return {}; \u002F\u002F Simplified\n      }\n\n      if (TranscriptionJob?.TranscriptionJobStatus === 'FAILED') {\n        throw new Error('Transcription failed');\n      }\n\n      await new Promise(r => setTimeout(r, 5000));\n    }\n  }\n\n  private normalizeResult(result: any): TranscriptionResult {\n    \u002F\u002F Normalize AWS format to common format\n    return {\n      transcript: result.results?.transcripts?.[0]?.transcript || '',\n      confidence: 0.9, \u002F\u002F AWS doesn't provide overall confidence\n      provider: this.name,\n    };\n  }\n}\n```\n\n### Migration Router\n```typescript\n\u002F\u002F services\u002Fmigration-router.ts\nimport { TranscriptionAdapter, TranscriptionOptions, TranscriptionResult } from '..\u002Fadapters\u002Ftranscription-adapter';\nimport { DeepgramAdapter } from '..\u002Fadapters\u002Fdeepgram-adapter';\nimport { AWSTranscribeAdapter } from '..\u002Fadapters\u002Faws-transcribe-adapter';\n\ninterface MigrationConfig {\n  deepgramPercentage: number; \u002F\u002F 0-100\n  compareResults: boolean;\n  logDifferences: boolean;\n}\n\nexport class MigrationRouter {\n  private deepgram: TranscriptionAdapter;\n  private legacy: TranscriptionAdapter;\n  private config: MigrationConfig;\n\n  constructor(config: MigrationConfig) {\n    this.deepgram = new DeepgramAdapter(process.env.DEEPGRAM_API_KEY!);\n    this.legacy = new AWSTranscribeAdapter();\n    this.config = config;\n  }\n\n  async transcribe(\n    audioUrl: string,\n    options: TranscriptionOptions\n  ): Promise\u003CTranscriptionResult> {\n    \u002F\u002F Decide which provider to use\n    const useDeepgram = Math.random() * 100 \u003C this.config.deepgramPercentage;\n\n    if (this.config.compareResults) {\n      \u002F\u002F Run both and compare\n      const [deepgramResult, legacyResult] = await Promise.all([\n        this.deepgram.transcribe(audioUrl, options).catch(e => null),\n        this.legacy.transcribe(audioUrl, options).catch(e => null),\n      ]);\n\n      if (deepgramResult && legacyResult) {\n        this.compareAndLog(deepgramResult, legacyResult, audioUrl);\n      }\n\n      \u002F\u002F Return based on routing decision\n      if (useDeepgram && deepgramResult) {\n        return deepgramResult;\n      }\n      if (legacyResult) {\n        return legacyResult;\n      }\n      throw new Error('Both providers failed');\n    }\n\n    \u002F\u002F Single provider mode\n    const provider = useDeepgram ? this.deepgram : this.legacy;\n    return provider.transcribe(audioUrl, options);\n  }\n\n  private compareAndLog(\n    deepgram: TranscriptionResult,\n    legacy: TranscriptionResult,\n    audioUrl: string\n  ): void {\n    const similarity = this.calculateSimilarity(\n      deepgram.transcript,\n      legacy.transcript\n    );\n\n    const comparison = {\n      audioUrl,\n      similarity,\n      deepgramConfidence: deepgram.confidence,\n      legacyConfidence: legacy.confidence,\n      deepgramLength: deepgram.transcript.length,\n      legacyLength: legacy.transcript.length,\n    };\n\n    if (this.config.logDifferences && similarity \u003C 0.95) {\n      console.log('Significant difference detected:', comparison);\n      \u002F\u002F Could also store to database for analysis\n    }\n  }\n\n  private calculateSimilarity(a: string, b: string): number {\n    const wordsA = a.toLowerCase().split(\u002F\\s+\u002F);\n    const wordsB = b.toLowerCase().split(\u002F\\s+\u002F);\n\n    const setA = new Set(wordsA);\n    const setB = new Set(wordsB);\n\n    const intersection = new Set([...setA].filter(x => setB.has(x)));\n    const union = new Set([...setA, ...setB]);\n\n    return intersection.size \u002F union.size;\n  }\n\n  async setDeepgramPercentage(percentage: number): Promise\u003Cvoid> {\n    if (percentage \u003C 0 || percentage > 100) {\n      throw new Error('Percentage must be 0-100');\n    }\n    this.config.deepgramPercentage = percentage;\n  }\n}\n```\n\n### Feature Mapping\n```typescript\n\u002F\u002F config\u002Ffeature-mapping.ts\ninterface FeatureMap {\n  source: string;\n  deepgram: string;\n  notes: string;\n}\n\nexport const awsToDeepgram: FeatureMap[] = [\n  {\n    source: 'LanguageCode: en-US',\n    deepgram: 'language: \"en\"',\n    notes: 'Deepgram uses ISO 639-1 codes',\n  },\n  {\n    source: 'ShowSpeakerLabels: true',\n    deepgram: 'diarize: true',\n    notes: 'Similar functionality',\n  },\n  {\n    source: 'VocabularyName: custom',\n    deepgram: 'keywords: [\"term:1.5\"]',\n    notes: 'Use keywords with boost values',\n  },\n  {\n    source: 'ContentRedaction',\n    deepgram: 'redact: [\"pci\", \"ssn\"]',\n    notes: 'Built-in PII redaction',\n  },\n];\n\nexport const googleToDeepgram: FeatureMap[] = [\n  {\n    source: 'encoding: LINEAR16',\n    deepgram: 'mimetype: \"audio\u002Fwav\"',\n    notes: 'Auto-detected by Deepgram',\n  },\n  {\n    source: 'enableWordTimeOffsets: true',\n    deepgram: 'Default behavior',\n    notes: 'Always included in Deepgram',\n  },\n  {\n    source: 'enableAutomaticPunctuation: true',\n    deepgram: 'punctuate: true',\n    notes: 'Same functionality',\n  },\n  {\n    source: 'model: video',\n    deepgram: 'model: \"nova-2\"',\n    notes: 'Nova-2 handles all use cases',\n  },\n];\n```\n\n### Migration Validation\n```typescript\n\u002F\u002F scripts\u002Fvalidate-migration.ts\nimport { MigrationRouter } from '..\u002Fservices\u002Fmigration-router';\n\ninterface ValidationResult {\n  totalTests: number;\n  passed: number;\n  failed: number;\n  avgSimilarity: number;\n  avgDeepgramLatency: number;\n  avgLegacyLatency: number;\n}\n\nasync function validateMigration(\n  testAudioUrls: string[]\n): Promise\u003CValidationResult> {\n  const router = new MigrationRouter({\n    deepgramPercentage: 50,\n    compareResults: true,\n    logDifferences: true,\n  });\n\n  const results = {\n    totalTests: testAudioUrls.length,\n    passed: 0,\n    failed: 0,\n    avgSimilarity: 0,\n    avgDeepgramLatency: 0,\n    avgLegacyLatency: 0,\n  };\n\n  const similarities: number[] = [];\n  const deepgramLatencies: number[] = [];\n  const legacyLatencies: number[] = [];\n\n  for (const url of testAudioUrls) {\n    try {\n      \u002F\u002F Measure Deepgram\n      const dgStart = Date.now();\n      const dgResult = await router['deepgram'].transcribe(url, {});\n      deepgramLatencies.push(Date.now() - dgStart);\n\n      \u002F\u002F Measure Legacy\n      const legStart = Date.now();\n      const legResult = await router['legacy'].transcribe(url, {});\n      legacyLatencies.push(Date.now() - legStart);\n\n      \u002F\u002F Calculate similarity\n      const similarity = router['calculateSimilarity'](\n        dgResult.transcript,\n        legResult.transcript\n      );\n      similarities.push(similarity);\n\n      if (similarity >= 0.90) {\n        results.passed++;\n      } else {\n        results.failed++;\n        console.log(`Low similarity for ${url}: ${similarity}`);\n      }\n    } catch (error) {\n      results.failed++;\n      console.error(`Test failed for ${url}:`, error);\n    }\n  }\n\n  results.avgSimilarity = similarities.reduce((a, b) => a + b, 0) \u002F similarities.length;\n  results.avgDeepgramLatency = deepgramLatencies.reduce((a, b) => a + b, 0) \u002F deepgramLatencies.length;\n  results.avgLegacyLatency = legacyLatencies.reduce((a, b) => a + b, 0) \u002F legacyLatencies.length;\n\n  return results;\n}\n\n\u002F\u002F Run validation\nconst testUrls = [\n  'https:\u002F\u002Fexample.com\u002Faudio1.wav',\n  'https:\u002F\u002Fexample.com\u002Faudio2.wav',\n  \u002F\u002F Add more test URLs\n];\n\nvalidateMigration(testUrls).then(results => {\n  console.log('\\n=== Migration Validation Results ===');\n  console.log(`Total Tests: ${results.totalTests}`);\n  console.log(`Passed: ${results.passed}`);\n  console.log(`Failed: ${results.failed}`);\n  console.log(`Avg Similarity: ${(results.avgSimilarity * 100).toFixed(1)}%`);\n  console.log(`Avg Deepgram Latency: ${results.avgDeepgramLatency.toFixed(0)}ms`);\n  console.log(`Avg Legacy Latency: ${results.avgLegacyLatency.toFixed(0)}ms`);\n\n  if (results.passed \u002F results.totalTests >= 0.95) {\n    console.log('\\n Migration validation PASSED');\n  } else {\n    console.log('\\n Migration validation FAILED - review differences');\n  }\n});\n```\n\n### Rollback Plan\n```typescript\n\u002F\u002F services\u002Frollback.ts\nimport { MigrationRouter } from '.\u002Fmigration-router';\n\nexport class RollbackManager {\n  private router: MigrationRouter;\n  private checkpoints: Array\u003C{ timestamp: Date; percentage: number }> = [];\n\n  constructor(router: MigrationRouter) {\n    this.router = router;\n  }\n\n  async checkpoint(): Promise\u003Cvoid> {\n    const current = await this.getCurrentPercentage();\n    this.checkpoints.push({\n      timestamp: new Date(),\n      percentage: current,\n    });\n  }\n\n  async rollback(): Promise\u003Cvoid> {\n    const previous = this.checkpoints.pop();\n    if (previous) {\n      await this.router.setDeepgramPercentage(previous.percentage);\n      console.log(`Rolled back to ${previous.percentage}%`);\n    } else {\n      await this.router.setDeepgramPercentage(0);\n      console.log('Rolled back to 0% (full legacy)');\n    }\n  }\n\n  async emergencyRollback(): Promise\u003Cvoid> {\n    await this.router.setDeepgramPercentage(0);\n    console.log('EMERGENCY: Rolled back to 0%');\n  }\n\n  private async getCurrentPercentage(): Promise\u003Cnumber> {\n    return this.router['config'].deepgramPercentage;\n  }\n}\n```\n\n## Migration Checklist\n\n```markdown\n## Pre-Migration\n- [ ] Inventory current usage (hours\u002Fmonth, features used)\n- [ ] Map features to Deepgram equivalents\n- [ ] Estimate Deepgram costs\n- [ ] Set up Deepgram project and API keys\n- [ ] Implement adapter pattern\n- [ ] Create test dataset\n\n## Validation Phase\n- [ ] Run comparison tests\n- [ ] Verify accuracy meets requirements\n- [ ] Confirm latency is acceptable\n- [ ] Test all required features\n- [ ] Document any differences\n\n## Rollout Phase\n- [ ] Start at 5% traffic\n- [ ] Monitor error rates\n- [ ] Compare costs\n- [ ] Increase to 25%\n- [ ] Review for 1 week\n- [ ] Increase to 50%\n- [ ] Review for 1 week\n- [ ] Increase to 100%\n\n## Post-Migration\n- [ ] Decommission legacy provider\n- [ ] Update documentation\n- [ ] Archive comparison data\n- [ ] Update runbooks\n- [ ] Train team on Deepgram specifics\n```\n\n## Resources\n- [Deepgram Migration Guide](https:\u002F\u002Fdevelopers.deepgram.com\u002Fdocs\u002Fmigration)\n- [Feature Comparison](https:\u002F\u002Fdevelopers.deepgram.com\u002Fdocs\u002Ffeatures)\n- [Pricing Calculator](https:\u002F\u002Fdeepgram.com\u002Fpricing)\n\n## Conclusion\nThis skill pack provides 24 comprehensive skills for Deepgram integration covering the full development lifecycle from initial setup through enterprise deployment and migration scenarios.\n","# Deepgram Migration Deep Dive\n\n## Overview\nComprehensive guide for migrating to Deepgram from other transcription providers or legacy systems.\n\n## Common Migration Sources\n\n| Source Provider | Complexity | Key Differences |\n|-----------------|------------|-----------------|\n| AWS Transcribe | Medium | Async-first vs sync options |\n| Google Cloud STT | Medium | Different model naming |\n| Azure Speech | Medium | Authentication model |\n| OpenAI Whisper | Low | Self-hosted vs API |\n| Rev.ai | Low | Similar API structure |\n| AssemblyAI | Low | Similar feature set |\n\n## Migration Strategy\n\n### Phase 1: Assessment\n- Audit current usage\n- Map features to Deepgram equivalents\n- Estimate costs\n- Plan timeline\n\n### Phase 2: Parallel Running\n- Run both providers simultaneously\n- Compare results\n- Build confidence\n\n### Phase 3: Gradual Rollout\n- Shift traffic incrementally\n- Monitor quality\n- Address issues\n\n### Phase 4: Cutover\n- Complete migration\n- Decommission old provider\n- Documentation update\n\n## Implementation\n\n### Migration Adapter Pattern\n```typescript\n\u002F\u002F adapters\u002Ftranscription-adapter.ts\nexport interface TranscriptionResult {\n  transcript: string;\n  confidence: number;\n  words?: Array\u003C{\n    word: string;\n    start: number;\n    end: number;\n    confidence: number;\n  }>;\n  speakers?: Array\u003C{\n    speaker: number;\n    start: number;\n    end: number;\n  }>;\n  language?: string;\n  provider: string;\n}\n\nexport interface TranscriptionOptions {\n  language?: string;\n  diarization?: boolean;\n  punctuation?: boolean;\n  profanityFilter?: boolean;\n}\n\nexport interface TranscriptionAdapter {\n  name: string;\n  transcribe(\n    audioUrl: string,\n    options: TranscriptionOptions\n  ): Promise\u003CTranscriptionResult>;\n  transcribeFile(\n    audioBuffer: Buffer,\n    options: TranscriptionOptions\n  ): Promise\u003CTranscriptionResult>;\n}\n```\n\n### Deepgram Adapter\n```typescript\n\u002F\u002F adapters\u002Fdeepgram-adapter.ts\nimport { createClient } from '@deepgram\u002Fsdk';\nimport { TranscriptionAdapter, TranscriptionResult, TranscriptionOptions } from '.\u002Ftranscription-adapter';\n\nexport class DeepgramAdapter implements TranscriptionAdapter {\n  name = 'deepgram';\n  private client;\n\n  constructor(apiKey: string) {\n    this.client = createClient(apiKey);\n  }\n\n  async transcribe(\n    audioUrl: string,\n    options: TranscriptionOptions\n  ): Promise\u003CTranscriptionResult> {\n    const { result, error } = await this.client.listen.prerecorded.transcribeUrl(\n      { url: audioUrl },\n      {\n        model: 'nova-2',\n        language: options.language || 'en',\n        diarize: options.diarization ?? false,\n        punctuate: options.punctuation ?? true,\n        profanity_filter: options.profanityFilter ?? false,\n        smart_format: true,\n      }\n    );\n\n    if (error) throw error;\n\n    return this.normalizeResult(result);\n  }\n\n  async transcribeFile(\n    audioBuffer: Buffer,\n    options: TranscriptionOptions\n  ): Promise\u003CTranscriptionResult> {\n    const { result, error } = await this.client.listen.prerecorded.transcribeFile(\n      audioBuffer,\n      {\n        model: 'nova-2',\n        language: options.language || 'en',\n        diarize: options.diarization ?? false,\n        punctuate: options.punctuation ?? true,\n        smart_format: true,\n      }\n    );\n\n    if (error) throw error;\n\n    return this.normalizeResult(result);\n  }\n\n  private normalizeResult(result: any): TranscriptionResult {\n    const channel = result.results.channels[0];\n    const alternative = channel.alternatives[0];\n\n    return {\n      transcript: alternative.transcript,\n      confidence: alternative.confidence,\n      words: alternative.words?.map((w: any) => ({\n        word: w.punctuated_word || w.word,\n        start: w.start,\n        end: w.end,\n        confidence: w.confidence,\n      })),\n      language: channel.detected_language,\n      provider: this.name,\n    };\n  }\n}\n```\n\n### AWS Transcribe Adapter (for comparison)\n```typescript\n\u002F\u002F adapters\u002Faws-transcribe-adapter.ts\nimport {\n  TranscribeClient,\n  StartTranscriptionJobCommand,\n  GetTranscriptionJobCommand,\n} from '@aws-sdk\u002Fclient-transcribe';\nimport { S3Client, GetObjectCommand } from '@aws-sdk\u002Fclient-s3';\nimport { TranscriptionAdapter, TranscriptionResult, TranscriptionOptions } from '.\u002Ftranscription-adapter';\n\nexport class AWSTranscribeAdapter implements TranscriptionAdapter {\n  name = 'aws-transcribe';\n  private transcribe: TranscribeClient;\n  private s3: S3Client;\n\n  constructor() {\n    this.transcribe = new TranscribeClient({});\n    this.s3 = new S3Client({});\n  }\n\n  async transcribe(\n    audioUrl: string,\n    options: TranscriptionOptions\n  ): Promise\u003CTranscriptionResult> {\n    const jobName = `job-${Date.now()}`;\n\n    \u002F\u002F Start transcription job\n    await this.transcribe.send(new StartTranscriptionJobCommand({\n      TranscriptionJobName: jobName,\n      Media: { MediaFileUri: audioUrl },\n      LanguageCode: options.language || 'en-US',\n      Settings: {\n        ShowSpeakerLabels: options.diarization,\n        MaxSpeakerLabels: options.diarization ? 10 : undefined,\n      },\n    }));\n\n    \u002F\u002F Poll for completion\n    const result = await this.waitForJob(jobName);\n\n    return this.normalizeResult(result);\n  }\n\n  async transcribeFile(\n    audioBuffer: Buffer,\n    options: TranscriptionOptions\n  ): Promise\u003CTranscriptionResult> {\n    \u002F\u002F AWS requires S3, so upload first\n    throw new Error('Use transcribe() with S3 URL for AWS Transcribe');\n  }\n\n  private async waitForJob(jobName: string): Promise\u003Cany> {\n    while (true) {\n      const { TranscriptionJob } = await this.transcribe.send(\n        new GetTranscriptionJobCommand({ TranscriptionJobName: jobName })\n      );\n\n      if (TranscriptionJob?.TranscriptionJobStatus === 'COMPLETED') {\n        \u002F\u002F Fetch result from S3\n        const resultUrl = TranscriptionJob.Transcript?.TranscriptFileUri;\n        \u002F\u002F Parse and return\n        return {}; \u002F\u002F Simplified\n      }\n\n      if (TranscriptionJob?.TranscriptionJobStatus === 'FAILED') {\n        throw new Error('Transcription failed');\n      }\n\n      await new Promise(r => setTimeout(r, 5000));\n    }\n  }\n\n  private normalizeResult(result: any): TranscriptionResult {\n    \u002F\u002F Normalize AWS format to common format\n    return {\n      transcript: result.results?.transcripts?.[0]?.transcript || '',\n      confidence: 0.9, \u002F\u002F AWS doesn't provide overall confidence\n      provider: this.name,\n    };\n  }\n}\n```\n\n### Migration Router\n```typescript\n\u002F\u002F services\u002Fmigration-router.ts\nimport { TranscriptionAdapter, TranscriptionOptions, TranscriptionResult } from '..\u002Fadapters\u002Ftranscription-adapter';\nimport { DeepgramAdapter } from '..\u002Fadapters\u002Fdeepgram-adapter';\nimport { AWSTranscribeAdapter } from '..\u002Fadapters\u002Faws-transcribe-adapter';\n\ninterface MigrationConfig {\n  deepgramPercentage: number; \u002F\u002F 0-100\n  compareResults: boolean;\n  logDifferences: boolean;\n}\n\nexport class MigrationRouter {\n  private deepgram: TranscriptionAdapter;\n  private legacy: TranscriptionAdapter;\n  private config: MigrationConfig;\n\n  constructor(config: MigrationConfig) {\n    this.deepgram = new DeepgramAdapter(process.env.DEEPGRAM_API_KEY!);\n    this.legacy = new AWSTranscribeAdapter();\n    this.config = config;\n  }\n\n  async transcribe(\n    audioUrl: string,\n    options: TranscriptionOptions\n  ): Promise\u003CTranscriptionResult> {\n    \u002F\u002F Decide which provider to use\n    const useDeepgram = Math.random() * 100 \u003C this.config.deepgramPercentage;\n\n    if (this.config.compareResults) {\n      \u002F\u002F Run both and compare\n      const [deepgramResult, legacyResult] = await Promise.all([\n        this.deepgram.transcribe(audioUrl, options).catch(e => null),\n        this.legacy.transcribe(audioUrl, options).catch(e => null),\n      ]);\n\n      if (deepgramResult && legacyResult) {\n        this.compareAndLog(deepgramResult, legacyResult, audioUrl);\n      }\n\n      \u002F\u002F Return based on routing decision\n      if (useDeepgram && deepgramResult) {\n        return deepgramResult;\n      }\n      if (legacyResult) {\n        return legacyResult;\n      }\n      throw new Error('Both providers failed');\n    }\n\n    \u002F\u002F Single provider mode\n    const provider = useDeepgram ? this.deepgram : this.legacy;\n    return provider.transcribe(audioUrl, options);\n  }\n\n  private compareAndLog(\n    deepgram: TranscriptionResult,\n    legacy: TranscriptionResult,\n    audioUrl: string\n  ): void {\n    const similarity = this.calculateSimilarity(\n      deepgram.transcript,\n      legacy.transcript\n    );\n\n    const comparison = {\n      audioUrl,\n      similarity,\n      deepgramConfidence: deepgram.confidence,\n      legacyConfidence: legacy.confidence,\n      deepgramLength: deepgram.transcript.length,\n      legacyLength: legacy.transcript.length,\n    };\n\n    if (this.config.logDifferences && similarity \u003C 0.95) {\n      console.log('Significant difference detected:', comparison);\n      \u002F\u002F Could also store to database for analysis\n    }\n  }\n\n  private calculateSimilarity(a: string, b: string): number {\n    const wordsA = a.toLowerCase().split(\u002F\\s+\u002F);\n    const wordsB = b.toLowerCase().split(\u002F\\s+\u002F);\n\n    const setA = new Set(wordsA);\n    const setB = new Set(wordsB);\n\n    const intersection = new Set([...setA].filter(x => setB.has(x)));\n    const union = new Set([...setA, ...setB]);\n\n    return intersection.size \u002F union.size;\n  }\n\n  async setDeepgramPercentage(percentage: number): Promise\u003Cvoid> {\n    if (percentage \u003C 0 || percentage > 100) {\n      throw new Error('Percentage must be 0-100');\n    }\n    this.config.deepgramPercentage = percentage;\n  }\n}\n```\n\n### Feature Mapping\n```typescript\n\u002F\u002F config\u002Ffeature-mapping.ts\ninterface FeatureMap {\n  source: string;\n  deepgram: string;\n  notes: string;\n}\n\nexport const awsToDeepgram: FeatureMap[] = [\n  {\n    source: 'LanguageCode: en-US',\n    deepgram: 'language: \"en\"',\n    notes: 'Deepgram uses ISO 639-1 codes',\n  },\n  {\n    source: 'ShowSpeakerLabels: true',\n    deepgram: 'diarize: true',\n    notes: 'Similar functionality',\n  },\n  {\n    source: 'VocabularyName: custom',\n    deepgram: 'keywords: [\"term:1.5\"]',\n    notes: 'Use keywords with boost values',\n  },\n  {\n    source: 'ContentRedaction',\n    deepgram: 'redact: [\"pci\", \"ssn\"]',\n    notes: 'Built-in PII redaction',\n  },\n];\n\nexport const googleToDeepgram: FeatureMap[] = [\n  {\n    source: 'encoding: LINEAR16',\n    deepgram: 'mimetype: \"audio\u002Fwav\"',\n    notes: 'Auto-detected by Deepgram',\n  },\n  {\n    source: 'enableWordTimeOffsets: true',\n    deepgram: 'Default behavior',\n    notes: 'Always included in Deepgram',\n  },\n  {\n    source: 'enableAutomaticPunctuation: true',\n    deepgram: 'punctuate: true',\n    notes: 'Same functionality',\n  },\n  {\n    source: 'model: video',\n    deepgram: 'model: \"nova-2\"',\n    notes: 'Nova-2 handles all use cases',\n  },\n];\n```\n\n### Migration Validation\n```typescript\n\u002F\u002F scripts\u002Fvalidate-migration.ts\nimport { MigrationRouter } from '..\u002Fservices\u002Fmigration-router';\n\ninterface ValidationResult {\n  totalTests: number;\n  passed: number;\n  failed: number;\n  avgSimilarity: number;\n  avgDeepgramLatency: number;\n  avgLegacyLatency: number;\n}\n\nasync function validateMigration(\n  testAudioUrls: string[]\n): Promise\u003CValidationResult> {\n  const router = new MigrationRouter({\n    deepgramPercentage: 50,\n    compareResults: true,\n    logDifferences: true,\n  });\n\n  const results = {\n    totalTests: testAudioUrls.length,\n    passed: 0,\n    failed: 0,\n    avgSimilarity: 0,\n    avgDeepgramLatency: 0,\n    avgLegacyLatency: 0,\n  };\n\n  const similarities: number[] = [];\n  const deepgramLatencies: number[] = [];\n  const legacyLatencies: number[] = [];\n\n  for (const url of testAudioUrls) {\n    try {\n      \u002F\u002F Measure Deepgram\n      const dgStart = Date.now();\n      const dgResult = await router['deepgram'].transcribe(url, {});\n      deepgramLatencies.push(Date.now() - dgStart);\n\n      \u002F\u002F Measure Legacy\n      const legStart = Date.now();\n      const legResult = await router['legacy'].transcribe(url, {});\n      legacyLatencies.push(Date.now() - legStart);\n\n      \u002F\u002F Calculate similarity\n      const similarity = router['calculateSimilarity'](\n        dgResult.transcript,\n        legResult.transcript\n      );\n      similarities.push(similarity);\n\n      if (similarity >= 0.90) {\n        results.passed++;\n      } else {\n        results.failed++;\n        console.log(`Low similarity for ${url}: ${similarity}`);\n      }\n    } catch (error) {\n      results.failed++;\n      console.error(`Test failed for ${url}:`, error);\n    }\n  }\n\n  results.avgSimilarity = similarities.reduce((a, b) => a + b, 0) \u002F similarities.length;\n  results.avgDeepgramLatency = deepgramLatencies.reduce((a, b) => a + b, 0) \u002F deepgramLatencies.length;\n  results.avgLegacyLatency = legacyLatencies.reduce((a, b) => a + b, 0) \u002F legacyLatencies.length;\n\n  return results;\n}\n\n\u002F\u002F Run validation\nconst testUrls = [\n  'https:\u002F\u002Fexample.com\u002Faudio1.wav',\n  'https:\u002F\u002Fexample.com\u002Faudio2.wav',\n  \u002F\u002F Add more test URLs\n];\n\nvalidateMigration(testUrls).then(results => {\n  console.log('\\n=== Migration Validation Results ===');\n  console.log(`Total Tests: ${results.totalTests}`);\n  console.log(`Passed: ${results.passed}`);\n  console.log(`Failed: ${results.failed}`);\n  console.log(`Avg Similarity: ${(results.avgSimilarity * 100).toFixed(1)}%`);\n  console.log(`Avg Deepgram Latency: ${results.avgDeepgramLatency.toFixed(0)}ms`);\n  console.log(`Avg Legacy Latency: ${results.avgLegacyLatency.toFixed(0)}ms`);\n\n  if (results.passed \u002F results.totalTests >= 0.95) {\n    console.log('\\n Migration validation PASSED');\n  } else {\n    console.log('\\n Migration validation FAILED - review differences');\n  }\n});\n```\n\n### Rollback Plan\n```typescript\n\u002F\u002F services\u002Frollback.ts\nimport { MigrationRouter } from '.\u002Fmigration-router';\n\nexport class RollbackManager {\n  private router: MigrationRouter;\n  private checkpoints: Array\u003C{ timestamp: Date; percentage: number }> = [];\n\n  constructor(router: MigrationRouter) {\n    this.router = router;\n  }\n\n  async checkpoint(): Promise\u003Cvoid> {\n    const current = await this.getCurrentPercentage();\n    this.checkpoints.push({\n      timestamp: new Date(),\n      percentage: current,\n    });\n  }\n\n  async rollback(): Promise\u003Cvoid> {\n    const previous = this.checkpoints.pop();\n    if (previous) {\n      await this.router.setDeepgramPercentage(previous.percentage);\n      console.log(`Rolled back to ${previous.percentage}%`);\n    } else {\n      await this.router.setDeepgramPercentage(0);\n      console.log('Rolled back to 0% (full legacy)');\n    }\n  }\n\n  async emergencyRollback(): Promise\u003Cvoid> {\n    await this.router.setDeepgramPercentage(0);\n    console.log('EMERGENCY: Rolled back to 0%');\n  }\n\n  private async getCurrentPercentage(): Promise\u003Cnumber> {\n    return this.router['config'].deepgramPercentage;\n  }\n}\n```\n\n## Migration Checklist\n\n```markdown\n## Pre-Migration\n- [ ] Inventory current usage (hours\u002Fmonth, features used)\n- [ ] Map features to Deepgram equivalents\n- [ ] Estimate Deepgram costs\n- [ ] Set up Deepgram project and API keys\n- [ ] Implement adapter pattern\n- [ ] Create test dataset\n\n## Validation Phase\n- [ ] Run comparison tests\n- [ ] Verify accuracy meets requirements\n- [ ] Confirm latency is acceptable\n- [ ] Test all required features\n- [ ] Document any differences\n\n## Rollout Phase\n- [ ] Start at 5% traffic\n- [ ] Monitor error rates\n- [ ] Compare costs\n- [ ] Increase to 25%\n- [ ] Review for 1 week\n- [ ] Increase to 50%\n- [ ] Review for 1 week\n- [ ] Increase to 100%\n\n## Post-Migration\n- [ ] Decommission legacy provider\n- [ ] Update documentation\n- [ ] Archive comparison data\n- [ ] Update runbooks\n- [ ] Train team on Deepgram specifics\n```\n\n## Resources\n- [Deepgram Migration Guide](https:\u002F\u002Fdevelopers.deepgram.com\u002Fdocs\u002Fmigration)\n- [Feature Comparison](https:\u002F\u002Fdevelopers.deepgram.com\u002Fdocs\u002Ffeatures)\n- [Pricing Calculator](https:\u002F\u002Fdeepgram.com\u002Fpricing)\n\n## Conclusion\nThis skill pack provides 24 comprehensive skills for Deepgram integration covering the full development lifecycle from initial setup through enterprise deployment and migration scenarios.\n",{"name":5,"author":47,"license":15,"version":48,"description":49,"allowed-tools":50},"Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Deep dive into complex Deepgram migrations and provider transitions.\nUse when migrating from other transcription providers, planning large-scale\nmigrations, or implementing phased rollout strategies.\nTrigger with phrases like \"deepgram migration\", \"switch to deepgram\",\n\"migrate transcription\", \"deepgram from AWS\", \"deepgram from Google\".\n","Read, Write, Edit, Bash(kubectl:*), Bash(curl:*)","main","90b50ed0778745a80fd5bfb13b1843d45b9e82f7","tests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Fdeepgram-pack\u002Fskills\u002Fdeepgram-migration-deep-dive",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-12 03:15:57",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add Dicklesworthstone\u002Fpi_agent_rust --skill deepgram-migration-deep-dive",{"tool":66,"command":67},"bunx","bunx skills add Dicklesworthstone\u002Fpi_agent_rust --skill deepgram-migration-deep-dive",{"tool":69,"command":70},"pnpm","pnpm dlx skills add Dicklesworthstone\u002Fpi_agent_rust --skill deepgram-migration-deep-dive","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Fdeepgram-pack\u002Fskills\u002Fdeepgram-migration-deep-dive\u002FSKILL.md",true,[],[75,115,140,166,193,214],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":80,"sourceHtmlUrl":81,"categories":82,"keywords":88,"publishedAt":42},"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",[83],{"categoryNo":84,"categoryName":85,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,33,107,108,109,110,111,112,113,114],"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","for","jsx","suite",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":119,"sourceHtmlUrl":120,"categories":121,"keywords":126,"publishedAt":42},"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",[122,125],{"categoryNo":123,"categoryName":124,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":84,"categoryName":85,"taxonomyType":86,"taxonomyTypeDesc":87},[127,128,129,94,130,131,90,132,133,134,104,135,136,137,138,139,112],"testing","webapp testing","webapp","screenshots","playwright","debugging","toolkit","browser","logs","applications","behavior","local","with",{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":144,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":42},"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",[],[148,149,150,151,152,153,154,155,33,156,157,158,159,160,161,162,139,163,164,165,112,24],"analysis","neuropixels analysis","spike","metrics","data","open","quality","user","recordings","Neural","motion","visual","quality metrics","unit","sorting","curation","recording","load",{"skillNo":167,"name":168,"nameZh":6,"description":169,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":170,"sourceHtmlUrl":171,"categories":172,"keywords":176,"publishedAt":42},"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",[173],{"categoryNo":174,"categoryName":175,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000023","Skill与智能体开发",[177,178,179,180,181,182,183,184,185,186,187,188,189,190,139,112,191,24,192],"skill creator","creator","workflows","create","update","capabilities","knowledge","tool","integrations","specialized","guide","new skill","existing skill","users","Existing","new",{"skillNo":194,"name":195,"nameZh":6,"description":196,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":197,"sourceHtmlUrl":198,"categories":199,"keywords":201,"publishedAt":42},"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",[200],{"categoryNo":174,"categoryName":175,"taxonomyType":86,"taxonomyTypeDesc":87},[195,25,202,203,204,205,206,134,207,208,33,209,210,211,212,112,213],"browser automation","gemini","automation","auth","code","library","management","only","document","query","Citation","source",{"skillNo":215,"name":216,"nameZh":6,"description":217,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":218,"sourceHtmlUrl":219,"categories":220,"keywords":227,"publishedAt":42},"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",[221,224],{"categoryNo":222,"categoryName":223,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":225,"categoryName":226,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000016","图像与多媒体",[228,229,230,178,231,105,232,233,183,33,234,190,235,236,237,112,238,24],"slack gif creator","slack","gif","validation","constraints","Animation","me","make","Utilities","concepts","request"]