This project keeps a human-curated changelog so users and contributors can see how QitOS evolves over time.
Format:
Added: new features and capabilitiesChanged: behavior changes, refactors, and structural improvementsFixed: bug fixesDeprecated: old paths or APIs that will be removed laterRemoved: deleted featuresBreaking: upgrade notes for incompatible changes
How to update:
- Add high-signal entries under
Unreleasedwhile work is in progress - Move
Unreleasednotes into a dated or versioned section when publishing a release - Prefer user-facing changes, upgrade notes, and important engineering changes over low-level edit logs
- Added opt-in OpenAI Responses API support for synchronous, asynchronous, and typed streaming calls, including structured output-item preservation,
call_idtool-result correlation, stateless tool-round replay, and privacy-safe trace summaries. Chat Completions remains the default. - Added
AgentSpec.tool_nameso delegate workers can expose task-oriented model-facing tool names while keeping the registry agent name stable.
- Raised the optional OpenAI SDK floor to
openai>=1.66.0and taught compact history to preserve active Responses function-call rounds atomically. - Strengthened the CyberGym PoC agent's task bootstrap with lightweight structured task-spec extraction and more relevant repo evidence ranking.
- Clarified candidate provenance and lightweight failure taxonomy handling in the CyberGym agent without changing its single-agent runtime architecture.
- Fixed immediate cancellation finalization so the END event, canonical State,
TaskResult/EngineResult, and trace manifest all reportcancelled_immediate; cancelled manifests now use the existing terminalstoppedstatus instead ofcompleted. - Fixed native text fallback so malformed structured action output enters parser recovery instead of being misreported as a successful final answer, while ordinary natural-language conclusions still use
native_text_final. - Fixed message-window trimming so native tool results whose declaring assistant call has been evicted are removed before provider dispatch, while complete tool chains and existing interrupted-call recovery remain unchanged.
- Fixed direct
Engine(agent=...)construction so models created withbuild_model_for_preset(...)retain their declared protocol and native API tool-schema delivery, including provider aliases such as Kimi K3 that cannot be inferred from the model name alone. - Fixed empty model responses with neither usable text nor tool calls being misclassified as parser
waitdecisions. The Engine now records them asmodel_error, retries once through bounded recovery, and stops withunrecoverable_errorif the empty response repeats while preserving response diagnostics in traces. - Fixed native response text extraction so OpenAI-compatible messages with null content no longer become repr-string final answers.
- Fixed OpenAI-compatible forced tool-call requests so conflicting thinking options are disabled, and repaired JSON/tool-call parsing for bare control characters inside string values.
- Fixed JSON-like object extraction so apostrophes in surrounding natural-language text no longer hide valid JSON payloads.
- Fixed
DelegateToolcontext delivery so the optional tool-callcontextobject is passed into the child agent viaEngine.run(..., context=...). - Fixed OpenAI-compatible tool schema generation for postponed or string annotations so CyberGym tools no longer emit invalid JSON Schema types.
- Fixed CyberGym batch trace/result/render redaction so API keys and auth token markers are scrubbed before persisted artifacts are written.
- Fixed CyberGym PoC generation runs so benchmark-local Bash commands can run without interactive command review while the default coding toolset review guard remains intact.
- Fixed tool registration with name overrides so CyberGym uppercase aliases do not mutate source tool specs shared with ordinary coding toolsets.
- WebBrowserEnv: Playwright-backed web browser environment (
qitos.kit.env.web) withMockBrowserProviderandPlaywrightBrowserProvider, extending desktop GUI actions withnavigate,go_back,go_forward,switch_tab,close_tab. Optional dep:pip install qitos[web] - qita Screenshot Strip: Interactive horizontal thumbnail strip at the top of run detail pages, showing one thumbnail per step with screenshot. Click thumbnail to scroll to step card. Grounding failure and critic retry indicators.
- qita Action Overlay: Click/action markers on screenshots with coordinate labels. Red markers for grounding failures, green for success. Navigate actions shown with URL badge.
- qita Observation Pack Viewer: Expandable per-step panel showing DOM, accessibility tree, OCR spans, UI candidates, and grounding metadata. Toggle with "observation pack" button.
- qita Branch Comparison:
/compare-branches/{run_id}/{step_id}route for side-by-side branch candidate comparison with grounding failure banner. - MultimodalCapabilityProfile: Model-aware observation adaptation in
qitos.models.profile_registry. Vision models receive screenshots; text-only models receive DOM + OCR fallback. - AgentSpec.model_override / tools_override: Override the sub-agent's model and tool registry for delegation.
- AgentSpec.post_init validation: Empty name raises ValueError.
- AgentRegistry.get_handoff_tools(): Returns
HandoffToolinstances for Decision-mode handoff. - DelegateTool nested delegation fix:
_build_sub_engine()now passesagent_registryenabling depth-2+ delegation. - DelegateEventInterceptor: First-class
DELEGATE_START/DELEGATE_ENDevents inEngineResult.eventswhenagent_registryis provided. - Sub-trace writer depth-aware run_id:
f"{parent_run_id}__delegate_{agent_name}_depth{depth}"prevents collisions. - ReviewerAgent in delegate example demonstrating multi-delegation with
ContextStrategy.SUMMARY. - v0.7 handoff scope document: Documents what is in v0.6 vs v0.7 scope for handoff/Decision mode.
DelegateTool._build_sub_engine(): now passesagent_registry, appliesmodel_override/tools_overridefromAgentSpec.DelegateTool._build_sub_trace_writer(): includescurrent_depthin sub-run-id for uniqueness.qita renderActionOverlay(): now shows grounding failure banners inline.- Engine auto-registers
DelegateEventInterceptorwhenagent_registryis provided.
- Added
CORE_BOUNDARY.md, a core governance audit, a dependency audit, and a stagedqitos-zoomigration manifest for product-grade agents. - Added regression tests for public API and examples governance.
- Added
FamilyPreset.override()for programmatic preset customization andrecommended_models,recommended_protocol,recommended_parseradvisory fields. - Added
MaxTokensCriteriastop criterion so engines can halt when accumulated output tokens exceed a budget. - Added
CriticTraceandHandoffTraceexport APIs for programmatic access to critic decisions and multi-agent handoff data. - Added
EngineConfigexport API for inspecting engine configuration outside the engine runtime. - Added
ToolPermissionSpecfor declarative tool permission policies. - Added
WandbTraceProcessorfor W&B experiment tracking integration (pip install qitos[wandb]). - Added
MlflowTraceProcessorfor MLflow experiment tracking integration (pip install qitos[mlflow]). - Added qita cost panel showing token usage and cost metrics in the run overview.
- Added
qit --versionandqita --versionCLI flags. - Added
qit new --template <name>CLI for scaffolding new agent projects from built-in cookiecutter templates. - Added
qit list-templatesCLI for listing built-in scaffold and method templates. - Added 5 method template recipe implementations:
qitos.recipes.self_refine— Self-Refine pattern (generate → critique → refine)qitos.recipes.reflexion— Reflexion pattern (act → reflect → retry with memory)qitos.recipes.lats— LATS pattern (Monte Carlo tree search with UCB1 scoring and reflection)qitos.recipes.moa— MoA pattern (parallel proposals + aggregation layers)qitos.recipes.magentic_one— Magentic-One pattern (orchestrator + specialist workers with stall detection)
- Added 12 method template directories under
templates/withpaper.md,config.yaml,agent.py, and__init__.py:- react, plan_act, swe_agent, voyager, debate, manager_worker, planner_executor, self_refine, reflexion, lats, moa, magentic_one
- Added eval config YAML files for LATS, MoA, and Magentic-One under
qitos/recipes/benchmarks/eval_configs/. - Added bilingual method-templates guide covering all 12 templates with quickstart code, parameters, and state fields.
- Added LATS, MoA, and Magentic-One terms to bilingual glossary.
- Added
cookiecutteroptional extra (pip install qitos[cookiecutter]).
- Tightened QitOS public/default surfaces around kernel-first contracts and moved product-grade agent positioning toward
qitos-zoo. - Updated examples policy so canonical examples are teaching-first and product-like agents are marked for migration.
- Refreshed README.md with v0.5.0 content: 12 method templates table,
qit --versionin quickstart, Beta status, optional extras, and method-templates guide link.
- Restored engine final/wait lifecycle behavior so reduce, parser feedback, hooks, checkpoints, and memory records are preserved.
- Fixed
_TEMPLATES_DIRpath resolution inqit newso template directories at repo root are found correctly.
- Added
qitos.cachepackage withCacheBackendABC,InMemoryCache(LRU + TTL),DiskCache(file-per-key), andCachedModelwrapper that transparently caches anyModelinstance — zero Engine changes required. - Added
qitos.configpackage withAgentConfig,ModelConfig,DatasetItem,load_agent_config()for YAML-driven agent setup with${ENV_VAR}resolution, andbuild_model(),build_run_spec(),build_tool_registry()builders. - Added
qitos.checkpointpackage withCheckpointDataandCheckpointManagerfor run persistence and resume support. Engine auto-saves checkpoints at configurable intervals. - Added
qitos.experimentpackage withExperimentRunner,ExperimentResult,SweepSpec, andsweep_product()for parameter-sweep experiments with concurrent execution, resume support, and result persistence. - Added
EngineResult.run_idfield so callers can track run identity after engine execution completes. - Added
qit experiment run --config <yaml>CLI subcommand for experiment execution from YAML configs. - Added
AsyncEnginewitharun()andarun_stream()methods for non-blocking agent execution insideasyncioevent loops. - Added
EngineEvent,EngineEventType, andEventStreamfor structured real-time event streaming from engine runs. - Added
AsyncOpenAICompatibleModelandAsyncOpenAIModelwith_acall_api()andacall_raw()usingopenai.AsyncOpenAI. - Added SSE endpoint
/api/stream/{run_id}to qita for streaming run events as Server-Sent Events. - Added "live stream" button to qita run detail page for real-time event viewing.
- Added bilingual third-party benchmark integration guidance explaining the official
framework / benchmark / recipeboundary, required family package structure, normalized result expectations, and qita/trace compatibility rules for future benchmark contributors. - Added a new
qitos.benchmark.osworldfamily with dataset adapter, runtime hook, evaluator bridge, scorer, and built-in runner entrypoints for the real OSWorld benchmark path. - Added a new
qitos.recipes.desktop.osworld_starterrecipe layer so the canonical desktop baseline can be reused by examples, benchmark runners, and docs without depending onexamples/. - Added the first official
desktopbenchmark family as an OSWorld-compatible starter path, including committed starter tasks and built-inqit benchsupport. - Added lightweight
ActionSpaceandEnvironmentAdaptermultimodal abstractions so the desktop benchmark path is backed by stable framework types instead of example-local glue. - Added a benchmark-grade upgrade for
examples/real/openai_cua_agent.py, including planner/grounding/action-selector workflow guidance, a desktop grounding critic, and richer family-first harness integration. - Added qita screenshot timelines, replay screenshot previews, basic action overlays, grounding visibility, and step-level visual summaries for desktop runs.
- Added bilingual v0.5 desktop benchmark docs, qita GUI-failure tutorials, and a short release note explaining the OSWorld-compatible starter positioning.
- Added a native tool-call decision lane for OpenAI-compatible family presets so Qwen-class endpoints can execute structured
tool_callsbefore falling back to text parsers. - Added bilingual Qwen best-practice docs explaining the native-lane-first harness strategy for
qwen-plusand other OpenAI-compatible Qwen endpoints. - Added the first v0.5 multimodal core slice with shared
ContentBlock/ObservationPackabstractions, screenshot-first environment support, and an OpenAI-compatible visual input path forchat.completions. - Added a minimal
ScreenshotEnv, visual trace asset metadata, qita visual-asset inspection, and a newexamples/real/visual_inspect_agent.pybaseline for screenshot-driven agent workflows. - Added an OSWorld-inspired desktop/computer-use substrate with
DesktopEnv, mock and container-first desktop providers, provider-neutral GUI action tools,ComputerUseToolSet, and new desktop action protocols. - Added
examples/real/openai_cua_agent.pyandexamples/real/desktop_env_smoke.pyas the first QitOS-native desktop/computer-use baselines. - Added a run-scoped structured audit board memory for
examples/real/whitzard_agent.py, giving the long-running security auditor durable target ranking, failed-search recall, focused-read tracking, and phase-aware convergence hints.
- Migrated GAIA, Tau-Bench, and CyBench onto the same
qitos.benchmark.* + qitos.recipes.*architecture as the desktop starter and OSWorld paths, leavingexamples/benchmarks/*.pyas thin wrappers instead of canonical implementations. - Changed the canonical starter benchmark name from
desktoptodesktop-starterwhile keepingdesktopas a compatibility alias. - Split the desktop / OSWorld story into three explicit layers: framework (
DesktopEnv, qita, multimodal contracts), benchmark (qitos.benchmark.*), and recipe (qitos.recipes.*). - Moved the real implementation behind
examples/real/openai_cua_agent.pyintoqitos.recipes.desktop.osworld_starter, leaving the example file as a thin wrapper. - Changed
AgentModule.run()so structuredTask.env_specenvironments are no longer accidentally overridden by an implicitHostEnvwhenworkspaceis set. - Changed the desktop runtime to validate GUI actions against a formal action space before execution and to distinguish
executed,accepted,approval_required, and failed validation outcomes. - Changed the unified benchmark summary layer to aggregate desktop failure-tag distributions in addition to stop reasons.
- Upgraded the
qwenfamily preset from generic JSON-first compatibility to native-tool-call-first behavior with text parser fallback. - Preserved OpenAI-compatible raw responses inside the Engine runtime instead of flattening them to strings too early, while keeping direct text-oriented model calls available for existing authoring paths.
- Collapsed the canonical coding tool surface onto one traditional naming scheme, removed duplicated
*_v2registry aliases, and standardized file-edit parameter names aroundpathandcontent. - Upgraded
examples/real/whitzard_agent.pyto the same preset-first family switching path as the flagship coding example, so long-running security audits can swap model families and harness policies without rewriting the agent. - Tightened
examples/real/whitzard_agent.pyaround a precision-first audit workflow withCompactHistory, deterministic target ranking, regex-recovery guidance, and stronger transitions from broad search to focused code reads. - Upgraded the Engine and prompt/runtime chain so current-step screenshots can flow from task resources or environment observations into multimodal user messages without changing existing parser or tool-schema behavior.
- Extended the multimodal lane into a provider-neutral desktop action path, keeping image input on the OpenAI-compatible multimodal request shape while moving GUI action scaffolding into QitOS protocols and prompt helpers instead of a provider-specific computer-use API.
- Fixed the desktop benchmark path so built-in runs now resolve to the desktop protocol/parser pair instead of inheriting the generic
react_text_v1CLI defaults. - Fixed a prompt-plumbing bug where agents overriding
build_system_prompt()could silently drop API-level tool schemas, causing OpenAI-compatible models to guess tool argument names instead of receiving the real schema. - Fixed qita step inspection so screenshot-backed runs can display visual assets and model-input modality summaries instead of hiding multimodal state inside raw JSON only.
- Fixed
examples/real/whitzard_agent.pyso family presets remain the protocol authority while inventory results now advance audit progress correctly and the agent no longer exposeslist_filesas an easy low-value fallback during long-running audits.
- Added PR/push CI gates covering tests, packaging validation, stable-surface linting, and stable-surface type checking.
- Added dedicated maturity docs for architecture, development workflow, security reporting, community conduct, and environment configuration.
- Added an explicit
qitos.kit.tool.experimental.security_researchnamespace for opt-in security research tool imports and registry builders. - Added thin module boundaries for
qitadata/server/views andrenderterminal/themes façades to make future maintenance easier. - Added a root-level changelog to document ongoing project evolution.
- Added a dedicated
requirements-dev.txtentrypoint for full contributor installs from a local clone. - Added stable
RunSpec,ExperimentSpec, andBenchmarkRunResultpublic contracts to anchor reproducible-run metadata and normalized benchmark outputs. - Added a first-pass unified
qit benchCLI withrun,eval,replay, andexportsubcommands. - Added qita compare/diff views and export routes for summary-level run comparison.
- Added official-run and glossary docs, plus new reproducibility tutorials for benchmark runs and failed-run replay in both English and Chinese.
- Added a blog entry on why reproducible runs matter in QitOS.
- Added a first-class
qitos.harnesslayer withFamilyPreset,HarnessPolicy,ModelAdapter,ToolPolicy,ContextPolicy,build_harness_policy(...), andbuild_model_for_preset(...). - Added built-in gold presets for Qwen, Kimi, MiniMax,
gpt-oss, and Gemma 4, plus bilingual docs for family presets, preset authoring, the model-family matrix, and same-example switching. - Added
qit demo minimal, a packaged minimal coding-agent demo that configures a real model, fixes a tiny workspace bug, and leaves behind a qita-ready trace. - Added release notes for the first formal GitHub release package under
plans/releases/v0.3.0.md.
- Dropped Python 3.9 support and aligned CI, packaging metadata, README, and installation docs around Python 3.10+.
- Normalized the class-based tool contract around
execute(args, runtime_context)while keepingrun(...)as a compatibility path. - Removed deprecated editor/codebase/file/shell compatibility shims in favor of the canonical
CodingToolSetsurface. - Tightened default public exports from
qitos.kitandqitos.kit.toolso experimental and higher-risk tool families are no longer part of the default surface. - Preserved old security research import paths as short-term deprecation shims instead of keeping them as primary public entrypoints.
- Extracted shared coding-tool helper logic into internal utility modules to reduce coupling inside the canonical coding toolset.
- Slimmed
qitaandrenderentry modules so public behavior stays the same while implementation can evolve behind clearer boundaries. - Reworked root installation guidance so
requirements.txtis now a lightweight repo install path instead of a drifting copy of runtime and dev dependencies. - Added coverage, dependency audit, and pre-commit tooling to the standard contributor workflow.
- Removed legacy root planning/audit scratch files, obsolete MkDocs configuration, and local phase-artifact directories so the repository surface matches the current Mintlify-based docs flow.
- Extended trace manifests with normalized run-spec, experiment-spec, benchmark, parser, and reproducibility metadata instead of keeping benchmark context in ad hoc side channels.
- Reworked benchmark example scripts so GAIA, Tau-Bench, and CyBench wrappers now emit the unified
BenchmarkRunResultshape and route through the official v0.3 runner contract. - Surfaced official-run and best-effort replay metadata inside qita board, run detail, and diff views.
- Updated benchmark, tracing, and CLI docs to position
qit benchas the canonical benchmark path while keepingexamples/benchmarksas thin wrappers. - Refactored the flagship
examples/real/claude_code_agent.pyexample into a preset-first showcase so the same agent can switch across supported model families without rewriting the agent implementation. - Moved model-profile defaults onto preset-derived family data and extended context inference for the new v0.4 target families.
- Reworked README, quickstart, installation, CLI reference, and first-agent docs around the minimal coding-agent path so the public “minimal agent” story now matches the QitOS mindset: model config, workspace actions, verification, and qita inspection.
- Updated package metadata and contributor guidance so PyPI, docs, and release materials all describe QitOS as the torch-flavor framework for agent researchers.
- Fixed compatibility issues in direct
.run(...)calls after the tool execution contract was normalized. - Fixed the known undefined
targetreference in the exploit payload generation flow. - Fixed stable-surface lint and mypy failures across
qitos/core,qitos/engine,qitos/models, andqitos/trace.
- Deprecated legacy security research import paths under
qitos.kit.tool.*_toolsetandqitos.kit.tool.security_auditin favor of explicit imports fromqitos.kit.tool.experimental.security_research.
- Default root exports from
qitos.kitandqitos.kit.toolno longer include advanced/security-audit convenience surfaces; import those explicitly from their module paths when needed.