datarobot-genai 0.1.74__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.74 → datarobot_genai-0.1.75}/PKG-INFO +1 -1
  2. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/pyproject.toml +1 -1
  3. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/core/chat/responses.py +99 -0
  4. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/.gitignore +0 -0
  5. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/AUTHORS +0 -0
  6. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/LICENSE +0 -0
  7. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/README.md +0 -0
  8. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/__init__.py +0 -0
  9. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/core/__init__.py +0 -0
  10. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/core/agents/__init__.py +0 -0
  11. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/core/agents/base.py +0 -0
  12. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/core/chat/__init__.py +0 -0
  13. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/core/chat/auth.py +0 -0
  14. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/core/chat/client.py +0 -0
  15. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/core/cli/__init__.py +0 -0
  16. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/core/cli/agent_environment.py +0 -0
  17. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/core/cli/agent_kernel.py +0 -0
  18. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/core/custom_model.py +0 -0
  19. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/core/mcp/__init__.py +0 -0
  20. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/core/mcp/common.py +0 -0
  21. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/core/telemetry_agent.py +0 -0
  22. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/core/utils/__init__.py +0 -0
  23. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/core/utils/auth.py +0 -0
  24. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/core/utils/urls.py +0 -0
  25. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/crewai/__init__.py +0 -0
  26. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/crewai/agent.py +0 -0
  27. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/crewai/base.py +0 -0
  28. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/crewai/events.py +0 -0
  29. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/crewai/mcp.py +0 -0
  30. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/__init__.py +0 -0
  31. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/__init__.py +0 -0
  32. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/auth.py +0 -0
  33. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/clients.py +0 -0
  34. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/config.py +0 -0
  35. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/config_utils.py +0 -0
  36. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/constants.py +0 -0
  37. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/credentials.py +0 -0
  38. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dr_mcp_server.py +0 -0
  39. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dr_mcp_server_logo.py +0 -0
  40. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_prompts/__init__.py +0 -0
  41. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_prompts/controllers.py +0 -0
  42. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_prompts/dr_lib.py +0 -0
  43. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_prompts/register.py +0 -0
  44. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_prompts/utils.py +0 -0
  45. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/__init__.py +0 -0
  46. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/__init__.py +0 -0
  47. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/__init__.py +0 -0
  48. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/base.py +0 -0
  49. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/default.py +0 -0
  50. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/drum.py +0 -0
  51. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/config.py +0 -0
  52. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/controllers.py +0 -0
  53. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/metadata.py +0 -0
  54. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/register.py +0 -0
  55. {datarobot_genai-0.1.74 → 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.74 → 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.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/register.py +0 -0
  58. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/dynamic_tools/schema.py +0 -0
  59. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/exceptions.py +0 -0
  60. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/logging.py +0 -0
  61. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/mcp_instance.py +0 -0
  62. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/mcp_server_tools.py +0 -0
  63. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/memory_management/__init__.py +0 -0
  64. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/memory_management/manager.py +0 -0
  65. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/memory_management/memory_tools.py +0 -0
  66. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/routes.py +0 -0
  67. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/routes_utils.py +0 -0
  68. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/server_life_cycle.py +0 -0
  69. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/telemetry.py +0 -0
  70. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/tool_filter.py +0 -0
  71. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/core/utils.py +0 -0
  72. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/server.py +0 -0
  73. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/test_utils/__init__.py +0 -0
  74. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/test_utils/integration_mcp_server.py +0 -0
  75. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/test_utils/mcp_utils_ete.py +0 -0
  76. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/test_utils/mcp_utils_integration.py +0 -0
  77. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/test_utils/openai_llm_mcp_client.py +0 -0
  78. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/test_utils/tool_base_ete.py +0 -0
  79. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/test_utils/utils.py +0 -0
  80. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/tools/__init__.py +0 -0
  81. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/tools/predictive/__init__.py +0 -0
  82. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/tools/predictive/data.py +0 -0
  83. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/tools/predictive/deployment.py +0 -0
  84. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/tools/predictive/deployment_info.py +0 -0
  85. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/tools/predictive/model.py +0 -0
  86. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/tools/predictive/predict.py +0 -0
  87. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/tools/predictive/predict_realtime.py +0 -0
  88. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/tools/predictive/project.py +0 -0
  89. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/drmcp/tools/predictive/training.py +0 -0
  90. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/langgraph/__init__.py +0 -0
  91. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/langgraph/agent.py +0 -0
  92. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/langgraph/mcp.py +0 -0
  93. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/llama_index/__init__.py +0 -0
  94. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/llama_index/agent.py +0 -0
  95. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/llama_index/base.py +0 -0
  96. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/llama_index/mcp.py +0 -0
  97. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/nat/__init__.py +0 -0
  98. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/nat/agent.py +0 -0
  99. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/nat/datarobot_llm_clients.py +0 -0
  100. {datarobot_genai-0.1.74 → datarobot_genai-0.1.75}/src/datarobot_genai/nat/datarobot_llm_providers.py +0 -0
  101. {datarobot_genai-0.1.74 → 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.74
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.74"
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