datarobot-genai 0.2.31__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 (125) hide show
  1. datarobot_genai/__init__.py +19 -0
  2. datarobot_genai/core/__init__.py +0 -0
  3. datarobot_genai/core/agents/__init__.py +43 -0
  4. datarobot_genai/core/agents/base.py +195 -0
  5. datarobot_genai/core/chat/__init__.py +19 -0
  6. datarobot_genai/core/chat/auth.py +146 -0
  7. datarobot_genai/core/chat/client.py +178 -0
  8. datarobot_genai/core/chat/responses.py +297 -0
  9. datarobot_genai/core/cli/__init__.py +18 -0
  10. datarobot_genai/core/cli/agent_environment.py +47 -0
  11. datarobot_genai/core/cli/agent_kernel.py +211 -0
  12. datarobot_genai/core/custom_model.py +141 -0
  13. datarobot_genai/core/mcp/__init__.py +0 -0
  14. datarobot_genai/core/mcp/common.py +218 -0
  15. datarobot_genai/core/telemetry_agent.py +126 -0
  16. datarobot_genai/core/utils/__init__.py +3 -0
  17. datarobot_genai/core/utils/auth.py +234 -0
  18. datarobot_genai/core/utils/urls.py +64 -0
  19. datarobot_genai/crewai/__init__.py +24 -0
  20. datarobot_genai/crewai/agent.py +42 -0
  21. datarobot_genai/crewai/base.py +159 -0
  22. datarobot_genai/crewai/events.py +117 -0
  23. datarobot_genai/crewai/mcp.py +59 -0
  24. datarobot_genai/drmcp/__init__.py +78 -0
  25. datarobot_genai/drmcp/core/__init__.py +13 -0
  26. datarobot_genai/drmcp/core/auth.py +165 -0
  27. datarobot_genai/drmcp/core/clients.py +180 -0
  28. datarobot_genai/drmcp/core/config.py +364 -0
  29. datarobot_genai/drmcp/core/config_utils.py +174 -0
  30. datarobot_genai/drmcp/core/constants.py +18 -0
  31. datarobot_genai/drmcp/core/credentials.py +190 -0
  32. datarobot_genai/drmcp/core/dr_mcp_server.py +350 -0
  33. datarobot_genai/drmcp/core/dr_mcp_server_logo.py +136 -0
  34. datarobot_genai/drmcp/core/dynamic_prompts/__init__.py +13 -0
  35. datarobot_genai/drmcp/core/dynamic_prompts/controllers.py +130 -0
  36. datarobot_genai/drmcp/core/dynamic_prompts/dr_lib.py +70 -0
  37. datarobot_genai/drmcp/core/dynamic_prompts/register.py +205 -0
  38. datarobot_genai/drmcp/core/dynamic_prompts/utils.py +33 -0
  39. datarobot_genai/drmcp/core/dynamic_tools/__init__.py +14 -0
  40. datarobot_genai/drmcp/core/dynamic_tools/deployment/__init__.py +0 -0
  41. datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/__init__.py +14 -0
  42. datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/base.py +72 -0
  43. datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/default.py +82 -0
  44. datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/drum.py +238 -0
  45. datarobot_genai/drmcp/core/dynamic_tools/deployment/config.py +228 -0
  46. datarobot_genai/drmcp/core/dynamic_tools/deployment/controllers.py +63 -0
  47. datarobot_genai/drmcp/core/dynamic_tools/deployment/metadata.py +162 -0
  48. datarobot_genai/drmcp/core/dynamic_tools/deployment/register.py +87 -0
  49. datarobot_genai/drmcp/core/dynamic_tools/deployment/schemas/drum_agentic_fallback_schema.json +36 -0
  50. datarobot_genai/drmcp/core/dynamic_tools/deployment/schemas/drum_prediction_fallback_schema.json +10 -0
  51. datarobot_genai/drmcp/core/dynamic_tools/register.py +254 -0
  52. datarobot_genai/drmcp/core/dynamic_tools/schema.py +532 -0
  53. datarobot_genai/drmcp/core/exceptions.py +25 -0
  54. datarobot_genai/drmcp/core/logging.py +98 -0
  55. datarobot_genai/drmcp/core/mcp_instance.py +515 -0
  56. datarobot_genai/drmcp/core/memory_management/__init__.py +13 -0
  57. datarobot_genai/drmcp/core/memory_management/manager.py +820 -0
  58. datarobot_genai/drmcp/core/memory_management/memory_tools.py +201 -0
  59. datarobot_genai/drmcp/core/routes.py +439 -0
  60. datarobot_genai/drmcp/core/routes_utils.py +30 -0
  61. datarobot_genai/drmcp/core/server_life_cycle.py +107 -0
  62. datarobot_genai/drmcp/core/telemetry.py +424 -0
  63. datarobot_genai/drmcp/core/tool_config.py +111 -0
  64. datarobot_genai/drmcp/core/tool_filter.py +117 -0
  65. datarobot_genai/drmcp/core/utils.py +138 -0
  66. datarobot_genai/drmcp/server.py +19 -0
  67. datarobot_genai/drmcp/test_utils/__init__.py +13 -0
  68. datarobot_genai/drmcp/test_utils/clients/__init__.py +0 -0
  69. datarobot_genai/drmcp/test_utils/clients/anthropic.py +68 -0
  70. datarobot_genai/drmcp/test_utils/clients/base.py +300 -0
  71. datarobot_genai/drmcp/test_utils/clients/dr_gateway.py +58 -0
  72. datarobot_genai/drmcp/test_utils/clients/openai.py +68 -0
  73. datarobot_genai/drmcp/test_utils/elicitation_test_tool.py +89 -0
  74. datarobot_genai/drmcp/test_utils/integration_mcp_server.py +109 -0
  75. datarobot_genai/drmcp/test_utils/mcp_utils_ete.py +133 -0
  76. datarobot_genai/drmcp/test_utils/mcp_utils_integration.py +107 -0
  77. datarobot_genai/drmcp/test_utils/test_interactive.py +205 -0
  78. datarobot_genai/drmcp/test_utils/tool_base_ete.py +220 -0
  79. datarobot_genai/drmcp/test_utils/utils.py +91 -0
  80. datarobot_genai/drmcp/tools/__init__.py +14 -0
  81. datarobot_genai/drmcp/tools/clients/__init__.py +14 -0
  82. datarobot_genai/drmcp/tools/clients/atlassian.py +188 -0
  83. datarobot_genai/drmcp/tools/clients/confluence.py +584 -0
  84. datarobot_genai/drmcp/tools/clients/gdrive.py +832 -0
  85. datarobot_genai/drmcp/tools/clients/jira.py +334 -0
  86. datarobot_genai/drmcp/tools/clients/microsoft_graph.py +479 -0
  87. datarobot_genai/drmcp/tools/clients/s3.py +28 -0
  88. datarobot_genai/drmcp/tools/confluence/__init__.py +14 -0
  89. datarobot_genai/drmcp/tools/confluence/tools.py +321 -0
  90. datarobot_genai/drmcp/tools/gdrive/__init__.py +0 -0
  91. datarobot_genai/drmcp/tools/gdrive/tools.py +347 -0
  92. datarobot_genai/drmcp/tools/jira/__init__.py +14 -0
  93. datarobot_genai/drmcp/tools/jira/tools.py +243 -0
  94. datarobot_genai/drmcp/tools/microsoft_graph/__init__.py +13 -0
  95. datarobot_genai/drmcp/tools/microsoft_graph/tools.py +198 -0
  96. datarobot_genai/drmcp/tools/predictive/__init__.py +27 -0
  97. datarobot_genai/drmcp/tools/predictive/data.py +133 -0
  98. datarobot_genai/drmcp/tools/predictive/deployment.py +91 -0
  99. datarobot_genai/drmcp/tools/predictive/deployment_info.py +392 -0
  100. datarobot_genai/drmcp/tools/predictive/model.py +148 -0
  101. datarobot_genai/drmcp/tools/predictive/predict.py +254 -0
  102. datarobot_genai/drmcp/tools/predictive/predict_realtime.py +307 -0
  103. datarobot_genai/drmcp/tools/predictive/project.py +90 -0
  104. datarobot_genai/drmcp/tools/predictive/training.py +661 -0
  105. datarobot_genai/langgraph/__init__.py +0 -0
  106. datarobot_genai/langgraph/agent.py +341 -0
  107. datarobot_genai/langgraph/mcp.py +73 -0
  108. datarobot_genai/llama_index/__init__.py +16 -0
  109. datarobot_genai/llama_index/agent.py +50 -0
  110. datarobot_genai/llama_index/base.py +299 -0
  111. datarobot_genai/llama_index/mcp.py +79 -0
  112. datarobot_genai/nat/__init__.py +0 -0
  113. datarobot_genai/nat/agent.py +275 -0
  114. datarobot_genai/nat/datarobot_auth_provider.py +110 -0
  115. datarobot_genai/nat/datarobot_llm_clients.py +318 -0
  116. datarobot_genai/nat/datarobot_llm_providers.py +130 -0
  117. datarobot_genai/nat/datarobot_mcp_client.py +266 -0
  118. datarobot_genai/nat/helpers.py +87 -0
  119. datarobot_genai/py.typed +0 -0
  120. datarobot_genai-0.2.31.dist-info/METADATA +145 -0
  121. datarobot_genai-0.2.31.dist-info/RECORD +125 -0
  122. datarobot_genai-0.2.31.dist-info/WHEEL +4 -0
  123. datarobot_genai-0.2.31.dist-info/entry_points.txt +5 -0
  124. datarobot_genai-0.2.31.dist-info/licenses/AUTHORS +2 -0
  125. datarobot_genai-0.2.31.dist-info/licenses/LICENSE +201 -0
@@ -0,0 +1,266 @@
1
+ # Copyright 2025 DataRobot, Inc. and its affiliates.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ import logging
18
+ from datetime import timedelta
19
+ from typing import TYPE_CHECKING
20
+ from typing import Literal
21
+
22
+ from nat.cli.register_workflow import register_function_group
23
+ from nat.data_models.component_ref import AuthenticationRef
24
+ from nat.plugins.mcp.client_base import AuthAdapter
25
+ from nat.plugins.mcp.client_base import MCPStreamableHTTPClient
26
+ from nat.plugins.mcp.client_config import MCPServerConfig
27
+ from nat.plugins.mcp.client_impl import MCPClientConfig
28
+ from pydantic import Field
29
+ from pydantic import HttpUrl
30
+
31
+ if TYPE_CHECKING:
32
+ import httpx
33
+ from nat.authentication.interfaces import AuthProviderBase
34
+ from nat.builder.builder import Builder
35
+ from nat.plugins.mcp.client_impl import MCPFunctionGroup
36
+
37
+ logger = logging.getLogger(__name__)
38
+
39
+
40
+ def _default_transport() -> Literal["streamable-http", "sse", "stdio"]:
41
+ from datarobot_genai.core.mcp.common import MCPConfig # noqa: PLC0415
42
+
43
+ server_config = MCPConfig().server_config
44
+ return server_config["transport"] if server_config else "stdio"
45
+
46
+
47
+ def _default_url() -> HttpUrl | None:
48
+ from datarobot_genai.core.mcp.common import MCPConfig # noqa: PLC0415
49
+
50
+ server_config = MCPConfig().server_config
51
+ return server_config["url"] if server_config else None
52
+
53
+
54
+ def _default_auth_provider() -> str | AuthenticationRef | None:
55
+ from datarobot_genai.core.mcp.common import MCPConfig # noqa: PLC0415
56
+
57
+ server_config = MCPConfig().server_config
58
+ return "datarobot_mcp_auth" if server_config else None
59
+
60
+
61
+ def _default_command() -> str | None:
62
+ from datarobot_genai.core.mcp.common import MCPConfig # noqa: PLC0415
63
+
64
+ server_config = MCPConfig().server_config
65
+ return None if server_config else "docker"
66
+
67
+
68
+ class DataRobotMCPServerConfig(MCPServerConfig):
69
+ transport: Literal["streamable-http", "sse", "stdio"] = Field(
70
+ default_factory=_default_transport,
71
+ description="Transport type to connect to the MCP server (sse or streamable-http)",
72
+ )
73
+ url: HttpUrl | None = Field(
74
+ default_factory=_default_url,
75
+ description="URL of the MCP server (for sse or streamable-http transport)",
76
+ )
77
+ # Authentication configuration
78
+ auth_provider: str | AuthenticationRef | None = Field(
79
+ default_factory=_default_auth_provider,
80
+ description="Reference to authentication provider",
81
+ )
82
+ command: str | None = Field(
83
+ default_factory=_default_command,
84
+ description="Command to run for stdio transport (e.g. 'python' or 'docker')",
85
+ )
86
+
87
+
88
+ class DataRobotMCPClientConfig(MCPClientConfig, name="datarobot_mcp_client"): # type: ignore[call-arg]
89
+ server: DataRobotMCPServerConfig = Field(
90
+ default_factory=DataRobotMCPServerConfig,
91
+ description="DataRobot MCP Server configuration",
92
+ )
93
+
94
+
95
+ class DataRobotAuthAdapter(AuthAdapter):
96
+ async def _get_auth_headers(
97
+ self, request: httpx.Request | None = None, response: httpx.Response | None = None
98
+ ) -> dict[str, str]:
99
+ """Get authentication headers from the NAT auth provider."""
100
+ try:
101
+ # Use the user_id passed to this AuthAdapter instance
102
+ auth_result = await self.auth_provider.authenticate(
103
+ user_id=self.user_id, response=response
104
+ )
105
+ as_kwargs = auth_result.as_requests_kwargs()
106
+ return as_kwargs["headers"]
107
+ except Exception as e:
108
+ logger.warning("Failed to get auth token: %s", e)
109
+ return {}
110
+
111
+
112
+ class DataRobotMCPStreamableHTTPClient(MCPStreamableHTTPClient):
113
+ def __init__(
114
+ self,
115
+ url: str,
116
+ auth_provider: AuthProviderBase | None = None,
117
+ user_id: str | None = None,
118
+ tool_call_timeout: timedelta = timedelta(seconds=60),
119
+ auth_flow_timeout: timedelta = timedelta(seconds=300),
120
+ reconnect_enabled: bool = True,
121
+ reconnect_max_attempts: int = 2,
122
+ reconnect_initial_backoff: float = 0.5,
123
+ reconnect_max_backoff: float = 50.0,
124
+ ):
125
+ super().__init__(
126
+ url=url,
127
+ auth_provider=auth_provider,
128
+ user_id=user_id,
129
+ tool_call_timeout=tool_call_timeout,
130
+ auth_flow_timeout=auth_flow_timeout,
131
+ reconnect_enabled=reconnect_enabled,
132
+ reconnect_max_attempts=reconnect_max_attempts,
133
+ reconnect_initial_backoff=reconnect_initial_backoff,
134
+ reconnect_max_backoff=reconnect_max_backoff,
135
+ )
136
+ effective_user_id = user_id or (
137
+ auth_provider.config.default_user_id if auth_provider else None
138
+ )
139
+ self._httpx_auth = (
140
+ DataRobotAuthAdapter(auth_provider, effective_user_id) if auth_provider else None
141
+ )
142
+
143
+
144
+ @register_function_group(config_type=DataRobotMCPClientConfig)
145
+ async def datarobot_mcp_client_function_group(
146
+ config: DataRobotMCPClientConfig, _builder: Builder
147
+ ) -> MCPFunctionGroup:
148
+ """
149
+ Connect to an MCP server and expose tools as a function group.
150
+
151
+ Args:
152
+ config: The configuration for the MCP client
153
+ _builder: The builder
154
+ Returns:
155
+ The function group
156
+ """
157
+ from nat.plugins.mcp.client_base import MCPSSEClient # noqa: PLC0415
158
+ from nat.plugins.mcp.client_base import MCPStdioClient # noqa: PLC0415
159
+ from nat.plugins.mcp.client_impl import MCPFunctionGroup # noqa: PLC0415
160
+ from nat.plugins.mcp.client_impl import mcp_apply_tool_alias_and_description # noqa: PLC0415
161
+ from nat.plugins.mcp.client_impl import mcp_session_tool_function # noqa: PLC0415
162
+
163
+ # Resolve auth provider if specified
164
+ auth_provider = None
165
+ if config.server.auth_provider:
166
+ auth_provider = await _builder.get_auth_provider(config.server.auth_provider)
167
+
168
+ # Build the appropriate client
169
+ if config.server.transport == "stdio":
170
+ if not config.server.command:
171
+ raise ValueError("command is required for stdio transport")
172
+ client = MCPStdioClient(
173
+ config.server.command,
174
+ config.server.args,
175
+ config.server.env,
176
+ tool_call_timeout=config.tool_call_timeout,
177
+ auth_flow_timeout=config.auth_flow_timeout,
178
+ reconnect_enabled=config.reconnect_enabled,
179
+ reconnect_max_attempts=config.reconnect_max_attempts,
180
+ reconnect_initial_backoff=config.reconnect_initial_backoff,
181
+ reconnect_max_backoff=config.reconnect_max_backoff,
182
+ )
183
+ elif config.server.transport == "sse":
184
+ client = MCPSSEClient(
185
+ str(config.server.url),
186
+ tool_call_timeout=config.tool_call_timeout,
187
+ auth_flow_timeout=config.auth_flow_timeout,
188
+ reconnect_enabled=config.reconnect_enabled,
189
+ reconnect_max_attempts=config.reconnect_max_attempts,
190
+ reconnect_initial_backoff=config.reconnect_initial_backoff,
191
+ reconnect_max_backoff=config.reconnect_max_backoff,
192
+ )
193
+ elif config.server.transport == "streamable-http":
194
+ # Use default_user_id for the base client
195
+ base_user_id = auth_provider.config.default_user_id if auth_provider else None
196
+ client = DataRobotMCPStreamableHTTPClient(
197
+ str(config.server.url),
198
+ auth_provider=auth_provider,
199
+ user_id=base_user_id,
200
+ tool_call_timeout=config.tool_call_timeout,
201
+ auth_flow_timeout=config.auth_flow_timeout,
202
+ reconnect_enabled=config.reconnect_enabled,
203
+ reconnect_max_attempts=config.reconnect_max_attempts,
204
+ reconnect_initial_backoff=config.reconnect_initial_backoff,
205
+ reconnect_max_backoff=config.reconnect_max_backoff,
206
+ )
207
+ else:
208
+ raise ValueError(f"Unsupported transport: {config.server.transport}")
209
+
210
+ logger.info("Configured to use MCP server at %s", client.server_name)
211
+
212
+ # Create the MCP function group
213
+ group = MCPFunctionGroup(config=config)
214
+
215
+ # Store shared components for session client creation
216
+ group._shared_auth_provider = auth_provider
217
+ group._client_config = config
218
+
219
+ async with client:
220
+ # Expose the live MCP client on the function group instance so other components
221
+ # (e.g., HTTP endpoints) can reuse the already-established session instead of creating a
222
+ # new client per request.
223
+ group.mcp_client = client
224
+ group.mcp_client_server_name = client.server_name
225
+ group.mcp_client_transport = client.transport
226
+
227
+ all_tools = await client.get_tools()
228
+ tool_overrides = mcp_apply_tool_alias_and_description(all_tools, config.tool_overrides)
229
+
230
+ # Add each tool as a function to the group
231
+ for tool_name, tool in all_tools.items():
232
+ # Get override if it exists
233
+ override = tool_overrides.get(tool_name)
234
+
235
+ # Use override values or defaults
236
+ function_name = override.alias if override and override.alias else tool_name
237
+ description = (
238
+ override.description if override and override.description else tool.description
239
+ )
240
+
241
+ # Create the tool function according to configuration
242
+ tool_fn = mcp_session_tool_function(tool, group)
243
+
244
+ # Normalize optional typing for linter/type-checker compatibility
245
+ single_fn = tool_fn.single_fn
246
+ if single_fn is None:
247
+ # Should not happen because FunctionInfo always sets a single_fn
248
+ logger.warning("Skipping tool %s because single_fn is None", function_name)
249
+ continue
250
+
251
+ input_schema = tool_fn.input_schema
252
+ # Convert NoneType sentinel to None for FunctionGroup.add_function signature
253
+ if input_schema is type(None): # noqa: E721
254
+ input_schema = None
255
+
256
+ # Add to group
257
+ logger.info("Adding tool %s to group", function_name)
258
+ group.add_function(
259
+ name=function_name,
260
+ description=description,
261
+ fn=single_fn,
262
+ input_schema=input_schema,
263
+ converters=tool_fn.converters,
264
+ )
265
+
266
+ yield group
@@ -0,0 +1,87 @@
1
+ # Copyright 2025 DataRobot, Inc. and its affiliates.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from collections.abc import AsyncGenerator
16
+ from contextlib import asynccontextmanager
17
+
18
+ from nat.builder.workflow import Workflow
19
+ from nat.builder.workflow_builder import WorkflowBuilder
20
+ from nat.data_models.config import Config
21
+ from nat.runtime.loader import PluginTypes
22
+ from nat.runtime.loader import discover_and_register_plugins
23
+ from nat.runtime.session import SessionManager
24
+ from nat.utils.data_models.schema_validator import validate_schema
25
+ from nat.utils.io.yaml_tools import yaml_load
26
+ from nat.utils.type_utils import StrPath
27
+
28
+
29
+ def load_config(config_file: StrPath, headers: dict[str, str] | None = None) -> Config:
30
+ """
31
+ Load a NAT configuration file with injected headers. It ensures that all plugins are
32
+ loaded and then validates the configuration file against the Config schema.
33
+
34
+ Parameters
35
+ ----------
36
+ config_file : StrPath
37
+ The path to the configuration file
38
+
39
+ Returns
40
+ -------
41
+ Config
42
+ The validated Config object
43
+ """
44
+ # Ensure all of the plugins are loaded
45
+ discover_and_register_plugins(PluginTypes.CONFIG_OBJECT)
46
+
47
+ config_yaml = yaml_load(config_file)
48
+
49
+ add_headers_to_datarobot_mcp_auth(config_yaml, headers)
50
+
51
+ # Validate configuration adheres to NAT schemas
52
+ validated_nat_config = validate_schema(config_yaml, Config)
53
+
54
+ return validated_nat_config
55
+
56
+
57
+ def add_headers_to_datarobot_mcp_auth(config_yaml: dict, headers: dict[str, str] | None) -> None:
58
+ if headers:
59
+ if authentication := config_yaml.get("authentication"):
60
+ for auth_name in authentication:
61
+ auth_config = authentication[auth_name]
62
+ if auth_config.get("_type") == "datarobot_mcp_auth":
63
+ auth_config["headers"] = headers
64
+
65
+
66
+ @asynccontextmanager
67
+ async def load_workflow(
68
+ config_file: StrPath, max_concurrency: int = -1, headers: dict[str, str] | None = None
69
+ ) -> AsyncGenerator[Workflow, None]:
70
+ """
71
+ Load the NAT configuration file and create a Runner object. This is the primary entry point for
72
+ running NAT workflows with injected headers.
73
+
74
+ Parameters
75
+ ----------
76
+ config_file : StrPath
77
+ The path to the configuration file
78
+ max_concurrency : int, optional
79
+ The maximum number of parallel workflow invocations to support. Specifying 0 or -1 will
80
+ allow an unlimited count, by default -1
81
+ """
82
+ # Load the config object
83
+ config = load_config(config_file, headers=headers)
84
+
85
+ # Must yield the workflow function otherwise it cleans up
86
+ async with WorkflowBuilder.from_config(config=config) as workflow:
87
+ yield SessionManager(await workflow.build(), max_concurrency=max_concurrency)
File without changes
@@ -0,0 +1,145 @@
1
+ Metadata-Version: 2.4
2
+ Name: datarobot-genai
3
+ Version: 0.2.31
4
+ Summary: Generic helpers for GenAI
5
+ Project-URL: Homepage, https://github.com/datarobot-oss/datarobot-genai
6
+ Author: DataRobot, Inc.
7
+ License: Apache-2.0
8
+ License-File: AUTHORS
9
+ License-File: LICENSE
10
+ Requires-Python: <3.13,>=3.10
11
+ Requires-Dist: ag-ui-protocol<0.2.0,>=0.1.9
12
+ Requires-Dist: datarobot-drum<2.0.0,>=1.17.5
13
+ Requires-Dist: datarobot-predict<2.0.0,>=1.13.2
14
+ Requires-Dist: datarobot<4.0.0,>=3.10.0
15
+ Requires-Dist: openai<2.0.0,>=1.76.2
16
+ Requires-Dist: opentelemetry-instrumentation-aiohttp-client<1.0.0,>=0.43b0
17
+ Requires-Dist: opentelemetry-instrumentation-httpx<1.0.0,>=0.43b0
18
+ Requires-Dist: opentelemetry-instrumentation-openai<1.0.0,>=0.40.5
19
+ Requires-Dist: opentelemetry-instrumentation-requests<1.0.0,>=0.43b0
20
+ Requires-Dist: opentelemetry-instrumentation-threading<1.0.0,>=0.43b0
21
+ Requires-Dist: pandas<3.0.0,>=2.2.3
22
+ Requires-Dist: pyarrow==20.0.0
23
+ Requires-Dist: pyjwt<3.0.0,>=2.10.1
24
+ Requires-Dist: pypdf<7.0.0,>=6.1.3
25
+ Requires-Dist: ragas<0.4.0,>=0.3.8
26
+ Requires-Dist: requests<3.0.0,>=2.32.4
27
+ Provides-Extra: crewai
28
+ Requires-Dist: anthropic<1.0.0,~=0.71.0; extra == 'crewai'
29
+ Requires-Dist: azure-ai-inference<2.0.0,>=1.0.0b9; extra == 'crewai'
30
+ Requires-Dist: crewai-tools[mcp]<0.77.0,>=0.69.0; extra == 'crewai'
31
+ Requires-Dist: crewai>=1.1.0; extra == 'crewai'
32
+ Requires-Dist: opentelemetry-instrumentation-crewai<1.0.0,>=0.40.5; extra == 'crewai'
33
+ Requires-Dist: pybase64<2.0.0,>=1.4.2; extra == 'crewai'
34
+ Provides-Extra: drmcp
35
+ Requires-Dist: aiohttp-retry<3.0.0,>=2.8.3; extra == 'drmcp'
36
+ Requires-Dist: aiohttp<4.0.0,>=3.9.0; extra == 'drmcp'
37
+ Requires-Dist: aiosignal<2.0.0,>=1.3.1; extra == 'drmcp'
38
+ Requires-Dist: boto3<2.0.0,>=1.34.0; extra == 'drmcp'
39
+ Requires-Dist: datarobot-asgi-middleware<1.0.0,>=0.2.0; extra == 'drmcp'
40
+ Requires-Dist: fastmcp<3.0.0,>=2.13.0.2; extra == 'drmcp'
41
+ Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'drmcp'
42
+ Requires-Dist: opentelemetry-api<2.0.0,>=1.22.0; extra == 'drmcp'
43
+ Requires-Dist: opentelemetry-exporter-otlp-proto-http<2.0.0,>=1.22.0; extra == 'drmcp'
44
+ Requires-Dist: opentelemetry-exporter-otlp<2.0.0,>=1.22.0; extra == 'drmcp'
45
+ Requires-Dist: opentelemetry-sdk<2.0.0,>=1.22.0; extra == 'drmcp'
46
+ Requires-Dist: pydantic-settings<3.0.0,>=2.1.0; extra == 'drmcp'
47
+ Requires-Dist: pydantic<3.0.0,>=2.6.1; extra == 'drmcp'
48
+ Requires-Dist: python-dotenv<2.0.0,>=1.1.0; extra == 'drmcp'
49
+ Provides-Extra: langgraph
50
+ Requires-Dist: langchain-mcp-adapters<0.2.0,>=0.1.12; extra == 'langgraph'
51
+ Requires-Dist: langgraph-prebuilt<0.7.0,>=0.2.3; extra == 'langgraph'
52
+ Requires-Dist: langgraph<0.7.0,>=0.4.10; extra == 'langgraph'
53
+ Requires-Dist: opentelemetry-instrumentation-langchain<1.0.0,>=0.40.5; extra == 'langgraph'
54
+ Provides-Extra: llamaindex
55
+ Requires-Dist: llama-index-core<0.14.0,>=0.13.6; extra == 'llamaindex'
56
+ Requires-Dist: llama-index-llms-langchain<0.8.0,>=0.6.1; extra == 'llamaindex'
57
+ Requires-Dist: llama-index-llms-litellm<0.7.0,>=0.4.1; extra == 'llamaindex'
58
+ Requires-Dist: llama-index-llms-openai<0.6.0,>=0.3.38; extra == 'llamaindex'
59
+ Requires-Dist: llama-index-tools-mcp<0.5.0,>=0.1.0; extra == 'llamaindex'
60
+ Requires-Dist: llama-index<0.14.0,>=0.13.6; extra == 'llamaindex'
61
+ Requires-Dist: opentelemetry-instrumentation-llamaindex<1.0.0,>=0.40.5; extra == 'llamaindex'
62
+ Requires-Dist: pypdf<7.0.0,>=6.0.0; extra == 'llamaindex'
63
+ Provides-Extra: nat
64
+ Requires-Dist: anyio==4.11.0; extra == 'nat'
65
+ Requires-Dist: crewai>=1.1.0; (python_version >= '3.11') and extra == 'nat'
66
+ Requires-Dist: llama-index-llms-litellm<0.7.0,>=0.4.1; extra == 'nat'
67
+ Requires-Dist: nvidia-nat-langchain==1.3.0; (python_version >= '3.11') and extra == 'nat'
68
+ Requires-Dist: nvidia-nat-mcp==1.3.0; (python_version >= '3.11') and extra == 'nat'
69
+ Requires-Dist: nvidia-nat-opentelemetry==1.3.0; (python_version >= '3.11') and extra == 'nat'
70
+ Requires-Dist: nvidia-nat==1.3.0; (python_version >= '3.11') and extra == 'nat'
71
+ Requires-Dist: opentelemetry-instrumentation-crewai<1.0.0,>=0.40.5; extra == 'nat'
72
+ Requires-Dist: opentelemetry-instrumentation-langchain<1.0.0,>=0.40.5; extra == 'nat'
73
+ Requires-Dist: opentelemetry-instrumentation-llamaindex<1.0.0,>=0.40.5; extra == 'nat'
74
+ Provides-Extra: pydanticai
75
+ Requires-Dist: logfire<5.0.0,>=4.6.0; extra == 'pydanticai'
76
+ Requires-Dist: pydantic-ai<1.9.0,>=1.0.5; extra == 'pydanticai'
77
+ Description-Content-Type: text/markdown
78
+
79
+ <p align="center">
80
+ <a href="https://github.com/datarobot-oss/datarobot-genai">
81
+ <img src="docs/img/datarobot_logo.avif" width="600px" alt="DataRobot Logo"/>
82
+ </a>
83
+ </p>
84
+ <h3 align="center">DataRobot GenAI Library</h3>
85
+
86
+ <p align="center">
87
+ <a href="https://www.datarobot.com/">Homepage</a>
88
+ ·
89
+ <a href="https://pypi.org/project/datarobot-genai/">PyPI</a>
90
+ ·
91
+ <a href="https://docs.datarobot.com/en/docs/get-started/troubleshooting/general-help.html">Support</a>
92
+ </p>
93
+
94
+ <p align="center">
95
+ <a href="/LICENSE">
96
+ <img src="https://img.shields.io/github/license/datarobot-oss/datarobot-genai" alt="License">
97
+ </a>
98
+ <a href="https://pypi.org/project/datarobot-genai/">
99
+ <img src="https://img.shields.io/pypi/v/datarobot-genai" alt="PyPI version">
100
+ </a>
101
+ </p>
102
+
103
+
104
+ ## Features
105
+ - Utilities for common GenAI workflows
106
+ - Integrations: CrewAI, LangGraph, LlamaIndex, NAT, MCP
107
+
108
+ ## Installation
109
+ - Requires Python 3.10–3.12.
110
+ - Install:
111
+ ```bash
112
+ pip install --upgrade pip
113
+ pip install "datarobot-genai"
114
+ ```
115
+ - Optional extras:
116
+ ```bash
117
+ pip install "datarobot-genai[crewai]"
118
+ pip install "datarobot-genai[langgraph]"
119
+ pip install "datarobot-genai[llamaindex]"
120
+ # Multiple extras
121
+ pip install "datarobot-genai[crewai,langgraph,llamaindex]"
122
+ ```
123
+ Available extras include: `crewai`, `langgraph`, `llamaindex`, `nat`, `drmcp`, `pydanticai`.
124
+
125
+ ## Development
126
+ Prerequisites: Python 3.10–3.12, uv, Task CLI, pre-commit.
127
+ ```bash
128
+ uv sync --all-extras --dev
129
+ pre-commit install
130
+ task test
131
+ ```
132
+
133
+ ## Publishing
134
+ - PRs (same-repo): dev builds are auto-published to TestPyPI (`.devN`).
135
+ - Merge to `main`: tags `v{version}` and publishes to PyPI automatically.
136
+ - Pushing a `v*` tag also triggers PyPI publish.
137
+ - Optional: `task release:tag-and-push` creates and pushes `v{version}` locally.
138
+
139
+ ## Links
140
+ - Home: https://github.com/datarobot-oss/datarobot-genai
141
+ - PyPI: https://pypi.org/project/datarobot-genai/
142
+ - TestPyPI: https://test.pypi.org/project/datarobot-genai/
143
+
144
+ ## License
145
+ Apache-2.0
@@ -0,0 +1,125 @@
1
+ datarobot_genai/__init__.py,sha256=QwWCADIZigzGvew8tGT9rAjgQjchSMjaZtFPbi3Bt2s,527
2
+ datarobot_genai/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ datarobot_genai/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ datarobot_genai/core/custom_model.py,sha256=9rSJhKZ1Fo8BpVVLnRMUj3QV2AYUr5ADHEs0aW6s2tY,5813
5
+ datarobot_genai/core/telemetry_agent.py,sha256=CxvoyResG3jXQ7ucU26NXCzWjWQyua-5qSYvVxpZJQg,5343
6
+ datarobot_genai/core/agents/__init__.py,sha256=mTG_QVV5aoOWOgVA3KEq7KQLJllyxtG2ZQoq9wiUNYo,1542
7
+ datarobot_genai/core/agents/base.py,sha256=63JRi0r7L94p6QHpor4JBFu_g5nxaQkqb_I4dsfrDc0,6722
8
+ datarobot_genai/core/chat/__init__.py,sha256=kAxp4Dc-6HIM_cdBl-3IxwzJQr13UYYQ2Zc-hMwz2F8,638
9
+ datarobot_genai/core/chat/auth.py,sha256=6qITKTHFtESsBc2NsA6cvJf78pPUrcA5XV3Vxlhb5us,5457
10
+ datarobot_genai/core/chat/client.py,sha256=fk8MebXa8_R33VK0_DrXCS0Fgw3wFvPEvsuubC27c3s,6639
11
+ datarobot_genai/core/chat/responses.py,sha256=vGxTA433f2AxGVlijV6O4EghyNPJCDmEqpAK2oWnsIs,10583
12
+ datarobot_genai/core/cli/__init__.py,sha256=B93Yb6VavoZpatrh8ltCL6YglIfR5FHgytXbO9UuxBw,733
13
+ datarobot_genai/core/cli/agent_environment.py,sha256=BJzQoiDvZF5gW4mFE71U0yeg-l72C--kxiE-fv6W194,1662
14
+ datarobot_genai/core/cli/agent_kernel.py,sha256=3XX58DQ6XPpWB_tn5m3iGb3XTfhZf5X3W9tc6ADieU4,7790
15
+ datarobot_genai/core/mcp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
+ datarobot_genai/core/mcp/common.py,sha256=Y8SjuquUODKEfI7T9X-QuTMKdIlpCWFI1b3xs6tmHFA,7812
17
+ datarobot_genai/core/utils/__init__.py,sha256=VxtRUz6iwb04eFQQy0zqTNXLAkYpPXcJxVoKV0nOdXk,59
18
+ datarobot_genai/core/utils/auth.py,sha256=LpSoHdPD2siskYwG8q4f9cike4VQdgFWJpuJrpiszXU,8674
19
+ datarobot_genai/core/utils/urls.py,sha256=tk0t13duDEPcmwz2OnS4vwEdatruiuX8lnxMMhSaJik,2289
20
+ datarobot_genai/crewai/__init__.py,sha256=MtFnHA3EtmgiK_GjwUGPgQQ6G1MCEzz1SDBwQi9lE8M,706
21
+ datarobot_genai/crewai/agent.py,sha256=vp8_2LExpeLls7Fpzo0R6ud5I6Ryfu3n3oVTN4Yyi6A,1417
22
+ datarobot_genai/crewai/base.py,sha256=JLljEN7sj8zaH8OamYoevFBZzza5BjZ4f0CGHRp2jUU,6447
23
+ datarobot_genai/crewai/events.py,sha256=K67bO1zwPrxmppz2wh8dFGNbVebyWGXAMD7oodFE2sQ,5462
24
+ datarobot_genai/crewai/mcp.py,sha256=AJTrs-8KdiRSjRECfBT1lJOsszWMoFoN9NIa1p5_wsM,2115
25
+ datarobot_genai/drmcp/__init__.py,sha256=WyKW7p77kS63EsmuW8cnZpqgcxCzIv1TmRPo2qo-Z8A,2988
26
+ datarobot_genai/drmcp/server.py,sha256=KE4kjS5f9bfdYftG14HBHrfvxDfCD4pwCXePfvl1OvU,724
27
+ datarobot_genai/drmcp/core/__init__.py,sha256=y4yapzp3KnFMzSR6HlNDS4uSuyNT7I1iPBvaCLsS0sU,577
28
+ datarobot_genai/drmcp/core/auth.py,sha256=E-5wrGbBFEBlD5377g6Exddrc7HsazamwX8tWr2RLXY,5815
29
+ datarobot_genai/drmcp/core/clients.py,sha256=y-yG8617LbmiZ_L7FWfMrk4WjIekyr76u_Q80aLqGpI,5524
30
+ datarobot_genai/drmcp/core/config.py,sha256=SWLhVKoqI4vmA-04TFKpKm1_G2yEMEN1e_8cv8d_XRM,13774
31
+ datarobot_genai/drmcp/core/config_utils.py,sha256=U-aieWw7MyP03cGDFIp97JH99ZUfr3vD9uuTzBzxn7w,6428
32
+ datarobot_genai/drmcp/core/constants.py,sha256=lUwoW_PTrbaBGqRJifKqCn3EoFacoEgdO-CpoFVrUoU,739
33
+ datarobot_genai/drmcp/core/credentials.py,sha256=PYEUDNMVw1BoMzZKLkPVTypNkVevEPtmk3scKnE-zYg,6706
34
+ datarobot_genai/drmcp/core/dr_mcp_server.py,sha256=czcjbwhZAeW9EtG_Bys0GARPOuQulstkiU7FG48Q9bg,14118
35
+ datarobot_genai/drmcp/core/dr_mcp_server_logo.py,sha256=hib-nfR1SNTW6CnpFsFCkL9H_OMwa4YYyinV7VNOuLk,4708
36
+ datarobot_genai/drmcp/core/exceptions.py,sha256=eqsGI-lxybgvWL5w4BFhbm3XzH1eU5tetwjnhJxelpc,905
37
+ datarobot_genai/drmcp/core/logging.py,sha256=Y_hig4eBWiXGaVV7B_3wBcaYVRNH4ydptbEQhrP9-mY,3414
38
+ datarobot_genai/drmcp/core/mcp_instance.py,sha256=nt4gOlAQklMcqmohRIKovYcyhgLdb08NHMo28DBYmOk,18362
39
+ datarobot_genai/drmcp/core/routes.py,sha256=dqE2M0UzAyyN9vQjlyTjYW4rpju3LT039po5weuO__I,17936
40
+ datarobot_genai/drmcp/core/routes_utils.py,sha256=vSseXWlplMSnRgoJgtP_rHxWSAVYcx_tpTv4lyTpQoc,944
41
+ datarobot_genai/drmcp/core/server_life_cycle.py,sha256=WKGJWGxalvqxupzJ2y67Kklc_9PgpZT0uyjlv_sr5wc,3419
42
+ datarobot_genai/drmcp/core/telemetry.py,sha256=NEkSTC1w6uQgtukLHI-sWvR4EMgInysgATcvfQ5CplM,15378
43
+ datarobot_genai/drmcp/core/tool_config.py,sha256=izUdM6dN3GRBzSBs-OagggM2dX5PGBnDbVv4N5bfWFI,3668
44
+ datarobot_genai/drmcp/core/tool_filter.py,sha256=yKQlEtzyIeXGxZJkHbK36QI19vmgQkvqmfx5cTo2pp4,3156
45
+ datarobot_genai/drmcp/core/utils.py,sha256=EvfpqKZ3tECMoxpIQ_tA_3rOgy6KJEYKC0lWZo_Daag,4517
46
+ datarobot_genai/drmcp/core/dynamic_prompts/__init__.py,sha256=y4yapzp3KnFMzSR6HlNDS4uSuyNT7I1iPBvaCLsS0sU,577
47
+ datarobot_genai/drmcp/core/dynamic_prompts/controllers.py,sha256=AGJlKqgHRO0Kd7Gl-Ulw9KYBgzjTTFXWBvOUF-SuKUI,5454
48
+ datarobot_genai/drmcp/core/dynamic_prompts/dr_lib.py,sha256=4j33AKmq7kQX_EE2_RWAbP8-K5KPVEvpUginTWn_MHs,2701
49
+ datarobot_genai/drmcp/core/dynamic_prompts/register.py,sha256=2c-vBaTfu3mq_8tSFfDAzG5hG06uS9CghIC1sJxHRNw,7173
50
+ datarobot_genai/drmcp/core/dynamic_prompts/utils.py,sha256=BZ3792AgfvYlwL0_J0MzQfGecyEA5_OKUMynEZYzCds,1136
51
+ datarobot_genai/drmcp/core/dynamic_tools/__init__.py,sha256=0kq9vMkF7EBsS6lkEdiLibmUrghTQqosHbZ5k-V9a5g,578
52
+ datarobot_genai/drmcp/core/dynamic_tools/register.py,sha256=3M5-F0mhUYTZJWmFDmqzsj3QAd7ut7b0kPv-JZyaTzg,9204
53
+ datarobot_genai/drmcp/core/dynamic_tools/schema.py,sha256=zw_fYleG2dZAYLVS3MWT2Dy_xXcL9JERG_mXgrusU1g,18457
54
+ datarobot_genai/drmcp/core/dynamic_tools/deployment/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
+ datarobot_genai/drmcp/core/dynamic_tools/deployment/config.py,sha256=eVDsO3b16dY_jeEtIpZNpB085bDV5nhMUxIpuLxG9iU,8075
56
+ datarobot_genai/drmcp/core/dynamic_tools/deployment/controllers.py,sha256=56M1z616kp32j40Ufy0SnHQmWg-UritCnExzYwNHA8s,2209
57
+ datarobot_genai/drmcp/core/dynamic_tools/deployment/metadata.py,sha256=PNNnMX9zSsMxtHokeX_eNutUXBjP5u9G4ezzPMBLrfI,5702
58
+ datarobot_genai/drmcp/core/dynamic_tools/deployment/register.py,sha256=e-or8WcGSe9EdiiPwr4fHlhwJfzV1GrWDWT7ES8jd7s,3300
59
+ datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/__init__.py,sha256=0kq9vMkF7EBsS6lkEdiLibmUrghTQqosHbZ5k-V9a5g,578
60
+ datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/base.py,sha256=wnua-dMcSRH3jTF8YsjwzA9UcsgNQHTH3r4y2xzVhkQ,2400
61
+ datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/default.py,sha256=PLNLpy8_njT-9aLWt4QM0GsDDm8WqCI-Tl1ymNzcdXo,3232
62
+ datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/drum.py,sha256=Ti7r8y-cszsyzagioWtfc-U3owdhRpQ6g5qrXrsJvQQ,8261
63
+ datarobot_genai/drmcp/core/dynamic_tools/deployment/schemas/drum_agentic_fallback_schema.json,sha256=dG-6XyDmIJWirja7UmMhZGsYu851rn7As_dT5utmstQ,1147
64
+ datarobot_genai/drmcp/core/dynamic_tools/deployment/schemas/drum_prediction_fallback_schema.json,sha256=D7SnrkpSlOtqhJ7OnbeelIV8DJ_EhCfX647VcTBEpuM,292
65
+ datarobot_genai/drmcp/core/memory_management/__init__.py,sha256=y4yapzp3KnFMzSR6HlNDS4uSuyNT7I1iPBvaCLsS0sU,577
66
+ datarobot_genai/drmcp/core/memory_management/manager.py,sha256=gmc_SQs12YQFMWl2UbfWR40QmLV9XuCnwPZgQwKWrbA,30552
67
+ datarobot_genai/drmcp/core/memory_management/memory_tools.py,sha256=AxzpwOlldmhhDfKZcAxaGs7Xih2SCe0XbQuXX5nQczI,6397
68
+ datarobot_genai/drmcp/test_utils/__init__.py,sha256=y4yapzp3KnFMzSR6HlNDS4uSuyNT7I1iPBvaCLsS0sU,577
69
+ datarobot_genai/drmcp/test_utils/elicitation_test_tool.py,sha256=UVKwy39nl3XcVAh6IATcN-cWL2bfrprgRQ7fbK82jTI,3287
70
+ datarobot_genai/drmcp/test_utils/integration_mcp_server.py,sha256=YSk19tbaka_0ziqi7LoXie4SJs-cvi9-H00Go0ZtQWE,3575
71
+ datarobot_genai/drmcp/test_utils/mcp_utils_ete.py,sha256=46rH0fYYmUj7ygf968iRbdSp5u95v23BEw3Ts_c431Y,4788
72
+ datarobot_genai/drmcp/test_utils/mcp_utils_integration.py,sha256=sHA_BWtpgIAFp9IXiNkUeBartBMjLAauqkV9bYtCr-g,3874
73
+ datarobot_genai/drmcp/test_utils/test_interactive.py,sha256=KAScFT65GUkOxuiiBcjli8HHvV1NusVN01nOib3xVCc,7939
74
+ datarobot_genai/drmcp/test_utils/tool_base_ete.py,sha256=2RvVmwHYczl7F6qZHkKYiI77IoL-PaMT3y59t0aQtTE,9328
75
+ datarobot_genai/drmcp/test_utils/utils.py,sha256=JF2W9J4Q8pCqro7dj_bHObHNP7dfybDXesTLFOUsIVM,3039
76
+ datarobot_genai/drmcp/test_utils/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
+ datarobot_genai/drmcp/test_utils/clients/anthropic.py,sha256=qFhLvLZHMpZa2tZwI8pZQaaeG1lsM56VaONt6a9VU8c,2333
78
+ datarobot_genai/drmcp/test_utils/clients/base.py,sha256=mPo8tmFlOgcHA3d3ynUsmH1XI49mj8jkUy3b0Y57slw,10606
79
+ datarobot_genai/drmcp/test_utils/clients/dr_gateway.py,sha256=qlx0WxEOtTkxt9PiCxgWAp02k5jyUgXcKb9AwCGw6cw,2150
80
+ datarobot_genai/drmcp/test_utils/clients/openai.py,sha256=tyIibvjtFp7u2BoHJqwIRlHn9UPtysKOgStoA9SZUYs,2566
81
+ datarobot_genai/drmcp/tools/__init__.py,sha256=0kq9vMkF7EBsS6lkEdiLibmUrghTQqosHbZ5k-V9a5g,578
82
+ datarobot_genai/drmcp/tools/clients/__init__.py,sha256=0kq9vMkF7EBsS6lkEdiLibmUrghTQqosHbZ5k-V9a5g,578
83
+ datarobot_genai/drmcp/tools/clients/atlassian.py,sha256=__M_uz7FrcbKCYRzeMn24DCEYD6OmFx_LuywHCxgXsA,6472
84
+ datarobot_genai/drmcp/tools/clients/confluence.py,sha256=h_G0By_kDnJeWDT_d-IREsaZ5-0xB5GoLXOqblYP5MA,20706
85
+ datarobot_genai/drmcp/tools/clients/gdrive.py,sha256=Sonc8g52z8gDeaIGxh2GkoWYbtveCBGfDU0z3m4iSRU,29292
86
+ datarobot_genai/drmcp/tools/clients/jira.py,sha256=Rm91JAyrNIqxu66-9rU1YqoRXVnWbEy-Ahvy6f6HlVg,9823
87
+ datarobot_genai/drmcp/tools/clients/microsoft_graph.py,sha256=PASGThDPE8zkBZqach8lurJL1y47DWUPLwvf9N6uLGM,19234
88
+ datarobot_genai/drmcp/tools/clients/s3.py,sha256=GmwzvurFdNfvxOooA8g5S4osRysHYU0S9ypg_177Glg,953
89
+ datarobot_genai/drmcp/tools/confluence/__init__.py,sha256=0kq9vMkF7EBsS6lkEdiLibmUrghTQqosHbZ5k-V9a5g,578
90
+ datarobot_genai/drmcp/tools/confluence/tools.py,sha256=_-ws65WLK8KZP_mKkf4yJ7ZunR8qdyoiMwHQX47MSMw,12362
91
+ datarobot_genai/drmcp/tools/gdrive/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
+ datarobot_genai/drmcp/tools/gdrive/tools.py,sha256=jSKz0TuqAdHFitUZ-BW8NDl31Aq4VGpWa0yWSksLi00,13887
93
+ datarobot_genai/drmcp/tools/jira/__init__.py,sha256=0kq9vMkF7EBsS6lkEdiLibmUrghTQqosHbZ5k-V9a5g,578
94
+ datarobot_genai/drmcp/tools/jira/tools.py,sha256=dfkqTU2HH-7n44hX80ODFacKq0p0LOchFcZtIIKFNMM,9687
95
+ datarobot_genai/drmcp/tools/microsoft_graph/__init__.py,sha256=CuOaMt1AJo7cHx_GuhO3s_aqxZas_wlDsoBorBsvbeU,577
96
+ datarobot_genai/drmcp/tools/microsoft_graph/tools.py,sha256=zJ-UA1TMhPOYcExvgWv0YBjDsSIDPA-U1SEbBrVfAc8,7744
97
+ datarobot_genai/drmcp/tools/predictive/__init__.py,sha256=WuOHlNNEpEmcF7gVnhckruJRKU2qtmJLE3E7zoCGLDo,1030
98
+ datarobot_genai/drmcp/tools/predictive/data.py,sha256=sSFAmO6x0DSuolw8urhMaOj5PwfUH29oc2mEOZI3YU4,4631
99
+ datarobot_genai/drmcp/tools/predictive/deployment.py,sha256=lm02Ayuo11L1hP41fgi3QpR1Eyty-Wc16rM0c8SgliM,3277
100
+ datarobot_genai/drmcp/tools/predictive/deployment_info.py,sha256=BGEF_dmbxOBJR0n1Tt9TO2-iNTQSBTr-oQUyaxLZ0ZI,15297
101
+ datarobot_genai/drmcp/tools/predictive/model.py,sha256=Yih5-KedJ-1yupPLXCJsCXOdyWWi9pRvgapXDlgXWJA,4891
102
+ datarobot_genai/drmcp/tools/predictive/predict.py,sha256=Qoob2_t2crfWtyPzkXMRz2ITZumnczU6Dq4C7q9RBMI,9370
103
+ datarobot_genai/drmcp/tools/predictive/predict_realtime.py,sha256=urq6rPyZFsAP-bPyclSNzrkvb6FTamdlFau8q0IWWJ0,13472
104
+ datarobot_genai/drmcp/tools/predictive/project.py,sha256=xC52UdYvuFeNZC7Y5MfXcvzTL70WwAacQXESr6rqN6s,3255
105
+ datarobot_genai/drmcp/tools/predictive/training.py,sha256=LzMxbBT8wxKYDrRlVElfmTUrzpmGvwrR-mTGf6YUnIA,23998
106
+ datarobot_genai/langgraph/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
+ datarobot_genai/langgraph/agent.py,sha256=DRnywmS9KDywyChtuIZZwNKbJs8BpC259EG_kxYbiQ8,15828
108
+ datarobot_genai/langgraph/mcp.py,sha256=iA2_j46mZAaNaL7ntXT-LW6C-NMJkzr3VfKDDfe7mh8,2851
109
+ datarobot_genai/llama_index/__init__.py,sha256=JEMkLQLuP8n14kNE3bZ2j08NdajnkJMfYjDQYqj7C0c,407
110
+ datarobot_genai/llama_index/agent.py,sha256=V6ZsD9GcBDJS-RJo1tJtIHhyW69_78gM6_fOHFV-Piw,1829
111
+ datarobot_genai/llama_index/base.py,sha256=ovcQQtC-djD_hcLrWdn93jg23AmD6NBEj7xtw4a6K6c,14481
112
+ datarobot_genai/llama_index/mcp.py,sha256=leXqF1C4zhuYEKFwNEfZHY4dsUuGZk3W7KArY-zxVL8,2645
113
+ datarobot_genai/nat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
114
+ datarobot_genai/nat/agent.py,sha256=DuGrgqt1FzvAE-cRH_P3LTFUlwuClvbVurdwA-RsbuY,11177
115
+ datarobot_genai/nat/datarobot_auth_provider.py,sha256=Z4NSsrHxK8hUeiqtK_lryHsUuZC74ziNo_FHbsZgtiM,4230
116
+ datarobot_genai/nat/datarobot_llm_clients.py,sha256=-_q_KlKOVQecIYJd8YRiYnS4ZNazQAiAdZBE1Zip_wQ,12684
117
+ datarobot_genai/nat/datarobot_llm_providers.py,sha256=aDoQcTeGI-odqydPXEX9OGGNFbzAtpqzTvHHEkmJuEQ,4963
118
+ datarobot_genai/nat/datarobot_mcp_client.py,sha256=jL8sXb8g4gvt0VYgB2tfMGsMjpB1GV2XIbN0iv_LxVU,10701
119
+ datarobot_genai/nat/helpers.py,sha256=Q7E3ADZdtFfS8E6OQPyw2wgA6laQ58N3bhLj5CBWwJs,3265
120
+ datarobot_genai-0.2.31.dist-info/METADATA,sha256=h36ncbvYaZpFSme4CEIH1WouCke0-S-dODtLZRqnNB8,6301
121
+ datarobot_genai-0.2.31.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
122
+ datarobot_genai-0.2.31.dist-info/entry_points.txt,sha256=jEW3WxDZ8XIK9-ISmTyt5DbmBb047rFlzQuhY09rGrM,284
123
+ datarobot_genai-0.2.31.dist-info/licenses/AUTHORS,sha256=isJGUXdjq1U7XZ_B_9AH8Qf0u4eX0XyQifJZ_Sxm4sA,80
124
+ datarobot_genai-0.2.31.dist-info/licenses/LICENSE,sha256=U2_VkLIktQoa60Nf6Tbt7E4RMlfhFSjWjcJJfVC-YCE,11341
125
+ datarobot_genai-0.2.31.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.28.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,5 @@
1
+ [nat.plugins]
2
+ datarobot_auth_provider = datarobot_genai.nat.datarobot_auth_provider
3
+ datarobot_llm_clients = datarobot_genai.nat.datarobot_llm_clients
4
+ datarobot_llm_providers = datarobot_genai.nat.datarobot_llm_providers
5
+ datarobot_mcp_client = datarobot_genai.nat.datarobot_mcp_client
@@ -0,0 +1,2 @@
1
+ Cavit Cakir cavit.cakir@datarobot.com
2
+ James Clemens james.clemens@datarobot.com