Repository navigation
Delete the broken blueprints, fix the README, bump to 0.2.0 - #25
Merged
Merged
Conversation
blueprints/single_provider/ was the last place carrying the bugs fixed in #24. All four agent.py files still declared `"image": pxt.Image`, still passed `system=` to anthropic's messages(), and still splatted `**chat_kwargs` -- and the four README.md files embedded that same broken code inline, under a heading telling people to connect them to Cursor, Windsurf and Cline. Anyone following that instruction pasted code that cannot run. Deleted, 15 files and ~3200 lines. Same reasoning as multi_provider in #24: all four providers ship in the package, so the blueprint is one import away from `pip install pixelagent` and teaches nothing the package does not. That section of the README is now the install line and a five-line Quick Start. The ReAct example in the README had never executed either: it defined a @pxt.udf in a script's global namespace (a hard error), and twice called `Agent(name="financial_planner")` without the required system_prompt. After #24 it would also have hit SchemaConflict, because it rebuilt the same agent name with a different toolset. It is rewritten around what #24 made possible. The loop existed to vary the system prompt per step, which used to mean reconstructing the agent; the prompt is row data now, so it is one agent and a per-call override. The loop gets shorter and the example demonstrates the change instead of working around it. Adds a "Migrating from 0.1.x" section covering the four caller-visible changes, and bumps the version. Every 0.1.x release is broken against Pixeltable 0.7.3+, and PyPI still serves 0.1.5 with an unbounded `pixeltable>=0.3.15`, so this needs to be published to actually reach anyone. All five README python blocks now compile. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
CI's `uv sync --locked` correctly refused a lockfile still recording 0.1.6. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
pierrebrunelle
added a commit
that referenced
this pull request
Sep 10, 2026
0.2.0 has been on `main` since #25, but PyPI still serves **0.1.5**, so nobody has actually received the fix. This makes releasing a tag push. ## The old script was broken `scripts/release.sh` could not have worked as-is: - required a git remote named `home`; a normal clone has `origin` - read a long-lived `PYPI_API_KEY` out of `~/.pixeltable/config.toml` - called `poetry build` after #24 moved the project to uv - **published without ever installing what it built** That last one is how 0.1.x shipped a package that could not import against a current Pixeltable. Nothing in the release path ever tried it. ## Releasing now ```bash git tag v0.2.0 && git push origin v0.2.0 ``` **There is no token.** PyPI Trusted Publishing mints a short-lived credential from the workflow's OIDC identity, so there is nothing to leak, rotate, or paste into a shell. The build job refuses to publish an artifact it has not exercised: 1. tag must match `pyproject.toml` version 2. `uv build` + `twine check` 3. install the built wheel into a clean venv and **construct a real agent with it** Verified locally on both projects. Worth noting: the wheel resolves **pixeltable 0.7.7** through the `<0.8` bound and works — newer than the 0.7.6 we targeted, so the bound is doing its job. ## What you need to do once On PyPI, **Manage project → Publishing → Add a pending publisher**: | field | value | |---|---| | owner | `pixeltable` | | repository | `pixelagent` | | workflow | `release.yml` | | environment | `pypi` | Then tag. `RELEASING.md` has the full process. Two optional extras: add a required reviewer to the `pypi` environment (Settings → Environments) if you want a human gate before each publish, and run the workflow from the Actions tab with `dry_run` checked to exercise the whole path without publishing. ## Still not done by this PR Adding `OPENAI_API_KEY` / `ANTHROPIC_API_KEY` / `GEMINI_API_KEY` as repo secrets, so the `live` job can run. Without it, two things stay unverified: whether anthropic's `model_kwargs={"system": ...}` reaches the SDK as a top-level `system`, and whether bedrock's `inference_config=` maps `temperature` as the old splat did. I did not add those — I don't handle credentials. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Follow-up to #24. Two things it left behind, plus the version bump.
The blueprints were the last copy of the bugs
blueprints/single_provider/still carried everything #24 fixed. All fouragent.pyfiles declared"image": pxt.Image, passedsystem=to anthropic'smessages(), and splatted**chat_kwargs— and the fourREADME.mdfiles embedded that same broken code inline, under a heading telling people to connect them to Cursor, Windsurf and Cline. Anyone following that instruction pasted code that cannot run.Deleted: 15 files, ~3,200 lines. Same reasoning as
multi_providerin #24 — all four providers ship in the package, so a blueprint is one import away frompip install pixelagent. That README section is now the install line and a five-line Quick Start.The ReAct example had never executed
It defined a
@pxt.udfin a script's global namespace (a hard error since the UDF must be importable by name), and twice calledAgent(name="financial_planner")without the requiredsystem_prompt. After #24 it would also have hitSchemaConflict, since it rebuilt the same agent name with a different toolset.Rewritten around what #24 made possible. The loop existed to vary the system prompt per step, which used to mean reconstructing the agent; the prompt is row data now, so it is one agent and a per-call override:
The loop gets shorter and the example demonstrates the change instead of working around it. All five README python blocks now compile.
Version
0.1.6→0.2.0, plus a Migrating from 0.1.x section covering the four caller-visible changes: Python 3.11+,SchemaConflicton a changed model/toolset, per-turn config overrides, and the newconversation_id.This still needs publishing to reach anyone. PyPI serves 0.1.5 with an unbounded
pixeltable>=0.3.15, so a freshpip install pixelagenttoday resolves Pixeltable 0.7.6 and gets the broken code. The merge fixed the repo, not the install. I have not published — that is yours to run.Unchanged from #24's open items
livejob still needsOPENAI_API_KEY/ANTHROPIC_API_KEY/GEMINI_API_KEYsecrets. Two things stay unverified without it: whether anthropic'smodel_kwargs={"system": ...}reaches the SDK as a top-levelsystem, and whether bedrock'sinference_config=mapstemperatureas the old splat did.amazon.nova-pro-v1:0returnsValidationExceptionon on-demand throughput.main(1 critical, 23 high). Pre-existing, unrelated to this work.81 keyless tests, ruff clean.
🤖 Generated with Claude Code