nvidia-nat 1.1.0a20251020__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 (480) hide show
  1. aiq/__init__.py +66 -0
  2. nat/agent/__init__.py +0 -0
  3. nat/agent/base.py +265 -0
  4. nat/agent/dual_node.py +72 -0
  5. nat/agent/prompt_optimizer/__init__.py +0 -0
  6. nat/agent/prompt_optimizer/prompt.py +68 -0
  7. nat/agent/prompt_optimizer/register.py +149 -0
  8. nat/agent/react_agent/__init__.py +0 -0
  9. nat/agent/react_agent/agent.py +394 -0
  10. nat/agent/react_agent/output_parser.py +104 -0
  11. nat/agent/react_agent/prompt.py +44 -0
  12. nat/agent/react_agent/register.py +168 -0
  13. nat/agent/reasoning_agent/__init__.py +0 -0
  14. nat/agent/reasoning_agent/reasoning_agent.py +227 -0
  15. nat/agent/register.py +23 -0
  16. nat/agent/rewoo_agent/__init__.py +0 -0
  17. nat/agent/rewoo_agent/agent.py +593 -0
  18. nat/agent/rewoo_agent/prompt.py +107 -0
  19. nat/agent/rewoo_agent/register.py +175 -0
  20. nat/agent/tool_calling_agent/__init__.py +0 -0
  21. nat/agent/tool_calling_agent/agent.py +246 -0
  22. nat/agent/tool_calling_agent/register.py +129 -0
  23. nat/authentication/__init__.py +14 -0
  24. nat/authentication/api_key/__init__.py +14 -0
  25. nat/authentication/api_key/api_key_auth_provider.py +96 -0
  26. nat/authentication/api_key/api_key_auth_provider_config.py +124 -0
  27. nat/authentication/api_key/register.py +26 -0
  28. nat/authentication/credential_validator/__init__.py +14 -0
  29. nat/authentication/credential_validator/bearer_token_validator.py +557 -0
  30. nat/authentication/exceptions/__init__.py +14 -0
  31. nat/authentication/exceptions/api_key_exceptions.py +38 -0
  32. nat/authentication/http_basic_auth/__init__.py +0 -0
  33. nat/authentication/http_basic_auth/http_basic_auth_provider.py +81 -0
  34. nat/authentication/http_basic_auth/register.py +30 -0
  35. nat/authentication/interfaces.py +96 -0
  36. nat/authentication/oauth2/__init__.py +14 -0
  37. nat/authentication/oauth2/oauth2_auth_code_flow_provider.py +140 -0
  38. nat/authentication/oauth2/oauth2_auth_code_flow_provider_config.py +39 -0
  39. nat/authentication/oauth2/oauth2_resource_server_config.py +124 -0
  40. nat/authentication/oauth2/register.py +25 -0
  41. nat/authentication/register.py +20 -0
  42. nat/builder/__init__.py +0 -0
  43. nat/builder/builder.py +317 -0
  44. nat/builder/component_utils.py +320 -0
  45. nat/builder/context.py +321 -0
  46. nat/builder/embedder.py +24 -0
  47. nat/builder/eval_builder.py +166 -0
  48. nat/builder/evaluator.py +29 -0
  49. nat/builder/framework_enum.py +25 -0
  50. nat/builder/front_end.py +73 -0
  51. nat/builder/function.py +714 -0
  52. nat/builder/function_base.py +380 -0
  53. nat/builder/function_info.py +625 -0
  54. nat/builder/intermediate_step_manager.py +206 -0
  55. nat/builder/llm.py +25 -0
  56. nat/builder/retriever.py +25 -0
  57. nat/builder/user_interaction_manager.py +78 -0
  58. nat/builder/workflow.py +160 -0
  59. nat/builder/workflow_builder.py +1365 -0
  60. nat/cli/__init__.py +14 -0
  61. nat/cli/cli_utils/__init__.py +0 -0
  62. nat/cli/cli_utils/config_override.py +231 -0
  63. nat/cli/cli_utils/validation.py +37 -0
  64. nat/cli/commands/__init__.py +0 -0
  65. nat/cli/commands/configure/__init__.py +0 -0
  66. nat/cli/commands/configure/channel/__init__.py +0 -0
  67. nat/cli/commands/configure/channel/add.py +28 -0
  68. nat/cli/commands/configure/channel/channel.py +34 -0
  69. nat/cli/commands/configure/channel/remove.py +30 -0
  70. nat/cli/commands/configure/channel/update.py +30 -0
  71. nat/cli/commands/configure/configure.py +33 -0
  72. nat/cli/commands/evaluate.py +139 -0
  73. nat/cli/commands/info/__init__.py +14 -0
  74. nat/cli/commands/info/info.py +47 -0
  75. nat/cli/commands/info/list_channels.py +32 -0
  76. nat/cli/commands/info/list_components.py +128 -0
  77. nat/cli/commands/mcp/__init__.py +14 -0
  78. nat/cli/commands/mcp/mcp.py +986 -0
  79. nat/cli/commands/object_store/__init__.py +14 -0
  80. nat/cli/commands/object_store/object_store.py +227 -0
  81. nat/cli/commands/optimize.py +90 -0
  82. nat/cli/commands/registry/__init__.py +14 -0
  83. nat/cli/commands/registry/publish.py +88 -0
  84. nat/cli/commands/registry/pull.py +118 -0
  85. nat/cli/commands/registry/registry.py +36 -0
  86. nat/cli/commands/registry/remove.py +108 -0
  87. nat/cli/commands/registry/search.py +153 -0
  88. nat/cli/commands/sizing/__init__.py +14 -0
  89. nat/cli/commands/sizing/calc.py +297 -0
  90. nat/cli/commands/sizing/sizing.py +27 -0
  91. nat/cli/commands/start.py +257 -0
  92. nat/cli/commands/uninstall.py +81 -0
  93. nat/cli/commands/validate.py +47 -0
  94. nat/cli/commands/workflow/__init__.py +14 -0
  95. nat/cli/commands/workflow/templates/__init__.py.j2 +0 -0
  96. nat/cli/commands/workflow/templates/config.yml.j2 +17 -0
  97. nat/cli/commands/workflow/templates/pyproject.toml.j2 +25 -0
  98. nat/cli/commands/workflow/templates/register.py.j2 +4 -0
  99. nat/cli/commands/workflow/templates/workflow.py.j2 +50 -0
  100. nat/cli/commands/workflow/workflow.py +37 -0
  101. nat/cli/commands/workflow/workflow_commands.py +403 -0
  102. nat/cli/entrypoint.py +141 -0
  103. nat/cli/main.py +60 -0
  104. nat/cli/register_workflow.py +522 -0
  105. nat/cli/type_registry.py +1069 -0
  106. nat/control_flow/__init__.py +0 -0
  107. nat/control_flow/register.py +20 -0
  108. nat/control_flow/router_agent/__init__.py +0 -0
  109. nat/control_flow/router_agent/agent.py +329 -0
  110. nat/control_flow/router_agent/prompt.py +48 -0
  111. nat/control_flow/router_agent/register.py +91 -0
  112. nat/control_flow/sequential_executor.py +166 -0
  113. nat/data_models/__init__.py +14 -0
  114. nat/data_models/agent.py +34 -0
  115. nat/data_models/api_server.py +843 -0
  116. nat/data_models/authentication.py +245 -0
  117. nat/data_models/common.py +171 -0
  118. nat/data_models/component.py +60 -0
  119. nat/data_models/component_ref.py +179 -0
  120. nat/data_models/config.py +434 -0
  121. nat/data_models/dataset_handler.py +169 -0
  122. nat/data_models/discovery_metadata.py +305 -0
  123. nat/data_models/embedder.py +27 -0
  124. nat/data_models/evaluate.py +130 -0
  125. nat/data_models/evaluator.py +26 -0
  126. nat/data_models/front_end.py +26 -0
  127. nat/data_models/function.py +64 -0
  128. nat/data_models/function_dependencies.py +80 -0
  129. nat/data_models/gated_field_mixin.py +242 -0
  130. nat/data_models/interactive.py +246 -0
  131. nat/data_models/intermediate_step.py +302 -0
  132. nat/data_models/invocation_node.py +38 -0
  133. nat/data_models/llm.py +27 -0
  134. nat/data_models/logging.py +26 -0
  135. nat/data_models/memory.py +27 -0
  136. nat/data_models/object_store.py +44 -0
  137. nat/data_models/optimizable.py +119 -0
  138. nat/data_models/optimizer.py +149 -0
  139. nat/data_models/profiler.py +54 -0
  140. nat/data_models/registry_handler.py +26 -0
  141. nat/data_models/retriever.py +30 -0
  142. nat/data_models/retry_mixin.py +35 -0
  143. nat/data_models/span.py +228 -0
  144. nat/data_models/step_adaptor.py +64 -0
  145. nat/data_models/streaming.py +33 -0
  146. nat/data_models/swe_bench_model.py +54 -0
  147. nat/data_models/telemetry_exporter.py +26 -0
  148. nat/data_models/temperature_mixin.py +44 -0
  149. nat/data_models/thinking_mixin.py +86 -0
  150. nat/data_models/top_p_mixin.py +44 -0
  151. nat/data_models/ttc_strategy.py +30 -0
  152. nat/embedder/__init__.py +0 -0
  153. nat/embedder/azure_openai_embedder.py +46 -0
  154. nat/embedder/nim_embedder.py +59 -0
  155. nat/embedder/openai_embedder.py +42 -0
  156. nat/embedder/register.py +22 -0
  157. nat/eval/__init__.py +14 -0
  158. nat/eval/config.py +62 -0
  159. nat/eval/dataset_handler/__init__.py +0 -0
  160. nat/eval/dataset_handler/dataset_downloader.py +106 -0
  161. nat/eval/dataset_handler/dataset_filter.py +52 -0
  162. nat/eval/dataset_handler/dataset_handler.py +431 -0
  163. nat/eval/evaluate.py +565 -0
  164. nat/eval/evaluator/__init__.py +14 -0
  165. nat/eval/evaluator/base_evaluator.py +77 -0
  166. nat/eval/evaluator/evaluator_model.py +58 -0
  167. nat/eval/intermediate_step_adapter.py +99 -0
  168. nat/eval/rag_evaluator/__init__.py +0 -0
  169. nat/eval/rag_evaluator/evaluate.py +178 -0
  170. nat/eval/rag_evaluator/register.py +143 -0
  171. nat/eval/register.py +26 -0
  172. nat/eval/remote_workflow.py +133 -0
  173. nat/eval/runners/__init__.py +14 -0
  174. nat/eval/runners/config.py +39 -0
  175. nat/eval/runners/multi_eval_runner.py +54 -0
  176. nat/eval/runtime_evaluator/__init__.py +14 -0
  177. nat/eval/runtime_evaluator/evaluate.py +123 -0
  178. nat/eval/runtime_evaluator/register.py +100 -0
  179. nat/eval/runtime_event_subscriber.py +52 -0
  180. nat/eval/swe_bench_evaluator/__init__.py +0 -0
  181. nat/eval/swe_bench_evaluator/evaluate.py +215 -0
  182. nat/eval/swe_bench_evaluator/register.py +36 -0
  183. nat/eval/trajectory_evaluator/__init__.py +0 -0
  184. nat/eval/trajectory_evaluator/evaluate.py +75 -0
  185. nat/eval/trajectory_evaluator/register.py +40 -0
  186. nat/eval/tunable_rag_evaluator/__init__.py +0 -0
  187. nat/eval/tunable_rag_evaluator/evaluate.py +242 -0
  188. nat/eval/tunable_rag_evaluator/register.py +52 -0
  189. nat/eval/usage_stats.py +41 -0
  190. nat/eval/utils/__init__.py +0 -0
  191. nat/eval/utils/eval_trace_ctx.py +89 -0
  192. nat/eval/utils/output_uploader.py +140 -0
  193. nat/eval/utils/tqdm_position_registry.py +40 -0
  194. nat/eval/utils/weave_eval.py +193 -0
  195. nat/experimental/__init__.py +0 -0
  196. nat/experimental/decorators/__init__.py +0 -0
  197. nat/experimental/decorators/experimental_warning_decorator.py +154 -0
  198. nat/experimental/test_time_compute/__init__.py +0 -0
  199. nat/experimental/test_time_compute/editing/__init__.py +0 -0
  200. nat/experimental/test_time_compute/editing/iterative_plan_refinement_editor.py +147 -0
  201. nat/experimental/test_time_compute/editing/llm_as_a_judge_editor.py +204 -0
  202. nat/experimental/test_time_compute/editing/motivation_aware_summarization.py +107 -0
  203. nat/experimental/test_time_compute/functions/__init__.py +0 -0
  204. nat/experimental/test_time_compute/functions/execute_score_select_function.py +105 -0
  205. nat/experimental/test_time_compute/functions/plan_select_execute_function.py +228 -0
  206. nat/experimental/test_time_compute/functions/ttc_tool_orchestration_function.py +205 -0
  207. nat/experimental/test_time_compute/functions/ttc_tool_wrapper_function.py +146 -0
  208. nat/experimental/test_time_compute/models/__init__.py +0 -0
  209. nat/experimental/test_time_compute/models/editor_config.py +132 -0
  210. nat/experimental/test_time_compute/models/scoring_config.py +112 -0
  211. nat/experimental/test_time_compute/models/search_config.py +120 -0
  212. nat/experimental/test_time_compute/models/selection_config.py +154 -0
  213. nat/experimental/test_time_compute/models/stage_enums.py +43 -0
  214. nat/experimental/test_time_compute/models/strategy_base.py +67 -0
  215. nat/experimental/test_time_compute/models/tool_use_config.py +41 -0
  216. nat/experimental/test_time_compute/models/ttc_item.py +48 -0
  217. nat/experimental/test_time_compute/register.py +35 -0
  218. nat/experimental/test_time_compute/scoring/__init__.py +0 -0
  219. nat/experimental/test_time_compute/scoring/llm_based_agent_scorer.py +168 -0
  220. nat/experimental/test_time_compute/scoring/llm_based_plan_scorer.py +168 -0
  221. nat/experimental/test_time_compute/scoring/motivation_aware_scorer.py +111 -0
  222. nat/experimental/test_time_compute/search/__init__.py +0 -0
  223. nat/experimental/test_time_compute/search/multi_llm_planner.py +128 -0
  224. nat/experimental/test_time_compute/search/multi_query_retrieval_search.py +122 -0
  225. nat/experimental/test_time_compute/search/single_shot_multi_plan_planner.py +128 -0
  226. nat/experimental/test_time_compute/selection/__init__.py +0 -0
  227. nat/experimental/test_time_compute/selection/best_of_n_selector.py +63 -0
  228. nat/experimental/test_time_compute/selection/llm_based_agent_output_selector.py +131 -0
  229. nat/experimental/test_time_compute/selection/llm_based_output_merging_selector.py +157 -0
  230. nat/experimental/test_time_compute/selection/llm_based_plan_selector.py +128 -0
  231. nat/experimental/test_time_compute/selection/threshold_selector.py +58 -0
  232. nat/front_ends/__init__.py +14 -0
  233. nat/front_ends/console/__init__.py +14 -0
  234. nat/front_ends/console/authentication_flow_handler.py +285 -0
  235. nat/front_ends/console/console_front_end_config.py +32 -0
  236. nat/front_ends/console/console_front_end_plugin.py +108 -0
  237. nat/front_ends/console/register.py +25 -0
  238. nat/front_ends/cron/__init__.py +14 -0
  239. nat/front_ends/fastapi/__init__.py +14 -0
  240. nat/front_ends/fastapi/auth_flow_handlers/__init__.py +0 -0
  241. nat/front_ends/fastapi/auth_flow_handlers/http_flow_handler.py +27 -0
  242. nat/front_ends/fastapi/auth_flow_handlers/websocket_flow_handler.py +142 -0
  243. nat/front_ends/fastapi/dask_client_mixin.py +65 -0
  244. nat/front_ends/fastapi/fastapi_front_end_config.py +272 -0
  245. nat/front_ends/fastapi/fastapi_front_end_controller.py +68 -0
  246. nat/front_ends/fastapi/fastapi_front_end_plugin.py +247 -0
  247. nat/front_ends/fastapi/fastapi_front_end_plugin_worker.py +1257 -0
  248. nat/front_ends/fastapi/html_snippets/__init__.py +14 -0
  249. nat/front_ends/fastapi/html_snippets/auth_code_grant_success.py +35 -0
  250. nat/front_ends/fastapi/intermediate_steps_subscriber.py +80 -0
  251. nat/front_ends/fastapi/job_store.py +602 -0
  252. nat/front_ends/fastapi/main.py +64 -0
  253. nat/front_ends/fastapi/message_handler.py +344 -0
  254. nat/front_ends/fastapi/message_validator.py +351 -0
  255. nat/front_ends/fastapi/register.py +25 -0
  256. nat/front_ends/fastapi/response_helpers.py +195 -0
  257. nat/front_ends/fastapi/step_adaptor.py +319 -0
  258. nat/front_ends/fastapi/utils.py +57 -0
  259. nat/front_ends/mcp/__init__.py +14 -0
  260. nat/front_ends/mcp/introspection_token_verifier.py +73 -0
  261. nat/front_ends/mcp/mcp_front_end_config.py +90 -0
  262. nat/front_ends/mcp/mcp_front_end_plugin.py +113 -0
  263. nat/front_ends/mcp/mcp_front_end_plugin_worker.py +268 -0
  264. nat/front_ends/mcp/memory_profiler.py +320 -0
  265. nat/front_ends/mcp/register.py +27 -0
  266. nat/front_ends/mcp/tool_converter.py +290 -0
  267. nat/front_ends/register.py +21 -0
  268. nat/front_ends/simple_base/__init__.py +14 -0
  269. nat/front_ends/simple_base/simple_front_end_plugin_base.py +56 -0
  270. nat/llm/__init__.py +0 -0
  271. nat/llm/aws_bedrock_llm.py +69 -0
  272. nat/llm/azure_openai_llm.py +57 -0
  273. nat/llm/litellm_llm.py +69 -0
  274. nat/llm/nim_llm.py +58 -0
  275. nat/llm/openai_llm.py +54 -0
  276. nat/llm/register.py +27 -0
  277. nat/llm/utils/__init__.py +14 -0
  278. nat/llm/utils/env_config_value.py +93 -0
  279. nat/llm/utils/error.py +17 -0
  280. nat/llm/utils/thinking.py +215 -0
  281. nat/memory/__init__.py +20 -0
  282. nat/memory/interfaces.py +183 -0
  283. nat/memory/models.py +112 -0
  284. nat/meta/pypi.md +58 -0
  285. nat/object_store/__init__.py +20 -0
  286. nat/object_store/in_memory_object_store.py +76 -0
  287. nat/object_store/interfaces.py +84 -0
  288. nat/object_store/models.py +38 -0
  289. nat/object_store/register.py +19 -0
  290. nat/observability/__init__.py +14 -0
  291. nat/observability/exporter/__init__.py +14 -0
  292. nat/observability/exporter/base_exporter.py +449 -0
  293. nat/observability/exporter/exporter.py +78 -0
  294. nat/observability/exporter/file_exporter.py +33 -0
  295. nat/observability/exporter/processing_exporter.py +550 -0
  296. nat/observability/exporter/raw_exporter.py +52 -0
  297. nat/observability/exporter/span_exporter.py +308 -0
  298. nat/observability/exporter_manager.py +335 -0
  299. nat/observability/mixin/__init__.py +14 -0
  300. nat/observability/mixin/batch_config_mixin.py +26 -0
  301. nat/observability/mixin/collector_config_mixin.py +23 -0
  302. nat/observability/mixin/file_mixin.py +288 -0
  303. nat/observability/mixin/file_mode.py +23 -0
  304. nat/observability/mixin/redaction_config_mixin.py +42 -0
  305. nat/observability/mixin/resource_conflict_mixin.py +134 -0
  306. nat/observability/mixin/serialize_mixin.py +61 -0
  307. nat/observability/mixin/tagging_config_mixin.py +62 -0
  308. nat/observability/mixin/type_introspection_mixin.py +496 -0
  309. nat/observability/processor/__init__.py +14 -0
  310. nat/observability/processor/batching_processor.py +308 -0
  311. nat/observability/processor/callback_processor.py +42 -0
  312. nat/observability/processor/falsy_batch_filter_processor.py +55 -0
  313. nat/observability/processor/intermediate_step_serializer.py +28 -0
  314. nat/observability/processor/processor.py +74 -0
  315. nat/observability/processor/processor_factory.py +70 -0
  316. nat/observability/processor/redaction/__init__.py +24 -0
  317. nat/observability/processor/redaction/contextual_redaction_processor.py +125 -0
  318. nat/observability/processor/redaction/contextual_span_redaction_processor.py +66 -0
  319. nat/observability/processor/redaction/redaction_processor.py +177 -0
  320. nat/observability/processor/redaction/span_header_redaction_processor.py +92 -0
  321. nat/observability/processor/span_tagging_processor.py +68 -0
  322. nat/observability/register.py +114 -0
  323. nat/observability/utils/__init__.py +14 -0
  324. nat/observability/utils/dict_utils.py +236 -0
  325. nat/observability/utils/time_utils.py +31 -0
  326. nat/plugins/.namespace +1 -0
  327. nat/profiler/__init__.py +0 -0
  328. nat/profiler/calc/__init__.py +14 -0
  329. nat/profiler/calc/calc_runner.py +626 -0
  330. nat/profiler/calc/calculations.py +288 -0
  331. nat/profiler/calc/data_models.py +188 -0
  332. nat/profiler/calc/plot.py +345 -0
  333. nat/profiler/callbacks/__init__.py +0 -0
  334. nat/profiler/callbacks/agno_callback_handler.py +295 -0
  335. nat/profiler/callbacks/base_callback_class.py +20 -0
  336. nat/profiler/callbacks/langchain_callback_handler.py +297 -0
  337. nat/profiler/callbacks/llama_index_callback_handler.py +205 -0
  338. nat/profiler/callbacks/semantic_kernel_callback_handler.py +238 -0
  339. nat/profiler/callbacks/token_usage_base_model.py +27 -0
  340. nat/profiler/data_frame_row.py +51 -0
  341. nat/profiler/data_models.py +24 -0
  342. nat/profiler/decorators/__init__.py +0 -0
  343. nat/profiler/decorators/framework_wrapper.py +180 -0
  344. nat/profiler/decorators/function_tracking.py +411 -0
  345. nat/profiler/forecasting/__init__.py +0 -0
  346. nat/profiler/forecasting/config.py +18 -0
  347. nat/profiler/forecasting/model_trainer.py +75 -0
  348. nat/profiler/forecasting/models/__init__.py +22 -0
  349. nat/profiler/forecasting/models/forecasting_base_model.py +42 -0
  350. nat/profiler/forecasting/models/linear_model.py +197 -0
  351. nat/profiler/forecasting/models/random_forest_regressor.py +269 -0
  352. nat/profiler/inference_metrics_model.py +28 -0
  353. nat/profiler/inference_optimization/__init__.py +0 -0
  354. nat/profiler/inference_optimization/bottleneck_analysis/__init__.py +0 -0
  355. nat/profiler/inference_optimization/bottleneck_analysis/nested_stack_analysis.py +460 -0
  356. nat/profiler/inference_optimization/bottleneck_analysis/simple_stack_analysis.py +258 -0
  357. nat/profiler/inference_optimization/data_models.py +386 -0
  358. nat/profiler/inference_optimization/experimental/__init__.py +0 -0
  359. nat/profiler/inference_optimization/experimental/concurrency_spike_analysis.py +468 -0
  360. nat/profiler/inference_optimization/experimental/prefix_span_analysis.py +404 -0
  361. nat/profiler/inference_optimization/llm_metrics.py +212 -0
  362. nat/profiler/inference_optimization/prompt_caching.py +163 -0
  363. nat/profiler/inference_optimization/token_uniqueness.py +107 -0
  364. nat/profiler/inference_optimization/workflow_runtimes.py +72 -0
  365. nat/profiler/intermediate_property_adapter.py +102 -0
  366. nat/profiler/parameter_optimization/__init__.py +0 -0
  367. nat/profiler/parameter_optimization/optimizable_utils.py +93 -0
  368. nat/profiler/parameter_optimization/optimizer_runtime.py +67 -0
  369. nat/profiler/parameter_optimization/parameter_optimizer.py +153 -0
  370. nat/profiler/parameter_optimization/parameter_selection.py +107 -0
  371. nat/profiler/parameter_optimization/pareto_visualizer.py +380 -0
  372. nat/profiler/parameter_optimization/prompt_optimizer.py +384 -0
  373. nat/profiler/parameter_optimization/update_helpers.py +66 -0
  374. nat/profiler/profile_runner.py +478 -0
  375. nat/profiler/utils.py +186 -0
  376. nat/registry_handlers/__init__.py +0 -0
  377. nat/registry_handlers/local/__init__.py +0 -0
  378. nat/registry_handlers/local/local_handler.py +176 -0
  379. nat/registry_handlers/local/register_local.py +37 -0
  380. nat/registry_handlers/metadata_factory.py +60 -0
  381. nat/registry_handlers/package_utils.py +570 -0
  382. nat/registry_handlers/pypi/__init__.py +0 -0
  383. nat/registry_handlers/pypi/pypi_handler.py +248 -0
  384. nat/registry_handlers/pypi/register_pypi.py +40 -0
  385. nat/registry_handlers/register.py +20 -0
  386. nat/registry_handlers/registry_handler_base.py +157 -0
  387. nat/registry_handlers/rest/__init__.py +0 -0
  388. nat/registry_handlers/rest/register_rest.py +56 -0
  389. nat/registry_handlers/rest/rest_handler.py +236 -0
  390. nat/registry_handlers/schemas/__init__.py +0 -0
  391. nat/registry_handlers/schemas/headers.py +42 -0
  392. nat/registry_handlers/schemas/package.py +68 -0
  393. nat/registry_handlers/schemas/publish.py +68 -0
  394. nat/registry_handlers/schemas/pull.py +82 -0
  395. nat/registry_handlers/schemas/remove.py +36 -0
  396. nat/registry_handlers/schemas/search.py +91 -0
  397. nat/registry_handlers/schemas/status.py +47 -0
  398. nat/retriever/__init__.py +0 -0
  399. nat/retriever/interface.py +41 -0
  400. nat/retriever/milvus/__init__.py +14 -0
  401. nat/retriever/milvus/register.py +81 -0
  402. nat/retriever/milvus/retriever.py +228 -0
  403. nat/retriever/models.py +77 -0
  404. nat/retriever/nemo_retriever/__init__.py +14 -0
  405. nat/retriever/nemo_retriever/register.py +60 -0
  406. nat/retriever/nemo_retriever/retriever.py +190 -0
  407. nat/retriever/register.py +21 -0
  408. nat/runtime/__init__.py +14 -0
  409. nat/runtime/loader.py +220 -0
  410. nat/runtime/runner.py +292 -0
  411. nat/runtime/session.py +223 -0
  412. nat/runtime/user_metadata.py +130 -0
  413. nat/settings/__init__.py +0 -0
  414. nat/settings/global_settings.py +329 -0
  415. nat/test/.namespace +1 -0
  416. nat/tool/__init__.py +0 -0
  417. nat/tool/chat_completion.py +77 -0
  418. nat/tool/code_execution/README.md +151 -0
  419. nat/tool/code_execution/__init__.py +0 -0
  420. nat/tool/code_execution/code_sandbox.py +267 -0
  421. nat/tool/code_execution/local_sandbox/.gitignore +1 -0
  422. nat/tool/code_execution/local_sandbox/Dockerfile.sandbox +60 -0
  423. nat/tool/code_execution/local_sandbox/__init__.py +13 -0
  424. nat/tool/code_execution/local_sandbox/local_sandbox_server.py +198 -0
  425. nat/tool/code_execution/local_sandbox/sandbox.requirements.txt +6 -0
  426. nat/tool/code_execution/local_sandbox/start_local_sandbox.sh +50 -0
  427. nat/tool/code_execution/register.py +74 -0
  428. nat/tool/code_execution/test_code_execution_sandbox.py +414 -0
  429. nat/tool/code_execution/utils.py +100 -0
  430. nat/tool/datetime_tools.py +82 -0
  431. nat/tool/document_search.py +141 -0
  432. nat/tool/github_tools.py +450 -0
  433. nat/tool/memory_tools/__init__.py +0 -0
  434. nat/tool/memory_tools/add_memory_tool.py +79 -0
  435. nat/tool/memory_tools/delete_memory_tool.py +66 -0
  436. nat/tool/memory_tools/get_memory_tool.py +72 -0
  437. nat/tool/nvidia_rag.py +95 -0
  438. nat/tool/register.py +31 -0
  439. nat/tool/retriever.py +95 -0
  440. nat/tool/server_tools.py +66 -0
  441. nat/utils/__init__.py +0 -0
  442. nat/utils/callable_utils.py +70 -0
  443. nat/utils/data_models/__init__.py +0 -0
  444. nat/utils/data_models/schema_validator.py +58 -0
  445. nat/utils/debugging_utils.py +43 -0
  446. nat/utils/decorators.py +210 -0
  447. nat/utils/dump_distro_mapping.py +32 -0
  448. nat/utils/exception_handlers/__init__.py +0 -0
  449. nat/utils/exception_handlers/automatic_retries.py +342 -0
  450. nat/utils/exception_handlers/schemas.py +114 -0
  451. nat/utils/io/__init__.py +0 -0
  452. nat/utils/io/model_processing.py +28 -0
  453. nat/utils/io/yaml_tools.py +119 -0
  454. nat/utils/log_levels.py +25 -0
  455. nat/utils/log_utils.py +37 -0
  456. nat/utils/metadata_utils.py +74 -0
  457. nat/utils/optional_imports.py +142 -0
  458. nat/utils/producer_consumer_queue.py +178 -0
  459. nat/utils/reactive/__init__.py +0 -0
  460. nat/utils/reactive/base/__init__.py +0 -0
  461. nat/utils/reactive/base/observable_base.py +65 -0
  462. nat/utils/reactive/base/observer_base.py +55 -0
  463. nat/utils/reactive/base/subject_base.py +79 -0
  464. nat/utils/reactive/observable.py +59 -0
  465. nat/utils/reactive/observer.py +76 -0
  466. nat/utils/reactive/subject.py +131 -0
  467. nat/utils/reactive/subscription.py +49 -0
  468. nat/utils/settings/__init__.py +0 -0
  469. nat/utils/settings/global_settings.py +195 -0
  470. nat/utils/string_utils.py +38 -0
  471. nat/utils/type_converter.py +299 -0
  472. nat/utils/type_utils.py +488 -0
  473. nat/utils/url_utils.py +27 -0
  474. nvidia_nat-1.1.0a20251020.dist-info/METADATA +195 -0
  475. nvidia_nat-1.1.0a20251020.dist-info/RECORD +480 -0
  476. nvidia_nat-1.1.0a20251020.dist-info/WHEEL +5 -0
  477. nvidia_nat-1.1.0a20251020.dist-info/entry_points.txt +22 -0
  478. nvidia_nat-1.1.0a20251020.dist-info/licenses/LICENSE-3rd-party.txt +5478 -0
  479. nvidia_nat-1.1.0a20251020.dist-info/licenses/LICENSE.md +201 -0
  480. nvidia_nat-1.1.0a20251020.dist-info/top_level.txt +2 -0
@@ -0,0 +1,242 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from collections.abc import Sequence
17
+ from dataclasses import dataclass
18
+ from re import Pattern
19
+
20
+ from pydantic import model_validator
21
+
22
+
23
+ @dataclass
24
+ class GatedFieldMixinConfig:
25
+ """Configuration for a gated field mixin."""
26
+
27
+ field_name: str
28
+ default_if_supported: object | None
29
+ unsupported: Sequence[Pattern[str]] | None
30
+ supported: Sequence[Pattern[str]] | None
31
+ keys: Sequence[str]
32
+
33
+
34
+ class GatedFieldMixin:
35
+ """
36
+ A mixin that gates a field based on specified keys.
37
+
38
+ This should be used to automatically validate a field based on a given key.
39
+
40
+ Parameters
41
+ ----------
42
+ field_name: `str`
43
+ The name of the field.
44
+ default_if_supported: `object | None`
45
+ The default value of the field if it is supported for the key.
46
+ keys: `Sequence[str]`
47
+ A sequence of keys that are used to validate the field.
48
+ unsupported: `Sequence[Pattern[str]] | None`
49
+ A sequence of regex patterns that match the key names NOT supported for the field.
50
+ Defaults to None.
51
+ supported: `Sequence[Pattern[str]] | None`
52
+ A sequence of regex patterns that match the key names supported for the field.
53
+ Defaults to None.
54
+ """
55
+
56
+ def __init_subclass__(
57
+ cls,
58
+ field_name: str | None = None,
59
+ default_if_supported: object | None = None,
60
+ keys: Sequence[str] | None = None,
61
+ unsupported: Sequence[Pattern[str]] | None = None,
62
+ supported: Sequence[Pattern[str]] | None = None,
63
+ ) -> None:
64
+ """Store the class variables for the field and define the gated field validator."""
65
+ super().__init_subclass__()
66
+
67
+ # Check if this class directly inherits from GatedFieldMixin
68
+ has_gated_field_mixin = GatedFieldMixin in cls.__bases__
69
+
70
+ if has_gated_field_mixin:
71
+ if keys is None:
72
+ raise ValueError("keys must be provided when subclassing GatedFieldMixin")
73
+ if field_name is None:
74
+ raise ValueError("field_name must be provided when subclassing GatedFieldMixin")
75
+
76
+ cls._setup_direct_mixin(field_name, default_if_supported, unsupported, supported, keys)
77
+
78
+ # Always try to collect mixins and create validators for multiple inheritance
79
+ # This handles both direct inheritance and deep inheritance chains
80
+ all_mixins = cls._collect_all_mixin_configs()
81
+ if all_mixins:
82
+ cls._create_combined_validator(all_mixins)
83
+
84
+ @classmethod
85
+ def _setup_direct_mixin(
86
+ cls,
87
+ field_name: str,
88
+ default_if_supported: object | None,
89
+ unsupported: Sequence[Pattern[str]] | None,
90
+ supported: Sequence[Pattern[str]] | None,
91
+ keys: Sequence[str],
92
+ ) -> None:
93
+ """Set up a class that directly inherits from GatedFieldMixin."""
94
+ cls._validate_mixin_parameters(unsupported, supported, keys)
95
+
96
+ # Create and store validator
97
+ validator = cls._create_gated_field_validator(field_name, default_if_supported, unsupported, supported, keys)
98
+ validator_name = f"_gated_field_validator_{field_name}"
99
+ setattr(cls, validator_name, validator)
100
+
101
+ # Store mixin info for multiple inheritance
102
+ if not hasattr(cls, "_gated_field_mixins"):
103
+ cls._gated_field_mixins = []
104
+
105
+ cls._gated_field_mixins.append(
106
+ GatedFieldMixinConfig(
107
+ field_name,
108
+ default_if_supported,
109
+ unsupported,
110
+ supported,
111
+ keys,
112
+ ))
113
+
114
+ @classmethod
115
+ def _validate_mixin_parameters(
116
+ cls,
117
+ unsupported: Sequence[Pattern[str]] | None,
118
+ supported: Sequence[Pattern[str]] | None,
119
+ keys: Sequence[str],
120
+ ) -> None:
121
+ """Validate that all required parameters are provided."""
122
+ if unsupported is None and supported is None:
123
+ raise ValueError("Either unsupported or supported must be provided")
124
+ if unsupported is not None and supported is not None:
125
+ raise ValueError("Only one of unsupported or supported must be provided")
126
+ if len(keys) == 0:
127
+ raise ValueError("keys must be provided and non-empty when subclassing GatedFieldMixin")
128
+
129
+ @classmethod
130
+ def _create_gated_field_validator(
131
+ cls,
132
+ field_name: str,
133
+ default_if_supported: object | None,
134
+ unsupported: Sequence[Pattern[str]] | None,
135
+ supported: Sequence[Pattern[str]] | None,
136
+ keys: Sequence[str],
137
+ ):
138
+ """Create the model validator function."""
139
+
140
+ @model_validator(mode="after")
141
+ def gated_field_validator(self):
142
+ """Validate the gated field."""
143
+ current_value = getattr(self, field_name, None)
144
+ is_supported = cls._check_field_support(self, unsupported, supported, keys)
145
+ if not is_supported:
146
+ if current_value is not None:
147
+ blocking_key = cls._find_blocking_key(self, unsupported, supported, keys)
148
+ value = getattr(self, blocking_key, "<unknown>")
149
+ raise ValueError(f"{field_name} is not supported for {blocking_key}: {value}")
150
+ elif current_value is None:
151
+ setattr(self, field_name, default_if_supported)
152
+ return self
153
+
154
+ return gated_field_validator
155
+
156
+ @classmethod
157
+ def _check_field_support(
158
+ cls,
159
+ instance: object,
160
+ unsupported: Sequence[Pattern[str]] | None,
161
+ supported: Sequence[Pattern[str]] | None,
162
+ keys: Sequence[str],
163
+ ) -> bool:
164
+ """Check if a specific field is supported based on its configuration and keys."""
165
+ seen = False
166
+ for key in keys:
167
+ if not hasattr(instance, key):
168
+ continue
169
+ seen = True
170
+ value = str(getattr(instance, key))
171
+ if supported is not None:
172
+ if any(p.search(value) for p in supported):
173
+ return True
174
+ elif unsupported is not None:
175
+ if any(p.search(value) for p in unsupported):
176
+ return False
177
+ return True if not seen else (unsupported is not None)
178
+
179
+ @classmethod
180
+ def _find_blocking_key(
181
+ cls,
182
+ instance: object,
183
+ unsupported: Sequence[Pattern[str]] | None,
184
+ supported: Sequence[Pattern[str]] | None,
185
+ keys: Sequence[str],
186
+ ) -> str:
187
+ """Find which key is blocking the field."""
188
+ for key in keys:
189
+ if not hasattr(instance, key):
190
+ continue
191
+ value = str(getattr(instance, key))
192
+ if supported is not None:
193
+ if not any(p.search(value) for p in supported):
194
+ return key
195
+ elif unsupported is not None:
196
+ if any(p.search(value) for p in unsupported):
197
+ return key
198
+
199
+ return "<unknown>"
200
+
201
+ @classmethod
202
+ def _collect_all_mixin_configs(cls) -> list[GatedFieldMixinConfig]:
203
+ """Collect all mixin configurations from base classes."""
204
+ all_mixins = []
205
+ for base in cls.__bases__:
206
+ if hasattr(base, "_gated_field_mixins"):
207
+ all_mixins.extend(base._gated_field_mixins)
208
+ return all_mixins
209
+
210
+ @classmethod
211
+ def _create_combined_validator(cls, all_mixins: list[GatedFieldMixinConfig]) -> None:
212
+ """Create a combined validator that handles all fields."""
213
+
214
+ @model_validator(mode="after")
215
+ def combined_gated_field_validator(self):
216
+ """Validate all gated fields."""
217
+ for mixin_config in all_mixins:
218
+ field_name_local = mixin_config.field_name
219
+ current_value = getattr(self, field_name_local, None)
220
+ if not self._check_field_support_instance(mixin_config):
221
+ if current_value is not None:
222
+ blocking_key = self._find_blocking_key_instance(mixin_config)
223
+ value = getattr(self, blocking_key, "<unknown>")
224
+ raise ValueError(f"{field_name_local} is not supported for {blocking_key}: {value}")
225
+ elif current_value is None:
226
+ setattr(self, field_name_local, mixin_config.default_if_supported)
227
+
228
+ return self
229
+
230
+ cls._combined_gated_field_validator = combined_gated_field_validator
231
+
232
+ # Add helper methods
233
+ def _check_field_support_instance(self, mixin_config: GatedFieldMixinConfig) -> bool:
234
+ """Check if a specific field is supported based on its configuration and keys."""
235
+ return cls._check_field_support(self, mixin_config.unsupported, mixin_config.supported, mixin_config.keys)
236
+
237
+ def _find_blocking_key_instance(self, mixin_config: GatedFieldMixinConfig) -> str:
238
+ """Find which key is blocking the field."""
239
+ return cls._find_blocking_key(self, mixin_config.unsupported, mixin_config.supported, mixin_config.keys)
240
+
241
+ cls._check_field_support_instance = _check_field_support_instance
242
+ cls._find_blocking_key_instance = _find_blocking_key_instance
@@ -0,0 +1,246 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import re
17
+ import typing
18
+ from enum import Enum
19
+
20
+ from pydantic import BaseModel
21
+ from pydantic import Discriminator
22
+ from pydantic import Field
23
+ from pydantic import field_validator
24
+
25
+
26
+ class HumanPromptModelType(str, Enum):
27
+ """
28
+ Represents the type of an interaction model.
29
+ """
30
+ TEXT = "text"
31
+ NOTIFICATION = "notification"
32
+ BINARY_CHOICE = "binary_choice"
33
+ RADIO = "radio"
34
+ CHECKBOX = "checkbox"
35
+ DROPDOWN = "dropdown"
36
+ OAUTH_CONSENT = "oauth_consent"
37
+
38
+
39
+ class BinaryChoiceOptionsType(str, Enum):
40
+ """
41
+ Represents the types of system interaction binary choice content
42
+ """
43
+ CONTINUE = "continue"
44
+ CANCEL = "cancel"
45
+
46
+
47
+ class MultipleChoiceOptionType(str, Enum):
48
+ """
49
+ Represents the types of system interaction multiple choice content
50
+ """
51
+ EMAIL = "email"
52
+ SMS = "sms"
53
+ PUSH = "push"
54
+
55
+
56
+ class BinaryHumanPromptOption(BaseModel):
57
+ """
58
+ Represents a choice for a binary interaction.
59
+ """
60
+ id: str = Field(default="default", description="The ID of the choice.")
61
+ label: str = Field(default="default", description="Label of the choice")
62
+ value: typing.Any = Field(default="default", description="The value of the choice.")
63
+
64
+
65
+ class MultipleChoiceOption(BaseModel):
66
+ id: str = Field(default="default", description="The ID of the choice.")
67
+ label: str = Field(default="default", description="The label for the multiple choice interaction.")
68
+ value: str = Field(default="default", description="The value for the multiple choice interaction.")
69
+ description: str = Field(default="default", description="The description for the multiple choice interaction.")
70
+
71
+
72
+ class HumanResponseText(BaseModel):
73
+ """
74
+ Represents a text response to an interaction.
75
+ """
76
+ type: typing.Literal[HumanPromptModelType.TEXT] = HumanPromptModelType.TEXT
77
+ text: str = Field(description="The text of the response.")
78
+
79
+
80
+ class HumanResponseNotification(BaseModel):
81
+ """
82
+ Represents a notification response to an interaction.
83
+ """
84
+ type: typing.Literal[HumanPromptModelType.NOTIFICATION] = HumanPromptModelType.NOTIFICATION
85
+ text: str = Field(default="Notification acknowledgement.", description="Default notification response text.")
86
+
87
+
88
+ class HumanResponseBinary(BaseModel):
89
+ """
90
+ Represents a binary response to an interaction.
91
+ """
92
+ type: typing.Literal[HumanPromptModelType.BINARY_CHOICE] = HumanPromptModelType.BINARY_CHOICE
93
+ selected_option: BinaryHumanPromptOption = Field(description="The selected binary response.")
94
+
95
+
96
+ class HumanResponseRadio(BaseModel):
97
+ """
98
+ Represents a multiple choice radio response to an interaction.
99
+ """
100
+ type: typing.Literal[HumanPromptModelType.RADIO] = HumanPromptModelType.RADIO
101
+ selected_option: MultipleChoiceOption = Field(description="The selected multiple choice radio response.")
102
+
103
+
104
+ class HumanResponseCheckbox(BaseModel):
105
+ """
106
+ Represents a multiple choice checkbox response to an interaction.
107
+ """
108
+ type: typing.Literal[HumanPromptModelType.CHECKBOX] = HumanPromptModelType.CHECKBOX
109
+ selected_option: MultipleChoiceOption = Field(description="The selected multiple choice checkbox response.")
110
+
111
+
112
+ class HumanResponseDropdown(BaseModel):
113
+ """
114
+ Represents a multiple choice dropdown response to an interaction.
115
+ """
116
+ type: typing.Literal[HumanPromptModelType.DROPDOWN] = HumanPromptModelType.DROPDOWN
117
+ selected_option: MultipleChoiceOption = Field(description="The selected multiple choice dropdown response.")
118
+
119
+
120
+ HumanResponse = typing.Annotated[HumanResponseText | HumanResponseBinary | HumanResponseNotification
121
+ | HumanResponseRadio | HumanResponseCheckbox
122
+ | HumanResponseDropdown,
123
+ Discriminator("type")]
124
+
125
+
126
+ class HumanPromptBase(BaseModel):
127
+ """
128
+ Base interaction model to derive from
129
+ """
130
+ text: str = Field(description="Text prompt that will be displayed to the user.")
131
+
132
+
133
+ class HumanPromptText(HumanPromptBase):
134
+ """
135
+ Represents a text interaction.
136
+ """
137
+ input_type: typing.Literal[HumanPromptModelType.TEXT] = HumanPromptModelType.TEXT
138
+ placeholder: str | None = Field(description="The placeholder for the text.")
139
+ required: bool = Field(default=True, description="Whether the interaction is required.")
140
+
141
+
142
+ class HumanPromptNotification(HumanPromptBase):
143
+ """
144
+ Represents a notification interaction.
145
+ """
146
+ input_type: typing.Literal[HumanPromptModelType.NOTIFICATION] = HumanPromptModelType.NOTIFICATION
147
+
148
+
149
+ class _HumanPromptOAuthConsent(HumanPromptBase):
150
+ """
151
+ Represents an OAuth consent prompt interaction used to notify the UI to open the authentication page for completing
152
+ the consent flow.
153
+ """
154
+ input_type: typing.Literal[HumanPromptModelType.OAUTH_CONSENT] = HumanPromptModelType.OAUTH_CONSENT
155
+
156
+
157
+ class HumanPromptBinary(HumanPromptBase):
158
+ """
159
+ Represents a binary interaction.
160
+ """
161
+ input_type: typing.Literal[HumanPromptModelType.BINARY_CHOICE] = HumanPromptModelType.BINARY_CHOICE
162
+ options: list[BinaryHumanPromptOption] = Field(description="The options for the binary interaction.")
163
+
164
+ # Field validator to make sure len(options) == 2
165
+ @field_validator("options", mode="before")
166
+ @classmethod
167
+ def validate_options(cls, options):
168
+ if len(options) != 2:
169
+ raise ValueError("Binary interactions must have exactly two options.")
170
+ return options
171
+
172
+
173
+ class HumanPromptMultipleChoiceBase(HumanPromptBase):
174
+ """
175
+ Represents a multiple choice interaction.
176
+ """
177
+ options: list[MultipleChoiceOption] = Field(description="The options for the multiple choice interaction.")
178
+
179
+
180
+ class HumanPromptRadio(HumanPromptMultipleChoiceBase):
181
+ """
182
+ Represents a radio interaction.
183
+ """
184
+ input_type: typing.Literal[HumanPromptModelType.RADIO] = HumanPromptModelType.RADIO
185
+
186
+
187
+ class HumanPromptCheckbox(HumanPromptMultipleChoiceBase):
188
+ """
189
+ Represents a checkbox interaction.
190
+ """
191
+ input_type: typing.Literal[HumanPromptModelType.CHECKBOX] = HumanPromptModelType.CHECKBOX
192
+
193
+
194
+ class HumanPromptDropdown(HumanPromptMultipleChoiceBase):
195
+ """
196
+ Represents a dropdown interaction.
197
+ """
198
+ input_type: typing.Literal[HumanPromptModelType.DROPDOWN] = HumanPromptModelType.DROPDOWN
199
+
200
+
201
+ HumanPrompt = typing.Annotated[HumanPromptText | HumanPromptNotification | HumanPromptBinary | HumanPromptRadio
202
+ | HumanPromptCheckbox | HumanPromptDropdown | _HumanPromptOAuthConsent,
203
+ Discriminator("input_type")]
204
+
205
+
206
+ class InteractionStatus(str, Enum):
207
+ """
208
+ Represents the status of an interaction.
209
+ """
210
+ PENDING = "pending"
211
+ IN_PROGRESS = "in_progress"
212
+ COMPLETED = "completed"
213
+ FAILED = "failed"
214
+
215
+
216
+ class InteractionBase(BaseModel):
217
+ """
218
+ Represents a system-human interaction.
219
+ """
220
+ id: str = Field(description="The ID of the interaction.")
221
+ type: str = Field(default="system_human_interaction", description="The type of the interaction.")
222
+ thread_id: str | None = Field(description="The thread ID of the interaction.", default=None)
223
+ parent_id: str | None = Field(description="The parent ID of the interaction.", default=None)
224
+ status: InteractionStatus = Field(description="The status of the interaction.", default=InteractionStatus.PENDING)
225
+ timestamp: str = Field(description="The timestamp of the interaction.")
226
+
227
+ @field_validator("timestamp", mode="before")
228
+ @classmethod
229
+ def validate_timestamp(cls, timestamp):
230
+ if not re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z", timestamp):
231
+ raise ValueError("Timestamp must be in the format 2025-01-13T10:00:03Z")
232
+ return timestamp
233
+
234
+
235
+ class InteractionPrompt(InteractionBase):
236
+ """
237
+ Represents a system-human interaction with a prompt.
238
+ """
239
+ content: HumanPrompt = Field(description="The content of the interaction.")
240
+
241
+
242
+ class InteractionResponse(InteractionBase):
243
+ """
244
+ Represents a system-human interaction with a response.
245
+ """
246
+ content: HumanResponse = Field(description="The content of the interaction.")