evalvault 1.63.1__tar.gz → 1.64.0__tar.gz
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.
- {evalvault-1.63.1 → evalvault-1.64.0}/.env.example +18 -2
- {evalvault-1.63.1 → evalvault-1.64.0}/PKG-INFO +8 -1
- {evalvault-1.63.1 → evalvault-1.64.0}/README.md +3 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docker-compose.langfuse.yml +19 -19
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/README.ko.md +4 -0
- evalvault-1.64.0/docs/security_audit_worklog.md +482 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/pyproject.toml +6 -1
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/ops/phoenix_watch.py +19 -2
- evalvault-1.64.0/src/evalvault/adapters/inbound/api/main.py +222 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/api/routers/config.py +6 -1
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/api/routers/knowledge.py +62 -6
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/methods/external_command.py +22 -1
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/tracker/langfuse_adapter.py +28 -8
- evalvault-1.64.0/src/evalvault/adapters/outbound/tracker/log_sanitizer.py +93 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/tracker/mlflow_adapter.py +3 -2
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/tracker/phoenix_adapter.py +51 -25
- evalvault-1.64.0/src/evalvault/config/secret_manager.py +118 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/config/settings.py +141 -1
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/integration/test_cli_integration.py +5 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/integration/test_pipeline_api_contracts.py +79 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_cli.py +20 -3
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_settings.py +21 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/uv.lock +150 -4
- evalvault-1.63.1/src/evalvault/adapters/inbound/api/main.py +0 -84
- {evalvault-1.63.1 → evalvault-1.64.0}/.dockerignore +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/.github/workflows/ci.yml +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/.github/workflows/release.yml +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/.github/workflows/stale.yml +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/.gitignore +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/.pre-commit-config.yaml +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/.python-version +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/AGENTS.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/CHANGELOG.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/CLAUDE.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/CODE_OF_CONDUCT.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/CONTRIBUTING.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/Dockerfile +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/LICENSE.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/README.en.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/SECURITY.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/README.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/agent.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/client.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/config.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/main.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/memory/README.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/memory/shared/decisions.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/memory/shared/dependencies.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/memory/templates/coordinator_guide.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/memory/templates/work_log_template.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/memory_integration.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/progress.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/prompts/app_spec.txt +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/prompts/baseline.txt +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/prompts/coding_prompt.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/prompts/existing_project_prompt.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/prompts/improvement/architecture_prompt.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/prompts/improvement/base_prompt.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/prompts/improvement/coordinator_prompt.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/prompts/improvement/observability_prompt.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/prompts/initializer_prompt.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/prompts/prompt_manifest.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/prompts/system.txt +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/prompts.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/requirements.txt +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/agent/security.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/config/domains/insurance/memory.yaml +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/config/domains/insurance/terms_dictionary_en.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/config/domains/insurance/terms_dictionary_ko.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/config/methods.yaml +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/config/models.yaml +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/config/ragas_prompts_override.yaml +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/config/regressions/default.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/config/regressions/ux.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/config/stage_metric_playbook.yaml +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/config/stage_metric_thresholds.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/data/datasets/dummy_test_dataset.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/data/datasets/insurance_qa_korean.csv +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/data/datasets/insurance_qa_korean.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/data/datasets/insurance_qa_korean_2.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/data/datasets/insurance_qa_korean_3.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/data/datasets/ragas_ko90_en10.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/data/datasets/sample.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/data/datasets/visualization_20q_cluster_map.csv +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/data/datasets/visualization_20q_korean.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/data/datasets/visualization_2q_cluster_map.csv +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/data/datasets/visualization_2q_korean.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/data/kg/knowledge_graph.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/data/raw/The Complete Guide to Mastering Suno Advanced Strategies for Professional Music Generation.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/data/raw/edge_cases.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/data/raw/run_mode_full_domain_memory.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/data/raw/sample_rag_knowledge.txt +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/dataset_templates/dataset_template.csv +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/dataset_templates/dataset_template.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/dataset_templates/dataset_template.xlsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/dataset_templates/method_input_template.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docker-compose.phoenix.yaml +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docker-compose.yml +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/INDEX.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/ROADMAP.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/STATUS.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/api/adapters/inbound.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/api/adapters/outbound.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/api/config.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/api/domain/entities.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/api/domain/metrics.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/api/domain/services.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/api/ports/inbound.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/api/ports/outbound.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/architecture/open-rag-trace-collector.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/architecture/open-rag-trace-spec.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/getting-started/INSTALLATION.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/guides/AGENTS_SYSTEM_GUIDE.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/guides/CLI_MCP_PLAN.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/guides/DEV_GUIDE.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/guides/EVALVAULT_DIAGNOSTIC_PLAYBOOK.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/guides/EVALVAULT_RUN_EXCEL_SHEETS.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/guides/EVALVAULT_WORK_PLAN.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/guides/EXTERNAL_TRACE_API_SPEC.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/guides/LENA_MVP_IMPLEMENTATION_PLAN.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/guides/LENA_RAGAS_CALIBRATION_DEV_PLAN.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/guides/OPEN_RAG_TRACE_INTERNAL_ADAPTER.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/guides/OPEN_RAG_TRACE_SAMPLES.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/guides/PRD_LENA.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/guides/RAGAS_HUMAN_FEEDBACK_CALIBRATION_GUIDE.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/guides/RELEASE_CHECKLIST.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/guides/USER_GUIDE.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/guides/WEBUI_CLI_ROLLOUT_PLAN.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/guides/prompt_suggestions_design.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/guides/rag_human_feedback_calibration_implementation_plan.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/mapping/component-to-whitepaper.yaml +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/new_whitepaper/00_frontmatter.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/new_whitepaper/01_overview.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/new_whitepaper/02_architecture.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/new_whitepaper/03_data_flow.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/new_whitepaper/04_components.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/new_whitepaper/05_expert_lenses.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/new_whitepaper/06_implementation.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/new_whitepaper/07_advanced.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/new_whitepaper/08_customization.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/new_whitepaper/09_quality.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/new_whitepaper/10_performance.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/new_whitepaper/11_security.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/new_whitepaper/12_operations.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/new_whitepaper/13_standards.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/new_whitepaper/14_roadmap.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/new_whitepaper/INDEX.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/new_whitepaper/STYLE_GUIDE.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/stylesheets/extra.css +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/templates/dataset_template.csv +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/templates/dataset_template.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/templates/dataset_template.xlsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/templates/kg_template.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/templates/otel_openinference_trace_example.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/templates/ragas_dataset_example_ko90_en10.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/templates/retriever_docs_template.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/tools/generate-whitepaper.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/docs/web_ui_analysis_migration_plan.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/dummy_test_dataset.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/README.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/benchmarks/README.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/benchmarks/korean_rag/faithfulness_test.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/benchmarks/korean_rag/insurance_qa_100.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/benchmarks/korean_rag/keyword_extraction_test.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/benchmarks/korean_rag/retrieval_test.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/benchmarks/output/comparison.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/benchmarks/output/full_results.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/benchmarks/output/leaderboard.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/benchmarks/output/results_mteb.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/benchmarks/output/retrieval_result.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/benchmarks/run_korean_benchmark.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/kg_generator_demo.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/method_plugin_template/README.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/method_plugin_template/pyproject.toml +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/method_plugin_template/src/method_plugin_template/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/method_plugin_template/src/method_plugin_template/methods.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/stage_events.jsonl +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/usecase/comprehensive_workflow_test.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/usecase/insurance_eval_dataset.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/examples/usecase/output/comprehensive_report.html +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/.env.example +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/.gitignore +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/README.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/e2e/analysis-compare.spec.ts +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/e2e/analysis-lab.spec.ts +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/e2e/compare-runs.spec.ts +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/e2e/dashboard.spec.ts +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/e2e/domain-memory.spec.ts +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/e2e/evaluation-studio.spec.ts +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/e2e/knowledge-base.spec.ts +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/e2e/mocks/intents.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/e2e/mocks/run_details.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/e2e/mocks/runs.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/e2e/run-details.spec.ts +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/eslint.config.js +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/index.html +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/package-lock.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/package.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/playwright.config.ts +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/public/vite.svg +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/App.css +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/App.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/assets/react.svg +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/components/AnalysisNodeOutputs.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/components/InsightSpacePanel.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/components/Layout.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/components/MarkdownContent.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/components/PrioritySummaryPanel.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/components/SpaceLegend.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/components/SpacePlot2D.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/components/SpacePlot3D.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/components/StatusBadge.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/components/VirtualizedText.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/config/ui.ts +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/config.ts +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/hooks/useInsightSpace.ts +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/index.css +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/main.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/pages/AnalysisCompareView.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/pages/AnalysisLab.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/pages/AnalysisResultView.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/pages/CompareRuns.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/pages/ComprehensiveAnalysis.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/pages/CustomerReport.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/pages/Dashboard.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/pages/DomainMemory.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/pages/EvaluationStudio.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/pages/KnowledgeBase.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/pages/RunDetails.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/pages/Settings.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/pages/Visualization.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/pages/VisualizationHome.tsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/services/api.ts +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/types/plotly.d.ts +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/utils/format.ts +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/utils/phoenix.ts +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/utils/runAnalytics.ts +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/utils/score.ts +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/src/utils/summaryMetrics.ts +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/tailwind.config.js +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/tsconfig.app.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/tsconfig.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/tsconfig.node.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/frontend/vite.config.ts +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/mkdocs.yml +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/package-lock.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/prompts/system_override.txt +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/.gitkeep +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/README.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/artifacts/comparison_0aa9fab0_f1287e90/final_output.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/artifacts/comparison_0aa9fab0_f1287e90/index.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/artifacts/comparison_0aa9fab0_f1287e90/load_runs.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/artifacts/comparison_0aa9fab0_f1287e90/report.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/artifacts/comparison_0aa9fab0_f1287e90/run_change_detection.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/artifacts/comparison_0aa9fab0_f1287e90/run_metric_comparison.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/artifacts/comparison_8f825b22_4516d358/final_output.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/artifacts/comparison_8f825b22_4516d358/index.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/artifacts/comparison_8f825b22_4516d358/load_runs.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/artifacts/comparison_8f825b22_4516d358/report.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/artifacts/comparison_8f825b22_4516d358/run_change_detection.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/artifacts/comparison_8f825b22_4516d358/run_metric_comparison.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/artifacts/comparison_f1287e90_8f825b22/final_output.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/artifacts/comparison_f1287e90_8f825b22/index.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/artifacts/comparison_f1287e90_8f825b22/load_runs.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/artifacts/comparison_f1287e90_8f825b22/report.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/artifacts/comparison_f1287e90_8f825b22/run_change_detection.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/artifacts/comparison_f1287e90_8f825b22/run_metric_comparison.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/comparison_0aa9fab0_9fbf4776.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/comparison_0aa9fab0_9fbf4776.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/comparison_0aa9fab0_f1287e90.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/comparison_0aa9fab0_f1287e90.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/comparison_8f825b22_4516d358.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/comparison_8f825b22_4516d358.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/comparison_9fbf4776_a491fa0e.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/comparison_9fbf4776_a491fa0e.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/comparison_f1287e90_8f825b22.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/comparison/comparison_f1287e90_8f825b22.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/debug_report_r1_smoke.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/debug_report_r2_graphrag.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/debug_report_r2_graphrag_openai.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/debug_report_r3_bm25.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/debug_report_r3_bm25_langfuse3.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/debug_report_r3_dense_faiss.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/improvement_1d91a667-4288-4742-be3a-a8f5310c5140.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/r2_graphrag_openai_stage_events.jsonl +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/r2_graphrag_openai_stage_report.txt +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/r2_graphrag_stage_events.jsonl +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/r2_graphrag_stage_report.txt +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/r3_bm25_langfuse2_stage_events.jsonl +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/r3_bm25_langfuse3_stage_events.jsonl +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/r3_bm25_langfuse_stage_events.jsonl +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/r3_bm25_phoenix_stage_events.jsonl +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/r3_bm25_stage_events.jsonl +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/r3_bm25_stage_report.txt +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/r3_dense_faiss_stage_events.jsonl +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/r3_dense_faiss_stage_report.txt +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/retrieval_benchmark_smoke_precision.csv +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/retrieval_benchmark_smoke_precision_graphrag.csv +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/reports/retrieval_benchmark_smoke_precision_multi.csv +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/benchmark/download_kmmlu.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/dev/open_rag_trace_demo.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/dev/open_rag_trace_integration_template.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/dev/otel-collector-config.yaml +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/dev/start_web_ui_with_phoenix.sh +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/dev/validate_open_rag_trace.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/dev_seed_pipeline_results.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/docs/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/docs/analyzer/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/docs/analyzer/ast_scanner.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/docs/analyzer/confidence_scorer.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/docs/analyzer/graph_builder.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/docs/analyzer/side_effect_detector.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/docs/generate_api_docs.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/docs/models/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/docs/models/schema.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/docs/renderer/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/docs/renderer/html_generator.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/perf/backfill_langfuse_trace_url.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/perf/r3_dense_smoke.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/perf/r3_evalvault_run_dataset.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/perf/r3_retriever_docs.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/perf/r3_smoke_real.jsonl +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/perf/r3_stage_events_sample.jsonl +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/pipeline_template_inspect.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/reports/generate_release_notes.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/run_with_timeout.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/test_full_evaluation.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/tests/run_regressions.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/tests/run_retriever_stage_report_smoke.sh +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/validate_tutorials.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/verify_ragas_compliance.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/scripts/verify_workflows.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/api/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/api/adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/api/routers/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/api/routers/benchmark.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/api/routers/domain.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/api/routers/pipeline.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/api/routers/runs.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/app.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/agent.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/analyze.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/api.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/benchmark.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/calibrate.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/config.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/debug.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/domain.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/experiment.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/gate.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/generate.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/history.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/init.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/kg.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/langfuse.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/method.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/phoenix.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/pipeline.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/prompts.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/run.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/run_helpers.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/commands/stage.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/utils/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/utils/analysis_io.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/utils/console.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/utils/errors.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/utils/formatters.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/utils/options.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/utils/presets.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/utils/progress.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/cli/utils/validators.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/mcp/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/mcp/schemas.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/inbound/mcp/tools.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/analysis_report_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/base_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/bm25_searcher_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/causal_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/causal_analyzer_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/common.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/comparison_report_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/data_loader_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/detailed_report_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/diagnostic_playbook_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/embedding_analyzer_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/embedding_distribution_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/embedding_searcher_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/hybrid_rrf_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/hybrid_weighted_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/hypothesis_generator_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/llm_report_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/low_performer_extractor_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/model_analyzer_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/morpheme_analyzer_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/morpheme_quality_checker_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/network_analyzer_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/nlp_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/nlp_analyzer_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/pattern_detector_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/pipeline_factory.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/pipeline_helpers.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/priority_summary_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/ragas_evaluator_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/retrieval_analyzer_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/retrieval_benchmark_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/retrieval_quality_checker_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/root_cause_analyzer_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/run_analyzer_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/run_change_detector_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/run_comparator_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/run_loader_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/run_metric_comparator_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/search_comparator_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/statistical_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/statistical_analyzer_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/statistical_comparator_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/summary_report_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/time_series_analyzer_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/timeseries_advanced_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/trend_detector_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/analysis/verification_report_module.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/benchmark/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/benchmark/lm_eval_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/cache/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/cache/hybrid_cache.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/cache/memory_cache.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/dataset/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/dataset/base.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/dataset/csv_loader.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/dataset/excel_loader.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/dataset/json_loader.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/dataset/loader_factory.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/dataset/method_input_loader.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/dataset/streaming_loader.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/dataset/templates.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/dataset/thresholds.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/debug/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/debug/report_renderer.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/documents/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/documents/ocr/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/documents/ocr/paddleocr_backend.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/documents/pdf_extractor.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/documents/versioned_loader.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/domain_memory/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/domain_memory/domain_memory_schema.sql +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/domain_memory/sqlite_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/improvement/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/improvement/insight_generator.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/improvement/pattern_detector.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/improvement/playbook_loader.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/improvement/stage_metric_playbook_loader.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/kg/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/kg/graph_rag_retriever.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/kg/networkx_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/kg/parallel_kg_builder.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/kg/query_strategies.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/llm/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/llm/anthropic_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/llm/azure_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/llm/base.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/llm/factory.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/llm/instructor_factory.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/llm/llm_relation_augmenter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/llm/ollama_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/llm/openai_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/llm/token_aware_chat.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/llm/vllm_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/methods/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/methods/baseline_oracle.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/methods/registry.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/nlp/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/nlp/korean/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/nlp/korean/bm25_retriever.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/nlp/korean/dense_retriever.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/nlp/korean/document_chunker.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/nlp/korean/hybrid_retriever.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/nlp/korean/kiwi_tokenizer.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/nlp/korean/korean_evaluation.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/nlp/korean/korean_stopwords.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/nlp/korean/toolkit.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/nlp/korean/toolkit_factory.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/phoenix/sync_service.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/report/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/report/dashboard_generator.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/report/llm_report_generator.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/report/markdown_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/storage/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/storage/base_sql.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/storage/benchmark_storage_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/storage/postgres_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/storage/postgres_schema.sql +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/storage/schema.sql +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/storage/sqlite_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/tracer/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/tracer/open_rag_log_handler.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/tracer/open_rag_trace_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/tracer/open_rag_trace_decorators.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/tracer/open_rag_trace_helpers.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/tracer/phoenix_tracer_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/adapters/outbound/tracker/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/config/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/config/agent_types.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/config/domain_config.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/config/instrumentation.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/config/langfuse_support.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/config/model_config.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/config/phoenix_support.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/config/playbooks/improvement_playbook.yaml +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/debug_ragas.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/debug_ragas_real.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/entities/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/entities/analysis.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/entities/analysis_pipeline.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/entities/benchmark.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/entities/benchmark_run.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/entities/dataset.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/entities/debug.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/entities/experiment.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/entities/feedback.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/entities/improvement.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/entities/kg.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/entities/memory.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/entities/method.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/entities/prompt.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/entities/prompt_suggestion.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/entities/rag_trace.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/entities/result.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/entities/stage.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/metrics/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/metrics/analysis_registry.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/metrics/confidence.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/metrics/contextual_relevancy.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/metrics/entity_preservation.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/metrics/insurance.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/metrics/no_answer.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/metrics/registry.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/metrics/retrieval_rank.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/metrics/terms_dictionary.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/metrics/text_match.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/analysis_service.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/async_batch_executor.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/batch_executor.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/benchmark_report_service.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/benchmark_runner.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/benchmark_service.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/cache_metrics.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/cluster_map_builder.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/dataset_preprocessor.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/debug_report_service.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/document_chunker.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/document_versioning.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/domain_learning_hook.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/embedding_overlay.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/entity_extractor.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/evaluator.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/experiment_comparator.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/experiment_manager.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/experiment_reporter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/experiment_repository.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/experiment_statistics.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/holdout_splitter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/improvement_guide_service.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/intent_classifier.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/kg_generator.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/memory_aware_evaluator.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/memory_based_analysis.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/method_runner.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/pipeline_orchestrator.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/pipeline_template_registry.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/prompt_candidate_service.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/prompt_manifest.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/prompt_registry.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/prompt_scoring_service.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/prompt_status.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/prompt_suggestion_reporter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/ragas_prompt_overrides.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/retrieval_metrics.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/retriever_context.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/satisfaction_calibration_service.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/stage_event_builder.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/stage_metric_guide_service.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/stage_metric_service.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/stage_summary_service.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/synthetic_qa_generator.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/testset_generator.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/threshold_profiles.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/unified_report_service.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/domain/services/visual_space_service.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/mkdocs_helpers.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/inbound/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/inbound/analysis_pipeline_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/inbound/evaluator_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/inbound/learning_hook_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/inbound/web_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/analysis_cache_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/analysis_module_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/analysis_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/benchmark_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/causal_analysis_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/dataset_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/domain_memory_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/embedding_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/improvement_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/intent_classifier_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/korean_nlp_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/llm_factory_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/llm_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/method_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/nlp_analysis_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/relation_augmenter_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/report_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/stage_storage_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/storage_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/tracer_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/ports/outbound/tracker_port.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/reports/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/reports/release_notes.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/scripts/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/src/evalvault/scripts/regression_runner.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/conftest.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/README.md +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/benchmark/retrieval_ground_truth_min.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/benchmark/retrieval_ground_truth_multi.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/e2e/auto_insurance_qa_korean_full.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/e2e/comprehensive_dataset.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/e2e/edge_cases.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/e2e/edge_cases.xlsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/e2e/evaluation_test_sample.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/e2e/graphrag_retriever_docs.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/e2e/graphrag_smoke.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/e2e/insurance_document.txt +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/e2e/insurance_qa_english.csv +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/e2e/insurance_qa_english.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/e2e/insurance_qa_english.xlsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/e2e/insurance_qa_korean.csv +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/e2e/insurance_qa_korean.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/e2e/insurance_qa_korean.xlsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/e2e/insurance_qa_korean_versioned_pdf.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/e2e/run_mode_full_domain_memory.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/e2e/run_mode_simple.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/e2e/summary_eval_minimal.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/kg/minimal_graph.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/sample_dataset.csv +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/sample_dataset.json +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/fixtures/sample_dataset.xlsx +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/integration/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/integration/benchmark/test_benchmark_service_integration.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/integration/conftest.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/integration/test_data_flow.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/integration/test_e2e_scenarios.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/integration/test_evaluation_flow.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/integration/test_full_workflow.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/integration/test_langfuse_flow.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/integration/test_phoenix_flow.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/integration/test_storage_flow.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/integration/test_summary_eval_fixture.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/optional_deps.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/adapters/inbound/mcp/test_execute_tools.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/adapters/inbound/mcp/test_read_tools.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/adapters/outbound/documents/test_pdf_extractor.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/adapters/outbound/documents/test_versioned_loader.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/adapters/outbound/improvement/__init__.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/adapters/outbound/improvement/test_insight_generator.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/adapters/outbound/improvement/test_pattern_detector.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/adapters/outbound/improvement/test_playbook_loader.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/adapters/outbound/improvement/test_stage_metric_playbook_loader.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/adapters/outbound/kg/test_graph_rag_retriever.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/adapters/outbound/kg/test_parallel_kg_builder.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/adapters/outbound/storage/test_benchmark_storage_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/config/test_phoenix_support.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/conftest.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/metrics/test_analysis_metric_registry.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/metrics/test_confidence.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/metrics/test_contextual_relevancy.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/metrics/test_entity_preservation.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/metrics/test_metric_registry.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/metrics/test_no_answer.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/metrics/test_retrieval_rank.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/metrics/test_text_match.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/services/test_cache_metrics.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/services/test_claim_level.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/services/test_dataset_preprocessor.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/services/test_document_versioning.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/services/test_evaluator_comprehensive.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/services/test_holdout_splitter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/services/test_improvement_guide_service.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/services/test_retrieval_metrics.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/services/test_retriever_context.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/services/test_stage_event_builder.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/services/test_stage_metric_guide_service.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/services/test_synthetic_qa_generator.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/test_embedding_overlay.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/test_prompt_manifest.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/domain/test_prompt_status.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/reports/test_release_notes.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/scripts/test_regression_runner.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_agent_types.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_analysis_entities.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_analysis_modules.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_analysis_pipeline.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_analysis_service.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_anthropic_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_async_batch_executor.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_azure_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_benchmark_helpers.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_benchmark_runner.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_causal_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_cli_domain.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_cli_init.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_cli_progress.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_cli_utils.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_data_loaders.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_domain_config.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_domain_memory.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_entities.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_entities_kg.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_entity_extractor.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_evaluator.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_experiment.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_hybrid_cache.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_instrumentation.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_insurance_metric.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_intent_classifier.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_kg_generator.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_kg_networkx.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_kiwi_tokenizer.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_kiwi_warning_suppression.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_korean_dense.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_korean_evaluation.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_korean_retrieval.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_langfuse_tracker.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_llm_relation_augmenter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_lm_eval_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_markdown_report.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_memory_cache.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_memory_services.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_method_plugins.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_mlflow_tracker.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_model_config.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_nlp_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_nlp_entities.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_ollama_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_openai_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_phoenix_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_pipeline_orchestrator.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_ports.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_postgres_storage.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_prompt_candidate_service.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_rag_trace_entities.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_run_memory_helpers.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_run_mode_fixtures.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_sqlite_storage.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_stage_cli.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_stage_metric_service.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_stage_storage.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_stage_summary_service.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_statistical_adapter.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_streaming_loader.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_summary_eval_fixture.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_testset_generator.py +0 -0
- {evalvault-1.63.1 → evalvault-1.64.0}/tests/unit/test_web_adapter.py +0 -0
|
@@ -39,6 +39,12 @@ OLLAMA_TIMEOUT=120
|
|
|
39
39
|
OPENAI_API_KEY=sk-your-api-key-here
|
|
40
40
|
# OPENAI_BASE_URL=https://api.openai.com/v1 # 커스텀 엔드포인트 (선택)
|
|
41
41
|
|
|
42
|
+
# ================================================
|
|
43
|
+
# Secret Manager 연동 (선택)
|
|
44
|
+
# ================================================
|
|
45
|
+
# SECRET_PROVIDER=env|aws|gcp|vault
|
|
46
|
+
# 예시: OPENAI_API_KEY=secret://OPENAI_TOKEN
|
|
47
|
+
|
|
42
48
|
# ================================================
|
|
43
49
|
# vLLM 설정 (OpenAI-compatible)
|
|
44
50
|
# ================================================
|
|
@@ -91,8 +97,18 @@ OPENAI_API_KEY=sk-your-api-key-here
|
|
|
91
97
|
# POSTGRES_PASSWORD=your-password
|
|
92
98
|
|
|
93
99
|
# ================================================
|
|
94
|
-
# CORS / Frontend 설정
|
|
95
|
-
# ================================================
|
|
100
|
+
# API 인증 / CORS / Frontend 설정
|
|
101
|
+
# ================================================
|
|
102
|
+
# API 토큰(콤마 구분). 비워두면 인증 비활성화
|
|
103
|
+
# API_AUTH_TOKENS=token1,token2
|
|
104
|
+
# Knowledge API 읽기/쓰기 토큰(콤마 구분). 비워두면 추가 제어 비활성화
|
|
105
|
+
# KNOWLEDGE_READ_TOKENS=read-token
|
|
106
|
+
# KNOWLEDGE_WRITE_TOKENS=write-token
|
|
107
|
+
# 레이트리밋 (기본 비활성화)
|
|
108
|
+
# RATE_LIMIT_ENABLED=false
|
|
109
|
+
# RATE_LIMIT_REQUESTS=120
|
|
110
|
+
# RATE_LIMIT_WINDOW_SECONDS=60
|
|
111
|
+
# RATE_LIMIT_BLOCK_THRESHOLD=10
|
|
96
112
|
# React 프론트에서 API를 직접 호출할 때만 필요
|
|
97
113
|
# CORS_ORIGINS=http://localhost:5173,http://127.0.0.1:5173
|
|
98
114
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: evalvault
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.64.0
|
|
4
4
|
Summary: RAG evaluation system using Ragas with Phoenix/Langfuse tracing
|
|
5
5
|
Project-URL: Homepage, https://github.com/ntts9990/EvalVault
|
|
6
6
|
Project-URL: Documentation, https://github.com/ntts9990/EvalVault#readme
|
|
@@ -111,6 +111,10 @@ Requires-Dist: opentelemetry-exporter-otlp>=1.20.0; extra == 'phoenix'
|
|
|
111
111
|
Requires-Dist: opentelemetry-sdk>=1.20.0; extra == 'phoenix'
|
|
112
112
|
Provides-Extra: postgres
|
|
113
113
|
Requires-Dist: psycopg[binary]>=3.0.0; extra == 'postgres'
|
|
114
|
+
Provides-Extra: secrets
|
|
115
|
+
Requires-Dist: boto3; extra == 'secrets'
|
|
116
|
+
Requires-Dist: google-cloud-secret-manager; extra == 'secrets'
|
|
117
|
+
Requires-Dist: hvac; extra == 'secrets'
|
|
114
118
|
Provides-Extra: timeseries
|
|
115
119
|
Requires-Dist: aeon>=1.3.0; extra == 'timeseries'
|
|
116
120
|
Requires-Dist: numba>=0.55.0; extra == 'timeseries'
|
|
@@ -175,6 +179,9 @@ uv run evalvault run --mode simple tests/fixtures/e2e/insurance_qa_korean.json \
|
|
|
175
179
|
--auto-analyze
|
|
176
180
|
```
|
|
177
181
|
|
|
182
|
+
- API 인증을 쓰려면 `.env`에 `API_AUTH_TOKENS`를 설정하세요.
|
|
183
|
+
- `secret://` 참조를 쓰면 `SECRET_PROVIDER`와 `--extra secrets`가 필요합니다.
|
|
184
|
+
- 레이트리밋은 `RATE_LIMIT_ENABLED`로 활성화합니다.
|
|
178
185
|
- 결과는 기본 DB(`data/db/evalvault.db`)에 저장되어 `history`, Web UI, 비교 분석에서 재사용됩니다.
|
|
179
186
|
- `--db`를 생략해도 기본 경로로 저장되며, 모든 데이터가 자동으로 엑셀로 내보내집니다.
|
|
180
187
|
- `--auto-analyze`는 요약 리포트 + 모듈별 아티팩트를 함께 생성합니다.
|
|
@@ -56,6 +56,9 @@ uv run evalvault run --mode simple tests/fixtures/e2e/insurance_qa_korean.json \
|
|
|
56
56
|
--auto-analyze
|
|
57
57
|
```
|
|
58
58
|
|
|
59
|
+
- API 인증을 쓰려면 `.env`에 `API_AUTH_TOKENS`를 설정하세요.
|
|
60
|
+
- `secret://` 참조를 쓰면 `SECRET_PROVIDER`와 `--extra secrets`가 필요합니다.
|
|
61
|
+
- 레이트리밋은 `RATE_LIMIT_ENABLED`로 활성화합니다.
|
|
59
62
|
- 결과는 기본 DB(`data/db/evalvault.db`)에 저장되어 `history`, Web UI, 비교 분석에서 재사용됩니다.
|
|
60
63
|
- `--db`를 생략해도 기본 경로로 저장되며, 모든 데이터가 자동으로 엑셀로 내보내집니다.
|
|
61
64
|
- `--auto-analyze`는 요약 리포트 + 모듈별 아티팩트를 함께 생성합니다.
|
|
@@ -20,28 +20,28 @@ services:
|
|
|
20
20
|
- 127.0.0.1:3030:3030
|
|
21
21
|
environment: &langfuse-worker-env
|
|
22
22
|
NEXTAUTH_URL: ${NEXTAUTH_URL:-http://localhost:3000}
|
|
23
|
-
DATABASE_URL: ${DATABASE_URL
|
|
24
|
-
SALT: ${SALT
|
|
25
|
-
ENCRYPTION_KEY: ${ENCRYPTION_KEY
|
|
23
|
+
DATABASE_URL: ${DATABASE_URL?} # CHANGEME
|
|
24
|
+
SALT: ${SALT?} # CHANGEME
|
|
25
|
+
ENCRYPTION_KEY: ${ENCRYPTION_KEY?} # CHANGEME: generate via `openssl rand -hex 32`
|
|
26
26
|
TELEMETRY_ENABLED: ${TELEMETRY_ENABLED:-true}
|
|
27
27
|
LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES: ${LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES:-true}
|
|
28
28
|
CLICKHOUSE_MIGRATION_URL: ${CLICKHOUSE_MIGRATION_URL:-clickhouse://clickhouse:9000}
|
|
29
29
|
CLICKHOUSE_URL: ${CLICKHOUSE_URL:-http://clickhouse:8123}
|
|
30
|
-
CLICKHOUSE_USER: ${CLICKHOUSE_USER
|
|
31
|
-
CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD
|
|
30
|
+
CLICKHOUSE_USER: ${CLICKHOUSE_USER?}
|
|
31
|
+
CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD?} # CHANGEME
|
|
32
32
|
CLICKHOUSE_CLUSTER_ENABLED: ${CLICKHOUSE_CLUSTER_ENABLED:-false}
|
|
33
33
|
LANGFUSE_USE_AZURE_BLOB: ${LANGFUSE_USE_AZURE_BLOB:-false}
|
|
34
34
|
LANGFUSE_S3_EVENT_UPLOAD_BUCKET: ${LANGFUSE_S3_EVENT_UPLOAD_BUCKET:-langfuse}
|
|
35
35
|
LANGFUSE_S3_EVENT_UPLOAD_REGION: ${LANGFUSE_S3_EVENT_UPLOAD_REGION:-auto}
|
|
36
|
-
LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID: ${LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID
|
|
37
|
-
LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY: ${LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY
|
|
36
|
+
LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID: ${LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID?}
|
|
37
|
+
LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY: ${LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY?} # CHANGEME
|
|
38
38
|
LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT: ${LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT:-http://minio:9000}
|
|
39
39
|
LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE: ${LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE:-true}
|
|
40
40
|
LANGFUSE_S3_EVENT_UPLOAD_PREFIX: ${LANGFUSE_S3_EVENT_UPLOAD_PREFIX:-events/}
|
|
41
41
|
LANGFUSE_S3_MEDIA_UPLOAD_BUCKET: ${LANGFUSE_S3_MEDIA_UPLOAD_BUCKET:-langfuse}
|
|
42
42
|
LANGFUSE_S3_MEDIA_UPLOAD_REGION: ${LANGFUSE_S3_MEDIA_UPLOAD_REGION:-auto}
|
|
43
|
-
LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID: ${LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID
|
|
44
|
-
LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY: ${LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY
|
|
43
|
+
LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID: ${LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID?}
|
|
44
|
+
LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY: ${LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY?} # CHANGEME
|
|
45
45
|
LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT: ${LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT:-http://localhost:9090}
|
|
46
46
|
LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE: ${LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE:-true}
|
|
47
47
|
LANGFUSE_S3_MEDIA_UPLOAD_PREFIX: ${LANGFUSE_S3_MEDIA_UPLOAD_PREFIX:-media/}
|
|
@@ -51,14 +51,14 @@ services:
|
|
|
51
51
|
LANGFUSE_S3_BATCH_EXPORT_REGION: ${LANGFUSE_S3_BATCH_EXPORT_REGION:-auto}
|
|
52
52
|
LANGFUSE_S3_BATCH_EXPORT_ENDPOINT: ${LANGFUSE_S3_BATCH_EXPORT_ENDPOINT:-http://minio:9000}
|
|
53
53
|
LANGFUSE_S3_BATCH_EXPORT_EXTERNAL_ENDPOINT: ${LANGFUSE_S3_BATCH_EXPORT_EXTERNAL_ENDPOINT:-http://localhost:9090}
|
|
54
|
-
LANGFUSE_S3_BATCH_EXPORT_ACCESS_KEY_ID: ${LANGFUSE_S3_BATCH_EXPORT_ACCESS_KEY_ID
|
|
55
|
-
LANGFUSE_S3_BATCH_EXPORT_SECRET_ACCESS_KEY: ${LANGFUSE_S3_BATCH_EXPORT_SECRET_ACCESS_KEY
|
|
54
|
+
LANGFUSE_S3_BATCH_EXPORT_ACCESS_KEY_ID: ${LANGFUSE_S3_BATCH_EXPORT_ACCESS_KEY_ID?}
|
|
55
|
+
LANGFUSE_S3_BATCH_EXPORT_SECRET_ACCESS_KEY: ${LANGFUSE_S3_BATCH_EXPORT_SECRET_ACCESS_KEY?} # CHANGEME
|
|
56
56
|
LANGFUSE_S3_BATCH_EXPORT_FORCE_PATH_STYLE: ${LANGFUSE_S3_BATCH_EXPORT_FORCE_PATH_STYLE:-true}
|
|
57
57
|
LANGFUSE_INGESTION_QUEUE_DELAY_MS: ${LANGFUSE_INGESTION_QUEUE_DELAY_MS:-}
|
|
58
58
|
LANGFUSE_INGESTION_CLICKHOUSE_WRITE_INTERVAL_MS: ${LANGFUSE_INGESTION_CLICKHOUSE_WRITE_INTERVAL_MS:-}
|
|
59
59
|
REDIS_HOST: ${REDIS_HOST:-redis}
|
|
60
60
|
REDIS_PORT: ${REDIS_PORT:-6379}
|
|
61
|
-
REDIS_AUTH: ${REDIS_AUTH
|
|
61
|
+
REDIS_AUTH: ${REDIS_AUTH?} # CHANGEME
|
|
62
62
|
REDIS_TLS_ENABLED: ${REDIS_TLS_ENABLED:-false}
|
|
63
63
|
REDIS_TLS_CA: ${REDIS_TLS_CA:-/certs/ca.crt}
|
|
64
64
|
REDIS_TLS_CERT: ${REDIS_TLS_CERT:-/certs/redis.crt}
|
|
@@ -74,7 +74,7 @@ services:
|
|
|
74
74
|
- 3000:3000
|
|
75
75
|
environment:
|
|
76
76
|
<<: *langfuse-worker-env
|
|
77
|
-
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET
|
|
77
|
+
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET?} # CHANGEME
|
|
78
78
|
LANGFUSE_INIT_ORG_ID: ${LANGFUSE_INIT_ORG_ID:-}
|
|
79
79
|
LANGFUSE_INIT_ORG_NAME: ${LANGFUSE_INIT_ORG_NAME:-}
|
|
80
80
|
LANGFUSE_INIT_PROJECT_ID: ${LANGFUSE_INIT_PROJECT_ID:-}
|
|
@@ -91,8 +91,8 @@ services:
|
|
|
91
91
|
user: "101:101"
|
|
92
92
|
environment:
|
|
93
93
|
CLICKHOUSE_DB: default
|
|
94
|
-
CLICKHOUSE_USER: ${CLICKHOUSE_USER
|
|
95
|
-
CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD
|
|
94
|
+
CLICKHOUSE_USER: ${CLICKHOUSE_USER?}
|
|
95
|
+
CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD?} # CHANGEME
|
|
96
96
|
volumes:
|
|
97
97
|
- langfuse_clickhouse_data:/var/lib/clickhouse
|
|
98
98
|
- langfuse_clickhouse_logs:/var/log/clickhouse-server
|
|
@@ -111,8 +111,8 @@ services:
|
|
|
111
111
|
# create the 'langfuse' bucket before starting the service
|
|
112
112
|
command: -c 'mkdir -p /data/langfuse && minio server --address ":9000" --console-address ":9001" /data'
|
|
113
113
|
environment:
|
|
114
|
-
MINIO_ROOT_USER: ${MINIO_ROOT_USER
|
|
115
|
-
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD
|
|
114
|
+
MINIO_ROOT_USER: ${MINIO_ROOT_USER?}
|
|
115
|
+
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD?} # CHANGEME
|
|
116
116
|
ports:
|
|
117
117
|
- 9090:9000
|
|
118
118
|
- 127.0.0.1:9091:9001
|
|
@@ -130,7 +130,7 @@ services:
|
|
|
130
130
|
restart: always
|
|
131
131
|
# CHANGEME: row below to secure redis password
|
|
132
132
|
command: >
|
|
133
|
-
--requirepass ${REDIS_AUTH
|
|
133
|
+
--requirepass ${REDIS_AUTH?}
|
|
134
134
|
--maxmemory-policy noeviction
|
|
135
135
|
# ports removed to avoid conflict with local redis
|
|
136
136
|
healthcheck:
|
|
@@ -149,7 +149,7 @@ services:
|
|
|
149
149
|
retries: 10
|
|
150
150
|
environment:
|
|
151
151
|
POSTGRES_USER: ${POSTGRES_USER:-postgres}
|
|
152
|
-
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD
|
|
152
|
+
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD?} # CHANGEME
|
|
153
153
|
POSTGRES_DB: ${POSTGRES_DB:-postgres}
|
|
154
154
|
TZ: UTC
|
|
155
155
|
PGTZ: UTC
|
|
@@ -210,6 +210,7 @@ uv sync --extra dev
|
|
|
210
210
|
| `phoenix` | arize-phoenix + OpenTelemetry | Phoenix 트레이싱/데이터셋/실험 연동 |
|
|
211
211
|
| `anthropic` | anthropic | Anthropic LLM 어댑터 |
|
|
212
212
|
| `perf` | faiss-cpu, ijson | 대용량 데이터셋 성능 보조 |
|
|
213
|
+
| `secrets` | boto3, google-cloud-secret-manager, hvac | Secret Manager 연동 |
|
|
213
214
|
|
|
214
215
|
`.python-version` 덕분에 uv가 Python 3.12를 자동으로 내려받습니다.
|
|
215
216
|
|
|
@@ -221,6 +222,9 @@ uv sync --extra dev
|
|
|
221
222
|
```bash
|
|
222
223
|
cp .env.example .env
|
|
223
224
|
# OPENAI_API_KEY, OLLAMA_BASE_URL, LANGFUSE_* , PHOENIX_* 등을 채워 넣으세요.
|
|
225
|
+
# API 인증을 쓰려면 API_AUTH_TOKENS를 설정하세요.
|
|
226
|
+
# secret:// 참조를 쓰려면 SECRET_PROVIDER 설정 및 secrets extra가 필요합니다.
|
|
227
|
+
# 레이트리밋은 RATE_LIMIT_ENABLED로 활성화합니다.
|
|
224
228
|
```
|
|
225
229
|
SQLite 경로를 바꾸려면 아래 값을 추가합니다.
|
|
226
230
|
```bash
|
|
@@ -0,0 +1,482 @@
|
|
|
1
|
+
# EvalVault 보안 전수조사 작업 기록 (중간)
|
|
2
|
+
|
|
3
|
+
> 목적: 엔터프라이즈 전환을 위해 보안 리스크와 준비 항목을 사전 정리
|
|
4
|
+
> 범위: `src/`, `config/`, `scripts/`, `docs/`, `frontend/`, `docker-compose*`, `.env*`
|
|
5
|
+
> 기준: OWASP LLM Top 10 2025, NIST AI RMF, 일반 SaaS 보안 체크리스트
|
|
6
|
+
|
|
7
|
+
## 1) 조사 방법
|
|
8
|
+
- 키워드 스캔: `api_key`, `secret`, `token`, `password`, `oauth`, `jwt`, `cors`, `shell=True`, `subprocess` 등
|
|
9
|
+
- 네트워크/추적/스토리지 경로 확인
|
|
10
|
+
- 설정/런타임 패치 경로 점검
|
|
11
|
+
|
|
12
|
+
## 2) 현재까지 확인된 핵심 영역
|
|
13
|
+
### 2.1 시크릿/설정
|
|
14
|
+
- `Settings`에 API 키/DB 비밀번호가 환경변수로 정의됨
|
|
15
|
+
- `.env`에 실제 키가 존재(레포 내 보관 위험)
|
|
16
|
+
- docker-compose 기본값에 `CHANGEME`/기본 패스워드 존재
|
|
17
|
+
|
|
18
|
+
### 2.2 API/인증
|
|
19
|
+
- FastAPI는 CORS만 적용, 인증/인가 미구현
|
|
20
|
+
- `/api/v1/config`는 비밀 값 제외하고 반환/패치 가능
|
|
21
|
+
|
|
22
|
+
### 2.3 네트워크/외부 연동
|
|
23
|
+
- OpenAI/Anthropic/Azure/vLLM/Ollama 연동
|
|
24
|
+
- Langfuse/Phoenix/MLflow 추적 연동
|
|
25
|
+
- 기본 엔드포인트가 `http://`로 설정된 항목 다수(로컬 전제)
|
|
26
|
+
|
|
27
|
+
### 2.4 스토리지
|
|
28
|
+
- SQLite 기본 경로(`data/db/*.db`)
|
|
29
|
+
- Postgres 연결 문자열에 비밀번호가 포함될 수 있음
|
|
30
|
+
- 저장 데이터 암호화/보관 정책 미명시
|
|
31
|
+
|
|
32
|
+
### 2.5 위험 명령 실행
|
|
33
|
+
- 외부 커맨드 실행 어댑터 존재 (`subprocess.run`)
|
|
34
|
+
- 운영 스크립트에서 `shell=True` 옵션 제공
|
|
35
|
+
|
|
36
|
+
### 2.6 해시/암호화
|
|
37
|
+
- 해시는 주로 캐시/식별용(MD5/SHA1/SHA256 혼재)
|
|
38
|
+
- 보안 목적으로의 암호화는 미확인
|
|
39
|
+
|
|
40
|
+
## 3) 우선 리스크 (요약)
|
|
41
|
+
- 레포 내 `.env` 실제 키 보관
|
|
42
|
+
- API 인증/인가 부재
|
|
43
|
+
- 로그/트레이스에 PII/민감 프롬프트 저장 가능성
|
|
44
|
+
- 데이터 암호화/보관 정책 부재
|
|
45
|
+
- 운영 환경에서 기본 비밀번호 사용 가능성
|
|
46
|
+
|
|
47
|
+
## 4) 엔터프라이즈 준비 체크리스트 (확장)
|
|
48
|
+
> 표기: P0(즉시) / P1(단기) / P2(중기) / P3(장기)
|
|
49
|
+
|
|
50
|
+
### 4.1 시크릿/키 관리
|
|
51
|
+
- [P0] 레포에서 `.env` 제거 및 키 전면 회전
|
|
52
|
+
- [P0] 운영 환경 기본 비밀번호 전면 교체 (`docker-compose*` 기본값 포함)
|
|
53
|
+
- [P1] Secret Manager 연동(Vault/ASM/GSM 중 택1)
|
|
54
|
+
- [P1] 키/토큰 로테이션 주기 및 감사 로그 정의
|
|
55
|
+
- [P2] SecretStr/마스킹 로깅 적용 범위 정의
|
|
56
|
+
|
|
57
|
+
### 4.2 인증/인가 (API/CLI)
|
|
58
|
+
- [P0] API 인증 도입 (토큰 기반 최소 인증)
|
|
59
|
+
- [P1] RBAC/프로젝트/테넌트 경계 정의
|
|
60
|
+
- [P1] 관리자/운영용 엔드포인트 분리 및 접근제어
|
|
61
|
+
- [P2] SSO(OIDC/SAML) 통합 로드맵
|
|
62
|
+
|
|
63
|
+
### 4.3 네트워크/전송 보안
|
|
64
|
+
- [P0] 외부 연동(LLM/Tracker) HTTPS 강제, 로컬 기본값 재정의
|
|
65
|
+
- [P1] vLLM/Ollama/추적 서버 인증/방화벽 규칙 정립
|
|
66
|
+
- [P1] 서비스 간 mTLS 적용 가능성 검토
|
|
67
|
+
- [P2] 네트워크 분리(내부/외부) 및 제로트러스트 정책
|
|
68
|
+
|
|
69
|
+
### 4.4 데이터 보호/보관
|
|
70
|
+
- [P0] 데이터 보관 기간/삭제 정책 수립 (PII 포함 데이터)
|
|
71
|
+
- [P1] 저장 데이터 암호화(디스크/DB 레벨) 정책
|
|
72
|
+
- [P1] 백업 암호화 및 복구 테스트 절차
|
|
73
|
+
- [P2] 고객 데이터 분리(테넌트 분리/암호화 키 분리)
|
|
74
|
+
|
|
75
|
+
### 4.5 로깅/트레이싱 보안
|
|
76
|
+
- [P0] 프롬프트/응답/트레이스에 PII 마스킹 기준 정의
|
|
77
|
+
- [P1] 로그 스키마 표준화(누가/무엇을/언제/어디서)
|
|
78
|
+
- [P1] 감사 로그 보관/삭제/위변조 방지 정책
|
|
79
|
+
- [P2] 이상 징후 탐지(비정상 토큰 사용량/실패율 급증)
|
|
80
|
+
|
|
81
|
+
### 4.6 LLM 전용 보안
|
|
82
|
+
- [P0] 프롬프트 인젝션 방어 정책 정의
|
|
83
|
+
- [P1] 입력/출력 가드레일(PII/정책 위반) 적용
|
|
84
|
+
- [P1] RAG 데이터 접근 통제(문서 등급/권한)
|
|
85
|
+
- [P2] Red Teaming/Adversarial 테스트 체계화
|
|
86
|
+
|
|
87
|
+
### 4.7 실행/스크립트 안전성
|
|
88
|
+
- [P0] `shell=True` 사용 구간 명시 및 운영 제한
|
|
89
|
+
- [P1] 외부 커맨드 실행 어댑터 접근 제어
|
|
90
|
+
- [P2] 샌드박스 실행(격리된 런타임) 검토
|
|
91
|
+
|
|
92
|
+
### 4.8 공급망/의존성
|
|
93
|
+
- [P0] 의존성 고정 및 SBOM 생성
|
|
94
|
+
- [P1] 취약점 스캐너(Snyk/Dependabot/CodeQL) CI 연동
|
|
95
|
+
- [P2] 모델/데이터셋 무결성 검증(체크섬)
|
|
96
|
+
|
|
97
|
+
### 4.9 운영/거버넌스
|
|
98
|
+
- [P1] 보안 사고 대응 프로세스/런북
|
|
99
|
+
- [P1] 변경관리(프로덕션 설정 변경 승인 흐름)
|
|
100
|
+
- [P2] 규정 준수 맵핑(GDPR/CCPA 등)
|
|
101
|
+
- [P3] 정기 보안 감사/펜테스트 계획
|
|
102
|
+
|
|
103
|
+
### 4.10 프론트엔드 보안
|
|
104
|
+
- [P0] CORS 운영 도메인 최소화
|
|
105
|
+
- [P1] 토큰 저장 정책(localStorage 금지 권장)
|
|
106
|
+
- [P2] CSP/보안 헤더 정책 정리
|
|
107
|
+
|
|
108
|
+
## 5) 우선 리스크 (요약)
|
|
109
|
+
- 레포 내 `.env` 실제 키 보관
|
|
110
|
+
- API 인증/인가 부재
|
|
111
|
+
- 로그/트레이스에 PII/민감 프롬프트 저장 가능성
|
|
112
|
+
- 데이터 암호화/보관 정책 부재
|
|
113
|
+
- 운영 환경에서 기본 비밀번호 사용 가능성
|
|
114
|
+
|
|
115
|
+
## 6) 다음 단계
|
|
116
|
+
- 체크리스트 항목별 담당/일정/상태 컬럼 정의
|
|
117
|
+
- 단계별(Dev/Stage/Prod) 보안 기준 분리
|
|
118
|
+
- 실제 구현 이슈 목록화 및 마일스톤화
|
|
119
|
+
|
|
120
|
+
## 7) 병렬 에이전트 작업 분장
|
|
121
|
+
> 목표: 소스 파일 충돌 최소화, 영역별 병렬 조사/설계
|
|
122
|
+
|
|
123
|
+
### Agent A: API 인증/인가
|
|
124
|
+
- **범위**: `src/evalvault/adapters/inbound/api/**`
|
|
125
|
+
- **주요 산출물**: 엔드포인트 목록, 인증 적용 포인트, 최소 인증 스키마 초안
|
|
126
|
+
- **겹침 금지**: 설정/로깅/스크립트 파일 접근 금지
|
|
127
|
+
|
|
128
|
+
### Agent B: 시크릿/설정 하드닝
|
|
129
|
+
- **범위**: `src/evalvault/config/**`, `.env.example`, `docker-compose*.yml`, `config/*.yaml`
|
|
130
|
+
- **주요 산출물**: 기본값 위험 항목, Secret Manager 연동 지점, 설정 검증 강화안
|
|
131
|
+
- **겹침 금지**: API/트레이싱 코드 접근 금지
|
|
132
|
+
|
|
133
|
+
### Agent C: 로깅/트레이싱 PII 마스킹
|
|
134
|
+
- **범위**: `src/evalvault/adapters/outbound/tracker/**`, `src/evalvault/config/instrumentation.py`, `src/evalvault/config/phoenix_support.py`
|
|
135
|
+
- **주요 산출물**: PII 마스킹 후보 필드, 로깅 스키마 개선안, 감사 로그 설계 초안
|
|
136
|
+
- **겹침 금지**: API/설정/스크립트 파일 접근 금지
|
|
137
|
+
|
|
138
|
+
### Agent D: 실행/스크립트 안전성
|
|
139
|
+
- **범위**: `src/evalvault/adapters/outbound/methods/external_command.py`, `scripts/ops/**`, `scripts/run_with_timeout.py`, `scripts/verify_workflows.py`
|
|
140
|
+
- **주요 산출물**: `shell=True` 사용 구간 목록, 실행 제어 방안, 위험도 평가
|
|
141
|
+
- **겹침 금지**: 설정/트레이싱 파일 접근 금지
|
|
142
|
+
|
|
143
|
+
## 8) 우선순위 기준(재정의)
|
|
144
|
+
- **P0**: 외부 노출 + 데이터 유출/권한 상승 가능성 높음 + 대응 난이도 낮음
|
|
145
|
+
- **P1**: 외부 노출 또는 민감 데이터 취급 + 대응 난이도 중간
|
|
146
|
+
- **P2**: 내부 통제/가시성 개선 또는 장기적 리스크 감소
|
|
147
|
+
- **P3**: 운영 성숙도(거버넌스/컴플라이언스) 강화
|
|
148
|
+
|
|
149
|
+
## 9) 실행 이슈 목록(작업 카드)
|
|
150
|
+
> 카드 상태: TODO / IN-PROGRESS / BLOCKED / DONE
|
|
151
|
+
> 주의: `.env` 변경은 **모든 작업 이후** 진행
|
|
152
|
+
|
|
153
|
+
### 카드 메타 템플릿
|
|
154
|
+
- 상태:
|
|
155
|
+
- 담당:
|
|
156
|
+
- 기한:
|
|
157
|
+
- 의존:
|
|
158
|
+
- 난이도: Low / Medium / High
|
|
159
|
+
- 범위:
|
|
160
|
+
- 산출물:
|
|
161
|
+
- 검증:
|
|
162
|
+
|
|
163
|
+
### P0
|
|
164
|
+
**[P0-01] API 인증/인가 도입 (최소 토큰 기반)**
|
|
165
|
+
- 상태: DONE
|
|
166
|
+
- 담당: TBD
|
|
167
|
+
- 기한: TBD
|
|
168
|
+
- 의존: 없음
|
|
169
|
+
- 난이도: High
|
|
170
|
+
- 범위: `src/evalvault/adapters/inbound/api/**`
|
|
171
|
+
- 산출물: 인증 미들웨어/의존성, 라우터 적용, 문서 업데이트
|
|
172
|
+
- 검증: 인증 없는 접근 차단 확인
|
|
173
|
+
|
|
174
|
+
**[P0-02] 트레이싱/로깅 PII 마스킹 적용**
|
|
175
|
+
- 상태: DONE
|
|
176
|
+
- 담당: TBD
|
|
177
|
+
- 기한: TBD
|
|
178
|
+
- 의존: 없음
|
|
179
|
+
- 난이도: Medium
|
|
180
|
+
- 범위: `src/evalvault/adapters/outbound/tracker/**`
|
|
181
|
+
- 산출물: 마스킹 규칙, 길이 제한, 테스트 케이스
|
|
182
|
+
- 검증: PII 포함 입력이 마스킹되어 전송되는지 확인
|
|
183
|
+
|
|
184
|
+
**[P0-03] Langfuse compose 기본 시크릿 제거/강제**
|
|
185
|
+
- 상태: DONE
|
|
186
|
+
- 담당: TBD
|
|
187
|
+
- 기한: TBD
|
|
188
|
+
- 의존: 없음
|
|
189
|
+
- 난이도: Medium
|
|
190
|
+
- 범위: `docker-compose.langfuse.yml`
|
|
191
|
+
- 산출물: 기본값 제거, 필수값 검증 스크립트
|
|
192
|
+
- 검증: 기본값이면 컨테이너가 시작 실패
|
|
193
|
+
|
|
194
|
+
**[P0-04] 외부 명령 실행 안전화**
|
|
195
|
+
- 상태: DONE
|
|
196
|
+
- 담당: TBD
|
|
197
|
+
- 기한: TBD
|
|
198
|
+
- 의존: 없음
|
|
199
|
+
- 난이도: Medium
|
|
200
|
+
- 범위: `src/evalvault/adapters/outbound/methods/external_command.py`, `scripts/ops/phoenix_watch.py`
|
|
201
|
+
- 산출물: `shell=True` 경고/제한, 입력 검증
|
|
202
|
+
- 검증: 위험 입력 차단/경고 로그 확인
|
|
203
|
+
|
|
204
|
+
### P1
|
|
205
|
+
**[P1-01] 프로덕션 프로필 시크릿 검증**
|
|
206
|
+
- 상태: DONE
|
|
207
|
+
- 담당: TBD
|
|
208
|
+
- 기한: TBD
|
|
209
|
+
- 의존: P0-03
|
|
210
|
+
- 난이도: Medium
|
|
211
|
+
- 범위: `src/evalvault/config/settings.py`
|
|
212
|
+
- 산출물: prod 프로필 필수값 검증
|
|
213
|
+
- 검증: 누락 시 실행 실패
|
|
214
|
+
|
|
215
|
+
**[P1-02] CORS 운영 도메인 제한**
|
|
216
|
+
- 상태: DONE
|
|
217
|
+
- 담당: TBD
|
|
218
|
+
- 기한: TBD
|
|
219
|
+
- 의존: 없음
|
|
220
|
+
- 난이도: Low
|
|
221
|
+
- 범위: `src/evalvault/config/settings.py`, `src/evalvault/adapters/inbound/api/main.py`
|
|
222
|
+
- 산출물: prod 기본값 제거, 경고 로깅
|
|
223
|
+
- 검증: localhost origin 차단 확인
|
|
224
|
+
|
|
225
|
+
**[P1-03] 저장 데이터 암호화 정책 적용**
|
|
226
|
+
- 상태: DONE
|
|
227
|
+
- 담당: TBD
|
|
228
|
+
- 기한: TBD
|
|
229
|
+
- 의존: 없음
|
|
230
|
+
- 난이도: High
|
|
231
|
+
- 범위: `src/evalvault/adapters/outbound/storage/**`
|
|
232
|
+
- 산출물: DB/TDE 암호화 정책, 백업 암호화, 키 관리/회전 가이드
|
|
233
|
+
- 검증: 암호화 구성 점검 체크리스트
|
|
234
|
+
|
|
235
|
+
**[P1-04] 감사 로그 스키마 정의**
|
|
236
|
+
- 상태: DONE
|
|
237
|
+
- 담당: TBD
|
|
238
|
+
- 기한: TBD
|
|
239
|
+
- 의존: 없음
|
|
240
|
+
- 난이도: Medium
|
|
241
|
+
- 범위: `docs/`, `src/evalvault/config/` (설계 위주)
|
|
242
|
+
- 산출물: 필수 필드(actor_id, action, resource_type, resource_id, status, ip, user_agent, request_id, trace_id), 보관 기간/접근 정책
|
|
243
|
+
- 검증: 문서 리뷰
|
|
244
|
+
|
|
245
|
+
### P2
|
|
246
|
+
**[P2-01] Secret Manager 연동**
|
|
247
|
+
- 상태: DONE
|
|
248
|
+
- 담당: TBD
|
|
249
|
+
- 기한: TBD
|
|
250
|
+
- 의존: P1-01
|
|
251
|
+
- 난이도: High
|
|
252
|
+
- 범위: `src/evalvault/config/**`
|
|
253
|
+
- 산출물: 연동 모듈/운영 가이드
|
|
254
|
+
- 검증: 로컬/스테이징에서 시크릿 로드 확인
|
|
255
|
+
|
|
256
|
+
**[P2-02] RAG 문서 접근 제어**
|
|
257
|
+
- 상태: DONE
|
|
258
|
+
- 담당: TBD
|
|
259
|
+
- 기한: TBD
|
|
260
|
+
- 의존: P0-01
|
|
261
|
+
- 난이도: High
|
|
262
|
+
- 범위: `src/evalvault/adapters/inbound/api/routers/knowledge.py`
|
|
263
|
+
- 산출물: 등급/권한 모델 설계
|
|
264
|
+
- 검증: 권한 없는 접근 차단
|
|
265
|
+
|
|
266
|
+
**[P2-03] 레이트리밋/이상 징후 탐지**
|
|
267
|
+
- 상태: DONE
|
|
268
|
+
- 담당: TBD
|
|
269
|
+
- 기한: TBD
|
|
270
|
+
- 의존: P0-01
|
|
271
|
+
- 난이도: Medium
|
|
272
|
+
- 범위: `src/evalvault/adapters/inbound/api/**`
|
|
273
|
+
- 산출물: rate limit 설정/로그 지표
|
|
274
|
+
- 검증: 초과 요청 차단
|
|
275
|
+
|
|
276
|
+
### P3
|
|
277
|
+
**[P3-01] SSO(OIDC/SAML) 로드맵**
|
|
278
|
+
- 상태: IN-PROGRESS
|
|
279
|
+
- 담당: TBD
|
|
280
|
+
- 기한: TBD
|
|
281
|
+
- 의존: P0-01
|
|
282
|
+
- 난이도: Medium
|
|
283
|
+
- 범위: `docs/`
|
|
284
|
+
- 산출물: 통합 시나리오/마이그레이션 플랜
|
|
285
|
+
- 검증: 설계 리뷰
|
|
286
|
+
|
|
287
|
+
**[P3-02] 정기 보안 감사/펜테스트 계획**
|
|
288
|
+
- 상태: DONE
|
|
289
|
+
- 담당: TBD
|
|
290
|
+
- 기한: TBD
|
|
291
|
+
- 의존: 없음
|
|
292
|
+
- 난이도: Low
|
|
293
|
+
- 범위: `docs/`
|
|
294
|
+
- 산출물: 주기/책임/범위 정의
|
|
295
|
+
- 검증: 운영 승인
|
|
296
|
+
|
|
297
|
+
### 후속(모든 작업 이후)
|
|
298
|
+
**[POST-01] .env 정리 및 키 회전**
|
|
299
|
+
- 상태: TODO
|
|
300
|
+
- 담당: TBD
|
|
301
|
+
- 기한: TBD
|
|
302
|
+
- 의존: P0~P3 완료
|
|
303
|
+
- 난이도: Medium
|
|
304
|
+
- 범위: `.env` (현 단계에서는 **변경 금지**)
|
|
305
|
+
- 산출물: 키 회전 체크리스트/실행 로그
|
|
306
|
+
- 검증: 기존 키 폐기 및 신규 키 적용 확인
|
|
307
|
+
|
|
308
|
+
## 10) 작업 진행 기록 (상세)
|
|
309
|
+
### P0 완료 내역
|
|
310
|
+
- API 인증/인가 적용: `src/evalvault/adapters/inbound/api/main.py`에 토큰 인증 의존성 추가 및 라우터 전반 적용.
|
|
311
|
+
- 설정 민감값 보호: `src/evalvault/adapters/inbound/api/routers/config.py`에서 `api_auth_tokens` 제외.
|
|
312
|
+
- PII 마스킹/길이 제한 도입: `src/evalvault/adapters/outbound/tracker/log_sanitizer.py` 신설 및 Langfuse/Phoenix/MLflow 로깅 경로 적용.
|
|
313
|
+
- Langfuse compose 기본 시크릿 강제: `docker-compose.langfuse.yml`의 기본값 제거 및 필수값 요구.
|
|
314
|
+
- 외부 명령 안전화: `src/evalvault/adapters/outbound/methods/external_command.py`에 shell 사용 검증/경고, `scripts/ops/phoenix_watch.py`에 gate-shell 단일 라인 제한.
|
|
315
|
+
|
|
316
|
+
### P1 완료 내역
|
|
317
|
+
- 프로덕션 필수 설정 검증 추가: `src/evalvault/config/settings.py`에서 prod 프로필 필수값 검증 및 localhost CORS 금지.
|
|
318
|
+
- 프로덕션 CORS 강제: `src/evalvault/adapters/inbound/api/main.py`에서 prod CORS 비어있을 경우 실행 실패.
|
|
319
|
+
- 문서 보강: 저장 데이터 암호화 정책 및 감사 로그 필드 상세화.
|
|
320
|
+
|
|
321
|
+
### 테스트 기록
|
|
322
|
+
- `uv run pytest tests/unit -q` (1983 passed, 2 skipped, 14 warnings)
|
|
323
|
+
- `uv run pytest tests/integration/test_pipeline_api_contracts.py -q` (7 passed, 13 warnings)
|
|
324
|
+
- `uv run pytest tests/unit/config -q` (3 passed)
|
|
325
|
+
- `uv run pytest tests/unit/test_settings.py -q` (7 passed)
|
|
326
|
+
|
|
327
|
+
### 제약/보류
|
|
328
|
+
- `.env`는 요청에 따라 변경하지 않음 (POST-01로 이관)
|
|
329
|
+
|
|
330
|
+
## 11) P1 에이전트 리뷰 결과(요약)
|
|
331
|
+
### 11.1 P1-01 프로덕션 시크릿 검증 갭
|
|
332
|
+
- `vLLM`, `Azure`, `Anthropic` 프로바이더 필수값 검증 누락 (예: `VLLM_BASE_URL`, `AZURE_*`, `ANTHROPIC_API_KEY`).
|
|
333
|
+
- `faithfulness_fallback_provider` 설정 시 대응 키 검증 누락.
|
|
334
|
+
- `tracker_provider=phoenix`일 때 `PHOENIX_ENDPOINT` 검증 없음.
|
|
335
|
+
- `postgres_connection_string` 형식 검증 없음.
|
|
336
|
+
- 관련 위치: `src/evalvault/config/settings.py`.
|
|
337
|
+
|
|
338
|
+
### 11.2 P1-02 CORS 프로덕션 제한 갭
|
|
339
|
+
- `settings.py`와 `main.py`의 검증 범위 불일치(현재 `main.py`는 localhost 포함 여부를 재검증하지 않음).
|
|
340
|
+
- 런타임 CORS 변경(`config` API)은 미들웨어에 즉시 반영되지 않음.
|
|
341
|
+
- CORS origin 형식 검증 부재 및 `.env.example` 문서화 부족.
|
|
342
|
+
- 관련 위치: `src/evalvault/config/settings.py`, `src/evalvault/adapters/inbound/api/main.py`, `.env.example`.
|
|
343
|
+
|
|
344
|
+
### 11.3 P1-03 스토리지 암호화 격차
|
|
345
|
+
- SQLite/Postgres 저장 데이터 전부 평문 저장, TLS/암호화 미적용.
|
|
346
|
+
- JSON 직렬화/역직렬화 훅(`_serialize_json`, `_deserialize_json`)에 암호화 레이어 없음.
|
|
347
|
+
- Excel export가 민감 데이터 평문 노출.
|
|
348
|
+
- 관련 위치: `src/evalvault/adapters/outbound/storage/base_sql.py`, `src/evalvault/adapters/outbound/storage/sqlite_adapter.py`, `src/evalvault/adapters/outbound/storage/postgres_adapter.py`.
|
|
349
|
+
|
|
350
|
+
### 11.4 P1-04 감사 로그 통합 포인트
|
|
351
|
+
- API/CLI/Storage 전반에 감사 로그 훅 부재.
|
|
352
|
+
- 후보 지점: API 라우터(평가/설정/지식그래프), CLI 명령(run/analyze/config), 저장소 write/delete.
|
|
353
|
+
- 구조화된 로거 도입 및 `audit_log_port` 확장 필요.
|
|
354
|
+
- 관련 위치: `src/evalvault/adapters/inbound/api/**`, `src/evalvault/adapters/inbound/cli/**`, `src/evalvault/adapters/outbound/storage/**`.
|
|
355
|
+
|
|
356
|
+
## 12) P2 진행 기록 (Secret Manager 연동)
|
|
357
|
+
- `secret://` 참조를 해석하기 위한 공통 모듈 추가: `src/evalvault/config/secret_manager.py`.
|
|
358
|
+
- `Settings`에 `secret_provider`, `secret_cache_enabled` 필드 추가 및 시크릿 참조 자동 해석.
|
|
359
|
+
- 지원 Provider: `env`, `aws`(Secrets Manager), `gcp`(Secret Manager), `vault`.
|
|
360
|
+
- 선택 의존성: `secrets` extra(boto3, google-cloud-secret-manager, hvac).
|
|
361
|
+
- 테스트 추가: `tests/unit/test_settings.py`에 `secret://` 해석 및 provider 누락 에러 검증.
|
|
362
|
+
- 테스트 실행: `uv run pytest tests/unit/test_settings.py -q`, `uv run pytest tests/unit -q`.
|
|
363
|
+
- `.env`는 변경하지 않음(POST-01 유지).
|
|
364
|
+
|
|
365
|
+
## 13) P2 진행 기록 (RAG 문서 접근 제어)
|
|
366
|
+
- Knowledge API에 read/write 토큰 기반 접근 제어 추가.
|
|
367
|
+
- 설정 필드/시크릿 참조 대상에 knowledge 토큰 필드 추가.
|
|
368
|
+
- `.env.example`에 `KNOWLEDGE_READ_TOKENS`, `KNOWLEDGE_WRITE_TOKENS` 항목 추가.
|
|
369
|
+
- 테스트 추가: `tests/integration/test_pipeline_api_contracts.py`에 read/write 토큰 검사.
|
|
370
|
+
|
|
371
|
+
## 14) P2 진행 기록 (레이트리밋/이상 징후 탐지)
|
|
372
|
+
- API 레이트리밋 미들웨어 추가: `/api/` 경로에 한해 적용.
|
|
373
|
+
- 설정 필드 추가: `rate_limit_enabled`, `rate_limit_requests`, `rate_limit_window_seconds`, `rate_limit_block_threshold`.
|
|
374
|
+
- 레이트리밋 초과 시 429 + `Retry-After` 헤더 반환.
|
|
375
|
+
- 차단 횟수 임계치 도달 시 경고 로그 출력.
|
|
376
|
+
- `.env.example`에 레이트리밋 환경 변수 예시 추가.
|
|
377
|
+
- 테스트 추가: `tests/integration/test_pipeline_api_contracts.py`에 레이트리밋 차단 검증.
|
|
378
|
+
|
|
379
|
+
## 15) P3 진행 기록 (SSO 로드맵 초안)
|
|
380
|
+
### 15.1 범위/전제
|
|
381
|
+
- 기본 인증은 `API_AUTH_TOKENS` 유지(긴급 우회/백업 경로).
|
|
382
|
+
- Enterprise는 OIDC 우선, SAML은 브로커(IdP) 연계로 흡수.
|
|
383
|
+
- 테넌트/프로젝트 경계 정의 후 권한 매핑 적용.
|
|
384
|
+
|
|
385
|
+
### 15.2 결정 포인트
|
|
386
|
+
- OIDC만으로 충분한지 vs SAML 필요(기관/금융 IdP 요구).
|
|
387
|
+
- 직접 연동 vs 브로커(Keycloak/Auth0/Okta) 사용.
|
|
388
|
+
- 토큰 주체(sub/email) 기준과 역할 클레임 규격 확정.
|
|
389
|
+
|
|
390
|
+
### 15.3 단계별 로드맵
|
|
391
|
+
- Phase 0: 요구사항 수집(IdP, 클레임, 사용자 식별자, 테넌트 모델)
|
|
392
|
+
- Phase 1: OIDC 인증 코드 플로우 + JWKS 검증 + 캐시/클럭스큐 처리
|
|
393
|
+
- Phase 2: 역할/스코프 매핑 및 API 권한 정책 정의(라우터별 scope)
|
|
394
|
+
- Phase 3: SAML 연동(브로커 기반) + 사용자 프로비저닝(SCIM 옵션)
|
|
395
|
+
- Phase 4: 로그아웃/세션 정책(리프레시 토큰, 회수, 만료 정책)
|
|
396
|
+
|
|
397
|
+
### 15.4 설정 키 초안
|
|
398
|
+
- `OIDC_ISSUER`, `OIDC_CLIENT_ID`, `OIDC_AUDIENCE`, `OIDC_JWKS_URL`
|
|
399
|
+
- `OIDC_ALLOWED_ALGS`, `OIDC_REQUIRED_CLAIMS`, `OIDC_ROLE_CLAIM`, `OIDC_EMAIL_CLAIM`
|
|
400
|
+
- `SSO_ENABLED`, `SSO_PROVIDER`(oidc/saml), `SSO_FALLBACK_TOKENS`
|
|
401
|
+
|
|
402
|
+
### 15.5 테스트/롤아웃
|
|
403
|
+
- 스테이징 IdP로 통합 테스트 후 프로덕션 순차 롤아웃
|
|
404
|
+
- 롤백 경로: `API_AUTH_TOKENS` 유지
|
|
405
|
+
- 감사 로그 연계: 로그인/권한 거부/토큰 검증 실패 이벤트 기록
|
|
406
|
+
|
|
407
|
+
## 16) P3 진행 기록 (정기 보안 감사/펜테스트 계획)
|
|
408
|
+
> 목적: 릴리스 직전 1회성 점검이 아니라, 주기적 검증과 개선 루프 고정
|
|
409
|
+
> 기준: OWASP ASVS, OWASP LLM Top 10 2025, 공급망/SBOM, SaaS 보안 체크리스트
|
|
410
|
+
|
|
411
|
+
### 16.1 목표/원칙
|
|
412
|
+
- 실제 배포 형태(API/CLI/DB/Tracker) 기준으로 점검
|
|
413
|
+
- 테스트 과정에서 프로덕션 PII/고객 프롬프트 사용 금지
|
|
414
|
+
- 모든 이슈는 재현 절차/근거 로그 포함
|
|
415
|
+
- 결과는 P0~P3 백로그와 SLA로 연결
|
|
416
|
+
|
|
417
|
+
### 16.2 주기/트리거
|
|
418
|
+
- 월간: 내부 경량 점검(시크릿/의존성/설정 회귀)
|
|
419
|
+
- 분기: DAST + LLM/RAG 공격 시나리오 점검
|
|
420
|
+
- 반기 또는 릴리스 전: 외부 펜테스트 1회 권장
|
|
421
|
+
- 변경 트리거: 인증/인가, RAG 지식 API, Tracker 연동, Storage/Export 변경 시 스팟 점검
|
|
422
|
+
|
|
423
|
+
### 16.3 점검 범위
|
|
424
|
+
- API: 인증/인가/CORS/설정 API 민감정보, Rate limit/DoS
|
|
425
|
+
- CLI: 경로/템플릿 인젝션, 명령 실행 경로, 환경변수 노출
|
|
426
|
+
- Storage: 평문 저장/암호화, Export 민감정보, 테넌트 분리
|
|
427
|
+
- Tracker/Tracing: PII 마스킹 회귀, 전송 보안, 인증 누락
|
|
428
|
+
- LLM/RAG: Prompt Injection, Retrieval Poisoning, 컨텍스트/시크릿 유출
|
|
429
|
+
|
|
430
|
+
### 16.4 사전 조건
|
|
431
|
+
- 스테이징 환경(Prod 유사, TLS 포함)
|
|
432
|
+
- 테스트 전용 데이터/계정/토큰 사용
|
|
433
|
+
- 감사 로그/트레이스 접근 권한 확보
|
|
434
|
+
- 점검 중 롤백/차단 절차 준비
|
|
435
|
+
|
|
436
|
+
### 16.5 방법론
|
|
437
|
+
- SAST/Config/SBOM 기반 취약점 스캔
|
|
438
|
+
- DAST: OpenAPI 기반 + 수동 시나리오
|
|
439
|
+
- Gray-box 리뷰: 토큰 검증 경계/설정 반영 타이밍
|
|
440
|
+
- LLM Red Teaming: 간접 인젝션, 지식베이스 오염, Canary 추적
|
|
441
|
+
|
|
442
|
+
### 16.6 데이터 처리/보관
|
|
443
|
+
- 산출물은 민감정보 제거 후 보관
|
|
444
|
+
- 보관 위치/기간/폐기 기준 사전 합의
|
|
445
|
+
- 프로덕션 데이터 사용 시 사전 승인 및 최소 범위 적용
|
|
446
|
+
|
|
447
|
+
### 16.7 보고/산출물
|
|
448
|
+
- Executive Summary + 기술 리포트
|
|
449
|
+
- 심각도/재현 절차/영향/권장 조치/재검증 포함
|
|
450
|
+
- OWASP ASVS/LLM Top 10 매핑
|
|
451
|
+
|
|
452
|
+
### 16.8 리메디에이션 SLA(권장)
|
|
453
|
+
- Critical 7일, High 14일, Medium 30일, Low 90일
|
|
454
|
+
- 예외는 임시 완화 후 일정 재합의
|
|
455
|
+
|
|
456
|
+
### 16.9 Responsible Disclosure
|
|
457
|
+
- 외부 제보 채널 및 공개 일정 수립
|
|
458
|
+
- 0-day 성격 이슈는 비공개 채널 공유
|
|
459
|
+
|
|
460
|
+
### 16.10 Ready-to-Test 체크리스트
|
|
461
|
+
- [ ] 스테이징 환경 준비
|
|
462
|
+
- [ ] 테스트 전용 데이터/토큰
|
|
463
|
+
- [ ] 마스킹/로그 회귀 확인
|
|
464
|
+
- [ ] 롤백/차단 플래그
|
|
465
|
+
- [ ] 리포트 템플릿/SLA 합의
|
|
466
|
+
|
|
467
|
+
## 17) 지금까지 작업 요약
|
|
468
|
+
- API 인증/인가 및 Knowledge 접근 제어 도입, 레이트리밋 추가
|
|
469
|
+
- Secret Manager 연동(`secret://`) 및 `secrets` extra 추가
|
|
470
|
+
- PII 마스킹/로깅 안전성 강화, 외부 명령 실행 제한
|
|
471
|
+
- 프로덕션 설정 검증(CORS/필수 시크릿) 강화
|
|
472
|
+
- 테스트 통과 기록 유지(유닛/통합)
|
|
473
|
+
|
|
474
|
+
## 18) 앞으로 작업할 항목(정리)
|
|
475
|
+
- P1 갭 보완: Azure/Anthropic/vLLM/phoenix 필수값 검증 추가
|
|
476
|
+
- CORS 런타임 반영/형식 검증, `.env.example` 문서 보강
|
|
477
|
+
- 저장소 암호화/Export 민감정보 보호(정책→구현)
|
|
478
|
+
- 감사 로그/권한 정책 포트 설계 및 연동
|
|
479
|
+
- SSO(OIDC/SAML) 상세 설계 및 구현 계획 수립
|
|
480
|
+
- POST-01: `.env` 정리 및 키 회전
|
|
481
|
+
|
|
482
|
+
(추가 조사 및 보강 예정)
|