Files
webber/webber-api/CHANGELOG.md
T
jpmschweitzerandClaude Fable 5 65feb8b87a
Build and Push API / release (push) Successful in 3s
Build and Push API / build (push) Successful in 1m18s
release api/v1.2.0
Webber through the boilerroom wrapper: flavor-adaptive tool_choice,
session identity at rank 20, and the sanitized-client wiring fix
that makes the choke point real.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-13 10:02:59 +02:00

9.2 KiB

Changelog - Webber API

All notable changes to the Webber API will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[Unreleased]

[1.2.0] - 2026-09-13

Added

  • Backend adaptation at the provider choke point (workspace T-137): the local backend's flavor is probed once — the boilerroom wrapper names itself on /health, a bare llama-server serves /props, Ollama answers neither — and every completion adapts. The agents' tool_choice: "required" survives only on Ollama, where it is a useful advisory nudge; llama-server enforces it per request, which through the wrapper is an unbreakable tool loop. Through the wrapper every completion carries webber's session identity — session: webber, eviction_order: 20 per the decided ranking (tatlock phases 40, experts 35, librarian 30; lower parks sooner), configurable via BACKEND_SESSION_NAME/BACKEND_SESSION_RANK — and the wrapper's balancing/compaction_due body signals are logged. A transport failure during the probe answers "ollama" without caching, so a backend that was down at first call is re-probed rather than misclassified forever.

Fixed

  • The sanitized OpenAI client was never used: the provider assigned self._openai_client, an attribute nobody reads — OllamaProvider.client serves self._client. Every completion bypassed the null-content sanitizer since the class was introduced; exposed 2026-09-13 when the wrapper 503'd a session-less request that the choke point should have named. The sanitized client now goes through the constructor's official openai_client parameter, and a wiring test pins provider.client to the sanitized type.

[1.1.0] - 2026-08-11

Added

  • webber version command. It was implemented and imported but never registered, so the subcommand did not exist; the fuller output includes the resolved Ollama URL and model.

Fixed

  • The Ollama content: null sanitiser raised AttributeError on first use. It looked up the parent client's chat getter via .fget, and openai now exposes chat as a cached_property. Any agent request would have failed before reaching the model.

Changed

  • Default OLLAMA_AGENT_MODEL is now gemma4:e2b instead of mistral-nemo-large:latest, so a deployment without an explicit override no longer exhausts shared GPU memory
  • BaseAgent is generic over its context type and run_stream is typed as AsyncIterator[str | StreamEvent], matching what callers already receive.

[1.0.1] - 2026-07-19

Changed

  • Default TATLOCK_API_URL and SEARXNG_URL now use docker container names (http://tatlock:8000, http://searxng:8080) instead of host IP:port, for container-to-container traffic on the docker-dataplane network
  • CI workflow now pushes Docker images via the git.schweitz.net registry route

[1.0.0] - 2026-01-15

Added

  • Event-based streaming for task agent (StreamEvent objects instead of raw text)
    • New tools_streaming.py with all tools emitting structured events
    • Event types: tool_start, tool_done, thinking, response, error, done
  • Retry logic when LLM responds without calling tools (max 2 retries)
    • Tracks tools_called counter on TaskContext
    • Stronger retry prompt forces tool use
  • Working directory context injected into all agent prompts

Changed

  • Hardened system prompts to enforce tool use before responding
    • Added "CRITICAL RULE" section requiring tool calls first
    • Made "MANDATORY WORKFLOW" more emphatic
  • Updated explore and plan agents with _build_prompt_with_context() method

Fixed

  • Agent path hallucination - now explicitly communicates working directory to LLM

Note

  • Project paused: Local LLMs (Mistral Nemo 12B on available hardware) are not capable enough for reliable agentic tool use. Models frequently hallucinate responses instead of calling tools, even with prompt hardening and retry logic. Would require larger models (70B+) or cloud API integration to continue.

[0.4.2] - 2026-01-11

Added

  • Retry logic for transient failures with exponential backoff
    • src/shared/retry.py - @with_retry decorator and retry_async() function
    • Retries on: timeout, connection errors, HTTP 429/5xx
    • Configurable: RETRY_MAX_ATTEMPTS, RETRY_BASE_DELAY, RETRY_MAX_DELAY
  • Web search tool now automatically retries on network failures
  • 29 retry tests (205 total tests passing)

[0.4.1] - 2026-01-11

Fixed

  • Replace litellm with tiktoken for token counting (dependency conflict with pydantic-ai)
  • Update documentation (README.md, architecture.md) with conversation layer info

[0.4.0] - 2026-01-11

Added

  • Conversation persistence layer with SQLAlchemy async
    • Database models: Conversation, Message with UUID primary keys
    • SQLite (dev) and PostgreSQL (prod) support via async engines
    • Lazy database initialization pattern
  • Context management infrastructure
    • Token counting utilities using tiktoken
    • Context summarization at 80% token threshold
    • XML-tagged context prompt building for agent injection
  • REST API for multi-turn conversations
    • POST /conversations/ - Create new conversation
    • GET /conversations/ - List conversations
    • GET /conversations/{id} - Get conversation with history
    • POST /conversations/{id}/messages - Add message (triggers agent)
    • DELETE /conversations/{id} - Delete conversation
  • New dependencies: sqlalchemy[asyncio]~=2.0.36, aiosqlite~=0.21.0, tiktoken>=0.12.0
  • Config settings: database_url, summarization_threshold, keep_recent_messages
  • 19 conversation tests, 6 token counting tests (176 total tests passing)

Changed

  • Updated COVERAGE.md to ~80% complete
  • Quieter pytest output (-q --tb=short instead of -v)

[0.3.4] - 2026-01-11

Added

  • Task Agent - Full orchestrator for autonomous multi-step task execution
    • Has ALL tools: read, write, edit, bash (full), web_search
    • New spawn_agent tool to launch sub-agents (Explore, Plan) for focused work
    • Recursion prevention: cannot spawn nested Task agents
    • 22 unit tests for registration, tools, spawn_agent, and API
  • Complete agent hierarchy: Explore (read-only) → Plan (read-only) → Task (orchestrator)

[0.3.3] - 2026-01-11

Added

  • Plan Agent - READ-ONLY software architect that designs implementation strategies
    • Uses only read-only tools: read_file, glob_files, grep_content, bash_readonly
    • Creates step-by-step implementation plans with critical files list
    • 15 unit tests for registration, tools, and API
  • Web search summarizer added to roadmap (future feature)

Changed

  • Updated COVERAGE.md to ~70% complete

[0.3.2] - 2026-01-11

Added

  • Mandatory release procedure documentation in AGENTS.md

[0.3.1] - 2026-01-11

Added

  • Integration test infrastructure with pytest markers (integration, e2e, slow)
  • 10 LLM integration tests (requires Ollama)
  • 12 E2E API tests (requires running server)
  • Command line options: --run-integration, --run-e2e, --ollama-url, --api-url
  • Sample project fixtures for testing
  • 14 security tests (path traversal, command injection, input validation)
  • Helper functions: assert_contains_any, assert_contains_all

Changed

  • Updated COVERAGE.md to ~65% complete

[0.3.0] - 2026-01-10

Added

  • Explore agent with PydanticAI tool calling and Mistral Nemo
  • Coding tools: edit_file, write_file, bash (full)
  • Web search tool using SearXNG integration
  • Streaming responses via SSE
  • Sanitized Ollama provider (fixes content: null issue)

Changed

  • Reorganized into monorepo structure (webber-api/, webber-cli/, webber-sandbox/)
  • Added ruff linter and fixed mypy errors

[0.2.3] - 2026-01-09

Added

  • Docker healthcheck for container health monitoring

[0.2.2] - 2026-01-09

Fixed

  • Config parsing for empty environment variables (allowed_paths, cors_*)
  • Use env_parse_none_str="" to treat empty strings as None

[0.2.1] - 2026-01-09

Fixed

  • CI/CD pipeline credentials configured

[0.2.0] - 2026-01-09

Added

  • Reference prompts from claude-code-system-prompts for all agent types
  • Detailed documentation for Explore, Plan, and Task agents
  • Detailed documentation for File, Shell, and Search tools
  • Utility prompts (TodoWrite, AskUserQuestion, conversation summarization, etc.)
  • Security review prompt for code analysis

Changed

  • Expanded agents/README.md with capabilities and use cases
  • Expanded tools/README.md with parameter details and behaviors

[0.1.0] - 2026-01-09

Added

  • Initial FastAPI boilerplate setup
  • Domain-based project structure (src/domains/, src/shared/)
  • BaseController pattern with lazy router instantiation
  • Pydantic Settings configuration with env file support
  • Logger decorator with temporal benchmarking and trace IDs
  • UserProvider singleton for request-scoped context
  • Custom exception hierarchy
  • Health endpoints (/, /health)
  • Placeholder domains for agents (explore, plan, task)
  • Placeholder domains for tools (file, shell, search)
  • Placeholder domain for auth (tatlock integration)
  • CI/CD workflow for Gitea with Docker build and Watchtower deployment
  • Dockerfile for containerized deployment
  • CVE-checked dependencies (2026-01-09)