249 lines
5.9 KiB
Markdown
249 lines
5.9 KiB
Markdown
# Exceptions
|
|
|
|
The SDK provides specific exceptions for different error types. All exceptions inherit from the base `FastGPTError`.
|
|
|
|
## Exception Hierarchy
|
|
|
|
```
|
|
FastGPTError
|
|
├── APIError
|
|
├── AuthenticationError
|
|
├── RateLimitError
|
|
├── ValidationError
|
|
└── StreamParseError
|
|
```
|
|
|
|
## Exception Types
|
|
|
|
### FastGPTError
|
|
|
|
Base exception class for all FastGPT SDK errors.
|
|
|
|
```python
|
|
from fastgpt_client.exceptions import FastGPTError
|
|
|
|
try:
|
|
# SDK operation
|
|
pass
|
|
except FastGPTError as e:
|
|
print(f"FastGPT error: {e}")
|
|
```
|
|
|
|
---
|
|
|
|
### APIError
|
|
|
|
General API error for 4xx and 5xx responses that don't have a specific exception type.
|
|
|
|
```python
|
|
from fastgpt_client.exceptions import APIError
|
|
|
|
try:
|
|
response = client.create_chat_completion(...)
|
|
except APIError as e:
|
|
print(f"API error: {e.message}")
|
|
print(f"Status code: {e.status_code}")
|
|
print(f"Response data: {e.response_data}")
|
|
```
|
|
|
|
**Attributes:**
|
|
|
|
| Attribute | Type | Description |
|
|
|-----------|------|-------------|
|
|
| `message` | `str` | Error message |
|
|
| `status_code` | `int` | HTTP status code |
|
|
| `response_data` | `dict | None` | Full error response data |
|
|
|
|
---
|
|
|
|
### AuthenticationError
|
|
|
|
Raised when authentication fails (401 status code).
|
|
|
|
```python
|
|
from fastgpt_client.exceptions import AuthenticationError
|
|
|
|
try:
|
|
response = client.create_chat_completion(...)
|
|
except AuthenticationError as e:
|
|
print(f"Authentication failed: {e.message}")
|
|
print("Please check your API key")
|
|
```
|
|
|
|
**Common Causes:**
|
|
|
|
- Invalid API key
|
|
- Missing API key
|
|
- Expired API key
|
|
- API key format incorrect
|
|
|
|
---
|
|
|
|
### RateLimitError
|
|
|
|
Raised when rate limit is exceeded (429 status code).
|
|
|
|
```python
|
|
from fastgpt_client.exceptions import RateLimitError
|
|
|
|
try:
|
|
response = client.create_chat_completion(...)
|
|
except RateLimitError as e:
|
|
print(f"Rate limit exceeded: {e.message}")
|
|
if e.retry_after:
|
|
print(f"Retry after {e.retry_after} seconds")
|
|
```
|
|
|
|
**Attributes:**
|
|
|
|
| Attribute | Type | Description |
|
|
|-----------|------|-------------|
|
|
| `message` | `str` | Error message |
|
|
| `retry_after` | `str | None` | Suggested retry delay (from `Retry-After` header) |
|
|
| `status_code` | `int` | HTTP status code (429) |
|
|
| `response_data` | `dict | None` | Full error response data |
|
|
|
|
---
|
|
|
|
### ValidationError
|
|
|
|
Raised when request validation fails (422 status code).
|
|
|
|
```python
|
|
from fastgpt_client.exceptions import ValidationError
|
|
|
|
try:
|
|
response = client.create_chat_completion(
|
|
messages=[{"role": "user", "content": "Hello"}],
|
|
invalid_param="value"
|
|
)
|
|
except ValidationError as e:
|
|
print(f"Validation error: {e.message}")
|
|
print(f"Response data: {e.response_data}")
|
|
```
|
|
|
|
**Common Causes:**
|
|
|
|
- Invalid parameter values
|
|
- Missing required parameters
|
|
- Incorrect parameter types
|
|
- Invalid message format
|
|
|
|
---
|
|
|
|
### StreamParseError
|
|
|
|
Raised when parsing streaming responses fails.
|
|
|
|
```python
|
|
from fastgpt_client.exceptions import StreamParseError
|
|
|
|
try:
|
|
for line in response.iter_lines():
|
|
# Parse streaming data
|
|
pass
|
|
except StreamParseError as e:
|
|
print(f"Stream parsing error: {e.message}")
|
|
```
|
|
|
|
---
|
|
|
|
## Comprehensive Error Handling
|
|
|
|
```python
|
|
from fastgpt_client import ChatClient
|
|
from fastgpt_client.exceptions import (
|
|
APIError,
|
|
AuthenticationError,
|
|
RateLimitError,
|
|
ValidationError,
|
|
FastGPTError
|
|
)
|
|
|
|
def safe_chat_completion(client, messages):
|
|
"""Handle chat completion with comprehensive error handling."""
|
|
try:
|
|
response = client.create_chat_completion(
|
|
messages=messages,
|
|
stream=False
|
|
)
|
|
response.raise_for_status()
|
|
return response.json()
|
|
|
|
except AuthenticationError:
|
|
print("Error: Invalid API key. Please check your credentials.")
|
|
return None
|
|
|
|
except RateLimitError as e:
|
|
print(f"Error: Rate limit exceeded. Please wait.")
|
|
if e.retry_after:
|
|
print(f"Retry after {e.retry_after} seconds")
|
|
return None
|
|
|
|
except ValidationError as e:
|
|
print(f"Error: Invalid request parameters: {e.message}")
|
|
return None
|
|
|
|
except APIError as e:
|
|
print(f"Error: API request failed: {e.message}")
|
|
return None
|
|
|
|
except FastGPTError as e:
|
|
print(f"Error: Unexpected FastGPT error: {e}")
|
|
return None
|
|
|
|
except Exception as e:
|
|
print(f"Error: Unexpected error: {e}")
|
|
return None
|
|
|
|
# Usage
|
|
with ChatClient(api_key="fastgpt-xxxxx") as client:
|
|
result = safe_chat_completion(
|
|
client,
|
|
[{"role": "user", "content": "Hello!"}]
|
|
)
|
|
```
|
|
|
|
## Error Handling Best Practices
|
|
|
|
1. **Always handle exceptions** when making API calls
|
|
2. **Use specific exceptions** for better error handling
|
|
3. **Log errors** for debugging purposes
|
|
4. **Provide user-friendly messages** based on error type
|
|
5. **Implement retry logic** for rate limit errors
|
|
6. **Validate parameters** before making API calls
|
|
|
|
## Retry Logic for Rate Limiting
|
|
|
|
```python
|
|
import time
|
|
from fastgpt_client import ChatClient
|
|
from fastgpt_client.exceptions import RateLimitError
|
|
|
|
def chat_with_retry(client, messages, max_retries=3):
|
|
"""Retry chat completion on rate limit errors."""
|
|
for attempt in range(max_retries):
|
|
try:
|
|
response = client.create_chat_completion(
|
|
messages=messages,
|
|
stream=False
|
|
)
|
|
response.raise_for_status()
|
|
return response.json()
|
|
|
|
except RateLimitError as e:
|
|
if attempt < max_retries - 1:
|
|
# Use Retry-After header or default delay
|
|
delay = int(e.retry_after) if e.retry_after else 5
|
|
print(f"Rate limited. Waiting {delay} seconds...")
|
|
time.sleep(delay)
|
|
else:
|
|
print(f"Max retries exceeded. Giving up.")
|
|
raise
|
|
```
|
|
|
|
## Next Steps
|
|
|
|
- [Error Handling Guide](../advanced/error_handling.md) - More error handling strategies
|
|
- [Rate Limiting](../advanced/rate_limiting.md) - Handling rate limits effectively
|