Repository navigation
feat: expose republic models and media attachments in code mode - #351
Merged
frostming merged 1 commit intoOct 13, 2026
Merged
Conversation
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
bub | 3a3537b | Commit Preview URL Branch Preview URL |
Oct 13 2026, 12:34 AM |
frostming
force-pushed
the
feat/codemode-republic
branch
from
October 10, 2026 09:13
ccaaa68 to
f92a641
Compare
frostming
added this pull request to stack #352
October 10, 2026 09:22
- Add a stdlib `republic` module to run_code: media classes, messages, get_model() (chat and stream), get_embedding_model() and get_decision_model(). Model calls are proxied to Bub, which uses its provider settings and credentials; they never reach the code. - Add code-only tools attach_image/attach_audio/attach_video that accept republic media or a path/URL/data URL and attach it to the run_code result, sent to the model as a multimodal tool message. - Add content results (bub.tools.content_result) for tool results with media; spilling bounds only their text. - Add Environment.read_bytes with a default that runs the environment's python. - Document the republic module in the code mode stub and prompt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
frostming
force-pushed
the
feat/codemode-republic
branch
from
October 13, 2026 00:32
f92a641 to
3a3537b
Compare
frostming
removed this pull request from stack #352
October 13, 2026 00:53
frostming
merged commit Oct 13, 2026
80ca6c0
into
refactor/republic-provider-migration
6 checks passed
frostming
added a commit
that referenced
this pull request
Oct 13, 2026
- Add a stdlib `republic` module to run_code: media classes, messages, get_model() (chat and stream), get_embedding_model() and get_decision_model(). Model calls are proxied to Bub, which uses its provider settings and credentials; they never reach the code. - Add code-only tools attach_image/attach_audio/attach_video that accept republic media or a path/URL/data URL and attach it to the run_code result, sent to the model as a multimodal tool message. - Add content results (bub.tools.content_result) for tool results with media; spilling bounds only their text. - Add Environment.read_bytes with a default that runs the environment's python. - Document the republic module in the code mode stub and prompt. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
frostming
added a commit
that referenced
this pull request
Oct 14, 2026
* refactor: use Republic for builtin models and authentication
* refactor: consume native model outputs
* refactor: delegate request extras to Republic
* refactor: simplify builtin options and naming
* chore: use Republic 0.6 preview
* Refactor prompt handling and improve compatibility with legacy content
- Introduced `republic` module to manage media types and user content.
- Updated tests to validate new prompt structure and legacy content conversion.
- Modified `build_prompt` to return a list of `UserContent` instead of legacy formats.
- Enhanced documentation to reflect changes in prompt handling and hook signatures.
- Adjusted various tests to ensure compatibility with new prompt formats and legacy support.
Signed-off-by: Frost Ming <me@frostming.com>
* fix: replay Chat Completions tool calls from older tapes
Older Bub versions recorded tool calls as
{"id", "type": "function", "function": {"name", "arguments"}}, which
republic.Message.from_dict rejects with KeyError: 'name', so sessions
with such tapes could not build their context. Convert them to
Republic's form in to_message, next to the other legacy conversions.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: identify Republic model clients as bub/{version}
Send User-Agent: bub/{version} instead of Republic's default through
AgentSettings.model_client_kwargs, used by the model runner, code mode
and onboarding. A User-Agent in client_args.headers still wins.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: expose republic models and media attachments in code mode (#351)
- Add a stdlib `republic` module to run_code: media classes, messages,
get_model() (chat and stream), get_embedding_model() and
get_decision_model(). Model calls are proxied to Bub, which uses its
provider settings and credentials; they never reach the code.
- Add code-only tools attach_image/attach_audio/attach_video that accept
republic media or a path/URL/data URL and attach it to the run_code
result, sent to the model as a multimodal tool message.
- Add content results (bub.tools.content_result) for tool results with
media; spilling bounds only their text.
- Add Environment.read_bytes with a default that runs the environment's
python.
- Document the republic module in the code mode stub and prompt.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* refactor!: extract an event-driven core agent into bub.core (#356)
* docs: update README to improve clarity and organization of content
Signed-off-by: Frost Ming <me@frostming.com>
* feat: accept republic built-in tools in core Agent
Co-Authored-By: Claude Opus 5.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.
Stacked on #349 (Republic 0.6 migration).
What changed and why
Code written by the model in
run_codecan now call models and show media to the model.republicmodule insiderun_code(preset global, also importable asrepublic,republic.events,republic.decisions). It is a stdlib shim incode_runner_child.py:Image/Audio/Video, messagessystem()/user()/assistant()get_model(spec=None)withchat()andstream(). Without a spec it uses the session model.get_embedding_model(spec)(embed/embed_many) andget_decision_model(spec)(decidewithNoul/Choice/Score)republic.<op>calls over the existingcall_toolchannel.RepublicSession(codemode/republic_bridge.py) then runs them with Bub's provider settings and credentials, so credentials never reach model-written code.stream_nextreturns every event that has arrived. Streams the code leaves open are closed whenrun_codeends."$republic"key.attach_image/attach_audio/attach_video.republicmedia object, or a file path in the environment, a URL, or a data URL, and load it themselves.run_coderesult, which becomes a multimodal tool message.bub.tools.content_result()builds a JSON tool result ({"type": "tool_content", ...}) that carries text and media.ToolExecutordoes not re-render it, tape context turns it into a multimodalrepublic.toolmessage, and spilling bounds only its text.Environment.read_bytes(), non-abstract. The default runs the environment'spythonto print the file;LocalEnvironmentreads the file directly.republicmodule and has a streaming example.republic.Image | str.$defsnested in a parameter schema.Impacted modules
bub.builtin.codemode(__init__,code_runner_child, newrepublic_bridge),bub.tools,bub.environment,bub.builtin.environment,bub.builtin.context,bub.builtin.hook_impl(spill), website docsbuild/tools.mdx(en + zh-cn).Limitations
chat()/stream()do not supporttools,tool_choiceoroutput_schema.before_llm_callhooks or tracing spans.X | Yinisinstance, so the environment's Python must be 3.10+.Verification
uv run ruff check .: passeduv run mypy src: no issuesuv run pytest -q: 596 passed, 20 skippedtests/test_codemode.py,tests/test_spill.py,tests/test_environment.pycover:read_bytes🤖 Generated with Claude Code