Tags

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

    v0.15.8 — CI plumbing only, no code changes
  • v0.15.5

    v0.15.5 — CI status badge
  • v0.15.4

    v0.15.4 — README badges
  • v0.15.3

    v0.15.3 — list on the official MCP Registry (server.json + OIDC publish)
  • v0.15.2

    v0.15.2 — third-party license notices (THIRD_PARTY.md + LICENSES/)
  • v0.15.1

    v0.15.1 — pibox skill docs hardening (auth/destructive-op guardrails)
  • v0.15.0

    v0.15.0 — ClawHub skill + plugin; README/Makefile corrections
  • v0.14.0

    v0.14.0 — track aicodebox v0.14.0, buffered SSE for tool/schema streaming
    
    stream:true for tool-calling and schema modes no longer returns 400 — the
    base computes the full answer non-streamed and replays it as a
    single-shot SSE stream (opening role chunk -> one content/tool_calls
    delta -> finish chunk -> [DONE]). Plain chat still streams incrementally
    as before. Genuine failures still surface as HTTP errors rather than a
    stream.
    
    PiAdapter unchanged — the buffered-SSE replay is entirely base-side.
    Base pinned to psyb0t/aicodebox:v0.14.0. Breaking for callers that
    special-cased the old 400. Minor bump.
    
    49/49 tests green. Built against psyb0t/aicodebox:v0.14.0.
  • v0.13.0

    v0.13.0 — track aicodebox v0.13.0, client-executed tool calling + schema
    
    OpenAI-style client-executed tool calling on /openai/v1/chat/completions,
    composable with response_format so an agentic multi-tool flow can end in
    a schema-validated structured JSON reply. A tool-call turn -> tool_calls
    / finish_reason=tool_calls (not schema-checked); the final-answer turn ->
    schema-validated JSON / finish_reason=stop (exhausted retries -> 422,
    crash -> 500). tools + stream:true -> 400. The OAI endpoint now defaults
    tools-off; opt in with x-aicodebox-no-tools: false or a tools-allowlist.
    
    PiAdapter unchanged — tool calling + schema composition are base-side.
    Base pinned to psyb0t/aicodebox:v0.13.0. Two new real end-to-end
    tool-calling tests against a live GLM model. Minor bump.
    
    49/49 tests green. Built against psyb0t/aicodebox:v0.13.0.
  • v0.12.0

    v0.12.0 — track aicodebox v0.11.0, surface provider errors as HTTP 400
    
    The base now returns HTTP 400 with the provider's error message when the
    upstream model rejects a request (content-safety filter / rate limit /
    auth failure), instead of a 200 with empty text that hid the failure.
    PiAdapter forwards the provider-error detail on RunResult.provider_error
    (pi reports it as stopReason=error + errorMessage on the assistant turn).
    
    Base image pinned to psyb0t/aicodebox:v0.11.0 (digest-pinned in the
    Dockerfile + Makefile). Breaking for callers that treated a
    200-with-empty-text as success. Minor bump.
    
    48/48 tests green. Built against psyb0t/aicodebox:v0.11.0.
  • v0.11.3

    v0.11.3 — track aicodebox v0.10.1, periodic ephemeral workspace purge
    
    Base operational fix: the per-request /tmp/aicodebox/<uuid>/ cleanup
    runs in a `finally` block — which doesn't fire on SIGKILL / container
    restart / cleanup helper raise. v0.10.1 adds a periodic sweep every
    10 minutes that removes ephemeral workspaces older than 1h. Bonus:
    purge_stale_uploads no longer silently swallows OSError.
    
    PiAdapter unchanged. /run callers unchanged. Patch bump — pure
    base-side operational fix tracking.
    
    48/48 tests green. Built against psyb0t/aicodebox:v0.10.1.
  • v0.11.2

    v0.11.2 — track aicodebox v0.10.0, cheap schema retries
    
    Base optimization: /openai/v1/chat/completions schema-mode retries no
    longer replay the full original prompt. When no x-aicodebox-workspace
    is set, the base allocates an ephemeral /tmp/aicodebox/<uuid>/ and
    session-continues the retry conversation — corrective prompts only.
    
    A 100k-token request needing 3 retries paid ~400k input tokens before
    v0.10.0; now ~100k + ~1.5k corrective overhead per retry. Cleaned up
    in finally after every response code path.
    
    PiAdapter unchanged. /run callers unchanged. 48/48 tests green.
    Patch bump — pure base-side optimization tracking.
    
    Built against psyb0t/aicodebox:v0.10.0.
  • v0.11.1

    v0.11.1 — track aicodebox v0.9.1, retry prompt carries original task
    
    Base bug fix: schema-mode retries (since v0.8.0) ran with
    no_continue=True for fresh-session correction, but the retry prompt
    didn't carry the original task — only the bad output + error +
    schema. Retry agents had no idea what they were correcting. v0.9.1
    fixes this by re-stating the original task in each retry body.
    
    Failure semantics unchanged. PiAdapter contract unchanged. Patch
    bump — pure base bug-fix tracking.
    
    48/48 tests green. Built against psyb0t/aicodebox:v0.9.1.
  • v0.11.0

    v0.11.0 — track aicodebox v0.9.0, OAI response_format body field
    
    aicodebox v0.9.0 wired the OpenAI-standard ``response_format`` body
    field into /openai/v1/chat/completions, so stock OAI SDKs (LangChain,
    openai-python, LlamaIndex) can drive schema enforcement without our
    proprietary x-aicodebox-json-schema header.
    
    Surface mapping (body field):
      response_format.type = text         → no schema
      response_format.type = json_object  → permissive {"type":"object"}
      response_format.type = json_schema  → response_format.json_schema.schema
    
    Failure semantics + the canonical re-serialized JSON content shape are
    identical to the header path. Body wins on conflict; header stays
    supported as a fallback.
    
    Base image
    - BASE_IMAGE bumped to psyb0t/aicodebox:v0.9.0 (Dockerfile + Makefile +
      tests/common.sh in lockstep). Tag pin — digest pending registry
      push.
    
    PiAdapter
    - Zero code changes. v0.9.0 was route-only.
    
    Tests
    - test_api_oai_reject_tools narrowed: tools[] still rejected;
      response_format=json_object no longer rejected (it's the happy path
      of the new test below).
    - response_format={type:json_object} happy-path test added.
    - response_format={type:json_schema,json_schema:{schema:{...}}}
      structured-outputs test added.
    - 48/48 green.
    
    Breaking change for /openai/v1/chat/completions callers
    - response_format={"type":"json_object"} now returns 200 with
      schema-validated JSON content (was 400). Callers using the 400 as a
      control-flow signal must update.
    
    Built against psyb0t/aicodebox:v0.9.0. Older base images are
    incompatible.
  • v0.10.0

    v0.10.0 — track aicodebox v0.8.3 + adapter logging + single-source versioning
    
    aicodebox v0.8.2 backfilled reconstruction-grade logging on the
    schema-mode path. v0.8.3 adopted single-source versioning. This pibox
    release pulls both into the project end-to-end.
    
    Highlights
    - BASE_IMAGE bumped to psyb0t/aicodebox:v0.8.3 (Dockerfile, Makefile,
      tests/common.sh in lockstep). Tag-only pin — digest pending registry
      push.
    - PiAdapter logging brought from zero to reconstruction-grade per
      ~/.claude/rules/06-logging.md. Decode errors, provider errors, schema
      bolt-on, build_argv decisions, parse_output summary — all logged.
      Security-aware: never logs tokens / secrets / full prompts / full
      schemas; only schema keys + truncated samples.
    - Single-source versioning per ~/.claude/rules/49-versioning.md:
      pyproject.toml is THE version; __init__.py reads via
      importlib.metadata; Makefile derives the docker tag from pyproject
      and tags both :v0.10.0 AND :latest. Eliminates the version-drift bug
      that had __version__ stuck at "0.1.0" across every release since
      v0.1.0 itself.
    - New Makefile targets: ``make version`` prints the derived tag.
      ``pull-base`` honors SKIP_BASE_PULL=1 for local-only base builds.
    
    PiAdapter functional contract is unchanged. No wire-level changes to
    /run / OAI / MCP / files-API. Tests: 46/46 green.
    
    Built against psyb0t/aicodebox:v0.8.3 (tag pin). Older base images are
    incompatible — the adapter's logging assumes the base's JSON formatter
    is the configured handler at startup.
  • v0.9.0

    v0.9.0 — track aicodebox v0.8.1, schema validation on OAI + per-attempt usage
    
    This release bumps the base image to aicodebox v0.8.1 and surfaces the
    two meaningful changes the v0.8.x stream brought:
    
      1. /openai/v1/chat/completions with x-aicodebox-json-schema now
         ACTUALLY validates (v0.7.0 plumbed the header but never read
         result.parsed). Success → message.content is canonical
         re-serialized JSON, no fences. Schema-exhaustion → 422.
         Agent crash → 500. stream:true + schema header → 400.
      2. Per-attempt breakdown on /run (.attempts) and OAI envelope
         (.aicodebox_attempts) — caller can bill per-attempt or debug
         which retry failed which way. Top-level .usage is summed
         across attempts so the billable total reflects every retry.
    
    Base image
    - BASE_IMAGE pinned to
      psyb0t/aicodebox:v0.8.1@sha256:3a234d49d348b3182897c781be6b364e6b5d17784c4b70ac12df132e066d6dac
      in both Dockerfile + Makefile. Digest pin guards against tag-rebuild
      drift — :latest and :v0.8.1 currently resolve to different image IDs
      on Docker Hub.
    
    PiAdapter
    - Zero code changes. The base widened RunResult with .attempts but the
      adapter only populates text/session_id/usage; the base writes the
      per-attempt array after run_with_json_retry.
    
    Tests
    - Three updates to surface the v0.8.x contract end-to-end through pibox:
      schema-mode .attempts shape on /run, canonical content + envelope
      vendor extension on OAI schema header, and the new stream+schema 400
      rejection rule.
    
    Doc sync
    - README.md /run body field list rewritten — removes the long-stale
      ``outputFormat`` mention (gone at the base since v0.6.0) and
      documents the current jsonSchema-only contract + previously-missing
      ``includeRaw`` / ``async`` / ``fireAndForget`` knobs.
    - CHANGELOG.md added (full backfill from v0.1.0).
    
    Built against psyb0t/aicodebox:v0.8.1 (digest pinned). Older base
    images are incompatible — the new tests assert behavior that doesn't
    exist below aicodebox v0.8.0.
  • v0.8.0

    v0.8.0 — track aicodebox v0.7.0 x-aicodebox-* OAI headers
    
    aicodebox v0.7.0 exposed six more RunSpec knobs as custom headers on
    /openai/v1/chat/completions:
    
      x-aicodebox-json-schema        flips internal output_format to
                                     json-verbose; schema-validates the
                                     assistant's final turn with up to 3
                                     self-correction retries.
      x-aicodebox-resume             adapter session id to resume.
      x-aicodebox-extra-args         JSON array OR comma-separated string.
      x-aicodebox-timeout-seconds    per-run wall-clock cap.
      x-aicodebox-tools-allowlist    JSON array OR comma-separated string.
      x-aicodebox-no-tools           1/true/yes.
    
    PiAdapter
    - Zero code changes. All six fields were already on RunRequest and
      already consumed by build_argv. The v0.7.0 base only added route
      plumbing — the adapter contract was wide enough. Pibox gets the new
      OAI surface for free.
    
    Tests
    - Three new OAI header tests exercise the new surface end-to-end:
      schema header happy-path, schema header malformed-JSON rejection, and
      extra-args header round-trip in both CSV + JSON-array forms.
    
    Additive, no breaking changes. /run, MCP, and files-API surfaces are
    unchanged. The /v1/chat/completions stream:true path continues to emit
    the same per-token OAI SSE deltas.
    
    Built against psyb0t/aicodebox:latest (aicodebox v0.7.0+). Older base
    images are incompatible — the new tests assert headers that don't
    exist below aicodebox v0.7.0.
  • v0.7.0

    v0.7.0 — align with aicodebox v0.6.0, jsonSchema is the only dial
    
    aicodebox v0.6.0 collapsed the v0.5.0 (verbose × jsonSchema) request
    matrix to one flag. The ``verbose`` field is gone from RunBody;
    ``jsonSchema`` alone now toggles between the lean and full response
    shapes:
    
      jsonSchema set → {runId, workspace, exitCode, text, json,
                        events, sessionId, usage}
                       (+ parseError, jsonRetries on validation failure)
      jsonSchema unset → {runId, workspace, exitCode, text}
    
    Pydantic's ``extra=ignore`` default means stale callers passing
    ``verbose=true`` silently drop the field — no 422 on the vestigial
    flag, just a lean text response.
    
    PiAdapter
    - No code changes. Server derives output_format=json-verbose for
      schema-set runs and text otherwise, then passes through to the
      adapter unchanged. build_argv, parse_output, parse_events, and
      parse_stream_event keep working as before.
    - Comment refresh only — adapter.validate() and parse_output()
      docstrings point at v0.6.0's schema-is-the-only-dial semantics.
    
    Streaming surfaces unchanged
    - /run is a one-shot endpoint — the .events array is buffered and
      returned in the final JSON payload, not streamed line-by-line.
    - /openai/v1/chat/completions with stream:true still emits real
      per-token SSE deltas (chat.completion.chunk frames terminated by
      [DONE]). PiAdapter.parse_stream_event continues to translate pi's
      message_update.text_delta events into canonical StreamEvent deltas.
    
    Breaking changes for callers of /run
    - Drop ``"verbose": true``. To get events + sessionId + usage, set
      ``"jsonSchema": {"type": "object"}`` (or any real schema you want
      validated).
    - Schema-set callers now also receive ``text``, ``events``,
      ``sessionId``, ``usage`` alongside ``json``.
    
    Built against psyb0t/aicodebox:latest (aicodebox v0.6.0+). Older base
    images are incompatible — the new test suite asserts the v0.6.0
    response shape and the legacy-verbose silent-drop behavior.