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,436 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import os
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
|
+
|
|
7
|
+
from reflexio.models.api_schema.internal_schema import RequestInteractionDataModel
|
|
8
|
+
from reflexio.models.api_schema.service_schemas import UserPlaybook
|
|
9
|
+
from reflexio.models.config_schema import PlaybookConfig
|
|
10
|
+
from reflexio.server.api_endpoints.request_context import RequestContext
|
|
11
|
+
from reflexio.server.llm.litellm_client import LiteLLMClient
|
|
12
|
+
from reflexio.server.llm.model_defaults import ModelRole, resolve_model_name
|
|
13
|
+
from reflexio.server.services.extraction.outcome import ExtractionOutcome
|
|
14
|
+
from reflexio.server.services.extraction.resumable_agent import (
|
|
15
|
+
run_resumable_extraction_agent,
|
|
16
|
+
)
|
|
17
|
+
from reflexio.server.services.extractor_config_utils import get_extractor_name
|
|
18
|
+
from reflexio.server.services.extractor_interaction_utils import (
|
|
19
|
+
get_effective_source_filter,
|
|
20
|
+
get_extractor_window_params,
|
|
21
|
+
)
|
|
22
|
+
from reflexio.server.services.operation_state_utils import OperationStateManager
|
|
23
|
+
from reflexio.server.services.playbook.playbook_service_utils import (
|
|
24
|
+
StructuredPlaybookContent,
|
|
25
|
+
StructuredPlaybookList,
|
|
26
|
+
construct_expert_playbook_extraction_messages,
|
|
27
|
+
construct_playbook_extraction_messages_from_sessions,
|
|
28
|
+
ensure_playbook_content,
|
|
29
|
+
has_expert_content,
|
|
30
|
+
)
|
|
31
|
+
from reflexio.server.services.service_utils import (
|
|
32
|
+
extract_interactions_from_request_interaction_data_models,
|
|
33
|
+
log_llm_messages,
|
|
34
|
+
)
|
|
35
|
+
from reflexio.server.site_var.site_var_manager import SiteVarManager
|
|
36
|
+
|
|
37
|
+
if TYPE_CHECKING:
|
|
38
|
+
from reflexio.server.services.playbook.playbook_generation_service import (
|
|
39
|
+
PlaybookGenerationServiceConfig,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
logger = logging.getLogger(__name__)
|
|
43
|
+
|
|
44
|
+
"""
|
|
45
|
+
Extract agent evolvement playbook entries from agent to improve its performance through self evolvement.
|
|
46
|
+
Make better decisions on what to improve next time.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class PlaybookExtractor:
|
|
51
|
+
"""
|
|
52
|
+
Extract agent evolvement playbook entries from agent interactions to improve its performance.
|
|
53
|
+
|
|
54
|
+
This class analyzes agent-user interactions and generates structured playbook entries
|
|
55
|
+
to help the agent make better decisions.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
def __init__(
|
|
59
|
+
self,
|
|
60
|
+
request_context: RequestContext,
|
|
61
|
+
llm_client: LiteLLMClient,
|
|
62
|
+
extractor_config: PlaybookConfig,
|
|
63
|
+
service_config: PlaybookGenerationServiceConfig,
|
|
64
|
+
agent_context: str,
|
|
65
|
+
):
|
|
66
|
+
"""
|
|
67
|
+
Initialize the playbook extractor.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
request_context: Request context with storage and prompt manager
|
|
71
|
+
llm_client: Unified LLM client supporting both OpenAI and Claude
|
|
72
|
+
extractor_config: Playbook configuration from YAML
|
|
73
|
+
service_config: Runtime service configuration with request data
|
|
74
|
+
agent_context: Context about the agent
|
|
75
|
+
"""
|
|
76
|
+
self.request_context: RequestContext = request_context
|
|
77
|
+
self.client: LiteLLMClient = llm_client
|
|
78
|
+
self.config: PlaybookConfig = extractor_config
|
|
79
|
+
self.service_config: PlaybookGenerationServiceConfig = service_config
|
|
80
|
+
self.agent_context: str = agent_context
|
|
81
|
+
self._last_resumable_run_id: str | None = None
|
|
82
|
+
|
|
83
|
+
# Get LLM config overrides from configuration
|
|
84
|
+
config = self.request_context.configurator.get_config()
|
|
85
|
+
llm_config = config.llm_config if config else None
|
|
86
|
+
|
|
87
|
+
# Resolve model names: config override -> site var -> auto-detect
|
|
88
|
+
model_setting = SiteVarManager().get_site_var("llm_model_setting")
|
|
89
|
+
site_var = model_setting if isinstance(model_setting, dict) else {}
|
|
90
|
+
api_key_config = self.request_context.configurator.get_config().api_key_config
|
|
91
|
+
|
|
92
|
+
self.should_run_model_name = resolve_model_name(
|
|
93
|
+
ModelRole.SHOULD_RUN,
|
|
94
|
+
site_var_value=site_var.get("should_run_model_name"),
|
|
95
|
+
config_override=llm_config.should_run_model_name if llm_config else None,
|
|
96
|
+
api_key_config=api_key_config,
|
|
97
|
+
)
|
|
98
|
+
self.default_generation_model_name = resolve_model_name(
|
|
99
|
+
ModelRole.GENERATION,
|
|
100
|
+
site_var_value=site_var.get("default_generation_model_name"),
|
|
101
|
+
config_override=llm_config.generation_model_name if llm_config else None,
|
|
102
|
+
api_key_config=api_key_config,
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
def _create_state_manager(self) -> OperationStateManager:
|
|
106
|
+
"""
|
|
107
|
+
Create an OperationStateManager for this extractor.
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
OperationStateManager configured for playbook_extractor
|
|
111
|
+
"""
|
|
112
|
+
return OperationStateManager(
|
|
113
|
+
self.request_context.storage, # type: ignore[reportArgumentType]
|
|
114
|
+
self.request_context.org_id,
|
|
115
|
+
"playbook_extractor",
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
def _get_interactions(self) -> list[RequestInteractionDataModel] | None:
|
|
119
|
+
"""
|
|
120
|
+
Get interactions for this extractor based on its config.
|
|
121
|
+
|
|
122
|
+
Handles:
|
|
123
|
+
- Getting window parameters (extractor override or global fallback)
|
|
124
|
+
- Source filtering based on extractor config
|
|
125
|
+
- Time range filtering for rerun flows
|
|
126
|
+
|
|
127
|
+
Note: Stride checking is handled upstream by BaseGenerationService._filter_configs_by_stride()
|
|
128
|
+
before the extractor is created.
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
List of request interaction data models, or None if source filter skips this extractor
|
|
132
|
+
"""
|
|
133
|
+
# Get global config values
|
|
134
|
+
config = self.request_context.configurator.get_config()
|
|
135
|
+
global_window_size = getattr(config, "window_size", None) if config else None
|
|
136
|
+
global_stride_size = getattr(config, "stride_size", None) if config else None
|
|
137
|
+
|
|
138
|
+
# Get effective window_size for this extractor
|
|
139
|
+
window_size, _ = get_extractor_window_params(
|
|
140
|
+
self.config,
|
|
141
|
+
global_window_size,
|
|
142
|
+
global_stride_size,
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
# Get effective source filter (None = get ALL sources)
|
|
146
|
+
should_skip, effective_source = get_effective_source_filter(
|
|
147
|
+
self.config,
|
|
148
|
+
self.service_config.source,
|
|
149
|
+
)
|
|
150
|
+
if should_skip:
|
|
151
|
+
return None
|
|
152
|
+
|
|
153
|
+
storage = self.request_context.storage
|
|
154
|
+
|
|
155
|
+
# Only filter by agent_version during rerun (non-auto_run) mode
|
|
156
|
+
rerun_agent_version = (
|
|
157
|
+
self.service_config.agent_version
|
|
158
|
+
if not self.service_config.auto_run
|
|
159
|
+
else None
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
# Get window interactions with time range filter
|
|
163
|
+
session_data_models, _ = storage.get_last_k_interactions_grouped( # type: ignore[reportOptionalMemberAccess]
|
|
164
|
+
user_id=self.service_config.user_id,
|
|
165
|
+
k=window_size,
|
|
166
|
+
sources=effective_source,
|
|
167
|
+
start_time=self.service_config.rerun_start_time,
|
|
168
|
+
end_time=self.service_config.rerun_end_time,
|
|
169
|
+
agent_version=rerun_agent_version,
|
|
170
|
+
)
|
|
171
|
+
return session_data_models
|
|
172
|
+
|
|
173
|
+
def _update_operation_state(
|
|
174
|
+
self, request_interaction_data_models: list[RequestInteractionDataModel]
|
|
175
|
+
) -> None:
|
|
176
|
+
"""
|
|
177
|
+
Update operation state after processing interactions.
|
|
178
|
+
|
|
179
|
+
Args:
|
|
180
|
+
request_interaction_data_models: The interactions that were processed
|
|
181
|
+
"""
|
|
182
|
+
all_interactions = extract_interactions_from_request_interaction_data_models(
|
|
183
|
+
request_interaction_data_models
|
|
184
|
+
)
|
|
185
|
+
mgr = self._create_state_manager()
|
|
186
|
+
mgr.update_extractor_bookmark(
|
|
187
|
+
extractor_name=get_extractor_name(self.config),
|
|
188
|
+
processed_interactions=all_interactions,
|
|
189
|
+
user_id=self.service_config.user_id,
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
# ===============================
|
|
193
|
+
# public methods
|
|
194
|
+
# ===============================
|
|
195
|
+
|
|
196
|
+
def run(self) -> list[UserPlaybook] | ExtractionOutcome[UserPlaybook]:
|
|
197
|
+
"""
|
|
198
|
+
Run playbook extraction on request interaction groups.
|
|
199
|
+
|
|
200
|
+
This extractor handles its own data collection:
|
|
201
|
+
1. Gets interactions based on its config (window size, source filtering)
|
|
202
|
+
2. Applies time range filter for rerun flows
|
|
203
|
+
3. Updates operation state after processing
|
|
204
|
+
|
|
205
|
+
Returns:
|
|
206
|
+
list[UserPlaybook]: List of extracted user playbook entries
|
|
207
|
+
"""
|
|
208
|
+
# Collect interactions using extractor's own window_size/stride_size settings
|
|
209
|
+
request_interaction_data_models = self._get_interactions()
|
|
210
|
+
if not request_interaction_data_models:
|
|
211
|
+
# No interactions or stride_size not met
|
|
212
|
+
return []
|
|
213
|
+
|
|
214
|
+
# should_generate check is handled at the service level (consolidated across all extractors)
|
|
215
|
+
|
|
216
|
+
user_playbooks = self.extract_playbook_entries(request_interaction_data_models)
|
|
217
|
+
|
|
218
|
+
# Update operation state after successful processing
|
|
219
|
+
if user_playbooks:
|
|
220
|
+
self._update_operation_state(request_interaction_data_models)
|
|
221
|
+
|
|
222
|
+
if self._last_resumable_run_id:
|
|
223
|
+
return ExtractionOutcome.completed(
|
|
224
|
+
user_playbooks,
|
|
225
|
+
run_id=self._last_resumable_run_id,
|
|
226
|
+
)
|
|
227
|
+
return user_playbooks
|
|
228
|
+
|
|
229
|
+
def extract_playbook_entries(
|
|
230
|
+
self, request_interaction_data_models: list[RequestInteractionDataModel]
|
|
231
|
+
) -> list[UserPlaybook]:
|
|
232
|
+
"""
|
|
233
|
+
Extract playbook entries from the given request interaction groups using structured output.
|
|
234
|
+
|
|
235
|
+
Args:
|
|
236
|
+
request_interaction_data_models: List of request interaction groups
|
|
237
|
+
|
|
238
|
+
Returns:
|
|
239
|
+
list[UserPlaybook]: List of extracted user playbook entries
|
|
240
|
+
"""
|
|
241
|
+
# Collect source interaction IDs
|
|
242
|
+
source_interaction_ids = [
|
|
243
|
+
interaction.interaction_id
|
|
244
|
+
for ridm in request_interaction_data_models
|
|
245
|
+
for interaction in ridm.interactions
|
|
246
|
+
if interaction.interaction_id
|
|
247
|
+
]
|
|
248
|
+
|
|
249
|
+
# Check if mock mode is enabled
|
|
250
|
+
if os.getenv("MOCK_LLM_RESPONSE", "").lower() == "true":
|
|
251
|
+
logger.info("Mock mode: generating mock playbook entry")
|
|
252
|
+
mock_response = self._generate_mock_playbook_list(
|
|
253
|
+
request_interaction_data_models
|
|
254
|
+
)
|
|
255
|
+
logger.debug(
|
|
256
|
+
"Mock playbook list: %d entries — %s",
|
|
257
|
+
len(mock_response.playbooks),
|
|
258
|
+
[entry.content for entry in mock_response.playbooks],
|
|
259
|
+
)
|
|
260
|
+
return self._process_structured_response_list(
|
|
261
|
+
mock_response, source_interaction_ids=source_interaction_ids
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
# Get tool_can_use from root config
|
|
265
|
+
root_config = self.request_context.configurator.get_config()
|
|
266
|
+
tool_can_use_str = ""
|
|
267
|
+
if root_config and root_config.tool_can_use:
|
|
268
|
+
tool_can_use_str = "\n".join(
|
|
269
|
+
[
|
|
270
|
+
f"{tool.tool_name}: {tool.tool_description}"
|
|
271
|
+
for tool in root_config.tool_can_use
|
|
272
|
+
]
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
# Check if interactions contain expert content — use expert extraction path
|
|
276
|
+
all_interactions = extract_interactions_from_request_interaction_data_models(
|
|
277
|
+
request_interaction_data_models
|
|
278
|
+
)
|
|
279
|
+
playbook_definition = (
|
|
280
|
+
self.config.extraction_definition_prompt.strip()
|
|
281
|
+
if self.config.extraction_definition_prompt
|
|
282
|
+
else ""
|
|
283
|
+
)
|
|
284
|
+
prompt_manager = self.request_context.prompt_manager
|
|
285
|
+
|
|
286
|
+
if has_expert_content(all_interactions):
|
|
287
|
+
logger.info("Expert content detected, using expert extraction path")
|
|
288
|
+
messages = construct_expert_playbook_extraction_messages(
|
|
289
|
+
prompt_manager=prompt_manager,
|
|
290
|
+
request_interaction_data_models=request_interaction_data_models,
|
|
291
|
+
agent_context_prompt=self.agent_context,
|
|
292
|
+
extraction_definition_prompt=playbook_definition,
|
|
293
|
+
)
|
|
294
|
+
else:
|
|
295
|
+
messages = construct_playbook_extraction_messages_from_sessions(
|
|
296
|
+
prompt_manager=prompt_manager,
|
|
297
|
+
request_interaction_data_models=request_interaction_data_models,
|
|
298
|
+
agent_context_prompt=self.agent_context,
|
|
299
|
+
extraction_definition_prompt=playbook_definition,
|
|
300
|
+
tool_can_use=tool_can_use_str,
|
|
301
|
+
)
|
|
302
|
+
log_llm_messages(logger, "Playbook extraction", messages)
|
|
303
|
+
|
|
304
|
+
result = run_resumable_extraction_agent(
|
|
305
|
+
request_context=self.request_context,
|
|
306
|
+
client=self.client,
|
|
307
|
+
extractor_kind="playbook",
|
|
308
|
+
user_id=self.service_config.user_id,
|
|
309
|
+
request_id=self.service_config.request_id,
|
|
310
|
+
agent_version=self.service_config.agent_version,
|
|
311
|
+
source=self.service_config.source,
|
|
312
|
+
request_interaction_data_models=request_interaction_data_models,
|
|
313
|
+
extractor_config=self.config,
|
|
314
|
+
service_config=self.service_config,
|
|
315
|
+
agent_context=self.agent_context,
|
|
316
|
+
messages=messages,
|
|
317
|
+
output_schema=StructuredPlaybookList,
|
|
318
|
+
log_label="Playbook extraction",
|
|
319
|
+
)
|
|
320
|
+
self._last_resumable_run_id = result.run_id
|
|
321
|
+
if not isinstance(result.output, StructuredPlaybookList):
|
|
322
|
+
logger.warning(
|
|
323
|
+
"Playbook extraction did not finish: %s",
|
|
324
|
+
result.finished_reason,
|
|
325
|
+
)
|
|
326
|
+
return []
|
|
327
|
+
return self._process_structured_response_list(
|
|
328
|
+
result.output,
|
|
329
|
+
source_interaction_ids=source_interaction_ids,
|
|
330
|
+
)
|
|
331
|
+
|
|
332
|
+
def _generate_mock_playbook_list(
|
|
333
|
+
self, request_interaction_data_models: list[RequestInteractionDataModel]
|
|
334
|
+
) -> StructuredPlaybookList:
|
|
335
|
+
"""
|
|
336
|
+
Generate mock structured playbook list for testing purposes.
|
|
337
|
+
|
|
338
|
+
Args:
|
|
339
|
+
request_interaction_data_models: List of request interaction groups
|
|
340
|
+
|
|
341
|
+
Returns:
|
|
342
|
+
StructuredPlaybookList: Mock structured playbook list with one entry
|
|
343
|
+
"""
|
|
344
|
+
# Extract flat interactions from sessions
|
|
345
|
+
interactions = extract_interactions_from_request_interaction_data_models(
|
|
346
|
+
request_interaction_data_models
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
# Generate concise playbook based on playbook definition
|
|
350
|
+
playbook_definition = (
|
|
351
|
+
self.config.extraction_definition_prompt.strip()
|
|
352
|
+
if self.config.extraction_definition_prompt
|
|
353
|
+
else "agent behavior"
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
# Build trigger from interaction context
|
|
357
|
+
trigger = "similar interactions occur"
|
|
358
|
+
if interactions:
|
|
359
|
+
last_interaction = interactions[-1]
|
|
360
|
+
if last_interaction.content:
|
|
361
|
+
content_preview = last_interaction.content[:50]
|
|
362
|
+
trigger = f"user says something like '{content_preview}'"
|
|
363
|
+
|
|
364
|
+
entry = StructuredPlaybookContent(
|
|
365
|
+
content=f"When {trigger}, improve on {playbook_definition} by adjusting the current approach.",
|
|
366
|
+
trigger=trigger,
|
|
367
|
+
)
|
|
368
|
+
return StructuredPlaybookList(playbooks=[entry])
|
|
369
|
+
|
|
370
|
+
def _process_structured_response_list(
|
|
371
|
+
self,
|
|
372
|
+
response: StructuredPlaybookList,
|
|
373
|
+
source_interaction_ids: list[int],
|
|
374
|
+
) -> list[UserPlaybook]:
|
|
375
|
+
"""
|
|
376
|
+
Process a structured playbook list from the LLM into UserPlaybook entries.
|
|
377
|
+
|
|
378
|
+
Filters out entries with no usable content and emits one UserPlaybook per
|
|
379
|
+
valid entry. All emitted entries share the same source_interaction_ids
|
|
380
|
+
because they were extracted from the same window in a single LLM call.
|
|
381
|
+
|
|
382
|
+
Args:
|
|
383
|
+
response (StructuredPlaybookList): Parsed Pydantic model from structured output
|
|
384
|
+
source_interaction_ids (list[int]): IDs of interactions used to generate these entries
|
|
385
|
+
|
|
386
|
+
Returns:
|
|
387
|
+
list[UserPlaybook]: Zero or more user playbook entries
|
|
388
|
+
"""
|
|
389
|
+
user_playbooks: list[UserPlaybook] = []
|
|
390
|
+
for entry in response.playbooks:
|
|
391
|
+
playbook = self._build_user_playbook(entry, source_interaction_ids)
|
|
392
|
+
if playbook is not None:
|
|
393
|
+
user_playbooks.append(playbook)
|
|
394
|
+
|
|
395
|
+
if not user_playbooks:
|
|
396
|
+
logger.info(
|
|
397
|
+
"No playbook entries can be generated for the given interactions"
|
|
398
|
+
)
|
|
399
|
+
else:
|
|
400
|
+
logger.info(
|
|
401
|
+
"Extracted %d playbook entries from %d interactions",
|
|
402
|
+
len(user_playbooks),
|
|
403
|
+
len(source_interaction_ids),
|
|
404
|
+
)
|
|
405
|
+
return user_playbooks
|
|
406
|
+
|
|
407
|
+
def _build_user_playbook(
|
|
408
|
+
self,
|
|
409
|
+
entry: StructuredPlaybookContent,
|
|
410
|
+
source_interaction_ids: list[int],
|
|
411
|
+
) -> UserPlaybook | None:
|
|
412
|
+
"""
|
|
413
|
+
Convert one StructuredPlaybookContent entry into a UserPlaybook.
|
|
414
|
+
|
|
415
|
+
Args:
|
|
416
|
+
entry (StructuredPlaybookContent): A single parsed playbook entry from the LLM
|
|
417
|
+
source_interaction_ids (list[int]): IDs of interactions used to generate this entry
|
|
418
|
+
|
|
419
|
+
Returns:
|
|
420
|
+
UserPlaybook | None: The constructed playbook, or None if the entry has no usable content
|
|
421
|
+
"""
|
|
422
|
+
if not entry.has_content:
|
|
423
|
+
return None
|
|
424
|
+
|
|
425
|
+
playbook_content = ensure_playbook_content(entry.content, entry)
|
|
426
|
+
|
|
427
|
+
return UserPlaybook(
|
|
428
|
+
playbook_name=get_extractor_name(self.config),
|
|
429
|
+
user_id=self.service_config.user_id,
|
|
430
|
+
agent_version=self.service_config.agent_version,
|
|
431
|
+
request_id=self.service_config.request_id,
|
|
432
|
+
content=playbook_content,
|
|
433
|
+
trigger=entry.trigger,
|
|
434
|
+
rationale=entry.rationale,
|
|
435
|
+
source_interaction_ids=source_interaction_ids,
|
|
436
|
+
)
|