Revision history for Langertha-Knarr 1.000 2026-04-10 00:00:20Z - MAJOR REWRITE. Mojolicious is gone; the new core is built on IO::Async + Net::Async::HTTP::Server + Future::AsyncAwait for native async streaming and seamless integration with Langertha engines. Existing knarr.yaml configs and the knarr CLI commands (start, container, models, check, init) keep working. - Six wire protocols loaded by default on every listening port: OpenAI (/v1/chat/completions, /v1/models, SSE), Anthropic (/v1/messages, named-event SSE), Ollama (/api/chat, /api/tags, NDJSON streaming), A2A (Google Agent2Agent JSON-RPC at / with /.well-known/agent.json discovery), ACP (BeeAI/IBM /agents, /runs), and AG-UI (CopilotKit /awp event stream). - Pluggable Handler architecture replaces the old Knarr::Proxy classes: Knarr::Handler::Router — model→engine via Knarr::Router Knarr::Handler::Engine — single Langertha engine wrapper Knarr::Handler::Raider — per-session Langertha::Raider Knarr::Handler::Code — coderef-backed for tests/fakes Knarr::Handler::Passthrough — raw HTTP forward to upstream Knarr::Handler::A2AClient — consume remote A2A agents Knarr::Handler::ACPClient — consume remote ACP agents Knarr::Handler::Tracing — Langfuse tracing decorator Knarr::Handler::RequestLog — JSONL request logging decorator - Langfuse tracing and per-request JSONL logging restored as decorator handlers and auto-mounted by knarr start / knarr container when their respective config sections are present. - Multi-listen restored: the listen attribute is always an arrayref (default composed from host + port), supports any number of host:port entries. knarr container binds 8080 + 11434 simultaneously so existing Ollama clients work without reconfiguration. - proxy_api_key authentication enforced by the new dispatcher. Clients must present 'Authorization: Bearer ' or 'x-api-key: ' when KNARR_API_KEY (or yaml proxy_api_key) is set. The /.well-known/agent.json discovery route stays anonymous. - PSGI adapter (Knarr::PSGI) for deploying behind any Plack server (Starman, Twiggy, mod_perl, ...). Streaming is buffered in this mode; use the native server for real-time streaming. - Universal protocol translator pattern: an OpenAI-fronted Knarr with a Handler::A2AClient backend exposes a remote A2A agent to OpenAI clients (and similarly for ACP). - Drops the Knarr namespace facades for Langertha utility code (Knarr::Metrics, Knarr::Input, Knarr::Output, Knarr::Input::Tools, Knarr::Output::Tools). Use Langertha::Usage / Tool / ToolCall / ToolChoice / Pricing / Cost / UsageRecord directly from Langertha core. - cpanfile drops Mojolicious, Test::Mojo, MooseX::Role::Parameterized, HTTP::Message, File::ShareDir::ProjectDistDir; adds IO::Async, Net::Async::HTTP, Net::Async::HTTP::Server, Future::AsyncAwait, Moose, Path::Tiny (test), Capture::Tiny (test). - Bump Langertha floor to 0.400 for the new value object API. - dist.ini sets irc = #langertha (on irc.perl.org). - Test suite expanded from 200 to 320 unit tests + author POD syntax. New coverage: * end-to-end live streaming for Anthropic / A2A / ACP / AG-UI (OpenAI and Ollama already covered) * Handler::Passthrough sync + streaming through a real backend * Handler::Router with passthrough fallback * Multi-listen on real sockets * Tracing and RequestLog decorators * CLI smoketest for knarr models / check / init * proxy_api_key auth enforcement 0.007 2026-03-10 20:05:00Z - Resolve configured engines through both `Langertha::Engine::*` and `LangerthaX::Engine::*` (including fully-qualified class names). - Add router test coverage for `LangerthaX::Engine::*` custom engines. - Tighten dependency minimums in cpanfile: `Langertha 0.307`, `Mojolicious 9.0`. - Update README and POD docs to describe custom engine resolution order. - Dockerfile: add optional `LANGERTHA_SRC` build arg to inject unreleased Langertha source when CPAN indexers lag. - dist.ini release Docker build supports optional `KNARR_DOCKER_BUILD_ARGS='...'` passthrough for temporary build overrides, including GitHub release-dist URL examples and a note against `/archive/refs/*` source archives for dzil dists. - dist.ini now uploads `Langertha-Knarr-%v.tar.gz` to GitHub releases (`Getty/langertha-knarr`) via `gh` during post-release hooks. - dist.ini now runs `${GH_BIN:-gh}` directly in separate `run_after_release` steps (no pre-check, no chained `&&`), so hooks use invoking-shell runtime environment/path. 0.005 2026-03-10 14:48:05Z - Add primary Knarr normalization modules (core-backed): `Langertha::Knarr::Input`, `Langertha::Knarr::Output`, `Langertha::Knarr::Metrics`. - Bump `Langertha` dependency to `>= 0.306`. - Add request policy hooks in `build_app`: - `before_request` hook to inspect/mutate/block requests before routing - `api_key_validator` hook for dynamic per-request key authorization - Add cross-format tool bridging between OpenAI and Anthropic request/response shapes (including `tools`, `tool_choice`, `tool_calls`, `tool_use`, and `tool_result`) - Add Hermes tool XML bridging: - Parse `{...}` into OpenAI `tool_calls` - Parse `{...}` into Anthropic `tool_use` blocks - Route OpenAI `tools` through Hermes-capable engines by normalizing tool schema - Extend proxy/unit/integration tests for hook behavior and tool-bridge paths 0.004 2026-03-03 05:22:38Z - Fix routing priority: passthrough before default engine fallback - Add passthrough-only mode (no API keys needed) - Add KNARR_TRACE_NAME / --trace-name for custom Langfuse trace names - Support LANGFUSE_BASE_URL env var (in addition to LANGFUSE_URL) - Strip quotes from env values (Docker --env-file compatibility) - Strip Accept-Encoding/Content-Encoding in passthrough (no gzip issues) - Rewrite POD: passthrough proxy as primary use case - Fix Langertha dependency version to 0.303 - Fix author URL 0.001 2026-03-03 04:00:32Z - Initial release - Multi-format LLM proxy: OpenAI, Anthropic, Ollama - Passthrough mode with Langfuse tracing - Docker container mode with auto-detect from ENV - CLI: start, container, models, check, init