claude-smart 0.2.42 → 0.2.44
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 +3 -3
- package/README.md +1 -1
- package/bin/claude-smart.js +2 -2
- package/package.json +9 -3
- package/plugin/.claude-plugin/plugin.json +9 -3
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/README.md +23 -3
- package/plugin/pyproject.toml +3 -3
- package/plugin/scripts/_lib.sh +91 -0
- package/plugin/scripts/backend-service.sh +51 -4
- package/plugin/scripts/cli.sh +3 -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 +1 -0
- package/plugin/scripts/hook_entry.sh +6 -3
- package/plugin/scripts/smart-install.sh +3 -2
- package/plugin/src/README.md +57 -0
- 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 +126 -5
- package/plugin/vendor/reflexio/.env.example +62 -0
- package/plugin/vendor/reflexio/LICENSE +201 -0
- package/plugin/vendor/reflexio/README.md +338 -0
- package/plugin/vendor/reflexio/pyproject.toml +274 -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 +265 -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 +964 -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 +1112 -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 +768 -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 +333 -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 +622 -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 +2868 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/README.md +34 -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 +562 -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 +359 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/image_utils.py +55 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/litellm_client.py +1871 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/llm_utils.py +140 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/model_defaults.py +479 -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 +338 -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 +288 -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 +187 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/rerank/llm_reranker.py +148 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/tools.py +716 -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_consolidation/v2.3.1.prompt.md +69 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.3.2.prompt.md +71 -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 +283 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.2.2.prompt.md +234 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.2.3.prompt.md +244 -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 +137 -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/README.md +58 -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 +336 -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 +1668 -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/embedding_text.py +62 -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 +358 -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 +535 -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 +779 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/tools.py +1125 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extractor_config_utils.py +94 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extractor_interaction_utils.py +251 -0
- package/plugin/vendor/reflexio/reflexio/server/services/generation_service.py +702 -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 +1045 -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 +772 -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 +737 -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 +803 -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 +80 -0
- package/plugin/vendor/reflexio/reflexio/server/services/search/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/services/service_utils.py +756 -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 +1298 -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 +384 -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 +572 -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,63 @@
|
|
|
1
|
+
from enum import Enum, StrEnum
|
|
2
|
+
|
|
3
|
+
from ..common import BlockingIssueKind # noqa: F401
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"UserActionType",
|
|
7
|
+
"ProfileTimeToLive",
|
|
8
|
+
"PlaybookStatus",
|
|
9
|
+
"Status",
|
|
10
|
+
"OperationStatus",
|
|
11
|
+
"RegularVsShadow",
|
|
12
|
+
"BlockingIssueKind",
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class UserActionType(StrEnum):
|
|
17
|
+
CLICK = "click"
|
|
18
|
+
SCROLL = "scroll"
|
|
19
|
+
TYPE = "type"
|
|
20
|
+
NONE = "none"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ProfileTimeToLive(StrEnum):
|
|
24
|
+
ONE_DAY = "one_day"
|
|
25
|
+
ONE_WEEK = "one_week"
|
|
26
|
+
ONE_MONTH = "one_month"
|
|
27
|
+
ONE_QUARTER = "one_quarter"
|
|
28
|
+
ONE_YEAR = "one_year"
|
|
29
|
+
INFINITY = "infinity"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class PlaybookStatus(StrEnum):
|
|
33
|
+
PENDING = "pending"
|
|
34
|
+
APPROVED = "approved"
|
|
35
|
+
REJECTED = "rejected"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class Status(str, Enum): # noqa: UP042 - CURRENT=None is not compatible with StrEnum
|
|
39
|
+
CURRENT = None # None for current profile/playbook
|
|
40
|
+
ARCHIVED = "archived" # archived old profiles/playbooks
|
|
41
|
+
PENDING = "pending" # new profiles/playbooks that are not approved
|
|
42
|
+
ARCHIVE_IN_PROGRESS = (
|
|
43
|
+
"archive_in_progress" # temporary status during downgrade operation
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class OperationStatus(StrEnum):
|
|
48
|
+
IN_PROGRESS = "in_progress"
|
|
49
|
+
COMPLETED = "completed"
|
|
50
|
+
FAILED = "failed"
|
|
51
|
+
CANCELLED = "cancelled"
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class RegularVsShadow(StrEnum):
|
|
55
|
+
"""
|
|
56
|
+
This enum is used to indicate the relative performance of the regular and shadow versions of the agent.
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
REGULAR_IS_BETTER = "regular_is_better"
|
|
60
|
+
REGULAR_IS_SLIGHTLY_BETTER = "regular_is_slightly_better"
|
|
61
|
+
SHADOW_IS_BETTER = "shadow_is_better"
|
|
62
|
+
SHADOW_IS_SLIGHTLY_BETTER = "shadow_is_slightly_better"
|
|
63
|
+
TIED = "tied"
|
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
"""Request/response models for POST /api/get_evaluation_overview.
|
|
2
|
+
|
|
3
|
+
The endpoint returns everything the redesigned /evaluations page needs in a
|
|
4
|
+
single round-trip so the frontend renders, never computes.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from datetime import datetime
|
|
10
|
+
from typing import Literal, Self
|
|
11
|
+
|
|
12
|
+
from pydantic import BaseModel, ConfigDict, Field, model_validator
|
|
13
|
+
|
|
14
|
+
from reflexio.models.api_schema.validators import NonEmptyStr
|
|
15
|
+
|
|
16
|
+
HeroStateLiteral = Literal["full", "early", "shadow_off", "empty"]
|
|
17
|
+
BucketLiteral = Literal["day", "week"]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class HeroBucket(BaseModel):
|
|
21
|
+
"""One point on the trend chart in the hero block.
|
|
22
|
+
|
|
23
|
+
``avg_corrections`` is the mean of ``number_of_correction_per_session``
|
|
24
|
+
across this bucket's evaluation results. Surfaced so the frontend can
|
|
25
|
+
plot a "corrections over time" line beside the success-rate trend.
|
|
26
|
+
Lower is better.
|
|
27
|
+
|
|
28
|
+
``escalation_rate`` is the fraction of sessions in this bucket whose
|
|
29
|
+
eval result had ``is_escalated=True``. Range 0.0 – 1.0. Surfaced so
|
|
30
|
+
the frontend can plot an "escalations over time" mini-trend beside
|
|
31
|
+
the absolute escalation-rate metric tile.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
ts: int
|
|
35
|
+
regular_rate: float
|
|
36
|
+
shadow_rate: float | None
|
|
37
|
+
regular_n: int
|
|
38
|
+
shadow_n: int
|
|
39
|
+
avg_corrections: float = 0.0
|
|
40
|
+
escalation_rate: float = 0.0
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class HeroBlock(BaseModel):
|
|
44
|
+
"""The "answer" band — trend + headline delta."""
|
|
45
|
+
|
|
46
|
+
state: HeroStateLiteral
|
|
47
|
+
regular_success_rate_pp: float
|
|
48
|
+
shadow_success_rate_pp: float | None
|
|
49
|
+
delta_pp: float | None
|
|
50
|
+
buckets: list[HeroBucket]
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class NumberWithDelta(BaseModel):
|
|
54
|
+
current: float
|
|
55
|
+
delta: float
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class PercentWithDelta(BaseModel):
|
|
59
|
+
current: float
|
|
60
|
+
delta_pp: float
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class ContextTile(BaseModel):
|
|
64
|
+
"""Wrapper for the four mini-tiles in the context band.
|
|
65
|
+
|
|
66
|
+
Each tile is rendered with an absolute value + a delta vs the previous
|
|
67
|
+
7d window. Percent-shaped values carry `delta_pp` (percentage points);
|
|
68
|
+
raw counts carry `delta` (absolute difference).
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
success: PercentWithDelta
|
|
72
|
+
corrections: NumberWithDelta
|
|
73
|
+
turns: NumberWithDelta
|
|
74
|
+
escalation: PercentWithDelta
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class RuleAttributionRow(BaseModel):
|
|
78
|
+
"""One row in the "rules that moved the needle" panel."""
|
|
79
|
+
|
|
80
|
+
rule_id: str
|
|
81
|
+
kind: Literal["playbook", "profile"]
|
|
82
|
+
title: str = ""
|
|
83
|
+
successes_with: int = Field(ge=0)
|
|
84
|
+
failures_with: int = Field(ge=0)
|
|
85
|
+
net_sessions: int
|
|
86
|
+
cited_session_ids: list[str] = Field(default_factory=list)
|
|
87
|
+
"""Session IDs (within the trend window) that cited this rule. The
|
|
88
|
+
frontend uses this to filter the detail band to the sessions where the
|
|
89
|
+
rule actually fired — answering 'which sessions did this rule help or
|
|
90
|
+
hurt?' without a second roundtrip."""
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class ScoreDistribution(BaseModel):
|
|
94
|
+
"""Corrections-per-session histogram, current window + baseline."""
|
|
95
|
+
|
|
96
|
+
current_bins: list[int]
|
|
97
|
+
baseline_bins: list[int]
|
|
98
|
+
labels: list[str]
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class GetEvaluationOverviewRequest(BaseModel):
|
|
102
|
+
"""Input for the overview endpoint.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
from_ts (int): Window start, unix epoch seconds.
|
|
106
|
+
to_ts (int): Window end, unix epoch seconds.
|
|
107
|
+
bucket (BucketLiteral): Granularity of the hero trend buckets.
|
|
108
|
+
include_shadow (bool): When False, skip the shadow-side aggregations
|
|
109
|
+
(cheaper) — the hero will degrade to shadow_off state.
|
|
110
|
+
"""
|
|
111
|
+
|
|
112
|
+
from_ts: int = Field(ge=0)
|
|
113
|
+
to_ts: int = Field(ge=0)
|
|
114
|
+
bucket: BucketLiteral = "week"
|
|
115
|
+
include_shadow: bool = True
|
|
116
|
+
|
|
117
|
+
@model_validator(mode="after")
|
|
118
|
+
def validate_time_window(self) -> Self:
|
|
119
|
+
"""Ensure the requested time window is ordered."""
|
|
120
|
+
if self.from_ts > self.to_ts:
|
|
121
|
+
raise ValueError("from_ts must be <= to_ts")
|
|
122
|
+
return self
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
class BraintrustTileRow(BaseModel):
|
|
126
|
+
"""One imported-scorer aggregate for the context band (Plan C-overview).
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
scorer_name (str): The Braintrust scorer name.
|
|
130
|
+
current (float): Mean value across the current window.
|
|
131
|
+
n (int): Number of imported scores backing `current`.
|
|
132
|
+
delta (float): Mean current − mean prior-window. Equals `current`
|
|
133
|
+
when no baseline (the frontend renders "no baseline").
|
|
134
|
+
"""
|
|
135
|
+
|
|
136
|
+
scorer_name: str
|
|
137
|
+
current: float
|
|
138
|
+
n: int = Field(ge=0)
|
|
139
|
+
delta: float
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
class TrendPoint(BaseModel):
|
|
143
|
+
"""One point on a grouped success-rate trend curve (F2).
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
ts (int): Unix epoch seconds — bucket start.
|
|
147
|
+
rate (float): Success rate for sessions in this bucket, [0.0, 1.0].
|
|
148
|
+
n (int): Session count backing the rate. Must be non-negative.
|
|
149
|
+
"""
|
|
150
|
+
|
|
151
|
+
ts: int
|
|
152
|
+
rate: float
|
|
153
|
+
n: int = Field(ge=0)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
class SuccessRateTrendByGroup(BaseModel):
|
|
157
|
+
"""Group-split trend data for the dashboard's dual-curve chart (F2).
|
|
158
|
+
|
|
159
|
+
Grouping is by ``Request.metadata.reflexio_retrieval_enabled``, read from
|
|
160
|
+
the first request of each session in the window. Sessions whose first
|
|
161
|
+
request has the key absent OR a non-bool value land in ``untagged``.
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
treatment (list[TrendPoint]): Curve for sessions where the first
|
|
165
|
+
request had ``metadata.reflexio_retrieval_enabled = True``.
|
|
166
|
+
control (list[TrendPoint]): Curve for ``... = False``.
|
|
167
|
+
untagged (list[TrendPoint]): Curve for sessions where the key is
|
|
168
|
+
absent or non-bool — surfaced (not silently coerced) so
|
|
169
|
+
customers can see how many of their sessions are untagged.
|
|
170
|
+
"""
|
|
171
|
+
|
|
172
|
+
treatment: list[TrendPoint] = Field(default_factory=list)
|
|
173
|
+
control: list[TrendPoint] = Field(default_factory=list)
|
|
174
|
+
untagged: list[TrendPoint] = Field(default_factory=list)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
class ShadowWinRateTrendPoint(BaseModel):
|
|
178
|
+
"""One daily bucket of per-turn shadow-comparison verdicts (F1).
|
|
179
|
+
|
|
180
|
+
Args:
|
|
181
|
+
date (str): ISO date for the bucket start (``YYYY-MM-DD``), UTC.
|
|
182
|
+
n (int): Total verdicts in this bucket.
|
|
183
|
+
wins (int): Reflexio wins.
|
|
184
|
+
losses (int): Reflexio losses.
|
|
185
|
+
ties (int): Ties.
|
|
186
|
+
"""
|
|
187
|
+
|
|
188
|
+
date: str
|
|
189
|
+
n: int = Field(ge=0)
|
|
190
|
+
wins: int = Field(ge=0)
|
|
191
|
+
losses: int = Field(ge=0)
|
|
192
|
+
ties: int = Field(ge=0)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
class ShadowWinRateTrendWindowTotal(BaseModel):
|
|
196
|
+
"""Aggregate of all shadow verdicts in the trend window (F1).
|
|
197
|
+
|
|
198
|
+
Args:
|
|
199
|
+
n (int): Total verdicts in the window.
|
|
200
|
+
wins (int): Reflexio wins.
|
|
201
|
+
losses (int): Reflexio losses.
|
|
202
|
+
ties (int): Ties.
|
|
203
|
+
win_rate (float): ``wins / n``; ``0.0`` when ``n == 0``.
|
|
204
|
+
net_win (float): ``(wins - losses) / n``; ``0.0`` when ``n == 0``.
|
|
205
|
+
"""
|
|
206
|
+
|
|
207
|
+
n: int = Field(ge=0)
|
|
208
|
+
wins: int = Field(ge=0)
|
|
209
|
+
losses: int = Field(ge=0)
|
|
210
|
+
ties: int = Field(ge=0)
|
|
211
|
+
win_rate: float = Field(ge=0.0, le=1.0)
|
|
212
|
+
net_win: float = Field(ge=-1.0, le=1.0)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
class ShadowWinRateTrend(BaseModel):
|
|
216
|
+
"""F1 shadow win-rate trend payload for the evaluation overview.
|
|
217
|
+
|
|
218
|
+
Daily buckets are UTC-aligned and presented in ascending date order.
|
|
219
|
+
``judge_prompt_version`` is echoed so the dashboard can show which
|
|
220
|
+
rubric epoch produced the numbers — verdicts from older rubrics are
|
|
221
|
+
filtered out at storage time, never silently mixed in.
|
|
222
|
+
|
|
223
|
+
Args:
|
|
224
|
+
daily (list[ShadowWinRateTrendPoint]): Daily buckets (UTC), sorted
|
|
225
|
+
ascending. Empty when no verdicts exist in the window.
|
|
226
|
+
window_total (ShadowWinRateTrendWindowTotal): Aggregate over all
|
|
227
|
+
daily buckets.
|
|
228
|
+
judge_prompt_version (str): Pinned prompt version the verdicts in
|
|
229
|
+
this payload were graded under.
|
|
230
|
+
"""
|
|
231
|
+
|
|
232
|
+
daily: list[ShadowWinRateTrendPoint] = Field(default_factory=list)
|
|
233
|
+
window_total: ShadowWinRateTrendWindowTotal = Field(
|
|
234
|
+
default_factory=lambda: ShadowWinRateTrendWindowTotal(
|
|
235
|
+
n=0,
|
|
236
|
+
wins=0,
|
|
237
|
+
losses=0,
|
|
238
|
+
ties=0,
|
|
239
|
+
win_rate=0.0,
|
|
240
|
+
net_win=0.0,
|
|
241
|
+
)
|
|
242
|
+
)
|
|
243
|
+
judge_prompt_version: str = Field(default="v1.0.0")
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
class GetEvaluationOverviewResponse(BaseModel):
|
|
247
|
+
hero: HeroBlock
|
|
248
|
+
context_tiles: ContextTile
|
|
249
|
+
rule_attribution: list[RuleAttributionRow]
|
|
250
|
+
score_distribution: ScoreDistribution
|
|
251
|
+
braintrust_tiles: list[BraintrustTileRow] = Field(default_factory=list)
|
|
252
|
+
success_rate_trend_by_group: SuccessRateTrendByGroup = Field(
|
|
253
|
+
default_factory=SuccessRateTrendByGroup
|
|
254
|
+
)
|
|
255
|
+
shadow_win_rate_trend: ShadowWinRateTrend = Field(
|
|
256
|
+
default_factory=ShadowWinRateTrend
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
# ---------------------------------------------------------------------------
|
|
261
|
+
# /api/evaluations/regenerate — replay-the-judge endpoints
|
|
262
|
+
# ---------------------------------------------------------------------------
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
class RegenerateRequest(BaseModel):
|
|
266
|
+
"""Input for POST /api/evaluations/regenerate.
|
|
267
|
+
|
|
268
|
+
Args:
|
|
269
|
+
evaluation_name (NonEmptyStr | None): Deprecated compatibility field.
|
|
270
|
+
Singleton evaluation ignores name-based selection.
|
|
271
|
+
from_ts (int): Inclusive lower bound of the window (Unix seconds).
|
|
272
|
+
to_ts (int): Inclusive upper bound of the window (Unix seconds).
|
|
273
|
+
Must be strictly greater than ``from_ts``.
|
|
274
|
+
"""
|
|
275
|
+
|
|
276
|
+
evaluation_name: NonEmptyStr | None = None
|
|
277
|
+
from_ts: int = Field(ge=0)
|
|
278
|
+
to_ts: int = Field(ge=0)
|
|
279
|
+
|
|
280
|
+
@model_validator(mode="after")
|
|
281
|
+
def _check_window(self) -> RegenerateRequest:
|
|
282
|
+
if self.from_ts >= self.to_ts:
|
|
283
|
+
raise ValueError("from_ts must be strictly before to_ts")
|
|
284
|
+
return self
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
class RegenerateStartResponse(BaseModel):
|
|
288
|
+
"""Returned by POST /api/evaluations/regenerate.
|
|
289
|
+
|
|
290
|
+
Args:
|
|
291
|
+
job_id (str): Opaque handle used to poll status or cancel.
|
|
292
|
+
total (int): Number of distinct (user, session, agent_version, source)
|
|
293
|
+
tuples the worker will replay.
|
|
294
|
+
"""
|
|
295
|
+
|
|
296
|
+
job_id: str
|
|
297
|
+
total: int
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
class RegenerateFailure(BaseModel):
|
|
301
|
+
"""One failed session in a regenerate job's failure list.
|
|
302
|
+
|
|
303
|
+
Args:
|
|
304
|
+
session_id (str): The session whose replay failed.
|
|
305
|
+
reason (str): Truncated exception message (worker boundary).
|
|
306
|
+
"""
|
|
307
|
+
|
|
308
|
+
session_id: str
|
|
309
|
+
reason: str
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
class RegenerateStatusResponse(BaseModel):
|
|
313
|
+
"""Returned by GET /api/evaluations/regenerate/{job_id}.
|
|
314
|
+
|
|
315
|
+
Args:
|
|
316
|
+
job_id (str): Opaque job handle.
|
|
317
|
+
status (Literal["running", "completed", "cancelled", "error"]):
|
|
318
|
+
Current lifecycle state. ``"completed"`` means the worker loop
|
|
319
|
+
finished iterating regardless of whether every session
|
|
320
|
+
succeeded — per-session pass/fail is in ``completed`` vs.
|
|
321
|
+
``failed``. ``"error"`` means the worker itself crashed before
|
|
322
|
+
or during iteration.
|
|
323
|
+
total (int): Total tuples queued at job creation.
|
|
324
|
+
completed (int): Number of successfully replayed tuples.
|
|
325
|
+
failed (int): Number of tuples that raised in the worker.
|
|
326
|
+
failures (list[RegenerateFailure]): Per-session failure rows, capped
|
|
327
|
+
inside the worker so the response stays small.
|
|
328
|
+
started_at (float): Unix-seconds wall-clock timestamp at job creation.
|
|
329
|
+
finished_at (float | None): Unix-seconds wall-clock timestamp at
|
|
330
|
+
worker exit; ``None`` while ``status == "running"``.
|
|
331
|
+
total_candidates (int): F3: count of distinct (session, agent_version)
|
|
332
|
+
candidate tuples discovered in the regen window BEFORE stratified
|
|
333
|
+
sampling. Defaults to 0 for jobs created before F3 shipped.
|
|
334
|
+
sampled_count (int): F3: count of candidates retained after stratified
|
|
335
|
+
sampling. Equal to total_candidates when no stratum exceeded
|
|
336
|
+
Config.eval_sample_n_per_stratum.
|
|
337
|
+
concurrency_limit (int): F3: max simultaneous worker threads. Mirrors
|
|
338
|
+
Config.eval_concurrency_limit at job start.
|
|
339
|
+
"""
|
|
340
|
+
|
|
341
|
+
job_id: str
|
|
342
|
+
status: Literal["running", "completed", "cancelled", "error"]
|
|
343
|
+
total: int
|
|
344
|
+
completed: int
|
|
345
|
+
failed: int
|
|
346
|
+
failures: list[RegenerateFailure]
|
|
347
|
+
started_at: float
|
|
348
|
+
finished_at: float | None
|
|
349
|
+
|
|
350
|
+
total_candidates: int = Field(default=0, ge=0)
|
|
351
|
+
"""F3: count of distinct (session, agent_version) candidate tuples
|
|
352
|
+
discovered in the regen window BEFORE stratified sampling."""
|
|
353
|
+
|
|
354
|
+
sampled_count: int = Field(default=0, ge=0)
|
|
355
|
+
"""F3: count of candidates retained after stratified sampling. Equal
|
|
356
|
+
to total_candidates when no stratum exceeded `Config.eval_sample_n_per_stratum`."""
|
|
357
|
+
|
|
358
|
+
concurrency_limit: int = Field(default=0, ge=0)
|
|
359
|
+
"""F3: max simultaneous worker threads. Mirrors
|
|
360
|
+
`Config.eval_concurrency_limit` at job start; reported so the dashboard
|
|
361
|
+
can show 'n_sampled / concurrency_limit' status legibly."""
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
# ---------------------------------------------------------------------------
|
|
365
|
+
# /api/evaluations/grade_on_demand — single-session click-through grading
|
|
366
|
+
# ---------------------------------------------------------------------------
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
class GradeOnDemandRequest(BaseModel):
|
|
370
|
+
"""Input for POST /api/evaluations/grade_on_demand.
|
|
371
|
+
|
|
372
|
+
Args:
|
|
373
|
+
session_id (NonEmptyStr): Target session to grade.
|
|
374
|
+
agent_version (NonEmptyStr): Agent version filter (must be set — eval
|
|
375
|
+
results are versioned).
|
|
376
|
+
evaluation_name (NonEmptyStr | None): Deprecated compatibility field.
|
|
377
|
+
Singleton evaluation ignores name-based selection.
|
|
378
|
+
"""
|
|
379
|
+
|
|
380
|
+
session_id: NonEmptyStr
|
|
381
|
+
agent_version: NonEmptyStr
|
|
382
|
+
evaluation_name: NonEmptyStr | None = None
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
class GradeOnDemandResponse(BaseModel):
|
|
386
|
+
"""Returned by POST /api/evaluations/grade_on_demand.
|
|
387
|
+
|
|
388
|
+
Args:
|
|
389
|
+
session_id (str): Echo of the requested session.
|
|
390
|
+
result_id (int | None): The eval result row id, or None if grading
|
|
391
|
+
was skipped (e.g., session not found, no interactions).
|
|
392
|
+
cached (bool): True when the response came from the 24h cache
|
|
393
|
+
window. False on a fresh grade.
|
|
394
|
+
skipped_reason (str | None): If grading was skipped, the reason
|
|
395
|
+
(e.g., "NO_REQUESTS"). None on success.
|
|
396
|
+
"""
|
|
397
|
+
|
|
398
|
+
session_id: str
|
|
399
|
+
result_id: int | None = None
|
|
400
|
+
cached: bool = False
|
|
401
|
+
skipped_reason: str | None = None
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
# ---------------------------------------------------------------------------
|
|
405
|
+
# Per-turn shadow comparison verdicts (F1)
|
|
406
|
+
# ---------------------------------------------------------------------------
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
class ShadowComparisonOutput(BaseModel):
|
|
410
|
+
"""LLM judge verdict for a per-turn Reflexio-vs-Shadow comparison (F1).
|
|
411
|
+
|
|
412
|
+
Args:
|
|
413
|
+
better_request (Literal["1", "2", "tie"]): Which side the judge
|
|
414
|
+
picked. Position is randomized per call so "1" and "2" are
|
|
415
|
+
blind to the judge; the mapping is recorded on
|
|
416
|
+
ShadowComparisonVerdict.reflexio_is_request_1.
|
|
417
|
+
is_significantly_better (bool): True if the better side is clearly
|
|
418
|
+
better; False if marginal/close-but-edges-it. Used to filter
|
|
419
|
+
the "Top 10 disagreements" widget down to actionable cases.
|
|
420
|
+
comparison_reason (str | None): 1-2 sentence rationale. Displayed
|
|
421
|
+
in the drill-down drawer.
|
|
422
|
+
"""
|
|
423
|
+
|
|
424
|
+
better_request: Literal["1", "2", "tie"]
|
|
425
|
+
is_significantly_better: bool
|
|
426
|
+
comparison_reason: str | None = None
|
|
427
|
+
|
|
428
|
+
# Dual-defense extras policy:
|
|
429
|
+
# - extra="allow" at runtime so the server doesn't crash if the LLM
|
|
430
|
+
# returns an unexpected field. We log what we recognize and ignore
|
|
431
|
+
# the rest.
|
|
432
|
+
# - additionalProperties=False in the JSON schema sent to the LLM
|
|
433
|
+
# so the structured-output constraint tells the model NOT to add
|
|
434
|
+
# extra fields in the first place.
|
|
435
|
+
# This matches the convention from the (now-removed) session-level
|
|
436
|
+
# comparison schema; do not change one without changing the other.
|
|
437
|
+
model_config = ConfigDict(
|
|
438
|
+
extra="allow",
|
|
439
|
+
json_schema_extra={"additionalProperties": False},
|
|
440
|
+
)
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
class ShadowComparisonVerdict(BaseModel):
|
|
444
|
+
"""One per-turn comparison verdict, stored in shadow_comparison_verdicts (F1).
|
|
445
|
+
|
|
446
|
+
Args:
|
|
447
|
+
verdict_id (int): Storage-assigned autoincrement primary key.
|
|
448
|
+
interaction_id (str): The interaction this verdict grades. Joins
|
|
449
|
+
to the Interaction.interaction_id for drill-down display.
|
|
450
|
+
session_id (str): The session containing the interaction.
|
|
451
|
+
agent_version (str): Pinned for trend-by-version slicing.
|
|
452
|
+
reflexio_is_request_1 (bool): Position-randomization record. True
|
|
453
|
+
when the Reflexio response was shown as Request 1 to the judge.
|
|
454
|
+
The dashboard derives win/loss/tie via:
|
|
455
|
+
derived_win = (better == "1") == reflexio_is_request_1
|
|
456
|
+
output (ShadowComparisonOutput): The judge's structured verdict.
|
|
457
|
+
judge_prompt_version (str): Semver of shadow_comparison prompt
|
|
458
|
+
used. The dashboard filters to the org's current pinned
|
|
459
|
+
version (Config.shadow_comparison_judge_prompt_version) so
|
|
460
|
+
verdicts from a prior rubric never mix into the headline.
|
|
461
|
+
created_at (datetime): When the judge call returned.
|
|
462
|
+
"""
|
|
463
|
+
|
|
464
|
+
verdict_id: int
|
|
465
|
+
interaction_id: str
|
|
466
|
+
session_id: str
|
|
467
|
+
agent_version: str
|
|
468
|
+
reflexio_is_request_1: bool
|
|
469
|
+
output: ShadowComparisonOutput
|
|
470
|
+
judge_prompt_version: NonEmptyStr
|
|
471
|
+
created_at: datetime
|
|
472
|
+
"""When the judge call returned. Storage layers assume UTC — callers
|
|
473
|
+
must pass a tz-aware datetime (typically `datetime.now(UTC)`)."""
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
class GetRecentShadowComparisonsResponse(BaseModel):
|
|
477
|
+
"""Returned by GET /api/evaluations/shadow_comparisons/recent (F1).
|
|
478
|
+
|
|
479
|
+
Args:
|
|
480
|
+
verdicts (list[ShadowComparisonVerdict]): Recent verdicts for the
|
|
481
|
+
org's current pinned ``shadow_comparison`` prompt version,
|
|
482
|
+
newest first. Capped at the ``limit`` query param (default 10,
|
|
483
|
+
max 100). Empty when the backend does not support the
|
|
484
|
+
``shadow_comparison_verdicts`` storage feature.
|
|
485
|
+
"""
|
|
486
|
+
|
|
487
|
+
verdicts: list[ShadowComparisonVerdict] = Field(default_factory=list)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# ==============================
|
|
2
|
+
# Internal data models
|
|
3
|
+
# for only internal data representation
|
|
4
|
+
# ==============================
|
|
5
|
+
from typing import NamedTuple
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel
|
|
8
|
+
|
|
9
|
+
from .service_schemas import Interaction, Request
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class RequestInteractionDataModel(BaseModel):
|
|
13
|
+
session_id: str
|
|
14
|
+
request: Request
|
|
15
|
+
interactions: list[Interaction]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class SessionDescriptor(NamedTuple):
|
|
19
|
+
"""Lightweight identifier for a session in a time window.
|
|
20
|
+
|
|
21
|
+
Used by regenerate workflows to enumerate sessions without loading
|
|
22
|
+
full Request/Interaction payloads.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
user_id: str
|
|
26
|
+
session_id: str
|
|
27
|
+
agent_version: str
|
|
28
|
+
source: str
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""Pydantic models for pending tool call review endpoints."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
9
|
+
|
|
10
|
+
from reflexio.server.services.storage.storage_base import (
|
|
11
|
+
PendingToolCallRecord,
|
|
12
|
+
PendingToolCallStatus,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class PendingToolCallResponse(BaseModel):
|
|
17
|
+
id: str
|
|
18
|
+
org_id: str
|
|
19
|
+
scope: dict[str, Any]
|
|
20
|
+
scope_hash: str
|
|
21
|
+
tool_name: str
|
|
22
|
+
dedup_key: str
|
|
23
|
+
status: PendingToolCallStatus
|
|
24
|
+
question_text: str
|
|
25
|
+
args: dict[str, Any] = Field(default_factory=dict)
|
|
26
|
+
tags: list[str] = Field(default_factory=list)
|
|
27
|
+
user_id: str | None = None
|
|
28
|
+
answer_format: str | None = None
|
|
29
|
+
result: dict[str, Any] | None = None
|
|
30
|
+
superseded_by: str | None = None
|
|
31
|
+
created_at: datetime | None = None
|
|
32
|
+
resolved_at: datetime | None = None
|
|
33
|
+
expires_at: datetime | None = None
|
|
34
|
+
cache_until: datetime | None = None
|
|
35
|
+
valid_until: datetime | None = None
|
|
36
|
+
|
|
37
|
+
@classmethod
|
|
38
|
+
def from_record(cls, record: PendingToolCallRecord) -> PendingToolCallResponse:
|
|
39
|
+
return cls(
|
|
40
|
+
id=record.id,
|
|
41
|
+
org_id=record.org_id,
|
|
42
|
+
scope=record.scope,
|
|
43
|
+
scope_hash=record.scope_hash,
|
|
44
|
+
tool_name=record.tool_name,
|
|
45
|
+
dedup_key=record.dedup_key,
|
|
46
|
+
status=record.status,
|
|
47
|
+
question_text=record.question_text,
|
|
48
|
+
args=record.args,
|
|
49
|
+
tags=record.tags,
|
|
50
|
+
user_id=record.user_id,
|
|
51
|
+
answer_format=record.answer_format,
|
|
52
|
+
result=record.result,
|
|
53
|
+
superseded_by=record.superseded_by,
|
|
54
|
+
created_at=record.created_at,
|
|
55
|
+
resolved_at=record.resolved_at,
|
|
56
|
+
expires_at=record.expires_at,
|
|
57
|
+
cache_until=record.cache_until,
|
|
58
|
+
valid_until=record.valid_until,
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class PendingToolCallListResponse(BaseModel):
|
|
63
|
+
pending_tool_calls: list[PendingToolCallResponse]
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class ResolvePendingToolCallRequest(BaseModel):
|
|
67
|
+
model_config = ConfigDict(extra="forbid")
|
|
68
|
+
|
|
69
|
+
result: dict[str, Any]
|
|
70
|
+
valid_for_seconds: int | None = Field(default=None, gt=0)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class UpdatePendingToolCallAnswerRequest(BaseModel):
|
|
74
|
+
model_config = ConfigDict(extra="forbid")
|
|
75
|
+
|
|
76
|
+
answer: str = Field(min_length=1)
|
|
77
|
+
valid_for_seconds: int | None = Field(default=None, gt=0)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class MarkPendingToolCallNotApplicableRequest(BaseModel):
|
|
81
|
+
model_config = ConfigDict(extra="forbid")
|
|
82
|
+
|
|
83
|
+
valid_for_seconds: int | None = Field(default=None, gt=0)
|