Tags give the ability to mark specific points in history as being important
-
v0.16.0
a9693e50 · ·Adds opt-in native provider records to OpenAI-compatible streaming. - Send `"stream_options": {"include_aicodebox_events": true}` with `stream: true` to receive named `aicodebox.native` SSE events alongside the standard OpenAI chunks. Existing content chunks and `[DONE]` are unchanged. - Each native event carries its sequence, retry attempt, adapter backend, event type, and the original provider object or raw stdout line. This preserves thinking, tool, and diagnostic records without altering normal streams. - The option is rejected with `400` unless its value is a boolean and `stream: true` is set. -
v0.15.1
72e10700 · ·v0.15.1 Refreshes the base image, application dependencies, build tools, and locked full-image Node and Python toolchains to age-eligible upstream releases. Adds the async pytest plugin required to run the full project's test suite.
-
v0.15.0
5913088e · ·Adds the full development-toolchain image variant. - Publishes `psyb0t/aicodebox:latest-full` alongside the minimal `latest` image. The matching version tag is `v0.15.0-full`. - Moves the shared Go, Node, Python, editor, diagnostic, database-client, and operations toolchain into the base image, so agent images can inherit it instead of each rebuilding it. - Adds `make build-full`, `make build-all`, and `make test-full-image`. CI publishes the matching minimal image before building the full variant.
-
v0.14.8
bf167212 · ·v0.14.8, 2026-09-06 Updates the base Python runtime to 3.14.7. - Builds CPython 3.14.7 from its SHA256-verified official source archive. - Uses the new runtime for aicodebox and every child image. - Includes runtime libraries and compatible `python`, `python3`, `pip`, and `pip3` commands in the final image.
-
v0.14.7
f9b75cc2 · ·Pins the base image to Node.js 24.20.0 LTS. - Replaces the floating NodeSource 22.x apt setup with official Node.js archives. - Verifies amd64 and arm64 archives with published SHA256 checksums. - Checks the installed Node.js version during the image build.
-
v0.14.6
1fdcf853 · ·v0.14.6 Adds independent native event retention to `POST /run`. - `eventMode` is now the event-retention control: `full` returns untouched provider records in the stable `{sequence, attempt, backend, eventType, event}` envelope, while `none` omits them. `auto` preserves the previous schema and `json-verbose` compatibility behaviour. - Structured JSON, session metadata, usage, retry attempts, and raw output remain independent from event retention. Schema retries retain records from every attempt when events are enabled. - Corrects `/openai/v1/*` route references and the OpenAI adapter's capability documentation. Adds unit coverage for the public event response contract. -
v0.14.5
6b42dacf · ·v0.14.5 — re-release v0.14.4 with pyproject.toml and uv.lock both at 0.14.5. Carries the restart-loop fix (agent runs in its own session). Pin downstream here, not v0.14.4.
-
v0.14.4
34401de3 · ·v0.14.4 — agent runs in its own session so its signals cannot shut down the api-mode server (PID 1). Fixes the container restart loop. Regression tests guard both spawn paths.
-
-
-
-
v0.14.0
88048b8d · ·v0.14.0 — buffered SSE for tool/schema streaming stream=true with tools or response_format no longer returns a 400. A tool call or a schema-validated answer only exists once the full response is computed, so we buffer it and replay it as a single-shot SSE stream (text/event-stream): opening role chunk -> one content or tool_calls delta (streaming tool_calls carry the required index) -> finish chunk -> data: [DONE]. The client's streaming SDK gets a valid stream, just not token-incremental. Plain chat still streams incrementally. Genuine failures still surface as 422/500 rather than a stream. Additive: the v0.13.0 400 on stream+tools / stream+schema is replaced by buffered SSE. 190 tests passing. Ships psyb0t/aicodebox:v0.14.0.
-
v0.13.0
9fb19ba5 · ·v0.13.0 — compose tools + response_format (agentic flow ending in structured JSON) /openai/v1/chat/completions now accepts `tools` and `response_format` in the same request. They describe different turn types, like OpenAI: - tool-call turn -> tool_calls / finish_reason "tool_calls" (never schema-checked); - final answer turn -> schema-validated (with retry) canonical JSON / finish_reason "stop". The tools directive carries the final-answer schema so both exits are stated coherently. Enabled by a new early_accept escape in shared/runner.py:run_with_json_retry that short-circuits a tool-call turn instead of retrying it as a schema failure. tools + stream=true still -> 400 (planned follow-up). Additive: the v0.12.0 400 on tools+response_format is removed; non-combined requests unchanged. 190 tests passing. Ships psyb0t/aicodebox:v0.13.0.
-
v0.12.0
811e64b0 · ·v0.12.0 — OpenAI-style client-executed tool calling /openai/v1/chat/completions now honors the standard `tools` / `tool_choice` body fields. The machine acts as a plain function-calling model: it responds with `tool_calls` + finish_reason "tool_calls" when it wants a tool, the client runs the tool and sends the `role:"tool"` result back, and the loop continues (stateless — full history resent each round, exactly like OpenAI). - tool_choice: auto / none / required / {type:"function",function:{name}}. - Tolerant parsing of the agent's tool-call block (handles prose/fences). - In tool mode the harness's own internal tools default OFF (pure function-caller); x-aicodebox-no-tools: 0 re-enables the hybrid. - tools + response_format/schema -> 400; tools + stream=true -> 400. - Additive: non-tool requests unchanged; the old blanket 400 on tools is gone. Ships psyb0t/aicodebox:v0.12.0. -
v0.11.0
0a872ccc · ·v0.11.0 — surface provider errors as HTTP 400 instead of empty text RunResult gains provider_error: str | None. chat_completions checks it ahead of exit-code / parse-error handling and returns 400 with the provider's message instead of a 200 with empty text. run_with_json_retry stops re-prompting as soon as a provider error appears instead of burning the retry budget against a rejection that will never parse. Breaking for API clients that assumed a 200 always meant a usable (if empty) completion. Adapters that don't set provider_error see no change. 169/169 tests green.
-
v0.10.1
bd44a3c7 · ·v0.10.1 — periodic safety-net purge for ephemeral workspaces v0.10.0's per-request /tmp/aicodebox/<uuid>/ cleanup runs in a `finally` block — covers the normal case but not SIGKILL, container restart with a leftover root, or the cleanup helper itself raising. In those cases orphans leaked forever. v0.10.1 adds purge_stale_workspaces(): iterates EPHEMERAL_WORKSPACE_ROOT, removes dirs older than 1h (TTL covers worst-case schema runs 10x over), skips non-dir entries, returns the purged count, WARN-logs skipped/failed entries. Wired into server._purge_loop which runs every 10 minutes. Bonus: purge_stale_uploads now WARN-logs its silently-swallowed OSError path. 167 tests pass (+3 new for the orphan removal, missing-root no-op, and stray-file skip cases). Migration: none. Existing v0.10.0 deployments accumulate stale dirs until restarted; v0.10.1 sweeps them on first purge tick.
-
v0.10.0
3a6e15d2 · ·v0.10.0 — cheap schema retries via ephemeral workspace + session continue Up through v0.9.1, schema-mode retries on /openai/v1/chat/completions replayed the full original prompt — a 100k-token request needing 3 retries paid 400k input tokens. v0.10.0: - Schema request + no x-aicodebox-workspace → ephemeral /tmp/aicodebox/<uuid>/ workspace (mkdir mode 0o700), cleaned up in `finally` after the request returns. - run_with_json_retry runs retries with no_continue=False + minimal corrective prompt (error + directive + schema, ~500 tokens) instead of replaying the full original input. - Caller-provided workspace → fresh-session retry fallback (v0.9.1 behavior); we can't guarantee isolation in a workspace we don't own. Library-level: run_with_json_retry gains continue_session_on_retry (default False — /run callers unchanged). Safety: _cleanup_ephemeral_workspace refuses paths outside EPHEMERAL_WORKSPACE_ROOT. stream+schema 400 check moved earlier so the rejected path doesn't leak an ephemeral dir. 164 tests pass (+5 new in test_oai_schema.py and test_usage_accumulation.py). Migration: none. Schema requests without a workspace header now cost ~100x less on retries. -
v0.9.1
4b1b2b5e · ·v0.9.1 — retry prompt now carries original task for informed correction Bug fix on the schema-mode retry helper from v0.8.0+. Each retry runs with no_continue=True (fresh session) so the model doesn't double down on its bad answer. But the retry prompt only had the bad output + parse error + schema — NO original task. For schemas where correction needs task context (large enum picks, allowed-values lists, domain identifiers), the retry agent had no idea what it was correcting and either re-picked blindly or fell back to prose. Fix: _json_retry_prompt now takes the original prompt as a parameter and re-states it in the retry body alongside the bad output, the error, and the schema. run_with_json_retry passes spec.prompt through. Fresh-session benefit preserved, task context now present. New layout (delimited sections): - Original task ─── - Your previous (invalid) response ─── - Parse / validation error ─── - Required schema ─── Regression test added: test_retry_prompt_includes_original_task exercises a 4-value enum mismatch and asserts the retry prompt contains the original task verbatim plus the bad output, error, and schema. 159 tests pass (158 from v0.9.0 + 1 new). Migration: none. Retry prompts are longer (carry original task) so each attempt costs slightly more input tokens, but retries should succeed more often — net token usage on retrying schema runs should drop.
-
v0.9.0
06eb6a73 · ·v0.9.0 — OpenAI standard response_format on /openai/v1/chat/completions Support OpenAI's standard `response_format` body field — stock SDKs (LangChain, official openai-python, LlamaIndex, etc.) now drive schema-validated JSON without our custom header. response_format=text → no schema (default) response_format=json_object → permissive — forces parseable JSON response_format=json_schema → uses .json_schema.schema dict as the constraint (OpenAI structured outputs shape) Failure semantics identical to v0.8.x header path: success → canonical JSON in message.content exhaustion → 422 with validation error agent crash → 500 with exit code + stderr stream=true → 400 Body field wins if both body and x-aicodebox-json-schema header are set (OAI standard). INFO log on conflict. Header stays supported as a fallback. Entry log: has_schema=<bool> → schema_via=<source> where source is response_format.json_schema, response_format.json_object, x-aicodebox-json-schema, or none. The old 400 on response_format=json_object is removed — callers relying on it for control flow must update. 158 tests pass (151 from v0.8.3 + 7 new in test_oai_schema.py covering both standard paths, precedence, malformed shapes, and the streaming guard). Migration: fully additive for new callers. Stock OpenAI SDKs work with schema enforcement out of the box. Existing header-using callers unchanged. -
v0.8.3
6c2165dc · ·v0.8.3 — pyproject.toml is the single version source Fix the version-reporting drift v0.8.2 and every prior release shipped with. aicodebox.__version__ reported "0.1.0" regardless of the actual release tag (8 releases of lying), and the docker image only ever tagged :latest. Single canonical source now: - pyproject.toml [project] version — THE one place a release bump happens. - aicodebox/__init__.py reads it via importlib.metadata.version(); falls back to "0.0.0+source" sentinel (NOT a hardcoded number) if dist-info isn't installed. - Makefile derives the docker tag from pyproject via awk; every `make build` tags BOTH :vX.Y.Z AND :latest. New `make version` prints the derived tag. - uv.lock refreshed. Verified end-to-end: `docker run psyb0t/aicodebox:v0.8.3 python3 -c 'import aicodebox; print(aicodebox.__version__)'` → "0.8.3". 151 existing tests pass. No behavior change — version derivation is infrastructure. Migration: none. Anyone scripting against __version__ was already getting "0.1.0" regardless of pull; they'll now get the real number from v0.8.3 onward.