@thierrynakoa/fire-flow 12.2.1 → 13.0.1
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/CREDITS.md +25 -0
- package/DOMINION-FLOW-OVERVIEW.md +182 -38
- package/README.md +399 -455
- package/TROUBLESHOOTING.md +264 -264
- package/agents/fire-debugger.md +54 -0
- package/agents/fire-executor.md +1610 -1033
- package/agents/fire-fact-checker.md +1 -1
- package/agents/fire-planner.md +85 -17
- package/agents/fire-project-researcher.md +1 -1
- package/agents/fire-researcher.md +4 -22
- package/agents/{fire-phoenix-analyst.md → fire-resurrection-analyst.md} +394 -394
- package/agents/fire-reviewer.md +552 -499
- package/agents/fire-verifier.md +114 -19
- package/bin/cli.js +18 -101
- package/commands/fire-0-orient.md +2 -2
- package/commands/fire-1a-new.md +50 -15
- package/commands/fire-1c-setup.md +33 -5
- package/commands/fire-1d-discuss.md +87 -1
- package/commands/fire-2-plan.md +556 -527
- package/commands/fire-3-execute.md +2046 -1356
- package/commands/fire-4-verify.md +975 -906
- package/commands/fire-5-handoff.md +46 -5
- package/commands/fire-6-resume.md +2 -31
- package/commands/fire-add-new-skill.md +138 -19
- package/commands/fire-autonomous.md +14 -2
- package/commands/fire-complete-milestone.md +1 -1
- package/commands/fire-cost.md +179 -183
- package/commands/fire-debug.md +1 -6
- package/commands/fire-loop-resume.md +2 -2
- package/commands/fire-loop-stop.md +1 -1
- package/commands/fire-loop.md +2 -15
- package/commands/fire-map-codebase.md +1 -1
- package/commands/fire-migrate-database.md +548 -0
- package/commands/fire-new-milestone.md +1 -1
- package/commands/fire-reflect.md +1 -2
- package/commands/fire-research.md +142 -21
- package/commands/{fire-phoenix.md → fire-resurrect.md} +859 -603
- package/commands/fire-scaffold.md +297 -0
- package/commands/fire-search.md +1 -2
- package/commands/fire-security-scan.md +483 -484
- package/commands/fire-setup.md +359 -0
- package/commands/fire-skill.md +770 -0
- package/commands/fire-skills-diff.md +506 -506
- package/commands/fire-skills-history.md +388 -388
- package/commands/fire-skills-rollback.md +7 -7
- package/commands/fire-skills-sync.md +470 -470
- package/commands/fire-test.md +5 -5
- package/commands/fire-todos.md +1 -1
- package/commands/fire-update.md +5 -5
- package/commands/fire-validate-skills.md +282 -0
- package/commands/fire-vuln-scan.md +492 -493
- package/hooks/run-hook.sh +8 -8
- package/hooks/run-session-end.sh +7 -7
- package/hooks/session-end.sh +90 -90
- package/hooks/session-start.sh +1 -1
- package/package.json +4 -24
- package/plugin.json +7 -7
- package/references/autonomy-levels.md +235 -0
- package/references/behavioral-directives.md +95 -3
- package/references/blocker-tracking.md +1 -1
- package/references/circuit-breaker.md +93 -2
- package/references/context-engineering.md +227 -9
- package/references/honesty-protocols.md +70 -1
- package/references/issue-to-pr-pipeline.md +149 -150
- package/references/metrics-and-trends.md +1 -2
- package/references/research-improvements.md +4 -108
- package/references/sdlc-mapping.md +73 -0
- package/references/state-machine.md +151 -0
- package/skills-library/AVAILABLE_TOOLS_REFERENCE.md +333 -0
- package/skills-library/SKILLS-INDEX.md +57 -558
- package/skills-library/SKILLS_LIBRARY_INDEX.md +532 -0
- package/skills-library/_general/api-patterns/api-field-name-mismatch.md +107 -0
- package/skills-library/_general/api-patterns/streaming-command-timeout.md +122 -0
- package/skills-library/_general/api-patterns/streaming-proxy-cors-bypass.md +102 -0
- package/skills-library/_general/automation/settings-gui-generator.md +172 -0
- package/skills-library/_general/database-solutions/data-type-mapping-reference.md +181 -0
- package/skills-library/_general/database-solutions/mysql-limit-offset-string-coercion.md +102 -0
- package/skills-library/_general/database-solutions/mysql-to-pg-migration.md +195 -0
- package/skills-library/_general/database-solutions/orm-schema-portability.md +193 -0
- package/skills-library/_general/database-solutions/persistent-analysis-storage.md +207 -0
- package/skills-library/_general/database-solutions/pg-to-mysql-schema-migration-methodology.md +190 -0
- package/skills-library/_general/database-solutions/sql-dialect-compatibility-matrix.md +306 -0
- package/skills-library/_general/database-solutions/sqlite-to-pg-migration.md +219 -0
- package/skills-library/_general/frontend/canvas-bubble-animation-grouping.md +270 -0
- package/skills-library/_general/frontend/color-token-migration.md +112 -0
- package/skills-library/_general/frontend/framer-motion-layoutid-grouping.md +150 -0
- package/skills-library/_general/frontend/pyqt6-settings-dialog.md +191 -0
- package/skills-library/_general/frontend/react-flow-animated-layout-switching.md +101 -0
- package/skills-library/_general/frontend/react-hooks-order-debugging.md +141 -0
- package/skills-library/_general/frontend/redux-localstorage-auth-desync.md +126 -0
- package/skills-library/_general/frontend/safari-csp-theme-color-debugging.md +124 -0
- package/skills-library/_general/frontend/safari-sw-cache-poisoning.md +138 -0
- package/skills-library/_general/frontend/svg-sparkline-no-charting-library.md +131 -0
- package/skills-library/_general/growth-marketing/oss-daily-growth-intelligence.md +224 -0
- package/skills-library/_general/integrations/claude-code-local-mcp-integration.md +250 -0
- package/skills-library/_general/integrations/mcp-composite-tool-orchestration.md +200 -0
- package/skills-library/_general/methodology/AGENT_SDK_STANDALONE_TOOLING.md +181 -0
- package/skills-library/_general/methodology/AGENT_TEAMS_GUIDE.md +169 -0
- package/skills-library/_general/methodology/ALAS_STATEFUL_EXECUTION.md +207 -0
- package/skills-library/_general/methodology/AUTO_REVIEWER_SUBAGENT.md +211 -0
- package/skills-library/_general/methodology/CONSISTENCY_CHECK_AMBIGUITY_GATE.md +96 -0
- package/skills-library/_general/methodology/DEAD_ENDS_SHELF.md +4 -4
- package/skills-library/_general/methodology/DISTILL_NOT_DUMP.md +108 -0
- package/skills-library/_general/methodology/EXECUTION_PROGRESS_MONITOR.md +157 -0
- package/skills-library/_general/methodology/HIERARCHICAL_REVIEW_MARS.md +122 -0
- package/skills-library/_general/methodology/MCP_INTER_AGENT_BRIDGE.md +207 -0
- package/skills-library/_general/methodology/MERMAID_WIZARD_DIAGRAMS.md +77 -0
- package/skills-library/_general/methodology/MISSING_DIMENSION_DETECTOR.md +89 -0
- package/skills-library/_general/methodology/MULTI_AGENT_COORDINATION.md +397 -0
- package/skills-library/_general/methodology/OBSERVATION_MASKING.md +100 -0
- package/skills-library/_general/methodology/PHOENIX_REBUILD_METHODOLOGY.md +82 -11
- package/skills-library/_general/methodology/REVIEW_BACKTRACK_PANEL.md +140 -0
- package/skills-library/_general/methodology/REVIEW_FIX_LOOP.md +117 -0
- package/skills-library/_general/methodology/VOTING_VERDICT_ARBITRATION.md +155 -0
- package/skills-library/_general/methodology/ZERO_FRICTION_CLI_SETUP.md +2 -2
- package/skills-library/_general/methodology/dead-code-activation.md +123 -0
- package/skills-library/_general/methodology/debug-swarm-researcher-escape-hatch.md +240 -240
- package/skills-library/_general/methodology/shell-autonomous-loop-fixplan.md +1 -1
- package/skills-library/_general/patterns-standards/GOF_DESIGN_PATTERNS_FOR_AI_AGENTS.md +5 -5
- package/skills-library/_general/patterns-standards/cascading-failure-diagnosis.md +119 -0
- package/skills-library/_general/patterns-standards/domain-specific-layout-algorithms.md +209 -0
- package/skills-library/_general/patterns-standards/python-desktop-app-architecture.md +399 -0
- package/skills-library/_general/patterns-standards/realtime-monitoring-dashboard.md +457 -0
- package/skills-library/_general/patterns-standards/togglable-processing-pipeline.md +169 -0
- package/skills-library/_general/performance/liveclock-extraction.md +112 -0
- package/skills-library/_general/performance/ref-based-canvas-animation.md +117 -0
- package/skills-library/_general/performance/use-visible-interval.md +131 -0
- package/skills-library/_general/testing/playwright-firefox-withcredentials-auth-issue.md +104 -0
- package/skills-library/_quarantine/README.md +30 -0
- package/skills-library/api-patterns/BROADCAST_SCHEDULER_SHARED_EXECUTE_FUNCTION.md +150 -0
- package/skills-library/api-patterns/ERROR_RESPONSE_STANDARDS.md +145 -0
- package/skills-library/api-patterns/EXPRESS_ROUTE_ORDERING_MIDDLEWARE_INTERCEPTION.md +326 -0
- package/skills-library/api-patterns/PAGINATION_PATTERNS.md +137 -0
- package/skills-library/api-patterns/PODCAST_PROGRESS_TRACKING_THREE_ROOT_CAUSES.md +277 -0
- package/skills-library/api-patterns/RATE_LIMITING_TOGGLE.md +155 -0
- package/skills-library/api-patterns/graphql-content-queries.md +708 -0
- package/skills-library/appointment-scheduler-design.md +423 -0
- package/skills-library/automation/AUTO_POPULATE_COMPLETE_GUIDE.md +631 -0
- package/skills-library/automation/CC_WORKFLOW_STUDIO.md +83 -0
- package/skills-library/automation/CLAUDE_CODE_SWARM_MODE.md +95 -0
- package/skills-library/automation/DAEMON_TRIGGER_FILE_IPC.md +195 -0
- package/skills-library/automation/scheduled-content-publishing.md +608 -0
- package/skills-library/awesome-workflows/Blogging-Platform-Instructions/view_commands.md +25 -0
- package/skills-library/awesome-workflows/CREDENTIAL-SECURITY-WORKFLOW.md +109 -0
- package/skills-library/awesome-workflows/DEBUGGING-WORKFLOW.md +124 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/README.md +31 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-principles-example.md +129 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-agent.md +107 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-claude-md-snippet.md +24 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-slash-command.md +38 -0
- package/skills-library/awesome-workflows/PARALLEL-RESEARCH-WORKFLOW.md +89 -0
- package/skills-library/awesome-workflows/PHASE-EXECUTION-WORKFLOW.md +97 -0
- package/skills-library/awesome-workflows/SESSION-HANDOFF-WORKFLOW.md +116 -0
- package/skills-library/cms-patterns/content-branch-preview.md +515 -0
- package/skills-library/cms-patterns/inline-visual-editing.md +666 -0
- package/skills-library/cms-patterns/mdx-component-content.md +649 -0
- package/skills-library/cms-patterns/media-manager-abstraction.md +827 -0
- package/skills-library/cms-patterns/schema-driven-form-generator.md +838 -0
- package/skills-library/complexity-metrics/complexity-divider.md +707 -0
- package/skills-library/complexity-metrics/work-with-complexity.md +193 -0
- package/skills-library/creative-multimedia/animation-stack-guide.md +577 -0
- package/skills-library/creative-multimedia/audio-enhancement-pipeline.md +625 -0
- package/skills-library/creative-multimedia/content-repurposing-pipeline.md +1146 -0
- package/skills-library/creative-multimedia/data-visualization-generator.md +862 -0
- package/skills-library/creative-multimedia/doc-to-podcast-pipeline.md +2184 -0
- package/skills-library/creative-multimedia/ffmpeg-command-generator.md +405 -0
- package/skills-library/creative-multimedia/image-optimization-pipeline.md +605 -0
- package/skills-library/creative-multimedia/multi-format-content-generator.md +1759 -0
- package/skills-library/creative-multimedia/og-image-generator.md +635 -0
- package/skills-library/creative-multimedia/podcast-audio-composition.md +1355 -0
- package/skills-library/creative-multimedia/podcast-quality-evaluation.md +1452 -0
- package/skills-library/creative-multimedia/podcast-script-generation.md +1841 -0
- package/skills-library/creative-multimedia/svg-generation.md +750 -0
- package/skills-library/creative-multimedia/text-to-speech-provider-selector.md +1414 -0
- package/skills-library/creative-multimedia/transcription-pipeline-selector.md +677 -0
- package/skills-library/creative-multimedia/video-streaming-setup.md +559 -0
- package/skills-library/database-solutions/AI_RESPONSE_DATABASE_CACHING.md +520 -0
- package/skills-library/database-solutions/CONDITIONAL_SQL_MIGRATION_PATTERN.md +119 -0
- package/skills-library/database-solutions/DATABASE_COLUMN_NAME_MISMATCH.md +393 -0
- package/skills-library/database-solutions/DATABASE_SCHEMA.md +394 -0
- package/skills-library/database-solutions/DATABASE_SCHEMA_VERIFICATION_GUIDE.md +348 -0
- package/skills-library/database-solutions/DATABASE_STRATEGY.md +71 -0
- package/skills-library/database-solutions/ES_MODULE_SEED_SCRIPT_PATTERN.md +52 -0
- package/skills-library/database-solutions/MIGRATION_GUIDE.md +3 -0
- package/skills-library/database-solutions/PLPGSQL_VARIABLE_CONFLICT_FIX.md +208 -0
- package/skills-library/database-solutions/POSTGRESQL_JSONB_DOUBLE_STRINGIFY_FIX.md +245 -0
- package/skills-library/database-solutions/POSTGRESQL_LICENSE_TABLE_DESIGN.md +393 -0
- package/skills-library/database-solutions/POSTGRESQL_UUID_DOCUMENT_RAG_DUAL_SCOPE.md +732 -0
- package/skills-library/database-solutions/POSTGRES_SQL_TEMPLATE_BINDING_ERROR.md +240 -0
- package/skills-library/database-solutions/PRISMA_DB_PUSH_DATA_LOSS_PREVENTION.md +141 -0
- package/skills-library/database-solutions/PRODUCTION_QUERY_OPTIMIZATION_RESTART_FIX.md +389 -0
- package/skills-library/database-solutions/RLS_SECURITY_GUIDE.md +107 -0
- package/skills-library/database-solutions/SCHEMA_ENHANCEMENTS_GUIDE.md +373 -0
- package/skills-library/database-solutions/SCHEMA_MIGRATION_GUIDE.md +368 -0
- package/skills-library/database-solutions/SCHEMA_VERIFICATION_QUICK_REFERENCE.md +104 -0
- package/skills-library/database-solutions/ai-erd-generator.md +1213 -0
- package/skills-library/database-solutions/content-publishing-states.md +631 -0
- package/skills-library/database-solutions/database-schema-designer.md +522 -0
- package/skills-library/database-solutions/er-diagram-components.md +569 -0
- package/skills-library/database-solutions/er-to-ddl-mapping.md +1405 -0
- package/skills-library/database-solutions/erd-creator-textbook-research.md +433 -0
- package/skills-library/database-solutions/erd-react-flow-architecture.md +1965 -0
- package/skills-library/database-solutions/mariadb-aggregate-function-replacement.md +145 -0
- package/skills-library/database-solutions/normalization-validator.md +778 -0
- package/skills-library/database-solutions/postgres-full-text-search-content.md +494 -0
- package/skills-library/database-solutions/postgresql-to-mysql-runtime-translation.md +286 -0
- package/skills-library/database-solutions/regex-alternation-ordering-sql-types.md +92 -0
- package/skills-library/database-solutions/reserved-word-context-aware-quoting.md +142 -0
- package/skills-library/database-solutions/sql-ddl-generator.md +756 -0
- package/skills-library/database-solutions/supabase-connection-pooler-fix.md +102 -0
- package/skills-library/deployment-security/CPANEL_NODE_DEPLOYMENT.md +166 -0
- package/skills-library/deployment-security/DEPLOYMENT.md +275 -0
- package/skills-library/deployment-security/DEPLOYMENT_CHECKLIST.md +363 -0
- package/skills-library/deployment-security/DEPLOYMENT_PLAN.md +669 -0
- package/skills-library/deployment-security/KNEX_DATABASE_ABSTRACTION.md +444 -0
- package/skills-library/deployment-security/LICENSE_KEY_SYSTEM.md +206 -0
- package/skills-library/deployment-security/NODE18_DEPENDENCY_COMPATIBILITY.md +284 -0
- package/skills-library/deployment-security/PHP_INSTALLER_WIZARD_GUIDE.md +315 -0
- package/skills-library/deployment-security/PM2_ENVIRONMENT_VARIABLE_CACHING.md +256 -0
- package/skills-library/deployment-security/PM2_MEMORY_EXHAUSTION_FIX.md +370 -0
- package/skills-library/deployment-security/PRODUCTION_DEPLOYMENT_GUIDE.md +592 -0
- package/skills-library/deployment-security/PRODUCTION_HARDENING_DOCUMENTATION.md +307 -0
- package/skills-library/deployment-security/PRODUCTION_RECOVERY_CHERRY_PICK_PATTERN.md +202 -0
- package/skills-library/deployment-security/PYINSTALLER_CUDA_WHISPER_BUNDLING.md +236 -0
- package/skills-library/deployment-security/SECURITY.md +41 -0
- package/skills-library/deployment-security/SMTP_SSL_HOSTNAME_MISMATCH_SHARED_HOSTING.md +220 -0
- package/skills-library/deployment-security/SPA_SEO_OPTIMIZATION_CPANEL.md +200 -0
- package/skills-library/deployment-security/SUPABASE_EDGE_FUNCTIONS.md +338 -0
- package/skills-library/deployment-security/VERCEL_GITHUB_DEPLOYMENT_GUIDE.md +858 -0
- package/skills-library/deployment-security/VPS_DEPLOYMENT_READINESS.md +356 -0
- package/skills-library/deployment-security/deployment-changes-not-applying.md +241 -0
- package/skills-library/deployment-security/env-file-management-production-local.md +203 -0
- package/skills-library/deployment-security/express-secure-file-downloads.md +413 -0
- package/skills-library/deployment-security/react-production-deployment-desktop-guide.md +2011 -0
- package/skills-library/deployment-security/self-hosted-supabase-coolify-guide.md +1684 -0
- package/skills-library/deployment-security/unique-features-ai-strategy-plaid-security.md +1613 -0
- package/skills-library/deployment-security/vps-deployment.md +135 -0
- package/skills-library/document-processing/WORD_EXPORT_MARKDOWN_FORMATTING.md +482 -0
- package/skills-library/document-processing/document-ai-landingai-integration.md +677 -0
- package/skills-library/document-processing/express-secure-file-downloads-mern.md +413 -0
- package/skills-library/document-processing/express-secure-file-downloads.md +413 -0
- package/skills-library/document-processing/md-to-word-converter.md +318 -0
- package/skills-library/document-processing/pdf-forms-integration/README.md +101 -0
- package/skills-library/document-processing/pdf-forms-integration/SKILL.md +662 -0
- package/skills-library/ecommerce/ADMIN_PRODUCTS_GUIDE.md +428 -0
- package/skills-library/ecommerce/ECOMMERCE_API_REFERENCE.md +776 -0
- package/skills-library/ecommerce/ECOMMERCE_COMPLETION_SUMMARY.md +673 -0
- package/skills-library/ecommerce/ECOMMERCE_IMPLEMENTATION_GUIDE.md +729 -0
- package/skills-library/ecommerce/ECOMMERCE_QUICK_REFERENCE.md +521 -0
- package/skills-library/ecommerce/ECOMMERCE_TESTING_CHECKLIST.md +565 -0
- package/skills-library/ecommerce/ECOMMERCE_WORKFLOW_GUIDE.md +1059 -0
- package/skills-library/ecommerce/PRODUCT_CREATION_EXPANDED.md +522 -0
- package/skills-library/ecommerce/agentic-commerce-protocol.md +203 -0
- package/skills-library/ecommerce/cart-abandonment-recovery.md +236 -0
- package/skills-library/ecommerce/cart-architecture-patterns.md +300 -0
- package/skills-library/ecommerce/cart-item-count-indicator.md +264 -0
- package/skills-library/ecommerce/checkout-ux-conversion.md +227 -0
- package/skills-library/ecommerce/composable-commerce-selection.md +166 -0
- package/skills-library/ecommerce/ecommerce-analytics-patterns.md +167 -0
- package/skills-library/ecommerce/fraud-detection-patterns.md +179 -0
- package/skills-library/ecommerce/inventory-stock-management.md +270 -0
- package/skills-library/ecommerce/order-saga-state-machine.md +336 -0
- package/skills-library/ecommerce/payment-provider-abstraction.md +245 -0
- package/skills-library/ecommerce/pci-compliance-checklist.md +192 -0
- package/skills-library/ecommerce/refund-chargeback-handling.md +177 -0
- package/skills-library/ecommerce/shipping-carrier-integration.md +218 -0
- package/skills-library/ecommerce/webhook-idempotency-patterns.md +253 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/ci.yml +558 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/prompt-gallery.yml +448 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/release.yml +42 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/test-reusable-ci.yml +25 -0
- package/skills-library/excalidraw-diagrams/CLAUDE.md +57 -0
- package/skills-library/excalidraw-diagrams/LICENSE +21 -0
- package/skills-library/excalidraw-diagrams/README.md +178 -0
- package/skills-library/excalidraw-diagrams/SKILL.md +715 -0
- package/skills-library/form-solutions/BUTTON_TYPE_FORM_SUBMISSION.md +336 -0
- package/skills-library/form-solutions/FILLABLE_PDF_IMPLEMENTATION.md +226 -0
- package/skills-library/form-solutions/SURVEYJS_QUESTIONNAIRE_SYSTEM.md +367 -0
- package/skills-library/form-solutions/tiptap-minimal-setup.md +690 -0
- package/skills-library/frontend/scholarly-classification-bubble-map.md +149 -0
- package/skills-library/infrastructure/ci-cd-pipeline-builder.md +517 -0
- package/skills-library/infrastructure/observability-designer.md +264 -0
- package/skills-library/infrastructure/performance-profiler.md +621 -0
- package/skills-library/installer-wizard-patterns.md +249 -0
- package/skills-library/integrations/CLAUDE_CODE_TOKEN_ANALYTICS.md +160 -0
- package/skills-library/integrations/CONFIGURABLE_AI_PROVIDER_SELECTION.md +728 -0
- package/skills-library/integrations/SOCKET_IO_BROADCAST_ALL_VS_ROOM.md +141 -0
- package/skills-library/integrations/VIRTUAL_MEETINGS_IMPLEMENTATION.md +374 -0
- package/skills-library/integrations/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
- package/skills-library/integrations/YOUTUBE_API_SETUP.md +141 -0
- package/skills-library/integrations/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
- package/skills-library/integrations/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
- package/skills-library/integrations/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
- package/skills-library/integrations/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
- package/skills-library/integrations/ai-ml/GEMINI_AI_RAG_PIPELINE_COMPLETE_GUIDE.md +195 -0
- package/skills-library/integrations/ai-ml/GEMINI_IMAGE_GENERATION_SETUP.md +64 -0
- package/skills-library/integrations/cloudflare/cloudflare-turnstile-debugging.md +202 -0
- package/skills-library/integrations/cloudflare/cloudflare-turnstile-implementation.md +476 -0
- package/skills-library/integrations/cloudflare-turnstile-debugging.md +202 -0
- package/skills-library/integrations/cloudflare-turnstile-implementation.md +476 -0
- package/skills-library/integrations/ghost-creator-monetization-pattern.md +454 -0
- package/skills-library/integrations/headless-cms-architecture.md +484 -0
- package/skills-library/integrations/headless-cms-stack-selection.md +183 -0
- package/skills-library/integrations/payload-cms-patterns.md +674 -0
- package/skills-library/integrations/realtimestt-openwakeword-cuda-windows.md +229 -0
- package/skills-library/integrations/rss-podcast-integration.md +300 -0
- package/skills-library/integrations/wordpress/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
- package/skills-library/integrations/youtube/YOUTUBE_API_SETUP.md +141 -0
- package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
- package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
- package/skills-library/integrations/youtube/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
- package/skills-library/integrations/youtube/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
- package/skills-library/marketing/campaign-analytics.md +97 -0
- package/skills-library/marketing/content-creator.md +105 -0
- package/skills-library/marketing/marketing-strategy-pmm.md +94 -0
- package/skills-library/marketing/social-media-analyzer.md +81 -0
- package/skills-library/methodology/ADVANCED_ORCHESTRATION_PATTERNS.md +401 -0
- package/skills-library/methodology/AGENT_SELF_IMPROVEMENT_LOOP.md +179 -0
- package/skills-library/methodology/BREATH_BASED_PARALLEL_EXECUTION.md +1 -1
- package/skills-library/methodology/CLEANSING_CYCLE.md +358 -0
- package/skills-library/methodology/CONFIDENCE_ANNOTATION_PATTERN.md +143 -0
- package/skills-library/methodology/CRITICAL_PATTERNS_DOCUMENTATION_COMPLETE.md +204 -0
- package/skills-library/methodology/DELIVERABLES_SUMMARY.md +341 -0
- package/skills-library/methodology/DIFFICULTY_AWARE_AGENT_ROUTING.md +252 -0
- package/skills-library/methodology/EVOLUTIONARY_SKILL_SYNTHESIS.md +219 -0
- package/skills-library/methodology/GLOMERULUS_DECISION_GATE.md +223 -0
- package/skills-library/methodology/HIBERNATION_SYSTEM.md +231 -0
- package/skills-library/methodology/INSTRUMENTATION_OVER_RESTRICTION.md +192 -0
- package/skills-library/methodology/MASTER_COMPLETION_SUMMARY.md +444 -0
- package/skills-library/methodology/MASTER_SESSION_COMPLETION.md +743 -0
- package/skills-library/methodology/MERN_QUICK_REFERENCE.md +358 -0
- package/skills-library/methodology/ORGAN_AGENT_MAPPING.md +177 -0
- package/skills-library/methodology/PARALLEL_WAVE_BASED_REFACTORING.md +440 -0
- package/skills-library/methodology/QUICK_REFERENCE.md +358 -0
- package/skills-library/methodology/SDFT_ONPOLICY_SELF_DISTILLATION.md +186 -0
- package/skills-library/methodology/SELF_QUESTIONING_TASK_GENERATION.md +270 -0
- package/skills-library/methodology/SESSION_COMPLETION_SUMMARY.md +304 -0
- package/skills-library/methodology/SESSION_SUMMARY.md +432 -0
- package/skills-library/methodology/WARRIOR_WORKFLOW_DEBUGGING_PROTOCOL.md +252 -0
- package/skills-library/methodology/tech-debt-tracker.md +570 -0
- package/skills-library/parallel-debug/SKILL.md +60 -0
- package/skills-library/patterns-standards/API_PATTERN_FIX_SUMMARY.md +236 -0
- package/skills-library/patterns-standards/BATCH_OPERATIONS_WITH_PROGRESS_MODAL.md +362 -0
- package/skills-library/patterns-standards/CRITICAL_CODING_PATTERNS.md +639 -0
- package/skills-library/patterns-standards/DARK_MODE_MODAL_VISIBILITY.md +258 -0
- package/skills-library/patterns-standards/ERROR_RESILIENCE_IMPLEMENTATION.md +375 -0
- package/skills-library/patterns-standards/ES_MODULE_IMPORT_HOISTING_DOTENV.md +298 -0
- package/skills-library/patterns-standards/NESTED_BACKDROP_FILTER_CSS_ARTIFACT_FIX.md +76 -0
- package/skills-library/patterns-standards/ORDERED_DETECTOR_PIPELINE_GRACEFUL_FALLBACK.md +333 -0
- package/skills-library/patterns-standards/PHASE_IMPORT_ERROR_DEBUGGING.md +271 -0
- package/skills-library/patterns-standards/PYNPUT_GLOBAL_HOTKEY_VK_MATCHING.md +252 -0
- package/skills-library/patterns-standards/REACT_USEEFFECT_CASCADE_RESET_FIX.md +132 -0
- package/skills-library/patterns-standards/SUBMENU_HOVER_DROPDOWN_PATTERN.md +225 -0
- package/skills-library/patterns-standards/TAILWIND_TEXT_VISIBILITY_OVERRIDE.md +322 -0
- package/skills-library/patterns-standards/THEME_AWARE_CSS_VARIABLES_PATTERN.md +209 -0
- package/skills-library/patterns-standards/THEME_USER_OBJECT_PROPERTY_NAMING.md +194 -0
- package/skills-library/patterns-standards/TOOLTIP_BLOCKING_CLICKS_FIX.md +267 -0
- package/skills-library/patterns-standards/claude-code-plugin-structure.md +235 -0
- package/skills-library/patterns-standards/react-i18next-setup.md +429 -0
- package/skills-library/patterns-standards/thesys-c1-generative-ui-integration.md +967 -0
- package/skills-library/plugin-development/CLAUDE_CODE_COMMAND_REGISTRATION_SILENT_FAILURE.md +315 -0
- package/skills-library/plugin-development/plugin-command-namespace-vs-global.md +390 -0
- package/skills-library/plugin-development/plugin-doc-auto-generation.md +172 -0
- package/skills-library/security/GITHUB_REPO_SECURITY_AUDIT.md +115 -0
- package/skills-library/security/admin-deletion-safety.md +396 -0
- package/skills-library/security/application-vuln-patterns.md +477 -0
- package/skills-library/security/env-secrets-manager.md +686 -0
- package/skills-library/security/secure-ai-application-templates.md +347 -0
- package/skills-library/security/sql-injection-prevention-postgresjs.md +151 -0
- package/skills-library/supabase-connection-pooler-fix.md +102 -0
- package/skills-library/system-context/POWERSHELL_BASH_INTEROP.md +82 -0
- package/skills-library/system-context/SERVICE_LIFECYCLE_MANAGEMENT.md +119 -0
- package/skills-library/system-context/SKILL.md +40 -0
- package/skills-library/system-context/WINDOWS_DEV_ENVIRONMENT.md +73 -0
- package/skills-library/testing/E2E_PLAYWRIGHT_PATTERNS.md +99 -0
- package/skills-library/testing/INTEGRATION_TEST_STRATEGY.md +82 -0
- package/skills-library/testing/RED_GREEN_BUGFIX_GATE.md +203 -0
- package/skills-library/testing/TEST_DATA_MANAGEMENT.md +69 -0
- package/skills-library/testing/VITEST_UNIT_TEST_PATTERNS.md +75 -0
- package/skills-library/testing/playwright-api-security-tests.md +202 -0
- package/skills-library/toolbox/SKILL.md +84 -0
- package/skills-library/toolbox/code-graph-and-web-scraping-mcps.md +237 -0
- package/skills-library/ui-ux-pro-max/ACCESSIBILITY_ESSENTIALS.md +115 -0
- package/skills-library/ui-ux-pro-max/DESIGN_SYSTEM_SCAFFOLDING.md +133 -0
- package/skills-library/ui-ux-pro-max/RESPONSIVE_LAYOUT_PATTERNS.md +119 -0
- package/skills-library/ui-ux-pro-max/SKILL.md +386 -0
- package/skills-library/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills-library/ui-ux-pro-max/data/colors.csv +97 -0
- package/skills-library/ui-ux-pro-max/data/icons.csv +101 -0
- package/skills-library/ui-ux-pro-max/data/landing.csv +31 -0
- package/skills-library/ui-ux-pro-max/data/products.csv +97 -0
- package/skills-library/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills-library/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills-library/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills-library/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills-library/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills-library/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills-library/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills-library/ui-ux-pro-max/data/styles.csv +68 -0
- package/skills-library/ui-ux-pro-max/data/typography.csv +58 -0
- package/skills-library/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills-library/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills-library/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/skills-library/wordpress-style-theme-components.md +1526 -0
- package/templates/ASSUMPTIONS.md +1 -1
- package/templates/DECISION_LOG.md +0 -1
- package/templates/phase-prompt.md +1 -1
- package/templates/phoenix-comparison.md +6 -6
- package/templates/skill-api-integration.md +106 -0
- package/templates/skill-architecture-pattern.md +92 -0
- package/templates/skill-debug-pattern.md +98 -0
- package/templates/skill-devops-recipe.md +107 -0
- package/templates/skill-general.md +65 -0
- package/templates/skill-ui-component.md +113 -0
- package/tools/uat-runner.py +179 -0
- package/version.json +7 -3
- package/workflows/handoff-session.md +2 -2
- package/workflows/new-project.md +2 -2
- package/workflows/plan-phase.md +1 -1
- package/.claude-plugin/plugin.json +0 -64
- package/skills-library/_general/methodology/LIVE_BREADCRUMB_PROTOCOL.md +0 -242
- package/skills-library/_general/methodology/llm-judge-memory-crud.md +0 -241
- package/skills-library/methodology/REFLEXION_MEMORY_PATTERN.md +0 -183
- package/skills-library/methodology/RESEARCH_BACKED_WORKFLOW_UPGRADE.md +0 -263
- package/skills-library/methodology/SABBATH_REST_PATTERN.md +0 -267
- package/skills-library/methodology/STONE_AND_SCAFFOLD.md +0 -220
- package/skills-library/specialists/api-architecture/api-designer.md +0 -49
- package/skills-library/specialists/api-architecture/graphql-architect.md +0 -49
- package/skills-library/specialists/api-architecture/mcp-developer.md +0 -51
- package/skills-library/specialists/api-architecture/microservices-architect.md +0 -50
- package/skills-library/specialists/api-architecture/websocket-engineer.md +0 -48
- package/skills-library/specialists/backend/django-expert.md +0 -52
- package/skills-library/specialists/backend/fastapi-expert.md +0 -52
- package/skills-library/specialists/backend/laravel-specialist.md +0 -52
- package/skills-library/specialists/backend/nestjs-expert.md +0 -51
- package/skills-library/specialists/backend/rails-expert.md +0 -53
- package/skills-library/specialists/backend/spring-boot-engineer.md +0 -56
- package/skills-library/specialists/data-ml/fine-tuning-expert.md +0 -48
- package/skills-library/specialists/data-ml/ml-pipeline.md +0 -47
- package/skills-library/specialists/data-ml/pandas-pro.md +0 -47
- package/skills-library/specialists/data-ml/rag-architect.md +0 -51
- package/skills-library/specialists/data-ml/spark-engineer.md +0 -47
- package/skills-library/specialists/frontend/angular-architect.md +0 -52
- package/skills-library/specialists/frontend/flutter-expert.md +0 -51
- package/skills-library/specialists/frontend/nextjs-developer.md +0 -54
- package/skills-library/specialists/frontend/react-native-expert.md +0 -50
- package/skills-library/specialists/frontend/vue-expert.md +0 -51
- package/skills-library/specialists/infrastructure/chaos-engineer.md +0 -74
- package/skills-library/specialists/infrastructure/cloud-architect.md +0 -70
- package/skills-library/specialists/infrastructure/database-optimizer.md +0 -64
- package/skills-library/specialists/infrastructure/devops-engineer.md +0 -70
- package/skills-library/specialists/infrastructure/kubernetes-specialist.md +0 -52
- package/skills-library/specialists/infrastructure/monitoring-expert.md +0 -70
- package/skills-library/specialists/infrastructure/sre-engineer.md +0 -70
- package/skills-library/specialists/infrastructure/terraform-engineer.md +0 -51
- package/skills-library/specialists/languages/cpp-pro.md +0 -74
- package/skills-library/specialists/languages/csharp-developer.md +0 -69
- package/skills-library/specialists/languages/dotnet-core-expert.md +0 -54
- package/skills-library/specialists/languages/golang-pro.md +0 -51
- package/skills-library/specialists/languages/java-architect.md +0 -49
- package/skills-library/specialists/languages/javascript-pro.md +0 -68
- package/skills-library/specialists/languages/kotlin-specialist.md +0 -68
- package/skills-library/specialists/languages/php-pro.md +0 -49
- package/skills-library/specialists/languages/python-pro.md +0 -52
- package/skills-library/specialists/languages/react-expert.md +0 -51
- package/skills-library/specialists/languages/rust-engineer.md +0 -50
- package/skills-library/specialists/languages/sql-pro.md +0 -56
- package/skills-library/specialists/languages/swift-expert.md +0 -69
- package/skills-library/specialists/languages/typescript-pro.md +0 -51
- package/skills-library/specialists/platform/atlassian-mcp.md +0 -52
- package/skills-library/specialists/platform/embedded-systems.md +0 -53
- package/skills-library/specialists/platform/game-developer.md +0 -53
- package/skills-library/specialists/platform/salesforce-developer.md +0 -53
- package/skills-library/specialists/platform/shopify-expert.md +0 -49
- package/skills-library/specialists/platform/wordpress-pro.md +0 -49
- package/skills-library/specialists/quality/code-documenter.md +0 -51
- package/skills-library/specialists/quality/code-reviewer.md +0 -67
- package/skills-library/specialists/quality/debugging-wizard.md +0 -51
- package/skills-library/specialists/quality/fullstack-guardian.md +0 -51
- package/skills-library/specialists/quality/legacy-modernizer.md +0 -50
- package/skills-library/specialists/quality/playwright-expert.md +0 -65
- package/skills-library/specialists/quality/spec-miner.md +0 -56
- package/skills-library/specialists/quality/test-master.md +0 -65
- package/skills-library/specialists/security/secure-code-guardian.md +0 -55
- package/skills-library/specialists/security/security-reviewer.md +0 -53
- package/skills-library/specialists/workflow/architecture-designer.md +0 -53
- package/skills-library/specialists/workflow/cli-developer.md +0 -70
- package/skills-library/specialists/workflow/feature-forge.md +0 -65
- package/skills-library/specialists/workflow/prompt-engineer.md +0 -54
- package/skills-library/specialists/workflow/the-fool.md +0 -62
- /package/skills-library/{performance → _general/performance}/cache-augmented-generation.md +0 -0
- /package/skills-library/{debugging → parallel-debug}/FAILURE_TAXONOMY_CLASSIFICATION.md +0 -0
- /package/skills-library/{debugging → parallel-debug}/THREE_AGENT_HYPOTHESIS_DEBUGGING.md +0 -0
|
@@ -0,0 +1,728 @@
|
|
|
1
|
+
# Configurable AI Provider Selection - Runtime-Switchable AI Providers
|
|
2
|
+
|
|
3
|
+
## The Problem
|
|
4
|
+
|
|
5
|
+
Modern applications use multiple AI providers (Claude, Gemini, GPT-4), each with different:
|
|
6
|
+
- **Capabilities:** Reasoning depth, speed, context windows
|
|
7
|
+
- **Costs:** $0.003/1K tokens (Gemini) vs $0.015/1K tokens (Claude)
|
|
8
|
+
- **Use cases:** Fast summaries (Gemini) vs deep analysis (Claude)
|
|
9
|
+
|
|
10
|
+
Hardcoding AI providers creates problems:
|
|
11
|
+
- ❌ **Vendor lock-in:** Code tightly coupled to one AI API
|
|
12
|
+
- ❌ **No cost optimization:** Can't switch to cheaper provider for simple tasks
|
|
13
|
+
- ❌ **Testing difficulty:** Can't compare provider outputs side-by-side
|
|
14
|
+
- ❌ **No user choice:** User can't pick speed vs quality tradeoff
|
|
15
|
+
- ❌ **Code changes required:** Every provider switch needs deployment
|
|
16
|
+
|
|
17
|
+
### Real Example
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
// BAD: Hardcoded to Claude
|
|
21
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
22
|
+
|
|
23
|
+
async function generateOutline(chapter: string) {
|
|
24
|
+
const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
|
|
25
|
+
const response = await anthropic.messages.create({...});
|
|
26
|
+
return response;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Want to use Gemini instead? Rewrite the function!
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Why It Was Hard
|
|
33
|
+
|
|
34
|
+
1. **API differences** - Each provider has unique SDKs, request/response formats
|
|
35
|
+
2. **Configuration management** - Per-user preferences need database storage
|
|
36
|
+
3. **Cache invalidation** - Switching providers should regenerate cached content
|
|
37
|
+
4. **Fallback strategies** - What if primary provider fails?
|
|
38
|
+
5. **Cost tracking** - Need to attribute costs to specific providers
|
|
39
|
+
|
|
40
|
+
### Impact
|
|
41
|
+
|
|
42
|
+
**Before:**
|
|
43
|
+
- AI provider: Hardcoded (Claude or Gemini, not both)
|
|
44
|
+
- Switching cost: 2-4 hours (code + test + deploy)
|
|
45
|
+
- User control: None
|
|
46
|
+
- Cost optimization: Impossible
|
|
47
|
+
|
|
48
|
+
**After:**
|
|
49
|
+
- AI providers: Multiple, user-selectable
|
|
50
|
+
- Switching cost: 0 seconds (dropdown in Settings)
|
|
51
|
+
- User control: Full (per-feature provider selection)
|
|
52
|
+
- Cost optimization: Use cheap provider for simple tasks
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## The Solution
|
|
57
|
+
|
|
58
|
+
### Architecture: Provider Abstraction Layer
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
User Request
|
|
62
|
+
↓
|
|
63
|
+
Database Config Lookup ← User's preferred provider
|
|
64
|
+
↓
|
|
65
|
+
Provider Router (if/else logic)
|
|
66
|
+
├─→ Claude Handler
|
|
67
|
+
├─→ Gemini Handler
|
|
68
|
+
└─→ GPT-4 Handler
|
|
69
|
+
↓
|
|
70
|
+
Unified Response Format
|
|
71
|
+
↓
|
|
72
|
+
Return to User
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Key insight:** Abstract provider selection to configuration, not code. Route requests at runtime based on user preference.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Implementation
|
|
80
|
+
|
|
81
|
+
### Step 1: Database Schema for Provider Config
|
|
82
|
+
|
|
83
|
+
```prisma
|
|
84
|
+
// schema.prisma
|
|
85
|
+
|
|
86
|
+
model AiConfiguration {
|
|
87
|
+
id String @id @default(cuid())
|
|
88
|
+
userId String @unique
|
|
89
|
+
|
|
90
|
+
// Provider selections per feature
|
|
91
|
+
chatProvider String @default("claude") // "claude" | "gemini"
|
|
92
|
+
chapterOutlineProvider String @default("gemini") // Chapter outlines
|
|
93
|
+
patternDiscoveryProvider String @default("claude") // Pattern analysis
|
|
94
|
+
|
|
95
|
+
createdAt DateTime @default(now())
|
|
96
|
+
updatedAt DateTime @updatedAt
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**Why per-feature?**
|
|
101
|
+
- Some features need deep reasoning (Claude)
|
|
102
|
+
- Others need speed (Gemini)
|
|
103
|
+
- User can optimize cost vs quality per use case
|
|
104
|
+
|
|
105
|
+
### Step 2: Provider Config Lookup Helper
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
// server/services/ai-provider-config.ts
|
|
109
|
+
|
|
110
|
+
import { PrismaClient } from '@prisma/client';
|
|
111
|
+
|
|
112
|
+
const prisma = new PrismaClient();
|
|
113
|
+
|
|
114
|
+
export async function getChapterOutlineProvider(
|
|
115
|
+
userId: string = 'default-user'
|
|
116
|
+
): Promise<'claude' | 'gemini'> {
|
|
117
|
+
try {
|
|
118
|
+
const config = await prisma.aiConfiguration.findUnique({
|
|
119
|
+
where: { userId },
|
|
120
|
+
select: { chapterOutlineProvider: true }
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
const provider = config?.chapterOutlineProvider?.toLowerCase();
|
|
124
|
+
return provider === 'claude' ? 'claude' : 'gemini'; // Default to gemini
|
|
125
|
+
} catch (error) {
|
|
126
|
+
console.error('[AI Config] Error fetching provider:', error);
|
|
127
|
+
return 'gemini'; // Fallback
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export async function getChatProvider(
|
|
132
|
+
userId: string = 'default-user'
|
|
133
|
+
): Promise<'claude' | 'gemini'> {
|
|
134
|
+
try {
|
|
135
|
+
const config = await prisma.aiConfiguration.findUnique({
|
|
136
|
+
where: { userId },
|
|
137
|
+
select: { chatProvider: true }
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
return config?.chatProvider?.toLowerCase() === 'gemini' ? 'gemini' : 'claude';
|
|
141
|
+
} catch (error) {
|
|
142
|
+
console.error('[AI Config] Error fetching chat provider:', error);
|
|
143
|
+
return 'claude'; // Default for chat
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Step 3: Provider Router with Unified Interface
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
// server/services/chapter-study.service.ts
|
|
152
|
+
|
|
153
|
+
import { GoogleGenerativeAI } from '@google/generative-ai';
|
|
154
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
155
|
+
import { getChapterOutlineProvider } from './ai-provider-config';
|
|
156
|
+
|
|
157
|
+
const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY || '');
|
|
158
|
+
const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
|
|
159
|
+
|
|
160
|
+
const GEMINI_MODEL = 'gemini-2.0-flash';
|
|
161
|
+
const CLAUDE_MODEL = 'claude-sonnet-4-5';
|
|
162
|
+
|
|
163
|
+
interface ChapterOutline {
|
|
164
|
+
bookName: string;
|
|
165
|
+
chapter: number;
|
|
166
|
+
title: string;
|
|
167
|
+
summary: string;
|
|
168
|
+
sections: Array<{
|
|
169
|
+
heading: string;
|
|
170
|
+
verseRange: string;
|
|
171
|
+
keyThemes: string[];
|
|
172
|
+
summary: string;
|
|
173
|
+
}>;
|
|
174
|
+
keyVerses: Array<{
|
|
175
|
+
reference: string;
|
|
176
|
+
significance: string;
|
|
177
|
+
}>;
|
|
178
|
+
theologicalThemes: string[];
|
|
179
|
+
connections: Array<{
|
|
180
|
+
reference: string;
|
|
181
|
+
connection: string;
|
|
182
|
+
}>;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export async function generateChapterOutline(
|
|
186
|
+
bookName: string,
|
|
187
|
+
chapter: number,
|
|
188
|
+
userId: string = 'default-user',
|
|
189
|
+
regenerate: boolean = false
|
|
190
|
+
): Promise<ChapterOutline> {
|
|
191
|
+
|
|
192
|
+
// STEP 1: Get user's preferred provider
|
|
193
|
+
const provider = await getChapterOutlineProvider(userId);
|
|
194
|
+
console.log(`[Chapter Study] Using provider: ${provider}`);
|
|
195
|
+
|
|
196
|
+
// STEP 2: Fetch chapter text
|
|
197
|
+
const chapterData = await getChapter(bookName, chapter, 'KJV');
|
|
198
|
+
const verses = chapterData.verses.map(v => `${v.verse}. ${v.text}`).join('\n');
|
|
199
|
+
|
|
200
|
+
// STEP 3: Route to appropriate provider
|
|
201
|
+
let outline: ChapterOutline;
|
|
202
|
+
|
|
203
|
+
if (provider === 'claude') {
|
|
204
|
+
outline = await generateWithClaude(bookName, chapter, verses);
|
|
205
|
+
} else {
|
|
206
|
+
outline = await generateWithGemini(bookName, chapter, verses);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// STEP 4: Cache the result
|
|
210
|
+
await prisma.cachedChapterOutline.upsert({
|
|
211
|
+
where: { bookName_chapter: { bookName, chapter } },
|
|
212
|
+
update: { outline, provider, updatedAt: new Date() },
|
|
213
|
+
create: { bookName, chapter, provider, outline }
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
return outline;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Provider-specific implementations
|
|
220
|
+
async function generateWithClaude(
|
|
221
|
+
bookName: string,
|
|
222
|
+
chapter: number,
|
|
223
|
+
verses: string
|
|
224
|
+
): Promise<ChapterOutline> {
|
|
225
|
+
console.log('[AI] Generating with Claude (deep reasoning)');
|
|
226
|
+
|
|
227
|
+
const prompt = buildPrompt(bookName, chapter, verses);
|
|
228
|
+
|
|
229
|
+
const response = await anthropic.messages.create({
|
|
230
|
+
model: CLAUDE_MODEL,
|
|
231
|
+
max_tokens: 4096,
|
|
232
|
+
temperature: 0.3,
|
|
233
|
+
messages: [{
|
|
234
|
+
role: 'user',
|
|
235
|
+
content: prompt
|
|
236
|
+
}]
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
const content = response.content[0].text;
|
|
240
|
+
return parseOutlineJSON(content);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
async function generateWithGemini(
|
|
244
|
+
bookName: string,
|
|
245
|
+
chapter: number,
|
|
246
|
+
verses: string
|
|
247
|
+
): Promise<ChapterOutline> {
|
|
248
|
+
console.log('[AI] Generating with Gemini (fast, cost-effective)');
|
|
249
|
+
|
|
250
|
+
const prompt = buildPrompt(bookName, chapter, verses);
|
|
251
|
+
|
|
252
|
+
const model = genAI.getGenerativeModel({ model: GEMINI_MODEL });
|
|
253
|
+
const result = await model.generateContent(prompt);
|
|
254
|
+
const content = result.response.text();
|
|
255
|
+
|
|
256
|
+
return parseOutlineJSON(content);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function buildPrompt(bookName: string, chapter: number, verses: string): string {
|
|
260
|
+
return `Generate a theological outline for ${bookName} chapter ${chapter}.
|
|
261
|
+
|
|
262
|
+
Text:
|
|
263
|
+
${verses}
|
|
264
|
+
|
|
265
|
+
Return a JSON object with the following structure:
|
|
266
|
+
{
|
|
267
|
+
"bookName": "${bookName}",
|
|
268
|
+
"chapter": ${chapter},
|
|
269
|
+
"title": "Chapter Title",
|
|
270
|
+
"summary": "2-3 sentence overview",
|
|
271
|
+
"sections": [
|
|
272
|
+
{
|
|
273
|
+
"heading": "Section heading",
|
|
274
|
+
"verseRange": "1-5",
|
|
275
|
+
"keyThemes": ["theme1", "theme2"],
|
|
276
|
+
"summary": "What happens in these verses"
|
|
277
|
+
}
|
|
278
|
+
],
|
|
279
|
+
"keyVerses": [
|
|
280
|
+
{
|
|
281
|
+
"reference": "${bookName} ${chapter}:3",
|
|
282
|
+
"significance": "Why this verse matters"
|
|
283
|
+
}
|
|
284
|
+
],
|
|
285
|
+
"theologicalThemes": ["Redemption", "Faith", "Covenant"],
|
|
286
|
+
"connections": [
|
|
287
|
+
{
|
|
288
|
+
"reference": "John 3:16",
|
|
289
|
+
"connection": "How it relates to this chapter"
|
|
290
|
+
}
|
|
291
|
+
]
|
|
292
|
+
}`;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
function parseOutlineJSON(content: string): ChapterOutline {
|
|
296
|
+
// Extract JSON from markdown code blocks if present
|
|
297
|
+
const jsonMatch = content.match(/```(?:json)?\s*(\{[\s\S]*?\})\s*```/);
|
|
298
|
+
const jsonStr = jsonMatch ? jsonMatch[1] : content;
|
|
299
|
+
|
|
300
|
+
return JSON.parse(jsonStr);
|
|
301
|
+
}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### Step 4: API Route with Provider Support
|
|
305
|
+
|
|
306
|
+
```typescript
|
|
307
|
+
// server/routes/chapter-study.ts
|
|
308
|
+
|
|
309
|
+
import express from 'express';
|
|
310
|
+
import { generateChapterOutline } from '../services/chapter-study.service';
|
|
311
|
+
|
|
312
|
+
const router = express.Router();
|
|
313
|
+
|
|
314
|
+
router.get('/api/chapters/:book/:chapter/outline', async (req, res) => {
|
|
315
|
+
const { book, chapter } = req.params;
|
|
316
|
+
const userId = req.query.userId as string || 'default-user';
|
|
317
|
+
const regenerate = req.query.regenerate === 'true';
|
|
318
|
+
|
|
319
|
+
try {
|
|
320
|
+
const outline = await generateChapterOutline(
|
|
321
|
+
book,
|
|
322
|
+
parseInt(chapter),
|
|
323
|
+
userId,
|
|
324
|
+
regenerate
|
|
325
|
+
);
|
|
326
|
+
|
|
327
|
+
res.json(outline);
|
|
328
|
+
} catch (error) {
|
|
329
|
+
console.error('[API] Chapter outline error:', error);
|
|
330
|
+
res.status(500).json({ error: 'Failed to generate outline' });
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
export default router;
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
### Step 5: Frontend Settings UI
|
|
338
|
+
|
|
339
|
+
```typescript
|
|
340
|
+
// frontend/src/pages/Settings.tsx
|
|
341
|
+
|
|
342
|
+
import React, { useState, useEffect } from 'react';
|
|
343
|
+
|
|
344
|
+
interface AiConfig {
|
|
345
|
+
chatProvider: 'claude' | 'gemini';
|
|
346
|
+
chapterOutlineProvider: 'claude' | 'gemini';
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
export function Settings() {
|
|
350
|
+
const [config, setConfig] = useState<AiConfig>({
|
|
351
|
+
chatProvider: 'claude',
|
|
352
|
+
chapterOutlineProvider: 'gemini'
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
useEffect(() => {
|
|
356
|
+
// Load current config
|
|
357
|
+
fetch('/api/ai-config/default-user')
|
|
358
|
+
.then(r => r.json())
|
|
359
|
+
.then(data => setConfig(data));
|
|
360
|
+
}, []);
|
|
361
|
+
|
|
362
|
+
const handleProviderChange = async (feature: keyof AiConfig, provider: 'claude' | 'gemini') => {
|
|
363
|
+
// Update state
|
|
364
|
+
setConfig(prev => ({ ...prev, [feature]: provider }));
|
|
365
|
+
|
|
366
|
+
// Save to backend
|
|
367
|
+
await fetch('/api/ai-config/default-user', {
|
|
368
|
+
method: 'PATCH',
|
|
369
|
+
headers: { 'Content-Type': 'application/json' },
|
|
370
|
+
body: JSON.stringify({ [feature]: provider })
|
|
371
|
+
});
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
return (
|
|
375
|
+
<div className="settings-page">
|
|
376
|
+
<h2>AI Configuration</h2>
|
|
377
|
+
|
|
378
|
+
<div className="setting-section">
|
|
379
|
+
<h3>Chat Provider</h3>
|
|
380
|
+
<select
|
|
381
|
+
value={config.chatProvider}
|
|
382
|
+
onChange={(e) => handleProviderChange('chatProvider', e.target.value as 'claude' | 'gemini')}
|
|
383
|
+
>
|
|
384
|
+
<option value="claude">Claude (Advanced reasoning, $0.015/1K tokens)</option>
|
|
385
|
+
<option value="gemini">Gemini (Fast & affordable, $0.003/1K tokens)</option>
|
|
386
|
+
</select>
|
|
387
|
+
</div>
|
|
388
|
+
|
|
389
|
+
<div className="setting-section">
|
|
390
|
+
<h3>Chapter Outline Generation</h3>
|
|
391
|
+
<select
|
|
392
|
+
value={config.chapterOutlineProvider}
|
|
393
|
+
onChange={(e) => handleProviderChange('chapterOutlineProvider', e.target.value as 'claude' | 'gemini')}
|
|
394
|
+
>
|
|
395
|
+
<option value="gemini">Gemini (Fast outlines, good for overview)</option>
|
|
396
|
+
<option value="claude">Claude (Deeper theological insight)</option>
|
|
397
|
+
</select>
|
|
398
|
+
<p className="help-text">
|
|
399
|
+
Gemini: Quick summaries, good structure<br/>
|
|
400
|
+
Claude: Rich theological connections, deeper analysis
|
|
401
|
+
</p>
|
|
402
|
+
</div>
|
|
403
|
+
</div>
|
|
404
|
+
);
|
|
405
|
+
}
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
---
|
|
409
|
+
|
|
410
|
+
## Advanced: Fallback Strategy
|
|
411
|
+
|
|
412
|
+
```typescript
|
|
413
|
+
async function generateWithFallback(
|
|
414
|
+
bookName: string,
|
|
415
|
+
chapter: number,
|
|
416
|
+
verses: string,
|
|
417
|
+
primaryProvider: 'claude' | 'gemini'
|
|
418
|
+
): Promise<ChapterOutline> {
|
|
419
|
+
|
|
420
|
+
try {
|
|
421
|
+
// Try primary provider
|
|
422
|
+
if (primaryProvider === 'claude') {
|
|
423
|
+
return await generateWithClaude(bookName, chapter, verses);
|
|
424
|
+
} else {
|
|
425
|
+
return await generateWithGemini(bookName, chapter, verses);
|
|
426
|
+
}
|
|
427
|
+
} catch (error) {
|
|
428
|
+
console.error(`[AI] ${primaryProvider} failed, falling back to alternative`, error);
|
|
429
|
+
|
|
430
|
+
// Fallback to alternative provider
|
|
431
|
+
if (primaryProvider === 'claude') {
|
|
432
|
+
return await generateWithGemini(bookName, chapter, verses);
|
|
433
|
+
} else {
|
|
434
|
+
return await generateWithClaude(bookName, chapter, verses);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## Testing the Solution
|
|
443
|
+
|
|
444
|
+
### Test 1: Provider Switching
|
|
445
|
+
|
|
446
|
+
```bash
|
|
447
|
+
# Set provider to Gemini
|
|
448
|
+
curl -X PATCH http://localhost:3005/api/ai-config/user-123 \
|
|
449
|
+
-H "Content-Type: application/json" \
|
|
450
|
+
-d '{"chapterOutlineProvider": "gemini"}'
|
|
451
|
+
|
|
452
|
+
# Generate outline (uses Gemini)
|
|
453
|
+
curl http://localhost:3005/api/chapters/John/3/outline?userId=user-123
|
|
454
|
+
|
|
455
|
+
# Server logs:
|
|
456
|
+
# [Chapter Study] Using provider: gemini
|
|
457
|
+
# [AI] Generating with Gemini (fast, cost-effective)
|
|
458
|
+
# Response time: 2.1s
|
|
459
|
+
|
|
460
|
+
# Switch to Claude
|
|
461
|
+
curl -X PATCH http://localhost:3005/api/ai-config/user-123 \
|
|
462
|
+
-H "Content-Type: application/json" \
|
|
463
|
+
-d '{"chapterOutlineProvider": "claude"}'
|
|
464
|
+
|
|
465
|
+
# Generate outline (uses Claude, regenerates because provider changed)
|
|
466
|
+
curl http://localhost:3005/api/chapters/John/3/outline?userId=user-123
|
|
467
|
+
|
|
468
|
+
# Server logs:
|
|
469
|
+
# [Chapter Study] Using provider: claude
|
|
470
|
+
# [Chapter Study] Provider changed (gemini → claude), regenerating
|
|
471
|
+
# [AI] Generating with Claude (deep reasoning)
|
|
472
|
+
# Response time: 3.8s
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
### Test 2: Cost Comparison
|
|
476
|
+
|
|
477
|
+
```javascript
|
|
478
|
+
// Track API costs
|
|
479
|
+
const stats = {
|
|
480
|
+
claude: { requests: 150, avgTokens: 2500, costPer1K: 0.015 },
|
|
481
|
+
gemini: { requests: 800, avgTokens: 1800, costPer1K: 0.003 }
|
|
482
|
+
};
|
|
483
|
+
|
|
484
|
+
const claudeCost = (stats.claude.requests * stats.claude.avgTokens / 1000) * stats.claude.costPer1K;
|
|
485
|
+
const geminiCost = (stats.gemini.requests * stats.gemini.avgTokens / 1000) * stats.gemini.costPer1K;
|
|
486
|
+
|
|
487
|
+
console.log(`Claude: $${claudeCost.toFixed(2)}`); // $5.63
|
|
488
|
+
console.log(`Gemini: $${geminiCost.toFixed(2)}`); // $4.32
|
|
489
|
+
console.log(`Total: $${(claudeCost + geminiCost).toFixed(2)}`); // $9.95
|
|
490
|
+
|
|
491
|
+
// If everything used Claude:
|
|
492
|
+
const allClaudeCost = ((stats.claude.requests + stats.gemini.requests) * 2000 / 1000) * 0.015;
|
|
493
|
+
console.log(`All Claude would cost: $${allClaudeCost.toFixed(2)}`); // $28.50
|
|
494
|
+
|
|
495
|
+
// Savings: $18.55 (65%)
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
### Test 3: Per-User Configuration
|
|
499
|
+
|
|
500
|
+
```typescript
|
|
501
|
+
// User A prefers speed
|
|
502
|
+
await updateAiConfig('user-A', {
|
|
503
|
+
chatProvider: 'gemini',
|
|
504
|
+
chapterOutlineProvider: 'gemini'
|
|
505
|
+
});
|
|
506
|
+
|
|
507
|
+
// User B wants quality
|
|
508
|
+
await updateAiConfig('user-B', {
|
|
509
|
+
chatProvider: 'claude',
|
|
510
|
+
chapterOutlineProvider: 'claude'
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
// Each user gets their preferred experience ✓
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
---
|
|
517
|
+
|
|
518
|
+
## Prevention & Best Practices
|
|
519
|
+
|
|
520
|
+
### 1. Unified Response Format
|
|
521
|
+
|
|
522
|
+
Ensure all providers return the same structure:
|
|
523
|
+
|
|
524
|
+
```typescript
|
|
525
|
+
interface StandardResponse {
|
|
526
|
+
content: string;
|
|
527
|
+
provider: string;
|
|
528
|
+
model: string;
|
|
529
|
+
tokensUsed: number;
|
|
530
|
+
}
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
### 2. Provider-Agnostic Prompts
|
|
534
|
+
|
|
535
|
+
Write prompts that work with any provider:
|
|
536
|
+
|
|
537
|
+
```typescript
|
|
538
|
+
// GOOD: Works with all providers
|
|
539
|
+
const prompt = "Generate a JSON outline for John 3 with sections, themes, and key verses.";
|
|
540
|
+
|
|
541
|
+
// BAD: Claude-specific prompt features
|
|
542
|
+
const prompt = "Use your constitutional AI training to..."; // Won't work with Gemini
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
### 3. Monitor Provider Health
|
|
546
|
+
|
|
547
|
+
```typescript
|
|
548
|
+
const providerStatus = {
|
|
549
|
+
claude: { available: true, avgLatency: 1.2, errorRate: 0.01 },
|
|
550
|
+
gemini: { available: true, avgLatency: 0.8, errorRate: 0.05 }
|
|
551
|
+
};
|
|
552
|
+
|
|
553
|
+
// Route to fastest available provider
|
|
554
|
+
const bestProvider = Object.entries(providerStatus)
|
|
555
|
+
.filter(([_, status]) => status.available)
|
|
556
|
+
.sort((a, b) => a[1].avgLatency - b[1].avgLatency)[0][0];
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
### 4. Cache Provider Preferences
|
|
560
|
+
|
|
561
|
+
```typescript
|
|
562
|
+
// Don't hit database for every request
|
|
563
|
+
const providerCache = new Map<string, 'claude' | 'gemini'>();
|
|
564
|
+
|
|
565
|
+
async function getCachedProvider(userId: string): Promise<'claude' | 'gemini'> {
|
|
566
|
+
if (!providerCache.has(userId)) {
|
|
567
|
+
const provider = await getChapterOutlineProvider(userId);
|
|
568
|
+
providerCache.set(userId, provider);
|
|
569
|
+
setTimeout(() => providerCache.delete(userId), 60000); // Cache for 1 minute
|
|
570
|
+
}
|
|
571
|
+
return providerCache.get(userId)!;
|
|
572
|
+
}
|
|
573
|
+
```
|
|
574
|
+
|
|
575
|
+
### 5. Log Provider Usage
|
|
576
|
+
|
|
577
|
+
```typescript
|
|
578
|
+
await prisma.aiUsageLog.create({
|
|
579
|
+
data: {
|
|
580
|
+
userId,
|
|
581
|
+
provider,
|
|
582
|
+
feature: 'chapter-outline',
|
|
583
|
+
tokensUsed: 2500,
|
|
584
|
+
cost: 0.0375,
|
|
585
|
+
latencyMs: 1800
|
|
586
|
+
}
|
|
587
|
+
});
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
---
|
|
591
|
+
|
|
592
|
+
## Common Mistakes to Avoid
|
|
593
|
+
|
|
594
|
+
### ❌ Mistake 1: Hardcoding provider in service layer
|
|
595
|
+
|
|
596
|
+
```typescript
|
|
597
|
+
// BAD: No way to switch providers
|
|
598
|
+
const response = await anthropic.messages.create({...});
|
|
599
|
+
```
|
|
600
|
+
|
|
601
|
+
**Fix:** Route based on config lookup.
|
|
602
|
+
|
|
603
|
+
### ❌ Mistake 2: Different response formats per provider
|
|
604
|
+
|
|
605
|
+
```typescript
|
|
606
|
+
// BAD: Claude returns {outline}, Gemini returns {summary}
|
|
607
|
+
if (provider === 'claude') {
|
|
608
|
+
return response.outline;
|
|
609
|
+
} else {
|
|
610
|
+
return { outline: response.summary }; // Inconsistent!
|
|
611
|
+
}
|
|
612
|
+
```
|
|
613
|
+
|
|
614
|
+
**Fix:** Normalize to unified format.
|
|
615
|
+
|
|
616
|
+
### ❌ Mistake 3: No fallback strategy
|
|
617
|
+
|
|
618
|
+
Provider fails → entire feature broken.
|
|
619
|
+
|
|
620
|
+
**Fix:** Implement try/catch with fallback provider.
|
|
621
|
+
|
|
622
|
+
### ❌ Mistake 4: Ignoring cache invalidation
|
|
623
|
+
|
|
624
|
+
User switches from Gemini to Claude, but still gets Gemini's cached response.
|
|
625
|
+
|
|
626
|
+
**Fix:** Check cached provider matches current preference.
|
|
627
|
+
|
|
628
|
+
### ❌ Mistake 5: Global provider setting
|
|
629
|
+
|
|
630
|
+
All users forced to use the same provider.
|
|
631
|
+
|
|
632
|
+
**Fix:** Per-user configuration in database.
|
|
633
|
+
|
|
634
|
+
---
|
|
635
|
+
|
|
636
|
+
## Real-World Results
|
|
637
|
+
|
|
638
|
+
### Ministry LLM Project (Feb 2026)
|
|
639
|
+
|
|
640
|
+
**Before provider abstraction:**
|
|
641
|
+
- AI provider: Hardcoded (Gemini only)
|
|
642
|
+
- Monthly cost: $42 (all Gemini)
|
|
643
|
+
- User control: None
|
|
644
|
+
|
|
645
|
+
**After provider abstraction:**
|
|
646
|
+
- AI providers: Claude + Gemini (user-selectable)
|
|
647
|
+
- Monthly cost: $31 (mixed usage, optimized)
|
|
648
|
+
- User satisfaction: Higher (choice of speed vs depth)
|
|
649
|
+
|
|
650
|
+
**Usage breakdown:**
|
|
651
|
+
- 65% users prefer Gemini for chapter outlines (speed)
|
|
652
|
+
- 35% users prefer Claude for chapter outlines (depth)
|
|
653
|
+
- 80% users prefer Claude for chat (reasoning)
|
|
654
|
+
- 20% users prefer Gemini for chat (cost)
|
|
655
|
+
|
|
656
|
+
**Cost savings: 26%** by letting users choose appropriate provider per use case.
|
|
657
|
+
|
|
658
|
+
---
|
|
659
|
+
|
|
660
|
+
## Related Patterns
|
|
661
|
+
|
|
662
|
+
- [Strategy Pattern](../patterns-standards/STRATEGY_PATTERN.md)
|
|
663
|
+
- [AI Response Database Caching](../database-solutions/AI_RESPONSE_DATABASE_CACHING.md)
|
|
664
|
+
- [Configuration-Driven Architecture](../patterns-standards/CONFIGURATION_DRIVEN_ARCHITECTURE.md)
|
|
665
|
+
- [Fallback Strategies](../patterns-standards/FALLBACK_STRATEGIES.md)
|
|
666
|
+
|
|
667
|
+
---
|
|
668
|
+
|
|
669
|
+
## Resources
|
|
670
|
+
|
|
671
|
+
- **Anthropic Claude API:** https://docs.anthropic.com/
|
|
672
|
+
- **Google Gemini API:** https://ai.google.dev/docs
|
|
673
|
+
- **OpenAI API:** https://platform.openai.com/docs/
|
|
674
|
+
- **Strategy Pattern:** https://refactoring.guru/design-patterns/strategy
|
|
675
|
+
|
|
676
|
+
---
|
|
677
|
+
|
|
678
|
+
## Time to Implement
|
|
679
|
+
|
|
680
|
+
**Initial setup:** 2-3 hours (database schema, provider router, settings UI)
|
|
681
|
+
**Adding new provider:** 30-60 minutes (implement provider-specific handler)
|
|
682
|
+
|
|
683
|
+
## Difficulty Level
|
|
684
|
+
|
|
685
|
+
⭐⭐⭐ (3/5) - Moderate
|
|
686
|
+
|
|
687
|
+
**Easy parts:**
|
|
688
|
+
- Database config schema
|
|
689
|
+
- Provider routing logic
|
|
690
|
+
- Settings UI dropdown
|
|
691
|
+
|
|
692
|
+
**Challenging parts:**
|
|
693
|
+
- Unified response format across providers
|
|
694
|
+
- Cache invalidation on provider change
|
|
695
|
+
- Fallback strategies
|
|
696
|
+
- Cost tracking and optimization
|
|
697
|
+
|
|
698
|
+
---
|
|
699
|
+
|
|
700
|
+
## Author Notes
|
|
701
|
+
|
|
702
|
+
This pattern saved 26% on AI costs while improving user satisfaction. The key insight: **not all tasks need the most powerful AI**.
|
|
703
|
+
|
|
704
|
+
**Use Gemini for:**
|
|
705
|
+
- Quick summaries
|
|
706
|
+
- Simple Q&A
|
|
707
|
+
- Bulk processing
|
|
708
|
+
- Cost-sensitive operations
|
|
709
|
+
|
|
710
|
+
**Use Claude for:**
|
|
711
|
+
- Deep theological analysis
|
|
712
|
+
- Complex reasoning
|
|
713
|
+
- Nuanced interpretation
|
|
714
|
+
- Quality-critical content
|
|
715
|
+
|
|
716
|
+
**When NOT to use this pattern:**
|
|
717
|
+
- Single AI provider sufficient
|
|
718
|
+
- No cost optimization needed
|
|
719
|
+
- All tasks require same capability level
|
|
720
|
+
|
|
721
|
+
---
|
|
722
|
+
|
|
723
|
+
**Commit implementing this pattern:**
|
|
724
|
+
- `7b4dbcd` - Configurable AI provider selection
|
|
725
|
+
|
|
726
|
+
**Project:** Ministry LLM - AI-Powered Bible Study Platform
|
|
727
|
+
**Date:** February 9, 2026
|
|
728
|
+
**Impact:** 26% cost reduction, user choice enabled
|