@ngxtm/devkit 3.7.0 → 3.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli/init.js +23 -7
- package/cli/update.js +21 -6
- package/merged-commands/3d-web-experience.md +254 -0
- package/merged-commands/ab-test-setup.md +232 -0
- package/merged-commands/accessibility-compliance-accessibility-audit.md +42 -0
- package/merged-commands/active-directory-attacks.md +383 -0
- package/merged-commands/address-github-comments.md +55 -0
- package/merged-commands/aesthetic.md +134 -0
- package/merged-commands/agent-evaluation.md +64 -0
- package/merged-commands/agent-framework-azure-hosted-agents.md +332 -0
- package/merged-commands/agent-manager-skill.md +40 -0
- package/merged-commands/agent-memory-mcp.md +82 -0
- package/merged-commands/agent-memory-systems.md +67 -0
- package/merged-commands/agent-orchestration-improve-agent.md +349 -0
- package/merged-commands/agent-orchestration-multi-agent-optimize.md +239 -0
- package/merged-commands/agent-tool-builder.md +53 -0
- package/merged-commands/agile-product-owner.md +31 -0
- package/merged-commands/ai-agents-architect.md +90 -0
- package/merged-commands/ai-artist.md +75 -0
- package/merged-commands/ai-engineer.md +171 -0
- package/merged-commands/ai-multimodal.md +109 -0
- package/merged-commands/ai-product.md +54 -0
- package/merged-commands/ai-wrapper-product.md +273 -0
- package/merged-commands/airflow-dag-patterns.md +41 -0
- package/merged-commands/algolia-search.md +66 -0
- package/merged-commands/algorithmic-art.md +405 -0
- package/merged-commands/analytics-tracking.md +404 -0
- package/merged-commands/angular-architect.md +97 -0
- package/merged-commands/angular-migration.md +428 -0
- package/merged-commands/anti-reversing-techniques.md +42 -0
- package/merged-commands/api-design-principles.md +37 -0
- package/merged-commands/api-designer.md +101 -0
- package/merged-commands/api-documentation-generator.md +484 -0
- package/merged-commands/api-documenter.md +184 -0
- package/merged-commands/api-fuzzing-bug-bounty.md +433 -0
- package/merged-commands/api-patterns.md +81 -0
- package/merged-commands/api-security-best-practices.md +907 -0
- package/merged-commands/api-testing-observability-api-mock.md +46 -0
- package/merged-commands/app-builder.md +75 -0
- package/merged-commands/app-store-optimization.md +403 -0
- package/merged-commands/application-performance-performance-optimization.md +154 -0
- package/merged-commands/architect-review.md +174 -0
- package/merged-commands/architecture-decision-records.md +441 -0
- package/merged-commands/architecture-designer.md +89 -0
- package/merged-commands/architecture-patterns.md +37 -0
- package/merged-commands/architecture.md +55 -0
- package/merged-commands/arm-cortex-expert.md +306 -0
- package/merged-commands/artifacts-builder.md +74 -0
- package/merged-commands/ask-questions-if-underspecified.md +81 -0
- package/merged-commands/async-python-patterns.md +39 -0
- package/merged-commands/atlassian-mcp.md +100 -0
- package/merged-commands/attack-tree-construction.md +38 -0
- package/merged-commands/auth-implementation-patterns.md +39 -0
- package/merged-commands/automate-whatsapp.md +257 -0
- package/merged-commands/autonomous-agent-patterns.md +761 -0
- package/merged-commands/autonomous-agents.md +68 -0
- package/merged-commands/avalonia-layout-zafiro.md +59 -0
- package/merged-commands/avalonia-viewmodels-zafiro.md +29 -0
- package/merged-commands/avalonia-zafiro-development.md +29 -0
- package/merged-commands/aws-agentic-ai.md +117 -0
- package/merged-commands/aws-cdk-development.md +278 -0
- package/merged-commands/aws-cost-operations.md +317 -0
- package/merged-commands/aws-penetration-testing.md +405 -0
- package/merged-commands/aws-serverless-eda.md +757 -0
- package/merged-commands/aws-serverless.md +323 -0
- package/merged-commands/aws-skills.md +22 -0
- package/merged-commands/azd-deployment.md +296 -0
- package/merged-commands/azure-ai-agents-python.md +277 -0
- package/merged-commands/azure-ai-search-python.md +198 -0
- package/merged-commands/azure-ai-voicelive-skill.md +294 -0
- package/merged-commands/azure-functions.md +42 -0
- package/merged-commands/backend-architect.md +333 -0
- package/merged-commands/backend-dev-guidelines.md +342 -0
- package/merged-commands/backend-development-feature-development.md +180 -0
- package/merged-commands/backend-development.md +155 -0
- package/merged-commands/backend-security-coder.md +156 -0
- package/merged-commands/backtesting-frameworks.md +39 -0
- package/merged-commands/bash-defensive-patterns.md +43 -0
- package/merged-commands/bash-linux.md +199 -0
- package/merged-commands/bash-pro.md +310 -0
- package/merged-commands/bats-testing-patterns.md +34 -0
- package/merged-commands/bazel-build-optimization.md +397 -0
- package/merged-commands/beautiful-prose.md +22 -0
- package/merged-commands/behavioral-modes.md +242 -0
- package/merged-commands/best-practices.md +500 -0
- package/merged-commands/better-auth.md +204 -0
- package/merged-commands/billing-automation.md +42 -0
- package/merged-commands/binary-analysis-patterns.md +450 -0
- package/merged-commands/blockchain-developer.md +208 -0
- package/merged-commands/blockrun.md +292 -0
- package/merged-commands/brainstorming.md +230 -0
- package/merged-commands/brand-guidelines-anthropic.md +73 -0
- package/merged-commands/brand-guidelines-community.md +73 -0
- package/merged-commands/brand-guidelines.md +73 -0
- package/merged-commands/broken-authentication.md +476 -0
- package/merged-commands/browser-automation.md +70 -0
- package/merged-commands/browser-extension-builder.md +261 -0
- package/merged-commands/building-ai-agent-on-cloudflare.md +391 -0
- package/merged-commands/building-mcp-server-on-cloudflare.md +265 -0
- package/merged-commands/bullmq-specialist.md +57 -0
- package/merged-commands/bun-development.md +691 -0
- package/merged-commands/burp-suite-testing.md +380 -0
- package/merged-commands/business-analyst.md +182 -0
- package/merged-commands/busybox-on-windows.md +30 -0
- package/merged-commands/c-pro.md +56 -0
- package/merged-commands/c4-architecture-c4-architecture.md +389 -0
- package/merged-commands/c4-code.md +244 -0
- package/merged-commands/c4-component.md +153 -0
- package/merged-commands/c4-container.md +171 -0
- package/merged-commands/c4-context.md +150 -0
- package/merged-commands/canvas-design.md +130 -0
- package/merged-commands/cc-skill-backend-patterns.md +584 -0
- package/merged-commands/cc-skill-clickhouse-io.md +431 -0
- package/merged-commands/cc-skill-coding-standards.md +522 -0
- package/merged-commands/cc-skill-continuous-learning.md +10 -0
- package/merged-commands/cc-skill-frontend-patterns.md +633 -0
- package/merged-commands/cc-skill-project-guidelines-example.md +352 -0
- package/merged-commands/cc-skill-security-review.md +496 -0
- package/merged-commands/cc-skill-strategic-compact.md +10 -0
- package/merged-commands/changelog-automation.md +38 -0
- package/merged-commands/changelog-generator.md +104 -0
- package/merged-commands/chaos-engineer.md +98 -0
- package/merged-commands/chrome-devtools.md +407 -0
- package/merged-commands/cicd-automation-workflow-automate.md +51 -0
- package/merged-commands/clarity-gate.md +22 -0
- package/merged-commands/claude-ally-health.md +22 -0
- package/merged-commands/claude-code-guide.md +68 -0
- package/merged-commands/claude-d3js-skill.md +820 -0
- package/merged-commands/claude-scientific-skills.md +22 -0
- package/merged-commands/claude-speed-reader.md +22 -0
- package/merged-commands/claude-win11-speckit-update-skill.md +22 -0
- package/merged-commands/clean-code.md +201 -0
- package/merged-commands/clerk-auth.md +56 -0
- package/merged-commands/cli-developer.md +97 -0
- package/merged-commands/cloud-architect.md +135 -0
- package/merged-commands/cloud-penetration-testing.md +501 -0
- package/merged-commands/cloudflare-expert.md +227 -0
- package/merged-commands/code-documentation-code-explain.md +46 -0
- package/merged-commands/code-documentation-doc-generate.md +48 -0
- package/merged-commands/code-documentation.md +263 -0
- package/merged-commands/code-documenter.md +95 -0
- package/merged-commands/code-refactoring-context-restore.md +179 -0
- package/merged-commands/code-refactoring-refactor-clean.md +51 -0
- package/merged-commands/code-refactoring-tech-debt.md +386 -0
- package/merged-commands/code-refactoring.md +209 -0
- package/merged-commands/code-review-ai-ai-review.md +450 -0
- package/merged-commands/code-review-checklist.md +444 -0
- package/merged-commands/code-review-excellence.md +40 -0
- package/merged-commands/code-review.md +121 -0
- package/merged-commands/code-reviewer.md +178 -0
- package/merged-commands/codebase-cleanup-deps-audit.md +51 -0
- package/merged-commands/codebase-cleanup-refactor-clean.md +51 -0
- package/merged-commands/codebase-cleanup-tech-debt.md +386 -0
- package/merged-commands/codex-review.md +37 -0
- package/merged-commands/commit.md +171 -0
- package/merged-commands/competitive-ads-extractor.md +293 -0
- package/merged-commands/competitive-landscape.md +34 -0
- package/merged-commands/competitor-alternatives.md +750 -0
- package/merged-commands/comprehensive-review-full-review.md +146 -0
- package/merged-commands/comprehensive-review-pr-enhance.md +46 -0
- package/merged-commands/computer-use-agents.md +315 -0
- package/merged-commands/concise-planning.md +62 -0
- package/merged-commands/conductor-implement.md +388 -0
- package/merged-commands/conductor-manage.md +39 -0
- package/merged-commands/conductor-new-track.md +433 -0
- package/merged-commands/conductor-revert.md +372 -0
- package/merged-commands/conductor-setup.md +426 -0
- package/merged-commands/conductor-status.md +338 -0
- package/merged-commands/conductor-validator.md +62 -0
- package/merged-commands/content-creator.md +248 -0
- package/merged-commands/content-marketer.md +170 -0
- package/merged-commands/content-research-writer.md +538 -0
- package/merged-commands/context-compression.md +266 -0
- package/merged-commands/context-degradation.md +238 -0
- package/merged-commands/context-driven-development.md +400 -0
- package/merged-commands/context-engineering.md +107 -0
- package/merged-commands/context-fundamentals.md +192 -0
- package/merged-commands/context-management-context-restore.md +179 -0
- package/merged-commands/context-management-context-save.md +177 -0
- package/merged-commands/context-manager.md +185 -0
- package/merged-commands/context-optimization.md +186 -0
- package/merged-commands/context-window-management.md +53 -0
- package/merged-commands/context7-auto-research.md +36 -0
- package/merged-commands/conversation-memory.md +61 -0
- package/merged-commands/copy-editing.md +439 -0
- package/merged-commands/copywriting.md +225 -0
- package/merged-commands/core-components.md +264 -0
- package/merged-commands/cosmos-db-python-skill.md +198 -0
- package/merged-commands/cost-optimization.md +286 -0
- package/merged-commands/cpp-pro.md +59 -0
- package/merged-commands/cqrs-implementation.md +35 -0
- package/merged-commands/create-pr.md +192 -0
- package/merged-commands/crewai.md +243 -0
- package/merged-commands/csharp-developer.md +94 -0
- package/merged-commands/csharp-pro.md +59 -0
- package/merged-commands/culture-index.md +43 -0
- package/merged-commands/customer-support.md +170 -0
- package/merged-commands/daily-news-report.md +356 -0
- package/merged-commands/data-engineer.md +224 -0
- package/merged-commands/data-engineering-data-driven-feature.md +182 -0
- package/merged-commands/data-engineering-data-pipeline.md +201 -0
- package/merged-commands/data-quality-frameworks.md +40 -0
- package/merged-commands/data-scientist.md +199 -0
- package/merged-commands/data-storytelling.md +465 -0
- package/merged-commands/database-admin.md +165 -0
- package/merged-commands/database-architect.md +268 -0
- package/merged-commands/database-cloud-optimization-cost-optimize.md +44 -0
- package/merged-commands/database-design.md +52 -0
- package/merged-commands/database-migration.md +436 -0
- package/merged-commands/database-migrations-migration-observability.md +420 -0
- package/merged-commands/database-migrations-sql-migrations.md +53 -0
- package/merged-commands/database-optimizer.md +167 -0
- package/merged-commands/databases.md +232 -0
- package/merged-commands/dbt-transformation-patterns.md +34 -0
- package/merged-commands/debugger.md +49 -0
- package/merged-commands/debugging-strategies.md +34 -0
- package/merged-commands/debugging-toolkit-smart-debug.md +197 -0
- package/merged-commands/debugging-wizard.md +93 -0
- package/merged-commands/debugging.md +84 -0
- package/merged-commands/deep-research.md +114 -0
- package/merged-commands/defi-protocol-templates.md +466 -0
- package/merged-commands/dependency-management-deps-audit.md +44 -0
- package/merged-commands/dependency-upgrade.md +421 -0
- package/merged-commands/deployment-engineer.md +170 -0
- package/merged-commands/deployment-pipeline-design.md +371 -0
- package/merged-commands/deployment-procedures.md +241 -0
- package/merged-commands/deployment-validation-config-validate.md +496 -0
- package/merged-commands/design-md.md +178 -0
- package/merged-commands/design-orchestration.md +167 -0
- package/merged-commands/developer-growth-analysis.md +322 -0
- package/merged-commands/devops-engineer.md +92 -0
- package/merged-commands/devops-troubleshooter.md +161 -0
- package/merged-commands/devops.md +285 -0
- package/merged-commands/discord-bot-architect.md +277 -0
- package/merged-commands/dispatching-parallel-agents.md +180 -0
- package/merged-commands/distributed-debugging-debug-trace.md +44 -0
- package/merged-commands/distributed-tracing.md +450 -0
- package/merged-commands/django-expert.md +89 -0
- package/merged-commands/django-pro.md +180 -0
- package/merged-commands/doc-coauthoring.md +375 -0
- package/merged-commands/docker-expert.md +409 -0
- package/merged-commands/docs-architect.md +98 -0
- package/merged-commands/docs-seeker.md +102 -0
- package/merged-commands/documentation-generation-doc-generate.md +48 -0
- package/merged-commands/documentation-templates.md +194 -0
- package/merged-commands/docx-official.md +197 -0
- package/merged-commands/docx.md +197 -0
- package/merged-commands/domain-name-brainstormer.md +212 -0
- package/merged-commands/dotnet-architect.md +197 -0
- package/merged-commands/dotnet-backend-patterns.md +37 -0
- package/merged-commands/dotnet-core-expert.md +96 -0
- package/merged-commands/dx-optimizer.md +83 -0
- package/merged-commands/e2e-testing-patterns.md +41 -0
- package/merged-commands/elixir-pro.md +59 -0
- package/merged-commands/email-sequence.md +925 -0
- package/merged-commands/email-systems.md +54 -0
- package/merged-commands/embedded-systems.md +98 -0
- package/merged-commands/embedding-strategies.md +491 -0
- package/merged-commands/employment-contract-templates.md +39 -0
- package/merged-commands/environment-setup-guide.md +479 -0
- package/merged-commands/error-debugging-error-analysis.md +47 -0
- package/merged-commands/error-debugging-error-trace.md +43 -0
- package/merged-commands/error-debugging-multi-agent-review.md +216 -0
- package/merged-commands/error-detective.md +53 -0
- package/merged-commands/error-diagnostics-error-analysis.md +47 -0
- package/merged-commands/error-diagnostics-error-trace.md +48 -0
- package/merged-commands/error-diagnostics-smart-debug.md +197 -0
- package/merged-commands/error-handling-patterns.md +35 -0
- package/merged-commands/ethical-hacking-methodology.md +466 -0
- package/merged-commands/evaluation.md +238 -0
- package/merged-commands/event-sourcing-architect.md +58 -0
- package/merged-commands/event-store-design.md +449 -0
- package/merged-commands/exa-search.md +36 -0
- package/merged-commands/executing-plans.md +76 -0
- package/merged-commands/expo-app-design.md +22 -0
- package/merged-commands/expo-deployment.md +72 -0
- package/merged-commands/fal-audio.md +22 -0
- package/merged-commands/fal-generate.md +22 -0
- package/merged-commands/fal-image-edit.md +22 -0
- package/merged-commands/fal-platform.md +22 -0
- package/merged-commands/fal-upscale.md +22 -0
- package/merged-commands/fal-workflow.md +22 -0
- package/merged-commands/fastapi-expert.md +93 -0
- package/merged-commands/fastapi-pro.md +192 -0
- package/merged-commands/fastapi-router.md +52 -0
- package/merged-commands/fastapi-templates.md +32 -0
- package/merged-commands/feature-forge.md +90 -0
- package/merged-commands/ffuf-claude-skill.md +22 -0
- package/merged-commands/file-organizer.md +250 -0
- package/merged-commands/file-path-traversal.md +486 -0
- package/merged-commands/file-uploads.md +22 -0
- package/merged-commands/find-bugs.md +86 -0
- package/merged-commands/fine-tuning-expert.md +98 -0
- package/merged-commands/finishing-a-development-branch.md +200 -0
- package/merged-commands/firebase.md +56 -0
- package/merged-commands/firecrawl-scraper.md +37 -0
- package/merged-commands/firmware-analyst.md +320 -0
- package/merged-commands/fix-review.md +53 -0
- package/merged-commands/fixing.md +72 -0
- package/merged-commands/flutter-expert.md +200 -0
- package/merged-commands/form-cro.md +441 -0
- package/merged-commands/foundry-iq-agent.md +15 -0
- package/merged-commands/foundry-iq-python.md +275 -0
- package/merged-commands/foundry-nextgen-frontend.md +555 -0
- package/merged-commands/foundry-sdk-python.md +290 -0
- package/merged-commands/fp-ts-errors.md +856 -0
- package/merged-commands/fp-ts-pragmatic.md +598 -0
- package/merged-commands/fp-ts-react.md +796 -0
- package/merged-commands/framework-migration-code-migrate.md +48 -0
- package/merged-commands/framework-migration-deps-upgrade.md +48 -0
- package/merged-commands/framework-migration-legacy-modernize.md +132 -0
- package/merged-commands/free-tool-strategy.md +576 -0
- package/merged-commands/frontend-design.md +272 -0
- package/merged-commands/frontend-dev-guidelines.md +359 -0
- package/merged-commands/frontend-developer.md +171 -0
- package/merged-commands/frontend-development.md +399 -0
- package/merged-commands/frontend-mobile-development-component-scaffold.md +403 -0
- package/merged-commands/frontend-mobile-security-xss-scan.md +322 -0
- package/merged-commands/frontend-security-coder.md +170 -0
- package/merged-commands/frontend-slides.md +770 -0
- package/merged-commands/full-stack-orchestration-full-stack-feature.md +135 -0
- package/merged-commands/fullstack-guardian.md +99 -0
- package/merged-commands/game-developer.md +94 -0
- package/merged-commands/game-development.md +167 -0
- package/merged-commands/gcp-cloud-run.md +288 -0
- package/merged-commands/gdpr-data-handling.md +33 -0
- package/merged-commands/geo-fundamentals.md +156 -0
- package/merged-commands/git-advanced-workflows.md +412 -0
- package/merged-commands/git-pr-workflows-git-workflow.md +140 -0
- package/merged-commands/git-pr-workflows-onboard.md +416 -0
- package/merged-commands/git-pr-workflows-pr-enhance.md +48 -0
- package/merged-commands/git-pushing.md +33 -0
- package/merged-commands/github-actions-templates.md +345 -0
- package/merged-commands/github-workflow-automation.md +846 -0
- package/merged-commands/gitlab-ci-patterns.md +283 -0
- package/merged-commands/gitops-workflow.md +303 -0
- package/merged-commands/go-concurrency-patterns.md +33 -0
- package/merged-commands/godot-gdscript-patterns.md +33 -0
- package/merged-commands/golang-pro.md +179 -0
- package/merged-commands/google-adk-python.md +243 -0
- package/merged-commands/grafana-dashboards.md +381 -0
- package/merged-commands/graphql-architect.md +182 -0
- package/merged-commands/graphql.md +68 -0
- package/merged-commands/haskell-pro.md +56 -0
- package/merged-commands/helm-chart-scaffolding.md +34 -0
- package/merged-commands/hr-pro.md +126 -0
- package/merged-commands/html-injection-testing.md +498 -0
- package/merged-commands/hubspot-integration.md +42 -0
- package/merged-commands/hugging-face-cli.md +198 -0
- package/merged-commands/hugging-face-jobs.md +1038 -0
- package/merged-commands/hybrid-cloud-architect.md +168 -0
- package/merged-commands/hybrid-cloud-networking.md +238 -0
- package/merged-commands/hybrid-search-implementation.md +32 -0
- package/merged-commands/i18n-localization.md +154 -0
- package/merged-commands/idor-testing.md +442 -0
- package/merged-commands/image-enhancer.md +99 -0
- package/merged-commands/imagen.md +77 -0
- package/merged-commands/incident-responder.md +213 -0
- package/merged-commands/incident-response-incident-response.md +168 -0
- package/merged-commands/incident-response-smart-fix.md +29 -0
- package/merged-commands/incident-runbook-templates.md +395 -0
- package/merged-commands/infinite-gratitude.md +26 -0
- package/merged-commands/inngest.md +55 -0
- package/merged-commands/interactive-portfolio.md +223 -0
- package/merged-commands/internal-comms-anthropic.md +32 -0
- package/merged-commands/internal-comms-community.md +32 -0
- package/merged-commands/internal-comms.md +32 -0
- package/merged-commands/invoice-organizer.md +446 -0
- package/merged-commands/ios-developer.md +219 -0
- package/merged-commands/issue-creator.md +137 -0
- package/merged-commands/istio-traffic-management.md +337 -0
- package/merged-commands/iterate-pr.md +150 -0
- package/merged-commands/java-architect.md +95 -0
- package/merged-commands/java-pro.md +177 -0
- package/merged-commands/javascript-mastery.md +645 -0
- package/merged-commands/javascript-pro.md +57 -0
- package/merged-commands/javascript-testing-patterns.md +35 -0
- package/merged-commands/javascript-typescript-typescript-scaffold.md +361 -0
- package/merged-commands/javascript-typescript.md +142 -0
- package/merged-commands/jira-issues.md +181 -0
- package/merged-commands/job-application.md +90 -0
- package/merged-commands/julia-pro.md +209 -0
- package/merged-commands/k8s-manifest-generator.md +35 -0
- package/merged-commands/k8s-security-policies.md +346 -0
- package/merged-commands/kaizen.md +730 -0
- package/merged-commands/kotlin-specialist.md +94 -0
- package/merged-commands/kpi-dashboard-design.md +440 -0
- package/merged-commands/kubernetes-architect.md +170 -0
- package/merged-commands/kubernetes-specialist.md +117 -0
- package/merged-commands/langchain-architecture.md +350 -0
- package/merged-commands/langfuse.md +238 -0
- package/merged-commands/langgraph.md +287 -0
- package/merged-commands/laravel-specialist.md +101 -0
- package/merged-commands/last30days.md +421 -0
- package/merged-commands/launch-strategy.md +344 -0
- package/merged-commands/lead-research-assistant.md +199 -0
- package/merged-commands/learn.md +476 -0
- package/merged-commands/legacy-modernizer.md +53 -0
- package/merged-commands/legal-advisor.md +70 -0
- package/merged-commands/linear-claude-skill.md +543 -0
- package/merged-commands/linkerd-patterns.md +321 -0
- package/merged-commands/lint-and-validate.md +45 -0
- package/merged-commands/linux-privilege-escalation.md +504 -0
- package/merged-commands/linux-shell-scripting.md +504 -0
- package/merged-commands/llm-app-patterns.md +760 -0
- package/merged-commands/llm-application-dev-ai-assistant.md +35 -0
- package/merged-commands/llm-application-dev-langchain-agent.md +246 -0
- package/merged-commands/llm-application-dev-prompt-optimize.md +37 -0
- package/merged-commands/llm-application-dev.md +216 -0
- package/merged-commands/llm-evaluation.md +483 -0
- package/merged-commands/loki-mode.md +721 -0
- package/merged-commands/machine-learning-ops-ml-pipeline.md +314 -0
- package/merged-commands/makepad-skills.md +22 -0
- package/merged-commands/malware-analyst.md +247 -0
- package/merged-commands/markdown-novel-viewer.md +281 -0
- package/merged-commands/market-sizing-analysis.md +425 -0
- package/merged-commands/marketing-ideas.md +221 -0
- package/merged-commands/marketing-psychology.md +255 -0
- package/merged-commands/mcp-builder.md +236 -0
- package/merged-commands/mcp-developer.md +94 -0
- package/merged-commands/mcp-management.md +209 -0
- package/merged-commands/media-processing.md +358 -0
- package/merged-commands/meeting-insights-analyzer.md +327 -0
- package/merged-commands/memory-forensics.md +491 -0
- package/merged-commands/memory-safety-patterns.md +33 -0
- package/merged-commands/memory-systems.md +228 -0
- package/merged-commands/mermaid-expert.md +59 -0
- package/merged-commands/mermaidjs-v11.md +115 -0
- package/merged-commands/metasploit-framework.md +478 -0
- package/merged-commands/micro-saas-launcher.md +212 -0
- package/merged-commands/microservices-architect.md +102 -0
- package/merged-commands/microservices-patterns.md +35 -0
- package/merged-commands/minecraft-bukkit-pro.md +126 -0
- package/merged-commands/ml-engineer.md +168 -0
- package/merged-commands/ml-pipeline-workflow.md +257 -0
- package/merged-commands/ml-pipeline.md +111 -0
- package/merged-commands/mlops-engineer.md +219 -0
- package/merged-commands/mobile-design.md +284 -0
- package/merged-commands/mobile-developer.md +205 -0
- package/merged-commands/mobile-development.md +212 -0
- package/merged-commands/mobile-security-coder.md +184 -0
- package/merged-commands/modern-javascript-patterns.md +35 -0
- package/merged-commands/monitoring-expert.md +92 -0
- package/merged-commands/monorepo-architect.md +61 -0
- package/merged-commands/monorepo-management.md +35 -0
- package/merged-commands/moodle-external-api-development.md +597 -0
- package/merged-commands/mtls-configuration.md +359 -0
- package/merged-commands/multi-agent-brainstorming.md +256 -0
- package/merged-commands/multi-agent-patterns.md +262 -0
- package/merged-commands/multi-cloud-architecture.md +189 -0
- package/merged-commands/multi-platform-apps-multi-platform.md +203 -0
- package/merged-commands/n8n-code-python.md +750 -0
- package/merged-commands/n8n-mcp-tools-expert.md +654 -0
- package/merged-commands/n8n-node-configuration.md +796 -0
- package/merged-commands/nanobanana-ppt-skills.md +22 -0
- package/merged-commands/neon-postgres.md +56 -0
- package/merged-commands/nestjs-expert.md +552 -0
- package/merged-commands/network-101.md +342 -0
- package/merged-commands/network-engineer.md +169 -0
- package/merged-commands/nextjs-app-router-patterns.md +33 -0
- package/merged-commands/nextjs-best-practices.md +203 -0
- package/merged-commands/nextjs-developer.md +97 -0
- package/merged-commands/nextjs-supabase-auth.md +56 -0
- package/merged-commands/nft-standards.md +395 -0
- package/merged-commands/nodejs-backend-patterns.md +35 -0
- package/merged-commands/nodejs-best-practices.md +333 -0
- package/merged-commands/nosql-expert.md +111 -0
- package/merged-commands/notebooklm-skill.md +269 -0
- package/merged-commands/notebooklm.md +269 -0
- package/merged-commands/notion-template-business.md +216 -0
- package/merged-commands/nx-workspace-patterns.md +464 -0
- package/merged-commands/observability-engineer.md +237 -0
- package/merged-commands/observability-monitoring-monitor-setup.md +48 -0
- package/merged-commands/observability-monitoring-slo-implement.md +43 -0
- package/merged-commands/observe-whatsapp.md +109 -0
- package/merged-commands/obsidian-clipper-template-creator.md +64 -0
- package/merged-commands/on-call-handoff-patterns.md +453 -0
- package/merged-commands/onboarding-cro.md +433 -0
- package/merged-commands/openapi-spec-generation.md +33 -0
- package/merged-commands/page-cro.md +343 -0
- package/merged-commands/paid-ads.md +551 -0
- package/merged-commands/pandas-pro.md +96 -0
- package/merged-commands/parallel-agents.md +175 -0
- package/merged-commands/payment-integration.md +77 -0
- package/merged-commands/paypal-integration.md +479 -0
- package/merged-commands/paywall-upgrade-cro.md +570 -0
- package/merged-commands/pci-compliance.md +478 -0
- package/merged-commands/pdf-official.md +294 -0
- package/merged-commands/pdf.md +294 -0
- package/merged-commands/pentest-checklist.md +334 -0
- package/merged-commands/pentest-commands.md +438 -0
- package/merged-commands/performance-engineer.md +180 -0
- package/merged-commands/performance-profiling.md +143 -0
- package/merged-commands/performance-testing-review-ai-review.md +450 -0
- package/merged-commands/performance-testing-review-multi-agent-review.md +216 -0
- package/merged-commands/personal-tool-builder.md +289 -0
- package/merged-commands/php-pro.md +63 -0
- package/merged-commands/plaid-fintech.md +50 -0
- package/merged-commands/plan-writing.md +152 -0
- package/merged-commands/planning-with-files.md +211 -0
- package/merged-commands/planning.md +95 -0
- package/merged-commands/plans-kanban.md +166 -0
- package/merged-commands/playwright-expert.md +87 -0
- package/merged-commands/playwright-skill.md +453 -0
- package/merged-commands/podcast-generation.md +121 -0
- package/merged-commands/popup-cro.md +346 -0
- package/merged-commands/posix-shell-pro.md +304 -0
- package/merged-commands/postgres-best-practices.md +57 -0
- package/merged-commands/postgres-pro.md +98 -0
- package/merged-commands/postgresql.md +230 -0
- package/merged-commands/postmortem-writing.md +386 -0
- package/merged-commands/powershell-windows.md +167 -0
- package/merged-commands/pptx-official.md +484 -0
- package/merged-commands/pptx.md +484 -0
- package/merged-commands/pricing-strategy.md +356 -0
- package/merged-commands/prisma-expert.md +355 -0
- package/merged-commands/privilege-escalation-methods.md +333 -0
- package/merged-commands/problem-solving.md +96 -0
- package/merged-commands/product-manager-toolkit.md +351 -0
- package/merged-commands/product-strategist.md +26 -0
- package/merged-commands/production-code-audit.md +540 -0
- package/merged-commands/programmatic-seo.md +351 -0
- package/merged-commands/projection-patterns.md +33 -0
- package/merged-commands/prometheus-configuration.md +404 -0
- package/merged-commands/prompt-caching.md +61 -0
- package/merged-commands/prompt-engineer.md +272 -0
- package/merged-commands/prompt-engineering-patterns.md +213 -0
- package/merged-commands/prompt-engineering.md +171 -0
- package/merged-commands/prompt-library.md +322 -0
- package/merged-commands/protocol-reverse-engineering.md +29 -0
- package/merged-commands/pydantic-models.md +58 -0
- package/merged-commands/pypict-skill.md +22 -0
- package/merged-commands/python-development-python-scaffold.md +331 -0
- package/merged-commands/python-development.md +139 -0
- package/merged-commands/python-packaging.md +36 -0
- package/merged-commands/python-patterns.md +441 -0
- package/merged-commands/python-performance-optimization.md +36 -0
- package/merged-commands/python-pro.md +158 -0
- package/merged-commands/python-testing-patterns.md +37 -0
- package/merged-commands/qa-regression.md +337 -0
- package/merged-commands/quant-analyst.md +53 -0
- package/merged-commands/radix-ui-design-system.md +847 -0
- package/merged-commands/raffle-winner-picker.md +159 -0
- package/merged-commands/rag-architect.md +100 -0
- package/merged-commands/rag-engineer.md +90 -0
- package/merged-commands/rag-implementation.md +421 -0
- package/merged-commands/rails-expert.md +97 -0
- package/merged-commands/react-best-practices.md +121 -0
- package/merged-commands/react-expert.md +98 -0
- package/merged-commands/react-flow-node.md +66 -0
- package/merged-commands/react-modernization.md +34 -0
- package/merged-commands/react-native-architecture.md +33 -0
- package/merged-commands/react-native-expert.md +88 -0
- package/merged-commands/react-patterns.md +198 -0
- package/merged-commands/react-state-management.md +441 -0
- package/merged-commands/react-ui-patterns.md +289 -0
- package/merged-commands/readme.md +775 -0
- package/merged-commands/receiving-code-review.md +213 -0
- package/merged-commands/red-team-tactics.md +199 -0
- package/merged-commands/red-team-tools.md +310 -0
- package/merged-commands/reference-builder.md +188 -0
- package/merged-commands/referral-program.md +602 -0
- package/merged-commands/remotion-best-practices.md +45 -0
- package/merged-commands/repomix.md +275 -0
- package/merged-commands/requesting-code-review.md +105 -0
- package/merged-commands/research-engineer.md +135 -0
- package/merged-commands/research.md +191 -0
- package/merged-commands/reverse-engineer.md +173 -0
- package/merged-commands/risk-manager.md +61 -0
- package/merged-commands/risk-metrics-calculation.md +33 -0
- package/merged-commands/ruby-pro.md +56 -0
- package/merged-commands/rust-async-patterns.md +33 -0
- package/merged-commands/rust-engineer.md +96 -0
- package/merged-commands/rust-pro.md +178 -0
- package/merged-commands/saga-orchestration.md +496 -0
- package/merged-commands/sales-automator.md +55 -0
- package/merged-commands/salesforce-developer.md +105 -0
- package/merged-commands/salesforce-development.md +51 -0
- package/merged-commands/sast-configuration.md +212 -0
- package/merged-commands/scala-pro.md +82 -0
- package/merged-commands/scanning-tools.md +589 -0
- package/merged-commands/schema-markup.md +360 -0
- package/merged-commands/screen-reader-testing.md +33 -0
- package/merged-commands/screenshots.md +401 -0
- package/merged-commands/scroll-experience.md +263 -0
- package/merged-commands/search-specialist.md +80 -0
- package/merged-commands/secrets-management.md +364 -0
- package/merged-commands/secure-code-guardian.md +93 -0
- package/merged-commands/security-auditor.md +169 -0
- package/merged-commands/security-bluebook-builder.md +22 -0
- package/merged-commands/security-compliance-compliance-check.md +55 -0
- package/merged-commands/security-requirement-extraction.md +33 -0
- package/merged-commands/security-reviewer.md +94 -0
- package/merged-commands/security-scanning-security-dependencies.md +43 -0
- package/merged-commands/security-scanning-security-hardening.md +147 -0
- package/merged-commands/security-scanning-security-sast.md +495 -0
- package/merged-commands/segment-cdp.md +50 -0
- package/merged-commands/senior-architect.md +209 -0
- package/merged-commands/senior-backend.md +209 -0
- package/merged-commands/senior-computer-vision.md +226 -0
- package/merged-commands/senior-data-engineer.md +226 -0
- package/merged-commands/senior-data-scientist.md +226 -0
- package/merged-commands/senior-devops.md +209 -0
- package/merged-commands/senior-frontend.md +209 -0
- package/merged-commands/senior-fullstack.md +209 -0
- package/merged-commands/senior-ml-engineer.md +226 -0
- package/merged-commands/senior-prompt-engineer.md +226 -0
- package/merged-commands/senior-qa.md +209 -0
- package/merged-commands/senior-secops.md +209 -0
- package/merged-commands/senior-security.md +209 -0
- package/merged-commands/seo-audit.md +487 -0
- package/merged-commands/seo-authority-builder.md +136 -0
- package/merged-commands/seo-cannibalization-detector.md +123 -0
- package/merged-commands/seo-content-auditor.md +83 -0
- package/merged-commands/seo-content-planner.md +108 -0
- package/merged-commands/seo-content-refresher.md +118 -0
- package/merged-commands/seo-content-writer.md +96 -0
- package/merged-commands/seo-fundamentals.md +173 -0
- package/merged-commands/seo-keyword-strategist.md +95 -0
- package/merged-commands/seo-meta-optimizer.md +92 -0
- package/merged-commands/seo-snippet-hunter.md +114 -0
- package/merged-commands/seo-structure-architect.md +108 -0
- package/merged-commands/sequential-thinking.md +94 -0
- package/merged-commands/server-management.md +161 -0
- package/merged-commands/service-mesh-expert.md +58 -0
- package/merged-commands/service-mesh-observability.md +395 -0
- package/merged-commands/sharp-edges.md +70 -0
- package/merged-commands/shellcheck-configuration.md +466 -0
- package/merged-commands/shodan-reconnaissance.md +503 -0
- package/merged-commands/shopify-apps.md +42 -0
- package/merged-commands/shopify-development.md +366 -0
- package/merged-commands/shopify-expert.md +102 -0
- package/merged-commands/signup-flow-cro.md +355 -0
- package/merged-commands/similarity-search-patterns.md +33 -0
- package/merged-commands/skill-creator.md +356 -0
- package/merged-commands/skill-developer.md +426 -0
- package/merged-commands/skill-rails-upgrade.md +408 -0
- package/merged-commands/skill-seekers.md +22 -0
- package/merged-commands/skill-share.md +80 -0
- package/merged-commands/slack-bot-builder.md +264 -0
- package/merged-commands/slack-gif-creator.md +254 -0
- package/merged-commands/slo-implementation.md +341 -0
- package/merged-commands/smtp-penetration-testing.md +500 -0
- package/merged-commands/social-content.md +807 -0
- package/merged-commands/software-architecture.md +75 -0
- package/merged-commands/solidity-security.md +34 -0
- package/merged-commands/spark-engineer.md +100 -0
- package/merged-commands/spark-optimization.md +427 -0
- package/merged-commands/spec-miner.md +88 -0
- package/merged-commands/spring-boot-engineer.md +104 -0
- package/merged-commands/sql-injection-testing.md +448 -0
- package/merged-commands/sql-optimization-patterns.md +35 -0
- package/merged-commands/sql-pro.md +173 -0
- package/merged-commands/sqlmap-database-pentesting.md +400 -0
- package/merged-commands/sre-engineer.md +98 -0
- package/merged-commands/ssh-penetration-testing.md +488 -0
- package/merged-commands/startup-analyst.md +328 -0
- package/merged-commands/startup-business-analyst-business-case.md +487 -0
- package/merged-commands/startup-business-analyst-financial-projections.md +353 -0
- package/merged-commands/startup-business-analyst-market-opportunity.md +240 -0
- package/merged-commands/startup-financial-modeling.md +467 -0
- package/merged-commands/startup-metrics-framework.md +34 -0
- package/merged-commands/stitch-ui-design.md +378 -0
- package/merged-commands/stride-analysis-patterns.md +33 -0
- package/merged-commands/stripe-integration.md +454 -0
- package/merged-commands/subagent-driven-development.md +240 -0
- package/merged-commands/superpowers-lab.md +22 -0
- package/merged-commands/swift-expert.md +94 -0
- package/merged-commands/swiftui-expert-skill.md +275 -0
- package/merged-commands/systematic-debugging.md +296 -0
- package/merged-commands/systems-programming-rust-project.md +440 -0
- package/merged-commands/tailwind-design-system.md +33 -0
- package/merged-commands/tailwind-patterns.md +269 -0
- package/merged-commands/tavily-web.md +36 -0
- package/merged-commands/tdd-orchestrator.md +205 -0
- package/merged-commands/tdd-workflow.md +149 -0
- package/merged-commands/tdd-workflows-tdd-cycle.md +221 -0
- package/merged-commands/tdd-workflows-tdd-green.md +73 -0
- package/merged-commands/tdd-workflows-tdd-red.md +164 -0
- package/merged-commands/tdd-workflows-tdd-refactor.md +187 -0
- package/merged-commands/team-collaboration-issue.md +37 -0
- package/merged-commands/team-collaboration-standup-notes.md +44 -0
- package/merged-commands/team-composition-analysis.md +413 -0
- package/merged-commands/telegram-bot-builder.md +254 -0
- package/merged-commands/telegram-mini-app.md +279 -0
- package/merged-commands/template-skill.md +6 -0
- package/merged-commands/temporal-python-pro.md +370 -0
- package/merged-commands/temporal-python-testing.md +170 -0
- package/merged-commands/terraform-engineer.md +97 -0
- package/merged-commands/terraform-module-library.md +261 -0
- package/merged-commands/terraform-skill.md +517 -0
- package/merged-commands/terraform-specialist.md +166 -0
- package/merged-commands/test-automator.md +224 -0
- package/merged-commands/test-driven-development.md +371 -0
- package/merged-commands/test-fixing.md +119 -0
- package/merged-commands/test-master.md +104 -0
- package/merged-commands/testing-patterns.md +259 -0
- package/merged-commands/theme-factory.md +59 -0
- package/merged-commands/threat-mitigation-mapping.md +33 -0
- package/merged-commands/threat-modeling-expert.md +60 -0
- package/merged-commands/threejs-skills.md +22 -0
- package/merged-commands/threejs.md +89 -0
- package/merged-commands/tool-design.md +318 -0
- package/merged-commands/top-web-vulnerabilities.md +543 -0
- package/merged-commands/track-management.md +38 -0
- package/merged-commands/trigger-dev.md +67 -0
- package/merged-commands/turborepo-caching.md +419 -0
- package/merged-commands/tutorial-engineer.md +139 -0
- package/merged-commands/twilio-communications.md +295 -0
- package/merged-commands/typescript-advanced-types.md +35 -0
- package/merged-commands/typescript-expert.md +429 -0
- package/merged-commands/typescript-pro.md +55 -0
- package/merged-commands/ui-design-system.md +32 -0
- package/merged-commands/ui-skills.md +22 -0
- package/merged-commands/ui-styling.md +321 -0
- package/merged-commands/ui-ux-designer.md +209 -0
- package/merged-commands/ui-ux-pro-max.md +351 -0
- package/merged-commands/ui-visual-validator.md +214 -0
- package/merged-commands/unit-testing-test-generate.md +319 -0
- package/merged-commands/unity-developer.md +230 -0
- package/merged-commands/unity-ecs-patterns.md +33 -0
- package/merged-commands/unreal-engine-cpp-pro.md +114 -0
- package/merged-commands/upgrading-expo.md +118 -0
- package/merged-commands/upstash-qstash.md +68 -0
- package/merged-commands/using-git-worktrees.md +217 -0
- package/merged-commands/using-neon.md +84 -0
- package/merged-commands/using-superpowers.md +87 -0
- package/merged-commands/uv-package-manager.md +37 -0
- package/merged-commands/ux-researcher-designer.md +30 -0
- package/merged-commands/varlock-claude-skill.md +22 -0
- package/merged-commands/vector-database-engineer.md +60 -0
- package/merged-commands/vector-index-tuning.md +42 -0
- package/merged-commands/vercel-deploy-claimable.md +120 -0
- package/merged-commands/vercel-deploy.md +22 -0
- package/merged-commands/vercel-deployment.md +79 -0
- package/merged-commands/verification-before-completion.md +139 -0
- package/merged-commands/vexor.md +22 -0
- package/merged-commands/video-downloader.md +106 -0
- package/merged-commands/viral-generator-builder.md +199 -0
- package/merged-commands/voice-agents.md +68 -0
- package/merged-commands/voice-ai-development.md +302 -0
- package/merged-commands/voice-ai-engine-development.md +721 -0
- package/merged-commands/vue-expert-js.md +91 -0
- package/merged-commands/vue-expert.md +374 -0
- package/merged-commands/vulnerability-scanner.md +276 -0
- package/merged-commands/wcag-audit-patterns.md +41 -0
- package/merged-commands/web-artifacts-builder.md +74 -0
- package/merged-commands/web-design-guidelines.md +36 -0
- package/merged-commands/web-frameworks.md +324 -0
- package/merged-commands/web-performance-optimization.md +646 -0
- package/merged-commands/web3-testing.md +427 -0
- package/merged-commands/webapp-testing.md +96 -0
- package/merged-commands/websocket-engineer.md +96 -0
- package/merged-commands/windows-privilege-escalation.md +496 -0
- package/merged-commands/wireshark-analysis.md +497 -0
- package/merged-commands/wordpress-penetration-testing.md +485 -0
- package/merged-commands/wordpress-pro.md +105 -0
- package/merged-commands/workflow-automation.md +68 -0
- package/merged-commands/workflow-orchestration-patterns.md +333 -0
- package/merged-commands/workflow-patterns.md +38 -0
- package/merged-commands/writing-plans.md +116 -0
- package/merged-commands/writing-skills.md +125 -0
- package/merged-commands/x-article-publisher-skill.md +22 -0
- package/merged-commands/xlsx-official.md +289 -0
- package/merged-commands/xlsx.md +289 -0
- package/merged-commands/xss-html-injection.md +499 -0
- package/merged-commands/youtube-transcript.md +415 -0
- package/merged-commands/zapier-make-patterns.md +67 -0
- package/merged-commands/zustand-store.md +68 -0
- package/package.json +1 -1
- package/scripts/merge-commands.js +21 -0
- package/templates/base/rules/auto-skill.md +131 -0
|
@@ -0,0 +1,721 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: voice-ai-engine-development
|
|
3
|
+
description: "Build real-time conversational AI voice engines using async worker pipelines, streaming transcription, LLM agents, and TTS synthesis with interrupt handling and multi-provider support"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Voice AI Engine Development
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
This skill guides you through building production-ready voice AI engines with real-time conversation capabilities. Voice AI engines enable natural, bidirectional conversations between users and AI agents through streaming audio processing, speech-to-text transcription, LLM-powered responses, and text-to-speech synthesis.
|
|
11
|
+
|
|
12
|
+
The core architecture uses an async queue-based worker pipeline where each component runs independently and communicates via `asyncio.Queue` objects, enabling concurrent processing, interrupt handling, and real-time streaming at every stage.
|
|
13
|
+
|
|
14
|
+
## When to Use This Skill
|
|
15
|
+
|
|
16
|
+
Use this skill when:
|
|
17
|
+
- Building real-time voice conversation systems
|
|
18
|
+
- Implementing voice assistants or chatbots
|
|
19
|
+
- Creating voice-enabled customer service agents
|
|
20
|
+
- Developing voice AI applications with interrupt capabilities
|
|
21
|
+
- Integrating multiple transcription, LLM, or TTS providers
|
|
22
|
+
- Working with streaming audio processing pipelines
|
|
23
|
+
- The user mentions Vocode, voice engines, or conversational AI
|
|
24
|
+
|
|
25
|
+
## Core Architecture Principles
|
|
26
|
+
|
|
27
|
+
### The Worker Pipeline Pattern
|
|
28
|
+
|
|
29
|
+
Every voice AI engine follows this pipeline:
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
Audio In → Transcriber → Agent → Synthesizer → Audio Out
|
|
33
|
+
(Worker 1) (Worker 2) (Worker 3)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Key Benefits:**
|
|
37
|
+
- **Decoupling**: Workers only know about their input/output queues
|
|
38
|
+
- **Concurrency**: All workers run simultaneously via asyncio
|
|
39
|
+
- **Backpressure**: Queues automatically handle rate differences
|
|
40
|
+
- **Interruptibility**: Everything can be stopped mid-stream
|
|
41
|
+
|
|
42
|
+
### Base Worker Pattern
|
|
43
|
+
|
|
44
|
+
Every worker follows this pattern:
|
|
45
|
+
|
|
46
|
+
```python
|
|
47
|
+
class BaseWorker:
|
|
48
|
+
def __init__(self, input_queue, output_queue):
|
|
49
|
+
self.input_queue = input_queue # asyncio.Queue to consume from
|
|
50
|
+
self.output_queue = output_queue # asyncio.Queue to produce to
|
|
51
|
+
self.active = False
|
|
52
|
+
|
|
53
|
+
def start(self):
|
|
54
|
+
"""Start the worker's processing loop"""
|
|
55
|
+
self.active = True
|
|
56
|
+
asyncio.create_task(self._run_loop())
|
|
57
|
+
|
|
58
|
+
async def _run_loop(self):
|
|
59
|
+
"""Main processing loop - runs forever until terminated"""
|
|
60
|
+
while self.active:
|
|
61
|
+
item = await self.input_queue.get() # Block until item arrives
|
|
62
|
+
await self.process(item) # Process the item
|
|
63
|
+
|
|
64
|
+
async def process(self, item):
|
|
65
|
+
"""Override this - does the actual work"""
|
|
66
|
+
raise NotImplementedError
|
|
67
|
+
|
|
68
|
+
def terminate(self):
|
|
69
|
+
"""Stop the worker"""
|
|
70
|
+
self.active = False
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Component Implementation Guide
|
|
74
|
+
|
|
75
|
+
### 1. Transcriber (Audio → Text)
|
|
76
|
+
|
|
77
|
+
**Purpose**: Converts incoming audio chunks to text transcriptions
|
|
78
|
+
|
|
79
|
+
**Interface Requirements**:
|
|
80
|
+
```python
|
|
81
|
+
class BaseTranscriber:
|
|
82
|
+
def __init__(self, transcriber_config):
|
|
83
|
+
self.input_queue = asyncio.Queue() # Audio chunks (bytes)
|
|
84
|
+
self.output_queue = asyncio.Queue() # Transcriptions
|
|
85
|
+
self.is_muted = False
|
|
86
|
+
|
|
87
|
+
def send_audio(self, chunk: bytes):
|
|
88
|
+
"""Client calls this to send audio"""
|
|
89
|
+
if not self.is_muted:
|
|
90
|
+
self.input_queue.put_nowait(chunk)
|
|
91
|
+
else:
|
|
92
|
+
# Send silence instead (prevents echo during bot speech)
|
|
93
|
+
self.input_queue.put_nowait(self.create_silent_chunk(len(chunk)))
|
|
94
|
+
|
|
95
|
+
def mute(self):
|
|
96
|
+
"""Called when bot starts speaking (prevents echo)"""
|
|
97
|
+
self.is_muted = True
|
|
98
|
+
|
|
99
|
+
def unmute(self):
|
|
100
|
+
"""Called when bot stops speaking"""
|
|
101
|
+
self.is_muted = False
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**Output Format**:
|
|
105
|
+
```python
|
|
106
|
+
class Transcription:
|
|
107
|
+
message: str # "Hello, how are you?"
|
|
108
|
+
confidence: float # 0.95
|
|
109
|
+
is_final: bool # True = complete sentence, False = partial
|
|
110
|
+
is_interrupt: bool # Set by TranscriptionsWorker
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**Supported Providers**:
|
|
114
|
+
- **Deepgram** - Fast, accurate, streaming
|
|
115
|
+
- **AssemblyAI** - High accuracy, good for accents
|
|
116
|
+
- **Azure Speech** - Enterprise-grade
|
|
117
|
+
- **Google Cloud Speech** - Multi-language support
|
|
118
|
+
|
|
119
|
+
**Critical Implementation Details**:
|
|
120
|
+
- Use WebSocket for bidirectional streaming
|
|
121
|
+
- Run sender and receiver tasks concurrently with `asyncio.gather()`
|
|
122
|
+
- Mute transcriber when bot speaks to prevent echo/feedback loops
|
|
123
|
+
- Handle both final and partial transcriptions
|
|
124
|
+
|
|
125
|
+
### 2. Agent (Text → Response)
|
|
126
|
+
|
|
127
|
+
**Purpose**: Processes user input and generates conversational responses
|
|
128
|
+
|
|
129
|
+
**Interface Requirements**:
|
|
130
|
+
```python
|
|
131
|
+
class BaseAgent:
|
|
132
|
+
def __init__(self, agent_config):
|
|
133
|
+
self.input_queue = asyncio.Queue() # TranscriptionAgentInput
|
|
134
|
+
self.output_queue = asyncio.Queue() # AgentResponse
|
|
135
|
+
self.transcript = None # Conversation history
|
|
136
|
+
|
|
137
|
+
async def generate_response(self, human_input, is_interrupt, conversation_id):
|
|
138
|
+
"""Override this - returns AsyncGenerator of responses"""
|
|
139
|
+
raise NotImplementedError
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Why Streaming Responses?**
|
|
143
|
+
- **Lower latency**: Start speaking as soon as first sentence is ready
|
|
144
|
+
- **Better interrupts**: Can stop mid-response
|
|
145
|
+
- **Sentence-by-sentence**: More natural conversation flow
|
|
146
|
+
|
|
147
|
+
**Supported Providers**:
|
|
148
|
+
- **OpenAI** (GPT-4, GPT-3.5) - High quality, fast
|
|
149
|
+
- **Google Gemini** - Multimodal, cost-effective
|
|
150
|
+
- **Anthropic Claude** - Long context, nuanced responses
|
|
151
|
+
|
|
152
|
+
**Critical Implementation Details**:
|
|
153
|
+
- Maintain conversation history in `Transcript` object
|
|
154
|
+
- Stream responses using `AsyncGenerator`
|
|
155
|
+
- **IMPORTANT**: Buffer entire LLM response before yielding to synthesizer (prevents audio jumping)
|
|
156
|
+
- Handle interrupts by canceling current generation task
|
|
157
|
+
- Update conversation history with partial messages on interrupt
|
|
158
|
+
|
|
159
|
+
### 3. Synthesizer (Text → Audio)
|
|
160
|
+
|
|
161
|
+
**Purpose**: Converts agent text responses to speech audio
|
|
162
|
+
|
|
163
|
+
**Interface Requirements**:
|
|
164
|
+
```python
|
|
165
|
+
class BaseSynthesizer:
|
|
166
|
+
async def create_speech(self, message: BaseMessage, chunk_size: int) -> SynthesisResult:
|
|
167
|
+
"""
|
|
168
|
+
Returns a SynthesisResult containing:
|
|
169
|
+
- chunk_generator: AsyncGenerator that yields audio chunks
|
|
170
|
+
- get_message_up_to: Function to get partial text (for interrupts)
|
|
171
|
+
"""
|
|
172
|
+
raise NotImplementedError
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
**SynthesisResult Structure**:
|
|
176
|
+
```python
|
|
177
|
+
class SynthesisResult:
|
|
178
|
+
chunk_generator: AsyncGenerator[ChunkResult, None]
|
|
179
|
+
get_message_up_to: Callable[[float], str] # seconds → partial text
|
|
180
|
+
|
|
181
|
+
class ChunkResult:
|
|
182
|
+
chunk: bytes # Raw PCM audio
|
|
183
|
+
is_last_chunk: bool
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**Supported Providers**:
|
|
187
|
+
- **ElevenLabs** - Most natural voices, streaming
|
|
188
|
+
- **Azure TTS** - Enterprise-grade, many languages
|
|
189
|
+
- **Google Cloud TTS** - Cost-effective, good quality
|
|
190
|
+
- **Amazon Polly** - AWS integration
|
|
191
|
+
- **Play.ht** - Voice cloning
|
|
192
|
+
|
|
193
|
+
**Critical Implementation Details**:
|
|
194
|
+
- Stream audio chunks as they're generated
|
|
195
|
+
- Convert audio to LINEAR16 PCM format (16kHz sample rate)
|
|
196
|
+
- Implement `get_message_up_to()` for interrupt handling
|
|
197
|
+
- Handle audio format conversion (MP3 → PCM)
|
|
198
|
+
|
|
199
|
+
### 4. Output Device (Audio → Client)
|
|
200
|
+
|
|
201
|
+
**Purpose**: Sends synthesized audio back to the client
|
|
202
|
+
|
|
203
|
+
**CRITICAL: Rate Limiting for Interrupts**
|
|
204
|
+
|
|
205
|
+
```python
|
|
206
|
+
async def send_speech_to_output(self, message, synthesis_result,
|
|
207
|
+
stop_event, seconds_per_chunk):
|
|
208
|
+
chunk_idx = 0
|
|
209
|
+
async for chunk_result in synthesis_result.chunk_generator:
|
|
210
|
+
# Check for interrupt
|
|
211
|
+
if stop_event.is_set():
|
|
212
|
+
logger.debug(f"Interrupted after {chunk_idx} chunks")
|
|
213
|
+
message_sent = synthesis_result.get_message_up_to(
|
|
214
|
+
chunk_idx * seconds_per_chunk
|
|
215
|
+
)
|
|
216
|
+
return message_sent, True # cut_off = True
|
|
217
|
+
|
|
218
|
+
start_time = time.time()
|
|
219
|
+
|
|
220
|
+
# Send chunk to output device
|
|
221
|
+
self.output_device.consume_nonblocking(chunk_result.chunk)
|
|
222
|
+
|
|
223
|
+
# CRITICAL: Wait for chunk to play before sending next one
|
|
224
|
+
# This is what makes interrupts work!
|
|
225
|
+
speech_length = seconds_per_chunk
|
|
226
|
+
processing_time = time.time() - start_time
|
|
227
|
+
await asyncio.sleep(max(speech_length - processing_time, 0))
|
|
228
|
+
|
|
229
|
+
chunk_idx += 1
|
|
230
|
+
|
|
231
|
+
return message, False # cut_off = False
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**Why Rate Limiting?**
|
|
235
|
+
Without rate limiting, all audio chunks would be sent immediately, which would:
|
|
236
|
+
- Buffer entire message on client side
|
|
237
|
+
- Make interrupts impossible (all audio already sent)
|
|
238
|
+
- Cause timing issues
|
|
239
|
+
|
|
240
|
+
By sending one chunk every N seconds:
|
|
241
|
+
- Real-time playback is maintained
|
|
242
|
+
- Interrupts can stop mid-sentence
|
|
243
|
+
- Natural conversation flow is preserved
|
|
244
|
+
|
|
245
|
+
## The Interrupt System
|
|
246
|
+
|
|
247
|
+
The interrupt system is critical for natural conversations.
|
|
248
|
+
|
|
249
|
+
### How Interrupts Work
|
|
250
|
+
|
|
251
|
+
**Scenario**: Bot is saying "I think the weather will be nice today and tomorrow and—" when user interrupts with "Stop".
|
|
252
|
+
|
|
253
|
+
**Step 1: User starts speaking**
|
|
254
|
+
```python
|
|
255
|
+
# TranscriptionsWorker detects new transcription while bot speaking
|
|
256
|
+
async def process(self, transcription):
|
|
257
|
+
if not self.conversation.is_human_speaking: # Bot was speaking!
|
|
258
|
+
# Broadcast interrupt to all in-flight events
|
|
259
|
+
interrupted = self.conversation.broadcast_interrupt()
|
|
260
|
+
transcription.is_interrupt = interrupted
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
**Step 2: broadcast_interrupt() stops everything**
|
|
264
|
+
```python
|
|
265
|
+
def broadcast_interrupt(self):
|
|
266
|
+
num_interrupts = 0
|
|
267
|
+
# Interrupt all queued events
|
|
268
|
+
while True:
|
|
269
|
+
try:
|
|
270
|
+
interruptible_event = self.interruptible_events.get_nowait()
|
|
271
|
+
if interruptible_event.interrupt(): # Sets interruption_event
|
|
272
|
+
num_interrupts += 1
|
|
273
|
+
except queue.Empty:
|
|
274
|
+
break
|
|
275
|
+
|
|
276
|
+
# Cancel current tasks
|
|
277
|
+
self.agent.cancel_current_task() # Stop generating text
|
|
278
|
+
self.agent_responses_worker.cancel_current_task() # Stop synthesizing
|
|
279
|
+
return num_interrupts > 0
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
**Step 3: SynthesisResultsWorker detects interrupt**
|
|
283
|
+
```python
|
|
284
|
+
async def send_speech_to_output(self, synthesis_result, stop_event, ...):
|
|
285
|
+
async for chunk_result in synthesis_result.chunk_generator:
|
|
286
|
+
# Check stop_event (this is the interruption_event)
|
|
287
|
+
if stop_event.is_set():
|
|
288
|
+
logger.debug("Interrupted! Stopping speech.")
|
|
289
|
+
# Calculate what was actually spoken
|
|
290
|
+
seconds_spoken = chunk_idx * seconds_per_chunk
|
|
291
|
+
partial_message = synthesis_result.get_message_up_to(seconds_spoken)
|
|
292
|
+
# e.g., "I think the weather will be nice today"
|
|
293
|
+
return partial_message, True # cut_off = True
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
**Step 4: Agent updates history**
|
|
297
|
+
```python
|
|
298
|
+
if cut_off:
|
|
299
|
+
# Update conversation history with partial message
|
|
300
|
+
self.agent.update_last_bot_message_on_cut_off(message_sent)
|
|
301
|
+
# History now shows:
|
|
302
|
+
# Bot: "I think the weather will be nice today" (incomplete)
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### InterruptibleEvent Pattern
|
|
306
|
+
|
|
307
|
+
Every event in the pipeline is wrapped in an `InterruptibleEvent`:
|
|
308
|
+
|
|
309
|
+
```python
|
|
310
|
+
class InterruptibleEvent:
|
|
311
|
+
def __init__(self, payload, is_interruptible=True):
|
|
312
|
+
self.payload = payload
|
|
313
|
+
self.is_interruptible = is_interruptible
|
|
314
|
+
self.interruption_event = threading.Event() # Initially not set
|
|
315
|
+
self.interrupted = False
|
|
316
|
+
|
|
317
|
+
def interrupt(self) -> bool:
|
|
318
|
+
"""Interrupt this event"""
|
|
319
|
+
if not self.is_interruptible:
|
|
320
|
+
return False
|
|
321
|
+
if not self.interrupted:
|
|
322
|
+
self.interruption_event.set() # Signal to stop!
|
|
323
|
+
self.interrupted = True
|
|
324
|
+
return True
|
|
325
|
+
return False
|
|
326
|
+
|
|
327
|
+
def is_interrupted(self) -> bool:
|
|
328
|
+
return self.interruption_event.is_set()
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
## Multi-Provider Factory Pattern
|
|
332
|
+
|
|
333
|
+
Support multiple providers with a factory pattern:
|
|
334
|
+
|
|
335
|
+
```python
|
|
336
|
+
class VoiceHandler:
|
|
337
|
+
"""Multi-provider factory for voice components"""
|
|
338
|
+
|
|
339
|
+
def create_transcriber(self, agent_config: Dict):
|
|
340
|
+
"""Create transcriber based on transcriberProvider"""
|
|
341
|
+
provider = agent_config.get("transcriberProvider", "deepgram")
|
|
342
|
+
|
|
343
|
+
if provider == "deepgram":
|
|
344
|
+
return self._create_deepgram_transcriber(agent_config)
|
|
345
|
+
elif provider == "assemblyai":
|
|
346
|
+
return self._create_assemblyai_transcriber(agent_config)
|
|
347
|
+
elif provider == "azure":
|
|
348
|
+
return self._create_azure_transcriber(agent_config)
|
|
349
|
+
elif provider == "google":
|
|
350
|
+
return self._create_google_transcriber(agent_config)
|
|
351
|
+
else:
|
|
352
|
+
raise ValueError(f"Unknown transcriber provider: {provider}")
|
|
353
|
+
|
|
354
|
+
def create_agent(self, agent_config: Dict):
|
|
355
|
+
"""Create LLM agent based on llmProvider"""
|
|
356
|
+
provider = agent_config.get("llmProvider", "openai")
|
|
357
|
+
|
|
358
|
+
if provider == "openai":
|
|
359
|
+
return self._create_openai_agent(agent_config)
|
|
360
|
+
elif provider == "gemini":
|
|
361
|
+
return self._create_gemini_agent(agent_config)
|
|
362
|
+
else:
|
|
363
|
+
raise ValueError(f"Unknown LLM provider: {provider}")
|
|
364
|
+
|
|
365
|
+
def create_synthesizer(self, agent_config: Dict):
|
|
366
|
+
"""Create voice synthesizer based on voiceProvider"""
|
|
367
|
+
provider = agent_config.get("voiceProvider", "elevenlabs")
|
|
368
|
+
|
|
369
|
+
if provider == "elevenlabs":
|
|
370
|
+
return self._create_elevenlabs_synthesizer(agent_config)
|
|
371
|
+
elif provider == "azure":
|
|
372
|
+
return self._create_azure_synthesizer(agent_config)
|
|
373
|
+
elif provider == "google":
|
|
374
|
+
return self._create_google_synthesizer(agent_config)
|
|
375
|
+
elif provider == "polly":
|
|
376
|
+
return self._create_polly_synthesizer(agent_config)
|
|
377
|
+
elif provider == "playht":
|
|
378
|
+
return self._create_playht_synthesizer(agent_config)
|
|
379
|
+
else:
|
|
380
|
+
raise ValueError(f"Unknown voice provider: {provider}")
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
## WebSocket Integration
|
|
384
|
+
|
|
385
|
+
Voice AI engines typically use WebSocket for bidirectional audio streaming:
|
|
386
|
+
|
|
387
|
+
```python
|
|
388
|
+
@app.websocket("/conversation")
|
|
389
|
+
async def websocket_endpoint(websocket: WebSocket):
|
|
390
|
+
await websocket.accept()
|
|
391
|
+
|
|
392
|
+
# Create voice components
|
|
393
|
+
voice_handler = VoiceHandler()
|
|
394
|
+
transcriber = voice_handler.create_transcriber(agent_config)
|
|
395
|
+
agent = voice_handler.create_agent(agent_config)
|
|
396
|
+
synthesizer = voice_handler.create_synthesizer(agent_config)
|
|
397
|
+
|
|
398
|
+
# Create output device
|
|
399
|
+
output_device = WebsocketOutputDevice(
|
|
400
|
+
ws=websocket,
|
|
401
|
+
sampling_rate=16000,
|
|
402
|
+
audio_encoding=AudioEncoding.LINEAR16
|
|
403
|
+
)
|
|
404
|
+
|
|
405
|
+
# Create conversation orchestrator
|
|
406
|
+
conversation = StreamingConversation(
|
|
407
|
+
output_device=output_device,
|
|
408
|
+
transcriber=transcriber,
|
|
409
|
+
agent=agent,
|
|
410
|
+
synthesizer=synthesizer
|
|
411
|
+
)
|
|
412
|
+
|
|
413
|
+
# Start all workers
|
|
414
|
+
await conversation.start()
|
|
415
|
+
|
|
416
|
+
try:
|
|
417
|
+
# Receive audio from client
|
|
418
|
+
async for message in websocket.iter_bytes():
|
|
419
|
+
conversation.receive_audio(message)
|
|
420
|
+
except WebSocketDisconnect:
|
|
421
|
+
logger.info("Client disconnected")
|
|
422
|
+
finally:
|
|
423
|
+
await conversation.terminate()
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
## Common Pitfalls and Solutions
|
|
427
|
+
|
|
428
|
+
### 1. Audio Jumping/Cutting Off
|
|
429
|
+
|
|
430
|
+
**Problem**: Bot's audio jumps or cuts off mid-response.
|
|
431
|
+
|
|
432
|
+
**Cause**: Sending text to synthesizer in small chunks causes multiple TTS calls.
|
|
433
|
+
|
|
434
|
+
**Solution**: Buffer the entire LLM response before sending to synthesizer:
|
|
435
|
+
|
|
436
|
+
```python
|
|
437
|
+
# ❌ Bad: Yields sentence-by-sentence
|
|
438
|
+
async for sentence in llm_stream:
|
|
439
|
+
yield GeneratedResponse(message=BaseMessage(text=sentence))
|
|
440
|
+
|
|
441
|
+
# ✅ Good: Buffer entire response
|
|
442
|
+
full_response = ""
|
|
443
|
+
async for chunk in llm_stream:
|
|
444
|
+
full_response += chunk
|
|
445
|
+
yield GeneratedResponse(message=BaseMessage(text=full_response))
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
### 2. Echo/Feedback Loop
|
|
449
|
+
|
|
450
|
+
**Problem**: Bot hears itself speaking and responds to its own audio.
|
|
451
|
+
|
|
452
|
+
**Cause**: Transcriber not muted during bot speech.
|
|
453
|
+
|
|
454
|
+
**Solution**: Mute transcriber when bot starts speaking:
|
|
455
|
+
|
|
456
|
+
```python
|
|
457
|
+
# Before sending audio to output
|
|
458
|
+
self.transcriber.mute()
|
|
459
|
+
# After audio playback complete
|
|
460
|
+
self.transcriber.unmute()
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
### 3. Interrupts Not Working
|
|
464
|
+
|
|
465
|
+
**Problem**: User can't interrupt bot mid-sentence.
|
|
466
|
+
|
|
467
|
+
**Cause**: All audio chunks sent at once instead of rate-limited.
|
|
468
|
+
|
|
469
|
+
**Solution**: Rate-limit audio chunks to match real-time playback:
|
|
470
|
+
|
|
471
|
+
```python
|
|
472
|
+
async for chunk in synthesis_result.chunk_generator:
|
|
473
|
+
start_time = time.time()
|
|
474
|
+
|
|
475
|
+
# Send chunk
|
|
476
|
+
output_device.consume_nonblocking(chunk)
|
|
477
|
+
|
|
478
|
+
# Wait for chunk duration before sending next
|
|
479
|
+
processing_time = time.time() - start_time
|
|
480
|
+
await asyncio.sleep(max(seconds_per_chunk - processing_time, 0))
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
### 4. Memory Leaks from Unclosed Streams
|
|
484
|
+
|
|
485
|
+
**Problem**: Memory usage grows over time.
|
|
486
|
+
|
|
487
|
+
**Cause**: WebSocket connections or API streams not properly closed.
|
|
488
|
+
|
|
489
|
+
**Solution**: Always use context managers and cleanup:
|
|
490
|
+
|
|
491
|
+
```python
|
|
492
|
+
try:
|
|
493
|
+
async with websockets.connect(url) as ws:
|
|
494
|
+
# Use websocket
|
|
495
|
+
pass
|
|
496
|
+
finally:
|
|
497
|
+
# Cleanup
|
|
498
|
+
await conversation.terminate()
|
|
499
|
+
await transcriber.terminate()
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
## Production Considerations
|
|
503
|
+
|
|
504
|
+
### 1. Error Handling
|
|
505
|
+
|
|
506
|
+
```python
|
|
507
|
+
async def _run_loop(self):
|
|
508
|
+
while self.active:
|
|
509
|
+
try:
|
|
510
|
+
item = await self.input_queue.get()
|
|
511
|
+
await self.process(item)
|
|
512
|
+
except Exception as e:
|
|
513
|
+
logger.error(f"Worker error: {e}", exc_info=True)
|
|
514
|
+
# Don't crash the worker, continue processing
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
### 2. Graceful Shutdown
|
|
518
|
+
|
|
519
|
+
```python
|
|
520
|
+
async def terminate(self):
|
|
521
|
+
"""Gracefully shut down all workers"""
|
|
522
|
+
self.active = False
|
|
523
|
+
|
|
524
|
+
# Stop all workers
|
|
525
|
+
self.transcriber.terminate()
|
|
526
|
+
self.agent.terminate()
|
|
527
|
+
self.synthesizer.terminate()
|
|
528
|
+
|
|
529
|
+
# Wait for queues to drain
|
|
530
|
+
await asyncio.sleep(0.5)
|
|
531
|
+
|
|
532
|
+
# Close connections
|
|
533
|
+
if self.websocket:
|
|
534
|
+
await self.websocket.close()
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
### 3. Monitoring and Logging
|
|
538
|
+
|
|
539
|
+
```python
|
|
540
|
+
# Log key events
|
|
541
|
+
logger.info(f"🎤 [TRANSCRIBER] Received: '{transcription.message}'")
|
|
542
|
+
logger.info(f"🤖 [AGENT] Generating response...")
|
|
543
|
+
logger.info(f"🔊 [SYNTHESIZER] Synthesizing {len(text)} characters")
|
|
544
|
+
logger.info(f"⚠️ [INTERRUPT] User interrupted bot")
|
|
545
|
+
|
|
546
|
+
# Track metrics
|
|
547
|
+
metrics.increment("transcriptions.count")
|
|
548
|
+
metrics.timing("agent.response_time", duration)
|
|
549
|
+
metrics.gauge("active_conversations", count)
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
### 4. Rate Limiting and Quotas
|
|
553
|
+
|
|
554
|
+
```python
|
|
555
|
+
# Implement rate limiting for API calls
|
|
556
|
+
from aiolimiter import AsyncLimiter
|
|
557
|
+
|
|
558
|
+
rate_limiter = AsyncLimiter(max_rate=10, time_period=1) # 10 calls/second
|
|
559
|
+
|
|
560
|
+
async def call_api(self, data):
|
|
561
|
+
async with rate_limiter:
|
|
562
|
+
return await self.client.post(data)
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
## Key Design Patterns
|
|
566
|
+
|
|
567
|
+
### 1. Producer-Consumer with Queues
|
|
568
|
+
|
|
569
|
+
```python
|
|
570
|
+
# Producer
|
|
571
|
+
async def producer(queue):
|
|
572
|
+
while True:
|
|
573
|
+
item = await generate_item()
|
|
574
|
+
queue.put_nowait(item)
|
|
575
|
+
|
|
576
|
+
# Consumer
|
|
577
|
+
async def consumer(queue):
|
|
578
|
+
while True:
|
|
579
|
+
item = await queue.get()
|
|
580
|
+
await process_item(item)
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
### 2. Streaming Generators
|
|
584
|
+
|
|
585
|
+
Instead of returning complete results:
|
|
586
|
+
|
|
587
|
+
```python
|
|
588
|
+
# ❌ Bad: Wait for entire response
|
|
589
|
+
async def generate_response(prompt):
|
|
590
|
+
response = await openai.complete(prompt) # 5 seconds
|
|
591
|
+
return response
|
|
592
|
+
|
|
593
|
+
# ✅ Good: Stream chunks as they arrive
|
|
594
|
+
async def generate_response(prompt):
|
|
595
|
+
async for chunk in openai.complete(prompt, stream=True):
|
|
596
|
+
yield chunk # Yield after 0.1s, 0.2s, etc.
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
### 3. Conversation State Management
|
|
600
|
+
|
|
601
|
+
Maintain conversation history for context:
|
|
602
|
+
|
|
603
|
+
```python
|
|
604
|
+
class Transcript:
|
|
605
|
+
event_logs: List[Message] = []
|
|
606
|
+
|
|
607
|
+
def add_human_message(self, text):
|
|
608
|
+
self.event_logs.append(Message(sender=Sender.HUMAN, text=text))
|
|
609
|
+
|
|
610
|
+
def add_bot_message(self, text):
|
|
611
|
+
self.event_logs.append(Message(sender=Sender.BOT, text=text))
|
|
612
|
+
|
|
613
|
+
def to_openai_messages(self):
|
|
614
|
+
return [
|
|
615
|
+
{"role": "user" if msg.sender == Sender.HUMAN else "assistant",
|
|
616
|
+
"content": msg.text}
|
|
617
|
+
for msg in self.event_logs
|
|
618
|
+
]
|
|
619
|
+
```
|
|
620
|
+
|
|
621
|
+
## Testing Strategies
|
|
622
|
+
|
|
623
|
+
### 1. Unit Test Workers in Isolation
|
|
624
|
+
|
|
625
|
+
```python
|
|
626
|
+
async def test_transcriber():
|
|
627
|
+
transcriber = DeepgramTranscriber(config)
|
|
628
|
+
|
|
629
|
+
# Mock audio input
|
|
630
|
+
audio_chunk = b'\x00\x01\x02...'
|
|
631
|
+
transcriber.send_audio(audio_chunk)
|
|
632
|
+
|
|
633
|
+
# Check output
|
|
634
|
+
transcription = await transcriber.output_queue.get()
|
|
635
|
+
assert transcription.message == "expected text"
|
|
636
|
+
```
|
|
637
|
+
|
|
638
|
+
### 2. Integration Test Pipeline
|
|
639
|
+
|
|
640
|
+
```python
|
|
641
|
+
async def test_full_pipeline():
|
|
642
|
+
# Create all components
|
|
643
|
+
conversation = create_test_conversation()
|
|
644
|
+
|
|
645
|
+
# Send test audio
|
|
646
|
+
conversation.receive_audio(test_audio_chunk)
|
|
647
|
+
|
|
648
|
+
# Wait for response
|
|
649
|
+
response = await wait_for_audio_output(timeout=5)
|
|
650
|
+
|
|
651
|
+
assert response is not None
|
|
652
|
+
```
|
|
653
|
+
|
|
654
|
+
### 3. Test Interrupts
|
|
655
|
+
|
|
656
|
+
```python
|
|
657
|
+
async def test_interrupt():
|
|
658
|
+
conversation = create_test_conversation()
|
|
659
|
+
|
|
660
|
+
# Start bot speaking
|
|
661
|
+
await conversation.agent.generate_response("Tell me a long story")
|
|
662
|
+
|
|
663
|
+
# Interrupt mid-response
|
|
664
|
+
await asyncio.sleep(1) # Let it speak for 1 second
|
|
665
|
+
conversation.broadcast_interrupt()
|
|
666
|
+
|
|
667
|
+
# Verify partial message in transcript
|
|
668
|
+
last_message = conversation.transcript.event_logs[-1]
|
|
669
|
+
assert last_message.text != full_expected_message
|
|
670
|
+
```
|
|
671
|
+
|
|
672
|
+
## Implementation Workflow
|
|
673
|
+
|
|
674
|
+
When implementing a voice AI engine:
|
|
675
|
+
|
|
676
|
+
1. **Start with Base Workers**: Implement the base worker pattern first
|
|
677
|
+
2. **Add Transcriber**: Choose a provider and implement streaming transcription
|
|
678
|
+
3. **Add Agent**: Implement LLM integration with streaming responses
|
|
679
|
+
4. **Add Synthesizer**: Implement TTS with audio streaming
|
|
680
|
+
5. **Connect Pipeline**: Wire all workers together with queues
|
|
681
|
+
6. **Add Interrupts**: Implement the interrupt system
|
|
682
|
+
7. **Add WebSocket**: Create WebSocket endpoint for client communication
|
|
683
|
+
8. **Test Components**: Unit test each worker in isolation
|
|
684
|
+
9. **Test Integration**: Test the full pipeline end-to-end
|
|
685
|
+
10. **Add Error Handling**: Implement robust error handling and logging
|
|
686
|
+
11. **Optimize**: Add rate limiting, monitoring, and performance optimizations
|
|
687
|
+
|
|
688
|
+
## Related Skills
|
|
689
|
+
|
|
690
|
+
- `@websocket-patterns` - For WebSocket implementation details
|
|
691
|
+
- `@async-python` - For asyncio and async patterns
|
|
692
|
+
- `@streaming-apis` - For streaming API integration
|
|
693
|
+
- `@audio-processing` - For audio format conversion and processing
|
|
694
|
+
- `@systematic-debugging` - For debugging complex async pipelines
|
|
695
|
+
|
|
696
|
+
## Resources
|
|
697
|
+
|
|
698
|
+
**Libraries**:
|
|
699
|
+
- `asyncio` - Async programming
|
|
700
|
+
- `websockets` - WebSocket client/server
|
|
701
|
+
- `FastAPI` - WebSocket server framework
|
|
702
|
+
- `pydub` - Audio manipulation
|
|
703
|
+
- `numpy` - Audio data processing
|
|
704
|
+
|
|
705
|
+
**API Providers**:
|
|
706
|
+
- Transcription: Deepgram, AssemblyAI, Azure Speech, Google Cloud Speech
|
|
707
|
+
- LLM: OpenAI, Google Gemini, Anthropic Claude
|
|
708
|
+
- TTS: ElevenLabs, Azure TTS, Google Cloud TTS, Amazon Polly, Play.ht
|
|
709
|
+
|
|
710
|
+
## Summary
|
|
711
|
+
|
|
712
|
+
Building a voice AI engine requires:
|
|
713
|
+
- ✅ Async worker pipeline for concurrent processing
|
|
714
|
+
- ✅ Queue-based communication between components
|
|
715
|
+
- ✅ Streaming at every stage (transcription, LLM, synthesis)
|
|
716
|
+
- ✅ Interrupt system for natural conversations
|
|
717
|
+
- ✅ Rate limiting for real-time audio playback
|
|
718
|
+
- ✅ Multi-provider support for flexibility
|
|
719
|
+
- ✅ Proper error handling and graceful shutdown
|
|
720
|
+
|
|
721
|
+
**The key insight**: Everything must stream and everything must be interruptible for natural, real-time conversations.
|