datarobot-genai 0.2.29__tar.gz → 0.2.30__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.
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/PKG-INFO +1 -1
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/pyproject.toml +1 -1
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/clients/gdrive.py +96 -1
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/gdrive/tools.py +86 -9
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/.gitignore +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/AUTHORS +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/LICENSE +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/README.md +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/agents/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/agents/base.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/chat/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/chat/auth.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/chat/client.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/chat/responses.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/cli/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/cli/agent_environment.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/cli/agent_kernel.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/custom_model.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/mcp/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/mcp/common.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/telemetry_agent.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/utils/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/utils/auth.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/utils/urls.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/crewai/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/crewai/agent.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/crewai/base.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/crewai/events.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/crewai/mcp.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/auth.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/clients.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/config.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/config_utils.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/constants.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/credentials.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dr_mcp_server.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dr_mcp_server_logo.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dynamic_prompts/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dynamic_prompts/controllers.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dynamic_prompts/dr_lib.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dynamic_prompts/register.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dynamic_prompts/utils.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dynamic_tools/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/base.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/default.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/adapters/drum.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/config.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/controllers.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/metadata.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/register.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/schemas/drum_agentic_fallback_schema.json +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dynamic_tools/deployment/schemas/drum_prediction_fallback_schema.json +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dynamic_tools/register.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dynamic_tools/schema.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/exceptions.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/logging.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/mcp_instance.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/memory_management/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/memory_management/manager.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/memory_management/memory_tools.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/routes.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/routes_utils.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/server_life_cycle.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/telemetry.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/tool_config.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/tool_filter.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/utils.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/server.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/test_utils/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/test_utils/elicitation_test_tool.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/test_utils/integration_mcp_server.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/test_utils/mcp_utils_ete.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/test_utils/mcp_utils_integration.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/test_utils/openai_llm_mcp_client.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/test_utils/test_interactive.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/test_utils/tool_base_ete.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/test_utils/utils.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/clients/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/clients/atlassian.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/clients/confluence.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/clients/jira.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/clients/microsoft_graph.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/clients/s3.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/confluence/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/confluence/tools.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/gdrive/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/jira/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/jira/tools.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/microsoft_graph/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/microsoft_graph/tools.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/predictive/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/predictive/data.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/predictive/deployment.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/predictive/deployment_info.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/predictive/model.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/predictive/predict.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/predictive/predict_realtime.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/predictive/project.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/predictive/training.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/langgraph/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/langgraph/agent.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/langgraph/mcp.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/llama_index/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/llama_index/agent.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/llama_index/base.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/llama_index/mcp.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/nat/__init__.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/nat/agent.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/nat/datarobot_auth_provider.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/nat/datarobot_llm_clients.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/nat/datarobot_llm_providers.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/nat/datarobot_mcp_client.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/nat/helpers.py +0 -0
- {datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/py.typed +0 -0
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/clients/gdrive.py
RENAMED
|
@@ -33,7 +33,17 @@ from datarobot_genai.drmcp.core.auth import get_access_token
|
|
|
33
33
|
|
|
34
34
|
logger = logging.getLogger(__name__)
|
|
35
35
|
|
|
36
|
-
SUPPORTED_FIELDS = {
|
|
36
|
+
SUPPORTED_FIELDS = {
|
|
37
|
+
"id",
|
|
38
|
+
"name",
|
|
39
|
+
"size",
|
|
40
|
+
"mimeType",
|
|
41
|
+
"webViewLink",
|
|
42
|
+
"createdTime",
|
|
43
|
+
"modifiedTime",
|
|
44
|
+
"starred",
|
|
45
|
+
"trashed",
|
|
46
|
+
}
|
|
37
47
|
SUPPORTED_FIELDS_STR = ",".join(SUPPORTED_FIELDS)
|
|
38
48
|
DEFAULT_FIELDS = f"nextPageToken,files({SUPPORTED_FIELDS_STR})"
|
|
39
49
|
GOOGLE_DRIVE_FOLDER_MIME = "application/vnd.google-apps.folder"
|
|
@@ -119,6 +129,8 @@ class GoogleDriveFile(BaseModel):
|
|
|
119
129
|
web_view_link: Annotated[str | None, Field(alias="webViewLink")] = None
|
|
120
130
|
created_time: Annotated[str | None, Field(alias="createdTime")] = None
|
|
121
131
|
modified_time: Annotated[str | None, Field(alias="modifiedTime")] = None
|
|
132
|
+
starred: bool | None = None
|
|
133
|
+
trashed: bool | None = None
|
|
122
134
|
|
|
123
135
|
model_config = ConfigDict(populate_by_name=True)
|
|
124
136
|
|
|
@@ -133,8 +145,31 @@ class GoogleDriveFile(BaseModel):
|
|
|
133
145
|
web_view_link=data.get("webViewLink"),
|
|
134
146
|
created_time=data.get("createdTime"),
|
|
135
147
|
modified_time=data.get("modifiedTime"),
|
|
148
|
+
starred=data.get("starred"),
|
|
149
|
+
trashed=data.get("trashed"),
|
|
136
150
|
)
|
|
137
151
|
|
|
152
|
+
def as_flat_dict(self) -> dict[str, Any]:
|
|
153
|
+
"""Return a flat dictionary representation of the file."""
|
|
154
|
+
result: dict[str, Any] = {
|
|
155
|
+
"id": self.id,
|
|
156
|
+
"name": self.name,
|
|
157
|
+
"mimeType": self.mime_type,
|
|
158
|
+
}
|
|
159
|
+
if self.size is not None:
|
|
160
|
+
result["size"] = self.size
|
|
161
|
+
if self.web_view_link is not None:
|
|
162
|
+
result["webViewLink"] = self.web_view_link
|
|
163
|
+
if self.created_time is not None:
|
|
164
|
+
result["createdTime"] = self.created_time
|
|
165
|
+
if self.modified_time is not None:
|
|
166
|
+
result["modifiedTime"] = self.modified_time
|
|
167
|
+
if self.starred is not None:
|
|
168
|
+
result["starred"] = self.starred
|
|
169
|
+
if self.trashed is not None:
|
|
170
|
+
result["trashed"] = self.trashed
|
|
171
|
+
return result
|
|
172
|
+
|
|
138
173
|
|
|
139
174
|
class PaginatedResult(BaseModel):
|
|
140
175
|
"""Result of a paginated API call."""
|
|
@@ -440,6 +475,66 @@ class GoogleDriveClient:
|
|
|
440
475
|
response.raise_for_status()
|
|
441
476
|
return GoogleDriveFile.from_api_response(response.json())
|
|
442
477
|
|
|
478
|
+
async def update_file_metadata(
|
|
479
|
+
self,
|
|
480
|
+
file_id: str,
|
|
481
|
+
new_name: str | None = None,
|
|
482
|
+
starred: bool | None = None,
|
|
483
|
+
trashed: bool | None = None,
|
|
484
|
+
) -> GoogleDriveFile:
|
|
485
|
+
"""Update file metadata in Google Drive.
|
|
486
|
+
|
|
487
|
+
Args:
|
|
488
|
+
file_id: The ID of the file to update.
|
|
489
|
+
new_name: A new name to rename the file. Must not be empty or whitespace.
|
|
490
|
+
starred: Set to True to star the file or False to unstar it.
|
|
491
|
+
trashed: Set to True to trash the file or False to restore it.
|
|
492
|
+
|
|
493
|
+
Returns
|
|
494
|
+
-------
|
|
495
|
+
GoogleDriveFile with updated metadata.
|
|
496
|
+
|
|
497
|
+
Raises
|
|
498
|
+
------
|
|
499
|
+
GoogleDriveError: If no update fields are provided, file is not found,
|
|
500
|
+
access is denied, or the request is invalid.
|
|
501
|
+
"""
|
|
502
|
+
if new_name is None and starred is None and trashed is None:
|
|
503
|
+
raise GoogleDriveError(
|
|
504
|
+
"At least one of new_name, starred, or trashed must be provided."
|
|
505
|
+
)
|
|
506
|
+
|
|
507
|
+
if new_name is not None and not new_name.strip():
|
|
508
|
+
raise GoogleDriveError("new_name cannot be empty or whitespace.")
|
|
509
|
+
|
|
510
|
+
body: dict[str, Any] = {}
|
|
511
|
+
if new_name is not None:
|
|
512
|
+
body["name"] = new_name
|
|
513
|
+
if starred is not None:
|
|
514
|
+
body["starred"] = starred
|
|
515
|
+
if trashed is not None:
|
|
516
|
+
body["trashed"] = trashed
|
|
517
|
+
|
|
518
|
+
response = await self._client.patch(
|
|
519
|
+
f"/{file_id}",
|
|
520
|
+
json=body,
|
|
521
|
+
params={"fields": SUPPORTED_FIELDS_STR, "supportsAllDrives": "true"},
|
|
522
|
+
)
|
|
523
|
+
|
|
524
|
+
if response.status_code == 404:
|
|
525
|
+
raise GoogleDriveError(f"File with ID '{file_id}' not found.")
|
|
526
|
+
if response.status_code == 403:
|
|
527
|
+
raise GoogleDriveError(
|
|
528
|
+
f"Permission denied: you don't have permission to update file '{file_id}'."
|
|
529
|
+
)
|
|
530
|
+
if response.status_code == 400:
|
|
531
|
+
raise GoogleDriveError("Bad request: invalid parameters for file update.")
|
|
532
|
+
if response.status_code == 429:
|
|
533
|
+
raise GoogleDriveError("Rate limit exceeded. Please try again later.")
|
|
534
|
+
|
|
535
|
+
response.raise_for_status()
|
|
536
|
+
return GoogleDriveFile.from_api_response(response.json())
|
|
537
|
+
|
|
443
538
|
async def _export_workspace_file(self, file_id: str, export_mime_type: str) -> str:
|
|
444
539
|
"""Export a Google Workspace file to the specified format.
|
|
445
540
|
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/gdrive/tools.py
RENAMED
|
@@ -164,7 +164,6 @@ async def gdrive_read_content(
|
|
|
164
164
|
f"An unexpected error occurred while reading Google Drive file content: {str(e)}"
|
|
165
165
|
)
|
|
166
166
|
|
|
167
|
-
# Provide helpful context about the conversion
|
|
168
167
|
export_info = ""
|
|
169
168
|
if file_content.was_exported:
|
|
170
169
|
export_info = f" (exported from {file_content.original_mime_type})"
|
|
@@ -252,7 +251,6 @@ async def gdrive_create_file(
|
|
|
252
251
|
logger.error(f"Unexpected error creating Google Drive file: {e}")
|
|
253
252
|
raise ToolError(f"An unexpected error occurred while creating Google Drive file: {str(e)}")
|
|
254
253
|
|
|
255
|
-
# Build response message
|
|
256
254
|
file_type = "folder" if mime_type == GOOGLE_DRIVE_FOLDER_MIME else "file"
|
|
257
255
|
content_info = ""
|
|
258
256
|
if initial_content and mime_type != GOOGLE_DRIVE_FOLDER_MIME:
|
|
@@ -260,11 +258,90 @@ async def gdrive_create_file(
|
|
|
260
258
|
|
|
261
259
|
return ToolResult(
|
|
262
260
|
content=f"Successfully created {file_type} '{created_file.name}'{content_info}.",
|
|
263
|
-
structured_content=
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
261
|
+
structured_content=created_file.as_flat_dict(),
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
@dr_mcp_tool(
|
|
266
|
+
tags={"google", "gdrive", "update", "metadata", "rename", "star", "trash"}, enabled=False
|
|
267
|
+
)
|
|
268
|
+
async def gdrive_update_metadata(
|
|
269
|
+
*,
|
|
270
|
+
file_id: Annotated[str, "The ID of the file or folder to update."],
|
|
271
|
+
new_name: Annotated[str | None, "A new name to rename the file."] = None,
|
|
272
|
+
starred: Annotated[bool | None, "Set to True to star the file or False to unstar it."] = None,
|
|
273
|
+
trash: Annotated[bool | None, "Set to True to trash the file or False to restore it."] = None,
|
|
274
|
+
) -> ToolResult:
|
|
275
|
+
"""
|
|
276
|
+
Update non-content metadata fields of a Google Drive file or folder.
|
|
277
|
+
|
|
278
|
+
This tool allows you to:
|
|
279
|
+
- Rename files and folders by setting new_name
|
|
280
|
+
- Star or unstar files (per-user preference) with starred
|
|
281
|
+
- Move files to trash or restore them with trash
|
|
282
|
+
|
|
283
|
+
Usage:
|
|
284
|
+
- Rename: gdrive_update_metadata(file_id="1ABC...", new_name="New Name.txt")
|
|
285
|
+
- Star: gdrive_update_metadata(file_id="1ABC...", starred=True)
|
|
286
|
+
- Unstar: gdrive_update_metadata(file_id="1ABC...", starred=False)
|
|
287
|
+
- Trash: gdrive_update_metadata(file_id="1ABC...", trash=True)
|
|
288
|
+
- Restore: gdrive_update_metadata(file_id="1ABC...", trash=False)
|
|
289
|
+
- Multiple: gdrive_update_metadata(file_id="1ABC...", new_name="New.txt", starred=True)
|
|
290
|
+
|
|
291
|
+
Note:
|
|
292
|
+
- At least one of new_name, starred, or trash must be provided.
|
|
293
|
+
- Starring is per-user: starring a shared file only affects your view.
|
|
294
|
+
- Trashing a folder trashes all contents recursively.
|
|
295
|
+
- Trashing requires permissions (owner for My Drive, organizer for Shared Drives).
|
|
296
|
+
"""
|
|
297
|
+
if not file_id or not file_id.strip():
|
|
298
|
+
raise ToolError("Argument validation error: 'file_id' cannot be empty.")
|
|
299
|
+
|
|
300
|
+
if new_name is None and starred is None and trash is None:
|
|
301
|
+
raise ToolError(
|
|
302
|
+
"Argument validation error: at least one of 'new_name', 'starred', or 'trash' "
|
|
303
|
+
"must be provided."
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
if new_name is not None and not new_name.strip():
|
|
307
|
+
raise ToolError("Argument validation error: 'new_name' cannot be empty or whitespace.")
|
|
308
|
+
|
|
309
|
+
access_token = await get_gdrive_access_token()
|
|
310
|
+
if isinstance(access_token, ToolError):
|
|
311
|
+
raise access_token
|
|
312
|
+
|
|
313
|
+
try:
|
|
314
|
+
async with GoogleDriveClient(access_token) as client:
|
|
315
|
+
updated_file = await client.update_file_metadata(
|
|
316
|
+
file_id=file_id,
|
|
317
|
+
new_name=new_name,
|
|
318
|
+
starred=starred,
|
|
319
|
+
trashed=trash,
|
|
320
|
+
)
|
|
321
|
+
except GoogleDriveError as e:
|
|
322
|
+
logger.error(f"Google Drive error updating file metadata: {e}")
|
|
323
|
+
raise ToolError(str(e))
|
|
324
|
+
except Exception as e:
|
|
325
|
+
logger.error(f"Unexpected error updating Google Drive file metadata: {e}")
|
|
326
|
+
raise ToolError(
|
|
327
|
+
f"An unexpected error occurred while updating Google Drive file metadata: {str(e)}"
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
changes: list[str] = []
|
|
331
|
+
if new_name is not None:
|
|
332
|
+
changes.append(f"renamed to '{new_name}'")
|
|
333
|
+
if starred is True:
|
|
334
|
+
changes.append("starred")
|
|
335
|
+
elif starred is False:
|
|
336
|
+
changes.append("unstarred")
|
|
337
|
+
if trash is True:
|
|
338
|
+
changes.append("moved to trash")
|
|
339
|
+
elif trash is False:
|
|
340
|
+
changes.append("restored from trash")
|
|
341
|
+
|
|
342
|
+
changes_description = ", ".join(changes)
|
|
343
|
+
|
|
344
|
+
return ToolResult(
|
|
345
|
+
content=f"Successfully updated file '{updated_file.name}': {changes_description}.",
|
|
346
|
+
structured_content=updated_file.as_flat_dict(),
|
|
270
347
|
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/agents/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/chat/responses.py
RENAMED
|
File without changes
|
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/cli/agent_environment.py
RENAMED
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/cli/agent_kernel.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/telemetry_agent.py
RENAMED
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/core/utils/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/config_utils.py
RENAMED
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/constants.py
RENAMED
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/credentials.py
RENAMED
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/dr_mcp_server.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/exceptions.py
RENAMED
|
File without changes
|
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/mcp_instance.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/routes_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/telemetry.py
RENAMED
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/tool_config.py
RENAMED
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/core/tool_filter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/test_utils/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/test_utils/utils.py
RENAMED
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/clients/jira.py
RENAMED
|
File without changes
|
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/clients/s3.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/gdrive/__init__.py
RENAMED
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/jira/__init__.py
RENAMED
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/jira/tools.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/drmcp/tools/predictive/data.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/llama_index/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/nat/datarobot_auth_provider.py
RENAMED
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/nat/datarobot_llm_clients.py
RENAMED
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/nat/datarobot_llm_providers.py
RENAMED
|
File without changes
|
{datarobot_genai-0.2.29 → datarobot_genai-0.2.30}/src/datarobot_genai/nat/datarobot_mcp_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|