Spaces:
Running on CPU Upgrade
Running on CPU Upgrade
Commit History
-
Update agent/tools/research_tool.py
Verified signatureFixed the spelling errors in the tool prompt.6e274bc
-
Deploy 2026-04-30
Co-authored-by: OpenAI Codex <codex@openai.com>ebeb11b -
Add DeepSeek V4 Pro model option (#189)
Unverified signature* Add DeepSeek V4 Pro model option Co-authored-by: Codex <codex@openai.com> * Remove DeepSeek feature tests Co-authored-by: Codex <codex@openai.com> --------- Co-authored-by: Codex <codex@openai.com>1b922dd -
Deploy 2026-04-30
Co-authored-by: OpenAI Codex <codex@openai.com>fef2d3e -
Add Hugging Face Space metadata
Co-authored-by: OpenAI Codex <codex@openai.com>decd08c -
Make sandboxes private (#195)
Unverified signature* Make sandbox Spaces private Co-authored-by: Codex <codex@openai.com> * Remove legacy sandbox auth fallback Co-authored-by: Codex <codex@openai.com> * Address sandbox privacy review comments Co-authored-by: Codex <codex@openai.com> --------- Co-authored-by: Codex <codex@openai.com>15d6506 -
Expose OpenAI models in the UI & make Claude model picker configurable (#183)
Unverified signature* Add agent dev server notes * Make frontend model configurable * Support env-selected frontend models * Use Claude-specific model env var * Add GPT-5.5 to web model picker * Gate GPT-5.5 as a premium model * Avoid duplicate session model fetch * Remove legacy Claude quota aliases * Document GitHub CLI PR body workflow * Gate only deployed paid model IDs * Nits5db99fa
-
feat(telemetry): track 5 untracked Bedrock call sites for full cost attribution (#179)
Guillaume SalouUnverified signature* feat(telemetry): track 5 untracked Bedrock call sites for full cost attribution Cost Explorer ($78,738 over 6 days) vs the session dataset's total_cost_usd (~$354/day attributed) showed the dataset captures only ~33% of real Bedrock spend. Root cause: out of 9 acompletion() call sites, only 2 (in agent_loop.py) emit the llm_call event that total_cost_usd sums. This wires telemetry into the 5 Bedrock-billing call sites that were flying blind, with a `kind` tag on each call so analytics can split spend by category: - research_tool.py × 3 → kind="research" (sub-agent loop) - context_manager.py → kind="compaction" (history summary) - effort_probe.py → kind="effort_probe" (cascade walk) Plus a fourth tag for the session-restore summary path (session_manager.py → kind="restore"). Plumbing changes: - telemetry.record_llm_call now accepts kind="..." (default "main" preserves existing behavior). - summarize_messages() and ContextManager.compact() take optional ses…7867a7a
-
Deploy 2026-04-28
dcd22bf -
Replace orange JobsUpgradeDialog with sleek full-pane billing screen (#175)
Aksel Joonas ReediUnverified signature- Drop the HF-orange gradient bar, orange icon chip, and orange button. Card now uses --panel/--border with a single high-contrast --text/--bg primary button and a ghost secondary, matching the rest of the UI. - Render as a full-pane fixed overlay rather than a small Dialog so the chat is genuinely blocked while billing is required — the agent's previous turn already ended on `tool_state_change(billing_required)`, so the screen acts as the explicit "paused, waiting on you" state. - Always show both actions side-by-side: "Add credits" (opens the HF billing tab + arms the visibility-change auto-retry in ChatInput) and "I've added credits" (calls the existing onRetry → resume message). Removes the Topped-up? mode-flip; the visibility-change handler in ChatInput continues to fire on tab refocus, unchanged. - Keep the component name and props so ChatInput needs no changes.c4ac4e6 -
Track Pro conversions + credits top-up; emit user_id + new KPIs (#174)
Aksel Joonas ReediUnverified signatureAdds two telemetry events the dashboard needs to answer "how many users converted to Pro?" and "how many came back from a billing block?": - pro_conversion: per-user Pro state lives in a new Mongo `pro_users` collection. mark_pro_seen upserts on every authenticated request and uses an atomic find_one_and_update to fire at-most-once when a user first appears as Pro after having been seen as non-Pro. Wired through session_manager.create_session via the existing `is_pro` signal from /auth. - credits_topped_up: fires from jobs_tool when an hf_job submit succeeds in a session that previously hit a billing-required tool_state_change. Guarded against re-firing within a session. build_kpis aggregates both as plain count columns. CLI/local users with no Mongo silently skip via the NoopSessionStore stub.2715896 -
Deploy 2026-04-28 — PR #173 (jobs access plan attr fix)
9761d6b -
Fix _fetch_user_plan after JobsAccess.plan removal (#173)
Aksel Joonas ReediUnverified signaturePR #172 removed the `plan` attribute from `JobsAccess`, but `backend/dependencies.py` still called `jobs_access_from_whoami(whoami).plan`. Every authenticated request hit `AttributeError: 'JobsAccess' object has no attribute 'plan'` and returned 500 — the live Space went down right after deploying #172. Inline the Pro/free/org derivation directly off the whoami payload so the Claude daily-cap tier no longer depends on the HF-Jobs JobsAccess shape (those concerns split with #172). Behaviour matches the pre-#172 mapping: isPro / `pro|enterprise|team` plan strings → "pro", any org membership → "org", everything else → "free".c21a9b1 -
Fix _fetch_user_plan after JobsAccess.plan removal
PR #172 removed the `plan` attribute from `JobsAccess`, but `backend/dependencies.py` still called `jobs_access_from_whoami(whoami).plan`. Every authenticated request hit `AttributeError: 'JobsAccess' object has no attribute 'plan'` and returned 500 — the live Space went down right after deploying #172. Inline the Pro/free/org derivation directly off the whoami payload so the Claude daily-cap tier no longer depends on the HF-Jobs JobsAccess shape (those concerns split with #172). Behaviour matches the pre-#172 mapping: isPro / `pro|enterprise|team` plan strings → "pro", any org membership → "org", everything else → "free".8c4f619 -
Deploy 2026-04-28
d69af77 -
Bill HF Jobs by namespace credits, drop Pro and org-join gating (#172)
Aksel Joonas ReediUnverified signature* Bill HF Jobs by namespace credits, drop Pro and org-join gating - Drop the Pro/Team subscription pre-check on hf_jobs. Any namespace the caller belongs to is eligible; HF returns a billing error at job creation time if the wallet is empty, which the agent surfaces as a "top up to launch" dialog pointing at /settings/billing. - Remove the "Join ML Agent Explorers" onboarding step. The org-join hook, /auth/org-membership endpoint, and the OAuth orgIds suggestion are gone. - Rework JobsUpgradeDialog: namespace picker shows all eligible accounts/orgs with avatars + select rings; billing mode opens the HF billing page; "Skip this tool call" stays available for both. - Backend pre-flight only forces the picker when the caller has multiple eligible namespaces; single-namespace users default to their personal account silently. - jobs_tool now catches HfHubHTTPError, detects billing failures by pattern + 402 status, emits a tool_state_change(state=billing_required) so t…bed4e38 -
Deploy 2026-04-28
649feee -
Persist Space sessions in MongoDB (#170)
Aksel Joonas ReediUnverified signature* Persist Space sessions across backend restarts The hosted Space lost active conversations because sessions, approval state, event streams, and Claude quotas only lived in process memory. This adds a shared optional Mongo store for frontend sessions while keeping local and CLI runs on the no-op/local path when Mongo is absent. Constraint: Space deployment needs durable state without making PyPI/local CLI users configure Mongo. Constraint: Frontend deletes must hide sessions with a visibility tag, not erase traces needed for recovery or SFT export. Rejected: Restore every active session at startup | large user counts would create a thundering herd after deploys. Rejected: Store one giant session document | Mongo document limits make per-message snapshot docs safer. Confidence: medium Scope-risk: broad Directive: Keep session_messages as compactable runtime snapshots and session_trace_messages/session_events as append-only raw traces; do not collapse them into one collection wit…d9d9785 -
Update system prompt to reflect new role title (#169)
Unverified signature0f5b5cc -
fix(sandbox): retry cleanup on transient failures + add backstop sweeper (#163)
Guillaume SalouUnverified signature* fix(sandbox): retry delete on transient failures + add backstop sweeper The agent creates a sandbox Space per session (template duplicated from burtenshaw/sandbox into the user's account). A scan on 2026-04-27 found 2,310 orphan sandbox-* Spaces — every sandbox ever created was still around. Two failure modes were causing the leak: 1. The cleanup in `_run_session.finally` doesn't fire if the pod is killed (OOM, deploy rollout, pre-emption) or if the WebSocket drops without a /shutdown. 2. When `sandbox.delete` itself failed (HF API 5xx, transient network blip, rate-limit), the previous code logged a warning and moved on. No retry, no recovery — the Space lived forever. This PR addresses both: - `_cleanup_sandbox` now retries 3× with exponential backoff (1s, 2s). Closes the transient-failure path. - New `scripts/sweep_orphan_sandboxes.py` is a standalone sweeper that finds sandbox-* forks of burtenshaw/sandbox older than N days and deletes them. Designed to run …1d50c78
-
Make onboarding screen scroll when it overflows the viewport (#165)
Aksel Joonas ReediUnverified signature* Make onboarding screen scroll when it overflows the viewport The welcome screen used a flex column with justify-content: center and no overflow handling, so on short viewports (1366×768 Chrome was the reported case) the bottom of the checklist — including the "Start session" CTA — got clipped with no way for the user to scroll to it. Wrap the children in an inner Box and use the margin: auto pattern: the outer container scrolls, the inner box centers when the viewport has room and top-aligns when it doesn't. Reported in smolagents/ml-intern Space discussion #19. * Reindent welcome screen children under inner Box21aa9ca -
Recognize Pro OAuth users via isPro flag (#164)
Aksel Joonas ReediUnverified signatureOAuth whoami responses set type="user" and only signal Pro status with the isPro boolean. The previous code matched the type key first and only fell through to isPro when no plan/type/accountType string was present, so type="user" + isPro=true was classified as free and Pro OAuth users got blocked from running Jobs. Reorder the check so isPro takes priority. Add a regression test for the OAuth shape. Reported in smolagents/ml-intern Space discussion #21.895c557 -
Remember the chosen jobs namespace and clean up the picker dialog (#162)
Aksel Joonas ReediUnverified signatureWhen a user has paid orgs but no Pro subscription, hf_jobs needs an explicit namespace. The picker fired on every tool call — even after the user already chose one. Persist the selection in localStorage and auto-attach it to subsequent hf_jobs approvals; if the saved namespace becomes invalid (e.g. left the org), backend 400 surfaces a typed error that clears the preference and reopens the picker. UI is rewritten to match ClaudeCapDialog: tighter copy, single dropdown without the redundant "Eligible namespaces" panel, "Continue" + "Skip this tool call" actions.25d8236 -
Embed trackio dashboard in chat for jobs and sandboxes (#161)
Aksel Joonas ReediUnverified signature* Embed trackio dashboard in chat for jobs and sandboxes Wires `trackio_space_id` / `trackio_project` through hf_jobs and sandbox_create as optional tool args, then renders the resulting dashboard inline as an embedded iframe in the chat. The plumbing turned out to need four pieces, not two: 1. Inject TRACKIO_SPACE_ID / TRACKIO_PROJECT into job + sandbox env. 2. Surface the values in tool_state_change so the frontend can render the embed when the tool call is in flight. 3. Pre-seed the Space with our own README/requirements/app.py — without this, trackio's init() against an existing empty Space leaves the iframe stuck on the default Gradio template. We omit `hf_oauth: true` from the seeded README so the embed renders without a sign-in click; per-user privacy comes from HF namespace ownership. 4. Mount the metrics bucket on the dashboard Space at /data and set TRACKIO_DIR / TRACKIO_BUCKET_ID. trackio.init() in the job creates the bucket but o…6131fc8 -
feat(kpis): per-tool counts, research engagement, surface split (#160)
Aksel Joonas ReediUnverified signature* feat(kpis): per-tool counts, research engagement, surface split Adds intra-session telemetry to the KPI rollup so the observatory dashboard can answer "is the agent reaching for research?" and "which tools dropped out of the mix?". Production data (Apr 21->27, 21k+ sessions) shows the sessions-with-research rate dropped from ~78% on Apr 21 to ~56% on Apr 27 — without per-tool counts in the rollup, that signal was invisible to the dashboard. Also resolves the long-standing drift between this repo's scripts/build_kpis.py and the observatory's backend/build_kpis.py (both pipelines write to smolagents/ml-intern-kpis; whichever ran last dropped the other's columns). The observatory copy was the superset; this PR brings scripts/ up to it. Going forward both copies are byte-identical. Drift fix (incoming from observatory): - cost_per_session_mean / _p50 / _p95 - tool_calls_total / _succeeded / _failed counts - successful_sessions / errored_sessions / regenerated_sessions counts - sandbox…f9305f6 -
Add web search so the agent can cite current sources (#159)
Aksel Joonas ReediUnverified signatureThe agent had research tools for papers, docs, and repositories, but no direct current-web lookup. This ports Claw Code's WebSearch behavior into a Python tool that searches DuckDuckGo HTML, extracts citeable title/URL hits, applies domain filters, and returns the same JSON-shaped result payload for model consumption. Constraint: The implementation was prepared in a writable checkout because the primary working tree was sandbox read-only during this session. Rejected: Add a new search API dependency | the Claw implementation uses the DuckDuckGo HTML endpoint and the repo already has requests. Confidence: medium Scope-risk: narrow Directive: Keep the output schema stable unless the agent prompt/tool consumers are updated together. Tested: pytest tests/unit/test_web_search_tool.py tests/unit/test_malformed_args_recovery.py -q Tested: python -m compileall agent/tools/web_search_tool.py agent/core/tools.py agent/tools/research_tool.py agent/tools/__init__.py tests/unit/test_web_sear…72f615f -
feat: add support to open links in new tab (#76)
Darshan Thakare +1: Aksel Joonas ReediUnverified signatureCo-authored-by: Aksel Joonas Reedi <125026660+akseljoonas@users.noreply.github.com>bce8a45 -
Document Trackio alerts + iteration loop in system prompt (#156)
Aksel Joonas ReediUnverified signatureThe prompt previously had a one-liner about `report_to=["trackio"]` and flagged `run_name` as a wrong field (it is the correct field on TrainingArguments/SFTConfig/GRPOConfig). Replace with a focused Trackio section covering: - correct config fields (report_to, run_name, project, trackio_space_id) and the TRACKIO_PROJECT / TRACKIO_SPACE_ID env-var alternatives - trackio.alert(title, text, level) as the structured feedback channel, with ERROR/WARN/INFO semantics and an actionable-text requirement - how to wire alerts via a TrainerCallback (on_log vs on_evaluate) - CLI/Python recipes for reading alerts back between iterations - decision rules from prior alerts -> next config Also moves the dataset-format block back inside "When writing ML code" where it belongs.4b76ae8 -
Add Slack gateway (#116)
Unverified signature* Add messaging gateway and notify tool Co-authored-by: OpenAI Codex <codex@openai.com> * Handle Bedrock streaming permission denials Co-authored-by: OpenAI Codex <codex@openai.com> * Revert "Handle Bedrock streaming permission denials" Co-authored-by: OpenAI Codex <codex@openai.com> * Add automatic completion notifications Co-authored-by: OpenAI Codex <codex@openai.com> * Auto-attach CLI notification destinations Co-authored-by: OpenAI Codex <codex@openai.com> * Defer CLI completion notifications until render Co-authored-by: OpenAI Codex <codex@openai.com> * Increase completion notification summary cap Co-authored-by: OpenAI Codex <codex@openai.com> * Add Slack user notification defaults Co-authored-by: Codex <codex@openai.com> * Increase Slack turn completion summary limit Co-authored-by: Codex <codex@openai.com> * Remove legacy auto notification event upgrade Co-authored-by: Codex <codex@openai.com> * Require session config instead of hard-coded model fallback C…6155b26 -
fix(session-uploader): forward user_id and total_cost_usd to dataset row (#153)
Guillaume SalouUnverified signaturePR #136 added user_id + total_cost_usd to Session.get_trajectory(), but the upload path builds session_row with hardcoded fields and drops anything extra. Result: rows in smolagents/ml-intern-sessions still show user_id=null even though the trajectory dict carries the values. Confirmed by kubectl exec on the running pod: session.py is patched correctly, but uploaded sessions still have null fields because they go through this hardcoded shape. Forward both fields explicitly via .get() so older sessions that lack them still upload cleanly with null.2d4ec20 -
Honor interactive model override after current CLI changes (#111)
Seunghyeon Kim +1: akseljoonasUnverified signatureThe interactive CLI accepted --model but did not pass it into main(), so the REPL used the configured default while headless mode honored the flag. Reapply the override on top of the current token/session plumbing by changing only the interactive main signature, config override, and CLI dispatch. Constraint: Current main already passes user_id into submission_loop and uses shared HF token resolution; this fix must preserve both paths. Rejected: Reuse the old PR diff verbatim | it drops newer user_id/session identity changes and conflicts with current main. Confidence: high Scope-risk: narrow Directive: Keep --model behavior identical for interactive and headless paths; banner should render the resolved model. Tested: python -m py_compile agent/main.py tests/unit/test_cli_rendering.py Tested: UV_CACHE_DIR=/tmp/uv-cache uv run --extra dev pytest tests/unit/test_cli_rendering.py -q Tested: UV_CACHE_DIR=/tmp/uv-cache uv run --extra dev pytest tests/unit/test_llm_params.py tests/uni…ae86333 -
Use `huggingface_hub.get_token()` for auth fallback (#126)
Unverified signature* Use cached HF login token for router auth fallback Let HF router requests resolve credentials from huggingface_hub's local login cache when INFERENCE_TOKEN, session token, and HF_TOKEN are absent. This keeps CLI and plugin flows working after `hf auth login` without requiring explicit env exports. Made-with: Cursor * Consolidate Hugging Face token resolution Centralize HF token cleanup and lookup so router calls, CLI startup, and backend request paths do not drift after adding huggingface_hub.get_token() fallback. The backend request helper intentionally keeps browser/user token precedence separate from local cached CLI auth. Constraint: huggingface_hub.get_token() already handles HF_TOKEN, HUGGING_FACE_HUB_TOKEN, and the local hf auth login cache. Rejected: Use cached login tokens for backend request auth | would let server-local credentials stand in for the browser user. Confidence: high Scope-risk: narrow Directive: Keep router-token fallback and request-user token extrac…7a76ad1 -
fix(packaging): ship configs/ directory so non-editable installs work (#133)
Unverified signature* fix(packaging): ship configs/ directory so non-editable installs work CLI_CONFIG_PATH in agent.main resolves to <site-packages>/configs/cli_agent_config.json, but [tool.setuptools.packages.find] only included "agent*" so neither configs/ nor its JSON files were copied during a non-editable install (uv tool install, pip install without -e). Editable installs worked by accident because they reference the source tree directly. Result: ml-intern crashed at startup with FileNotFoundError on every fresh non-editable install, until the configs were manually copied into site-packages. Make configs/ a real package (empty __init__.py) and ship its JSON via [tool.setuptools.package-data]. Verified with uv tool install --reinstall. * fix(packaging): also ship agent/prompts/*.yaml + agent/README.md Same root cause as the configs/ shipping fix in the prior commit, with a worse symptom: ContextManager._load_system_prompt opens agent/prompts/system_prompt_v3.yaml at runtime, but setuptools does…f893532 -
Protect sandbox control-plane routes (#142)
Aksel Joonas ReediUnverified signature* Protect sandbox control-plane routes The sandbox server exposed command and file APIs on public Spaces without validating the client. This adds bearer-token validation to every non-health endpoint and provisions a per-sandbox API secret so control-plane access is not coupled to URL knowledge. Constraint: Existing sandboxes may only have HF_TOKEN configured, so the server accepts SANDBOX_API_TOKEN first and falls back to HF_TOKEN for compatibility. Rejected: Make every sandbox private by default | that changes product behavior and still leaves the embedded API without a server-side auth boundary. Confidence: high Scope-risk: narrow Directive: Do not add new sandbox API routes without the auth dependency unless the route is intentionally public health/status only. Tested: UV_CACHE_DIR=/tmp/uv-cache uv run --extra dev pytest tests/unit/test_sandbox_api_auth.py * Preserve sandbox reconnect with API token Review caught that Sandbox.connect would send only the HF token while newly…98e4465 -
Preserve streamed thinking metadata with live model tests (#150)
Aksel Joonas ReediUnverified signature* Add opt-in live thinking model tests Add paid integration coverage for the concrete models requested for #143: Anthropic Opus 4.7 and OpenAI's current GPT-5.2 model. The tests load an explicit env file, run only behind ML_INTERN_LIVE_LLM_TESTS=1, and keep normal CI credential-free. Constraint: Live provider calls require local credentials and should not run by default in CI. Rejected: Make live provider tests unconditional | would fail or spend tokens anywhere credentials are absent. Confidence: high Scope-risk: narrow Tested: ML_INTERN_LIVE_LLM_TESTS=1 ML_INTERN_LIVE_ENV_FILE=/Users/akseljoonas/Documents/ml-intern/.env UV_CACHE_DIR=/tmp/uv-cache uv run --extra dev pytest tests/integration/test_live_thinking_models.py -q -rs Tested: UV_CACHE_DIR=/tmp/uv-cache uv run --extra dev pytest tests/unit/test_thinking_history.py tests/integration/test_live_thinking_models.py -q * Preserve streamed Opus thinking metadata Live Opus 4.7 exposed that LiteLLM surfaces streamed thinking bl…d408a51 -
Preserve thinking state across tool turns (#143)
Aksel Joonas ReediUnverified signature* Preserve thinking state across tool turns Anthropic thinking responses need their thinking_blocks and reasoning_content replayed with assistant tool-call messages. The loop was rebuilding assistant history from only content and tool calls, causing LiteLLM to strip thinking on continuation turns. Constraint: Non-thinking providers and responses without reasoning fields must keep the existing message shape. Rejected: Disable extended thinking for tool-using runs | avoids the warning by removing the feature that improves reasoning quality. Confidence: high Scope-risk: moderate Directive: Any future assistant-message reconstruction must preserve provider reasoning fields when present. Tested: UV_CACHE_DIR=/tmp/uv-cache uv run --extra dev pytest tests/unit/test_thinking_history.py tests/unit/test_dangling_tool_calls.py tests/unit/test_malformed_args_recovery.py * Replay thinking metadata only for Anthropic Review caught that reasoning_content is not safe to echo through OpenAI-co…59b2038 -
Keep repetition guard internal (#144)
Aksel Joonas ReediUnverified signature* Clarify repetition guard messaging The loop breaker is intentional recovery behavior, but the user-facing 'doom loop' phrasing reads like a crash. Rename the visible log and system hint to a repetition guard while preserving the existing detector behavior and historical SFT tag compatibility. Constraint: Existing trajectories may still contain the old wording, so the tagger must recognize both labels. Rejected: Remove the event entirely | users would lose visibility into why the agent changed strategy. Confidence: high Scope-risk: narrow Directive: Keep user-facing recovery logs operational and non-alarming; reserve internal jargon for code, not UI events. Tested: UV_CACHE_DIR=/tmp/uv-cache uv run --extra dev pytest tests/unit/test_doom_loop_polling.py tests/unit/test_sft_tagger.py * Hide repetition guard from user surfaces The repetition guard is an internal control-flow intervention, not a status event users need to act on. Remove the CLI/frontend tool_log emissions while …e8ed637 -
fix(doom_loop): normalize tool-call args before hashing (#119)
d 🔹 +2: d 🔹, Aksel Joonas ReediUnverified signatureThe doom-loop detector hashed raw `function.arguments` strings, so semantically-identical tool calls hashed differently when the LLM emitted them with different key orderings (`{"a":1,"b":2}` vs `{"b":2,"a":1}`) or whitespace (`{"a":1}` vs `{"a": 1}`). This silently broke `detect_identical_consecutive` and `detect_repeating_sequence`: the agent could be calling the same tool with the same args repeatedly and the detector would see three distinct signatures and stay quiet. Issue #61 P1 explicitly calls this out: > Add semantic-similarity or normalized-task matching for `research`. Fix: parse-and-redump JSON via `json.dumps(..., sort_keys=True, separators=(",", ":"))` before hashing. Falls back to the raw string when the input isn't valid JSON so non-JSON `arguments` strings (rare edge for some providers) keep the legacy behaviour and never raise. Tests: 23 new cases in `tests/unit/test_doom_loop.py` covering `_normalize_args`, `_hash_args`, `extract_recent_tool_signatures`, `detect_i…07c5699 -
Treat Trackio as core for training and prefer public Space dashboards (#129)
Unverified signature* Strengthen Trackio and public Space guidance for training workflows Treat trackio as a core dependency for training-like job scripts, keep huggingface_hub in baseline dependencies, and reinforce prompt/tool guidance to provide Trackio dashboards. Also instruct agents to publish training dashboards/results to public Spaces with random IDs when feasible. Made-with: Cursor * Apply suggestion from @abidlabs * changes * changes * Apply suggestion from @abidlabs * Keep prompt changes to v3 and restore jobs tool enforcement Restore the training dependency and Trackio/public-Space guidance logic in hf_jobs, while reverting system_prompt.yaml and system_prompt_v2.yaml so runtime-facing guidance stays concentrated in system_prompt_v3.yaml. Made-with: Cursor * changes * changes * changes * Apply suggestion from @abidlabs * Apply suggestion from @abidlabs --------- Co-authored-by: lewtun <lewis.c.tunstall@gmail.com>8e93e94 -
fix(cli): persist HF user id in saved sessions (#146)
Unverified signature* fix(cli): persist HF user id in saved sessions Co-authored-by: OpenAI Codex <codex@openai.com> * test: remove submission loop user id unit test Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>2083476 -
feat(session): include user_id and total_cost_usd in trajectory dump (#136)
Guillaume SalouUnverified signatureAdd user_id (HF username from OAuth) to the Session object and propagate it from the SessionManager. Surface it in the trajectory JSON written by save_trajectory_local() and uploaded to the session dataset, alongside a total_cost_usd aggregate summed from existing llm_call events. This unblocks per-user cost attribution from the session dataset alone — today the dataset has session_id but no user binding, so 569Xlspend cannot be tied back to an HF account without correlating timestamps from Hub access logs (noisy, breaks for users with long-lived browser tabs). Cost data is already collected per call by agent.core.telemetry; we just propagate user identity and expose a rolled-up total.645964c
-
Deploy 2026-04-26
d0d08fc -
Run jobs under user or org accounts with upgrade / org-pick UX (#132)
Aksel Joonas ReediUnverified signature* agent/core/agent_loop.py: jobs access rewiring * agent/core/telemetry.py: jobs access rewiring * agent/tools/jobs_tool.py: jobs access rewiring * backend/dependencies.py: jobs access rewiring * backend/models.py: jobs access rewiring * backend/routes/agent.py: jobs access rewiring * frontend/src/components/Chat/ChatInput.tsx: jobs access rewiring * frontend/src/components/ClaudeCapDialog.tsx: jobs access rewiring * frontend/src/components/SessionChat.tsx: jobs access rewiring * frontend/src/hooks/useAgentChat.ts: jobs access rewiring * frontend/src/lib/sse-chat-transport.ts: jobs access rewiring * frontend/src/store/agentStore.ts: jobs access rewiring * frontend/src/types/agent.ts: jobs access rewiring * scripts/build_kpis.py: jobs access rewiring * tests/unit/test_build_kpis.py: jobs access rewiring * agent/core/hf_access.py: jobs access rewiring * frontend/src/components/JobsUpgradeDialog.tsx: jobs access rewiring * tests/unit/test_hf_access.py: jobs access rewirin…ff8c636 -
ci: bypass OIDC for Claude review on pull_request_target (#134)
Aksel Joonas ReediUnverified signatureThe GitHub App token-exchange endpoint rejects OIDC tokens minted for pull_request_target events ('401 Invalid OIDC token'), so every review has failed since the switch from pull_request in #123. Pass GITHUB_TOKEN directly to skip the exchange; comments post as github-actions[bot] instead of claude[bot], which is the documented trade-off.5b82e2d
-
Run Claude review for external PRs safely (#123)
Aksel Joonas ReediUnverified signature4501d69 -
Make the CLI startup banner show the actual CLI default model (#122)
Aksel Joonas ReediUnverified signatureThe CLI already loads direct Anthropic defaults from configs/cli_agent_config.json, but the startup banner was rendered before that config was loaded and fell back to a hardcoded Bedrock label. This made the CLI look misconfigured even when the session model was correct. Constraint: The startup banner must reflect the same model source the CLI session will actually use Rejected: Keep a hardcoded Bedrock fallback in print_banner | it misreports the active CLI default Confidence: high Scope-risk: narrow Reversibility: clean Directive: Banner/status UI should derive model labels from loaded config or session state, never from stale hardcoded defaults Tested: python -m compileall agent/main.py agent/utils/terminal_display.py Not-tested: Interactive manual CLI launch in this sandbox1bce0eb -
Fix CLI rendering corruption and split CLI/frontend model defaults (#121)
Aksel Joonas ReediUnverified signature* Stabilize CLI rendering and make surface defaults explicit The interactive CLI was interleaving live sub-agent redraws with streamed markdown output, which corrupted ANSI rendering and leaked raw control sequences into the terminal. The CLI and web app also shared one default model config even though they need different Anthropic routing defaults. Constraint: CLI default must use direct Anthropic credentials while web sessions must default to Bedrock Anthropic Constraint: Interactive terminal output must remain readable while sub-agent progress is live Rejected: Single shared config file with runtime overrides | keeps ownership of defaults implicit across surfaces Rejected: Keep background redraw ticker | concurrent terminal writers still corrupt streamed output Confidence: high Scope-risk: moderate Reversibility: clean Directive: Keep CLI and frontend default models in separate config files unless both surfaces intentionally converge again Tested: python -m compileall agent backen…3eec386 -
Switch from Bedrock to Anthropic endpoint as default. Include support for gpt-5.5 (#118)
Unverified signature* Default ml-intern to Anthropic Co-authored-by: OpenAI Codex <codex@openai.com> * Add direct OpenAI GPT-5 model support Co-authored-by: OpenAI Codex <codex@openai.com> * Raise probe budget for GPT-5 models Co-authored-by: OpenAI Codex <codex@openai.com> * Fix deps * Fix stale xhigh provider messaging Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>0545e40 -
fix typo in readme (#117)
Unverified signature2158d6b
-
Deploy 2026-04-24
471f346