precis-cli 0.1.3__py3-none-any.whl
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.
- app/__init__.py +16 -0
- app/api/__init__.py +32 -0
- app/api/dependencies.py +185 -0
- app/api/main.py +301 -0
- app/api/middleware/__init__.py +34 -0
- app/api/middleware/exception_handler.py +126 -0
- app/api/middleware/request_logging.py +97 -0
- app/api/middleware/token_auth.py +215 -0
- app/api/models/__init__.py +151 -0
- app/api/models/connection_rules.py +98 -0
- app/api/models/files.py +99 -0
- app/api/models/full_validation.py +554 -0
- app/api/models/project.py +117 -0
- app/api/models/projects.py +80 -0
- app/api/models/schema.py +121 -0
- app/api/models/v2_responses.py +46 -0
- app/api/models/validation.py +303 -0
- app/api/models/workspace.py +118 -0
- app/api/routers/__init__.py +56 -0
- app/api/routers/ai/__init__.py +36 -0
- app/api/routers/ai/chat.py +243 -0
- app/api/routers/ai/generate.py +156 -0
- app/api/routers/ai/hardware.py +199 -0
- app/api/routers/ai/jobs.py +544 -0
- app/api/routers/ai/migrate.py +471 -0
- app/api/routers/ai/models.py +352 -0
- app/api/routers/ai/ollama.py +108 -0
- app/api/routers/ai/providers.py +491 -0
- app/api/routers/ai/router.py +44 -0
- app/api/routers/ai/stream.py +281 -0
- app/api/routers/ai/utils.py +182 -0
- app/api/routers/core/__init__.py +34 -0
- app/api/routers/core/connection_rules.py +188 -0
- app/api/routers/core/data_sources.py +374 -0
- app/api/routers/core/regex.py +333 -0
- app/api/routers/core/reporting.py +263 -0
- app/api/routers/files/__init__.py +24 -0
- app/api/routers/files/ops.py +179 -0
- app/api/routers/files/transfer.py +101 -0
- app/api/routers/preview/__init__.py +35 -0
- app/api/routers/preview/content_mode.py +264 -0
- app/api/routers/preview/header_row.py +154 -0
- app/api/routers/preview/models.py +81 -0
- app/api/routers/preview/path_mode.py +440 -0
- app/api/routers/preview/router.py +30 -0
- app/api/routers/project/__init__.py +61 -0
- app/api/routers/project/base.py +111 -0
- app/api/routers/project/constraint.py +345 -0
- app/api/routers/project/full_config.py +411 -0
- app/api/routers/project/full_config_writer.py +327 -0
- app/api/routers/project/helpers.py +167 -0
- app/api/routers/project/inspection_fix.py +330 -0
- app/api/routers/project/manifest.py +605 -0
- app/api/routers/project/models.py +177 -0
- app/api/routers/project/pattern.py +268 -0
- app/api/routers/project/regex.py +358 -0
- app/api/routers/project/scanner.py +157 -0
- app/api/routers/project/schema.py +567 -0
- app/api/routers/project/schema_helpers.py +149 -0
- app/api/routers/project/settings.py +399 -0
- app/api/routers/project/template.py +325 -0
- app/api/routers/project/validation.py +227 -0
- app/api/routers/project/view.py +177 -0
- app/api/routers/project/workspaces.py +167 -0
- app/api/routers/projects/__init__.py +25 -0
- app/api/routers/projects/create.py +121 -0
- app/api/routers/projects/open.py +103 -0
- app/api/routers/projects/scan.py +100 -0
- app/api/routers/validation/__init__.py +39 -0
- app/api/routers/validation/common.py +263 -0
- app/api/routers/validation/content_mode.py +401 -0
- app/api/routers/validation/history.py +235 -0
- app/api/routers/validation/inline_mode.py +196 -0
- app/api/routers/validation/path_mode.py +314 -0
- app/api/routers/validation/router.py +51 -0
- app/api/services/full_validation_response_builder.py +412 -0
- app/api/services/io_error_messages.py +41 -0
- app/api/services/preview_service.py +248 -0
- app/cli/__init__.py +18 -0
- app/cli/__main__.py +30 -0
- app/cli/shared_services/__init__.py +42 -0
- app/cli/shared_services/config_ops.py +581 -0
- app/cli/shared_services/generation_ops.py +160 -0
- app/cli/shared_services/project_ops.py +288 -0
- app/cli/shell/__init__.py +48 -0
- app/cli/shell/commands/__init__.py +63 -0
- app/cli/shell/commands/ai/__init__.py +260 -0
- app/cli/shell/commands/ai/chat.py +331 -0
- app/cli/shell/commands/ai/delete.py +165 -0
- app/cli/shell/commands/ai/diff.py +70 -0
- app/cli/shell/commands/ai/display.py +428 -0
- app/cli/shell/commands/ai/executor.py +225 -0
- app/cli/shell/commands/ai/executor_utils.py +271 -0
- app/cli/shell/commands/ai/generate.py +285 -0
- app/cli/shell/commands/ai/interaction.py +262 -0
- app/cli/shell/commands/ai/migrate.py +281 -0
- app/cli/shell/commands/ai/resolver.py +224 -0
- app/cli/shell/commands/ai/status.py +101 -0
- app/cli/shell/commands/ai/switch.py +158 -0
- app/cli/shell/commands/ai/utils.py +52 -0
- app/cli/shell/commands/base.py +343 -0
- app/cli/shell/commands/config/__init__.py +131 -0
- app/cli/shell/commands/config/base.py +80 -0
- app/cli/shell/commands/config/check.py +246 -0
- app/cli/shell/commands/config/edit.py +148 -0
- app/cli/shell/commands/config/get.py +111 -0
- app/cli/shell/commands/config/init.py +123 -0
- app/cli/shell/commands/config/inspect.py +164 -0
- app/cli/shell/commands/config/list.py +104 -0
- app/cli/shell/commands/config/set.py +119 -0
- app/cli/shell/commands/config/show.py +150 -0
- app/cli/shell/commands/exit.py +67 -0
- app/cli/shell/commands/help.py +104 -0
- app/cli/shell/commands/infer_schema.py +156 -0
- app/cli/shell/commands/open.py +201 -0
- app/cli/shell/commands/project.py +215 -0
- app/cli/shell/commands/provider.py +619 -0
- app/cli/shell/commands/system.py +170 -0
- app/cli/shell/commands/validate.py +455 -0
- app/cli/shell/completer.py +231 -0
- app/cli/shell/config_storage.py +191 -0
- app/cli/shell/exceptions.py +90 -0
- app/cli/shell/formatter.py +371 -0
- app/cli/shell/interactive_menu.py +348 -0
- app/cli/shell/main.py +286 -0
- app/cli/shell/parser.py +266 -0
- app/cli/start.py +180 -0
- app/cli_main.py +52 -0
- app/mcp_server.py +311 -0
- app/shared/core/__init__.py +18 -0
- app/shared/core/app_version.py +59 -0
- app/shared/core/config/__init__.py +119 -0
- app/shared/core/config/server.py +193 -0
- app/shared/core/data_source/__init__.py +106 -0
- app/shared/core/data_source/loader.py +348 -0
- app/shared/core/data_source/loaders/__init__.py +213 -0
- app/shared/core/data_source/loaders/base.py +215 -0
- app/shared/core/data_source/loaders/converter.py +337 -0
- app/shared/core/data_source/loaders/csv_loader.py +252 -0
- app/shared/core/data_source/loaders/excel_loader.py +666 -0
- app/shared/core/data_source/loaders/extractor.py +268 -0
- app/shared/core/data_source/loaders/json_loader.py +354 -0
- app/shared/core/data_source/loaders/registry.py +88 -0
- app/shared/core/data_source/loaders/sql_loader.py +313 -0
- app/shared/core/data_source/loaders/strategies/__init__.py +100 -0
- app/shared/core/data_source/loaders/strategies/array_parser.py +277 -0
- app/shared/core/data_source/loaders/strategies/lines_parser.py +355 -0
- app/shared/core/data_source/loaders/strategies/object_parser.py +278 -0
- app/shared/core/data_source/schema_info.py +50 -0
- app/shared/core/data_source/specs/__init__.py +128 -0
- app/shared/core/data_source/specs/base.py +258 -0
- app/shared/core/data_source/specs/csv_source.py +137 -0
- app/shared/core/data_source/specs/excel_source.py +141 -0
- app/shared/core/data_source/specs/file_base.py +252 -0
- app/shared/core/data_source/specs/json_source.py +226 -0
- app/shared/core/data_source/specs/sql_source.py +161 -0
- app/shared/core/encoding.py +36 -0
- app/shared/core/io/__init__.py +24 -0
- app/shared/core/io/yaml.py +379 -0
- app/shared/core/manifest_schema/__init__.py +52 -0
- app/shared/core/manifest_schema/types.py +99 -0
- app/shared/core/manifest_schema/version.py +175 -0
- app/shared/core/patterns/__init__.py +24 -0
- app/shared/core/patterns/loader.py +134 -0
- app/shared/core/patterns/writer.py +244 -0
- app/shared/core/project/__init__.py +47 -0
- app/shared/core/project/constraint/builders/__init__.py +50 -0
- app/shared/core/project/constraint/builders/base.py +100 -0
- app/shared/core/project/constraint/builders/composite.py +77 -0
- app/shared/core/project/constraint/builders/conditional.py +67 -0
- app/shared/core/project/constraint/builders/foreign_key.py +53 -0
- app/shared/core/project/constraint/builders/registry.py +64 -0
- app/shared/core/project/constraint/builders/scripted.py +51 -0
- app/shared/core/project/constraint/builders/single_column.py +86 -0
- app/shared/core/project/constraint/builders/unique.py +53 -0
- app/shared/core/project/constraint/factory.py +170 -0
- app/shared/core/project/constraint/reader.py +214 -0
- app/shared/core/project/constraint/registry.py +233 -0
- app/shared/core/project/constraint/types/__init__.py +63 -0
- app/shared/core/project/constraint/types/constraint_file.py +261 -0
- app/shared/core/project/constraint/types/refs.py +460 -0
- app/shared/core/project/constraint/types.py +28 -0
- app/shared/core/project/constraint/writer.py +181 -0
- app/shared/core/project/loader/__init__.py +56 -0
- app/shared/core/project/loader/loader.py +30 -0
- app/shared/core/project/loader/loader_parts/config_inspector.py +137 -0
- app/shared/core/project/loader/loader_parts/embedded_constraints.py +224 -0
- app/shared/core/project/loader/loader_parts/file_loaders.py +58 -0
- app/shared/core/project/loader/loader_parts/inspection_ids.py +85 -0
- app/shared/core/project/loader/loader_parts/inspector_helpers.py +312 -0
- app/shared/core/project/loader/loader_parts/inspector_id_checks.py +274 -0
- app/shared/core/project/loader/loader_parts/inspector_reference_checks.py +690 -0
- app/shared/core/project/loader/loader_parts/inspector_uniqueness_checks.py +286 -0
- app/shared/core/project/loader/loader_parts/loading_error_messages.py +298 -0
- app/shared/core/project/loader/loader_parts/main.py +432 -0
- app/shared/core/project/loader/loader_parts/path_validation.py +117 -0
- app/shared/core/project/loader/loader_parts/runtime.py +125 -0
- app/shared/core/project/loader/types.py +246 -0
- app/shared/core/project/manifest/coverage.py +391 -0
- app/shared/core/project/manifest/reader.py +260 -0
- app/shared/core/project/manifest/types.py +91 -0
- app/shared/core/project/manifest/types_parts/__init__.py +60 -0
- app/shared/core/project/manifest/types_parts/constants.py +40 -0
- app/shared/core/project/manifest/types_parts/data_source.py +68 -0
- app/shared/core/project/manifest/types_parts/info.py +59 -0
- app/shared/core/project/manifest/types_parts/manifest.py +294 -0
- app/shared/core/project/manifest/types_parts/refs.py +153 -0
- app/shared/core/project/manifest/types_parts/settings.py +92 -0
- app/shared/core/project/manifest/types_parts/settings_file_processing.py +64 -0
- app/shared/core/project/manifest/types_parts/settings_script_security.py +78 -0
- app/shared/core/project/manifest/types_parts/settings_validation.py +83 -0
- app/shared/core/project/manifest/types_parts/template.py +66 -0
- app/shared/core/project/manifest/writer.py +262 -0
- app/shared/core/project/manual_data/__init__.py +27 -0
- app/shared/core/project/manual_data/types.py +75 -0
- app/shared/core/project/regex/reader.py +197 -0
- app/shared/core/project/regex/types.py +405 -0
- app/shared/core/project/regex/writer.py +123 -0
- app/shared/core/project/schema/reader.py +170 -0
- app/shared/core/project/schema/types.py +47 -0
- app/shared/core/project/schema/types_parts/__init__.py +36 -0
- app/shared/core/project/schema/types_parts/column.py +174 -0
- app/shared/core/project/schema/types_parts/column_utils.py +72 -0
- app/shared/core/project/schema/types_parts/constraint.py +165 -0
- app/shared/core/project/schema/types_parts/schema_id.py +66 -0
- app/shared/core/project/schema/types_parts/source.py +255 -0
- app/shared/core/project/schema/types_parts/source_options.py +347 -0
- app/shared/core/project/schema/types_parts/table.py +230 -0
- app/shared/core/project/schema/writer.py +139 -0
- app/shared/core/project/schema_ref_check.py +95 -0
- app/shared/core/project/template/__init__.py +27 -0
- app/shared/core/project/template/expander.py +263 -0
- app/shared/core/project/template/reader.py +120 -0
- app/shared/core/project/template/types.py +114 -0
- app/shared/core/project/transform/reader.py +76 -0
- app/shared/core/project/transform/types.py +116 -0
- app/shared/core/project/transform/writer.py +84 -0
- app/shared/core/pydantic_messages.py +59 -0
- app/shared/core/reporter/__init__.py +46 -0
- app/shared/core/reporter/reporter.py +220 -0
- app/shared/core/reporter/reporters/__init__.py +65 -0
- app/shared/core/reporter/reporters/base.py +188 -0
- app/shared/core/reporter/reporters/dingtalk_app_reporter.py +274 -0
- app/shared/core/reporter/reporters/email_reporter.py +271 -0
- app/shared/core/reporter/reporters/feishu_app_reporter.py +467 -0
- app/shared/core/reporter/reporters/local_file_reporter.py +208 -0
- app/shared/core/reporter/reporters/wecom_app_reporter.py +268 -0
- app/shared/core/utils/__init__.py +18 -0
- app/shared/core/utils/path_utils.py +60 -0
- app/shared/core/utils/regex_extract.py +113 -0
- app/shared/domain/__init__.py +114 -0
- app/shared/domain/constraints/__init__.py +76 -0
- app/shared/domain/constraints/allowed_values.py +211 -0
- app/shared/domain/constraints/base.py +141 -0
- app/shared/domain/constraints/charset.py +337 -0
- app/shared/domain/constraints/composite.py +174 -0
- app/shared/domain/constraints/condition_registry.py +130 -0
- app/shared/domain/constraints/conditional.py +629 -0
- app/shared/domain/constraints/date_logic.py +731 -0
- app/shared/domain/constraints/foreign_key.py +261 -0
- app/shared/domain/constraints/key_normalization.py +56 -0
- app/shared/domain/constraints/not_null.py +185 -0
- app/shared/domain/constraints/range.py +360 -0
- app/shared/domain/constraints/regex.py +218 -0
- app/shared/domain/constraints/scripted.py +276 -0
- app/shared/domain/constraints/unique.py +233 -0
- app/shared/domain/data_engine.py +384 -0
- app/shared/domain/data_types.py +113 -0
- app/shared/domain/data_types_parts/__init__.py +67 -0
- app/shared/domain/data_types_parts/base.py +204 -0
- app/shared/domain/data_types_parts/composite.py +250 -0
- app/shared/domain/data_types_parts/expression.py +202 -0
- app/shared/domain/data_types_parts/extracted.py +106 -0
- app/shared/domain/data_types_parts/json_types.py +234 -0
- app/shared/domain/data_types_parts/scalars.py +719 -0
- app/shared/domain/data_types_parts/sequence.py +129 -0
- app/shared/domain/dataset_schema.py +48 -0
- app/shared/domain/eval_sandbox.py +63 -0
- app/shared/domain/expression_system.py +366 -0
- app/shared/domain/regex_flags.py +53 -0
- app/shared/domain/schema/builder.py +223 -0
- app/shared/domain/schema/models.py +339 -0
- app/shared/domain/transforms/__init__.py +28 -0
- app/shared/domain/transforms/aggregate.py +141 -0
- app/shared/domain/transforms/base.py +171 -0
- app/shared/domain/transforms/cast_type.py +120 -0
- app/shared/domain/transforms/concat.py +103 -0
- app/shared/domain/transforms/conditional_assign.py +114 -0
- app/shared/domain/transforms/date_format.py +81 -0
- app/shared/domain/transforms/digits.py +77 -0
- app/shared/domain/transforms/drop_duplicates.py +94 -0
- app/shared/domain/transforms/fill_na.py +94 -0
- app/shared/domain/transforms/filter_rows.py +97 -0
- app/shared/domain/transforms/lookup.py +78 -0
- app/shared/domain/transforms/lower_case.py +70 -0
- app/shared/domain/transforms/map_value.py +90 -0
- app/shared/domain/transforms/math_expr.py +112 -0
- app/shared/domain/transforms/modulo.py +82 -0
- app/shared/domain/transforms/regex_extract.py +103 -0
- app/shared/domain/transforms/registry.py +95 -0
- app/shared/domain/transforms/replace.py +88 -0
- app/shared/domain/transforms/sort_rows.py +94 -0
- app/shared/domain/transforms/string_split.py +84 -0
- app/shared/domain/transforms/strip.py +73 -0
- app/shared/domain/transforms/substring.py +92 -0
- app/shared/domain/transforms/upper_case.py +70 -0
- app/shared/domain/transforms/weighted_sum.py +104 -0
- app/shared/domain/validation_constraints.py +69 -0
- app/shared/services/__init__.py +62 -0
- app/shared/services/ai/__init__.py +48 -0
- app/shared/services/ai/agent/__init__.py +40 -0
- app/shared/services/ai/agent/chat_tools/__init__.py +47 -0
- app/shared/services/ai/agent/chat_tools/apply_actions.py +592 -0
- app/shared/services/ai/agent/chat_tools/ask_user.py +237 -0
- app/shared/services/ai/agent/chat_tools/read_canvas.py +140 -0
- app/shared/services/ai/agent/chat_tools/read_project.py +160 -0
- app/shared/services/ai/agent/chat_tools/read_table.py +301 -0
- app/shared/services/ai/agent/chat_tools/schemas.py +105 -0
- app/shared/services/ai/agent/chat_tools/validate_table.py +131 -0
- app/shared/services/ai/agent/executor.py +554 -0
- app/shared/services/ai/agent/memory.py +256 -0
- app/shared/services/ai/agent/planner.py +282 -0
- app/shared/services/ai/agent/tool_registry.py +296 -0
- app/shared/services/ai/agent/tools/__init__.py +32 -0
- app/shared/services/ai/agent/tools/config_generate.py +133 -0
- app/shared/services/ai/agent/tools/config_refine.py +109 -0
- app/shared/services/ai/agent/tools/config_validate.py +403 -0
- app/shared/services/ai/agent/tools/merge_results.py +136 -0
- app/shared/services/ai/agent/tools/plan_chunks.py +79 -0
- app/shared/services/ai/agent/tools/script_parse.py +359 -0
- app/shared/services/ai/agent/types.py +138 -0
- app/shared/services/ai/chat_agent_runner.py +596 -0
- app/shared/services/ai/chat_orchestrator.py +725 -0
- app/shared/services/ai/failure_messages.py +65 -0
- app/shared/services/ai/job_storage.py +274 -0
- app/shared/services/ai/migrate_service.py +550 -0
- app/shared/services/ai/streaming/__init__.py +65 -0
- app/shared/services/ai/streaming/event_journal.py +197 -0
- app/shared/services/ai/streaming/orchestrator.py +262 -0
- app/shared/services/ai/streaming/pending_interaction_store.py +227 -0
- app/shared/services/ai/streaming/sse_response.py +148 -0
- app/shared/services/ai/streaming/types.py +73 -0
- app/shared/services/ai/types.py +213 -0
- app/shared/services/ai/utils.py +322 -0
- app/shared/services/diff/config_diff.py +320 -0
- app/shared/services/hardware.py +237 -0
- app/shared/services/llm/__init__.py +62 -0
- app/shared/services/llm/actions/__init__.py +42 -0
- app/shared/services/llm/actions/_canvas_validator.py +147 -0
- app/shared/services/llm/actions/_constraint_validator.py +401 -0
- app/shared/services/llm/actions/_regex_validator.py +85 -0
- app/shared/services/llm/actions/_schema_validator.py +82 -0
- app/shared/services/llm/actions/_settings_validator.py +76 -0
- app/shared/services/llm/actions/_transform_validator.py +78 -0
- app/shared/services/llm/actions/action_handlers.py +400 -0
- app/shared/services/llm/actions/action_parser.py +63 -0
- app/shared/services/llm/actions/action_processor.py +468 -0
- app/shared/services/llm/actions/action_validator.py +311 -0
- app/shared/services/llm/actions/diff_compute.py +195 -0
- app/shared/services/llm/actions/regex_handlers.py +284 -0
- app/shared/services/llm/actions/registry.py +336 -0
- app/shared/services/llm/actions/schema_handlers.py +335 -0
- app/shared/services/llm/actions/settings_handlers.py +180 -0
- app/shared/services/llm/actions/specs.py +259 -0
- app/shared/services/llm/actions/transform_handlers.py +279 -0
- app/shared/services/llm/actions/validation_types.py +147 -0
- app/shared/services/llm/cache/__init__.py +18 -0
- app/shared/services/llm/cache/response_cache.py +80 -0
- app/shared/services/llm/chat/__init__.py +35 -0
- app/shared/services/llm/chat/chat_system_prompt.py +561 -0
- app/shared/services/llm/chat/response_parser.py +296 -0
- app/shared/services/llm/config/__init__.py +45 -0
- app/shared/services/llm/config/crypto.py +135 -0
- app/shared/services/llm/config/loader.py +258 -0
- app/shared/services/llm/config/models.py +202 -0
- app/shared/services/llm/config/presets.py +128 -0
- app/shared/services/llm/config_generator.py +163 -0
- app/shared/services/llm/constraints/__init__.py +41 -0
- app/shared/services/llm/constraints/constraint_builder.py +177 -0
- app/shared/services/llm/constraints/constraint_deletion.py +84 -0
- app/shared/services/llm/constraints/constraint_id.py +174 -0
- app/shared/services/llm/constraints/frontend_instructions.py +333 -0
- app/shared/services/llm/constraints/inline_batch.py +279 -0
- app/shared/services/llm/discovery/__init__.py +35 -0
- app/shared/services/llm/discovery/scanner.py +181 -0
- app/shared/services/llm/generation/__init__.py +42 -0
- app/shared/services/llm/generation/agent_wiring.py +156 -0
- app/shared/services/llm/generation/config_builder.py +386 -0
- app/shared/services/llm/generation/errors.py +36 -0
- app/shared/services/llm/generation/existing_config.py +99 -0
- app/shared/services/llm/generation/profiler.py +279 -0
- app/shared/services/llm/generation/prompt_builder.py +199 -0
- app/shared/services/llm/generation/response_parser.py +144 -0
- app/shared/services/llm/generation/service.py +622 -0
- app/shared/services/llm/models.py +104 -0
- app/shared/services/llm/providers/__init__.py +48 -0
- app/shared/services/llm/providers/base.py +310 -0
- app/shared/services/llm/providers/cached_provider.py +90 -0
- app/shared/services/llm/providers/ollama.py +498 -0
- app/shared/services/llm/providers/openai.py +334 -0
- app/shared/services/llm/providers/registry.py +108 -0
- app/shared/services/llm/schema_resolver.py +141 -0
- app/shared/services/llm/suggestion_utils.py +219 -0
- app/shared/services/llm/validate_executor.py +163 -0
- app/shared/services/llm/yaml_io.py +406 -0
- app/shared/services/preview/__init__.py +18 -0
- app/shared/services/preview/loader.py +145 -0
- app/shared/services/preview/path_validation.py +138 -0
- app/shared/services/project_loader.py +57 -0
- app/shared/services/schema_inference.py +260 -0
- app/shared/services/schema_runtime_builder.py +120 -0
- app/shared/services/validation/__init__.py +52 -0
- app/shared/services/validation/chunked_loader.py +509 -0
- app/shared/services/validation/dag/__init__.py +35 -0
- app/shared/services/validation/dag/builder.py +141 -0
- app/shared/services/validation/dag/executor.py +225 -0
- app/shared/services/validation/dag/sorter.py +77 -0
- app/shared/services/validation/data_loader.py +231 -0
- app/shared/services/validation/engine.py +446 -0
- app/shared/services/validation/executor.py +1030 -0
- app/shared/services/validation/extractors.py +266 -0
- app/shared/services/validation/history.py +209 -0
- app/shared/services/validation/json_payload.py +136 -0
- app/shared/services/validation/loader.py +152 -0
- app/shared/services/validation/memory_monitor.py +179 -0
- app/shared/services/validation/postprocess.py +208 -0
- app/shared/services/validation/progress.py +64 -0
- app/shared/services/validation/report_export.py +222 -0
- app/shared/services/validation/resolver.py +180 -0
- app/shared/services/validation/service.py +418 -0
- app/shared/services/validation/types.py +238 -0
- app/shared/services/validation/validators/__init__.py +36 -0
- app/shared/services/validation/validators/adapter.py +182 -0
- app/shared/services/validation/validators/base.py +332 -0
- app/shared/services/validation/validators/composite.py +233 -0
- app/shared/services/validation/validators/date_logic.py +276 -0
- app/start_server.py +133 -0
- precis_cli-0.1.3.dist-info/METADATA +180 -0
- precis_cli-0.1.3.dist-info/RECORD +442 -0
- precis_cli-0.1.3.dist-info/WHEEL +5 -0
- precis_cli-0.1.3.dist-info/entry_points.txt +4 -0
- precis_cli-0.1.3.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
#
|
|
3
|
+
# Copyright 2026 Precis Team
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
"""
|
|
17
|
+
@fileoverview Strip 转换运行器
|
|
18
|
+
|
|
19
|
+
功能概述:
|
|
20
|
+
- 去除字符串首尾空白字符
|
|
21
|
+
- 支持自定义要去除的字符集合
|
|
22
|
+
|
|
23
|
+
参数:
|
|
24
|
+
chars: 要去除的字符集合(默认 None,去除所有空白)
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from __future__ import annotations
|
|
28
|
+
|
|
29
|
+
from typing import Any
|
|
30
|
+
|
|
31
|
+
import pandas as pd
|
|
32
|
+
|
|
33
|
+
from .base import TransformRunner, stringify_preserve_null
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class StripRunner(TransformRunner):
|
|
37
|
+
"""@classdesc 字符串去除空白转换运行器"""
|
|
38
|
+
|
|
39
|
+
def execute(
|
|
40
|
+
self,
|
|
41
|
+
df: pd.DataFrame,
|
|
42
|
+
input_column: str,
|
|
43
|
+
params: dict[str, Any],
|
|
44
|
+
output_columns: list[str],
|
|
45
|
+
) -> pd.DataFrame:
|
|
46
|
+
"""
|
|
47
|
+
@methoddesc 执行 去除空白转换
|
|
48
|
+
|
|
49
|
+
业务用途:
|
|
50
|
+
- TransformRunner 协议的标准入口,由 transform 节点调用
|
|
51
|
+
- 读取 params 中的转换参数,对 input_column 应用转换,输出到 output_columns
|
|
52
|
+
|
|
53
|
+
参数:
|
|
54
|
+
df: 源 DataFrame
|
|
55
|
+
input_column: 输入列名
|
|
56
|
+
params: 转换参数字典
|
|
57
|
+
output_columns: 目标输出列名列表
|
|
58
|
+
|
|
59
|
+
返回:
|
|
60
|
+
转换后的 DataFrame
|
|
61
|
+
"""
|
|
62
|
+
chars = params.get("chars", None)
|
|
63
|
+
|
|
64
|
+
if input_column not in df.columns:
|
|
65
|
+
raise ValueError(f"输入列不存在: {input_column}")
|
|
66
|
+
|
|
67
|
+
if not output_columns:
|
|
68
|
+
raise ValueError("Strip 需要至少一个 output_columns")
|
|
69
|
+
|
|
70
|
+
output_col = output_columns[0]
|
|
71
|
+
df[output_col] = stringify_preserve_null(df[input_column]).str.strip(chars)
|
|
72
|
+
|
|
73
|
+
return df
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
#
|
|
3
|
+
# Copyright 2026 Precis Team
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
"""
|
|
17
|
+
@fileoverview Substring 转换运行器
|
|
18
|
+
|
|
19
|
+
功能概述:
|
|
20
|
+
- 从字符串中提取子串
|
|
21
|
+
- 支持 start(起始位置)、end(结束位置)、length(长度)三种参数组合
|
|
22
|
+
|
|
23
|
+
参数:
|
|
24
|
+
start: 起始位置(从0开始,负数表示从末尾倒数)
|
|
25
|
+
end: 结束位置(可选,不包含)
|
|
26
|
+
length: 截取长度(可选,优先级高于 end)
|
|
27
|
+
|
|
28
|
+
输入输出:
|
|
29
|
+
输入: "11010119900307889X"
|
|
30
|
+
参数: {"start": 0, "length": 17}
|
|
31
|
+
输出: "11010119900307889"
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
from __future__ import annotations
|
|
35
|
+
|
|
36
|
+
from typing import Any
|
|
37
|
+
|
|
38
|
+
import pandas as pd
|
|
39
|
+
|
|
40
|
+
from .base import TransformRunner, stringify_preserve_null
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class SubstringRunner(TransformRunner):
|
|
44
|
+
"""@classdesc 子串提取转换运行器"""
|
|
45
|
+
|
|
46
|
+
def execute(
|
|
47
|
+
self,
|
|
48
|
+
df: pd.DataFrame,
|
|
49
|
+
input_column: str,
|
|
50
|
+
params: dict[str, Any],
|
|
51
|
+
output_columns: list[str],
|
|
52
|
+
) -> pd.DataFrame:
|
|
53
|
+
"""
|
|
54
|
+
@methoddesc 执行 子字符串转换
|
|
55
|
+
|
|
56
|
+
业务用途:
|
|
57
|
+
- TransformRunner 协议的标准入口,由 transform 节点调用
|
|
58
|
+
- 读取 params 中的转换参数,对 input_column 应用转换,输出到 output_columns
|
|
59
|
+
|
|
60
|
+
参数:
|
|
61
|
+
df: 源 DataFrame
|
|
62
|
+
input_column: 输入列名
|
|
63
|
+
params: 转换参数字典
|
|
64
|
+
output_columns: 目标输出列名列表
|
|
65
|
+
|
|
66
|
+
返回:
|
|
67
|
+
转换后的 DataFrame
|
|
68
|
+
"""
|
|
69
|
+
start = params.get("start", 0)
|
|
70
|
+
end = params.get("end")
|
|
71
|
+
length = params.get("length")
|
|
72
|
+
|
|
73
|
+
if input_column not in df.columns:
|
|
74
|
+
raise ValueError(f"输入列不存在: {input_column}")
|
|
75
|
+
|
|
76
|
+
output_col = output_columns[0] if output_columns else "substring"
|
|
77
|
+
|
|
78
|
+
def _substring(value: str) -> str:
|
|
79
|
+
s = str(value)
|
|
80
|
+
_start = start if start is not None else 0
|
|
81
|
+
|
|
82
|
+
if length is not None:
|
|
83
|
+
return s[_start : _start + length]
|
|
84
|
+
elif end is not None:
|
|
85
|
+
return s[_start:end]
|
|
86
|
+
else:
|
|
87
|
+
return s[_start:]
|
|
88
|
+
|
|
89
|
+
# 空值透传为 None:None 不进入切片(原 astype(str) 会切出 "nan" 片段)
|
|
90
|
+
df[output_col] = stringify_preserve_null(df[input_column]).apply(lambda s: None if s is None else _substring(s))
|
|
91
|
+
|
|
92
|
+
return df
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
#
|
|
3
|
+
# Copyright 2026 Precis Team
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
"""
|
|
17
|
+
@fileoverview UpperCase 转换运行器
|
|
18
|
+
|
|
19
|
+
功能概述:
|
|
20
|
+
- 将字符串转换为大写
|
|
21
|
+
|
|
22
|
+
参数:
|
|
23
|
+
无
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
from typing import Any
|
|
29
|
+
|
|
30
|
+
import pandas as pd
|
|
31
|
+
|
|
32
|
+
from .base import TransformRunner, stringify_preserve_null
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class UpperCaseRunner(TransformRunner):
|
|
36
|
+
"""@classdesc 字符串转大写转换运行器"""
|
|
37
|
+
|
|
38
|
+
def execute(
|
|
39
|
+
self,
|
|
40
|
+
df: pd.DataFrame,
|
|
41
|
+
input_column: str,
|
|
42
|
+
params: dict[str, Any],
|
|
43
|
+
output_columns: list[str],
|
|
44
|
+
) -> pd.DataFrame:
|
|
45
|
+
"""
|
|
46
|
+
@methoddesc 执行 转大写转换
|
|
47
|
+
|
|
48
|
+
业务用途:
|
|
49
|
+
- TransformRunner 协议的标准入口,由 transform 节点调用
|
|
50
|
+
- 读取 params 中的转换参数,对 input_column 应用转换,输出到 output_columns
|
|
51
|
+
|
|
52
|
+
参数:
|
|
53
|
+
df: 源 DataFrame
|
|
54
|
+
input_column: 输入列名
|
|
55
|
+
params: 转换参数字典
|
|
56
|
+
output_columns: 目标输出列名列表
|
|
57
|
+
|
|
58
|
+
返回:
|
|
59
|
+
转换后的 DataFrame
|
|
60
|
+
"""
|
|
61
|
+
if input_column not in df.columns:
|
|
62
|
+
raise ValueError(f"输入列不存在: {input_column}")
|
|
63
|
+
|
|
64
|
+
if not output_columns:
|
|
65
|
+
raise ValueError("UpperCase 需要至少一个 output_columns")
|
|
66
|
+
|
|
67
|
+
output_col = output_columns[0]
|
|
68
|
+
df[output_col] = stringify_preserve_null(df[input_column]).str.upper()
|
|
69
|
+
|
|
70
|
+
return df
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
#
|
|
3
|
+
# Copyright 2026 Precis Team
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
"""
|
|
17
|
+
@fileoverview WeightedSum 转换运行器
|
|
18
|
+
|
|
19
|
+
功能概述:
|
|
20
|
+
- 对输入值按权重数组求和
|
|
21
|
+
- 支持两种输入格式:
|
|
22
|
+
1. 纯数字字符串(如 "110101"),逐字符转数字后加权
|
|
23
|
+
2. 逗号分隔数字(如 "1,1,0,1,0,1"),split 后加权
|
|
24
|
+
|
|
25
|
+
参数:
|
|
26
|
+
weights: 权重数组(如 [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2])
|
|
27
|
+
|
|
28
|
+
输入输出:
|
|
29
|
+
输入: "11010119900307889" 或 "1,1,0,1,0,1,1,9,9,0,0,3,0,7,8,8,9"
|
|
30
|
+
输出: 266(加权和)
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
from __future__ import annotations
|
|
34
|
+
|
|
35
|
+
from typing import Any
|
|
36
|
+
|
|
37
|
+
import pandas as pd
|
|
38
|
+
|
|
39
|
+
from .base import TransformRunner, stringify_preserve_null
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class WeightedSumRunner(TransformRunner):
|
|
43
|
+
"""@classdesc 加权求和转换运行器"""
|
|
44
|
+
|
|
45
|
+
def execute(
|
|
46
|
+
self,
|
|
47
|
+
df: pd.DataFrame,
|
|
48
|
+
input_column: str,
|
|
49
|
+
params: dict[str, Any],
|
|
50
|
+
output_columns: list[str],
|
|
51
|
+
) -> pd.DataFrame:
|
|
52
|
+
"""
|
|
53
|
+
@methoddesc 执行 加权求和转换
|
|
54
|
+
|
|
55
|
+
业务用途:
|
|
56
|
+
- TransformRunner 协议的标准入口,由 transform 节点调用
|
|
57
|
+
- 读取 params 中的转换参数,对 input_column 应用转换,输出到 output_columns
|
|
58
|
+
|
|
59
|
+
参数:
|
|
60
|
+
df: 源 DataFrame
|
|
61
|
+
input_column: 输入列名
|
|
62
|
+
params: 转换参数字典
|
|
63
|
+
output_columns: 目标输出列名列表
|
|
64
|
+
|
|
65
|
+
返回:
|
|
66
|
+
转换后的 DataFrame
|
|
67
|
+
"""
|
|
68
|
+
weights = params.get("weights", [])
|
|
69
|
+
if not weights:
|
|
70
|
+
raise ValueError("WeightedSum 需要 weights 参数")
|
|
71
|
+
|
|
72
|
+
if input_column not in df.columns:
|
|
73
|
+
raise ValueError(f"输入列不存在: {input_column}")
|
|
74
|
+
|
|
75
|
+
output_col = output_columns[0] if output_columns else "weighted_sum"
|
|
76
|
+
|
|
77
|
+
def _weighted_sum(value: str) -> int:
|
|
78
|
+
# 逗号分隔或纯字符串都支持
|
|
79
|
+
if "," in str(value):
|
|
80
|
+
digits = [d.strip() for d in str(value).split(",")]
|
|
81
|
+
else:
|
|
82
|
+
digits = list(str(value))
|
|
83
|
+
|
|
84
|
+
# §1.24: 位数不齐报错——原实现超位静默截断(身份证校验位算错)、
|
|
85
|
+
# 不足位无校验,校验和数字对不上但无提示。典型场景位数恒定,不齐即配置/数据错误。
|
|
86
|
+
if len(digits) > len(weights):
|
|
87
|
+
raise ValueError(f"输入位数({len(digits)})超过权重位数({len(weights)}): '{value}'")
|
|
88
|
+
if len(digits) < len(weights):
|
|
89
|
+
raise ValueError(f"输入位数({len(digits)})不足权重位数({len(weights)}): '{value}'")
|
|
90
|
+
|
|
91
|
+
total = 0
|
|
92
|
+
for i, d in enumerate(digits):
|
|
93
|
+
try:
|
|
94
|
+
total += int(d) * weights[i]
|
|
95
|
+
except (ValueError, TypeError):
|
|
96
|
+
continue
|
|
97
|
+
return total
|
|
98
|
+
|
|
99
|
+
# 空值透传为 None,不把 "nan" 求和成 0
|
|
100
|
+
df[output_col] = stringify_preserve_null(df[input_column]).apply(
|
|
101
|
+
lambda s: None if s is None else _weighted_sum(s)
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
return df
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
#
|
|
3
|
+
# Copyright 2026 Precis Team
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
"""
|
|
17
|
+
@fileoverview 数据约束兼容导出模块
|
|
18
|
+
|
|
19
|
+
功能概述:
|
|
20
|
+
- 作为约束系统的兼容层,保留同名符号导出
|
|
21
|
+
- 避免因约束实现拆分带来的外部导入路径变更和破坏性影响
|
|
22
|
+
- 集中导出所有约束类型和条件注册表
|
|
23
|
+
|
|
24
|
+
架构设计:
|
|
25
|
+
- 代理导出模式: 实际实现已迁移至 app.shared.domain.constraints 包
|
|
26
|
+
- 本模块仅做 re-export,无独立业务逻辑
|
|
27
|
+
|
|
28
|
+
输入示例:
|
|
29
|
+
from app.shared.domain.validation_constraints import NotNullConstraint, UniqueConstraint, CONDITION_REGISTRY
|
|
30
|
+
|
|
31
|
+
输出示例:
|
|
32
|
+
# 可直接使用所有约束类和 register_condition 装饰器
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
# 1. 项目内部导入
|
|
36
|
+
# 从新的约束包中导入所有约束类,保持向后兼容
|
|
37
|
+
# 外部代码仍可通过本模块导入,无需修改导入路径
|
|
38
|
+
from app.shared.domain.constraints import (
|
|
39
|
+
AllowedValuesConstraint,
|
|
40
|
+
CharsetConstraint,
|
|
41
|
+
CompositeConstraint,
|
|
42
|
+
ConditionalConstraint,
|
|
43
|
+
Constraint,
|
|
44
|
+
DateLogicConstraint,
|
|
45
|
+
ForeignKeyConstraints,
|
|
46
|
+
NotNullConstraint,
|
|
47
|
+
RangeConstraint,
|
|
48
|
+
ScriptedConstraint,
|
|
49
|
+
UniqueConstraint,
|
|
50
|
+
)
|
|
51
|
+
from app.shared.domain.constraints.condition_registry import CONDITION_REGISTRY, register_condition
|
|
52
|
+
|
|
53
|
+
# __all__ 显式声明本模块对外暴露的符号
|
|
54
|
+
# 作用:1. 控制 from module import * 的行为;2. 明确模块公共 API 边界
|
|
55
|
+
__all__ = [
|
|
56
|
+
"AllowedValuesConstraint",
|
|
57
|
+
"CharsetConstraint",
|
|
58
|
+
"CompositeConstraint",
|
|
59
|
+
"CONDITION_REGISTRY",
|
|
60
|
+
"ConditionalConstraint",
|
|
61
|
+
"Constraint",
|
|
62
|
+
"DateLogicConstraint",
|
|
63
|
+
"ForeignKeyConstraints",
|
|
64
|
+
"NotNullConstraint",
|
|
65
|
+
"RangeConstraint",
|
|
66
|
+
"ScriptedConstraint",
|
|
67
|
+
"UniqueConstraint",
|
|
68
|
+
"register_condition",
|
|
69
|
+
]
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
#
|
|
3
|
+
# Copyright 2026 Precis Team
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
"""
|
|
17
|
+
@fileoverview 共享服务层包初始化模块
|
|
18
|
+
|
|
19
|
+
功能概述:
|
|
20
|
+
- 聚合并暴露校验服务相关的类和函数
|
|
21
|
+
- 统一导出校验器、执行器、校验结果等核心组件
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from .validation import (
|
|
25
|
+
BaseValidator,
|
|
26
|
+
ChunkedDataLoader,
|
|
27
|
+
ChunkedValidationResult,
|
|
28
|
+
CompositeValidator,
|
|
29
|
+
ConstraintAdapter,
|
|
30
|
+
DateLogicValidator,
|
|
31
|
+
MemoryMonitor,
|
|
32
|
+
PreCheck,
|
|
33
|
+
UnifiedValidationService,
|
|
34
|
+
ValidationResult,
|
|
35
|
+
ValidationType,
|
|
36
|
+
load_file_data,
|
|
37
|
+
)
|
|
38
|
+
from .validation.engine import validate_full_dataset
|
|
39
|
+
from .validation.executor import (
|
|
40
|
+
ValidationExecutor,
|
|
41
|
+
ValidationOptions,
|
|
42
|
+
create_executor,
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
__all__ = [
|
|
46
|
+
"ValidationType",
|
|
47
|
+
"ValidationResult",
|
|
48
|
+
"UnifiedValidationService",
|
|
49
|
+
"load_file_data",
|
|
50
|
+
"BaseValidator",
|
|
51
|
+
"ConstraintAdapter",
|
|
52
|
+
"PreCheck",
|
|
53
|
+
"CompositeValidator",
|
|
54
|
+
"DateLogicValidator",
|
|
55
|
+
"ValidationExecutor",
|
|
56
|
+
"ValidationOptions",
|
|
57
|
+
"create_executor",
|
|
58
|
+
"validate_full_dataset",
|
|
59
|
+
"MemoryMonitor",
|
|
60
|
+
"ChunkedDataLoader",
|
|
61
|
+
"ChunkedValidationResult",
|
|
62
|
+
]
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
#
|
|
3
|
+
# Copyright 2026 Precis Team
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
"""
|
|
17
|
+
@fileoverview AI 服务统一导出模块
|
|
18
|
+
|
|
19
|
+
功能概述:
|
|
20
|
+
- 向后兼容地暴露配置生成器核心接口
|
|
21
|
+
- 将 llm.config_generator 的公共 API 聚合到 app.shared.services.ai 命名空间
|
|
22
|
+
|
|
23
|
+
架构设计:
|
|
24
|
+
- 作为兼容层存在,避免历史调用方修改导入路径
|
|
25
|
+
- 通过 __all__ 明确控制对外暴露的符号
|
|
26
|
+
|
|
27
|
+
输入示例:
|
|
28
|
+
from app.shared.services.ai import generate_full_config_v2, GenerateOptions
|
|
29
|
+
|
|
30
|
+
输出示例:
|
|
31
|
+
可直接调用 generate_full_config_v2(options) 生成 V2 项目配置
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
from app.shared.services.llm.config_generator import (
|
|
35
|
+
V2_MANIFEST_FILENAME,
|
|
36
|
+
GenerateOptions,
|
|
37
|
+
ProfilingOptions,
|
|
38
|
+
expand_data_input_paths,
|
|
39
|
+
generate_full_config_v2,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
__all__ = [
|
|
43
|
+
"ProfilingOptions",
|
|
44
|
+
"GenerateOptions",
|
|
45
|
+
"generate_full_config_v2",
|
|
46
|
+
"expand_data_input_paths",
|
|
47
|
+
"V2_MANIFEST_FILENAME",
|
|
48
|
+
]
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
#
|
|
3
|
+
# Copyright 2026 Precis Team
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
"""Agent 内核模块"""
|
|
17
|
+
|
|
18
|
+
from app.shared.services.ai.agent.executor import AgentExecutor
|
|
19
|
+
from app.shared.services.ai.agent.memory import AgentMemory
|
|
20
|
+
from app.shared.services.ai.agent.tool_registry import ToolRegistry
|
|
21
|
+
from app.shared.services.ai.agent.types import (
|
|
22
|
+
AgentMetrics,
|
|
23
|
+
AgentPlan,
|
|
24
|
+
AgentResult,
|
|
25
|
+
AgentTurn,
|
|
26
|
+
ToolCall,
|
|
27
|
+
ToolResult,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
__all__ = [
|
|
31
|
+
"AgentExecutor",
|
|
32
|
+
"AgentMemory",
|
|
33
|
+
"AgentMetrics",
|
|
34
|
+
"AgentPlan",
|
|
35
|
+
"AgentResult",
|
|
36
|
+
"AgentTurn",
|
|
37
|
+
"ToolCall",
|
|
38
|
+
"ToolRegistry",
|
|
39
|
+
"ToolResult",
|
|
40
|
+
]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
#
|
|
3
|
+
# Copyright 2026 Precis Team
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
"""Chat mini-agent 专用工具模块
|
|
17
|
+
|
|
18
|
+
6 个工具构成"查-改-验"核心闭环:
|
|
19
|
+
- ReadProjectTool: 读取项目概览(查)
|
|
20
|
+
- ReadTableTool: 读取表数据样本(查)
|
|
21
|
+
- ApplyActionsTool: 执行配置修改(改)
|
|
22
|
+
- ValidateTableTool: 执行数据校验(验)
|
|
23
|
+
- ReadCanvasTool: 读取画布上实际显示的节点快照(查)
|
|
24
|
+
区别于 read_project 读项目配置文件——解决"配置里有但画布上没有"的同步鸿沟
|
|
25
|
+
- AskUserTool: 向用户追加提问(交互)
|
|
26
|
+
|
|
27
|
+
这些工具与 generation 路径的工具集完全独立:
|
|
28
|
+
- 面向"增量改现有项目"场景,而非"从零生成完整配置"
|
|
29
|
+
- 不依赖 ConfigGenerationService,仅依赖确认存在的公共后端入口
|
|
30
|
+
- 通过 asyncio.to_thread 包装同步入口,避免阻塞事件循环
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
from app.shared.services.ai.agent.chat_tools.apply_actions import ApplyActionsTool
|
|
34
|
+
from app.shared.services.ai.agent.chat_tools.ask_user import AskUserTool
|
|
35
|
+
from app.shared.services.ai.agent.chat_tools.read_canvas import ReadCanvasTool
|
|
36
|
+
from app.shared.services.ai.agent.chat_tools.read_project import ReadProjectTool
|
|
37
|
+
from app.shared.services.ai.agent.chat_tools.read_table import ReadTableTool
|
|
38
|
+
from app.shared.services.ai.agent.chat_tools.validate_table import ValidateTableTool
|
|
39
|
+
|
|
40
|
+
__all__ = [
|
|
41
|
+
"ApplyActionsTool",
|
|
42
|
+
"AskUserTool",
|
|
43
|
+
"ReadCanvasTool",
|
|
44
|
+
"ReadProjectTool",
|
|
45
|
+
"ReadTableTool",
|
|
46
|
+
"ValidateTableTool",
|
|
47
|
+
]
|