diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a808ee..df6680f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [2.1.0] - 2026-02-05 + +### Fixed + +- **Streaming SSE compatibility with Open WebUI** - Switch from `exclude_none=True` to `exclude_unset=True` for SSE chunk serialization; `exclude_none` was too aggressive — it stripped `finish_reason: null` from intermediate chunks (which OpenAI includes), while `exclude_unset` correctly omits only fields never passed to the constructor (like `reasoning_content` on content-only chunks) while preserving explicitly-set `finish_reason: null` + +### Changed + +- **Project structure consolidation** - Moved documentation to `docs/`, consolidated all config into `pyproject.toml`, replaced `wakeup.sh`/`pytest.ini`/`requirements*.txt` with `Makefile` + `pyproject.toml` +- **CI test gate** - Unit tests now gate release and build jobs in Gitea Actions workflow +- **Build output organization** - Tool caches in `.cache/`, generated output (coverage, logs) in `build/` + ## [2.0.5] - 2026-02-05 ### Fixed @@ -921,7 +933,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - CORS middleware - Exception handlers (OpenAI-compatible error format) -[Unreleased]: https://git.schweitz.net/jpmschweitzer/tatlock/compare/v2.0.0...main +[Unreleased]: https://git.schweitz.net/jpmschweitzer/tatlock/compare/v2.1.0...main +[2.1.0]: https://git.schweitz.net/jpmschweitzer/tatlock/compare/v2.0.5...v2.1.0 +[2.0.5]: https://git.schweitz.net/jpmschweitzer/tatlock/compare/v2.0.0...v2.0.5 [2.0.0]: https://git.schweitz.net/jpmschweitzer/tatlock/compare/v1.11.0...v2.0.0 [1.11.0]: https://git.schweitz.net/jpmschweitzer/tatlock/compare/v1.10.0...v1.11.0 [1.10.0]: https://git.schweitz.net/jpmschweitzer/tatlock/compare/v1.9.0...v1.10.0 diff --git a/pyproject.toml b/pyproject.toml index e676847..2c84667 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "tatlock" -version = "2.0.5" +version = "2.1.0" description = "OpenAI-compatible API with Ollama backend" requires-python = ">=3.12" dependencies = [ diff --git a/src/chat/router.py b/src/chat/router.py index dc3c59c..b288c9d 100644 --- a/src/chat/router.py +++ b/src/chat/router.py @@ -31,7 +31,7 @@ async def _stream_response( """ try: async for chunk in service.create_chat_completion_stream(request): - yield f"data: {chunk.model_dump_json(exclude_none=True)}\n\n" + yield f"data: {chunk.model_dump_json(exclude_unset=True)}\n\n" yield "data: [DONE]\n\n"