datarobot-genai 0.1.73__tar.gz → 0.1.75__tar.gz

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-0.1.73 → datarobot_genai-0.1.75}/PKG-INFO +1 -1
  2. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/pyproject.toml +1 -1
  3. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/core/chat/responses.py +99 -0
  4. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/core/utils/auth.py +16 -1
  5. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/.gitignore +0 -0
  6. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/AUTHORS +0 -0
  7. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/LICENSE +0 -0
  8. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/README.md +0 -0
  9. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/__init__.py +0 -0
  10. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/core/__init__.py +0 -0
  11. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/core/agents/__init__.py +0 -0
  12. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/core/agents/base.py +0 -0
  13. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/core/chat/__init__.py +0 -0
  14. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/core/chat/auth.py +0 -0
  15. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/core/chat/client.py +0 -0
  16. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/core/cli/__init__.py +0 -0
  17. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/core/cli/agent_environment.py +0 -0
  18. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/core/cli/agent_kernel.py +0 -0
  19. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/core/custom_model.py +0 -0
  20. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/core/mcp/__init__.py +0 -0
  21. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/core/mcp/common.py +0 -0
  22. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/core/telemetry_agent.py +0 -0
  23. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/core/utils/__init__.py +0 -0
  24. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/core/utils/urls.py +0 -0
  25. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/crewai/__init__.py +0 -0
  26. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/crewai/agent.py +0 -0
  27. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/crewai/base.py +0 -0
  28. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/crewai/events.py +0 -0
  29. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/crewai/mcp.py +0 -0
  30. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/__init__.py +0 -0
  31. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/__init__.py +0 -0
  32. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/auth.py +0 -0
  33. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/clients.py +0 -0
  34. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/config.py +0 -0
  35. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/config_utils.py +0 -0
  36. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/constants.py +0 -0
  37. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/credentials.py +0 -0
  38. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dr_mcp_server.py +0 -0
  39. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dr_mcp_server_logo.py +0 -0
  40. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_prompts/__init__.py +0 -0
  41. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_prompts/controllers.py +0 -0
  42. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_prompts/dr_lib.py +0 -0
  43. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_prompts/register.py +0 -0
  44. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_prompts/utils.py +0 -0
  45. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/__init__.py +0 -0
  46. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/__init__.py +0 -0
  47. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/__init__.py +0 -0
  48. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/base.py +0 -0
  49. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/default.py +0 -0
  50. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/drum.py +0 -0
  51. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/config.py +0 -0
  52. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/controllers.py +0 -0
  53. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/metadata.py +0 -0
  54. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/register.py +0 -0
  55. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/schemas/drum_agentic_fallback_schema.json +0 -0
  56. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/schemas/drum_prediction_fallback_schema.json +0 -0
  57. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/register.py +0 -0
  58. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/schema.py +0 -0
  59. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/exceptions.py +0 -0
  60. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/logging.py +0 -0
  61. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/mcp_instance.py +0 -0
  62. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/mcp_server_tools.py +0 -0
  63. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/memory_management/__init__.py +0 -0
  64. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/memory_management/manager.py +0 -0
  65. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/memory_management/memory_tools.py +0 -0
  66. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/routes.py +0 -0
  67. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/routes_utils.py +0 -0
  68. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/server_life_cycle.py +0 -0
  69. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/telemetry.py +0 -0
  70. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/tool_filter.py +0 -0
  71. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/utils.py +0 -0
  72. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/server.py +0 -0
  73. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/test_utils/__init__.py +0 -0
  74. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/test_utils/integration_mcp_server.py +0 -0
  75. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/test_utils/mcp_utils_ete.py +0 -0
  76. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/test_utils/mcp_utils_integration.py +0 -0
  77. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/test_utils/openai_llm_mcp_client.py +0 -0
  78. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/test_utils/tool_base_ete.py +0 -0
  79. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/test_utils/utils.py +0 -0
  80. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/tools/__init__.py +0 -0
  81. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/tools/predictive/__init__.py +0 -0
  82. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/tools/predictive/data.py +0 -0
  83. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/tools/predictive/deployment.py +0 -0
  84. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/tools/predictive/deployment_info.py +0 -0
  85. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/tools/predictive/model.py +0 -0
  86. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/tools/predictive/predict.py +0 -0
  87. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/tools/predictive/predict_realtime.py +0 -0
  88. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/tools/predictive/project.py +0 -0
  89. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/tools/predictive/training.py +0 -0
  90. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/langgraph/__init__.py +0 -0
  91. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/langgraph/agent.py +0 -0
  92. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/langgraph/mcp.py +0 -0
  93. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/llama_index/__init__.py +0 -0
  94. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/llama_index/agent.py +0 -0
  95. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/llama_index/base.py +0 -0
  96. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/llama_index/mcp.py +0 -0
  97. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/nat/__init__.py +0 -0
  98. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/nat/agent.py +0 -0
  99. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/nat/datarobot_llm_clients.py +0 -0
  100. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/nat/datarobot_llm_providers.py +0 -0
  101. {datarobot_genai-0.1.73 → datarobot_genai-0.1.75}/src/datarobot_genai/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datarobot-genai
3
- Version: 0.1.73
3
+ Version: 0.1.75
4
4
  Summary: Generic helpers for GenAI
5
5
  Project-URL: Homepage, https://github.com/datarobot-oss/datarobot-genai
6
6
  Author: DataRobot, Inc.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "datarobot-genai"
7
- version = "0.1.73"
7
+ version = "0.1.75"
8
8
  description = "Generic helpers for GenAI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10, <3.13"
@@ -14,13 +14,18 @@
14
14
 
15
15
  """OpenAI-compatible response helpers for chat interactions."""
16
16
 
17
+ import asyncio
18
+ import queue
17
19
  import time
18
20
  import traceback as tb
19
21
  import uuid
20
22
  from asyncio import AbstractEventLoop
21
23
  from collections.abc import AsyncGenerator
24
+ from collections.abc import AsyncIterator
22
25
  from collections.abc import Iterator
23
26
  from concurrent.futures import ThreadPoolExecutor
27
+ from typing import Any
28
+ from typing import TypeVar
24
29
 
25
30
  from openai.types import CompletionUsage
26
31
  from openai.types.chat import ChatCompletion
@@ -168,3 +173,97 @@ def to_custom_model_streaming_response(
168
173
  choices=[choice],
169
174
  usage=None,
170
175
  )
176
+
177
+
178
+ def streaming_iterator_to_custom_model_streaming_response(
179
+ streaming_response_iterator: Iterator[tuple[str, MultiTurnSample | None, dict[str, int]]],
180
+ model: str | object | None,
181
+ ) -> Iterator[CustomModelStreamingResponse]:
182
+ """Convert the OpenAI ChatCompletionChunk response to CustomModelStreamingResponse."""
183
+ completion_id = str(uuid.uuid4())
184
+ created = int(time.time())
185
+
186
+ last_pipeline_interactions = None
187
+ last_usage_metrics = None
188
+
189
+ while True:
190
+ try:
191
+ (
192
+ response_text,
193
+ pipeline_interactions,
194
+ usage_metrics,
195
+ ) = next(streaming_response_iterator)
196
+ last_pipeline_interactions = pipeline_interactions
197
+ last_usage_metrics = usage_metrics
198
+
199
+ if response_text:
200
+ choice = ChunkChoice(
201
+ index=0,
202
+ delta=ChoiceDelta(role="assistant", content=response_text),
203
+ finish_reason=None,
204
+ )
205
+ yield CustomModelStreamingResponse(
206
+ id=completion_id,
207
+ object="chat.completion.chunk",
208
+ created=created,
209
+ model=model,
210
+ choices=[choice],
211
+ usage=CompletionUsage(**usage_metrics) if usage_metrics else None,
212
+ )
213
+ except StopIteration:
214
+ break
215
+ # Yield final chunk indicating end of stream
216
+ choice = ChunkChoice(
217
+ index=0,
218
+ delta=ChoiceDelta(role="assistant"),
219
+ finish_reason="stop",
220
+ )
221
+ yield CustomModelStreamingResponse(
222
+ id=completion_id,
223
+ object="chat.completion.chunk",
224
+ created=created,
225
+ model=model,
226
+ choices=[choice],
227
+ usage=CompletionUsage(**last_usage_metrics) if last_usage_metrics else None,
228
+ pipeline_interactions=last_pipeline_interactions.model_dump_json()
229
+ if last_pipeline_interactions
230
+ else None,
231
+ )
232
+
233
+
234
+ T = TypeVar("T")
235
+
236
+
237
+ def async_gen_to_sync_thread(
238
+ async_iterator: AsyncIterator[T],
239
+ thread_pool_executor: ThreadPoolExecutor,
240
+ event_loop: asyncio.AbstractEventLoop,
241
+ ) -> Iterator[T]:
242
+ """Run an async iterator in a separate thread and provide a sync iterator."""
243
+ # A thread-safe queue for communication
244
+ sync_queue: queue.Queue[Any] = queue.Queue()
245
+ # A sentinel object to signal the end of the async generator
246
+ SENTINEL = object() # noqa: N806
247
+
248
+ async def run_async_to_queue() -> None:
249
+ """Run in the separate thread's event loop."""
250
+ try:
251
+ async for item in async_iterator:
252
+ sync_queue.put(item)
253
+ except Exception as e:
254
+ # Put the exception on the queue to be re-raised in the main thread
255
+ sync_queue.put(e)
256
+ finally:
257
+ # Signal the end of iteration
258
+ sync_queue.put(SENTINEL)
259
+
260
+ thread_pool_executor.submit(event_loop.run_until_complete, run_async_to_queue()).result()
261
+
262
+ # The main thread consumes items synchronously
263
+ while True:
264
+ item = sync_queue.get()
265
+ if item is SENTINEL:
266
+ break
267
+ if isinstance(item, Exception):
268
+ raise item
269
+ yield item
@@ -74,7 +74,22 @@ class AuthContextHeaderHandler:
74
74
  if algorithm is None:
75
75
  raise ValueError("Algorithm None is not allowed. Use a secure algorithm like HS256.")
76
76
 
77
- self.secret_key = secret_key or AuthContextConfig().session_secret_key
77
+ # Get secret key from parameter, config, or environment variable
78
+ # Handle the case where AuthContextConfig() initialization fails due to
79
+ # a bug in the datarobot package when SESSION_SECRET_KEY is not set
80
+ if secret_key:
81
+ self.secret_key = secret_key
82
+ else:
83
+ try:
84
+ config = AuthContextConfig()
85
+ self.secret_key = config.session_secret_key or ""
86
+ except (TypeError, AttributeError, Exception):
87
+ # Fallback to reading environment variable directly if config initialization fails
88
+ # This can happen when SESSION_SECRET_KEY is not set and the datarobot package's
89
+ # getenv function encounters a bug with None values
90
+ # it tries to check if "apiToken" in payload: when payload is None
91
+ self.secret_key = ""
92
+
78
93
  self.algorithm = algorithm
79
94
  self.validate_signature = validate_signature
80
95