v1.28.0
What's Changed
- fix(sdk): keep OpenHands provider by @enyst in #3548
- test(agent-server): add cross lease coverage by @enyst in #3559
- fix(llm): don't emit explicit cache_control markers for Gemini by @VascoSch92 in #3586
- test(sdk): pin shell parser node shapes by @Fieldnote-Echo in #3590
- Harden workflow GitHub context handling by @enyst in #3372
- feat: add client-defined tools (no-op tools via JSON spec) by @xingyaoww in #3306
- fix(sdk): reject client tool name collisions by @enyst in #3614
- feat(models): add claude-fable-5 model support by @juanmichelini in #3592
- [codex] Count tokens with tokenizer chat templates by @neubig in #3593
- [codex] Sanitize malformed tool call recovery by @neubig in #3575
- Expose active LLM profile in settings API by @enyst in #3552
- feat(terminal): reject Python/JSON literals passed as bash commands by @juanmichelini in #3582
- feat(agent-server): add OpenAI chat completions gateway by @enyst in #3545
- fix(sdk): Support ACP model switching for custom/unknown providers via set_config_option by @Hades32 in #3556
- Consume cached View in prepare_llm_messages by @csmith49 in #3328
- Skip PR description check for release PRs by @enyst in #3639
- Extend workspace session cookie lifetime to effectively never expire by @rbren in #3637
- feat(agent-server): harden OpenAI gateway client compatibility by @enyst in #3626
- Wrap condenser LLM errors as NoCondensationAvailableException by @csmith49 in #3647
- fix(llm): recognize claude-fable-5 as a reasoning model by @juanmichelini in #3642
- Release v1.28.0 by @all-hands-bot in #3638
Full Changelog: v1.27.1...v1.28.0