datarobot-genai 0.2.15__tar.gz → 0.2.16__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 (114) hide show
  1. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/PKG-INFO +1 -1
  2. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/pyproject.toml +1 -1
  3. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/tools/clients/jira.py +44 -3
  4. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/tools/jira/tools.py +34 -0
  5. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/.gitignore +0 -0
  6. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/AUTHORS +0 -0
  7. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/LICENSE +0 -0
  8. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/README.md +0 -0
  9. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/__init__.py +0 -0
  10. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/core/__init__.py +0 -0
  11. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/core/agents/__init__.py +0 -0
  12. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/core/agents/base.py +0 -0
  13. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/core/chat/__init__.py +0 -0
  14. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/core/chat/auth.py +0 -0
  15. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/core/chat/client.py +0 -0
  16. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/core/chat/responses.py +0 -0
  17. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/core/cli/__init__.py +0 -0
  18. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/core/cli/agent_environment.py +0 -0
  19. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/core/cli/agent_kernel.py +0 -0
  20. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/core/custom_model.py +0 -0
  21. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/core/mcp/__init__.py +0 -0
  22. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/core/mcp/common.py +0 -0
  23. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/core/telemetry_agent.py +0 -0
  24. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/core/utils/__init__.py +0 -0
  25. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/core/utils/auth.py +0 -0
  26. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/core/utils/urls.py +0 -0
  27. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/crewai/__init__.py +0 -0
  28. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/crewai/agent.py +0 -0
  29. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/crewai/base.py +0 -0
  30. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/crewai/events.py +0 -0
  31. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/crewai/mcp.py +0 -0
  32. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/__init__.py +0 -0
  33. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/__init__.py +0 -0
  34. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/auth.py +0 -0
  35. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/clients.py +0 -0
  36. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/config.py +0 -0
  37. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/config_utils.py +0 -0
  38. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/constants.py +0 -0
  39. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/credentials.py +0 -0
  40. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dr_mcp_server.py +0 -0
  41. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dr_mcp_server_logo.py +0 -0
  42. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dynamic_prompts/__init__.py +0 -0
  43. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dynamic_prompts/controllers.py +0 -0
  44. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dynamic_prompts/dr_lib.py +0 -0
  45. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dynamic_prompts/register.py +0 -0
  46. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dynamic_prompts/utils.py +0 -0
  47. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dynamic_tools/__init__.py +0 -0
  48. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/__init__.py +0 -0
  49. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/__init__.py +0 -0
  50. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/base.py +0 -0
  51. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/default.py +0 -0
  52. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/drum.py +0 -0
  53. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/config.py +0 -0
  54. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/controllers.py +0 -0
  55. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/metadata.py +0 -0
  56. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/register.py +0 -0
  57. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/schemas/drum_agentic_fallback_schema.json +0 -0
  58. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/schemas/drum_prediction_fallback_schema.json +0 -0
  59. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dynamic_tools/register.py +0 -0
  60. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/dynamic_tools/schema.py +0 -0
  61. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/exceptions.py +0 -0
  62. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/logging.py +0 -0
  63. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/mcp_instance.py +0 -0
  64. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/mcp_server_tools.py +0 -0
  65. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/memory_management/__init__.py +0 -0
  66. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/memory_management/manager.py +0 -0
  67. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/memory_management/memory_tools.py +0 -0
  68. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/routes.py +0 -0
  69. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/routes_utils.py +0 -0
  70. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/server_life_cycle.py +0 -0
  71. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/telemetry.py +0 -0
  72. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/tool_config.py +0 -0
  73. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/tool_filter.py +0 -0
  74. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/core/utils.py +0 -0
  75. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/server.py +0 -0
  76. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/test_utils/__init__.py +0 -0
  77. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/test_utils/integration_mcp_server.py +0 -0
  78. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/test_utils/mcp_utils_ete.py +0 -0
  79. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/test_utils/mcp_utils_integration.py +0 -0
  80. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/test_utils/openai_llm_mcp_client.py +0 -0
  81. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/test_utils/tool_base_ete.py +0 -0
  82. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/test_utils/utils.py +0 -0
  83. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/tools/__init__.py +0 -0
  84. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/tools/clients/__init__.py +0 -0
  85. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/tools/clients/atlassian.py +0 -0
  86. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/tools/clients/confluence.py +0 -0
  87. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/tools/clients/s3.py +0 -0
  88. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/tools/confluence/__init__.py +0 -0
  89. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/tools/confluence/tools.py +0 -0
  90. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/tools/jira/__init__.py +0 -0
  91. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/tools/predictive/__init__.py +0 -0
  92. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/tools/predictive/data.py +0 -0
  93. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/tools/predictive/deployment.py +0 -0
  94. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/tools/predictive/deployment_info.py +0 -0
  95. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/tools/predictive/model.py +0 -0
  96. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/tools/predictive/predict.py +0 -0
  97. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/tools/predictive/predict_realtime.py +0 -0
  98. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/tools/predictive/project.py +0 -0
  99. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/drmcp/tools/predictive/training.py +0 -0
  100. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/langgraph/__init__.py +0 -0
  101. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/langgraph/agent.py +0 -0
  102. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/langgraph/mcp.py +0 -0
  103. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/llama_index/__init__.py +0 -0
  104. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/llama_index/agent.py +0 -0
  105. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/llama_index/base.py +0 -0
  106. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/llama_index/mcp.py +0 -0
  107. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/nat/__init__.py +0 -0
  108. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/nat/agent.py +0 -0
  109. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/nat/datarobot_auth_provider.py +0 -0
  110. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/nat/datarobot_llm_clients.py +0 -0
  111. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/nat/datarobot_llm_providers.py +0 -0
  112. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/nat/datarobot_mcp_client.py +0 -0
  113. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/src/datarobot_genai/nat/helpers.py +0 -0
  114. {datarobot_genai-0.2.15 → datarobot_genai-0.2.16}/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.2.15
3
+ Version: 0.2.16
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.2.15"
7
+ version = "0.2.16"
8
8
  description = "Generic helpers for GenAI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10, <3.13"
@@ -25,6 +25,18 @@ from .atlassian import get_atlassian_cloud_id
25
25
 
26
26
  logger = logging.getLogger(__name__)
27
27
 
28
+ RESPONSE_JIRA_ISSUE_FIELDS = {
29
+ "id",
30
+ "key",
31
+ "summary",
32
+ "status",
33
+ "reporter",
34
+ "assignee",
35
+ "created",
36
+ "updated",
37
+ }
38
+ RESPONSE_JIRA_ISSUE_FIELDS_STR = ",".join(RESPONSE_JIRA_ISSUE_FIELDS)
39
+
28
40
 
29
41
  class _IssuePerson(BaseModel):
30
42
  email_address: str = Field(alias="emailAddress")
@@ -112,6 +124,37 @@ class JiraClient:
112
124
  cloud_id = await self._get_cloud_id()
113
125
  return f"{ATLASSIAN_API_BASE}/ex/jira/{cloud_id}/rest/api/3/{path}"
114
126
 
127
+ async def search_jira_issues(self, jql_query: str, max_results: int) -> list[Issue]:
128
+ """
129
+ Search Jira issues using JQL (Jira Query Language).
130
+
131
+ Args:
132
+ jql_query: JQL Query
133
+ max_results: Maximum number of issues to return
134
+
135
+ Returns
136
+ -------
137
+ List of Jira issues
138
+
139
+ Raises
140
+ ------
141
+ httpx.HTTPStatusError: If the API request fails
142
+ """
143
+ url = await self._get_full_url("search/jql")
144
+ response = await self._client.post(
145
+ url,
146
+ json={
147
+ "jql": jql_query,
148
+ "fields": list(RESPONSE_JIRA_ISSUE_FIELDS),
149
+ "maxResults": max_results,
150
+ },
151
+ )
152
+
153
+ response.raise_for_status()
154
+ raw_issues = response.json().get("issues", [])
155
+ issues = [Issue(**issue) for issue in raw_issues]
156
+ return issues
157
+
115
158
  async def get_jira_issue(self, issue_key: str) -> Issue:
116
159
  """
117
160
  Get a Jira issue by its key.
@@ -128,9 +171,7 @@ class JiraClient:
128
171
  httpx.HTTPStatusError: If the API request fails
129
172
  """
130
173
  url = await self._get_full_url(f"issue/{issue_key}")
131
- response = await self._client.get(
132
- url, params={"fields": "id,key,summary,status,reporter,assignee,created,updated"}
133
- )
174
+ response = await self._client.get(url, params={"fields": RESPONSE_JIRA_ISSUE_FIELDS_STR})
134
175
 
135
176
  if response.status_code == HTTPStatus.NOT_FOUND:
136
177
  raise ValueError(f"{issue_key} not found")
@@ -26,6 +26,40 @@ from datarobot_genai.drmcp.tools.clients.jira import JiraClient
26
26
  logger = logging.getLogger(__name__)
27
27
 
28
28
 
29
+ @dr_mcp_tool(tags={"jira", "search", "issues"})
30
+ async def jira_search_issues(
31
+ *,
32
+ jql_query: Annotated[
33
+ str, "The JQL (Jira Query Language) string used to filter and search for issues."
34
+ ],
35
+ max_results: Annotated[int, "Maximum number of issues to return. Default is 50."] = 50,
36
+ ) -> ToolResult:
37
+ """
38
+ Search for Jira issues using a powerful JQL query string.
39
+
40
+ Refer to JQL documentation for advanced query construction:
41
+ JQL functions: https://support.atlassian.com/jira-service-management-cloud/docs/jql-functions/
42
+ JQL fields: https://support.atlassian.com/jira-service-management-cloud/docs/jql-fields/
43
+ JQL keywords: https://support.atlassian.com/jira-service-management-cloud/docs/use-advanced-search-with-jira-query-language-jql/
44
+ JQL operators: https://support.atlassian.com/jira-service-management-cloud/docs/jql-operators/
45
+ """
46
+ if not jql_query:
47
+ raise ToolError("Argument validation error: 'jql_query' cannot be empty.")
48
+
49
+ access_token = await get_atlassian_access_token()
50
+ if isinstance(access_token, ToolError):
51
+ raise access_token
52
+
53
+ async with JiraClient(access_token) as client:
54
+ issues = await client.search_jira_issues(jql_query=jql_query, max_results=max_results)
55
+
56
+ n = len(issues)
57
+ return ToolResult(
58
+ content=f"Successfully executed JQL query and retrieved {n} issue(s).",
59
+ structured_content={"data": [issue.as_flat_dict() for issue in issues], "count": n},
60
+ )
61
+
62
+
29
63
  @dr_mcp_tool(tags={"jira", "read", "get", "issue"})
30
64
  async def jira_get_issue(
31
65
  *, issue_key: Annotated[str, "The key (ID) of the Jira issue to retrieve, e.g., 'PROJ-123'."]