219 lines
6.6 KiB
Markdown
219 lines
6.6 KiB
Markdown
# Models Pull and Delete Commands Implementation Report
|
|
|
|
## Overview
|
|
|
|
Successfully implemented fully functional `models pull` and `models delete` commands for the OpenWebUI CLI with proper error handling, user feedback, and API integration.
|
|
|
|
## Implementation Details
|
|
|
|
### File Modified
|
|
- `/home/setup/openwebui-cli/openwebui_cli/commands/models.py`
|
|
|
|
### Pull Command Features
|
|
|
|
**Command Signature:**
|
|
```bash
|
|
openwebui models pull <model_name> [OPTIONS]
|
|
```
|
|
|
|
**Options:**
|
|
- `--force` / `-f`: Re-pull existing models (default: False)
|
|
- `--progress` / `--no-progress`: Show download progress (default: True)
|
|
|
|
**Functionality:**
|
|
1. Checks if model already exists via GET `/api/models/{model_name}`
|
|
2. If exists and not using `--force`, displays warning and exits gracefully
|
|
3. If doesn't exist or using `--force`, initiates pull via POST `/api/models/pull`
|
|
4. Shows progress indicator when `--progress` is enabled
|
|
5. Handles success/failure with appropriate colored output
|
|
|
|
**Error Handling:**
|
|
- 404 Not Found: Gracefully indicates model not found in registry
|
|
- Network Timeout: Handles via existing `handle_request_error()` function
|
|
- Disk Space Issues: Preserved for server-side error responses
|
|
- Authentication: Integrated with existing token handling
|
|
|
|
### Delete Command Features
|
|
|
|
**Command Signature:**
|
|
```bash
|
|
openwebui models delete <model_name> [OPTIONS]
|
|
```
|
|
|
|
**Options:**
|
|
- `--force` / `-f`: Skip confirmation prompt (default: False)
|
|
|
|
**Functionality:**
|
|
1. Prompts for confirmation unless `--force` is provided
|
|
2. Confirmation default is `False` for safety
|
|
3. Deletes model via DELETE `/api/models/{model_name}`
|
|
4. Shows success message on completion
|
|
|
|
**Error Handling:**
|
|
- 404 Not Found: Handles gracefully with descriptive error
|
|
- Authorization Issues: Integrated with existing auth error handling
|
|
- Network Errors: Handled via `handle_request_error()`
|
|
|
|
## API Endpoints Used
|
|
|
|
| Method | Endpoint | Purpose |
|
|
|--------|----------|---------|
|
|
| GET | `/api/models/{model_name}` | Check if model exists |
|
|
| POST | `/api/models/pull` | Pull/download model |
|
|
| DELETE | `/api/models/{model_name}` | Delete model |
|
|
|
|
## Code Quality
|
|
|
|
**Ruff Linter:** ✓ All checks passed
|
|
**MyPy Type Checker:** ✓ No type issues found
|
|
|
|
## Implementation Patterns
|
|
|
|
### Follows Existing Codebase Standards
|
|
|
|
1. **HTTP Client Usage:** Uses established `create_client()` context manager pattern
|
|
2. **Error Handling:** Integrates with `handle_request_error()` and `handle_response()`
|
|
3. **User Feedback:** Uses Rich console with colored output
|
|
4. **Token Management:** Leverages existing token handling infrastructure
|
|
5. **Configuration:** Respects profile, URI, and token options from context
|
|
|
|
### Example from RAG module (model for delete command):
|
|
```python
|
|
@files_app.command("delete")
|
|
def delete_file(
|
|
ctx: typer.Context,
|
|
file_id: str = typer.Argument(..., help="File ID to delete"),
|
|
force: bool = typer.Option(False, "--force", "-f", help="Skip confirmation"),
|
|
) -> None:
|
|
"""Delete an uploaded file."""
|
|
obj = ctx.obj or {}
|
|
|
|
if not force:
|
|
confirm = typer.confirm(f"Delete file {file_id}?")
|
|
if not confirm:
|
|
raise typer.Abort()
|
|
|
|
try:
|
|
with create_client(...) as client:
|
|
response = client.delete(f"/api/v1/files/{file_id}")
|
|
handle_response(response)
|
|
console.print(f"[green]Deleted file: {file_id}[/green]")
|
|
except Exception as e:
|
|
handle_request_error(e)
|
|
```
|
|
|
|
Our implementation follows this exact pattern for the delete command.
|
|
|
|
## Testing
|
|
|
|
### API Simulation Tests
|
|
|
|
Created comprehensive test suite validating:
|
|
|
|
1. **Pull Command Tests:**
|
|
- ✓ Pulling a new model
|
|
- ✓ Detecting existing model (without --force)
|
|
- ✓ Re-pulling with --force flag
|
|
- ✓ Handling API errors (404)
|
|
|
|
2. **Delete Command Tests:**
|
|
- ✓ Deleting with --force flag
|
|
- ✓ Confirmation prompt behavior
|
|
- ✓ Aborting on rejection
|
|
- ✓ Handling model not found
|
|
|
|
### Test Results
|
|
|
|
```
|
|
============================================================
|
|
Testing Models Pull and Delete Commands with API Simulation
|
|
============================================================
|
|
|
|
[PASS] test_models_pull_new_model
|
|
[PASS] test_models_pull_existing_model_without_force
|
|
[PASS] test_models_pull_with_force
|
|
[PASS] test_models_delete_with_force
|
|
[PASS] test_models_delete_with_abort
|
|
[PASS] test_models_delete_with_confirmation
|
|
[PASS] test_models_pull_api_error
|
|
[PASS] test_models_delete_not_found
|
|
|
|
============================================================
|
|
All simulation tests passed successfully!
|
|
============================================================
|
|
```
|
|
|
|
## User Feedback Examples
|
|
|
|
### Successful Pull
|
|
```
|
|
Pulling model: llama2...
|
|
Successfully pulled model: llama2
|
|
```
|
|
|
|
### Model Exists
|
|
```
|
|
Model 'llama2' already exists. Use --force to re-pull.
|
|
```
|
|
|
|
### Delete Confirmation
|
|
```
|
|
Delete model 'llama2'? [y/N]: y
|
|
Successfully deleted model: llama2
|
|
```
|
|
|
|
### Error Handling
|
|
```
|
|
Error: Not found: Model not found in registry
|
|
Check that the resource ID, model name, or endpoint is correct.
|
|
```
|
|
|
|
## Integration with Existing Features
|
|
|
|
1. **Profile Support:** Respects `--profile` option for multi-account management
|
|
2. **Token Management:** Works with keyring, env vars, and CLI token options
|
|
3. **Output Formatting:** Integrates with `--format json` if needed (extensible)
|
|
4. **Error Exit Codes:** Uses standardized exit codes from errors.py
|
|
5. **Timeout Configuration:** Respects global timeout settings
|
|
|
|
## Success Criteria Met
|
|
|
|
- [x] No mypy or ruff errors
|
|
- [x] Pull/delete have clear user feedback
|
|
- [x] Ready for unit testing
|
|
- [x] Proper error handling for all scenarios
|
|
- [x] Backward compatible with existing CLI interface
|
|
- [x] Follows established codebase patterns
|
|
- [x] Comprehensive API simulation testing
|
|
- [x] Network timeout handling via existing infrastructure
|
|
- [x] Clear progress indicators
|
|
|
|
## Future Enhancements (Optional)
|
|
|
|
1. **Progress Streaming:** For long-running pulls, could parse server-sent events
|
|
2. **Batch Operations:** Support pulling/deleting multiple models
|
|
3. **Model Search:** Filter models before pulling
|
|
4. **Rollback Support:** Ability to restore deleted models from backup
|
|
5. **Async Operations:** Background pull/delete operations with polling
|
|
|
|
## Files Modified
|
|
|
|
- `/home/setup/openwebui-cli/openwebui_cli/commands/models.py` (implementation)
|
|
|
|
## Validation Commands
|
|
|
|
```bash
|
|
cd /home/setup/openwebui-cli
|
|
|
|
# Code quality checks
|
|
.venv/bin/ruff check openwebui_cli/commands/models.py
|
|
.venv/bin/mypy openwebui_cli/commands/models.py --ignore-missing-imports
|
|
|
|
# Run tests
|
|
.venv/bin/pytest tests/test_models.py -v
|
|
|
|
# Test simulation
|
|
.venv/bin/python test_pull_delete_simulation.py
|
|
```
|
|
|
|
All validations pass successfully.
|