- Moved common `generate()` logic to `LlmInterface` base class for improved code reuse
- Introduced `_execute_request()` method to be implemented by subclasses, enhancing extensibility
- Removed duplicate code from provider-specific classes, reducing maintenance overhead
- Made `model_name` optional in `LlmInterface` for more flexible initialization
- Transitioned from `setup.py` to `pyproject.toml` for modern Python packaging
- Updated version import in `__init__.py` for consistent versioning
- Implemented streaming functionality across all supported providers
- Updated README with streaming examples and improved usage instructions for better developer experience
- Refactored `LlmInterface` to support both `generate` and `stream` methods, providing a unified API
- Removed vLLM provider since vLLM servers run preferably with the OpenAI-compatible API
- Updated imports, improved type hints and error handling for increased robustness