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,843 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2024-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 abc
17
+ import datetime
18
+ import typing
19
+ import uuid
20
+ from abc import abstractmethod
21
+ from enum import Enum
22
+
23
+ from pydantic import BaseModel
24
+ from pydantic import ConfigDict
25
+ from pydantic import Discriminator
26
+ from pydantic import Field
27
+ from pydantic import HttpUrl
28
+ from pydantic import conlist
29
+ from pydantic import field_serializer
30
+ from pydantic import field_validator
31
+ from pydantic import model_validator
32
+ from pydantic_core.core_schema import ValidationInfo
33
+
34
+ from nat.data_models.interactive import HumanPrompt
35
+ from nat.utils.type_converter import GlobalTypeConverter
36
+
37
+ FINISH_REASONS = frozenset({'stop', 'length', 'tool_calls', 'content_filter', 'function_call'})
38
+
39
+
40
+ class UserMessageContentRoleType(str, Enum):
41
+ """
42
+ Enum representing chat message roles in API requests and responses.
43
+ """
44
+ USER = "user"
45
+ ASSISTANT = "assistant"
46
+ SYSTEM = "system"
47
+
48
+
49
+ class Request(BaseModel):
50
+ """
51
+ Request is a data model that represents HTTP request attributes.
52
+ """
53
+ model_config = ConfigDict(extra="forbid")
54
+
55
+ method: str | None = Field(default=None,
56
+ description="HTTP method used for the request (e.g., GET, POST, PUT, DELETE).")
57
+ url_path: str | None = Field(default=None, description="URL request path.")
58
+ url_port: int | None = Field(default=None, description="URL request port number.")
59
+ url_scheme: str | None = Field(default=None, description="URL scheme indicating the protocol (e.g., http, https).")
60
+ headers: typing.Any | None = Field(default=None, description="HTTP headers associated with the request.")
61
+ query_params: typing.Any | None = Field(default=None, description="Query parameters included in the request URL.")
62
+ path_params: dict[str, str] | None = Field(default=None,
63
+ description="Path parameters extracted from the request URL.")
64
+ client_host: str | None = Field(default=None, description="Client host address from which the request originated.")
65
+ client_port: int | None = Field(default=None, description="Client port number from which the request originated.")
66
+ cookies: dict[str, str] | None = Field(
67
+ default=None, description="Cookies sent with the request, stored in a dictionary-like object.")
68
+
69
+
70
+ class ChatContentType(str, Enum):
71
+ """
72
+ ChatContentType is an Enum that represents the type of Chat content.
73
+ """
74
+ TEXT = "text"
75
+ IMAGE_URL = "image_url"
76
+ INPUT_AUDIO = "input_audio"
77
+
78
+
79
+ class InputAudio(BaseModel):
80
+ data: str = "default"
81
+ format: str = "default"
82
+
83
+
84
+ class AudioContent(BaseModel):
85
+ model_config = ConfigDict(extra="forbid")
86
+
87
+ type: typing.Literal[ChatContentType.INPUT_AUDIO] = ChatContentType.INPUT_AUDIO
88
+ input_audio: InputAudio = InputAudio()
89
+
90
+
91
+ class ImageUrl(BaseModel):
92
+ url: HttpUrl = HttpUrl(url="http://default.com")
93
+
94
+
95
+ class ImageContent(BaseModel):
96
+ model_config = ConfigDict(extra="forbid")
97
+
98
+ type: typing.Literal[ChatContentType.IMAGE_URL] = ChatContentType.IMAGE_URL
99
+ image_url: ImageUrl = ImageUrl()
100
+
101
+
102
+ class TextContent(BaseModel):
103
+ model_config = ConfigDict(extra="forbid")
104
+
105
+ type: typing.Literal[ChatContentType.TEXT] = ChatContentType.TEXT
106
+ text: str = "default"
107
+
108
+
109
+ class Security(BaseModel):
110
+ model_config = ConfigDict(extra="forbid")
111
+
112
+ api_key: str = "default"
113
+ token: str = "default"
114
+
115
+
116
+ UserContent = typing.Annotated[TextContent | ImageContent | AudioContent, Discriminator("type")]
117
+
118
+
119
+ class Message(BaseModel):
120
+ content: str | list[UserContent]
121
+ role: UserMessageContentRoleType
122
+
123
+
124
+ class ChatRequest(BaseModel):
125
+ """
126
+ ChatRequest is a data model that represents a request to the NAT chat API.
127
+ Fully compatible with OpenAI Chat Completions API specification.
128
+ """
129
+
130
+ # Required fields
131
+ messages: typing.Annotated[list[Message], conlist(Message, min_length=1)]
132
+
133
+ # Optional fields (OpenAI Chat Completions API compatible)
134
+ model: str | None = Field(default=None, description="name of the model to use")
135
+ frequency_penalty: float | None = Field(default=0.0,
136
+ description="Penalty for new tokens based on frequency in text")
137
+ logit_bias: dict[str, float] | None = Field(default=None,
138
+ description="Modify likelihood of specified tokens appearing")
139
+ logprobs: bool | None = Field(default=None, description="Whether to return log probabilities")
140
+ top_logprobs: int | None = Field(default=None, description="Number of most likely tokens to return")
141
+ max_tokens: int | None = Field(default=None, description="Maximum number of tokens to generate")
142
+ n: int | None = Field(default=1, description="Number of chat completion choices to generate")
143
+ presence_penalty: float | None = Field(default=0.0, description="Penalty for new tokens based on presence in text")
144
+ response_format: dict[str, typing.Any] | None = Field(default=None, description="Response format specification")
145
+ seed: int | None = Field(default=None, description="Random seed for deterministic sampling")
146
+ service_tier: typing.Literal["auto", "default"] | None = Field(default=None,
147
+ description="Service tier for the request")
148
+ stream: bool | None = Field(default=False, description="Whether to stream partial message deltas")
149
+ stream_options: dict[str, typing.Any] | None = Field(default=None, description="Options for streaming")
150
+ temperature: float | None = Field(default=1.0, description="Sampling temperature between 0 and 2")
151
+ top_p: float | None = Field(default=None, description="Nucleus sampling parameter")
152
+ tools: list[dict[str, typing.Any]] | None = Field(default=None, description="List of tools the model may call")
153
+ tool_choice: str | dict[str, typing.Any] | None = Field(default=None, description="Controls which tool is called")
154
+ parallel_tool_calls: bool | None = Field(default=True, description="Whether to enable parallel function calling")
155
+ user: str | None = Field(default=None, description="Unique identifier representing end-user")
156
+ model_config = ConfigDict(extra="allow",
157
+ json_schema_extra={
158
+ "example": {
159
+ "model": "nvidia/nemotron",
160
+ "messages": [{
161
+ "role": "user", "content": "who are you?"
162
+ }],
163
+ "temperature": 0.7,
164
+ "stream": False
165
+ }
166
+ })
167
+
168
+ @staticmethod
169
+ def from_string(data: str,
170
+ *,
171
+ model: str | None = None,
172
+ temperature: float | None = None,
173
+ max_tokens: int | None = None,
174
+ top_p: float | None = None) -> "ChatRequest":
175
+
176
+ return ChatRequest(messages=[Message(content=data, role=UserMessageContentRoleType.USER)],
177
+ model=model,
178
+ temperature=temperature,
179
+ max_tokens=max_tokens,
180
+ top_p=top_p)
181
+
182
+ @staticmethod
183
+ def from_content(content: list[UserContent],
184
+ *,
185
+ model: str | None = None,
186
+ temperature: float | None = None,
187
+ max_tokens: int | None = None,
188
+ top_p: float | None = None) -> "ChatRequest":
189
+
190
+ return ChatRequest(messages=[Message(content=content, role=UserMessageContentRoleType.USER)],
191
+ model=model,
192
+ temperature=temperature,
193
+ max_tokens=max_tokens,
194
+ top_p=top_p)
195
+
196
+
197
+ class ChatRequestOrMessage(BaseModel):
198
+ """
199
+ `ChatRequestOrMessage` is a data model that represents either a conversation or a string input.
200
+ This is useful for functions that can handle either type of input.
201
+
202
+ - `messages` is compatible with the OpenAI Chat Completions API specification.
203
+ - `input_message` is a string input that can be used for functions that do not require a conversation.
204
+
205
+ Note: When `messages` is provided, extra fields are allowed to enable lossless round-trip
206
+ conversion with ChatRequest. When `input_message` is provided, no extra fields are permitted.
207
+ """
208
+ model_config = ConfigDict(
209
+ extra="allow",
210
+ json_schema_extra={
211
+ "examples": [
212
+ {
213
+ "input_message": "What can you do?"
214
+ },
215
+ {
216
+ "messages": [{
217
+ "role": "user", "content": "What can you do?"
218
+ }],
219
+ "model": "nvidia/nemotron",
220
+ "temperature": 0.7
221
+ },
222
+ ],
223
+ "oneOf": [
224
+ {
225
+ "required": ["input_message"],
226
+ "properties": {
227
+ "input_message": {
228
+ "type": "string"
229
+ },
230
+ },
231
+ "additionalProperties": {
232
+ "not": True, "errorMessage": 'remove additional property ${0#}'
233
+ },
234
+ },
235
+ {
236
+ "required": ["messages"],
237
+ "properties": {
238
+ "messages": {
239
+ "type": "array"
240
+ },
241
+ },
242
+ "additionalProperties": True
243
+ },
244
+ ]
245
+ },
246
+ )
247
+
248
+ messages: typing.Annotated[list[Message] | None, conlist(Message, min_length=1)] = Field(
249
+ default=None, description="A non-empty conversation of messages to process.")
250
+
251
+ input_message: str | None = Field(
252
+ default=None,
253
+ description="A single input message to process. Useful for functions that do not require a conversation")
254
+
255
+ @property
256
+ def is_string(self) -> bool:
257
+ return self.input_message is not None
258
+
259
+ @property
260
+ def is_conversation(self) -> bool:
261
+ return self.messages is not None
262
+
263
+ @model_validator(mode="after")
264
+ def validate_model(self):
265
+ if self.messages is not None and self.input_message is not None:
266
+ raise ValueError("Either messages or input_message must be provided, not both")
267
+ if self.messages is None and self.input_message is None:
268
+ raise ValueError("Either messages or input_message must be provided")
269
+ if self.input_message is not None:
270
+ extra_fields = self.model_dump(exclude={"input_message"}, exclude_none=True, exclude_unset=True)
271
+ if len(extra_fields) > 0:
272
+ raise ValueError("no extra fields are permitted when input_message is provided")
273
+ return self
274
+
275
+
276
+ class ChoiceMessage(BaseModel):
277
+ content: str | None = None
278
+ role: UserMessageContentRoleType | None = None
279
+
280
+
281
+ class ChoiceDelta(BaseModel):
282
+ """Delta object for streaming responses (OpenAI-compatible)"""
283
+ content: str | None = None
284
+ role: UserMessageContentRoleType | None = None
285
+
286
+
287
+ class ChoiceBase(BaseModel):
288
+ """Base choice model with common fields for both streaming and non-streaming responses"""
289
+ model_config = ConfigDict(extra="allow")
290
+ finish_reason: typing.Literal['stop', 'length', 'tool_calls', 'content_filter', 'function_call'] | None = None
291
+ index: int
292
+
293
+
294
+ class ChatResponseChoice(ChoiceBase):
295
+ """Choice model for non-streaming responses - contains message field"""
296
+ message: ChoiceMessage
297
+
298
+
299
+ class ChatResponseChunkChoice(ChoiceBase):
300
+ """Choice model for streaming responses - contains delta field"""
301
+ delta: ChoiceDelta
302
+
303
+
304
+ # Backward compatibility alias
305
+ Choice = ChatResponseChoice
306
+
307
+
308
+ class Usage(BaseModel):
309
+ prompt_tokens: int | None = None
310
+ completion_tokens: int | None = None
311
+ total_tokens: int | None = None
312
+
313
+
314
+ class ResponseSerializable(abc.ABC):
315
+ """
316
+ ResponseSerializable is an abstract class that defines the interface for serializing output for the NAT
317
+ Toolkit chat streaming API.
318
+ """
319
+
320
+ @abstractmethod
321
+ def get_stream_data(self) -> str:
322
+ pass
323
+
324
+
325
+ class ResponseBaseModelOutput(BaseModel, ResponseSerializable):
326
+
327
+ def get_stream_data(self) -> str:
328
+ return f"data: {self.model_dump_json()}\n\n"
329
+
330
+
331
+ class ResponseBaseModelIntermediate(BaseModel, ResponseSerializable):
332
+
333
+ def get_stream_data(self) -> str:
334
+ return f"intermediate_data: {self.model_dump_json()}\n\n"
335
+
336
+
337
+ class ChatResponse(ResponseBaseModelOutput):
338
+ """
339
+ ChatResponse is a data model that represents a response from the NAT chat API.
340
+ Fully compatible with OpenAI Chat Completions API specification.
341
+ """
342
+
343
+ # Allow extra fields in the model_config to support derived models
344
+ model_config = ConfigDict(extra="allow")
345
+ id: str
346
+ object: str = "chat.completion"
347
+ model: str = "unknown-model"
348
+ created: datetime.datetime
349
+ choices: list[ChatResponseChoice]
350
+ usage: Usage
351
+ system_fingerprint: str | None = None
352
+ service_tier: typing.Literal["scale", "default"] | None = None
353
+
354
+ @field_serializer('created')
355
+ def serialize_created(self, created: datetime.datetime) -> int:
356
+ """Serialize datetime to Unix timestamp for OpenAI compatibility"""
357
+ return int(created.timestamp())
358
+
359
+ @staticmethod
360
+ def from_string(data: str,
361
+ *,
362
+ id_: str | None = None,
363
+ object_: str | None = None,
364
+ model: str | None = None,
365
+ created: datetime.datetime | None = None,
366
+ usage: Usage) -> "ChatResponse":
367
+
368
+ if id_ is None:
369
+ id_ = str(uuid.uuid4())
370
+ if object_ is None:
371
+ object_ = "chat.completion"
372
+ if model is None:
373
+ model = "unknown-model"
374
+ if created is None:
375
+ created = datetime.datetime.now(datetime.UTC)
376
+
377
+ return ChatResponse(id=id_,
378
+ object=object_,
379
+ model=model,
380
+ created=created,
381
+ choices=[
382
+ ChatResponseChoice(index=0,
383
+ message=ChoiceMessage(content=data,
384
+ role=UserMessageContentRoleType.ASSISTANT),
385
+ finish_reason="stop")
386
+ ],
387
+ usage=usage)
388
+
389
+
390
+ class ChatResponseChunk(ResponseBaseModelOutput):
391
+ """
392
+ ChatResponseChunk is a data model that represents a response chunk from the NAT chat streaming API.
393
+ Fully compatible with OpenAI Chat Completions API specification.
394
+ """
395
+
396
+ # Allow extra fields in the model_config to support derived models
397
+ model_config = ConfigDict(extra="allow")
398
+
399
+ id: str
400
+ choices: list[ChatResponseChunkChoice]
401
+ created: datetime.datetime
402
+ model: str = "unknown-model"
403
+ object: str = "chat.completion.chunk"
404
+ system_fingerprint: str | None = None
405
+ service_tier: typing.Literal["scale", "default"] | None = None
406
+ usage: Usage | None = None
407
+
408
+ @field_serializer('created')
409
+ def serialize_created(self, created: datetime.datetime) -> int:
410
+ """Serialize datetime to Unix timestamp for OpenAI compatibility"""
411
+ return int(created.timestamp())
412
+
413
+ @staticmethod
414
+ def from_string(data: str,
415
+ *,
416
+ id_: str | None = None,
417
+ created: datetime.datetime | None = None,
418
+ model: str | None = None,
419
+ object_: str | None = None) -> "ChatResponseChunk":
420
+
421
+ if id_ is None:
422
+ id_ = str(uuid.uuid4())
423
+ if created is None:
424
+ created = datetime.datetime.now(datetime.UTC)
425
+ if model is None:
426
+ model = "unknown-model"
427
+ if object_ is None:
428
+ object_ = "chat.completion.chunk"
429
+
430
+ return ChatResponseChunk(id=id_,
431
+ choices=[
432
+ ChatResponseChunkChoice(index=0,
433
+ delta=ChoiceDelta(
434
+ content=data,
435
+ role=UserMessageContentRoleType.ASSISTANT),
436
+ finish_reason="stop")
437
+ ],
438
+ created=created,
439
+ model=model,
440
+ object=object_)
441
+
442
+ @staticmethod
443
+ def create_streaming_chunk(content: str,
444
+ *,
445
+ id_: str | None = None,
446
+ created: datetime.datetime | None = None,
447
+ model: str | None = None,
448
+ role: UserMessageContentRoleType | None = None,
449
+ finish_reason: str | None = None,
450
+ usage: Usage | None = None,
451
+ system_fingerprint: str | None = None) -> "ChatResponseChunk":
452
+ """Create an OpenAI-compatible streaming chunk"""
453
+ if id_ is None:
454
+ id_ = str(uuid.uuid4())
455
+ if created is None:
456
+ created = datetime.datetime.now(datetime.UTC)
457
+ if model is None:
458
+ model = "unknown-model"
459
+
460
+ delta = ChoiceDelta(content=content, role=role) if content is not None or role is not None else ChoiceDelta()
461
+
462
+ final_finish_reason = finish_reason if finish_reason in FINISH_REASONS else None
463
+
464
+ return ChatResponseChunk(
465
+ id=id_,
466
+ choices=[
467
+ ChatResponseChunkChoice(
468
+ index=0,
469
+ delta=delta,
470
+ finish_reason=typing.cast(
471
+ typing.Literal['stop', 'length', 'tool_calls', 'content_filter', 'function_call'] | None,
472
+ final_finish_reason))
473
+ ],
474
+ created=created,
475
+ model=model,
476
+ object="chat.completion.chunk",
477
+ usage=usage,
478
+ system_fingerprint=system_fingerprint)
479
+
480
+
481
+ class ResponseIntermediateStep(ResponseBaseModelIntermediate):
482
+ """
483
+ ResponseSerializedStep is a data model that represents a serialized step in the NAT chat streaming API.
484
+ """
485
+
486
+ # Allow extra fields in the model_config to support derived models
487
+ model_config = ConfigDict(extra="allow")
488
+
489
+ id: str
490
+ parent_id: str | None = None
491
+ type: str = "markdown"
492
+ name: str
493
+ payload: str
494
+
495
+
496
+ class ResponsePayloadOutput(BaseModel, ResponseSerializable):
497
+
498
+ payload: typing.Any
499
+
500
+ def get_stream_data(self) -> str:
501
+
502
+ if (isinstance(self.payload, BaseModel)):
503
+ return f"data: {self.payload.model_dump_json()}\n\n"
504
+
505
+ return f"data: {self.payload}\n\n"
506
+
507
+
508
+ class GenerateResponse(BaseModel):
509
+ # Allow extra fields in the model_config to support derived models
510
+ model_config = ConfigDict(extra="allow")
511
+
512
+ # (fixme) define the intermediate step model
513
+ intermediate_steps: list[tuple] | None = None
514
+ output: str
515
+ value: str | None = "default"
516
+
517
+
518
+ class WebSocketMessageType(str, Enum):
519
+ """
520
+ WebSocketMessageType is an Enum that represents WebSocket Message types.
521
+ """
522
+ USER_MESSAGE = "user_message"
523
+ RESPONSE_MESSAGE = "system_response_message"
524
+ INTERMEDIATE_STEP_MESSAGE = "system_intermediate_message"
525
+ SYSTEM_INTERACTION_MESSAGE = "system_interaction_message"
526
+ USER_INTERACTION_MESSAGE = "user_interaction_message"
527
+ ERROR_MESSAGE = "error_message"
528
+
529
+
530
+ class WorkflowSchemaType(str, Enum):
531
+ """
532
+ WorkflowSchemaType is an Enum that represents Workkflow response types.
533
+ """
534
+ GENERATE_STREAM = "generate_stream"
535
+ CHAT_STREAM = "chat_stream"
536
+ GENERATE = "generate"
537
+ CHAT = "chat"
538
+
539
+
540
+ class WebSocketMessageStatus(str, Enum):
541
+ """
542
+ WebSocketMessageStatus is an Enum that represents the status of a WebSocket message.
543
+ """
544
+ IN_PROGRESS = "in_progress"
545
+ COMPLETE = "complete"
546
+
547
+
548
+ class UserMessages(BaseModel):
549
+ model_config = ConfigDict(extra="forbid")
550
+
551
+ role: UserMessageContentRoleType
552
+ content: list[UserContent]
553
+
554
+
555
+ class UserMessageContent(BaseModel):
556
+ model_config = ConfigDict(extra="forbid")
557
+ messages: list[UserMessages]
558
+
559
+
560
+ class User(BaseModel):
561
+ model_config = ConfigDict(extra="forbid")
562
+
563
+ name: str = "default"
564
+ email: str = "default"
565
+
566
+
567
+ class ErrorTypes(str, Enum):
568
+ UNKNOWN_ERROR = "unknown_error"
569
+ INVALID_MESSAGE = "invalid_message"
570
+ INVALID_MESSAGE_TYPE = "invalid_message_type"
571
+ INVALID_USER_MESSAGE_CONTENT = "invalid_user_message_content"
572
+ INVALID_DATA_CONTENT = "invalid_data_content"
573
+
574
+
575
+ class Error(BaseModel):
576
+ model_config = ConfigDict(extra="forbid")
577
+
578
+ code: ErrorTypes = ErrorTypes.UNKNOWN_ERROR
579
+ message: str = "default"
580
+ details: str = "default"
581
+
582
+
583
+ class WebSocketUserMessage(BaseModel):
584
+ """
585
+ For more details, refer to the API documentation:
586
+ docs/source/developer_guide/websockets.md
587
+ """
588
+ # Allow extra fields in the model_config to support derived models
589
+ model_config = ConfigDict(extra="allow")
590
+
591
+ type: typing.Literal[WebSocketMessageType.USER_MESSAGE]
592
+ schema_type: WorkflowSchemaType
593
+ id: str = "default"
594
+ conversation_id: str | None = None
595
+ content: UserMessageContent
596
+ user: User = User()
597
+ security: Security = Security()
598
+ error: Error = Error()
599
+ schema_version: str = "1.0.0"
600
+ timestamp: str = str(datetime.datetime.now(datetime.UTC))
601
+
602
+
603
+ class WebSocketUserInteractionResponseMessage(BaseModel):
604
+ """
605
+ For more details, refer to the API documentation:
606
+ docs/source/developer_guide/websockets.md
607
+ """
608
+ type: typing.Literal[WebSocketMessageType.USER_INTERACTION_MESSAGE]
609
+ id: str = "default"
610
+ thread_id: str = "default"
611
+ content: UserMessageContent
612
+ user: User = User()
613
+ security: Security = Security()
614
+ error: Error = Error()
615
+ schema_version: str = "1.0.0"
616
+ timestamp: str = str(datetime.datetime.now(datetime.UTC))
617
+
618
+
619
+ class SystemIntermediateStepContent(BaseModel):
620
+ model_config = ConfigDict(extra="forbid")
621
+ name: str
622
+ payload: str
623
+
624
+
625
+ class WebSocketSystemIntermediateStepMessage(BaseModel):
626
+ """
627
+ For more details, refer to the API documentation:
628
+ docs/source/developer_guide/websockets.md
629
+ """
630
+ # Allow extra fields in the model_config to support derived models
631
+ model_config = ConfigDict(extra="allow")
632
+
633
+ type: typing.Literal[WebSocketMessageType.INTERMEDIATE_STEP_MESSAGE]
634
+ id: str = "default"
635
+ thread_id: str | None = "default"
636
+ parent_id: str = "default"
637
+ intermediate_parent_id: str | None = "default"
638
+ update_message_id: str | None = "default"
639
+ conversation_id: str | None = None
640
+ content: SystemIntermediateStepContent
641
+ status: WebSocketMessageStatus
642
+ timestamp: str = str(datetime.datetime.now(datetime.UTC))
643
+
644
+
645
+ class SystemResponseContent(BaseModel):
646
+ model_config = ConfigDict(extra="forbid")
647
+
648
+ text: str | None = None
649
+
650
+
651
+ class WebSocketSystemResponseTokenMessage(BaseModel):
652
+ """
653
+ For more details, refer to the API documentation:
654
+ docs/source/developer_guide/websockets.md
655
+ """
656
+ # Allow extra fields in the model_config to support derived models
657
+ model_config = ConfigDict(extra="allow")
658
+
659
+ type: typing.Literal[WebSocketMessageType.RESPONSE_MESSAGE, WebSocketMessageType.ERROR_MESSAGE]
660
+ id: str | None = "default"
661
+ thread_id: str | None = "default"
662
+ parent_id: str = "default"
663
+ conversation_id: str | None = None
664
+ content: SystemResponseContent | Error | GenerateResponse
665
+ status: WebSocketMessageStatus
666
+ timestamp: str = str(datetime.datetime.now(datetime.UTC))
667
+
668
+ @field_validator("content")
669
+ @classmethod
670
+ def validate_content_by_type(cls, value: SystemResponseContent | Error | GenerateResponse, info: ValidationInfo):
671
+ if info.data.get("type") == WebSocketMessageType.ERROR_MESSAGE and not isinstance(value, Error):
672
+ raise ValueError(f"Field: content must be 'Error' when type is {WebSocketMessageType.ERROR_MESSAGE}")
673
+
674
+ if info.data.get("type") == WebSocketMessageType.RESPONSE_MESSAGE and not isinstance(
675
+ value, SystemResponseContent | GenerateResponse):
676
+ raise ValueError(
677
+ f"Field: content must be 'SystemResponseContent' when type is {WebSocketMessageType.RESPONSE_MESSAGE}")
678
+ return value
679
+
680
+
681
+ class WebSocketSystemInteractionMessage(BaseModel):
682
+ """
683
+ For more details, refer to the API documentation:
684
+ docs/source/developer_guide/websockets.md
685
+ """
686
+ # Allow extra fields in the model_config to support derived models
687
+ model_config = ConfigDict(extra="allow")
688
+
689
+ type: typing.Literal[
690
+ WebSocketMessageType.SYSTEM_INTERACTION_MESSAGE] = WebSocketMessageType.SYSTEM_INTERACTION_MESSAGE
691
+ id: str | None = "default"
692
+ thread_id: str | None = "default"
693
+ parent_id: str = "default"
694
+ conversation_id: str | None = None
695
+ content: HumanPrompt
696
+ status: WebSocketMessageStatus
697
+ timestamp: str = str(datetime.datetime.now(datetime.UTC))
698
+
699
+
700
+ # ======== GenerateResponse Converters ========
701
+
702
+
703
+ def _generate_response_to_str(response: GenerateResponse) -> str:
704
+ return response.output
705
+
706
+
707
+ GlobalTypeConverter.register_converter(_generate_response_to_str)
708
+
709
+
710
+ def _generate_response_to_chat_response(response: GenerateResponse) -> ChatResponse:
711
+ data = response.output
712
+
713
+ # Simulate usage
714
+ prompt_tokens = 0
715
+ usage = Usage(prompt_tokens=prompt_tokens,
716
+ completion_tokens=len(data.split()),
717
+ total_tokens=prompt_tokens + len(data.split()))
718
+
719
+ # Build and return the response
720
+ return ChatResponse.from_string(data, usage=usage)
721
+
722
+
723
+ GlobalTypeConverter.register_converter(_generate_response_to_chat_response)
724
+
725
+
726
+ # ======== ChatRequest Converters ========
727
+ def _nat_chat_request_to_string(data: ChatRequest) -> str:
728
+ if isinstance(data.messages[-1].content, str):
729
+ return data.messages[-1].content
730
+ return str(data.messages[-1].content)
731
+
732
+
733
+ GlobalTypeConverter.register_converter(_nat_chat_request_to_string)
734
+
735
+
736
+ def _string_to_nat_chat_request(data: str) -> ChatRequest:
737
+ return ChatRequest.from_string(data, model="unknown-model")
738
+
739
+
740
+ GlobalTypeConverter.register_converter(_string_to_nat_chat_request)
741
+
742
+
743
+ def _chat_request_or_message_to_chat_request(data: ChatRequestOrMessage) -> ChatRequest:
744
+ if data.input_message is not None:
745
+ return _string_to_nat_chat_request(data.input_message)
746
+ return ChatRequest(**data.model_dump(exclude={"input_message"}))
747
+
748
+
749
+ GlobalTypeConverter.register_converter(_chat_request_or_message_to_chat_request)
750
+
751
+
752
+ def _chat_request_to_chat_request_or_message(data: ChatRequest) -> ChatRequestOrMessage:
753
+ return ChatRequestOrMessage(**data.model_dump(by_alias=True))
754
+
755
+
756
+ GlobalTypeConverter.register_converter(_chat_request_to_chat_request_or_message)
757
+
758
+
759
+ def _chat_request_or_message_to_string(data: ChatRequestOrMessage) -> str:
760
+ if data.input_message is not None:
761
+ return data.input_message
762
+ # Extract content from last message in conversation
763
+ if data.messages is None:
764
+ return ""
765
+ content = data.messages[-1].content
766
+ if content is None:
767
+ return ""
768
+ if isinstance(content, str):
769
+ return content
770
+ return str(content)
771
+
772
+
773
+ GlobalTypeConverter.register_converter(_chat_request_or_message_to_string)
774
+
775
+
776
+ def _string_to_chat_request_or_message(data: str) -> ChatRequestOrMessage:
777
+ return ChatRequestOrMessage(input_message=data)
778
+
779
+
780
+ GlobalTypeConverter.register_converter(_string_to_chat_request_or_message)
781
+
782
+
783
+ # ======== ChatResponse Converters ========
784
+ def _nat_chat_response_to_string(data: ChatResponse) -> str:
785
+ if data.choices and data.choices[0].message:
786
+ return data.choices[0].message.content or ""
787
+ return ""
788
+
789
+
790
+ GlobalTypeConverter.register_converter(_nat_chat_response_to_string)
791
+
792
+
793
+ def _string_to_nat_chat_response(data: str) -> ChatResponse:
794
+ '''Converts a string to an ChatResponse object'''
795
+
796
+ # Simulate usage
797
+ prompt_tokens = 0
798
+ usage = Usage(prompt_tokens=prompt_tokens,
799
+ completion_tokens=len(data.split()),
800
+ total_tokens=prompt_tokens + len(data.split()))
801
+
802
+ # Build and return the response
803
+ return ChatResponse.from_string(data, usage=usage)
804
+
805
+
806
+ GlobalTypeConverter.register_converter(_string_to_nat_chat_response)
807
+
808
+
809
+ # ======== ChatResponseChunk Converters ========
810
+ def _chat_response_chunk_to_string(data: ChatResponseChunk) -> str:
811
+ if data.choices and len(data.choices) > 0:
812
+ choice = data.choices[0]
813
+ if choice.delta and choice.delta.content:
814
+ return choice.delta.content
815
+ return ""
816
+
817
+
818
+ GlobalTypeConverter.register_converter(_chat_response_chunk_to_string)
819
+
820
+
821
+ def _string_to_nat_chat_response_chunk(data: str) -> ChatResponseChunk:
822
+ '''Converts a string to an ChatResponseChunk object'''
823
+
824
+ # Build and return the response
825
+ return ChatResponseChunk.from_string(data)
826
+
827
+
828
+ GlobalTypeConverter.register_converter(_string_to_nat_chat_response_chunk)
829
+
830
+ # Compatibility aliases with previous releases
831
+ AIQChatRequest = ChatRequest
832
+ AIQChoiceMessage = ChoiceMessage
833
+ AIQChoiceDelta = ChoiceDelta
834
+ AIQChoice = Choice
835
+ AIQUsage = Usage
836
+ AIQResponseSerializable = ResponseSerializable
837
+ AIQResponseBaseModelOutput = ResponseBaseModelOutput
838
+ AIQResponseBaseModelIntermediate = ResponseBaseModelIntermediate
839
+ AIQChatResponse = ChatResponse
840
+ AIQChatResponseChunk = ChatResponseChunk
841
+ AIQResponseIntermediateStep = ResponseIntermediateStep
842
+ AIQResponsePayloadOutput = ResponsePayloadOutput
843
+ AIQGenerateResponse = GenerateResponse