claude-smart 0.2.41 → 0.2.43
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/.claude-plugin/marketplace.json +17 -0
- package/README.md +1 -1
- package/bin/claude-smart.js +86 -48
- package/package.json +10 -3
- package/plugin/.claude-plugin/plugin.json +9 -3
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/README.md +2 -2
- package/plugin/dashboard/next.config.ts +9 -1
- package/plugin/pyproject.toml +2 -2
- package/plugin/scripts/_lib.sh +91 -0
- package/plugin/scripts/backend-service.sh +46 -15
- package/plugin/scripts/cli.sh +29 -1
- package/plugin/scripts/codex-hook.js +72 -4
- package/plugin/scripts/dashboard-build.sh +1 -0
- package/plugin/scripts/dashboard-service.sh +1 -0
- package/plugin/scripts/ensure-plugin-root.sh +7 -14
- package/plugin/scripts/hook_entry.sh +1 -0
- package/plugin/scripts/smart-install.sh +18 -2
- package/plugin/src/claude_smart/cli.py +72 -38
- package/plugin/src/claude_smart/context_format.py +11 -12
- package/plugin/src/claude_smart/cs_cite.py +26 -12
- package/plugin/src/claude_smart/ids.py +13 -5
- package/plugin/uv.lock +1 -1
- package/plugin/vendor/reflexio/.env.example +53 -0
- package/plugin/vendor/reflexio/LICENSE +201 -0
- package/plugin/vendor/reflexio/README.md +338 -0
- package/plugin/vendor/reflexio/pyproject.toml +271 -0
- package/plugin/vendor/reflexio/reflexio/README.md +184 -0
- package/plugin/vendor/reflexio/reflexio/__init__.py +166 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/__init__.py +1 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/README.md +109 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/__init__.py +1 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/backends.py +175 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/bench.py +642 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/embed_cache.py +330 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/report.py +317 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/results/report.md +43 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/results/results.json +4478 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/scenarios.py +134 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/seed.py +255 -0
- package/plugin/vendor/reflexio/reflexio/cli/README.md +287 -0
- package/plugin/vendor/reflexio/reflexio/cli/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/cli/__main__.py +56 -0
- package/plugin/vendor/reflexio/reflexio/cli/_client.py +86 -0
- package/plugin/vendor/reflexio/reflexio/cli/app.py +127 -0
- package/plugin/vendor/reflexio/reflexio/cli/bootstrap_config.py +266 -0
- package/plugin/vendor/reflexio/reflexio/cli/codex_auth.py +503 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/admin_cmd.py +65 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/agent_playbooks.py +503 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/api.py +114 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/auth.py +109 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/config_cmd.py +511 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/doctor.py +127 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/embeddings.py +53 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/interactions.py +478 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/profiles.py +303 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/services.py +289 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/setup_cmd.py +961 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/shortcuts.py +285 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/status_cmd.py +143 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/user_playbooks.py +373 -0
- package/plugin/vendor/reflexio/reflexio/cli/env_loader.py +284 -0
- package/plugin/vendor/reflexio/reflexio/cli/errors.py +217 -0
- package/plugin/vendor/reflexio/reflexio/cli/log_format.py +247 -0
- package/plugin/vendor/reflexio/reflexio/cli/output.py +867 -0
- package/plugin/vendor/reflexio/reflexio/cli/paths.py +41 -0
- package/plugin/vendor/reflexio/reflexio/cli/run_services.py +391 -0
- package/plugin/vendor/reflexio/reflexio/cli/state.py +204 -0
- package/plugin/vendor/reflexio/reflexio/cli/stop_services.py +96 -0
- package/plugin/vendor/reflexio/reflexio/cli/utils.py +329 -0
- package/plugin/vendor/reflexio/reflexio/client/__init__.py +3 -0
- package/plugin/vendor/reflexio/reflexio/client/cache.py +150 -0
- package/plugin/vendor/reflexio/reflexio/client/client.py +2613 -0
- package/plugin/vendor/reflexio/reflexio/defaults.py +23 -0
- package/plugin/vendor/reflexio/reflexio/integrations/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/.clawhubignore +7 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/README.md +274 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/TESTING.md +517 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/hook/handler.js +473 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package-lock.json +2156 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package.json +18 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/handler.ts +241 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/setup.ts +140 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/index.ts +130 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/publish.ts +113 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/search.ts +52 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/server.ts +103 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/sqlite-buffer.ts +156 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/user-id.ts +134 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/openclaw.plugin.json +41 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/package.json +17 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/rules/reflexio.md +24 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/reflexio/SKILL.md +48 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/publish_clawhub.sh +278 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/references/HOOK.md +164 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/install.sh +36 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/uninstall.sh +35 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/publish.test.ts +27 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/search.test.ts +31 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/server.test.ts +42 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/setup.test.ts +49 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/sqlite-buffer.test.ts +91 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/user-id.test.ts +50 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tsconfig.json +16 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/types/openclaw.d.ts +230 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/vitest.config.ts +13 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/README.md +120 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/TESTING.md +168 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/package-lock.json +1657 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/package.json +16 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/HEARTBEAT.md +6 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/README.md +84 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/SKILL.md +194 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/_meta.json +6 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/agents/reflexio-extractor.md +45 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/hook/handler.ts +214 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/hook/setup.ts +55 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/index.ts +327 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/consolidate.ts +233 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/dedup.ts +80 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/io.ts +155 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/openclaw-cli.ts +67 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/search.ts +33 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/write-playbook.ts +76 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/write-profile.ts +79 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/openclaw.plugin.json +46 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/package.json +18 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/README.md +36 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/full_consolidation.md +56 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/playbook_extraction.md +217 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/profile_extraction.md +132 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/skills/reflexio-consolidate/SKILL.md +33 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/skills/reflexio-embedded/SKILL.md +194 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/HOOK.md +18 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/architecture.md +49 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/comparison.md +31 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/future-work.md +47 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/porting-notes.md +52 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/scripts/install.sh +52 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/scripts/uninstall.sh +36 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/consolidate.test.ts +135 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/dedup.test.ts +104 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/io.test.ts +175 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/search.test.ts +66 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/smoke-test.ts +140 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/write-playbook.test.ts +93 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/write-profile.test.ts +174 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tsconfig.json +16 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/types/openclaw.d.ts +230 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/vitest.config.ts +7 -0
- package/plugin/vendor/reflexio/reflexio/lib/__init__.py +23 -0
- package/plugin/vendor/reflexio/reflexio/lib/_agent_playbook.py +310 -0
- package/plugin/vendor/reflexio/reflexio/lib/_base.py +225 -0
- package/plugin/vendor/reflexio/reflexio/lib/_config.py +83 -0
- package/plugin/vendor/reflexio/reflexio/lib/_dashboard.py +266 -0
- package/plugin/vendor/reflexio/reflexio/lib/_generation.py +176 -0
- package/plugin/vendor/reflexio/reflexio/lib/_interactions.py +334 -0
- package/plugin/vendor/reflexio/reflexio/lib/_operations.py +153 -0
- package/plugin/vendor/reflexio/reflexio/lib/_profiles.py +545 -0
- package/plugin/vendor/reflexio/reflexio/lib/_reflection.py +52 -0
- package/plugin/vendor/reflexio/reflexio/lib/_search.py +167 -0
- package/plugin/vendor/reflexio/reflexio/lib/_storage_labels.py +103 -0
- package/plugin/vendor/reflexio/reflexio/lib/_user_playbook.py +288 -0
- package/plugin/vendor/reflexio/reflexio/lib/reflexio_lib.py +27 -0
- package/plugin/vendor/reflexio/reflexio/models/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/braintrust_schema.py +141 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/common.py +41 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/__init__.py +3 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/entities.py +1103 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/enums.py +63 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/eval_overview_schema.py +487 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/internal_schema.py +28 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/pending_tool_call_schema.py +83 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/retriever_schema.py +766 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/service_schemas.py +9 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/stall_state_schema.py +32 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/__init__.py +3 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/converters.py +177 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/entities.py +129 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/enums.py +25 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/validators.py +280 -0
- package/plugin/vendor/reflexio/reflexio/models/config_schema.py +908 -0
- package/plugin/vendor/reflexio/reflexio/models/py.typed +0 -0
- package/plugin/vendor/reflexio/reflexio/server/OVERVIEW.md +90 -0
- package/plugin/vendor/reflexio/reflexio/server/README.md +616 -0
- package/plugin/vendor/reflexio/reflexio/server/__init__.py +210 -0
- package/plugin/vendor/reflexio/reflexio/server/__main__.py +132 -0
- package/plugin/vendor/reflexio/reflexio/server/_auth.py +25 -0
- package/plugin/vendor/reflexio/reflexio/server/api.py +2714 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/account_api.py +143 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/health_api.py +91 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/pending_tool_call_api.py +572 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/precondition_checks.py +66 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/publisher_api.py +540 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/request_context.py +50 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/stall_state_api.py +100 -0
- package/plugin/vendor/reflexio/reflexio/server/cache/__init__.py +15 -0
- package/plugin/vendor/reflexio/reflexio/server/cache/reflexio_cache.py +208 -0
- package/plugin/vendor/reflexio/reflexio/server/correlation.py +46 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/__init__.py +30 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/embedding_service.py +110 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/image_utils.py +55 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/litellm_client.py +1595 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/llm_utils.py +112 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/model_defaults.py +469 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/__init__.py +1 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/claude_code_provider.py +1122 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/claude_code_stream_parser.py +197 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/embedding_service_provider.py +210 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/local_embedding_provider.py +213 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/nomic_embedding_provider.py +255 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/rerank/__init__.py +6 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/rerank/cross_encoder_reranker.py +177 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/rerank/llm_reranker.py +148 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/tools.py +699 -0
- package/plugin/vendor/reflexio/reflexio/server/operation_limiter.py +179 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/_dispatchers.py +54 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/README.md +121 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/agent_success_evaluation/v1.0.0.prompt.md +58 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/agent_success_evaluation_with_comparison/v1.0.0.prompt.md +76 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/answer_synthesis/v1.5.2.prompt.md +88 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/compress_session_for_query/v1.3.0.prompt.md +31 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/document_expansion/v1.0.0.prompt.md +20 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.0.0.prompt.md +53 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.1.0.prompt.md +57 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.2.0.prompt.md +68 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.3.0.prompt.md +70 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.4.0.prompt.md +77 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.5.0.prompt.md +82 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.6.0.prompt.md +83 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.1.0.prompt.md +193 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.2.0.prompt.md +206 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.0.0-deprecated.prompt.md +66 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.0.0.prompt.md +43 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.1.0.prompt.md +46 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.0.0-deprecated.prompt.md +64 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.0.0.prompt.md +39 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.1.0.prompt.md +39 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.2.0.prompt.md +47 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.3.0.prompt.md +58 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.0.2.prompt.md +254 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.1.0.prompt.md +274 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.2.0.prompt.md +279 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v1.0.0.prompt.md +73 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v2.0.0.prompt.md +86 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.0.0.prompt.md +97 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.1.0.prompt.md +119 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.2.0.prompt.md +123 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.3.0.prompt.md +127 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.0.0.prompt.md +14 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.1.0.prompt.md +24 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.2.0.prompt.md +29 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.0.0.prompt.md +11 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.1.0.prompt.md +21 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.2.0.prompt.md +25 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.0.0.prompt.md +37 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.1.0.prompt.md +40 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.2.0.prompt.md +36 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v1.0.0.prompt.md +45 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v2.0.0.prompt.md +81 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v3.0.0.prompt.md +80 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate_expert/v1.0.0.prompt.md +34 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_deduplication/v1.0.0.prompt.md +116 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_should_generate/v1.0.0.prompt.md +33 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_should_generate_override/v1.0.0.prompt.md +16 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.0.0.prompt.md +140 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.1.0.prompt.md +160 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_main/v1.0.0.prompt.md +14 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/query_reformulation/v1.0.0.prompt.md +19 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/rerank_relevance/v1.1.0.prompt.md +44 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/shadow_comparison/v1.0.0.prompt.md +43 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/shadow_content_evaluation/v1.0.0.prompt.md +33 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_evaluation/prompt_evaluation_dataset/feedback_extraction_main_v1.jsonl +10 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_evaluation/prompt_evaluation_dataset/profile_update_main_v1.jsonl +10 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_manager.py +280 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_schema.py +11 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/_eval_health.py +131 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_constants.py +60 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_service.py +228 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_utils.py +87 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluator.py +372 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/delayed_group_evaluator.py +156 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/group_evaluation_runner.py +340 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/regen_jobs.py +471 -0
- package/plugin/vendor/reflexio/reflexio/server/services/base_generation_service.py +1626 -0
- package/plugin/vendor/reflexio/reflexio/server/services/braintrust/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/services/braintrust/_cron.py +196 -0
- package/plugin/vendor/reflexio/reflexio/server/services/braintrust/_encryption.py +101 -0
- package/plugin/vendor/reflexio/reflexio/server/services/braintrust/client.py +167 -0
- package/plugin/vendor/reflexio/reflexio/server/services/braintrust/service.py +281 -0
- package/plugin/vendor/reflexio/reflexio/server/services/configurator/base_configurator.py +179 -0
- package/plugin/vendor/reflexio/reflexio/server/services/configurator/config_storage.py +62 -0
- package/plugin/vendor/reflexio/reflexio/server/services/configurator/configurator.py +87 -0
- package/plugin/vendor/reflexio/reflexio/server/services/configurator/local_file_config_storage.py +187 -0
- package/plugin/vendor/reflexio/reflexio/server/services/configurator/test_config_storage.py +162 -0
- package/plugin/vendor/reflexio/reflexio/server/services/deduplication_utils.py +112 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/distribution.py +33 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/eval_sampler.py +126 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/group_aggregation.py +192 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/hero_state.py +75 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/rule_attribution.py +97 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/service.py +515 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/shadow_aggregation.py +90 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/agent_run_records.py +91 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/invariants.py +303 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/outcome.py +25 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/pending_tool_call_dispatch.py +351 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/plan.py +138 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/prior_answer_search.py +217 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/resumable_agent.py +468 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/resume_scheduler.py +171 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/resume_worker.py +777 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/tools.py +1125 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extractor_config_utils.py +91 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extractor_interaction_utils.py +251 -0
- package/plugin/vendor/reflexio/reflexio/server/services/generation_service.py +689 -0
- package/plugin/vendor/reflexio/reflexio/server/services/operation_state_utils.py +835 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/README.md +89 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_aggregator.py +1388 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_consolidator.py +960 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_extractor.py +436 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_generation_service.py +808 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_service_constants.py +28 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_service_utils.py +362 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/__init__.py +24 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/assistant_webhook.py +246 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/gepa_adapter.py +291 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/judge.py +97 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/models.py +96 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/optimizer.py +645 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/rollout.py +35 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/scenario_resolver.py +93 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/scheduler.py +174 -0
- package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/__init__.py +26 -0
- package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/_document_expander.py +179 -0
- package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/_query_reformulator.py +297 -0
- package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_deduplicator.py +741 -0
- package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_extractor.py +462 -0
- package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_generation_service.py +734 -0
- package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_generation_service_utils.py +290 -0
- package/plugin/vendor/reflexio/reflexio/server/services/reflection/__init__.py +17 -0
- package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_extractor.py +247 -0
- package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_service.py +800 -0
- package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_service_utils.py +146 -0
- package/plugin/vendor/reflexio/reflexio/server/services/retrieval/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/services/retrieval/relevance_floor.py +70 -0
- package/plugin/vendor/reflexio/reflexio/server/services/search/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/services/service_utils.py +671 -0
- package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/__init__.py +1 -0
- package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/judge.py +184 -0
- package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/outcome.py +81 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/constants.py +2 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/error.py +11 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/retention.py +154 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/retention_mixin.py +155 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/__init__.py +59 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_agent_run.py +1253 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_base.py +1945 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_extras.py +600 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_operations.py +346 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_playbook.py +1378 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_profiles.py +747 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_requests.py +263 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_shadow_verdicts.py +193 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_share_links.py +166 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_stall_state.py +217 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/__init__.py +153 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_agent_run.py +372 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_base.py +71 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_extras.py +235 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_operations.py +170 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_playbook.py +677 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_profiles.py +250 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_requests.py +154 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_shadow_verdicts.py +130 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_share_links.py +93 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_stall_state.py +76 -0
- package/plugin/vendor/reflexio/reflexio/server/services/unified_search_service.py +568 -0
- package/plugin/vendor/reflexio/reflexio/server/site_var/README.md +77 -0
- package/plugin/vendor/reflexio/reflexio/server/site_var/feature_flags.py +116 -0
- package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_manager.py +263 -0
- package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/feature_flags.json +13 -0
- package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/llm_model_setting.json +7 -0
- package/plugin/vendor/reflexio/reflexio/server/tracing.py +158 -0
- package/plugin/vendor/reflexio/reflexio/server/usage_metrics.py +113 -0
- package/plugin/vendor/reflexio/reflexio/server/uvicorn_logging.py +76 -0
- package/plugin/vendor/reflexio/reflexio/test_support/__init__.py +1 -0
- package/plugin/vendor/reflexio/reflexio/test_support/llm_fixtures.py +62 -0
- package/plugin/vendor/reflexio/reflexio/test_support/llm_mock.py +242 -0
- package/plugin/vendor/reflexio/reflexio/test_support/llm_model_registry.py +129 -0
- package/plugin/vendor/reflexio/reflexio/test_support/skip_decorators.py +43 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import functools
|
|
4
|
+
import logging
|
|
5
|
+
from collections.abc import Callable
|
|
6
|
+
from typing import TYPE_CHECKING, Any
|
|
7
|
+
|
|
8
|
+
from pydantic import BaseModel
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from reflexio.server.services.pre_retrieval import QueryReformulator
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
from reflexio.models.config_schema import SearchMode
|
|
15
|
+
from reflexio.server.api_endpoints.request_context import RequestContext
|
|
16
|
+
from reflexio.server.llm.litellm_client import LiteLLMClient, LiteLLMConfig
|
|
17
|
+
from reflexio.server.llm.model_defaults import (
|
|
18
|
+
ModelRole,
|
|
19
|
+
resolve_model_name,
|
|
20
|
+
)
|
|
21
|
+
from reflexio.server.services.configurator.base_configurator import BaseConfigurator
|
|
22
|
+
from reflexio.server.services.storage.storage_base import BaseStorage
|
|
23
|
+
from reflexio.server.site_var.site_var_manager import SiteVarManager
|
|
24
|
+
from reflexio.server.tracing import profile_step
|
|
25
|
+
|
|
26
|
+
logger = logging.getLogger(__name__)
|
|
27
|
+
|
|
28
|
+
# Error message for when storage is not configured
|
|
29
|
+
STORAGE_NOT_CONFIGURED_MSG = (
|
|
30
|
+
"Storage not configured. Please configure storage in settings first."
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _require_storage[T: BaseModel](
|
|
35
|
+
response_type: type[T], *, msg_field: str = "message"
|
|
36
|
+
) -> Callable[..., Callable[..., T]]:
|
|
37
|
+
"""Decorator that guards a Reflexio method with storage-configured check and error handling.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
response_type: The Pydantic response model to return on failure
|
|
41
|
+
msg_field: Name of the message field on the response ('message' or 'msg')
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def decorator(method: Callable[..., T]) -> Callable[..., T]:
|
|
45
|
+
@functools.wraps(method)
|
|
46
|
+
def wrapper(self: Reflexio, *args: Any, **kwargs: Any) -> T:
|
|
47
|
+
if not self._is_storage_configured():
|
|
48
|
+
return response_type.model_validate(
|
|
49
|
+
{"success": False, msg_field: STORAGE_NOT_CONFIGURED_MSG}
|
|
50
|
+
)
|
|
51
|
+
try:
|
|
52
|
+
return method(self, *args, **kwargs)
|
|
53
|
+
except Exception as e:
|
|
54
|
+
return response_type.model_validate(
|
|
55
|
+
{"success": False, msg_field: str(e)}
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
return wrapper
|
|
59
|
+
|
|
60
|
+
return decorator
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _storage_backend_name(storage: BaseStorage) -> str:
|
|
64
|
+
class_name = storage.__class__.__name__.lower()
|
|
65
|
+
if "postgres" in class_name:
|
|
66
|
+
return "postgres"
|
|
67
|
+
if "supabase" in class_name:
|
|
68
|
+
return "supabase"
|
|
69
|
+
return class_name
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class ReflexioBase:
|
|
73
|
+
def __init__(
|
|
74
|
+
self,
|
|
75
|
+
org_id: str,
|
|
76
|
+
storage_base_dir: str | None = None,
|
|
77
|
+
configurator: BaseConfigurator | None = None,
|
|
78
|
+
) -> None:
|
|
79
|
+
"""Initialize Reflexio with organization ID and storage directory.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
org_id (str): Organization ID
|
|
83
|
+
storage_base_dir (str, optional): Base directory for storing data
|
|
84
|
+
"""
|
|
85
|
+
self.org_id = org_id
|
|
86
|
+
self.storage_base_dir = storage_base_dir
|
|
87
|
+
self.request_context = RequestContext(
|
|
88
|
+
org_id=org_id, storage_base_dir=storage_base_dir, configurator=configurator
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Create single LLM client for all services
|
|
92
|
+
model_setting = SiteVarManager().get_site_var("llm_model_setting")
|
|
93
|
+
site_var = model_setting if isinstance(model_setting, dict) else {}
|
|
94
|
+
|
|
95
|
+
# Get API key config and LLM config from configuration if available
|
|
96
|
+
config = self.request_context.configurator.get_config()
|
|
97
|
+
api_key_config = config.api_key_config if config else None
|
|
98
|
+
config_llm_config = config.llm_config if config else None
|
|
99
|
+
|
|
100
|
+
generation_model_name = resolve_model_name(
|
|
101
|
+
ModelRole.GENERATION,
|
|
102
|
+
site_var_value=site_var.get("default_generation_model_name"),
|
|
103
|
+
config_override=config_llm_config.generation_model_name
|
|
104
|
+
if config_llm_config
|
|
105
|
+
else None,
|
|
106
|
+
api_key_config=api_key_config,
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
llm_config = LiteLLMConfig(
|
|
110
|
+
model=generation_model_name,
|
|
111
|
+
api_key_config=api_key_config,
|
|
112
|
+
)
|
|
113
|
+
self.llm_client = LiteLLMClient(llm_config)
|
|
114
|
+
|
|
115
|
+
def _is_storage_configured(self) -> bool:
|
|
116
|
+
"""Check if storage is configured and available.
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
bool: True if storage is configured, False otherwise
|
|
120
|
+
"""
|
|
121
|
+
return self.request_context.is_storage_configured()
|
|
122
|
+
|
|
123
|
+
def _get_storage(self) -> BaseStorage:
|
|
124
|
+
"""Return storage, raising if not configured."""
|
|
125
|
+
storage = self.request_context.storage
|
|
126
|
+
if storage is None:
|
|
127
|
+
raise RuntimeError(STORAGE_NOT_CONFIGURED_MSG)
|
|
128
|
+
return storage
|
|
129
|
+
|
|
130
|
+
def _get_query_reformulator(self) -> QueryReformulator:
|
|
131
|
+
"""Lazily create and cache a QueryReformulator instance.
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
QueryReformulator: Cached reformulator instance
|
|
135
|
+
"""
|
|
136
|
+
if not hasattr(self, "_query_reformulator"):
|
|
137
|
+
from reflexio.server.services.pre_retrieval import QueryReformulator
|
|
138
|
+
|
|
139
|
+
# Resolve pre_retrieval_model_name: config override → site var → auto-detect
|
|
140
|
+
model_setting = SiteVarManager().get_site_var("llm_model_setting")
|
|
141
|
+
site_var = model_setting if isinstance(model_setting, dict) else {}
|
|
142
|
+
config = self.request_context.configurator.get_config()
|
|
143
|
+
config_llm_config = config.llm_config if config else None
|
|
144
|
+
api_key_config = config.api_key_config if config else None
|
|
145
|
+
|
|
146
|
+
pre_retrieval_model_name = resolve_model_name(
|
|
147
|
+
ModelRole.PRE_RETRIEVAL,
|
|
148
|
+
site_var_value=site_var.get("pre_retrieval_model_name"),
|
|
149
|
+
config_override=config_llm_config.pre_retrieval_model_name
|
|
150
|
+
if config_llm_config
|
|
151
|
+
else None,
|
|
152
|
+
api_key_config=api_key_config,
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
self._query_reformulator = QueryReformulator(
|
|
156
|
+
llm_client=self.llm_client,
|
|
157
|
+
prompt_manager=self.request_context.prompt_manager,
|
|
158
|
+
model_name=pre_retrieval_model_name,
|
|
159
|
+
)
|
|
160
|
+
return self._query_reformulator
|
|
161
|
+
|
|
162
|
+
def _maybe_get_query_embedding(
|
|
163
|
+
self, query: str | None, search_mode: SearchMode
|
|
164
|
+
) -> list[float] | None:
|
|
165
|
+
"""Generate a query embedding if the search mode needs one and the storage supports it.
|
|
166
|
+
|
|
167
|
+
Args:
|
|
168
|
+
query (str, optional): The search query text
|
|
169
|
+
search_mode (SearchMode): Requested search mode
|
|
170
|
+
|
|
171
|
+
Returns:
|
|
172
|
+
list[float] or None: Query embedding vector, or None if not needed/available
|
|
173
|
+
"""
|
|
174
|
+
if not query or search_mode == SearchMode.FTS:
|
|
175
|
+
return None
|
|
176
|
+
storage = self._get_storage()
|
|
177
|
+
if not storage.supports_embedding:
|
|
178
|
+
return None
|
|
179
|
+
with profile_step(
|
|
180
|
+
"search.embedding",
|
|
181
|
+
backend=_storage_backend_name(storage),
|
|
182
|
+
search_mode=search_mode,
|
|
183
|
+
purpose="query",
|
|
184
|
+
) as span:
|
|
185
|
+
try:
|
|
186
|
+
embedding = storage._get_embedding(query, purpose="query") # type: ignore[reportAttributeAccessIssue]
|
|
187
|
+
span.set_data("embedding_generated", embedding is not None)
|
|
188
|
+
return embedding
|
|
189
|
+
except Exception as e:
|
|
190
|
+
span.set_data("embedding_generated", False)
|
|
191
|
+
logger.warning(
|
|
192
|
+
"Failed to generate query embedding due to %s — falling back to FTS",
|
|
193
|
+
e,
|
|
194
|
+
)
|
|
195
|
+
return None
|
|
196
|
+
|
|
197
|
+
def _reformulate_query(
|
|
198
|
+
self, query: str | None, enabled: bool = False
|
|
199
|
+
) -> str | None:
|
|
200
|
+
"""Reformulate a search query using the query reformulator if enabled.
|
|
201
|
+
|
|
202
|
+
Returns the reformulated query, or None if reformulation is disabled,
|
|
203
|
+
the query is empty, or reformulation fails.
|
|
204
|
+
|
|
205
|
+
Args:
|
|
206
|
+
query (str, optional): The original search query
|
|
207
|
+
enabled (bool): Whether query reformulation is enabled for this request
|
|
208
|
+
|
|
209
|
+
Returns:
|
|
210
|
+
str or None: Reformulated query, or None to use original query
|
|
211
|
+
"""
|
|
212
|
+
if not query or not enabled:
|
|
213
|
+
return None
|
|
214
|
+
|
|
215
|
+
with profile_step("search.reformulate", enabled=enabled):
|
|
216
|
+
reformulator = self._get_query_reformulator()
|
|
217
|
+
result = reformulator.rewrite(query)
|
|
218
|
+
# Only return if different from original
|
|
219
|
+
if result.standalone_query != query:
|
|
220
|
+
return result.standalone_query
|
|
221
|
+
return None
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
if TYPE_CHECKING:
|
|
225
|
+
from reflexio.lib.reflexio_lib import Reflexio
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
from reflexio.lib._base import ReflexioBase
|
|
4
|
+
from reflexio.models.api_schema.retriever_schema import SetConfigResponse
|
|
5
|
+
from reflexio.models.config_schema import Config
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ConfigMixin(ReflexioBase):
|
|
9
|
+
def set_config(self, config: Config | dict) -> SetConfigResponse:
|
|
10
|
+
"""Set configuration for the organization.
|
|
11
|
+
|
|
12
|
+
Args:
|
|
13
|
+
config (Union[Config, dict]): The configuration to set
|
|
14
|
+
|
|
15
|
+
Returns:
|
|
16
|
+
dict: Response containing success status and message
|
|
17
|
+
"""
|
|
18
|
+
try:
|
|
19
|
+
configurator = self.request_context.configurator
|
|
20
|
+
if isinstance(config, dict):
|
|
21
|
+
config = configurator.normalize_config_payload(config)
|
|
22
|
+
config = Config(**config)
|
|
23
|
+
|
|
24
|
+
# Validate storage connection before setting config.
|
|
25
|
+
# If no storage_config provided, preserve the existing one (callers
|
|
26
|
+
# like get_config() don't expose storage_config for security).
|
|
27
|
+
storage_config = config.storage_config
|
|
28
|
+
if storage_config is None:
|
|
29
|
+
storage_config = configurator.get_current_storage_configuration()
|
|
30
|
+
config.storage_config = storage_config
|
|
31
|
+
|
|
32
|
+
# Check if storage config is ready to test
|
|
33
|
+
if not configurator.is_storage_config_ready_to_test(
|
|
34
|
+
storage_config=storage_config
|
|
35
|
+
):
|
|
36
|
+
return SetConfigResponse(
|
|
37
|
+
success=False, msg="Storage configuration is incomplete"
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
# Test and initialize storage connection
|
|
41
|
+
(
|
|
42
|
+
success,
|
|
43
|
+
error_msg,
|
|
44
|
+
) = configurator.test_and_init_storage_config(storage_config=storage_config)
|
|
45
|
+
|
|
46
|
+
if not success:
|
|
47
|
+
return SetConfigResponse(
|
|
48
|
+
success=False,
|
|
49
|
+
msg=f"Failed to validate storage connection: {error_msg}",
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
# Only set config if validation passed
|
|
53
|
+
configurator.set_config(config)
|
|
54
|
+
|
|
55
|
+
return SetConfigResponse(success=True, msg="Configuration set successfully")
|
|
56
|
+
except Exception as e:
|
|
57
|
+
return SetConfigResponse(
|
|
58
|
+
success=False, msg=f"Failed to set configuration: {str(e)}"
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
def get_config(self) -> Config:
|
|
62
|
+
"""Get configuration for the organization.
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
Config: The current configuration
|
|
66
|
+
"""
|
|
67
|
+
return self.request_context.configurator.get_config()
|
|
68
|
+
|
|
69
|
+
def current_config_version(self) -> tuple[str, Any] | None:
|
|
70
|
+
"""Cheap probe of the persisted config version.
|
|
71
|
+
|
|
72
|
+
Delegates to the underlying ``ConfigStorage.get_version()``.
|
|
73
|
+
Used by the per-org Reflexio cache to detect out-of-band
|
|
74
|
+
configuration changes (file edits, replica writes, direct DB
|
|
75
|
+
updates) without doing a full reload on every request.
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
tuple[str, Any] | None: ``("file", mtime)`` for file-backed
|
|
79
|
+
storage, ``("db", version)`` for DB-backed storage, or
|
|
80
|
+
``None`` when probing is unsupported / fails (the cache
|
|
81
|
+
treats ``None`` as "still fresh").
|
|
82
|
+
"""
|
|
83
|
+
return self.request_context.configurator.config_storage.get_version()
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING
|
|
2
|
+
|
|
3
|
+
from reflexio.lib._base import STORAGE_NOT_CONFIGURED_MSG, ReflexioBase
|
|
4
|
+
from reflexio.models.api_schema.braintrust_schema import (
|
|
5
|
+
BraintrustStatusResponse,
|
|
6
|
+
ConnectBraintrustRequest,
|
|
7
|
+
ConnectBraintrustResponse,
|
|
8
|
+
SelectProjectsRequest,
|
|
9
|
+
SelectProjectsResponse,
|
|
10
|
+
SyncBraintrustResponse,
|
|
11
|
+
)
|
|
12
|
+
from reflexio.models.api_schema.eval_overview_schema import (
|
|
13
|
+
ContextTile,
|
|
14
|
+
GetEvaluationOverviewRequest,
|
|
15
|
+
GetEvaluationOverviewResponse,
|
|
16
|
+
HeroBlock,
|
|
17
|
+
NumberWithDelta,
|
|
18
|
+
PercentWithDelta,
|
|
19
|
+
ScoreDistribution,
|
|
20
|
+
)
|
|
21
|
+
from reflexio.models.api_schema.retriever_schema import (
|
|
22
|
+
DashboardStats,
|
|
23
|
+
GetDashboardStatsRequest,
|
|
24
|
+
GetDashboardStatsResponse,
|
|
25
|
+
GetPlaybookApplicationStatsRequest,
|
|
26
|
+
GetPlaybookApplicationStatsResponse,
|
|
27
|
+
PeriodStats,
|
|
28
|
+
TimeSeriesDataPoint,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
if TYPE_CHECKING:
|
|
32
|
+
from reflexio.server.services.braintrust.service import (
|
|
33
|
+
BraintrustConnectorService,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class DashboardMixin(ReflexioBase):
|
|
38
|
+
def get_dashboard_stats(
|
|
39
|
+
self, request: GetDashboardStatsRequest | dict
|
|
40
|
+
) -> GetDashboardStatsResponse:
|
|
41
|
+
"""Get dashboard statistics including counts and time-series data.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
request (Union[GetDashboardStatsRequest, dict]): Request containing days_back and granularity
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
GetDashboardStatsResponse: Response containing dashboard statistics
|
|
48
|
+
"""
|
|
49
|
+
if not self._is_storage_configured():
|
|
50
|
+
# Return empty stats when storage is not configured
|
|
51
|
+
empty_period = PeriodStats(
|
|
52
|
+
total_profiles=0,
|
|
53
|
+
total_interactions=0,
|
|
54
|
+
total_playbooks=0,
|
|
55
|
+
success_rate=0.0,
|
|
56
|
+
)
|
|
57
|
+
empty_stats = DashboardStats(
|
|
58
|
+
current_period=empty_period,
|
|
59
|
+
previous_period=empty_period,
|
|
60
|
+
interactions_time_series=[],
|
|
61
|
+
profiles_time_series=[],
|
|
62
|
+
playbooks_time_series=[],
|
|
63
|
+
evaluations_time_series=[],
|
|
64
|
+
)
|
|
65
|
+
return GetDashboardStatsResponse(
|
|
66
|
+
success=True, stats=empty_stats, msg=STORAGE_NOT_CONFIGURED_MSG
|
|
67
|
+
)
|
|
68
|
+
try:
|
|
69
|
+
# Convert dict to request object if needed
|
|
70
|
+
if isinstance(request, dict):
|
|
71
|
+
request = GetDashboardStatsRequest(**request)
|
|
72
|
+
|
|
73
|
+
# Get stats from storage layer
|
|
74
|
+
stats_dict = self._get_storage().get_dashboard_stats(
|
|
75
|
+
days_back=request.days_back or 30
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
# Convert dict to Pydantic models
|
|
79
|
+
current_period = PeriodStats(**stats_dict["current_period"])
|
|
80
|
+
previous_period = PeriodStats(**stats_dict["previous_period"])
|
|
81
|
+
|
|
82
|
+
interactions_time_series = [
|
|
83
|
+
TimeSeriesDataPoint(**ts)
|
|
84
|
+
for ts in stats_dict["interactions_time_series"]
|
|
85
|
+
]
|
|
86
|
+
profiles_time_series = [
|
|
87
|
+
TimeSeriesDataPoint(**ts) for ts in stats_dict["profiles_time_series"]
|
|
88
|
+
]
|
|
89
|
+
playbooks_time_series = [
|
|
90
|
+
TimeSeriesDataPoint(**ts) for ts in stats_dict["playbooks_time_series"]
|
|
91
|
+
]
|
|
92
|
+
evaluations_time_series = [
|
|
93
|
+
TimeSeriesDataPoint(**ts)
|
|
94
|
+
for ts in stats_dict["evaluations_time_series"]
|
|
95
|
+
]
|
|
96
|
+
|
|
97
|
+
# Build dashboard stats object
|
|
98
|
+
dashboard_stats = DashboardStats(
|
|
99
|
+
current_period=current_period,
|
|
100
|
+
previous_period=previous_period,
|
|
101
|
+
interactions_time_series=interactions_time_series,
|
|
102
|
+
profiles_time_series=profiles_time_series,
|
|
103
|
+
playbooks_time_series=playbooks_time_series,
|
|
104
|
+
evaluations_time_series=evaluations_time_series,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
return GetDashboardStatsResponse(
|
|
108
|
+
success=True,
|
|
109
|
+
stats=dashboard_stats,
|
|
110
|
+
msg="Retrieved dashboard stats successfully",
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
except Exception as e:
|
|
114
|
+
return GetDashboardStatsResponse(
|
|
115
|
+
success=False, msg=f"Failed to get dashboard stats: {str(e)}"
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
def get_playbook_application_stats(
|
|
119
|
+
self, request: GetPlaybookApplicationStatsRequest | dict
|
|
120
|
+
) -> GetPlaybookApplicationStatsResponse:
|
|
121
|
+
"""Get per-rule citation counts from the interactions table.
|
|
122
|
+
|
|
123
|
+
Aggregates the JSON citations column on interactions in the look-back
|
|
124
|
+
window and groups by (kind, real_id) so the dashboard can show how
|
|
125
|
+
often each individual playbook or profile has been applied.
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
request (Union[GetPlaybookApplicationStatsRequest, dict]): Request
|
|
129
|
+
containing days_back.
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
GetPlaybookApplicationStatsResponse: Response containing the
|
|
133
|
+
aggregated stats sorted by applied_count descending.
|
|
134
|
+
"""
|
|
135
|
+
if not self._is_storage_configured():
|
|
136
|
+
return GetPlaybookApplicationStatsResponse(
|
|
137
|
+
success=True, stats=[], msg=STORAGE_NOT_CONFIGURED_MSG
|
|
138
|
+
)
|
|
139
|
+
try:
|
|
140
|
+
if isinstance(request, dict):
|
|
141
|
+
request = GetPlaybookApplicationStatsRequest(**request)
|
|
142
|
+
stats = self._get_storage().get_playbook_application_stats(
|
|
143
|
+
days_back=request.days_back
|
|
144
|
+
)
|
|
145
|
+
return GetPlaybookApplicationStatsResponse(
|
|
146
|
+
success=True,
|
|
147
|
+
stats=stats,
|
|
148
|
+
msg="Retrieved playbook application stats successfully",
|
|
149
|
+
)
|
|
150
|
+
except Exception as e:
|
|
151
|
+
return GetPlaybookApplicationStatsResponse(
|
|
152
|
+
success=False,
|
|
153
|
+
stats=[],
|
|
154
|
+
msg=f"Failed to get playbook application stats: {str(e)}",
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
# ==============================
|
|
158
|
+
# Braintrust connector (Plan C-backend)
|
|
159
|
+
# ==============================
|
|
160
|
+
|
|
161
|
+
def braintrust_connect(
|
|
162
|
+
self, request: ConnectBraintrustRequest | dict
|
|
163
|
+
) -> ConnectBraintrustResponse:
|
|
164
|
+
"""Step 1 of the Braintrust connect flow — validate key, list workspaces."""
|
|
165
|
+
if isinstance(request, dict):
|
|
166
|
+
request = ConnectBraintrustRequest(**request)
|
|
167
|
+
if not self._is_storage_configured():
|
|
168
|
+
return ConnectBraintrustResponse(
|
|
169
|
+
success=False, msg=STORAGE_NOT_CONFIGURED_MSG
|
|
170
|
+
)
|
|
171
|
+
return self._braintrust_service().connect(request)
|
|
172
|
+
|
|
173
|
+
def braintrust_select_projects(
|
|
174
|
+
self, request: SelectProjectsRequest | dict
|
|
175
|
+
) -> SelectProjectsResponse:
|
|
176
|
+
"""Step 2 — persist the connection with selected projects (key encrypted)."""
|
|
177
|
+
if isinstance(request, dict):
|
|
178
|
+
request = SelectProjectsRequest(**request)
|
|
179
|
+
if not self._is_storage_configured():
|
|
180
|
+
return SelectProjectsResponse(success=False, msg=STORAGE_NOT_CONFIGURED_MSG)
|
|
181
|
+
return self._braintrust_service().select_projects(request)
|
|
182
|
+
|
|
183
|
+
def braintrust_status(self) -> BraintrustStatusResponse:
|
|
184
|
+
"""Return whether this org is connected to Braintrust + sync state."""
|
|
185
|
+
if not self._is_storage_configured():
|
|
186
|
+
return BraintrustStatusResponse(connected=False)
|
|
187
|
+
return self._braintrust_service().status()
|
|
188
|
+
|
|
189
|
+
def braintrust_disconnect(self) -> None:
|
|
190
|
+
"""Delete the persisted Braintrust connection."""
|
|
191
|
+
if not self._is_storage_configured():
|
|
192
|
+
return
|
|
193
|
+
self._braintrust_service().disconnect()
|
|
194
|
+
|
|
195
|
+
def braintrust_sync(self) -> SyncBraintrustResponse:
|
|
196
|
+
"""Manual one-shot sync (cron-driven sync is a follow-up)."""
|
|
197
|
+
if not self._is_storage_configured():
|
|
198
|
+
return SyncBraintrustResponse(success=False, msg=STORAGE_NOT_CONFIGURED_MSG)
|
|
199
|
+
return self._braintrust_service().sync_once()
|
|
200
|
+
|
|
201
|
+
def _braintrust_service(self) -> "BraintrustConnectorService":
|
|
202
|
+
from reflexio.server.services.braintrust.service import (
|
|
203
|
+
BraintrustConnectorService,
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
return BraintrustConnectorService(
|
|
207
|
+
storage=self._get_storage(),
|
|
208
|
+
org_id=self.request_context.org_id,
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
def get_evaluation_overview(
|
|
212
|
+
self, request: GetEvaluationOverviewRequest | dict
|
|
213
|
+
) -> GetEvaluationOverviewResponse:
|
|
214
|
+
"""Build the /evaluations overview payload (hero + tiles + attribution + distribution).
|
|
215
|
+
|
|
216
|
+
Args:
|
|
217
|
+
request (GetEvaluationOverviewRequest | dict): Window, bucket
|
|
218
|
+
granularity, and shadow-inclusion flag.
|
|
219
|
+
|
|
220
|
+
Returns:
|
|
221
|
+
GetEvaluationOverviewResponse: Full payload — the redesigned
|
|
222
|
+
/evaluations page is expected to render directly from this.
|
|
223
|
+
"""
|
|
224
|
+
if isinstance(request, dict):
|
|
225
|
+
request = GetEvaluationOverviewRequest(**request)
|
|
226
|
+
if not self._is_storage_configured():
|
|
227
|
+
return _empty_overview_response()
|
|
228
|
+
from reflexio.server.services.evaluation_overview.service import (
|
|
229
|
+
EvaluationOverviewService,
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
service = EvaluationOverviewService(
|
|
233
|
+
storage=self._get_storage(),
|
|
234
|
+
config=self.request_context.configurator.get_config(),
|
|
235
|
+
)
|
|
236
|
+
return service.run(request)
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
def _empty_overview_response() -> GetEvaluationOverviewResponse:
|
|
240
|
+
"""Return a default response when storage is not configured.
|
|
241
|
+
|
|
242
|
+
Used by lib wrappers to keep the endpoint stable even before storage is
|
|
243
|
+
wired up (matches the defensive pattern used by other dashboard methods).
|
|
244
|
+
"""
|
|
245
|
+
return GetEvaluationOverviewResponse(
|
|
246
|
+
hero=HeroBlock(
|
|
247
|
+
state="empty",
|
|
248
|
+
regular_success_rate_pp=0.0,
|
|
249
|
+
shadow_success_rate_pp=None,
|
|
250
|
+
delta_pp=None,
|
|
251
|
+
buckets=[],
|
|
252
|
+
),
|
|
253
|
+
context_tiles=ContextTile(
|
|
254
|
+
success=PercentWithDelta(current=0.0, delta_pp=0.0),
|
|
255
|
+
corrections=NumberWithDelta(current=0.0, delta=0.0),
|
|
256
|
+
turns=NumberWithDelta(current=0.0, delta=0.0),
|
|
257
|
+
escalation=PercentWithDelta(current=0.0, delta_pp=0.0),
|
|
258
|
+
),
|
|
259
|
+
rule_attribution=[],
|
|
260
|
+
score_distribution=ScoreDistribution(
|
|
261
|
+
current_bins=[0, 0, 0, 0, 0, 0],
|
|
262
|
+
baseline_bins=[0, 0, 0, 0, 0, 0],
|
|
263
|
+
labels=["0", "1", "2", "3", "4", "5+"],
|
|
264
|
+
),
|
|
265
|
+
braintrust_tiles=[],
|
|
266
|
+
)
|