codemie-sdk-python 0.1.339__tar.gz → 0.1.341__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.
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/PKG-INFO +1 -1
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/pyproject.toml +1 -1
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/assistant.py +19 -1
- codemie_sdk_python-0.1.341/src/codemie_sdk/models/errors.py +336 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/README.md +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/__init__.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/auth/__init__.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/auth/credentials.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/client/__init__.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/client/client.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/exceptions.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/__init__.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/admin.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/analytics.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/categories.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/common.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/conversation.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/datasource.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/file_operation.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/guardrails.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/integration.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/llm.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/mermaid.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/task.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/user.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/vendor_assistant.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/vendor_guardrail.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/vendor_knowledgebase.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/vendor_workflow.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/workflow.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/workflow_execution_payload.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/workflow_state.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/workflow_thoughts.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/admin.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/analytics.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/assistant.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/categories.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/codemie_guardrails.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/conversation.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/datasource.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/files.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/integration.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/llm.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/mermaid.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/task.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/user.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/vendor_assistant.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/vendor_guardrail.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/vendor_knowledgebase.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/vendor_workflow.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/webhook.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/workflow.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/workflow_execution.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/workflow_execution_state.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/utils/__init__.py +0 -0
- {codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/utils/http.py +0 -0
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/assistant.py
RENAMED
|
@@ -9,6 +9,7 @@ from pydantic import BaseModel, Field, ConfigDict, model_validator
|
|
|
9
9
|
|
|
10
10
|
from .common import User
|
|
11
11
|
from .integration import Integration
|
|
12
|
+
from .errors import AgentErrorDetails, ToolErrorDetails
|
|
12
13
|
|
|
13
14
|
|
|
14
15
|
class ToolDetails(BaseModel):
|
|
@@ -456,7 +457,12 @@ class AssistantChatRequest(BaseModel):
|
|
|
456
457
|
|
|
457
458
|
|
|
458
459
|
class BaseModelResponse(BaseModel):
|
|
459
|
-
"""
|
|
460
|
+
"""
|
|
461
|
+
Model for chat response from assistant.
|
|
462
|
+
|
|
463
|
+
Error fields expose agent and tool errors without breaking backward
|
|
464
|
+
compatibility (all error fields default to None).
|
|
465
|
+
"""
|
|
460
466
|
|
|
461
467
|
generated: str | dict | BaseModel = Field(
|
|
462
468
|
description="Generated response. If output_schema in request is specified, corresponds with its type"
|
|
@@ -473,6 +479,18 @@ class BaseModelResponse(BaseModel):
|
|
|
473
479
|
task_id: Optional[str] = Field(
|
|
474
480
|
default=None, alias="taskId", description="Background task identifier"
|
|
475
481
|
)
|
|
482
|
+
# Error handling fields
|
|
483
|
+
success: bool = Field(
|
|
484
|
+
default=True, description="Whether the agent execution was successful"
|
|
485
|
+
)
|
|
486
|
+
agent_error: Optional["AgentErrorDetails"] = Field(
|
|
487
|
+
default=None,
|
|
488
|
+
alias="agentError",
|
|
489
|
+
description="Agent-level error details (callbacks, timeouts, etc.)",
|
|
490
|
+
)
|
|
491
|
+
tool_errors: Optional[List["ToolErrorDetails"]] = Field(
|
|
492
|
+
default=None, alias="toolErrors", description="Tool execution error details"
|
|
493
|
+
)
|
|
476
494
|
|
|
477
495
|
class Config:
|
|
478
496
|
# Allow population by field name as well as alias
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error models for structured error handling in CodeMie SDK responses.
|
|
3
|
+
|
|
4
|
+
This module provides error classification and structured error details that match
|
|
5
|
+
the CodeMie API error response format, enabling proper error handling without
|
|
6
|
+
parsing error messages.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from enum import Enum
|
|
10
|
+
from typing import Any, Optional
|
|
11
|
+
|
|
12
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ErrorCategory(str, Enum):
|
|
16
|
+
"""
|
|
17
|
+
High-level categorization of errors in the CodeMie system.
|
|
18
|
+
|
|
19
|
+
Separates errors by their source to enable proper handling and debugging.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
AGENT = "agent" # Agent-level errors (execution, callbacks, etc.)
|
|
23
|
+
TOOL = "tool" # Tool execution errors (HTTP errors, timeouts, etc.)
|
|
24
|
+
LLM = "llm" # LLM provider errors (rate limits, content policy, etc.)
|
|
25
|
+
VALIDATION = "validation" # Input/output validation errors
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ErrorCode(str, Enum):
|
|
29
|
+
"""
|
|
30
|
+
Specific error codes for detailed error classification.
|
|
31
|
+
|
|
32
|
+
These codes enable clients to programmatically handle different error scenarios
|
|
33
|
+
without parsing error messages.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
# Agent errors - internal execution issues
|
|
37
|
+
AGENT_TIMEOUT = "agent_timeout"
|
|
38
|
+
AGENT_TOKEN_LIMIT = "agent_token_limit"
|
|
39
|
+
AGENT_BUDGET_EXCEEDED = "agent_budget_exceeded"
|
|
40
|
+
AGENT_CALLBACK_FAILURE = "agent_callback_failure"
|
|
41
|
+
AGENT_NETWORK_ERROR = "agent_network_error"
|
|
42
|
+
AGENT_CONFIGURATION_ERROR = "agent_configuration_error"
|
|
43
|
+
AGENT_INTERNAL_ERROR = "agent_internal_error"
|
|
44
|
+
|
|
45
|
+
# Tool errors - external service/integration errors
|
|
46
|
+
TOOL_AUTHENTICATION = "tool_authentication" # 401 Unauthorized
|
|
47
|
+
TOOL_AUTHORIZATION = "tool_authorization" # 403 Forbidden
|
|
48
|
+
TOOL_NOT_FOUND = "tool_not_found" # 404 Not Found
|
|
49
|
+
TOOL_CONFLICT = "tool_conflict" # 409 Conflict
|
|
50
|
+
TOOL_RATE_LIMITED = "tool_rate_limited" # 429 Too Many Requests
|
|
51
|
+
TOOL_SERVER_ERROR = "tool_server_error" # 5xx Server Error
|
|
52
|
+
TOOL_TIMEOUT = "tool_timeout"
|
|
53
|
+
TOOL_VALIDATION = "tool_validation" # Invalid tool input
|
|
54
|
+
TOOL_NETWORK_ERROR = "tool_network_error"
|
|
55
|
+
TOOL_EXECUTION_FAILED = "tool_execution_failed" # Generic tool failure
|
|
56
|
+
|
|
57
|
+
# LLM errors - provider-specific errors
|
|
58
|
+
LLM_CONTENT_POLICY = "llm_content_policy"
|
|
59
|
+
LLM_CONTEXT_LENGTH = "llm_context_length"
|
|
60
|
+
LLM_UNAVAILABLE = "llm_unavailable"
|
|
61
|
+
LLM_RATE_LIMITED = "llm_rate_limited"
|
|
62
|
+
LLM_INVALID_REQUEST = "llm_invalid_request"
|
|
63
|
+
|
|
64
|
+
# Validation errors - input/output validation
|
|
65
|
+
VALIDATION_INPUT = "validation_input"
|
|
66
|
+
VALIDATION_OUTPUT = "validation_output"
|
|
67
|
+
VALIDATION_SCHEMA = "validation_schema"
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class ErrorDetailLevel(str, Enum):
|
|
71
|
+
"""
|
|
72
|
+
Error verbosity level for API responses.
|
|
73
|
+
|
|
74
|
+
Controls how much detail is included in tool error responses:
|
|
75
|
+
- MINIMAL: Only error code and message (for production clients)
|
|
76
|
+
- STANDARD: Adds HTTP status and tool_call_id (default, for debugging)
|
|
77
|
+
- FULL: Includes all details including timestamp (for development)
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
MINIMAL = "minimal"
|
|
81
|
+
STANDARD = "standard"
|
|
82
|
+
FULL = "full"
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class ToolErrorDetails(BaseModel):
|
|
86
|
+
"""
|
|
87
|
+
Structured details for a tool execution error.
|
|
88
|
+
|
|
89
|
+
Captures comprehensive information about tool failures to enable proper
|
|
90
|
+
debugging and error handling without relying on the LLM to interpret errors.
|
|
91
|
+
|
|
92
|
+
Attributes:
|
|
93
|
+
tool_name: Name of the tool that failed
|
|
94
|
+
tool_call_id: Unique identifier for this tool invocation
|
|
95
|
+
error_code: Classified error code for programmatic handling
|
|
96
|
+
message: Human-readable error message
|
|
97
|
+
http_status: HTTP status code if applicable (401, 403, 404, 5xx, etc.)
|
|
98
|
+
details: Additional error context (integration name, action, etc.)
|
|
99
|
+
timestamp: ISO 8601 timestamp of when error occurred
|
|
100
|
+
"""
|
|
101
|
+
|
|
102
|
+
model_config = ConfigDict(extra="ignore", use_enum_values=True)
|
|
103
|
+
|
|
104
|
+
tool_name: str = Field(
|
|
105
|
+
..., description="Name of the tool that encountered an error"
|
|
106
|
+
)
|
|
107
|
+
tool_call_id: Optional[str] = Field(
|
|
108
|
+
None, description="Unique identifier for the tool call"
|
|
109
|
+
)
|
|
110
|
+
error_code: ErrorCode = Field(..., description="Classified error code")
|
|
111
|
+
message: str = Field(..., description="Human-readable error message")
|
|
112
|
+
http_status: Optional[int] = Field(
|
|
113
|
+
None, description="HTTP status code if applicable"
|
|
114
|
+
)
|
|
115
|
+
details: Optional[dict[str, Any]] = Field(
|
|
116
|
+
None, description="Additional error context"
|
|
117
|
+
)
|
|
118
|
+
timestamp: str = Field(..., description="ISO 8601 timestamp")
|
|
119
|
+
|
|
120
|
+
def to_minimal(self) -> dict[str, Any]:
|
|
121
|
+
"""Return minimal error info (code + message only)."""
|
|
122
|
+
return {
|
|
123
|
+
"tool_name": self.tool_name,
|
|
124
|
+
"error_code": self.error_code.value
|
|
125
|
+
if isinstance(self.error_code, ErrorCode)
|
|
126
|
+
else self.error_code,
|
|
127
|
+
"message": self.message,
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
def to_standard(self) -> dict[str, Any]:
|
|
131
|
+
"""Return standard error info (+ http_status, tool_call_id)."""
|
|
132
|
+
return {
|
|
133
|
+
"tool_name": self.tool_name,
|
|
134
|
+
"tool_call_id": self.tool_call_id,
|
|
135
|
+
"error_code": self.error_code.value
|
|
136
|
+
if isinstance(self.error_code, ErrorCode)
|
|
137
|
+
else self.error_code,
|
|
138
|
+
"message": self.message,
|
|
139
|
+
"http_status": self.http_status,
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
def to_full(self) -> dict[str, Any]:
|
|
143
|
+
"""Return full error info (all fields)."""
|
|
144
|
+
return self.model_dump(mode="json")
|
|
145
|
+
|
|
146
|
+
def format_for_level(self, level: "ErrorDetailLevel") -> dict[str, Any]:
|
|
147
|
+
"""Format error details based on verbosity level."""
|
|
148
|
+
if level == ErrorDetailLevel.MINIMAL:
|
|
149
|
+
return self.to_minimal()
|
|
150
|
+
elif level == ErrorDetailLevel.STANDARD:
|
|
151
|
+
return self.to_standard()
|
|
152
|
+
else:
|
|
153
|
+
return self.to_full()
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
class AgentErrorDetails(BaseModel):
|
|
157
|
+
"""
|
|
158
|
+
Structured details for an agent-level error.
|
|
159
|
+
|
|
160
|
+
Captures agent execution failures that are not related to specific tools,
|
|
161
|
+
such as token limits, budget constraints, or internal errors.
|
|
162
|
+
|
|
163
|
+
Attributes:
|
|
164
|
+
error_code: Classified error code for programmatic handling
|
|
165
|
+
message: Human-readable error message
|
|
166
|
+
details: Additional error context
|
|
167
|
+
stacktrace: Full stacktrace for debugging (only in debug mode)
|
|
168
|
+
"""
|
|
169
|
+
|
|
170
|
+
model_config = ConfigDict(extra="ignore", use_enum_values=True)
|
|
171
|
+
|
|
172
|
+
error_code: ErrorCode = Field(..., description="Classified error code")
|
|
173
|
+
message: str = Field(..., description="Human-readable error message")
|
|
174
|
+
details: Optional[dict[str, Any]] = Field(
|
|
175
|
+
None, description="Additional error context"
|
|
176
|
+
)
|
|
177
|
+
stacktrace: Optional[str] = Field(
|
|
178
|
+
None,
|
|
179
|
+
description="Full stacktrace for debugging (only in debug/full error mode)",
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
class ErrorResponse(BaseModel):
|
|
184
|
+
"""
|
|
185
|
+
Complete error response with separated agent and tool errors.
|
|
186
|
+
|
|
187
|
+
This structure ensures that errors from different sources are clearly
|
|
188
|
+
distinguished and not absorbed by the LLM's response text.
|
|
189
|
+
|
|
190
|
+
Attributes:
|
|
191
|
+
category: High-level error category
|
|
192
|
+
agent_error: Agent-level error details (if applicable)
|
|
193
|
+
tool_errors: List of tool errors (multiple tools can fail)
|
|
194
|
+
is_recoverable: Whether the error can be retried or recovered from
|
|
195
|
+
"""
|
|
196
|
+
|
|
197
|
+
model_config = ConfigDict(extra="ignore", use_enum_values=True)
|
|
198
|
+
|
|
199
|
+
category: ErrorCategory = Field(..., description="High-level error category")
|
|
200
|
+
agent_error: Optional[AgentErrorDetails] = Field(
|
|
201
|
+
None, description="Agent-level error details"
|
|
202
|
+
)
|
|
203
|
+
tool_errors: Optional[list[ToolErrorDetails]] = Field(
|
|
204
|
+
None, description="Tool error details"
|
|
205
|
+
)
|
|
206
|
+
is_recoverable: bool = Field(False, description="Whether the error is recoverable")
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
# HTTP status code to error code mapping
|
|
210
|
+
HTTP_STATUS_TO_ERROR_CODE: dict[int, ErrorCode] = {
|
|
211
|
+
# Client errors (4xx)
|
|
212
|
+
401: ErrorCode.TOOL_AUTHENTICATION,
|
|
213
|
+
403: ErrorCode.TOOL_AUTHORIZATION,
|
|
214
|
+
404: ErrorCode.TOOL_NOT_FOUND,
|
|
215
|
+
409: ErrorCode.TOOL_CONFLICT,
|
|
216
|
+
429: ErrorCode.TOOL_RATE_LIMITED,
|
|
217
|
+
# Server errors (5xx)
|
|
218
|
+
500: ErrorCode.TOOL_SERVER_ERROR,
|
|
219
|
+
501: ErrorCode.TOOL_SERVER_ERROR,
|
|
220
|
+
502: ErrorCode.TOOL_SERVER_ERROR,
|
|
221
|
+
503: ErrorCode.TOOL_SERVER_ERROR,
|
|
222
|
+
504: ErrorCode.TOOL_SERVER_ERROR,
|
|
223
|
+
505: ErrorCode.TOOL_SERVER_ERROR,
|
|
224
|
+
506: ErrorCode.TOOL_SERVER_ERROR,
|
|
225
|
+
507: ErrorCode.TOOL_SERVER_ERROR,
|
|
226
|
+
508: ErrorCode.TOOL_SERVER_ERROR,
|
|
227
|
+
509: ErrorCode.TOOL_SERVER_ERROR,
|
|
228
|
+
510: ErrorCode.TOOL_SERVER_ERROR,
|
|
229
|
+
511: ErrorCode.TOOL_SERVER_ERROR,
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
# Error message keywords to error code mapping
|
|
234
|
+
ERROR_MESSAGE_PATTERNS: dict[str, ErrorCode] = {
|
|
235
|
+
"timeout": ErrorCode.TOOL_TIMEOUT,
|
|
236
|
+
"network": ErrorCode.TOOL_NETWORK_ERROR,
|
|
237
|
+
"connection": ErrorCode.TOOL_NETWORK_ERROR,
|
|
238
|
+
"validation": ErrorCode.TOOL_VALIDATION,
|
|
239
|
+
"invalid": ErrorCode.TOOL_VALIDATION,
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def _classify_by_http_status(status_code: int) -> ErrorCode:
|
|
244
|
+
"""
|
|
245
|
+
Classify error based on HTTP status code only.
|
|
246
|
+
|
|
247
|
+
Uses dictionary mapping for efficient lookup of common HTTP status codes.
|
|
248
|
+
This is the primary classification method - message-based classification is only
|
|
249
|
+
used as a fallback when status code classification yields a generic result.
|
|
250
|
+
|
|
251
|
+
Args:
|
|
252
|
+
status_code: HTTP status code
|
|
253
|
+
|
|
254
|
+
Returns:
|
|
255
|
+
ErrorCode enum value corresponding to the status code
|
|
256
|
+
"""
|
|
257
|
+
# Try direct lookup first
|
|
258
|
+
if status_code in HTTP_STATUS_TO_ERROR_CODE:
|
|
259
|
+
return HTTP_STATUS_TO_ERROR_CODE[status_code]
|
|
260
|
+
|
|
261
|
+
# Fallback for any 5xx not in the dict
|
|
262
|
+
if 500 <= status_code < 600:
|
|
263
|
+
return ErrorCode.TOOL_SERVER_ERROR
|
|
264
|
+
|
|
265
|
+
# Default for unknown status codes
|
|
266
|
+
return ErrorCode.TOOL_EXECUTION_FAILED
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def _classify_by_message(error_message: str) -> ErrorCode:
|
|
270
|
+
"""
|
|
271
|
+
Classify error based on error message content.
|
|
272
|
+
|
|
273
|
+
Checks for keywords in the error message to determine error type.
|
|
274
|
+
|
|
275
|
+
Args:
|
|
276
|
+
error_message: Error message text
|
|
277
|
+
|
|
278
|
+
Returns:
|
|
279
|
+
ErrorCode enum value based on message content
|
|
280
|
+
"""
|
|
281
|
+
error_lower = error_message.lower()
|
|
282
|
+
|
|
283
|
+
# Check each pattern
|
|
284
|
+
for keyword, error_code in ERROR_MESSAGE_PATTERNS.items():
|
|
285
|
+
if keyword in error_lower:
|
|
286
|
+
return error_code
|
|
287
|
+
|
|
288
|
+
# Default for unrecognized error messages
|
|
289
|
+
return ErrorCode.TOOL_EXECUTION_FAILED
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def classify_http_error(status_code: int, error_message: str = "") -> ErrorCode:
|
|
293
|
+
"""
|
|
294
|
+
Classify HTTP status codes into appropriate ErrorCode values.
|
|
295
|
+
|
|
296
|
+
Uses a two-stage classification approach:
|
|
297
|
+
1. Primary: Classification by HTTP status code using dictionary mapping
|
|
298
|
+
2. Fallback: If status yields generic result, analyze error message content
|
|
299
|
+
|
|
300
|
+
Args:
|
|
301
|
+
status_code: HTTP status code
|
|
302
|
+
error_message: Optional error message for additional context
|
|
303
|
+
|
|
304
|
+
Returns:
|
|
305
|
+
ErrorCode enum value corresponding to the status code or message
|
|
306
|
+
"""
|
|
307
|
+
# First, try classification by HTTP status
|
|
308
|
+
error_code = _classify_by_http_status(status_code)
|
|
309
|
+
|
|
310
|
+
# If we got a generic error and have a message, try message-based classification
|
|
311
|
+
if error_code == ErrorCode.TOOL_EXECUTION_FAILED and error_message:
|
|
312
|
+
error_code = _classify_by_message(error_message)
|
|
313
|
+
|
|
314
|
+
return error_code
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
def is_recoverable_error(error_code: ErrorCode) -> bool:
|
|
318
|
+
"""
|
|
319
|
+
Determine if an error is recoverable (can be retried).
|
|
320
|
+
|
|
321
|
+
Args:
|
|
322
|
+
error_code: Error code to check
|
|
323
|
+
|
|
324
|
+
Returns:
|
|
325
|
+
True if the error can be retried, False otherwise
|
|
326
|
+
"""
|
|
327
|
+
recoverable_errors = {
|
|
328
|
+
ErrorCode.TOOL_TIMEOUT,
|
|
329
|
+
ErrorCode.TOOL_RATE_LIMITED,
|
|
330
|
+
ErrorCode.TOOL_SERVER_ERROR,
|
|
331
|
+
ErrorCode.TOOL_NETWORK_ERROR,
|
|
332
|
+
ErrorCode.AGENT_NETWORK_ERROR,
|
|
333
|
+
ErrorCode.LLM_RATE_LIMITED,
|
|
334
|
+
ErrorCode.LLM_UNAVAILABLE,
|
|
335
|
+
}
|
|
336
|
+
return error_code in recoverable_errors
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/auth/credentials.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/client/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/analytics.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/categories.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/conversation.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/datasource.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/file_operation.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/guardrails.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/integration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/vendor_assistant.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/vendor_guardrail.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/vendor_workflow.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/workflow.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/models/workflow_state.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/analytics.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/assistant.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/categories.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/conversation.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/datasource.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/integration.py
RENAMED
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/mermaid.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/webhook.py
RENAMED
|
File without changes
|
{codemie_sdk_python-0.1.339 → codemie_sdk_python-0.1.341}/src/codemie_sdk/services/workflow.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|