Tags

Tags give the ability to mark specific points in history as being important
  • v0.16.0

    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

    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

    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

    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

    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

    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

    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

    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.3

    v0.14.3 — mirror, archive and issue-pull CI
  • v0.14.2

    v0.14.2 — CI status badge
  • v0.14.1

    v0.14.1 — README badges
  • v0.14.0

    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

    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

    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

    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

    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

    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

    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

    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

    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.