codemie-sdk-python 0.1.689__tar.gz → 0.1.690__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 (81) hide show
  1. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/PKG-INFO +1 -1
  2. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/pyproject.toml +1 -1
  3. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/client/client.py +4 -0
  4. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/skill.py +24 -0
  5. codemie_sdk_python-0.1.690/src/codemie_sdk/models/workspace.py +57 -0
  6. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/skill.py +37 -2
  7. codemie_sdk_python-0.1.690/src/codemie_sdk/services/workspace.py +160 -0
  8. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/README.md +0 -0
  9. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/__init__.py +0 -0
  10. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/auth/__init__.py +0 -0
  11. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/auth/credentials.py +0 -0
  12. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/builders/__init__.py +0 -0
  13. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/builders/workflow/__init__.py +0 -0
  14. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/builders/workflow/builder.py +0 -0
  15. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/builders/workflow/definition.py +0 -0
  16. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/builders/workflow/publish.py +0 -0
  17. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/client/__init__.py +0 -0
  18. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/exceptions.py +0 -0
  19. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/__init__.py +0 -0
  20. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/a2a.py +0 -0
  21. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/activity_event.py +0 -0
  22. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/admin.py +0 -0
  23. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/analytics.py +0 -0
  24. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/assistant.py +0 -0
  25. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/categories.py +0 -0
  26. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/common.py +0 -0
  27. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/conversation.py +0 -0
  28. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/cost_center.py +0 -0
  29. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/datasource.py +0 -0
  30. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/errors.py +0 -0
  31. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/file_operation.py +0 -0
  32. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/guardrails.py +0 -0
  33. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/integration.py +0 -0
  34. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/llm.py +0 -0
  35. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/mcp_config.py +0 -0
  36. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/mermaid.py +0 -0
  37. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/project.py +0 -0
  38. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/task.py +0 -0
  39. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/user.py +0 -0
  40. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/vendor_assistant.py +0 -0
  41. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/vendor_guardrail.py +0 -0
  42. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/vendor_knowledgebase.py +0 -0
  43. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/vendor_runtime.py +0 -0
  44. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/vendor_workflow.py +0 -0
  45. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/workflow.py +0 -0
  46. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/workflow_execution_payload.py +0 -0
  47. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/workflow_state.py +0 -0
  48. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/workflow_thoughts.py +0 -0
  49. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/models/workflow_transition.py +0 -0
  50. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/a2a.py +0 -0
  51. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/activity_event.py +0 -0
  52. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/admin.py +0 -0
  53. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/analytics.py +0 -0
  54. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/assistant.py +0 -0
  55. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/categories.py +0 -0
  56. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/codemie_guardrails.py +0 -0
  57. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/conversation.py +0 -0
  58. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/cost_center.py +0 -0
  59. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/customer_config_service.py +0 -0
  60. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/datasource.py +0 -0
  61. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/dynamic_config.py +0 -0
  62. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/files.py +0 -0
  63. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/integration.py +0 -0
  64. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/llm.py +0 -0
  65. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/mcp_configs.py +0 -0
  66. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/mermaid.py +0 -0
  67. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/project.py +0 -0
  68. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/project_budget_groups.py +0 -0
  69. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/task.py +0 -0
  70. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/user.py +0 -0
  71. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/vendor_assistant.py +0 -0
  72. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/vendor_guardrail.py +0 -0
  73. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/vendor_knowledgebase.py +0 -0
  74. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/vendor_runtime.py +0 -0
  75. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/vendor_workflow.py +0 -0
  76. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/webhook.py +0 -0
  77. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/workflow.py +0 -0
  78. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/workflow_execution.py +0 -0
  79. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/services/workflow_execution_state.py +0 -0
  80. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/utils/__init__.py +0 -0
  81. {codemie_sdk_python-0.1.689 → codemie_sdk_python-0.1.690}/src/codemie_sdk/utils/http.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: codemie-sdk-python
3
- Version: 0.1.689
3
+ Version: 0.1.690
4
4
  Summary: CodeMie SDK for Python
5
5
  Author: Vadym Vlasenko
6
6
  Author-email: vadym_vlasenko@epam.com
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "codemie-sdk-python"
3
- version = "0.1.689"
3
+ version = "0.1.690"
4
4
  description = "CodeMie SDK for Python"
5
5
  authors = [
6
6
  "Vadym Vlasenko <vadym_vlasenko@epam.com>",
@@ -18,6 +18,7 @@ from ..services.skill import SkillService
18
18
  from ..services.task import TaskService
19
19
  from ..services.user import UserService
20
20
  from ..services.workflow import WorkflowService
21
+ from ..services.workspace import WorkspaceService
21
22
  from ..services.files import FileOperationService
22
23
  from ..services.webhook import WebhookService
23
24
  from ..services.vendor_assistant import VendorAssistantService
@@ -185,6 +186,9 @@ class CodeMieClient:
185
186
  self.a2a = A2AService(
186
187
  self._api_domain, _token_source, verify_ssl=self._verify_ssl
187
188
  )
189
+ self.workspaces = WorkspaceService(
190
+ self._api_domain, _token_source, verify_ssl=self._verify_ssl
191
+ )
188
192
 
189
193
  @property
190
194
  def token(self) -> str:
@@ -45,6 +45,23 @@ class SkillBase(BaseModel):
45
45
  mcp_servers: list[MCPServerDetails] = Field(default_factory=list)
46
46
 
47
47
 
48
+ class SkillCompanionFileMetadata(BaseModel):
49
+ """Metadata of a companion (bundle) file stored alongside a skill."""
50
+
51
+ model_config = ConfigDict(extra="ignore")
52
+
53
+ path: str
54
+ mime_type: str = "text/plain"
55
+ encoding: str = "text"
56
+ size_bytes: int = 0
57
+
58
+
59
+ class SkillCompanionFilePayload(SkillCompanionFileMetadata):
60
+ """Companion file sent on skill create/update, or returned with its content."""
61
+
62
+ content: str
63
+
64
+
48
65
  class SkillListResponse(SkillBase):
49
66
  """Skill list item response."""
50
67
 
@@ -61,6 +78,8 @@ class SkillDetailResponse(SkillListResponse):
61
78
  content: str
62
79
  slug: str | None = None
63
80
  icon_url: str | None = Field(None, alias="iconUrl")
81
+ companion_files: list[SkillCompanionFileMetadata] = Field(default_factory=list)
82
+ bundle_warning: str | None = None
64
83
 
65
84
 
66
85
  class SkillCreateRequest(BaseModel):
@@ -74,6 +93,7 @@ class SkillCreateRequest(BaseModel):
74
93
  categories: list[str] | None = Field(default_factory=list)
75
94
  enabled_builtin_subagents: list[str] | None = None
76
95
  mcp_servers: list[MCPServerDetails] | None = Field(default_factory=list)
96
+ companion_files: list[SkillCompanionFilePayload] | None = None
77
97
 
78
98
 
79
99
  class SkillUpdateRequest(BaseModel):
@@ -87,6 +107,7 @@ class SkillUpdateRequest(BaseModel):
87
107
  categories: list[str] | None = None
88
108
  enabled_builtin_subagents: list[str] | None = None
89
109
  mcp_servers: list[MCPServerDetails] | None = None
110
+ companion_files: list[SkillCompanionFilePayload] | None = None
90
111
 
91
112
 
92
113
  class SkillImportRequest(BaseModel):
@@ -227,3 +248,6 @@ class SkillConfigResponse(BaseModel):
227
248
 
228
249
  max_content_length: int
229
250
  min_content_length: int
251
+ bundle_seed_max_file_count: int | None = None
252
+ bundle_seed_max_file_size_bytes: int | None = None
253
+ bundle_seed_max_total_size_bytes: int | None = None
@@ -0,0 +1,57 @@
1
+ """Models for agent workspace data structures."""
2
+
3
+ from pydantic import BaseModel, ConfigDict, Field
4
+
5
+
6
+ class Workspace(BaseModel):
7
+ """Agent workspace that belongs to one conversation (or workflow execution)."""
8
+
9
+ model_config = ConfigDict(extra="ignore")
10
+
11
+ id: str
12
+ conversation_id: str
13
+ user_id: str | None = None
14
+ name: str | None = None
15
+ status: str | None = None
16
+
17
+
18
+ class WorkspaceFileItem(BaseModel):
19
+ """One file listed in a workspace."""
20
+
21
+ model_config = ConfigDict(extra="ignore")
22
+
23
+ path: str
24
+ mime_type: str | None = None
25
+ checksum: str | None = None
26
+ size: int | None = None
27
+ version: int | None = None
28
+
29
+
30
+ class WorkspaceFileContent(WorkspaceFileItem):
31
+ """A workspace file with its content (text, or base64 for images)."""
32
+
33
+ is_binary: bool = False
34
+ content: str | None = None
35
+ content_encoding: str | None = None
36
+
37
+
38
+ class WorkspaceDeleteFileResponse(BaseModel):
39
+ """Result of deleting a workspace file."""
40
+
41
+ model_config = ConfigDict(extra="ignore")
42
+
43
+ message: str
44
+ deleted: bool
45
+
46
+
47
+ class ExecuteWorkspaceScriptResponse(BaseModel):
48
+ """Result of running a script stored in a workspace."""
49
+
50
+ model_config = ConfigDict(extra="ignore", populate_by_name=True)
51
+
52
+ message: str
53
+ output: str
54
+ workspace_files: list[WorkspaceFileItem] = Field(
55
+ default_factory=list, alias="workspaceFiles"
56
+ )
57
+ warnings: list[str] = Field(default_factory=list)
@@ -9,6 +9,8 @@ from ..models.skill import (
9
9
  SkillAttachRequest,
10
10
  SkillBulkAttachRequest,
11
11
  SkillCategory,
12
+ SkillCompanionFileMetadata,
13
+ SkillCompanionFilePayload,
12
14
  SkillConfigResponse,
13
15
  SkillCreateRequest,
14
16
  SkillDetailResponse,
@@ -116,6 +118,38 @@ class SkillService:
116
118
  """
117
119
  return self._api.delete(f"/v1/skills/{skill_id}", dict)
118
120
 
121
+ # Companion (bundle) files
122
+
123
+ def list_companion_files(self, skill_id: str) -> list[SkillCompanionFileMetadata]:
124
+ """List the metadata of a skill's bundled companion files.
125
+
126
+ Args:
127
+ skill_id: Skill identifier
128
+
129
+ Returns:
130
+ Companion file metadata (path, mime type, encoding, size), without content
131
+ """
132
+ return self._api.get(
133
+ f"/v1/skills/{skill_id}/companion-files",
134
+ list[SkillCompanionFileMetadata],
135
+ )
136
+
137
+ def get_companion_file(self, skill_id: str, path: str) -> SkillCompanionFilePayload:
138
+ """Get one companion file of a skill, with its content, by its relative path.
139
+
140
+ Args:
141
+ skill_id: Skill identifier
142
+ path: Relative companion file path, e.g. ``references/guide.md``
143
+
144
+ Returns:
145
+ The companion file including its stored content
146
+ """
147
+ return self._api.get(
148
+ f"/v1/skills/{skill_id}/companion-files/content",
149
+ SkillCompanionFilePayload,
150
+ params={"path": path},
151
+ )
152
+
119
153
  # Import/Export Operations
120
154
 
121
155
  def import_skill(self, request: SkillImportRequest) -> SkillDetailResponse:
@@ -391,10 +425,11 @@ class SkillService:
391
425
  )
392
426
 
393
427
  def get_config(self) -> SkillConfigResponse:
394
- """Get effective skill content-length limits.
428
+ """Get effective skill content-length and bundle-seed limits.
395
429
 
396
430
  Returns:
397
- Skill config with max_content_length and min_content_length
431
+ Skill config with max_content_length, min_content_length and the
432
+ bundle_seed_max_* ceilings applied when skill files are placed in a workspace
398
433
  """
399
434
  return self._api.get("/v1/skills/config", SkillConfigResponse)
400
435
 
@@ -0,0 +1,160 @@
1
+ """Agent workspace service implementation."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from ..models.workspace import (
6
+ ExecuteWorkspaceScriptResponse,
7
+ Workspace,
8
+ WorkspaceDeleteFileResponse,
9
+ WorkspaceFileContent,
10
+ WorkspaceFileItem,
11
+ )
12
+ from ..utils.http import ApiRequestHandler, TokenSource
13
+
14
+
15
+ class WorkspaceService:
16
+ """Service for the files of agent workspaces (one workspace per conversation)."""
17
+
18
+ def __init__(self, api_domain: str, token: TokenSource, verify_ssl: bool = True):
19
+ """Initialize the workspace service.
20
+
21
+ Args:
22
+ api_domain: Base URL for the CodeMie API
23
+ token: Authentication token
24
+ verify_ssl: Whether to verify SSL certificates. Default: True
25
+ """
26
+ self._api = ApiRequestHandler(api_domain, token, verify_ssl)
27
+
28
+ def create(self, conversation_id: str, name: str | None = None) -> Workspace:
29
+ """Create the workspace of a conversation, or return the existing one.
30
+
31
+ Args:
32
+ conversation_id: Conversation (or workflow execution) identifier
33
+ name: Optional display name
34
+
35
+ Returns:
36
+ The workspace of the conversation
37
+ """
38
+ return self._api.post(
39
+ "/v1/workspaces",
40
+ Workspace,
41
+ json_data={"conversation_id": conversation_id, "name": name},
42
+ )
43
+
44
+ def get_by_conversation(self, conversation_id: str) -> Workspace:
45
+ """Get the workspace of a conversation.
46
+
47
+ Args:
48
+ conversation_id: Conversation (or workflow execution) identifier
49
+
50
+ Returns:
51
+ The workspace of the conversation
52
+
53
+ Raises:
54
+ requests.HTTPError: 400 when the conversation has no workspace
55
+ """
56
+ return self._api.get(
57
+ f"/v1/workspaces/conversations/{conversation_id}", Workspace
58
+ )
59
+
60
+ def list_files(
61
+ self, workspace_id: str, glob: str | None = None
62
+ ) -> list[WorkspaceFileItem]:
63
+ """List the files of a workspace.
64
+
65
+ Args:
66
+ workspace_id: Workspace identifier
67
+ glob: Optional glob filter on the file path
68
+
69
+ Returns:
70
+ Files currently in the workspace (deleted files are not listed)
71
+ """
72
+ return self._api.get(
73
+ f"/v1/workspaces/{workspace_id}/files",
74
+ list[WorkspaceFileItem],
75
+ params={"glob": glob} if glob else None,
76
+ )
77
+
78
+ def write_file(
79
+ self, workspace_id: str, file_path: str, content: str
80
+ ) -> WorkspaceFileItem:
81
+ """Create or overwrite a text file in a workspace.
82
+
83
+ Args:
84
+ workspace_id: Workspace identifier
85
+ file_path: Workspace-relative path
86
+ content: UTF-8 text content
87
+
88
+ Returns:
89
+ The written file
90
+
91
+ Raises:
92
+ requests.HTTPError: 400 when the path is invalid or reserved
93
+ """
94
+ return self._api.put(
95
+ f"/v1/workspaces/{workspace_id}/files",
96
+ WorkspaceFileItem,
97
+ json_data={"file_path": file_path, "content": content},
98
+ )
99
+
100
+ def read_file(self, workspace_id: str, file_path: str) -> WorkspaceFileContent:
101
+ """Read a file of a workspace.
102
+
103
+ Args:
104
+ workspace_id: Workspace identifier
105
+ file_path: Workspace-relative path
106
+
107
+ Returns:
108
+ The file with its content
109
+
110
+ Raises:
111
+ requests.HTTPError: 400 when the file does not exist
112
+ """
113
+ return self._api.get(
114
+ f"/v1/workspaces/{workspace_id}/files/content",
115
+ WorkspaceFileContent,
116
+ params={"file_path": file_path},
117
+ )
118
+
119
+ def delete_file(
120
+ self, workspace_id: str, file_path: str
121
+ ) -> WorkspaceDeleteFileResponse:
122
+ """Delete a file from a workspace (the file stays deleted for later requests).
123
+
124
+ Args:
125
+ workspace_id: Workspace identifier
126
+ file_path: Workspace-relative path
127
+
128
+ Returns:
129
+ Whether a file was deleted
130
+
131
+ Raises:
132
+ requests.HTTPError: 400 when the path is invalid or reserved
133
+ """
134
+ return self._api.delete(
135
+ f"/v1/workspaces/{workspace_id}/files",
136
+ WorkspaceDeleteFileResponse,
137
+ params={"file_path": file_path},
138
+ )
139
+
140
+ def execute_script(
141
+ self,
142
+ workspace_id: str,
143
+ script_path: str,
144
+ export_files: list[str] | None = None,
145
+ ) -> ExecuteWorkspaceScriptResponse:
146
+ """Run a Python script stored in a workspace.
147
+
148
+ Args:
149
+ workspace_id: Workspace identifier
150
+ script_path: Workspace-relative path of the script
151
+ export_files: Optional workspace files to export from the run
152
+
153
+ Returns:
154
+ Script output, exported files and warnings about skipped workspace files
155
+ """
156
+ return self._api.post(
157
+ f"/v1/workspaces/{workspace_id}/execute",
158
+ ExecuteWorkspaceScriptResponse,
159
+ json_data={"script_path": script_path, "export_files": export_files},
160
+ )