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.
Files changed (442) hide show
  1. app/__init__.py +16 -0
  2. app/api/__init__.py +32 -0
  3. app/api/dependencies.py +185 -0
  4. app/api/main.py +301 -0
  5. app/api/middleware/__init__.py +34 -0
  6. app/api/middleware/exception_handler.py +126 -0
  7. app/api/middleware/request_logging.py +97 -0
  8. app/api/middleware/token_auth.py +215 -0
  9. app/api/models/__init__.py +151 -0
  10. app/api/models/connection_rules.py +98 -0
  11. app/api/models/files.py +99 -0
  12. app/api/models/full_validation.py +554 -0
  13. app/api/models/project.py +117 -0
  14. app/api/models/projects.py +80 -0
  15. app/api/models/schema.py +121 -0
  16. app/api/models/v2_responses.py +46 -0
  17. app/api/models/validation.py +303 -0
  18. app/api/models/workspace.py +118 -0
  19. app/api/routers/__init__.py +56 -0
  20. app/api/routers/ai/__init__.py +36 -0
  21. app/api/routers/ai/chat.py +243 -0
  22. app/api/routers/ai/generate.py +156 -0
  23. app/api/routers/ai/hardware.py +199 -0
  24. app/api/routers/ai/jobs.py +544 -0
  25. app/api/routers/ai/migrate.py +471 -0
  26. app/api/routers/ai/models.py +352 -0
  27. app/api/routers/ai/ollama.py +108 -0
  28. app/api/routers/ai/providers.py +491 -0
  29. app/api/routers/ai/router.py +44 -0
  30. app/api/routers/ai/stream.py +281 -0
  31. app/api/routers/ai/utils.py +182 -0
  32. app/api/routers/core/__init__.py +34 -0
  33. app/api/routers/core/connection_rules.py +188 -0
  34. app/api/routers/core/data_sources.py +374 -0
  35. app/api/routers/core/regex.py +333 -0
  36. app/api/routers/core/reporting.py +263 -0
  37. app/api/routers/files/__init__.py +24 -0
  38. app/api/routers/files/ops.py +179 -0
  39. app/api/routers/files/transfer.py +101 -0
  40. app/api/routers/preview/__init__.py +35 -0
  41. app/api/routers/preview/content_mode.py +264 -0
  42. app/api/routers/preview/header_row.py +154 -0
  43. app/api/routers/preview/models.py +81 -0
  44. app/api/routers/preview/path_mode.py +440 -0
  45. app/api/routers/preview/router.py +30 -0
  46. app/api/routers/project/__init__.py +61 -0
  47. app/api/routers/project/base.py +111 -0
  48. app/api/routers/project/constraint.py +345 -0
  49. app/api/routers/project/full_config.py +411 -0
  50. app/api/routers/project/full_config_writer.py +327 -0
  51. app/api/routers/project/helpers.py +167 -0
  52. app/api/routers/project/inspection_fix.py +330 -0
  53. app/api/routers/project/manifest.py +605 -0
  54. app/api/routers/project/models.py +177 -0
  55. app/api/routers/project/pattern.py +268 -0
  56. app/api/routers/project/regex.py +358 -0
  57. app/api/routers/project/scanner.py +157 -0
  58. app/api/routers/project/schema.py +567 -0
  59. app/api/routers/project/schema_helpers.py +149 -0
  60. app/api/routers/project/settings.py +399 -0
  61. app/api/routers/project/template.py +325 -0
  62. app/api/routers/project/validation.py +227 -0
  63. app/api/routers/project/view.py +177 -0
  64. app/api/routers/project/workspaces.py +167 -0
  65. app/api/routers/projects/__init__.py +25 -0
  66. app/api/routers/projects/create.py +121 -0
  67. app/api/routers/projects/open.py +103 -0
  68. app/api/routers/projects/scan.py +100 -0
  69. app/api/routers/validation/__init__.py +39 -0
  70. app/api/routers/validation/common.py +263 -0
  71. app/api/routers/validation/content_mode.py +401 -0
  72. app/api/routers/validation/history.py +235 -0
  73. app/api/routers/validation/inline_mode.py +196 -0
  74. app/api/routers/validation/path_mode.py +314 -0
  75. app/api/routers/validation/router.py +51 -0
  76. app/api/services/full_validation_response_builder.py +412 -0
  77. app/api/services/io_error_messages.py +41 -0
  78. app/api/services/preview_service.py +248 -0
  79. app/cli/__init__.py +18 -0
  80. app/cli/__main__.py +30 -0
  81. app/cli/shared_services/__init__.py +42 -0
  82. app/cli/shared_services/config_ops.py +581 -0
  83. app/cli/shared_services/generation_ops.py +160 -0
  84. app/cli/shared_services/project_ops.py +288 -0
  85. app/cli/shell/__init__.py +48 -0
  86. app/cli/shell/commands/__init__.py +63 -0
  87. app/cli/shell/commands/ai/__init__.py +260 -0
  88. app/cli/shell/commands/ai/chat.py +331 -0
  89. app/cli/shell/commands/ai/delete.py +165 -0
  90. app/cli/shell/commands/ai/diff.py +70 -0
  91. app/cli/shell/commands/ai/display.py +428 -0
  92. app/cli/shell/commands/ai/executor.py +225 -0
  93. app/cli/shell/commands/ai/executor_utils.py +271 -0
  94. app/cli/shell/commands/ai/generate.py +285 -0
  95. app/cli/shell/commands/ai/interaction.py +262 -0
  96. app/cli/shell/commands/ai/migrate.py +281 -0
  97. app/cli/shell/commands/ai/resolver.py +224 -0
  98. app/cli/shell/commands/ai/status.py +101 -0
  99. app/cli/shell/commands/ai/switch.py +158 -0
  100. app/cli/shell/commands/ai/utils.py +52 -0
  101. app/cli/shell/commands/base.py +343 -0
  102. app/cli/shell/commands/config/__init__.py +131 -0
  103. app/cli/shell/commands/config/base.py +80 -0
  104. app/cli/shell/commands/config/check.py +246 -0
  105. app/cli/shell/commands/config/edit.py +148 -0
  106. app/cli/shell/commands/config/get.py +111 -0
  107. app/cli/shell/commands/config/init.py +123 -0
  108. app/cli/shell/commands/config/inspect.py +164 -0
  109. app/cli/shell/commands/config/list.py +104 -0
  110. app/cli/shell/commands/config/set.py +119 -0
  111. app/cli/shell/commands/config/show.py +150 -0
  112. app/cli/shell/commands/exit.py +67 -0
  113. app/cli/shell/commands/help.py +104 -0
  114. app/cli/shell/commands/infer_schema.py +156 -0
  115. app/cli/shell/commands/open.py +201 -0
  116. app/cli/shell/commands/project.py +215 -0
  117. app/cli/shell/commands/provider.py +619 -0
  118. app/cli/shell/commands/system.py +170 -0
  119. app/cli/shell/commands/validate.py +455 -0
  120. app/cli/shell/completer.py +231 -0
  121. app/cli/shell/config_storage.py +191 -0
  122. app/cli/shell/exceptions.py +90 -0
  123. app/cli/shell/formatter.py +371 -0
  124. app/cli/shell/interactive_menu.py +348 -0
  125. app/cli/shell/main.py +286 -0
  126. app/cli/shell/parser.py +266 -0
  127. app/cli/start.py +180 -0
  128. app/cli_main.py +52 -0
  129. app/mcp_server.py +311 -0
  130. app/shared/core/__init__.py +18 -0
  131. app/shared/core/app_version.py +59 -0
  132. app/shared/core/config/__init__.py +119 -0
  133. app/shared/core/config/server.py +193 -0
  134. app/shared/core/data_source/__init__.py +106 -0
  135. app/shared/core/data_source/loader.py +348 -0
  136. app/shared/core/data_source/loaders/__init__.py +213 -0
  137. app/shared/core/data_source/loaders/base.py +215 -0
  138. app/shared/core/data_source/loaders/converter.py +337 -0
  139. app/shared/core/data_source/loaders/csv_loader.py +252 -0
  140. app/shared/core/data_source/loaders/excel_loader.py +666 -0
  141. app/shared/core/data_source/loaders/extractor.py +268 -0
  142. app/shared/core/data_source/loaders/json_loader.py +354 -0
  143. app/shared/core/data_source/loaders/registry.py +88 -0
  144. app/shared/core/data_source/loaders/sql_loader.py +313 -0
  145. app/shared/core/data_source/loaders/strategies/__init__.py +100 -0
  146. app/shared/core/data_source/loaders/strategies/array_parser.py +277 -0
  147. app/shared/core/data_source/loaders/strategies/lines_parser.py +355 -0
  148. app/shared/core/data_source/loaders/strategies/object_parser.py +278 -0
  149. app/shared/core/data_source/schema_info.py +50 -0
  150. app/shared/core/data_source/specs/__init__.py +128 -0
  151. app/shared/core/data_source/specs/base.py +258 -0
  152. app/shared/core/data_source/specs/csv_source.py +137 -0
  153. app/shared/core/data_source/specs/excel_source.py +141 -0
  154. app/shared/core/data_source/specs/file_base.py +252 -0
  155. app/shared/core/data_source/specs/json_source.py +226 -0
  156. app/shared/core/data_source/specs/sql_source.py +161 -0
  157. app/shared/core/encoding.py +36 -0
  158. app/shared/core/io/__init__.py +24 -0
  159. app/shared/core/io/yaml.py +379 -0
  160. app/shared/core/manifest_schema/__init__.py +52 -0
  161. app/shared/core/manifest_schema/types.py +99 -0
  162. app/shared/core/manifest_schema/version.py +175 -0
  163. app/shared/core/patterns/__init__.py +24 -0
  164. app/shared/core/patterns/loader.py +134 -0
  165. app/shared/core/patterns/writer.py +244 -0
  166. app/shared/core/project/__init__.py +47 -0
  167. app/shared/core/project/constraint/builders/__init__.py +50 -0
  168. app/shared/core/project/constraint/builders/base.py +100 -0
  169. app/shared/core/project/constraint/builders/composite.py +77 -0
  170. app/shared/core/project/constraint/builders/conditional.py +67 -0
  171. app/shared/core/project/constraint/builders/foreign_key.py +53 -0
  172. app/shared/core/project/constraint/builders/registry.py +64 -0
  173. app/shared/core/project/constraint/builders/scripted.py +51 -0
  174. app/shared/core/project/constraint/builders/single_column.py +86 -0
  175. app/shared/core/project/constraint/builders/unique.py +53 -0
  176. app/shared/core/project/constraint/factory.py +170 -0
  177. app/shared/core/project/constraint/reader.py +214 -0
  178. app/shared/core/project/constraint/registry.py +233 -0
  179. app/shared/core/project/constraint/types/__init__.py +63 -0
  180. app/shared/core/project/constraint/types/constraint_file.py +261 -0
  181. app/shared/core/project/constraint/types/refs.py +460 -0
  182. app/shared/core/project/constraint/types.py +28 -0
  183. app/shared/core/project/constraint/writer.py +181 -0
  184. app/shared/core/project/loader/__init__.py +56 -0
  185. app/shared/core/project/loader/loader.py +30 -0
  186. app/shared/core/project/loader/loader_parts/config_inspector.py +137 -0
  187. app/shared/core/project/loader/loader_parts/embedded_constraints.py +224 -0
  188. app/shared/core/project/loader/loader_parts/file_loaders.py +58 -0
  189. app/shared/core/project/loader/loader_parts/inspection_ids.py +85 -0
  190. app/shared/core/project/loader/loader_parts/inspector_helpers.py +312 -0
  191. app/shared/core/project/loader/loader_parts/inspector_id_checks.py +274 -0
  192. app/shared/core/project/loader/loader_parts/inspector_reference_checks.py +690 -0
  193. app/shared/core/project/loader/loader_parts/inspector_uniqueness_checks.py +286 -0
  194. app/shared/core/project/loader/loader_parts/loading_error_messages.py +298 -0
  195. app/shared/core/project/loader/loader_parts/main.py +432 -0
  196. app/shared/core/project/loader/loader_parts/path_validation.py +117 -0
  197. app/shared/core/project/loader/loader_parts/runtime.py +125 -0
  198. app/shared/core/project/loader/types.py +246 -0
  199. app/shared/core/project/manifest/coverage.py +391 -0
  200. app/shared/core/project/manifest/reader.py +260 -0
  201. app/shared/core/project/manifest/types.py +91 -0
  202. app/shared/core/project/manifest/types_parts/__init__.py +60 -0
  203. app/shared/core/project/manifest/types_parts/constants.py +40 -0
  204. app/shared/core/project/manifest/types_parts/data_source.py +68 -0
  205. app/shared/core/project/manifest/types_parts/info.py +59 -0
  206. app/shared/core/project/manifest/types_parts/manifest.py +294 -0
  207. app/shared/core/project/manifest/types_parts/refs.py +153 -0
  208. app/shared/core/project/manifest/types_parts/settings.py +92 -0
  209. app/shared/core/project/manifest/types_parts/settings_file_processing.py +64 -0
  210. app/shared/core/project/manifest/types_parts/settings_script_security.py +78 -0
  211. app/shared/core/project/manifest/types_parts/settings_validation.py +83 -0
  212. app/shared/core/project/manifest/types_parts/template.py +66 -0
  213. app/shared/core/project/manifest/writer.py +262 -0
  214. app/shared/core/project/manual_data/__init__.py +27 -0
  215. app/shared/core/project/manual_data/types.py +75 -0
  216. app/shared/core/project/regex/reader.py +197 -0
  217. app/shared/core/project/regex/types.py +405 -0
  218. app/shared/core/project/regex/writer.py +123 -0
  219. app/shared/core/project/schema/reader.py +170 -0
  220. app/shared/core/project/schema/types.py +47 -0
  221. app/shared/core/project/schema/types_parts/__init__.py +36 -0
  222. app/shared/core/project/schema/types_parts/column.py +174 -0
  223. app/shared/core/project/schema/types_parts/column_utils.py +72 -0
  224. app/shared/core/project/schema/types_parts/constraint.py +165 -0
  225. app/shared/core/project/schema/types_parts/schema_id.py +66 -0
  226. app/shared/core/project/schema/types_parts/source.py +255 -0
  227. app/shared/core/project/schema/types_parts/source_options.py +347 -0
  228. app/shared/core/project/schema/types_parts/table.py +230 -0
  229. app/shared/core/project/schema/writer.py +139 -0
  230. app/shared/core/project/schema_ref_check.py +95 -0
  231. app/shared/core/project/template/__init__.py +27 -0
  232. app/shared/core/project/template/expander.py +263 -0
  233. app/shared/core/project/template/reader.py +120 -0
  234. app/shared/core/project/template/types.py +114 -0
  235. app/shared/core/project/transform/reader.py +76 -0
  236. app/shared/core/project/transform/types.py +116 -0
  237. app/shared/core/project/transform/writer.py +84 -0
  238. app/shared/core/pydantic_messages.py +59 -0
  239. app/shared/core/reporter/__init__.py +46 -0
  240. app/shared/core/reporter/reporter.py +220 -0
  241. app/shared/core/reporter/reporters/__init__.py +65 -0
  242. app/shared/core/reporter/reporters/base.py +188 -0
  243. app/shared/core/reporter/reporters/dingtalk_app_reporter.py +274 -0
  244. app/shared/core/reporter/reporters/email_reporter.py +271 -0
  245. app/shared/core/reporter/reporters/feishu_app_reporter.py +467 -0
  246. app/shared/core/reporter/reporters/local_file_reporter.py +208 -0
  247. app/shared/core/reporter/reporters/wecom_app_reporter.py +268 -0
  248. app/shared/core/utils/__init__.py +18 -0
  249. app/shared/core/utils/path_utils.py +60 -0
  250. app/shared/core/utils/regex_extract.py +113 -0
  251. app/shared/domain/__init__.py +114 -0
  252. app/shared/domain/constraints/__init__.py +76 -0
  253. app/shared/domain/constraints/allowed_values.py +211 -0
  254. app/shared/domain/constraints/base.py +141 -0
  255. app/shared/domain/constraints/charset.py +337 -0
  256. app/shared/domain/constraints/composite.py +174 -0
  257. app/shared/domain/constraints/condition_registry.py +130 -0
  258. app/shared/domain/constraints/conditional.py +629 -0
  259. app/shared/domain/constraints/date_logic.py +731 -0
  260. app/shared/domain/constraints/foreign_key.py +261 -0
  261. app/shared/domain/constraints/key_normalization.py +56 -0
  262. app/shared/domain/constraints/not_null.py +185 -0
  263. app/shared/domain/constraints/range.py +360 -0
  264. app/shared/domain/constraints/regex.py +218 -0
  265. app/shared/domain/constraints/scripted.py +276 -0
  266. app/shared/domain/constraints/unique.py +233 -0
  267. app/shared/domain/data_engine.py +384 -0
  268. app/shared/domain/data_types.py +113 -0
  269. app/shared/domain/data_types_parts/__init__.py +67 -0
  270. app/shared/domain/data_types_parts/base.py +204 -0
  271. app/shared/domain/data_types_parts/composite.py +250 -0
  272. app/shared/domain/data_types_parts/expression.py +202 -0
  273. app/shared/domain/data_types_parts/extracted.py +106 -0
  274. app/shared/domain/data_types_parts/json_types.py +234 -0
  275. app/shared/domain/data_types_parts/scalars.py +719 -0
  276. app/shared/domain/data_types_parts/sequence.py +129 -0
  277. app/shared/domain/dataset_schema.py +48 -0
  278. app/shared/domain/eval_sandbox.py +63 -0
  279. app/shared/domain/expression_system.py +366 -0
  280. app/shared/domain/regex_flags.py +53 -0
  281. app/shared/domain/schema/builder.py +223 -0
  282. app/shared/domain/schema/models.py +339 -0
  283. app/shared/domain/transforms/__init__.py +28 -0
  284. app/shared/domain/transforms/aggregate.py +141 -0
  285. app/shared/domain/transforms/base.py +171 -0
  286. app/shared/domain/transforms/cast_type.py +120 -0
  287. app/shared/domain/transforms/concat.py +103 -0
  288. app/shared/domain/transforms/conditional_assign.py +114 -0
  289. app/shared/domain/transforms/date_format.py +81 -0
  290. app/shared/domain/transforms/digits.py +77 -0
  291. app/shared/domain/transforms/drop_duplicates.py +94 -0
  292. app/shared/domain/transforms/fill_na.py +94 -0
  293. app/shared/domain/transforms/filter_rows.py +97 -0
  294. app/shared/domain/transforms/lookup.py +78 -0
  295. app/shared/domain/transforms/lower_case.py +70 -0
  296. app/shared/domain/transforms/map_value.py +90 -0
  297. app/shared/domain/transforms/math_expr.py +112 -0
  298. app/shared/domain/transforms/modulo.py +82 -0
  299. app/shared/domain/transforms/regex_extract.py +103 -0
  300. app/shared/domain/transforms/registry.py +95 -0
  301. app/shared/domain/transforms/replace.py +88 -0
  302. app/shared/domain/transforms/sort_rows.py +94 -0
  303. app/shared/domain/transforms/string_split.py +84 -0
  304. app/shared/domain/transforms/strip.py +73 -0
  305. app/shared/domain/transforms/substring.py +92 -0
  306. app/shared/domain/transforms/upper_case.py +70 -0
  307. app/shared/domain/transforms/weighted_sum.py +104 -0
  308. app/shared/domain/validation_constraints.py +69 -0
  309. app/shared/services/__init__.py +62 -0
  310. app/shared/services/ai/__init__.py +48 -0
  311. app/shared/services/ai/agent/__init__.py +40 -0
  312. app/shared/services/ai/agent/chat_tools/__init__.py +47 -0
  313. app/shared/services/ai/agent/chat_tools/apply_actions.py +592 -0
  314. app/shared/services/ai/agent/chat_tools/ask_user.py +237 -0
  315. app/shared/services/ai/agent/chat_tools/read_canvas.py +140 -0
  316. app/shared/services/ai/agent/chat_tools/read_project.py +160 -0
  317. app/shared/services/ai/agent/chat_tools/read_table.py +301 -0
  318. app/shared/services/ai/agent/chat_tools/schemas.py +105 -0
  319. app/shared/services/ai/agent/chat_tools/validate_table.py +131 -0
  320. app/shared/services/ai/agent/executor.py +554 -0
  321. app/shared/services/ai/agent/memory.py +256 -0
  322. app/shared/services/ai/agent/planner.py +282 -0
  323. app/shared/services/ai/agent/tool_registry.py +296 -0
  324. app/shared/services/ai/agent/tools/__init__.py +32 -0
  325. app/shared/services/ai/agent/tools/config_generate.py +133 -0
  326. app/shared/services/ai/agent/tools/config_refine.py +109 -0
  327. app/shared/services/ai/agent/tools/config_validate.py +403 -0
  328. app/shared/services/ai/agent/tools/merge_results.py +136 -0
  329. app/shared/services/ai/agent/tools/plan_chunks.py +79 -0
  330. app/shared/services/ai/agent/tools/script_parse.py +359 -0
  331. app/shared/services/ai/agent/types.py +138 -0
  332. app/shared/services/ai/chat_agent_runner.py +596 -0
  333. app/shared/services/ai/chat_orchestrator.py +725 -0
  334. app/shared/services/ai/failure_messages.py +65 -0
  335. app/shared/services/ai/job_storage.py +274 -0
  336. app/shared/services/ai/migrate_service.py +550 -0
  337. app/shared/services/ai/streaming/__init__.py +65 -0
  338. app/shared/services/ai/streaming/event_journal.py +197 -0
  339. app/shared/services/ai/streaming/orchestrator.py +262 -0
  340. app/shared/services/ai/streaming/pending_interaction_store.py +227 -0
  341. app/shared/services/ai/streaming/sse_response.py +148 -0
  342. app/shared/services/ai/streaming/types.py +73 -0
  343. app/shared/services/ai/types.py +213 -0
  344. app/shared/services/ai/utils.py +322 -0
  345. app/shared/services/diff/config_diff.py +320 -0
  346. app/shared/services/hardware.py +237 -0
  347. app/shared/services/llm/__init__.py +62 -0
  348. app/shared/services/llm/actions/__init__.py +42 -0
  349. app/shared/services/llm/actions/_canvas_validator.py +147 -0
  350. app/shared/services/llm/actions/_constraint_validator.py +401 -0
  351. app/shared/services/llm/actions/_regex_validator.py +85 -0
  352. app/shared/services/llm/actions/_schema_validator.py +82 -0
  353. app/shared/services/llm/actions/_settings_validator.py +76 -0
  354. app/shared/services/llm/actions/_transform_validator.py +78 -0
  355. app/shared/services/llm/actions/action_handlers.py +400 -0
  356. app/shared/services/llm/actions/action_parser.py +63 -0
  357. app/shared/services/llm/actions/action_processor.py +468 -0
  358. app/shared/services/llm/actions/action_validator.py +311 -0
  359. app/shared/services/llm/actions/diff_compute.py +195 -0
  360. app/shared/services/llm/actions/regex_handlers.py +284 -0
  361. app/shared/services/llm/actions/registry.py +336 -0
  362. app/shared/services/llm/actions/schema_handlers.py +335 -0
  363. app/shared/services/llm/actions/settings_handlers.py +180 -0
  364. app/shared/services/llm/actions/specs.py +259 -0
  365. app/shared/services/llm/actions/transform_handlers.py +279 -0
  366. app/shared/services/llm/actions/validation_types.py +147 -0
  367. app/shared/services/llm/cache/__init__.py +18 -0
  368. app/shared/services/llm/cache/response_cache.py +80 -0
  369. app/shared/services/llm/chat/__init__.py +35 -0
  370. app/shared/services/llm/chat/chat_system_prompt.py +561 -0
  371. app/shared/services/llm/chat/response_parser.py +296 -0
  372. app/shared/services/llm/config/__init__.py +45 -0
  373. app/shared/services/llm/config/crypto.py +135 -0
  374. app/shared/services/llm/config/loader.py +258 -0
  375. app/shared/services/llm/config/models.py +202 -0
  376. app/shared/services/llm/config/presets.py +128 -0
  377. app/shared/services/llm/config_generator.py +163 -0
  378. app/shared/services/llm/constraints/__init__.py +41 -0
  379. app/shared/services/llm/constraints/constraint_builder.py +177 -0
  380. app/shared/services/llm/constraints/constraint_deletion.py +84 -0
  381. app/shared/services/llm/constraints/constraint_id.py +174 -0
  382. app/shared/services/llm/constraints/frontend_instructions.py +333 -0
  383. app/shared/services/llm/constraints/inline_batch.py +279 -0
  384. app/shared/services/llm/discovery/__init__.py +35 -0
  385. app/shared/services/llm/discovery/scanner.py +181 -0
  386. app/shared/services/llm/generation/__init__.py +42 -0
  387. app/shared/services/llm/generation/agent_wiring.py +156 -0
  388. app/shared/services/llm/generation/config_builder.py +386 -0
  389. app/shared/services/llm/generation/errors.py +36 -0
  390. app/shared/services/llm/generation/existing_config.py +99 -0
  391. app/shared/services/llm/generation/profiler.py +279 -0
  392. app/shared/services/llm/generation/prompt_builder.py +199 -0
  393. app/shared/services/llm/generation/response_parser.py +144 -0
  394. app/shared/services/llm/generation/service.py +622 -0
  395. app/shared/services/llm/models.py +104 -0
  396. app/shared/services/llm/providers/__init__.py +48 -0
  397. app/shared/services/llm/providers/base.py +310 -0
  398. app/shared/services/llm/providers/cached_provider.py +90 -0
  399. app/shared/services/llm/providers/ollama.py +498 -0
  400. app/shared/services/llm/providers/openai.py +334 -0
  401. app/shared/services/llm/providers/registry.py +108 -0
  402. app/shared/services/llm/schema_resolver.py +141 -0
  403. app/shared/services/llm/suggestion_utils.py +219 -0
  404. app/shared/services/llm/validate_executor.py +163 -0
  405. app/shared/services/llm/yaml_io.py +406 -0
  406. app/shared/services/preview/__init__.py +18 -0
  407. app/shared/services/preview/loader.py +145 -0
  408. app/shared/services/preview/path_validation.py +138 -0
  409. app/shared/services/project_loader.py +57 -0
  410. app/shared/services/schema_inference.py +260 -0
  411. app/shared/services/schema_runtime_builder.py +120 -0
  412. app/shared/services/validation/__init__.py +52 -0
  413. app/shared/services/validation/chunked_loader.py +509 -0
  414. app/shared/services/validation/dag/__init__.py +35 -0
  415. app/shared/services/validation/dag/builder.py +141 -0
  416. app/shared/services/validation/dag/executor.py +225 -0
  417. app/shared/services/validation/dag/sorter.py +77 -0
  418. app/shared/services/validation/data_loader.py +231 -0
  419. app/shared/services/validation/engine.py +446 -0
  420. app/shared/services/validation/executor.py +1030 -0
  421. app/shared/services/validation/extractors.py +266 -0
  422. app/shared/services/validation/history.py +209 -0
  423. app/shared/services/validation/json_payload.py +136 -0
  424. app/shared/services/validation/loader.py +152 -0
  425. app/shared/services/validation/memory_monitor.py +179 -0
  426. app/shared/services/validation/postprocess.py +208 -0
  427. app/shared/services/validation/progress.py +64 -0
  428. app/shared/services/validation/report_export.py +222 -0
  429. app/shared/services/validation/resolver.py +180 -0
  430. app/shared/services/validation/service.py +418 -0
  431. app/shared/services/validation/types.py +238 -0
  432. app/shared/services/validation/validators/__init__.py +36 -0
  433. app/shared/services/validation/validators/adapter.py +182 -0
  434. app/shared/services/validation/validators/base.py +332 -0
  435. app/shared/services/validation/validators/composite.py +233 -0
  436. app/shared/services/validation/validators/date_logic.py +276 -0
  437. app/start_server.py +133 -0
  438. precis_cli-0.1.3.dist-info/METADATA +180 -0
  439. precis_cli-0.1.3.dist-info/RECORD +442 -0
  440. precis_cli-0.1.3.dist-info/WHEEL +5 -0
  441. precis_cli-0.1.3.dist-info/entry_points.txt +4 -0
  442. 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
+ ]