codemie-sdk-python 0.1.314__tar.gz → 0.1.316__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 (55) hide show
  1. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/PKG-INFO +1 -1
  2. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/pyproject.toml +1 -1
  3. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/__init__.py +16 -0
  4. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/client/client.py +7 -0
  5. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/assistant.py +11 -1
  6. codemie_sdk_python-0.1.316/src/codemie_sdk/models/categories.py +71 -0
  7. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/conversation.py +4 -2
  8. codemie_sdk_python-0.1.316/src/codemie_sdk/services/categories.py +146 -0
  9. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/services/conversation.py +1 -1
  10. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/README.md +0 -0
  11. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/auth/__init__.py +0 -0
  12. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/auth/credentials.py +0 -0
  13. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/client/__init__.py +0 -0
  14. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/exceptions.py +0 -0
  15. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/__init__.py +0 -0
  16. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/admin.py +0 -0
  17. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/analytics.py +0 -0
  18. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/common.py +0 -0
  19. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/datasource.py +0 -0
  20. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/file_operation.py +0 -0
  21. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/guardrails.py +0 -0
  22. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/integration.py +0 -0
  23. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/llm.py +0 -0
  24. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/mermaid.py +0 -0
  25. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/task.py +0 -0
  26. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/user.py +0 -0
  27. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/vendor_assistant.py +0 -0
  28. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/vendor_guardrail.py +0 -0
  29. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/vendor_knowledgebase.py +0 -0
  30. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/vendor_workflow.py +0 -0
  31. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/workflow.py +0 -0
  32. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/workflow_execution_payload.py +0 -0
  33. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/workflow_state.py +0 -0
  34. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/models/workflow_thoughts.py +0 -0
  35. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/services/admin.py +0 -0
  36. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/services/analytics.py +0 -0
  37. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/services/assistant.py +0 -0
  38. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/services/codemie_guardrails.py +0 -0
  39. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/services/datasource.py +0 -0
  40. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/services/files.py +0 -0
  41. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/services/integration.py +0 -0
  42. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/services/llm.py +0 -0
  43. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/services/mermaid.py +0 -0
  44. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/services/task.py +0 -0
  45. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/services/user.py +0 -0
  46. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/services/vendor_assistant.py +0 -0
  47. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/services/vendor_guardrail.py +0 -0
  48. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/services/vendor_knowledgebase.py +0 -0
  49. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/services/vendor_workflow.py +0 -0
  50. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/services/webhook.py +0 -0
  51. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/services/workflow.py +0 -0
  52. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/services/workflow_execution.py +0 -0
  53. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/services/workflow_execution_state.py +0 -0
  54. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/src/codemie_sdk/utils/__init__.py +0 -0
  55. {codemie_sdk_python-0.1.314 → codemie_sdk_python-0.1.316}/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.314
3
+ Version: 0.1.316
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.314"
3
+ version = "0.1.316"
4
4
  description = "CodeMie SDK for Python"
5
5
  authors = [
6
6
  "Vadym Vlasenko <vadym_vlasenko@epam.com>",
@@ -107,6 +107,15 @@ from .models.mermaid import (
107
107
  ResponseType,
108
108
  )
109
109
  from .services.mermaid import MermaidService
110
+ from .models.categories import (
111
+ Category,
112
+ CategoryCreateRequest,
113
+ CategoryUpdateRequest,
114
+ CategoryResponse,
115
+ CategoryListResponse,
116
+ CategoryListMetadata,
117
+ )
118
+ from .services.categories import CategoryService
110
119
 
111
120
  __version__ = "0.2.12"
112
121
  __all__ = [
@@ -186,4 +195,11 @@ __all__ = [
186
195
  "ContentType",
187
196
  "ResponseType",
188
197
  "MermaidService",
198
+ "Category",
199
+ "CategoryCreateRequest",
200
+ "CategoryUpdateRequest",
201
+ "CategoryResponse",
202
+ "CategoryListResponse",
203
+ "CategoryListMetadata",
204
+ "CategoryService",
189
205
  ]
@@ -6,6 +6,7 @@ from ..auth.credentials import KeycloakCredentials
6
6
  from ..services.admin import AdminService
7
7
  from ..services.analytics import AnalyticsService
8
8
  from ..services.assistant import AssistantService
9
+ from ..services.categories import CategoryService
9
10
  from ..services.conversation import ConversationService
10
11
  from ..services.datasource import DatasourceService
11
12
  from ..services.llm import LLMService
@@ -80,6 +81,9 @@ class CodeMieClient:
80
81
  self.assistants = AssistantService(
81
82
  self._api_domain, self._token, verify_ssl=verify_ssl
82
83
  )
84
+ self.categories = CategoryService(
85
+ self._api_domain, self._token, verify_ssl=verify_ssl
86
+ )
83
87
  self.llms = LLMService(self._api_domain, self._token, verify_ssl=verify_ssl)
84
88
  self.mermaid = MermaidService(
85
89
  self._api_domain, self._token, verify_ssl=verify_ssl
@@ -151,6 +155,9 @@ class CodeMieClient:
151
155
  self.assistants = AssistantService(
152
156
  self._api_domain, self._token, verify_ssl=self._verify_ssl
153
157
  )
158
+ self.categories = CategoryService(
159
+ self._api_domain, self._token, verify_ssl=self._verify_ssl
160
+ )
154
161
  self.llms = LLMService(
155
162
  self._api_domain, self._token, verify_ssl=self._verify_ssl
156
163
  )
@@ -105,6 +105,13 @@ class MCPServerConfig(BaseModel):
105
105
  auth_token: Optional[str] = Field(
106
106
  None, description="Authentication token for the MCP-Connect server"
107
107
  )
108
+ single_usage: bool = Field(
109
+ False,
110
+ description="Whether this MCP server configuration is for single use only",
111
+ )
112
+ tools: Optional[list[str]] = Field(
113
+ None, description="List of tool names available in this MCP server"
114
+ )
108
115
 
109
116
 
110
117
  class MCPServerDetails(BaseModel):
@@ -113,14 +120,17 @@ class MCPServerDetails(BaseModel):
113
120
  name: str
114
121
  description: Optional[str]
115
122
  enabled: bool
123
+ mcp_config_id: Optional[str] = None
116
124
  config: Optional[MCPServerConfig] = None
117
125
  mcp_connect_url: Optional[str] = None
118
126
  tools_tokens_size_limit: Optional[int] = None
119
127
  command: Optional[str] = None
120
128
  arguments: Optional[str] = None
121
129
  settings: Optional[Integration] = None
122
- mcp_connect_auth_token: Optional[Integration] = None
123
130
  integration_alias: Optional[str] = None
131
+ mcp_connect_auth_token: Optional[Integration] = None
132
+ resolve_dynamic_values_in_arguments: bool = False
133
+ tools: Optional[list[str]] = None
124
134
 
125
135
 
126
136
  class SystemPromptHistory(BaseModel):
@@ -0,0 +1,71 @@
1
+ """Models for category-related data structures."""
2
+
3
+ from typing import List, Optional
4
+
5
+ from pydantic import BaseModel, Field, ConfigDict
6
+
7
+
8
+ class Category(BaseModel):
9
+ """Model for assistant category."""
10
+
11
+ model_config = ConfigDict(extra="ignore")
12
+
13
+ id: str = Field(..., description="Category ID")
14
+ name: str = Field(..., description="Category display name")
15
+ description: Optional[str] = Field(None, description="Category description")
16
+
17
+
18
+ class CategoryCreateRequest(BaseModel):
19
+ """Model for creating a new category."""
20
+
21
+ model_config = ConfigDict(extra="ignore")
22
+
23
+ name: str = Field(..., description="Category name")
24
+ description: Optional[str] = Field(None, description="Category description")
25
+
26
+
27
+ class CategoryUpdateRequest(BaseModel):
28
+ """Model for updating an existing category."""
29
+
30
+ model_config = ConfigDict(extra="ignore")
31
+
32
+ name: str = Field(..., description="Category name")
33
+ description: Optional[str] = Field(None, description="Category description")
34
+
35
+
36
+ class CategoryResponse(BaseModel):
37
+ """Model for category response with assistant counts."""
38
+
39
+ model_config = ConfigDict(extra="ignore")
40
+
41
+ id: str = Field(..., description="Category ID")
42
+ name: str = Field(..., description="Category name")
43
+ description: Optional[str] = Field(None, description="Category description")
44
+ marketplace_count: int = Field(
45
+ default=0, description="Number of marketplace assistants in this category"
46
+ )
47
+ project_count: int = Field(
48
+ default=0, description="Number of project assistants in this category"
49
+ )
50
+
51
+
52
+ class CategoryListMetadata(BaseModel):
53
+ """Metadata for paginated category list response."""
54
+
55
+ model_config = ConfigDict(extra="ignore")
56
+
57
+ page: int = Field(..., description="Current page number (0-indexed)")
58
+ per_page: int = Field(..., description="Items per page")
59
+ total: int = Field(..., description="Total number of categories")
60
+ total_pages: int = Field(..., description="Total number of pages")
61
+
62
+
63
+ class CategoryListResponse(BaseModel):
64
+ """Model for paginated category list response."""
65
+
66
+ model_config = ConfigDict(extra="ignore")
67
+
68
+ items: List[CategoryResponse] = Field(
69
+ default_factory=list, description="List of categories with counts"
70
+ )
71
+ metadata: CategoryListMetadata = Field(..., description="Pagination metadata")
@@ -83,7 +83,7 @@ class HistoryItem(BaseModel):
83
83
  fileNames: List[str]
84
84
  assistantId: Optional[str] = None
85
85
  thoughts: Optional[List[Thought]] = Field(default_factory=list)
86
- workflowExecutionRef: Optional[str] = None
86
+ workflowExecutionRef: Optional[Union[str, bool]] = None
87
87
  executionId: Optional[str] = None
88
88
 
89
89
 
@@ -144,7 +144,9 @@ class ConversationCreateRequest(BaseModel):
144
144
  initial_assistant_id: Optional[str] = None
145
145
  folder: Optional[str] = None
146
146
  mcp_server_single_usage: Optional[bool] = False
147
- is_workflow: Optional[bool] = None
147
+ is_workflow_conversation: Optional[bool] = Field(
148
+ default=None, serialization_alias="is_workflow"
149
+ )
148
150
 
149
151
 
150
152
  class ConversationDetails(BaseModel):
@@ -0,0 +1,146 @@
1
+ """Category service implementation."""
2
+
3
+ from typing import List
4
+
5
+ from ..models.categories import (
6
+ Category,
7
+ CategoryCreateRequest,
8
+ CategoryUpdateRequest,
9
+ CategoryResponse,
10
+ CategoryListResponse,
11
+ )
12
+ from ..utils import ApiRequestHandler
13
+
14
+
15
+ class CategoryService:
16
+ """Service for managing CodeMie assistant categories."""
17
+
18
+ def __init__(self, api_domain: str, token: str, verify_ssl: bool = True):
19
+ """Initialize the category 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
25
+ """
26
+ self._api = ApiRequestHandler(api_domain, token, verify_ssl)
27
+
28
+ def get_categories(self) -> List[Category]:
29
+ """Get all available assistant categories (legacy, non-paginated).
30
+
31
+ This endpoint maintains backward compatibility with existing clients.
32
+ For paginated access with assistant counts, use list_categories().
33
+
34
+ Returns:
35
+ List of all categories
36
+ """
37
+ return self._api.get("/v1/assistants/categories", List[Category])
38
+
39
+ def list_categories(
40
+ self, page: int = 0, per_page: int = 10
41
+ ) -> CategoryListResponse:
42
+ """Get paginated list of categories with assistant counts.
43
+
44
+ Returns counts separated by marketplace vs project assistants.
45
+ This is the preferred endpoint for admin UI with pagination support.
46
+
47
+ Args:
48
+ page: Page number (0-indexed, default: 0)
49
+ per_page: Number of items per page (1-100, default: 10)
50
+
51
+ Returns:
52
+ Paginated response with categories and metadata
53
+ """
54
+ params = {"page": page, "per_page": per_page}
55
+ return self._api.get(
56
+ "/v1/assistants/categories/list", CategoryListResponse, params=params
57
+ )
58
+
59
+ def get_category(self, category_id: str) -> CategoryResponse:
60
+ """Get a specific category by ID with assistant counts.
61
+
62
+ Args:
63
+ category_id: Category ID (humanized, e.g., "migration_modernization")
64
+
65
+ Returns:
66
+ Category details with assistant counts
67
+
68
+ Raises:
69
+ NotFoundError: Category not found
70
+ """
71
+ return self._api.get(
72
+ f"/v1/assistants/categories/{category_id}", CategoryResponse
73
+ )
74
+
75
+ def create_category(self, request: CategoryCreateRequest) -> CategoryResponse:
76
+ """Create a new category. Admin access required.
77
+
78
+ The category ID will be auto-generated from the name using humanization logic:
79
+ - Special characters are removed
80
+ - Spaces are replaced with underscores
81
+ - All text is lowercased
82
+
83
+ Example: "Migration & Modernization" → "migration_modernization"
84
+
85
+ Args:
86
+ request: Category creation request with name and description
87
+
88
+ Returns:
89
+ Created category with assistant counts (will be 0 for new categories)
90
+
91
+ Raises:
92
+ ApiError: Invalid request data or duplicate category ID (400)
93
+ ApiError: User is not an admin (403)
94
+ """
95
+ return self._api.post(
96
+ "/v1/assistants/categories",
97
+ CategoryResponse,
98
+ json_data=request.model_dump(exclude_none=True),
99
+ )
100
+
101
+ def update_category(
102
+ self, category_id: str, request: CategoryUpdateRequest
103
+ ) -> CategoryResponse:
104
+ """Update an existing category. Admin access required.
105
+
106
+ If assistants are assigned to this category, the operation will succeed
107
+ but the response will include the count of affected assistants.
108
+ The frontend should display a warning to the admin when editing categories
109
+ with assigned assistants.
110
+
111
+ Args:
112
+ category_id: Category ID to update
113
+ request: Category update request with new name and description
114
+
115
+ Returns:
116
+ Updated category with current assistant counts
117
+
118
+ Raises:
119
+ ApiError: User is not an admin (403)
120
+ NotFoundError: Category not found (404)
121
+ """
122
+ return self._api.put(
123
+ f"/v1/assistants/categories/{category_id}",
124
+ CategoryResponse,
125
+ json_data=request.model_dump(exclude_none=True),
126
+ )
127
+
128
+ def delete_category(self, category_id: str) -> dict:
129
+ """Delete a category. Admin access required.
130
+
131
+ This operation will fail with a 409 Conflict error if any assistants
132
+ (marketplace or project) are assigned to this category.
133
+ The admin must first remove all assistants from the category before deletion.
134
+
135
+ Args:
136
+ category_id: Category ID to delete
137
+
138
+ Returns:
139
+ Empty dict on successful deletion (204 No Content)
140
+
141
+ Raises:
142
+ ApiError: User is not an admin (403)
143
+ NotFoundError: Category not found (404)
144
+ ApiError: Category has assigned assistants and cannot be deleted (409)
145
+ """
146
+ return self._api.delete(f"/v1/assistants/categories/{category_id}", dict)
@@ -84,7 +84,7 @@ class ConversationService:
84
84
  return self._api.post(
85
85
  "/v1/conversations",
86
86
  dict,
87
- json_data=request.model_dump(exclude_none=True),
87
+ json_data=request.model_dump(exclude_none=True, by_alias=True),
88
88
  )
89
89
 
90
90
  def chat(