Commit History
-
[codex] Harden agent prompt guidance (#331)
Unverified signature* Harden agent prompt guidance Co-authored-by: OpenAI Codex <codex@openai.com> * Handle streaming LLM read timeouts Co-authored-by: OpenAI Codex <codex@openai.com> * Address autonomous prompt review feedback Co-authored-by: OpenAI Codex <codex@openai.com> * Address prompt review comments Co-authored-by: OpenAI Codex <codex@openai.com> * Address reviewer feedback on prompt guidance Co-authored-by: OpenAI Codex <codex@openai.com> * Stop activation from resetting usage windows Co-authored-by: OpenAI Codex <codex@openai.com> * Harden ML dependency freshness guidance Co-authored-by: OpenAI Codex <codex@openai.com> * Constrain kernels dependency guidance Co-authored-by: OpenAI Codex <codex@openai.com> * Exclude T4 for flash attention kernels Co-authored-by: OpenAI Codex <codex@openai.com> * Use shell-safe kernels dependency spec Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>ece0775
-
[codex] Update hosted web model defaults (#328)
Unverified signature* Update hosted web model defaults Co-authored-by: OpenAI Codex <codex@openai.com> * Pin hosted web models to Novita Co-authored-by: OpenAI Codex <codex@openai.com> * Use GLM as the free web default Co-authored-by: OpenAI Codex <codex@openai.com> * Use plan-aware model for LLM health check Co-authored-by: OpenAI Codex <codex@openai.com> * Refresh Kimi test fixtures Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>433a22b
-
Remove ~900 lines of dead code across agent, backend, and frontend (#318)
Unverified signature* Remove dead code across agent, backend, and frontend A vulture/knip audit with manual repo-wide verification found ~900 lines of dead code: - Delete agent/tools/private_hf_repo_tools.py (650 lines): disabled when hf_repo_files/hf_repo_git replaced it, never imported since. - Drop orphaned functions, constants, and type aliases across agent/ and backend/ (record_jobs_access_blocked, last_fetch_error, update_local_save_status, verify_session_access, OperationType aliases, OpType.INTERRUPT in both enums, etc.). - Trim unused Sandbox client surface (pause/restart/to_dict/ tool_definitions and unused constants); keep Sandbox.connect, which the live auth integration test uses. - Remove production code only its own tests kept alive: _needs_approval (tests retargeted to _base_needs_approval / production path), fetch_hf_user_plan, _cleanup_user_orphan_sandboxes (superseded by scripts/sweep_orphan_sandboxes.py), DEFAULT_MODEL_ID alias. - Drop unused boto3 dependency (still …7943555 -
Instrument dataset usage and billing analytics (#316)
Unverified signature* Instrument session usage analytics Add durable usage_metrics snapshots, backend HF billing refreshes, and shared dataset row usage columns. Co-authored-by: OpenAI Codex <codex@openai.com> * Address usage billing review feedback Timebox billing refreshes, keep user-facing saves fire-and-forget, and share sandbox lifecycle aggregation semantics. Co-authored-by: OpenAI Codex <codex@openai.com> * Simplify HF Jobs usage label Display HF Jobs without the estimated qualifier while preserving fallback usage logic. Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>4ecc3bd -
Enforce YOLO cap across session usage (#313)
Unverified signature* Enforce YOLO cap across session usage Co-authored-by: OpenAI Codex <codex@openai.com> * Address YOLO budget review feedback Co-authored-by: OpenAI Codex <codex@openai.com> * Switch YOLO LLM cap checks to post-call warnings Co-authored-by: OpenAI Codex <codex@openai.com> * Improve YOLO cap reached CTA Co-authored-by: OpenAI Codex <codex@openai.com> * Fix YOLO blocked approval flow Show cap extension controls for pre-execution budget blocks and preserve approved tool parts during approval continuation streams. Co-authored-by: OpenAI Codex <codex@openai.com> * Sync usage meter with YOLO ledger Co-authored-by: OpenAI Codex <codex@openai.com> * Fix YOLO usage accounting drift Co-authored-by: OpenAI Codex <codex@openai.com> * Emit YOLO updates for observed spend Co-authored-by: OpenAI Codex <codex@openai.com> * Handle YOLO updates in active chat stream Co-authored-by: OpenAI Codex <codex@openai.com> * Reconcile YOLO ledger from usage fetches Co-authored-by: OpenAI Codex…d76b37c -
Use session billing endpoint for inference usage (#314)
Unverified signature* Use session billing endpoint for inference usage Replace current-session inference billing estimates with the Hugging Face session usage endpoint and ensure HF Router requests carry session IDs across providers. Co-authored-by: OpenAI Codex <codex@openai.com> * Rotate inference billing session IDs Co-authored-by: OpenAI Codex <codex@openai.com> * Address session billing review feedback Co-authored-by: OpenAI Codex <codex@openai.com> * Send Router billing session ID header Co-authored-by: OpenAI Codex <codex@openai.com> * Fix duplicate streamed assistant text Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>9e28f0f
-
Add sandbox costs to usage meter (#311)
Unverified signature* Add sandbox costs to usage meter Co-authored-by: OpenAI Codex <codex@openai.com> * Remove usage rollup buckets Co-authored-by: OpenAI Codex <codex@openai.com> * Remove obsolete usage rollup assertions Co-authored-by: OpenAI Codex <codex@openai.com> * Remove unused usage window aggregation Co-authored-by: OpenAI Codex <codex@openai.com> * Update usage event sort test Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>1b98491
-
Add session usage threshold approvals (#310)
Unverified signature* Add session usage threshold approvals Co-authored-by: OpenAI Codex <codex@openai.com> * Address usage threshold review feedback Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>18716c3 -
Add plan-aware CLI billing CTA (#309)
Unverified signature* Add plan-aware CLI billing CTA Co-authored-by: OpenAI Codex <codex@openai.com> * Address billing CTA review feedback Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>ebc9798
-
Enable FAL prompt cache validation (#301)
Unverified signature* Enable FAL prompt cache validation Co-authored-by: OpenAI Codex <codex@openai.com> * Address FAL prompt cache review Co-authored-by: OpenAI Codex <codex@openai.com> * Clarify session usage estimate copy Co-authored-by: OpenAI Codex <codex@openai.com> * Update usage estimate copy Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>66cb9ac -
Pin open web models to Novita (#300)
Unverified signatureCo-authored-by: OpenAI Codex <codex@openai.com>42cc639 -
Reset usage billing window on session activation (#296)
Unverified signature* Reset usage billing window on session activation Co-authored-by: OpenAI Codex <codex@openai.com> * Avoid resetting usage on browser refresh Co-authored-by: OpenAI Codex <codex@openai.com> * Use billing baselines for session usage resets Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>1a8fb0c -
Add app-attributed usage display (#292)
Unverified signature* Add app-attributed usage display Co-authored-by: OpenAI Codex <codex@openai.com> * Fix usage windows for local timestamps Co-authored-by: OpenAI Codex <codex@openai.com> * Add HF billing usage to usage display Co-authored-by: OpenAI Codex <codex@openai.com> * Simplify usage popover Co-authored-by: OpenAI Codex <codex@openai.com> * Remove token row from usage popover Co-authored-by: OpenAI Codex <codex@openai.com> * Move session billing note to usage header Co-authored-by: OpenAI Codex <codex@openai.com> * Optimize usage popover rollup loading Co-authored-by: OpenAI Codex <codex@openai.com> * Round usage costs to cents Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>7d506e1
-
Implement user-billed model policy (#289)
Unverified signature* Implement user-billed model policy - bill hosted inference to user tokens and remove subsidy quota state - switch web and CLI defaults and remove Sonnet from model lists - add plan-aware inference credit CTAs Co-authored-by: OpenAI Codex <codex@openai.com> * Recommend Opus in model picker Co-authored-by: OpenAI Codex <codex@openai.com> * Remove minimum plan from model config Co-authored-by: OpenAI Codex <codex@openai.com> * Link message failures to Space discussions Co-authored-by: OpenAI Codex <codex@openai.com> * Remove compatibility quota endpoint Co-authored-by: OpenAI Codex <codex@openai.com> * Remove obsolete bill_to_user argument Co-authored-by: OpenAI Codex <codex@openai.com> * Remove model tier metadata Co-authored-by: OpenAI Codex <codex@openai.com> * Remove model picker provider subtitles Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>ded9881
-
Enforce premium quota across sessions daily (#287)
Unverified signatureCo-authored-by: OpenAI Codex <codex@openai.com>cbf5d33 -
Restore prompt caching for FAL router models (#286)
Unverified signature* Restore prompt caching for FAL router models Co-authored-by: OpenAI Codex <codex@openai.com> * Tune prompt caching hints for GPT-5.5 Co-authored-by: OpenAI Codex <codex@openai.com> * Address backlog prompt caching import review Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>e6f00a2 -
Set Sonnet as default premium model (#284)
Unverified signature* Set Sonnet as default premium model Co-authored-by: OpenAI Codex <codex@openai.com> * Address pro-only premium review feedback Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>b103510
-
Remove old Claude model support (#283)
Unverified signature* Remove Claude Opus 4.6 model support Co-authored-by: OpenAI Codex <codex@openai.com> * Remove Claude Opus 4.7 model support Co-authored-by: OpenAI Codex <codex@openai.com> * Remove Claude Sonnet 4.6 model support Co-authored-by: OpenAI Codex <codex@openai.com> * Remove stale Sonnet model tag test Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>d32b803 -
Route LLM inference through HF Router (#282)
Unverified signature* Route LLM inference through HF Router Co-authored-by: OpenAI Codex <codex@openai.com> * Address HF router PR review Co-authored-by: OpenAI Codex <codex@openai.com> * Address router cleanup review Remove no-op prompt caching and reasoning replay paths, genericize router model handling, and update docs/tests for HF Router-only setup. Co-authored-by: OpenAI Codex <codex@openai.com> * Fix READEM --------- Co-authored-by: OpenAI Codex <codex@openai.com>437a804
-
Add Opus 4.8 as premium model (#281)
Unverified signature9c72f5f -
Fix endpoint for free calls (#279)
Unverified signature* Recover endpoint for subsidized callsf247952 -
Enable FAL endpoint to lift limits (#278)
Unverified signature* Bill premium models through the HF router on the user's HF account Route Claude Opus 4.6 and GPT-5.5 off Bedrock/native APIs onto the HF Inference Router (huggingface/anthropic/claude-opus-4.6:fal-ai and huggingface/openai/gpt-5.5:fal-ai). The same daily allowance as before (free=1, pro=20) stays company-subsidized via INFERENCE_TOKEN; once a user is past it, the session's premium_user_billed flag flips and the call bills the user's own HF OAuth token (no X-HF-Bill-To) instead of returning the old 429 cap. - llm_params: bill_to_user routes premium (anthropic/ + openai/) router calls to the user's token; free models stay subsidized. - premium_user_billed is persisted/restored and threaded through the main loop, context compaction, the research sub-agent (now downgraded to router Sonnet 4.6), and effort probes. - Frontend: per-session BillingBanner (dismissible daily); remove the now unreachable ClaudeCapDialog + 429 quota-exhausted plumbing; the model chip shows "Billed" p…c9a83ae -
Reclaim idle sessions to fix session-capacity overshoot (#277)
Unverified signature* Reclaim idle sessions and fix session-capacity overshoot Users hit "Server is at capacity (379/200)" and couldn't create sessions: idle/forgotten runtimes never left the global pool, the frontend reactivated every historical session on load, and concurrent creates could overshoot the cap. Backend: - Idle-session reaper (2h): releases the sandbox + RAM of inactive sessions and evicts them from the live pool, leaving them resumable from Mongo (persisted resumable, never "ended"). Teardown uses asyncio.wait so a shutdown cancel can't be swallowed; submit() enqueues under the lock and refuses sessions being reaped. Reaping is skipped when persistence is disabled and aborts if the resumable snapshot (incl. the message bulk_write, via save_snapshot strict mode) can't be durably written. - Global create-slot reservation closes the check-then-create race that let concurrent creates exceed MAX_SESSIONS. - last_active_at drives the reaper, stamped on genuine activity only. - Re…6cf406a
-
Add `/clear` and `/new` commands (#256)
Unverified signature021580f
-
Add CLI sandbox runtime and fix HF Jobs script paths (#237)
Unverified signature* Resolve bare Python job scripts Co-authored-by: OpenAI Codex <codex@openai.com> * Update HF Jobs script description Co-authored-by: OpenAI Codex <codex@openai.com> * Clarify HF Jobs script path prompt Co-authored-by: OpenAI Codex <codex@openai.com> * Add CLI sandbox tool runtime Co-authored-by: OpenAI Codex <codex@openai.com> * Document CLI sandbox tool runtime Co-authored-by: OpenAI Codex <codex@openai.com> * Wait for initial CLI sandbox preload Co-authored-by: OpenAI Codex <codex@openai.com> * Strengthen GPU sandbox preflight guidance Co-authored-by: OpenAI Codex <codex@openai.com> * Guard against text-only stops with unfinished plans Co-authored-by: OpenAI Codex <codex@openai.com> * Route sandbox deletion logs through tool events Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>b05b6f5
-
Create Hub artifact collections lazily (#245)
Unverified signature* Create Hub artifact collections lazily Co-authored-by: OpenAI Codex <codex@openai.com> * Cache lazy Hub collection slugs in child hooks Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>60474c1 -
Implement `/resume` command for CLI (#233)
Unverified signature* Add /resume command to CLI * Refine /resume feature * Refine /resume implementation * Address review comments --------- Co-authored-by: lewtun <lewis.c.tunstall@gmail.com>0321690
-
Skip sandbox spaces for artifact metadata (#241)
Unverified signature* Skip sandbox spaces for artifact metadata Co-authored-by: OpenAI Codex <codex@openai.com> * Address sandbox metadata PR feedback Co-authored-by: OpenAI Codex <codex@openai.com> * Avoid sandbox title metadata updates Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>1e1fe1f
-
Add CLI local model support (#228)
Unverified signature* Add CLI local model support Co-authored-by: OpenAI Codex <codex@openai.com> * Add shared local model endpoint fallback Support LOCAL_LLM_BASE_URL and LOCAL_LLM_API_KEY as shared fallbacks while preserving provider-specific local overrides. Co-authored-by: OpenAI Codex <codex@openai.com> * Address local model review feedback Clarify local probe failure behavior, add regression coverage for rejected local switches, and simplify local model validation. Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>4668dbd
-
Add ML Intern Hub artifact metadata (#225)
Unverified signature* Add ML Intern Hub artifact metadata Co-authored-by: OpenAI Codex <codex@openai.com> * Extend Hub artifact hooks to sandbox bash Co-authored-by: OpenAI Codex <codex@openai.com> * Create Hub artifact collections at session start Co-authored-by: OpenAI Codex <codex@openai.com> * Address Hub artifact PR review comments Co-authored-by: OpenAI Codex <codex@openai.com> * Respect Hub collection title limits Co-authored-by: OpenAI Codex <codex@openai.com> * Shorten collection session UUID fragments Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>4fc6e96
-
Add CI for tests and Ruff (#217)
Unverified signature* Add CI for tests and Ruff Co-authored-by: OpenAI Codex <codex@openai.com> * Enforce Ruff formatting in CI Co-authored-by: OpenAI Codex <codex@openai.com> * Document Ruff pre-commit checks Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>754345f -
fix(compaction): break infinite loop + truncate oversized messages (#213)
Guillaume SalouUnverified signature* fix(compaction): break the infinite-compaction loop, truncate oversized messages Sessions stuck in a compaction retry loop have been silently burning Bedrock budget while staying invisible in the session dataset. Pod logs from 2026-05-03 on prod-114 showed the pattern firing minute-after-minute on multiple replicas: Context compacted: 200001 -> 215566 tokens Context compacted: 215566 -> 215572 tokens ContextWindowExceededError — forcing compaction Context compacted: 200001 -> 215544 tokens ... Root cause: a single message in the "untouched" tail (typically a tool output of 80k+ tokens — bash dump, file content, CSV) keeps the post-compact context above the 90% threshold. Compaction triggers again, calls Bedrock again, gets the same 215k result, loops. ~$3 per Opus retry, indefinitely. Sessions never reach _run_session.finally → save_and_upload_detached never fires → cost is real but never lands in total_cost_usd. Cross-check: dataset Bedrock-only coverage on 2026-05-01 …d84b454
-
Auto-start CPU sandboxes for sessions (#200)
Unverified signature* Auto-start CPU sandboxes for sessions Co-authored-by: Codex <codex@openai.com> * Retry sandbox runtime visibility checks Co-authored-by: Codex <codex@openai.com> * Stabilize auto CPU sandbox creation Co-authored-by: OpenAI Codex <codex@openai.com> * Address sandbox PR review comments Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: Codex <codex@openai.com>8615c28 -
Add session YOLO auto-approval budget (#201)
Unverified signature* Add session YOLO auto-approval budget Co-authored-by: Codex <codex@openai.com> * Address YOLO approval review feedback Co-authored-by: Codex <codex@openai.com> --------- Co-authored-by: Codex <codex@openai.com>77324b8 -
Use HF username for personal trace uploads (#199)
Unverified signature* Use HF username for personal trace uploads Co-authored-by: OpenAI Codex <codex@openai.com> * Remove redundant HF token branch Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: OpenAI Codex <codex@openai.com>71e1892 -
Auto-share session traces to a private HF dataset (#193)
Darshan Thakare +2: lewtun, CodexUnverified signature* feat: add share_traces toggle and per-user trace repo template * feat: support Claude Code JSONL format and per-target auth * feat: dual-upload sessions to private user trace dataset * chore: retry personal trace uploads on booting * feat: add /share-traces command to flip dataset visibility * docs: document HF trace auto-share and /share-traces * Use HF token owner for local dev auth Co-authored-by: Codex <codex@openai.com> * Rename personal session trace dataset Co-authored-by: Codex <codex@openai.com> * Add session dataset card metadata Co-authored-by: Codex <codex@openai.com> * Fix session trace upload review issues Co-authored-by: OpenAI Codex <codex@openai.com> * Preserve secret scrubbing before trace uploads Co-authored-by: OpenAI Codex <codex@openai.com> * Link ML Intern demo in dataset card Co-authored-by: OpenAI Codex <codex@openai.com> --------- Co-authored-by: lewtun <lewis.c.tunstall@gmail.com> Co-authored-by: Codex <codex@openai.com>0bd7547
-
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
-
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
-
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 -
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 -
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
-
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 -
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 -
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 -
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 -
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