datarobot-genai 0.2.0__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 (101) 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 +250 -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 +316 -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 +128 -0
  37. datarobot_genai/drmcp/core/dynamic_prompts/register.py +206 -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 +542 -0
  56. datarobot_genai/drmcp/core/mcp_server_tools.py +129 -0
  57. datarobot_genai/drmcp/core/memory_management/__init__.py +13 -0
  58. datarobot_genai/drmcp/core/memory_management/manager.py +820 -0
  59. datarobot_genai/drmcp/core/memory_management/memory_tools.py +201 -0
  60. datarobot_genai/drmcp/core/routes.py +436 -0
  61. datarobot_genai/drmcp/core/routes_utils.py +30 -0
  62. datarobot_genai/drmcp/core/server_life_cycle.py +107 -0
  63. datarobot_genai/drmcp/core/telemetry.py +424 -0
  64. datarobot_genai/drmcp/core/tool_filter.py +108 -0
  65. datarobot_genai/drmcp/core/utils.py +131 -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/integration_mcp_server.py +102 -0
  69. datarobot_genai/drmcp/test_utils/mcp_utils_ete.py +96 -0
  70. datarobot_genai/drmcp/test_utils/mcp_utils_integration.py +94 -0
  71. datarobot_genai/drmcp/test_utils/openai_llm_mcp_client.py +234 -0
  72. datarobot_genai/drmcp/test_utils/tool_base_ete.py +151 -0
  73. datarobot_genai/drmcp/test_utils/utils.py +91 -0
  74. datarobot_genai/drmcp/tools/__init__.py +14 -0
  75. datarobot_genai/drmcp/tools/predictive/__init__.py +27 -0
  76. datarobot_genai/drmcp/tools/predictive/data.py +97 -0
  77. datarobot_genai/drmcp/tools/predictive/deployment.py +91 -0
  78. datarobot_genai/drmcp/tools/predictive/deployment_info.py +392 -0
  79. datarobot_genai/drmcp/tools/predictive/model.py +148 -0
  80. datarobot_genai/drmcp/tools/predictive/predict.py +254 -0
  81. datarobot_genai/drmcp/tools/predictive/predict_realtime.py +307 -0
  82. datarobot_genai/drmcp/tools/predictive/project.py +72 -0
  83. datarobot_genai/drmcp/tools/predictive/training.py +651 -0
  84. datarobot_genai/langgraph/__init__.py +0 -0
  85. datarobot_genai/langgraph/agent.py +341 -0
  86. datarobot_genai/langgraph/mcp.py +73 -0
  87. datarobot_genai/llama_index/__init__.py +16 -0
  88. datarobot_genai/llama_index/agent.py +50 -0
  89. datarobot_genai/llama_index/base.py +299 -0
  90. datarobot_genai/llama_index/mcp.py +79 -0
  91. datarobot_genai/nat/__init__.py +0 -0
  92. datarobot_genai/nat/agent.py +258 -0
  93. datarobot_genai/nat/datarobot_llm_clients.py +249 -0
  94. datarobot_genai/nat/datarobot_llm_providers.py +130 -0
  95. datarobot_genai/py.typed +0 -0
  96. datarobot_genai-0.2.0.dist-info/METADATA +139 -0
  97. datarobot_genai-0.2.0.dist-info/RECORD +101 -0
  98. datarobot_genai-0.2.0.dist-info/WHEEL +4 -0
  99. datarobot_genai-0.2.0.dist-info/entry_points.txt +3 -0
  100. datarobot_genai-0.2.0.dist-info/licenses/AUTHORS +2 -0
  101. datarobot_genai-0.2.0.dist-info/licenses/LICENSE +201 -0
@@ -0,0 +1,249 @@
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 typing import Any
17
+
18
+ from crewai import LLM
19
+ from langchain_openai import ChatOpenAI
20
+ from llama_index.core.base.llms.types import LLMMetadata
21
+ from llama_index.llms.litellm import LiteLLM
22
+ from nat.builder.builder import Builder
23
+ from nat.builder.framework_enum import LLMFrameworkEnum
24
+ from nat.cli.register_workflow import register_llm_client
25
+
26
+ from ..nat.datarobot_llm_providers import DataRobotLLMComponentModelConfig
27
+ from ..nat.datarobot_llm_providers import DataRobotLLMDeploymentModelConfig
28
+ from ..nat.datarobot_llm_providers import DataRobotLLMGatewayModelConfig
29
+ from ..nat.datarobot_llm_providers import DataRobotNIMModelConfig
30
+
31
+
32
+ class DataRobotChatOpenAI(ChatOpenAI):
33
+ def _get_request_payload(
34
+ self,
35
+ *args: Any,
36
+ **kwargs: Any,
37
+ ) -> dict:
38
+ # We need to default to include_usage=True for streaming but we get 400 response
39
+ # if stream_options is present for a non-streaming call.
40
+ payload = super()._get_request_payload(*args, **kwargs)
41
+ if not payload.get("stream"):
42
+ payload.pop("stream_options", None)
43
+ return payload
44
+
45
+
46
+ class DataRobotLiteLLM(LiteLLM): # type: ignore[misc]
47
+ """DataRobotLiteLLM is a small LiteLLM wrapper class that makes all LiteLLM endpoints
48
+ compatible with the LlamaIndex library.
49
+ """
50
+
51
+ @property
52
+ def metadata(self) -> LLMMetadata:
53
+ """Returns the metadata for the LLM.
54
+
55
+ This is required to enable the is_chat_model and is_function_calling_model, which are
56
+ mandatory for LlamaIndex agents. By default, LlamaIndex assumes these are false unless each
57
+ individual model config in LiteLLM explicitly sets them to true. To use custom LLM
58
+ endpoints with LlamaIndex agents, you must override this method to return the appropriate
59
+ metadata.
60
+ """
61
+ return LLMMetadata(
62
+ context_window=128000,
63
+ num_output=self.max_tokens or -1,
64
+ is_chat_model=True,
65
+ is_function_calling_model=True,
66
+ model_name=self.model,
67
+ )
68
+
69
+
70
+ @register_llm_client(
71
+ config_type=DataRobotLLMGatewayModelConfig, wrapper_type=LLMFrameworkEnum.LANGCHAIN
72
+ )
73
+ async def datarobot_llm_gateway_langchain(
74
+ llm_config: DataRobotLLMGatewayModelConfig, builder: Builder
75
+ ) -> AsyncGenerator[ChatOpenAI]:
76
+ config = llm_config.model_dump(exclude={"type", "thinking"}, by_alias=True, exclude_none=True)
77
+ config["base_url"] = config["base_url"] + "/genai/llmgw"
78
+ config["stream_options"] = {"include_usage": True}
79
+ config["model"] = config["model"].removeprefix("datarobot/")
80
+ yield DataRobotChatOpenAI(**config)
81
+
82
+
83
+ @register_llm_client(
84
+ config_type=DataRobotLLMGatewayModelConfig, wrapper_type=LLMFrameworkEnum.CREWAI
85
+ )
86
+ async def datarobot_llm_gateway_crewai(
87
+ llm_config: DataRobotLLMGatewayModelConfig, builder: Builder
88
+ ) -> AsyncGenerator[LLM]:
89
+ config = llm_config.model_dump(exclude={"type", "thinking"}, by_alias=True, exclude_none=True)
90
+ if not config["model"].startswith("datarobot/"):
91
+ config["model"] = "datarobot/" + config["model"]
92
+ config["base_url"] = config["base_url"].removesuffix("/api/v2")
93
+ yield LLM(**config)
94
+
95
+
96
+ @register_llm_client(
97
+ config_type=DataRobotLLMGatewayModelConfig, wrapper_type=LLMFrameworkEnum.LLAMA_INDEX
98
+ )
99
+ async def datarobot_llm_gateway_llamaindex(
100
+ llm_config: DataRobotLLMGatewayModelConfig, builder: Builder
101
+ ) -> AsyncGenerator[LLM]:
102
+ config = llm_config.model_dump(exclude={"type", "thinking"}, by_alias=True, exclude_none=True)
103
+ if not config["model"].startswith("datarobot/"):
104
+ config["model"] = "datarobot/" + config["model"]
105
+ config["api_base"] = config.pop("base_url").removesuffix("/api/v2")
106
+ yield DataRobotLiteLLM(**config)
107
+
108
+
109
+ @register_llm_client(
110
+ config_type=DataRobotLLMDeploymentModelConfig, wrapper_type=LLMFrameworkEnum.LANGCHAIN
111
+ )
112
+ async def datarobot_llm_deployment_langchain(
113
+ llm_config: DataRobotLLMDeploymentModelConfig, builder: Builder
114
+ ) -> AsyncGenerator[ChatOpenAI]:
115
+ config = llm_config.model_dump(
116
+ exclude={"type", "thinking"},
117
+ by_alias=True,
118
+ exclude_none=True,
119
+ )
120
+ config["stream_options"] = {"include_usage": True}
121
+ config["model"] = config["model"].removeprefix("datarobot/")
122
+ yield DataRobotChatOpenAI(**config)
123
+
124
+
125
+ @register_llm_client(
126
+ config_type=DataRobotLLMDeploymentModelConfig, wrapper_type=LLMFrameworkEnum.CREWAI
127
+ )
128
+ async def datarobot_llm_deployment_crewai(
129
+ llm_config: DataRobotLLMDeploymentModelConfig, builder: Builder
130
+ ) -> AsyncGenerator[LLM]:
131
+ config = llm_config.model_dump(
132
+ exclude={"type", "thinking"},
133
+ by_alias=True,
134
+ exclude_none=True,
135
+ )
136
+ if not config["model"].startswith("datarobot/"):
137
+ config["model"] = "datarobot/" + config["model"]
138
+ config["api_base"] = config.pop("base_url") + "/chat/completions"
139
+ yield LLM(**config)
140
+
141
+
142
+ @register_llm_client(
143
+ config_type=DataRobotLLMDeploymentModelConfig, wrapper_type=LLMFrameworkEnum.LLAMA_INDEX
144
+ )
145
+ async def datarobot_llm_deployment_llamaindex(
146
+ llm_config: DataRobotLLMDeploymentModelConfig, builder: Builder
147
+ ) -> AsyncGenerator[LLM]:
148
+ config = llm_config.model_dump(
149
+ exclude={"type", "thinking"},
150
+ by_alias=True,
151
+ exclude_none=True,
152
+ )
153
+ if not config["model"].startswith("datarobot/"):
154
+ config["model"] = "datarobot/" + config["model"]
155
+ config["api_base"] = config.pop("base_url") + "/chat/completions"
156
+ yield DataRobotLiteLLM(**config)
157
+
158
+
159
+ @register_llm_client(config_type=DataRobotNIMModelConfig, wrapper_type=LLMFrameworkEnum.LANGCHAIN)
160
+ async def datarobot_nim_langchain(
161
+ llm_config: DataRobotNIMModelConfig, builder: Builder
162
+ ) -> AsyncGenerator[ChatOpenAI]:
163
+ config = llm_config.model_dump(
164
+ exclude={"type", "thinking"},
165
+ by_alias=True,
166
+ exclude_none=True,
167
+ )
168
+ config["stream_options"] = {"include_usage": True}
169
+ config["model"] = config["model"].removeprefix("datarobot/")
170
+ yield DataRobotChatOpenAI(**config)
171
+
172
+
173
+ @register_llm_client(config_type=DataRobotNIMModelConfig, wrapper_type=LLMFrameworkEnum.CREWAI)
174
+ async def datarobot_nim_crewai(
175
+ llm_config: DataRobotNIMModelConfig, builder: Builder
176
+ ) -> AsyncGenerator[LLM]:
177
+ config = llm_config.model_dump(
178
+ exclude={"type", "thinking", "max_retries"},
179
+ by_alias=True,
180
+ exclude_none=True,
181
+ )
182
+ if not config["model"].startswith("datarobot/"):
183
+ config["model"] = "datarobot/" + config["model"]
184
+ config["api_base"] = config.pop("base_url") + "/chat/completions"
185
+ yield LLM(**config)
186
+
187
+
188
+ @register_llm_client(config_type=DataRobotNIMModelConfig, wrapper_type=LLMFrameworkEnum.LLAMA_INDEX)
189
+ async def datarobot_nim_llamaindex(
190
+ llm_config: DataRobotNIMModelConfig, builder: Builder
191
+ ) -> AsyncGenerator[LLM]:
192
+ config = llm_config.model_dump(
193
+ exclude={"type", "thinking"},
194
+ by_alias=True,
195
+ exclude_none=True,
196
+ )
197
+ if not config["model"].startswith("datarobot/"):
198
+ config["model"] = "datarobot/" + config["model"]
199
+ config["api_base"] = config.pop("base_url") + "/chat/completions"
200
+ yield DataRobotLiteLLM(**config)
201
+
202
+
203
+ @register_llm_client(
204
+ config_type=DataRobotLLMComponentModelConfig, wrapper_type=LLMFrameworkEnum.LANGCHAIN
205
+ )
206
+ async def datarobot_llm_component_langchain(
207
+ llm_config: DataRobotLLMComponentModelConfig, builder: Builder
208
+ ) -> AsyncGenerator[ChatOpenAI]:
209
+ config = llm_config.model_dump(exclude={"type", "thinking"}, by_alias=True, exclude_none=True)
210
+ if config["use_datarobot_llm_gateway"]:
211
+ config["base_url"] = config["base_url"] + "/genai/llmgw"
212
+ config["stream_options"] = {"include_usage": True}
213
+ config["model"] = config["model"].removeprefix("datarobot/")
214
+ config.pop("use_datarobot_llm_gateway")
215
+ yield DataRobotChatOpenAI(**config)
216
+
217
+
218
+ @register_llm_client(
219
+ config_type=DataRobotLLMComponentModelConfig, wrapper_type=LLMFrameworkEnum.CREWAI
220
+ )
221
+ async def datarobot_llm_component_crewai(
222
+ llm_config: DataRobotLLMComponentModelConfig, builder: Builder
223
+ ) -> AsyncGenerator[LLM]:
224
+ config = llm_config.model_dump(exclude={"type", "thinking"}, by_alias=True, exclude_none=True)
225
+ if not config["model"].startswith("datarobot/"):
226
+ config["model"] = "datarobot/" + config["model"]
227
+ if config["use_datarobot_llm_gateway"]:
228
+ config["base_url"] = config["base_url"].removesuffix("/api/v2")
229
+ else:
230
+ config["api_base"] = config.pop("base_url") + "/chat/completions"
231
+ config.pop("use_datarobot_llm_gateway")
232
+ yield LLM(**config)
233
+
234
+
235
+ @register_llm_client(
236
+ config_type=DataRobotLLMComponentModelConfig, wrapper_type=LLMFrameworkEnum.LLAMA_INDEX
237
+ )
238
+ async def datarobot_llm_component_llamaindex(
239
+ llm_config: DataRobotLLMComponentModelConfig, builder: Builder
240
+ ) -> AsyncGenerator[LLM]:
241
+ config = llm_config.model_dump(exclude={"type", "thinking"}, by_alias=True, exclude_none=True)
242
+ if not config["model"].startswith("datarobot/"):
243
+ config["model"] = "datarobot/" + config["model"]
244
+ if config["use_datarobot_llm_gateway"]:
245
+ config["api_base"] = config.pop("base_url").removesuffix("/api/v2")
246
+ else:
247
+ config["api_base"] = config.pop("base_url") + "/chat/completions"
248
+ config.pop("use_datarobot_llm_gateway")
249
+ yield DataRobotLiteLLM(**config)
@@ -0,0 +1,130 @@
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 datarobot.core.config import DataRobotAppFrameworkBaseSettings
16
+ from nat.builder.builder import Builder
17
+ from nat.builder.llm import LLMProviderInfo
18
+ from nat.cli.register_workflow import register_llm_provider
19
+ from nat.llm.openai_llm import OpenAIModelConfig
20
+ from pydantic import AliasChoices
21
+ from pydantic import Field
22
+
23
+
24
+ class Config(DataRobotAppFrameworkBaseSettings):
25
+ """
26
+ Finds variables in the priority order of: env
27
+ variables (including Runtime Parameters), .env, file_secrets, then
28
+ Pulumi output variables.
29
+ """
30
+
31
+ datarobot_endpoint: str = "https://app.datarobot.com/api/v2"
32
+ datarobot_api_token: str | None = None
33
+ llm_deployment_id: str | None = None
34
+ nim_deployment_id: str | None = None
35
+ use_datarobot_llm_gateway: bool = False
36
+ llm_default_model: str | None = None
37
+
38
+
39
+ config = Config()
40
+
41
+
42
+ class DataRobotLLMComponentModelConfig(OpenAIModelConfig, name="datarobot-llm-component"): # type: ignore[call-arg]
43
+ """A DataRobot LLM provider to be used with an LLM client."""
44
+
45
+ api_key: str | None = Field(
46
+ default=config.datarobot_api_token, description="DataRobot API key."
47
+ )
48
+ base_url: str | None = Field(
49
+ default=config.datarobot_endpoint.rstrip("/")
50
+ if config.use_datarobot_llm_gateway
51
+ else config.datarobot_endpoint + f"/deployments/{config.llm_deployment_id}",
52
+ description="DataRobot LLM URL.",
53
+ )
54
+ model_name: str = Field(
55
+ validation_alias=AliasChoices("model_name", "model"),
56
+ serialization_alias="model",
57
+ description="The model name.",
58
+ default=config.llm_default_model or "datarobot-deployed-llm",
59
+ )
60
+ use_datarobot_llm_gateway: bool = config.use_datarobot_llm_gateway
61
+
62
+
63
+ @register_llm_provider(config_type=DataRobotLLMComponentModelConfig)
64
+ async def datarobot_llm_component(
65
+ config: DataRobotLLMComponentModelConfig, _builder: Builder
66
+ ) -> LLMProviderInfo:
67
+ yield LLMProviderInfo(
68
+ config=config, description="DataRobot LLM Component for use with an LLM client."
69
+ )
70
+
71
+
72
+ class DataRobotLLMGatewayModelConfig(OpenAIModelConfig, name="datarobot-llm-gateway"): # type: ignore[call-arg]
73
+ """A DataRobot LLM provider to be used with an LLM client."""
74
+
75
+ api_key: str | None = Field(
76
+ default=config.datarobot_api_token, description="DataRobot API key."
77
+ )
78
+ base_url: str | None = Field(
79
+ default=config.datarobot_endpoint.rstrip("/"), description="DataRobot LLM gateway URL."
80
+ )
81
+
82
+
83
+ @register_llm_provider(config_type=DataRobotLLMGatewayModelConfig)
84
+ async def datarobot_llm_gateway(
85
+ config: DataRobotLLMGatewayModelConfig, _builder: Builder
86
+ ) -> LLMProviderInfo:
87
+ yield LLMProviderInfo(
88
+ config=config, description="DataRobot LLM Gateway for use with an LLM client."
89
+ )
90
+
91
+
92
+ class DataRobotLLMDeploymentModelConfig(OpenAIModelConfig, name="datarobot-llm-deployment"): # type: ignore[call-arg]
93
+ """A DataRobot LLM provider to be used with an LLM client."""
94
+
95
+ api_key: str | None = Field(
96
+ default=config.datarobot_api_token, description="DataRobot API key."
97
+ )
98
+ base_url: str | None = Field(
99
+ default=config.datarobot_endpoint + f"/deployments/{config.llm_deployment_id}"
100
+ )
101
+ model_name: str = Field(
102
+ validation_alias=AliasChoices("model_name", "model"),
103
+ serialization_alias="model",
104
+ description="The model name to pass through to the deployment.",
105
+ default="datarobot-deployed-llm",
106
+ )
107
+
108
+
109
+ @register_llm_provider(config_type=DataRobotLLMDeploymentModelConfig)
110
+ async def datarobot_llm_deployment(
111
+ config: DataRobotLLMDeploymentModelConfig, _builder: Builder
112
+ ) -> LLMProviderInfo:
113
+ yield LLMProviderInfo(
114
+ config=config, description="DataRobot LLM deployment for use with an LLM client."
115
+ )
116
+
117
+
118
+ class DataRobotNIMModelConfig(DataRobotLLMDeploymentModelConfig, name="datarobot-nim"): # type: ignore[call-arg]
119
+ """A DataRobot NIM LLM provider to be used with an LLM client."""
120
+
121
+ base_url: str | None = Field(
122
+ default=config.datarobot_endpoint + f"/deployments/{config.nim_deployment_id}"
123
+ )
124
+
125
+
126
+ @register_llm_provider(config_type=DataRobotNIMModelConfig)
127
+ async def datarobot_nim(config: DataRobotNIMModelConfig, _builder: Builder) -> LLMProviderInfo:
128
+ yield LLMProviderInfo(
129
+ config=config, description="DataRobot NIM deployment for use with an LLM client."
130
+ )
File without changes
@@ -0,0 +1,139 @@
1
+ Metadata-Version: 2.4
2
+ Name: datarobot-genai
3
+ Version: 0.2.0
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.9.1
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: pandas<3.0.0,>=2.2.3
21
+ Requires-Dist: pyjwt<3.0.0,>=2.10.1
22
+ Requires-Dist: pypdf<7.0.0,>=6.1.3
23
+ Requires-Dist: ragas<0.4.0,>=0.3.8
24
+ Requires-Dist: requests<3.0.0,>=2.32.4
25
+ Provides-Extra: crewai
26
+ Requires-Dist: crewai-tools[mcp]<0.77.0,>=0.69.0; extra == 'crewai'
27
+ Requires-Dist: crewai>=1.1.0; extra == 'crewai'
28
+ Requires-Dist: opentelemetry-instrumentation-crewai<1.0.0,>=0.40.5; extra == 'crewai'
29
+ Requires-Dist: pybase64<2.0.0,>=1.4.2; extra == 'crewai'
30
+ Provides-Extra: drmcp
31
+ Requires-Dist: aiohttp-retry<3.0.0,>=2.8.3; extra == 'drmcp'
32
+ Requires-Dist: aiohttp<4.0.0,>=3.9.0; extra == 'drmcp'
33
+ Requires-Dist: aiosignal<2.0.0,>=1.3.1; extra == 'drmcp'
34
+ Requires-Dist: boto3<2.0.0,>=1.34.0; extra == 'drmcp'
35
+ Requires-Dist: datarobot-asgi-middleware<1.0.0,>=0.2.0; extra == 'drmcp'
36
+ Requires-Dist: fastmcp<3.0.0,>=2.13.0.2; extra == 'drmcp'
37
+ Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'drmcp'
38
+ Requires-Dist: opentelemetry-api<2.0.0,>=1.22.0; extra == 'drmcp'
39
+ Requires-Dist: opentelemetry-exporter-otlp-proto-http<2.0.0,>=1.22.0; extra == 'drmcp'
40
+ Requires-Dist: opentelemetry-exporter-otlp<2.0.0,>=1.22.0; extra == 'drmcp'
41
+ Requires-Dist: opentelemetry-sdk<2.0.0,>=1.22.0; extra == 'drmcp'
42
+ Requires-Dist: pydantic-settings<3.0.0,>=2.1.0; extra == 'drmcp'
43
+ Requires-Dist: pydantic<3.0.0,>=2.6.1; extra == 'drmcp'
44
+ Requires-Dist: python-dotenv<2.0.0,>=1.1.0; extra == 'drmcp'
45
+ Provides-Extra: langgraph
46
+ Requires-Dist: langchain-mcp-adapters<0.2.0,>=0.1.12; extra == 'langgraph'
47
+ Requires-Dist: langgraph-prebuilt<0.7.0,>=0.2.3; extra == 'langgraph'
48
+ Requires-Dist: langgraph<0.7.0,>=0.4.10; extra == 'langgraph'
49
+ Requires-Dist: opentelemetry-instrumentation-langchain<1.0.0,>=0.40.5; extra == 'langgraph'
50
+ Provides-Extra: llamaindex
51
+ Requires-Dist: llama-index-core<0.14.0,>=0.13.6; extra == 'llamaindex'
52
+ Requires-Dist: llama-index-llms-langchain<0.8.0,>=0.6.1; extra == 'llamaindex'
53
+ Requires-Dist: llama-index-llms-litellm<0.7.0,>=0.4.1; extra == 'llamaindex'
54
+ Requires-Dist: llama-index-llms-openai<0.6.0,>=0.3.38; extra == 'llamaindex'
55
+ Requires-Dist: llama-index-tools-mcp<0.5.0,>=0.1.0; extra == 'llamaindex'
56
+ Requires-Dist: llama-index<0.14.0,>=0.13.6; extra == 'llamaindex'
57
+ Requires-Dist: opentelemetry-instrumentation-llamaindex<1.0.0,>=0.40.5; extra == 'llamaindex'
58
+ Requires-Dist: pypdf<7.0.0,>=6.0.0; extra == 'llamaindex'
59
+ Provides-Extra: nat
60
+ Requires-Dist: crewai>=1.1.0; (python_version >= '3.11') and extra == 'nat'
61
+ Requires-Dist: llama-index-llms-litellm<0.7.0,>=0.4.1; extra == 'nat'
62
+ Requires-Dist: nvidia-nat-langchain==1.3.0; (python_version >= '3.11') and extra == 'nat'
63
+ Requires-Dist: nvidia-nat-opentelemetry==1.3.0; (python_version >= '3.11') and extra == 'nat'
64
+ Requires-Dist: nvidia-nat==1.3.0; (python_version >= '3.11') and extra == 'nat'
65
+ Requires-Dist: opentelemetry-instrumentation-crewai<1.0.0,>=0.40.5; extra == 'nat'
66
+ Requires-Dist: opentelemetry-instrumentation-langchain<1.0.0,>=0.40.5; extra == 'nat'
67
+ Requires-Dist: opentelemetry-instrumentation-llamaindex<1.0.0,>=0.40.5; extra == 'nat'
68
+ Provides-Extra: pydanticai
69
+ Requires-Dist: logfire<5.0.0,>=4.6.0; extra == 'pydanticai'
70
+ Requires-Dist: pydantic-ai<1.9.0,>=1.0.5; extra == 'pydanticai'
71
+ Description-Content-Type: text/markdown
72
+
73
+ <p align="center">
74
+ <a href="https://github.com/datarobot-oss/datarobot-genai">
75
+ <img src="docs/img/datarobot_logo.avif" width="600px" alt="DataRobot Logo"/>
76
+ </a>
77
+ </p>
78
+ <h3 align="center">DataRobot GenAI Library</h3>
79
+
80
+ <p align="center">
81
+ <a href="https://www.datarobot.com/">Homepage</a>
82
+ ·
83
+ <a href="https://pypi.org/project/datarobot-genai/">PyPI</a>
84
+ ·
85
+ <a href="https://docs.datarobot.com/en/docs/get-started/troubleshooting/general-help.html">Support</a>
86
+ </p>
87
+
88
+ <p align="center">
89
+ <a href="/LICENSE">
90
+ <img src="https://img.shields.io/github/license/datarobot-oss/datarobot-genai" alt="License">
91
+ </a>
92
+ <a href="https://pypi.org/project/datarobot-genai/">
93
+ <img src="https://img.shields.io/pypi/v/datarobot-genai" alt="PyPI version">
94
+ </a>
95
+ </p>
96
+
97
+
98
+ ## Features
99
+ - Utilities for common GenAI workflows
100
+ - Integrations: CrewAI, LangGraph, LlamaIndex, NAT, MCP
101
+
102
+ ## Installation
103
+ - Requires Python 3.10–3.12.
104
+ - Install:
105
+ ```bash
106
+ pip install --upgrade pip
107
+ pip install "datarobot-genai"
108
+ ```
109
+ - Optional extras:
110
+ ```bash
111
+ pip install "datarobot-genai[crewai]"
112
+ pip install "datarobot-genai[langgraph]"
113
+ pip install "datarobot-genai[llamaindex]"
114
+ # Multiple extras
115
+ pip install "datarobot-genai[crewai,langgraph,llamaindex]"
116
+ ```
117
+ Available extras include: `crewai`, `langgraph`, `llamaindex`, `nat`, `drmcp`, `pydanticai`.
118
+
119
+ ## Development
120
+ Prerequisites: Python 3.10–3.12, uv, Task CLI, pre-commit.
121
+ ```bash
122
+ uv sync --all-extras --dev
123
+ pre-commit install
124
+ task test
125
+ ```
126
+
127
+ ## Publishing
128
+ - PRs (same-repo): dev builds are auto-published to TestPyPI (`.devN`).
129
+ - Merge to `main`: tags `v{version}` and publishes to PyPI automatically.
130
+ - Pushing a `v*` tag also triggers PyPI publish.
131
+ - Optional: `task release:tag-and-push` creates and pushes `v{version}` locally.
132
+
133
+ ## Links
134
+ - Home: https://github.com/datarobot-oss/datarobot-genai
135
+ - PyPI: https://pypi.org/project/datarobot-genai/
136
+ - TestPyPI: https://test.pypi.org/project/datarobot-genai/
137
+
138
+ ## License
139
+ Apache-2.0
@@ -0,0 +1,101 @@
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=JE83bfpGU7v77VzrDdlb0l8seM5OwUsUbaQErJ2eisc,2983
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=D7bSi40Yc5J71_JxmpfppG83snbIJW9iz1J7qbiJrRs,9855
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=7mu5UXHQmKNbIpNoQE0lPJaUI7AZa03avfHZRRtpjNI,12841
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=wMsP39xqTmNBYqd49olEQb5UHTSsxj6BOIoIElorRB0,19235
39
+ datarobot_genai/drmcp/core/mcp_server_tools.py,sha256=odNZKozfx0VV38SLZHw9lY0C0JM_JnRI06W3BBXnyE4,4278
40
+ datarobot_genai/drmcp/core/routes.py,sha256=nrgzYkiWWcwSy0BUJ-k5AuXdUHNrnGRudCo4AhtYvlY,17856
41
+ datarobot_genai/drmcp/core/routes_utils.py,sha256=vSseXWlplMSnRgoJgtP_rHxWSAVYcx_tpTv4lyTpQoc,944
42
+ datarobot_genai/drmcp/core/server_life_cycle.py,sha256=WKGJWGxalvqxupzJ2y67Kklc_9PgpZT0uyjlv_sr5wc,3419
43
+ datarobot_genai/drmcp/core/telemetry.py,sha256=NEkSTC1w6uQgtukLHI-sWvR4EMgInysgATcvfQ5CplM,15378
44
+ datarobot_genai/drmcp/core/tool_filter.py,sha256=tLOcG50QBvS48cOVHM6OqoODYiiS6KeM_F-2diaHkW0,2858
45
+ datarobot_genai/drmcp/core/utils.py,sha256=dSjrayWVcnC5GxQcvOIOSHaoEymPIVtG_s2ZBMlmSOw,4336
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=IEdD2Gqm4SfUdiXJB99RiWxkN6frGaxJ2SfATetMM3c,4243
49
+ datarobot_genai/drmcp/core/dynamic_prompts/register.py,sha256=5AEh1m8GX-gPZHUdiE1VATt7IKJQk-eThcxh01sWn0I,7204
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/integration_mcp_server.py,sha256=MdoR7r3m9uT7crodyhY69yhkrM7Thpe__BBD9lB_2oA,3328
70
+ datarobot_genai/drmcp/test_utils/mcp_utils_ete.py,sha256=rvLOePXF9epIEksJzTOqdL9-fGn21bRLbK3yzpvi-6E,3430
71
+ datarobot_genai/drmcp/test_utils/mcp_utils_integration.py,sha256=0sU29Khal0CelnHBDInyTRiuPKrFFbTbIomOoUbyMhs,3271
72
+ datarobot_genai/drmcp/test_utils/openai_llm_mcp_client.py,sha256=Va3_5c2ToZyfIsEjK2ef5d3z-FA5SE51voikvjKPt8Q,8837
73
+ datarobot_genai/drmcp/test_utils/tool_base_ete.py,sha256=-mKHBkGkyOKQCVS2LHFhSnRofIqJBbeAPRkwizBDtTg,6104
74
+ datarobot_genai/drmcp/test_utils/utils.py,sha256=esGKFv8aO31-Qg3owayeWp32BYe1CdYOEutjjdbweCw,3048
75
+ datarobot_genai/drmcp/tools/__init__.py,sha256=0kq9vMkF7EBsS6lkEdiLibmUrghTQqosHbZ5k-V9a5g,578
76
+ datarobot_genai/drmcp/tools/predictive/__init__.py,sha256=WuOHlNNEpEmcF7gVnhckruJRKU2qtmJLE3E7zoCGLDo,1030
77
+ datarobot_genai/drmcp/tools/predictive/data.py,sha256=k4EJxJrl8DYVGVfJ0DM4YTfnZlC_K3OUHZ0eRUzfluI,3165
78
+ datarobot_genai/drmcp/tools/predictive/deployment.py,sha256=lm02Ayuo11L1hP41fgi3QpR1Eyty-Wc16rM0c8SgliM,3277
79
+ datarobot_genai/drmcp/tools/predictive/deployment_info.py,sha256=BGEF_dmbxOBJR0n1Tt9TO2-iNTQSBTr-oQUyaxLZ0ZI,15297
80
+ datarobot_genai/drmcp/tools/predictive/model.py,sha256=Yih5-KedJ-1yupPLXCJsCXOdyWWi9pRvgapXDlgXWJA,4891
81
+ datarobot_genai/drmcp/tools/predictive/predict.py,sha256=7h73VidPJ4nlxtdFWRQ_S1epDvYuXCypKT8DXzDl4-g,9366
82
+ datarobot_genai/drmcp/tools/predictive/predict_realtime.py,sha256=t7f28y_ealZoA6itrCzlJbTc3KqEU0H-a41ah-7U0XI,13468
83
+ datarobot_genai/drmcp/tools/predictive/project.py,sha256=KaMDAvJY4s12j_4ybA7-KcCS1yMOj-KPIKNBgCSE2iM,2536
84
+ datarobot_genai/drmcp/tools/predictive/training.py,sha256=kxeDVLqUh9ajDk8wK7CZRRydDK8UNuTVZCB3huUihF8,23660
85
+ datarobot_genai/langgraph/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
+ datarobot_genai/langgraph/agent.py,sha256=DRnywmS9KDywyChtuIZZwNKbJs8BpC259EG_kxYbiQ8,15828
87
+ datarobot_genai/langgraph/mcp.py,sha256=iA2_j46mZAaNaL7ntXT-LW6C-NMJkzr3VfKDDfe7mh8,2851
88
+ datarobot_genai/llama_index/__init__.py,sha256=JEMkLQLuP8n14kNE3bZ2j08NdajnkJMfYjDQYqj7C0c,407
89
+ datarobot_genai/llama_index/agent.py,sha256=V6ZsD9GcBDJS-RJo1tJtIHhyW69_78gM6_fOHFV-Piw,1829
90
+ datarobot_genai/llama_index/base.py,sha256=ovcQQtC-djD_hcLrWdn93jg23AmD6NBEj7xtw4a6K6c,14481
91
+ datarobot_genai/llama_index/mcp.py,sha256=leXqF1C4zhuYEKFwNEfZHY4dsUuGZk3W7KArY-zxVL8,2645
92
+ datarobot_genai/nat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
+ datarobot_genai/nat/agent.py,sha256=siBLDWAff2-JwZ8Q3iNpM_e4_IoSwG9IvY0hyEjNenw,10292
94
+ datarobot_genai/nat/datarobot_llm_clients.py,sha256=STzAZ4OF8U-Y_cUTywxmKBGVotwsnbGP6vTojnu6q0g,9921
95
+ datarobot_genai/nat/datarobot_llm_providers.py,sha256=aDoQcTeGI-odqydPXEX9OGGNFbzAtpqzTvHHEkmJuEQ,4963
96
+ datarobot_genai-0.2.0.dist-info/METADATA,sha256=Qfh60pUsGehZwD7PkQNDLxItoJIkH12bZBZx95F_Ujw,5941
97
+ datarobot_genai-0.2.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
98
+ datarobot_genai-0.2.0.dist-info/entry_points.txt,sha256=CZhmZcSyt_RBltgLN_b9xasJD6J5SaDc_z7K0wuOY9Y,150
99
+ datarobot_genai-0.2.0.dist-info/licenses/AUTHORS,sha256=isJGUXdjq1U7XZ_B_9AH8Qf0u4eX0XyQifJZ_Sxm4sA,80
100
+ datarobot_genai-0.2.0.dist-info/licenses/LICENSE,sha256=U2_VkLIktQoa60Nf6Tbt7E4RMlfhFSjWjcJJfVC-YCE,11341
101
+ datarobot_genai-0.2.0.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,3 @@
1
+ [nat.plugins]
2
+ datarobot_llm_clients = datarobot_genai.nat.datarobot_llm_clients
3
+ datarobot_llm_providers = datarobot_genai.nat.datarobot_llm_providers
@@ -0,0 +1,2 @@
1
+ Cavit Cakir cavit.cakir@datarobot.com
2
+ James Clemens james.clemens@datarobot.com