pier
Pier is a Harbor-compatible framework for evaluating coding agents in sandboxed environments. It reads Harbor's task format and runs trials against it.
pier run -p path/to/task --agent claude-code --env modal
Why pier
Pier is a fork. We wanted a smaller, more opinionated base to build on. On top of Harbor, Pier adds:
- Installed agents in air-gapped tasks (
allow_internet = false). When the agent runs inside the sandbox (Claude Code, Codex, etc.), both the install step and the inference call need the network. Pier lets agents declare their install scripts and a network allowlist, whichdockerandmodalenvironments honor when setting up the sandbox. - Augmented ATIF v1.7. Strict one step per API turn, strict reasoning vs agent message separation, no fabricated assistant text,
peak_context_tokens,summarization_count,llm_call_count, real upstream timestamps. - A chat-style trajectory viewer (
pier view). pier critique runfor inspecting completed trials with a fresh agent in a fresh sandbox.
What works today
- Task format: Harbor-compatible.
- Environments:
docker,modal. Per-agent install specs and network allowlists are honored on both, so installed agents work underallow_internet = false. - Agents:
nop,oracle,antigravity-sdk,claude-code,codex,cursor-cli,gemini-cli,opencode,mini-swe-agent. All emit augmented ATIF v1.7. - Datasets: local Harbor-format task directories via
-p/--path. - CLI:
pier run,pier job,pier view,pier critique run,pier check/pier analyze(vendored from Harbor)
Pier does not currently resolve or download Harbor registry datasets directly.
Install
uv tool install datacurve-pier
# or
pip install datacurve-pier
Run
export ANTHROPIC_API_KEY=...
pier run -p path/to/task --agent claude-code --env modal --env-file .env
Run a local dataset, optionally a deterministic random subset:
pier run -p path/to/dataset --agent claude-code --env modal
pier run -p path/to/dataset --n-tasks 10 --sample-seed 0
To use a Harbor registry dataset, download it with Harbor first, then point Pier at it:
uv run --directory ~/code/harbor harbor download swebenchpro -o ~/code/pier/datasets
uv run pier run -p datasets/swebenchpro --n-tasks 10 --sample-seed 0
Trials land under jobs/<timestamp_or_name>/<trial_id>/. See pier run --help, pier job --help, pier critique --help, and pier view --help for everything else.
Agent runtime configuration
Use agent.model_name for trial metadata, agent.env for runtime env vars, and agent-specific kwargs for tool config. Pier's network allowlist also reads URLs out of those configs (Codex config_toml, OpenCode opencode_config, mini-swe config_yaml), so any base URL you set is allowlisted without code changes.
A few things we've learned plumbing this through Respan and OpenRouter:
Claude Code routes through the Anthropic face from Respan. Plan mode is disabled by default (--disallowedTools EnterPlanMode).
- name: claude-code
model_name: claude-opus-4-7
env:
ANTHROPIC_AUTH_TOKEN: ${RESPAN_API_KEY}
ANTHROPIC_BASE_URL: https://endpoint.respan.ai/api/anthropic
ANTHROPIC_CUSTOM_HEADERS: "X-Respan-Route-Provider: vertex_ai"
kwargs:
reasoning_effort: max
Codex needs a [model_providers.<name>] block with wire_api = "responses" (not WebSockets, which Codex defaults to and Respan doesn't speak).
- name: codex
model_name: openai/gpt-5.5
env: { RESPAN_API_KEY: ${RESPAN_API_KEY} }
kwargs:
config_toml: |
model_provider = "respan"
[model_providers.respan]
name = "Respan Gateway"
base_url = "https://endpoint.respan.ai/api/"
wire_api = "responses"
env_key = "RESPAN_API_KEY"
reasoning_effort: xhigh
Gemini CLI:
- name: gemini-cli
model_name: gemini/gemini-3.1-pro-preview
env:
GEMINI_API_KEY: ${RESPAN_API_KEY}
GOOGLE_GENERATIVE_AI_API_KEY: ${RESPAN_API_KEY}
GEMINI_API_BASE: https://endpoint.respan.ai/api/google/vertexai/v1beta
GOOGLE_GEMINI_BASE_URL: https://endpoint.respan.ai/api/google/vertexai/
Antigravity SDK runs Google's Python SDK with its platform-specific local
harness in an isolated Python 3.12 environment with hash-verified, fully locked
dependencies. It supports Pier skills, stdio and streamable-HTTP MCP servers,
and live ATIF checkpoints. reasoning_effort accepts minimal, low, medium,
or high; None uses medium. SSE MCP servers are not supported by
google-antigravity 0.1.9.
- name: antigravity-sdk
model_name: google/gemini-3.6-flash
env:
GEMINI_API_KEY: ${GEMINI_API_KEY}
kwargs:
reasoning_effort: high
Cursor CLI uses the installed cursor-agent binary, so it fits the same
inside-the-sandbox path as Claude Code, Codex, Gemini CLI, and OpenCode. Use
cursor/composer-2.5 for Composer 2.5 trial metadata and pass CURSOR_API_KEY
through your env file.
- name: cursor-cli
model_name: cursor/composer-2.5
env:
CURSOR_API_KEY: ${CURSOR_API_KEY}
OpenCode uses opencode_config to add unknown providers or override known ones. To redirect Google to Respan, override just options.baseURL; to add a fully custom provider, use opencode_config.provider.<name> with the npm package, options, and models.
mini-swe-agent picks a native adapter from the model-name prefix: openai/... → litellm_response (OpenAI Responses end-to-end), openrouter/... → openrouter (BYOK costs from cost_details.upstream_inference_cost), everything else → LiteLLM auto.
For Gemini 3 via mini-swe-agent/LiteLLM, omitting reasoning_effort uses the Gemini API default high/dynamic thinking level, but it does not request readable thought summaries. Set kwargs.reasoning_effort: high explicitly when you want LiteLLM to send includeThoughts and preserve returned summaries as reasoning content.
- name: mini-swe-agent
model_name: openrouter/qwen/qwen3.6-plus
env: { OPENROUTER_API_KEY: ${OPENROUTER_API_KEY} }
kwargs:
set_cache_control: default_end
Metadata
Release files for datacurve-pier 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| datacurve_pier-0.3.1.tar.gz | 257.8 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| datacurve_pier-0.3.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 568.1 kB
Release files / datacurve_pier-0.3.1.tar.gz
| Download URL | datacurve_pier-0.3.1.tar.gz |
|---|---|
| Size | 257.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f0ce5b676f3fa6e0ace71c932372ca605de8368efc738116e0cc6cf8c58aec78
|
|
BLAKE2b-256 checksum How to use checksums |
b74780a079a106027b8bce47a2353579cf4812fa374328a5ec57bd93120a58e3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.27 {"installer":{"name":"uv","version":"0.9.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / datacurve_pier-0.3.1-py3-none-any.whl
| Download URL | datacurve_pier-0.3.1-py3-none-any.whl |
|---|---|
| Size | 310.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6986b3cb5f66aada5ed6edcc9f045cdf62d19f66b95ff99c706ec8e835981ae1
|
|
BLAKE2b-256 checksum How to use checksums |
f3709b9d587f98cc383aa1e481510c924fbfb5d3c98260ec77068b1adee92185
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.27 {"installer":{"name":"uv","version":"0.9.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for datacurve-pier 0.3.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.