@crownpeak/dqm-react-component-dev-mcp 1.2.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/README.md +138 -0
- package/data/.env.example +22 -0
- package/data/.gitattributes +47 -0
- package/data/.glfrc.json +7 -0
- package/data/.husky/pre-commit +5 -0
- package/data/.nvmrc +1 -0
- package/data/CHANGELOG.md +75 -0
- package/data/CODE_OF_CONDUCT.md +129 -0
- package/data/CONTRIBUTING.md +203 -0
- package/data/DOCS-STRUCTURE.md +307 -0
- package/data/I18N.md +292 -0
- package/data/LICENSE +22 -0
- package/data/README.md +315 -0
- package/data/SECURITY.md +125 -0
- package/data/WIKI-DEPLOYMENT.md +348 -0
- package/data/docs/AI-FEATURES.md +610 -0
- package/data/docs/API-REFERENCE.md +1022 -0
- package/data/docs/AUTHENTICATION.md +301 -0
- package/data/docs/BACKEND-API.md +468 -0
- package/data/docs/DEVELOPMENT.md +375 -0
- package/data/docs/EXAMPLES.md +622 -0
- package/data/docs/MCP-SERVER.md +307 -0
- package/data/docs/MIGRATION-GUIDE.md +367 -0
- package/data/docs/NPM-PUBLISH.md +193 -0
- package/data/docs/QUICKSTART.md +206 -0
- package/data/docs/REDIS-SETUP.md +162 -0
- package/data/docs/SERVER.md +228 -0
- package/data/docs/TROUBLESHOOTING.md +657 -0
- package/data/docs/WIDGET-GUIDE.md +638 -0
- package/data/docs/WIKI-HOME.md +58 -0
- package/data/docs/WIKI-SIDEBAR.md +39 -0
- package/data/package.json +171 -0
- package/data/playwright.config.ts +64 -0
- package/data/probe/.cargo/config.toml +10 -0
- package/data/probe/.claude/commands/performance-review.md +15 -0
- package/data/probe/.clinerules +288 -0
- package/data/probe/.dockerignore +57 -0
- package/data/probe/.githooks/post-commit +11 -0
- package/data/probe/.githooks/pre-commit +99 -0
- package/data/probe/.githooks/pre-commit-vow +9 -0
- package/data/probe/.prompts/engineer.md +41 -0
- package/data/probe/.roomodes +28 -0
- package/data/probe/.windsurfrules +0 -0
- package/data/probe/BASH_TOOL_SUMMARY.md +148 -0
- package/data/probe/BENCHMARKING.md +256 -0
- package/data/probe/CLAUDE.md +226 -0
- package/data/probe/CODE_OF_CONDUCT.md +128 -0
- package/data/probe/CONTRIBUTING.md +193 -0
- package/data/probe/Cargo.toml +120 -0
- package/data/probe/Cross.toml +10 -0
- package/data/probe/DOCKER-README.md +224 -0
- package/data/probe/Dockerfile +32 -0
- package/data/probe/ENHANCED_DEBUG_TELEMETRY.md +188 -0
- package/data/probe/LICENSE +201 -0
- package/data/probe/Makefile +210 -0
- package/data/probe/README.md +824 -0
- package/data/probe/SECURITY.md +67 -0
- package/data/probe/WINDOWS-GUIDE.md +294 -0
- package/data/probe/benches/parsing_benchmarks.rs +370 -0
- package/data/probe/benches/search_benchmarks.rs +599 -0
- package/data/probe/benches/simd_benchmarks.rs +372 -0
- package/data/probe/benches/timing_benchmarks.rs +287 -0
- package/data/probe/build-windows.bat +229 -0
- package/data/probe/codex-config/config.toml +6 -0
- package/data/probe/docs/PERFORMANCE_OPTIMIZATION.md +161 -0
- package/data/probe/examples/cache_demo.rs +46 -0
- package/data/probe/examples/chat/.dockerignore +37 -0
- package/data/probe/examples/chat/ChatSessionManager.js +295 -0
- package/data/probe/examples/chat/Dockerfile +98 -0
- package/data/probe/examples/chat/LICENSE +201 -0
- package/data/probe/examples/chat/LOCAL_IMAGE_SUPPORT.md +195 -0
- package/data/probe/examples/chat/MCP_INTEGRATION.md +400 -0
- package/data/probe/examples/chat/README.md +338 -0
- package/data/probe/examples/chat/TRACING.md +226 -0
- package/data/probe/examples/chat/appTracer.js +968 -0
- package/data/probe/examples/chat/auth.js +76 -0
- package/data/probe/examples/chat/bin/probe-chat.js +13 -0
- package/data/probe/examples/chat/build.js +104 -0
- package/data/probe/examples/chat/cancelRequest.js +84 -0
- package/data/probe/examples/chat/demo-agentic-image-flow.js +88 -0
- package/data/probe/examples/chat/demo-local-images.js +128 -0
- package/data/probe/examples/chat/fileSpanExporter.js +181 -0
- package/data/probe/examples/chat/implement/README.md +228 -0
- package/data/probe/examples/chat/implement/backends/AiderBackend.js +750 -0
- package/data/probe/examples/chat/implement/backends/BaseBackend.js +276 -0
- package/data/probe/examples/chat/implement/backends/ClaudeCodeBackend.js +767 -0
- package/data/probe/examples/chat/implement/backends/MockBackend.js +237 -0
- package/data/probe/examples/chat/implement/backends/registry.js +85 -0
- package/data/probe/examples/chat/implement/core/BackendManager.js +567 -0
- package/data/probe/examples/chat/implement/core/ImplementTool.js +354 -0
- package/data/probe/examples/chat/implement/core/config.js +428 -0
- package/data/probe/examples/chat/implement/core/timeouts.js +58 -0
- package/data/probe/examples/chat/implement/core/utils.js +496 -0
- package/data/probe/examples/chat/implement/types/BackendTypes.js +126 -0
- package/data/probe/examples/chat/index.js +669 -0
- package/data/probe/examples/chat/mcpServer.js +341 -0
- package/data/probe/examples/chat/npm/LICENSE +15 -0
- package/data/probe/examples/chat/npm/README.md +168 -0
- package/data/probe/examples/chat/npm/bin/probe-chat.js +156 -0
- package/data/probe/examples/chat/npm/index.js +259 -0
- package/data/probe/examples/chat/npm/package.json +54 -0
- package/data/probe/examples/chat/package.json +102 -0
- package/data/probe/examples/chat/probeChat.js +456 -0
- package/data/probe/examples/chat/probeTool.js +491 -0
- package/data/probe/examples/chat/storage/JsonChatStorage.js +476 -0
- package/data/probe/examples/chat/telemetry.js +281 -0
- package/data/probe/examples/chat/test/integration/chatFlows.test.js +320 -0
- package/data/probe/examples/chat/test/integration/toolCalling.test.js +471 -0
- package/data/probe/examples/chat/test/mocks/mockLLMProvider.js +269 -0
- package/data/probe/examples/chat/test/test-backends.js +90 -0
- package/data/probe/examples/chat/test/testUtils.js +530 -0
- package/data/probe/examples/chat/test/unit/backendTimeout.test.js +161 -0
- package/data/probe/examples/chat/test/unit/packageFiles.test.js +120 -0
- package/data/probe/examples/chat/test/verify-tests.js +118 -0
- package/data/probe/examples/chat/test-agentic-image-loading.js +294 -0
- package/data/probe/examples/chat/test-ai-sdk-telemetry.js +204 -0
- package/data/probe/examples/chat/test-chat-tracing.js +38 -0
- package/data/probe/examples/chat/test-direct-function.js +49 -0
- package/data/probe/examples/chat/test-file-size-validation.js +103 -0
- package/data/probe/examples/chat/test-full-mcp-integration.js +258 -0
- package/data/probe/examples/chat/test-github-context.txt +12 -0
- package/data/probe/examples/chat/test-hierarchy.js +203 -0
- package/data/probe/examples/chat/test-image-spans.js +37 -0
- package/data/probe/examples/chat/test-local-image-reading.js +176 -0
- package/data/probe/examples/chat/test-mcp-integration.js +136 -0
- package/data/probe/examples/chat/test-mcp-probe-server.js +161 -0
- package/data/probe/examples/chat/test-mcp-with-ai.js +279 -0
- package/data/probe/examples/chat/test-multiple-allowed-dirs.js +111 -0
- package/data/probe/examples/chat/test-probe-mcp-server.js +110 -0
- package/data/probe/examples/chat/test-security-validation.js +145 -0
- package/data/probe/examples/chat/test-simple-tracing.js +32 -0
- package/data/probe/examples/chat/test-trace-verification.js +235 -0
- package/data/probe/examples/chat/test-tracing.js +114 -0
- package/data/probe/examples/chat/tokenCounter.js +419 -0
- package/data/probe/examples/chat/tokenUsageDisplay.js +134 -0
- package/data/probe/examples/chat/webServer.js +1103 -0
- package/data/probe/examples/reranker/Cargo.toml +33 -0
- package/data/probe/examples/reranker/DEBUG_OUTPUT_ANALYSIS.md +71 -0
- package/data/probe/examples/reranker/MODELS.md +66 -0
- package/data/probe/examples/reranker/MODEL_COMPARISON.md +60 -0
- package/data/probe/examples/reranker/MULTI_MODEL_ANALYSIS.md +176 -0
- package/data/probe/examples/reranker/PERFORMANCE_SUMMARY.md +156 -0
- package/data/probe/examples/reranker/README.md +347 -0
- package/data/probe/examples/reranker/RUST_BERT_COMPARISON.md +82 -0
- package/data/probe/examples/reranker/TOKENIZATION_GUIDE.md +120 -0
- package/data/probe/examples/reranker/check_rust_tokenizer.py +108 -0
- package/data/probe/examples/reranker/convert_to_torchscript.py +109 -0
- package/data/probe/examples/reranker/debug_scoring.py +189 -0
- package/data/probe/examples/reranker/debug_tokenization.py +154 -0
- package/data/probe/examples/reranker/download_models.sh +73 -0
- package/data/probe/examples/reranker/requirements.txt +13 -0
- package/data/probe/examples/reranker/run_comprehensive_benchmark.sh +83 -0
- package/data/probe/examples/reranker/rust_bert_test/Cargo.toml +12 -0
- package/data/probe/examples/reranker/rust_bert_test/README.md +54 -0
- package/data/probe/examples/reranker/simple_test.py +50 -0
- package/data/probe/examples/reranker/test_all_models.sh +63 -0
- package/data/probe/examples/reranker/test_bert_results.sh +44 -0
- package/data/probe/examples/reranker/test_cross_encoder.py +334 -0
- package/data/probe/examples/reranker/test_cross_encoder.sh +80 -0
- package/data/probe/examples/reranker/test_exact_comparison.py +151 -0
- package/data/probe/examples/reranker/test_parallel_performance.sh +56 -0
- package/data/probe/examples/reranker/test_scores.py +132 -0
- package/data/probe/install.ps1 +508 -0
- package/data/probe/install.sh +460 -0
- package/data/probe/npm/CLONE_METHOD_EXAMPLES.md +596 -0
- package/data/probe/npm/CONTEXT_COMPACTION.md +303 -0
- package/data/probe/npm/DELEGATE_TOOL_README.md +166 -0
- package/data/probe/npm/MAID_INTEGRATION.md +313 -0
- package/data/probe/npm/MCP_INTEGRATION_SUMMARY.md +241 -0
- package/data/probe/npm/README.md +824 -0
- package/data/probe/npm/bin/.gitignore +7 -0
- package/data/probe/npm/bin/.gitkeep +0 -0
- package/data/probe/npm/bin/README.md +12 -0
- package/data/probe/npm/bin/probe +167 -0
- package/data/probe/npm/docs/CLAUDE_CODE_INTEGRATION.md +414 -0
- package/data/probe/npm/docs/CODEX_INTEGRATION.md +502 -0
- package/data/probe/npm/docs/EDIT_CREATE_TOOLS.md +233 -0
- package/data/probe/npm/docs/RETRY_AND_FALLBACK.md +674 -0
- package/data/probe/npm/example-usage.js +335 -0
- package/data/probe/npm/examples/multi-engine-demo.js +117 -0
- package/data/probe/npm/examples/probe-agent-cli.js +113 -0
- package/data/probe/npm/examples/test-agent-edit.js +114 -0
- package/data/probe/npm/examples/test-edit-create.js +120 -0
- package/data/probe/npm/examples/test-edit-direct.js +114 -0
- package/data/probe/npm/index.d.ts +744 -0
- package/data/probe/npm/jest.config.js +52 -0
- package/data/probe/npm/package.json +117 -0
- package/data/probe/npm/scripts/build-agent.cjs +75 -0
- package/data/probe/npm/scripts/build-cjs.js +124 -0
- package/data/probe/npm/scripts/build-mcp.cjs +36 -0
- package/data/probe/npm/scripts/postinstall.js +216 -0
- package/data/probe/npm/test-codex-e2e.js +78 -0
- package/data/probe/npm/test-download-lock.js +109 -0
- package/data/probe/npm/test-grep-security.js +94 -0
- package/data/probe/npm/test-grep-simplified.js +63 -0
- package/data/probe/npm/test-grep.js +51 -0
- package/data/probe/npm/tests/README.md +96 -0
- package/data/probe/npm/tests/agent-compact-history.test.js +174 -0
- package/data/probe/npm/tests/allow-tests-default.test.js +151 -0
- package/data/probe/npm/tests/contextCompactor.test.js +498 -0
- package/data/probe/npm/tests/delegate-config.test.js +353 -0
- package/data/probe/npm/tests/delegate-integration.test.js +348 -0
- package/data/probe/npm/tests/extractor-integration.test.js +162 -0
- package/data/probe/npm/tests/extractor.test.js +317 -0
- package/data/probe/npm/tests/fixtures/sampleDiagrams.js +267 -0
- package/data/probe/npm/tests/integration/claude-code-auto-fallback.spec.js +148 -0
- package/data/probe/npm/tests/integration/claude-code-multi-step.spec.js +127 -0
- package/data/probe/npm/tests/integration/claude-code-tool-events.spec.js +163 -0
- package/data/probe/npm/tests/integration/codex-auto-fallback.spec.js +191 -0
- package/data/probe/npm/tests/integration/codex-tool-events.spec.js +147 -0
- package/data/probe/npm/tests/integration/examplesChatMcp.test.js +402 -0
- package/data/probe/npm/tests/integration/mcpDotenvSupport.test.js +174 -0
- package/data/probe/npm/tests/integration/mcpErrorHandling.test.js +566 -0
- package/data/probe/npm/tests/integration/mcpRobustness.test.js +564 -0
- package/data/probe/npm/tests/integration/mcpStdoutPurity.test.js +355 -0
- package/data/probe/npm/tests/integration/probeAgentMcp.test.js +398 -0
- package/data/probe/npm/tests/integration/retryFallback.test.js +368 -0
- package/data/probe/npm/tests/integration/schema-in-initial-message.test.js +318 -0
- package/data/probe/npm/tests/integration/schema-validation-loop-prevention.test.js +244 -0
- package/data/probe/npm/tests/integration/schemaRetryLogic.test.js +94 -0
- package/data/probe/npm/tests/integration/validationFlow.test.js +329 -0
- package/data/probe/npm/tests/manual/test-codex-basic.js +110 -0
- package/data/probe/npm/tests/mcp/mcpClientManager.test.js +614 -0
- package/data/probe/npm/tests/mcp/mcpConfig.test.js +359 -0
- package/data/probe/npm/tests/mcp/mcpXmlBridge.test.js +436 -0
- package/data/probe/npm/tests/mcp/mockMcpServer.js +510 -0
- package/data/probe/npm/tests/mcp-strict-syntax.test.js +319 -0
- package/data/probe/npm/tests/mermaidQuoteEscaping.test.js +214 -0
- package/data/probe/npm/tests/nestedQuoteFix.test.js +40 -0
- package/data/probe/npm/tests/setup.js +46 -0
- package/data/probe/npm/tests/unit/allowed-tools.test.js +513 -0
- package/data/probe/npm/tests/unit/attempt-completion-closing-tag-in-content.test.js +188 -0
- package/data/probe/npm/tests/unit/attemptCompletionJsonFix.test.js +238 -0
- package/data/probe/npm/tests/unit/attemptCompletionJsonIssue.test.js +128 -0
- package/data/probe/npm/tests/unit/backtickAutoFix.test.js +35 -0
- package/data/probe/npm/tests/unit/bash-probe-agent-integration.test.js +389 -0
- package/data/probe/npm/tests/unit/bash-simple-commands.test.js +324 -0
- package/data/probe/npm/tests/unit/bash-tool-comprehensive.test.js +371 -0
- package/data/probe/npm/tests/unit/bash-tool-integration.test.js +310 -0
- package/data/probe/npm/tests/unit/bash-tool.test.js +341 -0
- package/data/probe/npm/tests/unit/completion-prompt.test.js +379 -0
- package/data/probe/npm/tests/unit/cwd-path-options.test.js +287 -0
- package/data/probe/npm/tests/unit/delegate-limits.test.js +422 -0
- package/data/probe/npm/tests/unit/direct-content-attempt-completion.test.js +235 -0
- package/data/probe/npm/tests/unit/edit-create-tools.test.js +609 -0
- package/data/probe/npm/tests/unit/enhancedMermaidValidation.test.js +577 -0
- package/data/probe/npm/tests/unit/extract-content.test.js +83 -0
- package/data/probe/npm/tests/unit/extract-multiple-targets.test.js +89 -0
- package/data/probe/npm/tests/unit/fallbackManager.test.js +442 -0
- package/data/probe/npm/tests/unit/githubCompatibilityValidation.test.js +258 -0
- package/data/probe/npm/tests/unit/imageConfig.test.js +149 -0
- package/data/probe/npm/tests/unit/imagePathResolution.test.js +345 -0
- package/data/probe/npm/tests/unit/json-fixing-agent.test.js +238 -0
- package/data/probe/npm/tests/unit/json-validation-enhanced-errors.test.js +199 -0
- package/data/probe/npm/tests/unit/jsonValidationInfiniteLoopFix.test.js +228 -0
- package/data/probe/npm/tests/unit/maidIntegration.test.js +139 -0
- package/data/probe/npm/tests/unit/maxIterationsWarning.test.js +195 -0
- package/data/probe/npm/tests/unit/mermaidEdgeLabelFix.test.js +161 -0
- package/data/probe/npm/tests/unit/mermaidHtmlEntities.test.js +76 -0
- package/data/probe/npm/tests/unit/mermaidInfiniteLoopFix.test.js +64 -0
- package/data/probe/npm/tests/unit/mermaidValidation.test.js +723 -0
- package/data/probe/npm/tests/unit/mermaidValidationVisorExample.test.js +309 -0
- package/data/probe/npm/tests/unit/probe-agent-clone-realistic.test.js +643 -0
- package/data/probe/npm/tests/unit/probe-agent-clone.test.js +476 -0
- package/data/probe/npm/tests/unit/probe-agent-delegate.test.js +400 -0
- package/data/probe/npm/tests/unit/probe-agent-model-option.test.js +118 -0
- package/data/probe/npm/tests/unit/probeTool-security.test.js +283 -0
- package/data/probe/npm/tests/unit/readImageTool.test.js +418 -0
- package/data/probe/npm/tests/unit/retryManager.test.js +317 -0
- package/data/probe/npm/tests/unit/schema-aware-reminders.test.js +288 -0
- package/data/probe/npm/tests/unit/schemaDefinitionDetection.test.js +115 -0
- package/data/probe/npm/tests/unit/schemaUtils.test.js +1268 -0
- package/data/probe/npm/tests/unit/simpleTelemetry.test.js +282 -0
- package/data/probe/npm/tests/unit/simplified-attempt-completion.test.js +274 -0
- package/data/probe/npm/tests/unit/single-quote-json-bug.test.js +231 -0
- package/data/probe/npm/tests/unit/subgraphAutoFix.test.js +110 -0
- package/data/probe/npm/tests/unit/system-prompt.test.js +32 -0
- package/data/probe/npm/tests/unit/types-probe-agent-options.test.js +42 -0
- package/data/probe/npm/tests/unit/xmlParsing.test.js +720 -0
- package/data/probe/npm/tsconfig.json +21 -0
- package/data/probe/result1.txt +19 -0
- package/data/probe/result2.txt +26 -0
- package/data/probe/scripts/benchmark.sh +270 -0
- package/data/probe/scripts/cache_memory_analysis.rs +844 -0
- package/data/probe/scripts/claude-hook-wrapper.sh +56 -0
- package/data/probe/site/.env.example +10 -0
- package/data/probe/site/DEPLOYMENT.md +86 -0
- package/data/probe/site/README.md +183 -0
- package/data/probe/site/adding-languages.md +135 -0
- package/data/probe/site/ai-chat.md +427 -0
- package/data/probe/site/ai-integration.md +1488 -0
- package/data/probe/site/blog/agentic-flow-custom-xml-protocol.md +407 -0
- package/data/probe/site/blog/index.md +118 -0
- package/data/probe/site/blog/v0.6.0-release.md +426 -0
- package/data/probe/site/blog.md +8 -0
- package/data/probe/site/changelog.md +200 -0
- package/data/probe/site/cli-mode.md +437 -0
- package/data/probe/site/code-extraction.md +436 -0
- package/data/probe/site/contributing/README.md +9 -0
- package/data/probe/site/contributing/documentation-cross-references.md +215 -0
- package/data/probe/site/contributing/documentation-maintenance.md +275 -0
- package/data/probe/site/contributing/documentation-structure.md +75 -0
- package/data/probe/site/documentation-cross-references.md +215 -0
- package/data/probe/site/documentation-guide.md +132 -0
- package/data/probe/site/documentation-maintenance.md +275 -0
- package/data/probe/site/features.md +147 -0
- package/data/probe/site/how-it-works.md +118 -0
- package/data/probe/site/index.md +175 -0
- package/data/probe/site/index.md.bak +133 -0
- package/data/probe/site/installation.md +235 -0
- package/data/probe/site/integrations/docker.md +248 -0
- package/data/probe/site/integrations/github-actions.md +413 -0
- package/data/probe/site/language-support-overview.md +168 -0
- package/data/probe/site/mcp-integration.md +587 -0
- package/data/probe/site/mcp-server.md +304 -0
- package/data/probe/site/navigation-structure.md +76 -0
- package/data/probe/site/nodejs-sdk.md +798 -0
- package/data/probe/site/output-formats.md +625 -0
- package/data/probe/site/package.json +21 -0
- package/data/probe/site/public/_headers +28 -0
- package/data/probe/site/public/_redirects +11 -0
- package/data/probe/site/quick-start.md +289 -0
- package/data/probe/site/search-functionality.md +291 -0
- package/data/probe/site/search-reference.md +291 -0
- package/data/probe/site/supported-languages.md +215 -0
- package/data/probe/site/use-cases/README.md +8 -0
- package/data/probe/site/use-cases/advanced-cli.md +253 -0
- package/data/probe/site/use-cases/ai-code-editors.md +239 -0
- package/data/probe/site/use-cases/building-ai-tools.md +529 -0
- package/data/probe/site/use-cases/cli-ai-workflows.md +285 -0
- package/data/probe/site/use-cases/deploying-probe-web-interface.md +255 -0
- package/data/probe/site/use-cases/integrating-probe-into-ai-code-editors.md +161 -0
- package/data/probe/site/use-cases/nodejs-sdk.md +596 -0
- package/data/probe/site/use-cases/team-chat.md +350 -0
- package/data/probe/site/web-interface.md +434 -0
- package/data/probe/site/wrangler.toml +9 -0
- package/data/probe/test-api-key.sh +1 -0
- package/data/probe/test-probe-implementation/hello.js +7 -0
- package/data/probe/test_cases/demonstrate_early_termination_issues.sh +176 -0
- package/data/probe/test_cases/early_termination_issues.rs +533 -0
- package/data/probe/test_data/test_nested_struct.go +26 -0
- package/data/probe/tests/README.md +286 -0
- package/data/probe/tests/README_search_determinism_tests.md +116 -0
- package/data/probe/tests/adjacent_comment_test.rs +152 -0
- package/data/probe/tests/apostrophe_handling_tests.rs +132 -0
- package/data/probe/tests/block_filtering_with_ast_tests.rs +669 -0
- package/data/probe/tests/block_merging_tests.rs +396 -0
- package/data/probe/tests/c_outline_format_tests.rs +2179 -0
- package/data/probe/tests/cache_invalidation_issues.rs.disabled +682 -0
- package/data/probe/tests/cache_order_tests.rs +147 -0
- package/data/probe/tests/cache_query_scoping_tests.rs +221 -0
- package/data/probe/tests/cli_tests.rs +680 -0
- package/data/probe/tests/comment_context_integration_test.rs +240 -0
- package/data/probe/tests/common.rs +33 -0
- package/data/probe/tests/complex_block_merging_tests.rs +599 -0
- package/data/probe/tests/complex_query_block_filtering_tests.rs +422 -0
- package/data/probe/tests/control_flow_closing_braces_test.rs +91 -0
- package/data/probe/tests/cpp_outline_format_tests.rs +1507 -0
- package/data/probe/tests/csharp_outline_format_tests.rs +941 -0
- package/data/probe/tests/elastic_query_integration_tests.rs +922 -0
- package/data/probe/tests/extract_command_tests.rs +1848 -0
- package/data/probe/tests/extract_deduplication_tests.rs +146 -0
- package/data/probe/tests/extract_input_file_tests.rs +84 -0
- package/data/probe/tests/extract_prompt_tests.rs +102 -0
- package/data/probe/tests/filename_search_tests.rs +96 -0
- package/data/probe/tests/fixtures/user/AssemblyInfo.cs +3 -0
- package/data/probe/tests/github_extract_tests.rs +234 -0
- package/data/probe/tests/go_comment_test.rs +253 -0
- package/data/probe/tests/go_outline_format_tests.rs +2587 -0
- package/data/probe/tests/go_path_resolver_tests.rs +96 -0
- package/data/probe/tests/html_outline_format_tests.rs +637 -0
- package/data/probe/tests/integration_tests.rs +837 -0
- package/data/probe/tests/ip_whitelist_test.rs +148 -0
- package/data/probe/tests/java_outline_format_tests.rs +1611 -0
- package/data/probe/tests/javascript_extract_tests.rs +315 -0
- package/data/probe/tests/javascript_outline_format_tests.rs +1464 -0
- package/data/probe/tests/json_format_tests.rs +436 -0
- package/data/probe/tests/json_schema_validation_tests.rs +450 -0
- package/data/probe/tests/lib_usage.rs +60 -0
- package/data/probe/tests/line_comment_context_extension_test.rs +459 -0
- package/data/probe/tests/line_map_cache_tests.rs +114 -0
- package/data/probe/tests/markdown_integration_tests.rs +190 -0
- package/data/probe/tests/mocks/test_ip_whitelist.go +11 -0
- package/data/probe/tests/mocks/test_object.js +27 -0
- package/data/probe/tests/mocks/test_struct.go +50 -0
- package/data/probe/tests/multi_keyword_pattern_tests.rs +464 -0
- package/data/probe/tests/multi_language_syntax_integration_tests.rs +218 -0
- package/data/probe/tests/multiple_capture_groups_tests.rs +169 -0
- package/data/probe/tests/negative_compound_word_tests.rs +246 -0
- package/data/probe/tests/nested_symbol_extraction_tests.rs +99 -0
- package/data/probe/tests/outline_cross_file_interference_test.rs +335 -0
- package/data/probe/tests/outline_keyword_preservation_test.rs +67 -0
- package/data/probe/tests/output_format_edge_cases_tests.rs +693 -0
- package/data/probe/tests/parallel_extraction_tests.rs +178 -0
- package/data/probe/tests/parallel_search_tests.rs +355 -0
- package/data/probe/tests/path_resolver_tests.rs +698 -0
- package/data/probe/tests/php_outline_format_extended_tests.rs +928 -0
- package/data/probe/tests/php_outline_format_tests.rs +768 -0
- package/data/probe/tests/property_tests.proptest-regressions +9 -0
- package/data/probe/tests/property_tests.rs +118 -0
- package/data/probe/tests/python_outline_format_tests.rs +1538 -0
- package/data/probe/tests/query_command_json_tests.rs +438 -0
- package/data/probe/tests/query_command_tests.rs +232 -0
- package/data/probe/tests/query_command_xml_tests.rs +569 -0
- package/data/probe/tests/quoted_term_with_negative_keyword_tests.rs +216 -0
- package/data/probe/tests/required_terms_filename_tests.rs +116 -0
- package/data/probe/tests/ruby_outline_format_tests.rs +1011 -0
- package/data/probe/tests/rust_line_comment_context_test.rs +151 -0
- package/data/probe/tests/rust_outline_format_enhanced_tests.rs +725 -0
- package/data/probe/tests/rust_outline_format_tests.rs +843 -0
- package/data/probe/tests/schemas/xml_output_schema.xsd +38 -0
- package/data/probe/tests/search_determinism_tests.rs +451 -0
- package/data/probe/tests/search_hints_tests.rs +253 -0
- package/data/probe/tests/special_character_escaping_tests.rs +417 -0
- package/data/probe/tests/stemming_compound_word_filtering_tests.rs +535 -0
- package/data/probe/tests/strict_elastic_syntax_tests.rs +404 -0
- package/data/probe/tests/swift_outline_format_tests.rs +3319 -0
- package/data/probe/tests/symbols_tests.rs +166 -0
- package/data/probe/tests/test_file.rs +45 -0
- package/data/probe/tests/test_tokenize.rs +28 -0
- package/data/probe/tests/timeout_tests.rs +82 -0
- package/data/probe/tests/tokenization_tests.rs +195 -0
- package/data/probe/tests/tokenized_block_filtering_tests.rs +174 -0
- package/data/probe/tests/typescript_extract_tests.rs +214 -0
- package/data/probe/tests/typescript_outline_format_tests.rs +2188 -0
- package/data/probe/tests/xml_format_tests.rs +568 -0
- package/data/probe/tests/xml_schema_validation_tests.rs +497 -0
- package/data/scripts/postinstall.mjs +9 -0
- package/data/scripts/set-version.js +0 -0
- package/data/scripts/wiki-build.sh +111 -0
- package/data/scripts/wiki-deploy.sh +73 -0
- package/data/serve.json +12 -0
- package/data/test/demo-dynamic.html +134 -0
- package/data/test/demo-esm.html +105 -0
- package/data/test/demo-iife.html +78 -0
- package/data/tsconfig.json +7 -0
- package/data/vite.server.ts +483 -0
- package/data/vitest.config.ts +40 -0
- package/data/wiki/Home.md +58 -0
- package/data/wiki/_Sidebar.md +39 -0
- package/docs-mcp.config.json +20 -0
- package/package.json +56 -0
- package/src/config.js +111 -0
- package/src/index.js +395 -0
|
@@ -0,0 +1,674 @@
|
|
|
1
|
+
# Retry and Fallback System
|
|
2
|
+
|
|
3
|
+
The ProbeAgent SDK includes a comprehensive retry and fallback system to handle API failures gracefully, ensuring maximum reliability for your AI applications.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Exponential Backoff**: Automatic retry with increasing delays
|
|
8
|
+
- **Provider Fallback**: Seamlessly switch between AI providers
|
|
9
|
+
- **Model Fallback**: Try different models on the same provider
|
|
10
|
+
- **Cross-Provider Fallback**: Fall back from Anthropic → OpenAI → Google → Bedrock
|
|
11
|
+
- **Configurable Retry Logic**: Custom retry limits, delays, and error patterns
|
|
12
|
+
- **Detailed Statistics**: Track retry attempts, successful fallbacks, and failures
|
|
13
|
+
|
|
14
|
+
## Quick Start
|
|
15
|
+
|
|
16
|
+
### Basic Retry Configuration
|
|
17
|
+
|
|
18
|
+
```javascript
|
|
19
|
+
import { ProbeAgent } from '@probelabs/probe';
|
|
20
|
+
|
|
21
|
+
const agent = new ProbeAgent({
|
|
22
|
+
path: '/path/to/code',
|
|
23
|
+
provider: 'anthropic',
|
|
24
|
+
|
|
25
|
+
// Configure retry behavior
|
|
26
|
+
retry: {
|
|
27
|
+
maxRetries: 5, // Retry up to 5 times per provider
|
|
28
|
+
initialDelay: 1000, // Start with 1 second delay
|
|
29
|
+
maxDelay: 30000, // Cap delays at 30 seconds
|
|
30
|
+
backoffFactor: 2 // Double the delay each time
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// API calls will automatically retry on failures
|
|
35
|
+
const result = await agent.answer('Explain this code');
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Provider Fallback Configuration
|
|
39
|
+
|
|
40
|
+
```javascript
|
|
41
|
+
const agent = new ProbeAgent({
|
|
42
|
+
path: '/path/to/code',
|
|
43
|
+
|
|
44
|
+
// Configure fallback providers
|
|
45
|
+
fallback: {
|
|
46
|
+
strategy: 'custom',
|
|
47
|
+
providers: [
|
|
48
|
+
{
|
|
49
|
+
provider: 'anthropic',
|
|
50
|
+
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
51
|
+
baseURL: 'https://api.anthropic.com/v1',
|
|
52
|
+
model: 'claude-3-7-sonnet-20250219',
|
|
53
|
+
maxRetries: 5 // Retry 5 times on this provider
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
provider: 'bedrock',
|
|
57
|
+
region: 'us-west-2',
|
|
58
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
|
|
59
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
|
|
60
|
+
model: 'anthropic.claude-sonnet-4-20250514-v1:0',
|
|
61
|
+
maxRetries: 3
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
provider: 'openai',
|
|
65
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
66
|
+
model: 'gpt-4o',
|
|
67
|
+
maxRetries: 3
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
maxTotalAttempts: 15 // Maximum total attempts across all providers
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Configuration Options
|
|
76
|
+
|
|
77
|
+
### Retry Configuration
|
|
78
|
+
|
|
79
|
+
The `retry` object supports the following options:
|
|
80
|
+
|
|
81
|
+
| Option | Type | Default | Description |
|
|
82
|
+
|--------|------|---------|-------------|
|
|
83
|
+
| `maxRetries` | number | 3 | Maximum retry attempts per provider |
|
|
84
|
+
| `initialDelay` | number | 1000 | Initial delay in milliseconds |
|
|
85
|
+
| `maxDelay` | number | 30000 | Maximum delay in milliseconds |
|
|
86
|
+
| `backoffFactor` | number | 2 | Exponential backoff multiplier |
|
|
87
|
+
| `retryableErrors` | string[] | See below | List of retryable error patterns |
|
|
88
|
+
|
|
89
|
+
**Default Retryable Errors:**
|
|
90
|
+
- `Overloaded`, `overloaded`
|
|
91
|
+
- `rate_limit`, `rate limit`
|
|
92
|
+
- `429`, `500`, `502`, `503`, `504` (HTTP status codes)
|
|
93
|
+
- `timeout`, `ECONNRESET`, `ETIMEDOUT`, `ENOTFOUND`
|
|
94
|
+
- `api_error`
|
|
95
|
+
|
|
96
|
+
### Fallback Configuration
|
|
97
|
+
|
|
98
|
+
The `fallback` object supports the following options:
|
|
99
|
+
|
|
100
|
+
| Option | Type | Default | Description |
|
|
101
|
+
|--------|------|---------|-------------|
|
|
102
|
+
| `strategy` | string | 'any' | Fallback strategy (see below) |
|
|
103
|
+
| `providers` | array | [] | List of provider configurations |
|
|
104
|
+
| `models` | array | [] | List of models for same-provider fallback |
|
|
105
|
+
| `stopOnSuccess` | boolean | true | Stop on first successful response |
|
|
106
|
+
| `maxTotalAttempts` | number | 10 | Max attempts across all providers |
|
|
107
|
+
|
|
108
|
+
**Fallback Strategies:**
|
|
109
|
+
- `'same-model'`: Try the same model on different providers
|
|
110
|
+
- `'same-provider'`: Try different models on the same provider
|
|
111
|
+
- `'any'`: Try any available provider/model
|
|
112
|
+
- `'custom'`: Use custom provider list (recommended)
|
|
113
|
+
|
|
114
|
+
### Provider Configuration
|
|
115
|
+
|
|
116
|
+
Each provider in the `providers` array can have:
|
|
117
|
+
|
|
118
|
+
| Field | Type | Required | Description |
|
|
119
|
+
|-------|------|----------|-------------|
|
|
120
|
+
| `provider` | string | ✅ | Provider name: 'anthropic', 'openai', 'google', 'bedrock' |
|
|
121
|
+
| `model` | string | ❌ | Model name (uses provider default if omitted) |
|
|
122
|
+
| `apiKey` | string | ✅* | API key for the provider |
|
|
123
|
+
| `baseURL` | string | ❌ | Custom API endpoint |
|
|
124
|
+
| `maxRetries` | number | ❌ | Override global retry count for this provider |
|
|
125
|
+
| `region` | string | ❌** | AWS region (Bedrock only) |
|
|
126
|
+
| `accessKeyId` | string | ❌** | AWS access key ID (Bedrock only) |
|
|
127
|
+
| `secretAccessKey` | string | ❌** | AWS secret key (Bedrock only) |
|
|
128
|
+
| `sessionToken` | string | ❌ | AWS session token (Bedrock only) |
|
|
129
|
+
|
|
130
|
+
\* Required for all providers except Bedrock (which can use AWS credentials)
|
|
131
|
+
\*\* Required for Bedrock if not using `apiKey`
|
|
132
|
+
|
|
133
|
+
## Environment Variable Configuration
|
|
134
|
+
|
|
135
|
+
You can configure retry and fallback behavior via environment variables:
|
|
136
|
+
|
|
137
|
+
### Retry Environment Variables
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
# Retry configuration
|
|
141
|
+
MAX_RETRIES=5 # Max retries per provider
|
|
142
|
+
RETRY_INITIAL_DELAY=1000 # Initial delay in ms
|
|
143
|
+
RETRY_MAX_DELAY=30000 # Maximum delay in ms
|
|
144
|
+
RETRY_BACKOFF_FACTOR=2 # Exponential backoff multiplier
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Fallback Environment Variables
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
# Disable fallback
|
|
151
|
+
DISABLE_FALLBACK=1
|
|
152
|
+
|
|
153
|
+
# Auto-fallback (automatically use all available providers)
|
|
154
|
+
AUTO_FALLBACK=1
|
|
155
|
+
|
|
156
|
+
# Custom fallback providers (JSON array)
|
|
157
|
+
FALLBACK_PROVIDERS='[
|
|
158
|
+
{
|
|
159
|
+
"provider": "anthropic",
|
|
160
|
+
"apiKey": "sk-ant-xxx",
|
|
161
|
+
"model": "claude-3-7-sonnet-20250219"
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"provider": "bedrock",
|
|
165
|
+
"region": "us-west-2",
|
|
166
|
+
"accessKeyId": "xxx",
|
|
167
|
+
"secretAccessKey": "xxx",
|
|
168
|
+
"model": "anthropic.claude-sonnet-4-20250514-v1:0"
|
|
169
|
+
}
|
|
170
|
+
]'
|
|
171
|
+
|
|
172
|
+
# Fallback models (JSON array, for same-provider fallback)
|
|
173
|
+
FALLBACK_MODELS='["claude-3-7-sonnet-20250219", "claude-3-5-sonnet-20241022"]'
|
|
174
|
+
|
|
175
|
+
# Max total attempts across all providers
|
|
176
|
+
FALLBACK_MAX_TOTAL_ATTEMPTS=15
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Usage Examples
|
|
180
|
+
|
|
181
|
+
### Example 1: Azure Claude → Bedrock Claude Fallback
|
|
182
|
+
|
|
183
|
+
Perfect for when you want to use the same model across different cloud providers:
|
|
184
|
+
|
|
185
|
+
```javascript
|
|
186
|
+
const agent = new ProbeAgent({
|
|
187
|
+
path: '/path/to/code',
|
|
188
|
+
fallback: {
|
|
189
|
+
strategy: 'custom',
|
|
190
|
+
providers: [
|
|
191
|
+
{
|
|
192
|
+
provider: 'anthropic',
|
|
193
|
+
apiKey: process.env.AZURE_CLAUDE_API_KEY,
|
|
194
|
+
baseURL: 'https://your-azure-endpoint.com/v1',
|
|
195
|
+
model: 'claude-3-7-sonnet-20250219'
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
provider: 'bedrock',
|
|
199
|
+
region: 'us-west-2',
|
|
200
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
|
|
201
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
|
|
202
|
+
model: 'anthropic.claude-sonnet-4-20250514-v1:0'
|
|
203
|
+
}
|
|
204
|
+
]
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Example 2: Model Degradation (Claude 3.7 → Claude 3.5 → GPT-4)
|
|
210
|
+
|
|
211
|
+
Gracefully degrade to less powerful models if the primary is unavailable:
|
|
212
|
+
|
|
213
|
+
```javascript
|
|
214
|
+
const agent = new ProbeAgent({
|
|
215
|
+
path: '/path/to/code',
|
|
216
|
+
fallback: {
|
|
217
|
+
strategy: 'custom',
|
|
218
|
+
providers: [
|
|
219
|
+
{
|
|
220
|
+
provider: 'anthropic',
|
|
221
|
+
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
222
|
+
model: 'claude-3-7-sonnet-20250219'
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
provider: 'anthropic',
|
|
226
|
+
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
227
|
+
model: 'claude-3-5-sonnet-20241022'
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
provider: 'openai',
|
|
231
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
232
|
+
model: 'gpt-4o'
|
|
233
|
+
}
|
|
234
|
+
]
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Example 3: Auto-Fallback
|
|
240
|
+
|
|
241
|
+
Automatically use all available providers from environment variables:
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
# Set all your API keys
|
|
245
|
+
export ANTHROPIC_API_KEY=sk-ant-xxx
|
|
246
|
+
export OPENAI_API_KEY=sk-xxx
|
|
247
|
+
export GOOGLE_API_KEY=xxx
|
|
248
|
+
export AUTO_FALLBACK=1
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
```javascript
|
|
252
|
+
const agent = new ProbeAgent({
|
|
253
|
+
path: '/path/to/code',
|
|
254
|
+
provider: 'anthropic', // Primary provider
|
|
255
|
+
fallback: {
|
|
256
|
+
auto: true // Automatically fallback to other providers
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Example 4: Custom Retryable Errors
|
|
262
|
+
|
|
263
|
+
Only retry on specific error types:
|
|
264
|
+
|
|
265
|
+
```javascript
|
|
266
|
+
const agent = new ProbeAgent({
|
|
267
|
+
path: '/path/to/code',
|
|
268
|
+
retry: {
|
|
269
|
+
maxRetries: 5,
|
|
270
|
+
retryableErrors: [
|
|
271
|
+
'Overloaded',
|
|
272
|
+
'rate_limit',
|
|
273
|
+
'429',
|
|
274
|
+
'503',
|
|
275
|
+
'CustomError' // Your custom error pattern
|
|
276
|
+
]
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### Example 5: Different Retry Limits Per Provider
|
|
282
|
+
|
|
283
|
+
Configure different retry strategies for different providers:
|
|
284
|
+
|
|
285
|
+
```javascript
|
|
286
|
+
const agent = new ProbeAgent({
|
|
287
|
+
path: '/path/to/code',
|
|
288
|
+
retry: {
|
|
289
|
+
maxRetries: 3 // Global default
|
|
290
|
+
},
|
|
291
|
+
fallback: {
|
|
292
|
+
strategy: 'custom',
|
|
293
|
+
providers: [
|
|
294
|
+
{
|
|
295
|
+
provider: 'anthropic',
|
|
296
|
+
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
297
|
+
maxRetries: 10 // Retry Anthropic more aggressively
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
provider: 'openai',
|
|
301
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
302
|
+
maxRetries: 2 // Retry OpenAI less
|
|
303
|
+
}
|
|
304
|
+
]
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
## How It Works
|
|
310
|
+
|
|
311
|
+
### Retry Flow
|
|
312
|
+
|
|
313
|
+
When an API call fails:
|
|
314
|
+
|
|
315
|
+
```
|
|
316
|
+
1. Check if error is retryable (matches error patterns)
|
|
317
|
+
2. If not retryable → fail immediately
|
|
318
|
+
3. If retryable:
|
|
319
|
+
a. Wait initialDelay milliseconds
|
|
320
|
+
b. Retry the request
|
|
321
|
+
c. If fails again, increase delay by backoffFactor
|
|
322
|
+
d. Repeat until maxRetries exhausted
|
|
323
|
+
4. If all retries fail → proceed to fallback (if configured)
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### Fallback Flow
|
|
327
|
+
|
|
328
|
+
When a provider exhausts all retries:
|
|
329
|
+
|
|
330
|
+
```
|
|
331
|
+
1. Mark current provider as failed
|
|
332
|
+
2. Move to next provider in the list
|
|
333
|
+
3. Apply retry logic to the new provider
|
|
334
|
+
4. Repeat until:
|
|
335
|
+
- A provider succeeds → return result
|
|
336
|
+
- maxTotalAttempts reached → fail
|
|
337
|
+
- All providers exhausted → fail
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### Complete Flow Example
|
|
341
|
+
|
|
342
|
+
```
|
|
343
|
+
Primary: Anthropic Claude 3.7 (Azure)
|
|
344
|
+
├─ Attempt 1: ❌ Overloaded (wait 1s)
|
|
345
|
+
├─ Attempt 2: ❌ Overloaded (wait 2s)
|
|
346
|
+
├─ Attempt 3: ❌ Overloaded (wait 4s)
|
|
347
|
+
└─ Exhausted → Fallback
|
|
348
|
+
|
|
349
|
+
Fallback 1: Bedrock Claude Sonnet 4
|
|
350
|
+
├─ Attempt 1: ❌ 503 Service Unavailable (wait 1s)
|
|
351
|
+
├─ Attempt 2: ❌ 503 (wait 2s)
|
|
352
|
+
└─ Exhausted → Fallback
|
|
353
|
+
|
|
354
|
+
Fallback 2: OpenAI GPT-4
|
|
355
|
+
├─ Attempt 1: ✅ Success!
|
|
356
|
+
└─ Return result
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
## Monitoring and Statistics
|
|
360
|
+
|
|
361
|
+
### Getting Statistics
|
|
362
|
+
|
|
363
|
+
Both `RetryManager` and `FallbackManager` track detailed statistics:
|
|
364
|
+
|
|
365
|
+
```javascript
|
|
366
|
+
const agent = new ProbeAgent({
|
|
367
|
+
// ... configuration
|
|
368
|
+
debug: true // Enable debug logging
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
// Make a request
|
|
372
|
+
await agent.answer('Explain this code');
|
|
373
|
+
|
|
374
|
+
// Access internal managers (if needed for debugging)
|
|
375
|
+
if (agent.retryManager) {
|
|
376
|
+
const retryStats = agent.retryManager.getStats();
|
|
377
|
+
console.log('Retry Stats:', retryStats);
|
|
378
|
+
// {
|
|
379
|
+
// totalAttempts: 7,
|
|
380
|
+
// totalRetries: 4,
|
|
381
|
+
// successfulRetries: 1,
|
|
382
|
+
// failedRetries: 0
|
|
383
|
+
// }
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
if (agent.fallbackManager) {
|
|
387
|
+
const fallbackStats = agent.fallbackManager.getStats();
|
|
388
|
+
console.log('Fallback Stats:', fallbackStats);
|
|
389
|
+
// {
|
|
390
|
+
// totalAttempts: 3,
|
|
391
|
+
// providerAttempts: {
|
|
392
|
+
// 'anthropic/claude-3-7-sonnet-20250219': 1,
|
|
393
|
+
// 'bedrock/anthropic.claude-sonnet-4-20250514-v1:0': 1,
|
|
394
|
+
// 'openai/gpt-4o': 1
|
|
395
|
+
// },
|
|
396
|
+
// successfulProvider: 'openai/gpt-4o',
|
|
397
|
+
// failedProviders: [
|
|
398
|
+
// { provider: 'anthropic/...', error: {...} },
|
|
399
|
+
// { provider: 'bedrock/...', error: {...} }
|
|
400
|
+
// ]
|
|
401
|
+
// }
|
|
402
|
+
}
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### Debug Logging
|
|
406
|
+
|
|
407
|
+
Enable debug mode to see detailed logs:
|
|
408
|
+
|
|
409
|
+
```javascript
|
|
410
|
+
const agent = new ProbeAgent({
|
|
411
|
+
debug: true,
|
|
412
|
+
retry: { maxRetries: 3 },
|
|
413
|
+
fallback: { /* ... */ }
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
// Logs will show:
|
|
417
|
+
// [RetryManager] Retry attempt 1/3 { provider: 'anthropic', model: 'claude-3-7-...' }
|
|
418
|
+
// [RetryManager] Waiting 1000ms before retry...
|
|
419
|
+
// [FallbackManager] Attempting provider: anthropic/claude-3-7-... (attempt 1/10)
|
|
420
|
+
// [FallbackManager] ❌ Failed with provider: anthropic/claude-3-7-...
|
|
421
|
+
// [FallbackManager] Trying next provider (2 remaining)...
|
|
422
|
+
// [FallbackManager] ✅ Success with provider: openai/gpt-4o
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
## Best Practices
|
|
426
|
+
|
|
427
|
+
### 1. Start Conservative, Scale Up
|
|
428
|
+
|
|
429
|
+
```javascript
|
|
430
|
+
// Development: Low retries, quick failures
|
|
431
|
+
const devAgent = new ProbeAgent({
|
|
432
|
+
retry: { maxRetries: 1 },
|
|
433
|
+
fallback: false
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
// Production: Aggressive retries, full fallback
|
|
437
|
+
const prodAgent = new ProbeAgent({
|
|
438
|
+
retry: { maxRetries: 5 },
|
|
439
|
+
fallback: {
|
|
440
|
+
strategy: 'custom',
|
|
441
|
+
providers: [/* multiple providers */],
|
|
442
|
+
maxTotalAttempts: 20
|
|
443
|
+
}
|
|
444
|
+
});
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
### 2. Use Provider-Specific Retry Limits
|
|
448
|
+
|
|
449
|
+
```javascript
|
|
450
|
+
{
|
|
451
|
+
providers: [
|
|
452
|
+
{
|
|
453
|
+
provider: 'anthropic',
|
|
454
|
+
maxRetries: 10 // More retries for primary
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
provider: 'openai',
|
|
458
|
+
maxRetries: 3 // Fewer for fallback
|
|
459
|
+
}
|
|
460
|
+
]
|
|
461
|
+
}
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
### 3. Configure Delays Based on Your Use Case
|
|
465
|
+
|
|
466
|
+
```javascript
|
|
467
|
+
// User-facing: Shorter delays for faster response
|
|
468
|
+
{
|
|
469
|
+
retry: {
|
|
470
|
+
initialDelay: 500, // 0.5s
|
|
471
|
+
maxDelay: 5000 // 5s
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
// Background processing: Longer delays, more retries
|
|
476
|
+
{
|
|
477
|
+
retry: {
|
|
478
|
+
initialDelay: 2000, // 2s
|
|
479
|
+
maxDelay: 60000, // 60s
|
|
480
|
+
maxRetries: 10
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
### 4. Monitor Failures
|
|
486
|
+
|
|
487
|
+
```javascript
|
|
488
|
+
const agent = new ProbeAgent({
|
|
489
|
+
retry: { maxRetries: 5 },
|
|
490
|
+
fallback: { /* ... */ }
|
|
491
|
+
});
|
|
492
|
+
|
|
493
|
+
try {
|
|
494
|
+
const result = await agent.answer('Question');
|
|
495
|
+
} catch (error) {
|
|
496
|
+
if (error.allProvidersFailed) {
|
|
497
|
+
// Log to monitoring service
|
|
498
|
+
console.error('All providers failed:', error.stats);
|
|
499
|
+
// Send alert
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
### 5. Use Environment Variables for Secrets
|
|
505
|
+
|
|
506
|
+
```javascript
|
|
507
|
+
// Good: Use environment variables
|
|
508
|
+
{
|
|
509
|
+
provider: 'anthropic',
|
|
510
|
+
apiKey: process.env.ANTHROPIC_API_KEY
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
// Bad: Hardcode API keys
|
|
514
|
+
{
|
|
515
|
+
provider: 'anthropic',
|
|
516
|
+
apiKey: 'sk-ant-hardcoded-key' // Don't do this!
|
|
517
|
+
}
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
## Troubleshooting
|
|
521
|
+
|
|
522
|
+
### Issue: Retries Not Working
|
|
523
|
+
|
|
524
|
+
**Symptoms:** API calls fail immediately without retrying
|
|
525
|
+
|
|
526
|
+
**Solutions:**
|
|
527
|
+
1. Check if error is in retryable error list
|
|
528
|
+
2. Verify `maxRetries` is set > 0
|
|
529
|
+
3. Enable debug logging to see retry attempts
|
|
530
|
+
4. Check if fallback is disabled unintentionally
|
|
531
|
+
|
|
532
|
+
```javascript
|
|
533
|
+
// Debug retryable errors
|
|
534
|
+
import { isRetryableError } from '@probelabs/probe/agent/RetryManager.js';
|
|
535
|
+
console.log(isRetryableError(yourError));
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
### Issue: Fallback Not Triggering
|
|
539
|
+
|
|
540
|
+
**Symptoms:** Falls back to same provider or doesn't fallback at all
|
|
541
|
+
|
|
542
|
+
**Solutions:**
|
|
543
|
+
1. Ensure fallback providers are properly configured
|
|
544
|
+
2. Check API keys are valid
|
|
545
|
+
3. Verify provider names are correct ('anthropic', 'openai', 'google', 'bedrock')
|
|
546
|
+
4. Enable debug logging
|
|
547
|
+
|
|
548
|
+
### Issue: Too Many Retries
|
|
549
|
+
|
|
550
|
+
**Symptoms:** Requests take too long to fail
|
|
551
|
+
|
|
552
|
+
**Solutions:**
|
|
553
|
+
1. Reduce `maxRetries`
|
|
554
|
+
2. Reduce `maxTotalAttempts`
|
|
555
|
+
3. Shorten `maxDelay`
|
|
556
|
+
4. Remove problematic providers from fallback list
|
|
557
|
+
|
|
558
|
+
### Issue: Rate Limits Still Occurring
|
|
559
|
+
|
|
560
|
+
**Symptoms:** Getting rate limited despite retries
|
|
561
|
+
|
|
562
|
+
**Solutions:**
|
|
563
|
+
1. Increase `initialDelay` and `maxDelay`
|
|
564
|
+
2. Increase `backoffFactor` (3 or 4 instead of 2)
|
|
565
|
+
3. Add '429' and 'rate_limit' to `retryableErrors`
|
|
566
|
+
4. Consider implementing request queuing
|
|
567
|
+
|
|
568
|
+
## API Reference
|
|
569
|
+
|
|
570
|
+
### RetryManager
|
|
571
|
+
|
|
572
|
+
```javascript
|
|
573
|
+
import { RetryManager } from '@probelabs/probe/agent/RetryManager.js';
|
|
574
|
+
|
|
575
|
+
const retry = new RetryManager({
|
|
576
|
+
maxRetries: 3,
|
|
577
|
+
initialDelay: 1000,
|
|
578
|
+
maxDelay: 30000,
|
|
579
|
+
backoffFactor: 2,
|
|
580
|
+
retryableErrors: ['Overloaded', '429'],
|
|
581
|
+
debug: false
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
// Execute with retry
|
|
585
|
+
const result = await retry.executeWithRetry(
|
|
586
|
+
async () => {
|
|
587
|
+
return await someAsyncFunction();
|
|
588
|
+
},
|
|
589
|
+
{ provider: 'anthropic', model: 'claude-3' }
|
|
590
|
+
);
|
|
591
|
+
|
|
592
|
+
// Get statistics
|
|
593
|
+
const stats = retry.getStats();
|
|
594
|
+
|
|
595
|
+
// Reset statistics
|
|
596
|
+
retry.resetStats();
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
### FallbackManager
|
|
600
|
+
|
|
601
|
+
```javascript
|
|
602
|
+
import { FallbackManager } from '@probelabs/probe/agent/FallbackManager.js';
|
|
603
|
+
|
|
604
|
+
const fallback = new FallbackManager({
|
|
605
|
+
strategy: 'custom',
|
|
606
|
+
providers: [/* ... */],
|
|
607
|
+
maxTotalAttempts: 10,
|
|
608
|
+
debug: false
|
|
609
|
+
});
|
|
610
|
+
|
|
611
|
+
// Execute with fallback
|
|
612
|
+
const result = await fallback.executeWithFallback(
|
|
613
|
+
async (provider, model, config) => {
|
|
614
|
+
// provider: AI SDK provider instance
|
|
615
|
+
// model: Model name
|
|
616
|
+
// config: Full provider configuration
|
|
617
|
+
return await streamText({ model: provider(model), /* ... */ });
|
|
618
|
+
}
|
|
619
|
+
);
|
|
620
|
+
|
|
621
|
+
// Get statistics
|
|
622
|
+
const stats = fallback.getStats();
|
|
623
|
+
|
|
624
|
+
// Reset statistics
|
|
625
|
+
fallback.resetStats();
|
|
626
|
+
```
|
|
627
|
+
|
|
628
|
+
## Migration Guide
|
|
629
|
+
|
|
630
|
+
### From Simple Configuration
|
|
631
|
+
|
|
632
|
+
**Before:**
|
|
633
|
+
```javascript
|
|
634
|
+
const agent = new ProbeAgent({
|
|
635
|
+
provider: 'anthropic'
|
|
636
|
+
});
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
**After (with retry and fallback):**
|
|
640
|
+
```javascript
|
|
641
|
+
const agent = new ProbeAgent({
|
|
642
|
+
provider: 'anthropic',
|
|
643
|
+
retry: {
|
|
644
|
+
maxRetries: 5
|
|
645
|
+
},
|
|
646
|
+
fallback: {
|
|
647
|
+
auto: true // Use all available providers
|
|
648
|
+
}
|
|
649
|
+
});
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
### From Environment-Based Fallback
|
|
653
|
+
|
|
654
|
+
**Before:**
|
|
655
|
+
```bash
|
|
656
|
+
export ANTHROPIC_API_KEY=xxx
|
|
657
|
+
export OPENAI_API_KEY=xxx
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
**After:**
|
|
661
|
+
```bash
|
|
662
|
+
export ANTHROPIC_API_KEY=xxx
|
|
663
|
+
export OPENAI_API_KEY=xxx
|
|
664
|
+
export AUTO_FALLBACK=1
|
|
665
|
+
export MAX_RETRIES=5
|
|
666
|
+
```
|
|
667
|
+
|
|
668
|
+
No code changes required! The agent will automatically use available providers.
|
|
669
|
+
|
|
670
|
+
## See Also
|
|
671
|
+
|
|
672
|
+
- [ProbeAgent API Reference](./PROBEAGENT.md)
|
|
673
|
+
- [Error Handling Guide](./ERROR_HANDLING.md)
|
|
674
|
+
- [Environment Variables](./ENVIRONMENT_VARIABLES.md)
|