Compare commits

..

654 Commits

Author SHA1 Message Date
TPTBusiness cc342cd5c3 chore: prepare repository for Predix public release
- Rebrand from RD-Agent to Predix for EUR/USD quantitative trading
- Update all documentation to English
- Remove Microsoft-specific references
- Clean up temporary files and backups
- Update LICENSE, README, and configuration for PredixAI organization

Breaking changes:
- Project name changed from 'rdagent' to 'predix' in pyproject.toml
- All Microsoft and RD-Agent branding replaced with Predix
- Documentation completely rewritten for EUR/USD focus

Documentation:
- README.md: Professional English documentation with installation, quick start, CLI reference
- CHANGELOG.md: Cleaned up, references upstream RD-Agent for historical changes
- CODE_OF_CONDUCT.md: Switched to Contributor Covenant v2.0
- SECURITY.md: Predix-specific vulnerability reporting process
- SUPPORT.md: Updated support channels (nico@predix.io, GitHub Discussions)
- CONTRIBUTING.md: Adapted for Predix project
- docs/: Sphinx configuration updated for Predix branding

Configuration:
- pyproject.toml: Updated project metadata, keywords, URLs for PredixAI
- .gitignore: Comprehensive Python/gitignore template
- Makefile: Updated CI pages URL
- setup_predix_eurusd.sh: Translated to English

Cleanup:
- Deleted log files, caches, __pycache__ directories
- Removed backup files (*.backup_*)
- Cleaned web/node_modules
2026-03-29 00:10:26 +01:00
TPTBusiness 673a726146 fix: remove all Chinese stock references, replace with EURUSD 1min FX
- experiment/prompts.yaml: SH/SZ examples -> EURUSD, CSI300 -> EURUSD
- patches/qlib_experiment_prompts.yaml: complete EURUSD migration
- factor_experiment_loader/prompts.yaml: A-share -> EURUSD 1min intraday
- conf_*.yaml: benchmark SH000300 -> EURUSD, removed CSZFillNan/CSZScoreNorm
2026-03-28 11:26:37 +01:00
TPTBusiness cd986190f4 feat: migrate to 1min EURUSD data (2020-2026)
- data_config.yaml: frequency 15min -> 1min, path -> eurusd_1min_data
- patches/generate.py: updated qlib.init path and freq
- patches/eva_utils.py: updated intraday label to 1min
- all prompts/configs: replaced 15min references with 1min
- fx_validator config, trader, graph: 1min intraday trading context
2026-03-28 10:59:46 +01:00
TPTBusiness 3409e6a370 fix: inject MultiIndex warning into factor interface prompt (YAML valide) 2026-03-24 14:02:06 +01:00
TPTBusiness f0500b4cfe fix: inject correct MultiIndex template into factor prompt 2026-03-24 13:57:42 +01:00
TPTBusiness d67321d57c fix: evaluator erkennt 15min als valid (nicht daily) 2026-03-23 16:53:35 +01:00
TPTBusiness 67430ac20f fix: end-timestamp 23:45, weg, SZ-beispiele weg 2026-03-23 15:42:52 +01:00
TPTBusiness cf3befb718 fix: weg, Timestamps mit Uhrzeit, kein SZ-Beispiel 2026-03-23 15:31:34 +01:00
TPTBusiness 58e9a98d52 fix: remove $factor from prompt, update example count to EURUSD 2026-03-23 15:12:59 +01:00
TPTBusiness 7951ee0bdf fix: generate.py nutzt rdagent4qlib env für Qlib-Datenzugriff 2026-03-23 14:04:03 +01:00
TPTBusiness 3b21238590 feat: FX Multi-Agent Validator (TradingAgents-inspired) - Session/Macro/Bull-Bear/Trader 2026-03-22 21:57:03 +01:00
TPTBusiness 27b2c82d55 feat: zentrale data_config.yaml + apply_config.py für dynamische Datenkonfiguration 2026-03-22 21:32:45 +01:00
TPTBusiness 21c29fd93a feat: FX feedback loop, EURUSD ticker examples, bars terminology 2026-03-22 21:31:14 +01:00
TPTBusiness 2bc01799d3 feat: EURUSD walk-forward splits, bars terminology, README no $factor 2026-03-22 21:28:01 +01:00
TPTBusiness fe1b37c281 feat: EURUSD model experiment setting + model simulator text patched 2026-03-22 21:23:39 +01:00
TPTBusiness 4ed7c0b602 feat: EURUSD FX patches - prompts, factor spec, experiment settings 2026-03-22 21:21:07 +01:00
TPTBusiness d057926d18 chore: initial Predix state (RD-Agent fork + EURUSD setup) 2026-03-22 21:20:02 +01:00
BarryC 4ea4d4fdf0 feat: [AutoRL-Bench] Update DeepSearchQA split and translate task instructions to English (#1368)
* fix(alfworld): stop exposing react prompts to agents

* fix(deepsearchqa): use deterministic 100/800 split

* fix(deepsearchqa): switch default split to 100/200

* docs(autorl-bench): translate task instructions to english
2026-03-19 20:44:46 +08:00
dependabot[bot] 0af23ebcdc chore(deps): bump esbuild, @vitejs/plugin-vue and vite in /web (#1363)
Removes [esbuild](https://github.com/evanw/esbuild). It's no longer used after updating ancestor dependencies [esbuild](https://github.com/evanw/esbuild), [@vitejs/plugin-vue](https://github.com/vitejs/vite-plugin-vue/tree/HEAD/packages/plugin-vue) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite). These dependencies need to be updated together.


Removes `esbuild`

Updates `@vitejs/plugin-vue` from 5.1.4 to 5.2.4
- [Release notes](https://github.com/vitejs/vite-plugin-vue/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-vue/blob/main/packages/plugin-vue/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-vue/commits/plugin-vue@5.2.4/packages/plugin-vue)

Updates `vite` from 5.4.10 to 8.0.0
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/create-vite@8.0.0/packages/vite)

---
updated-dependencies:
- dependency-name: esbuild
  dependency-version: 
  dependency-type: indirect
- dependency-name: "@vitejs/plugin-vue"
  dependency-version: 5.2.4
  dependency-type: direct:development
- dependency-name: vite
  dependency-version: 8.0.0
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-18 14:27:06 +08:00
dependabot[bot] bb20fcebd9 chore(deps): bump prismjs from 1.29.0 to 1.30.0 in /web (#1362)
Bumps [prismjs](https://github.com/PrismJS/prism) from 1.29.0 to 1.30.0.
- [Release notes](https://github.com/PrismJS/prism/releases)
- [Changelog](https://github.com/PrismJS/prism/blob/v2/CHANGELOG.md)
- [Commits](https://github.com/PrismJS/prism/compare/v1.29.0...v1.30.0)

---
updated-dependencies:
- dependency-name: prismjs
  dependency-version: 1.30.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-18 14:19:21 +08:00
dependabot[bot] d670d08c92 chore(deps): bump lodash from 4.17.21 to 4.17.23 in /web (#1355)
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.21 to 4.17.23.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.21...4.17.23)

---
updated-dependencies:
- dependency-name: lodash
  dependency-version: 4.17.23
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-18 14:17:30 +08:00
dependabot[bot] 3f9d4f45ef chore(deps): bump markdown-it from 14.1.0 to 14.1.1 in /web (#1357)
Bumps [markdown-it](https://github.com/markdown-it/markdown-it) from 14.1.0 to 14.1.1.
- [Changelog](https://github.com/markdown-it/markdown-it/blob/master/CHANGELOG.md)
- [Commits](https://github.com/markdown-it/markdown-it/compare/14.1.0...14.1.1)

---
updated-dependencies:
- dependency-name: markdown-it
  dependency-version: 14.1.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-18 14:14:45 +08:00
dependabot[bot] a015d0127e chore(deps): bump immutable from 4.3.7 to 4.3.8 in /web (#1358)
Bumps [immutable](https://github.com/immutable-js/immutable-js) from 4.3.7 to 4.3.8.
- [Release notes](https://github.com/immutable-js/immutable-js/releases)
- [Changelog](https://github.com/immutable-js/immutable-js/blob/main/CHANGELOG.md)
- [Commits](https://github.com/immutable-js/immutable-js/compare/v4.3.7...v4.3.8)

---
updated-dependencies:
- dependency-name: immutable
  dependency-version: 4.3.8
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-18 14:14:23 +08:00
dependabot[bot] a5d79912e1 chore(deps): bump axios from 1.7.7 to 1.13.5 in /web (#1356)
Bumps [axios](https://github.com/axios/axios) from 1.7.7 to 1.13.5.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.7.7...v1.13.5)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.13.5
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-18 14:13:54 +08:00
dependabot[bot] 4412c2731e chore(deps-dev): bump svgo from 2.8.0 to 2.8.2 in /web (#1354)
Bumps [svgo](https://github.com/svg/svgo) from 2.8.0 to 2.8.2.
- [Release notes](https://github.com/svg/svgo/releases)
- [Commits](https://github.com/svg/svgo/compare/v2.8.0...v2.8.2)

---
updated-dependencies:
- dependency-name: svgo
  dependency-version: 2.8.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-18 14:12:25 +08:00
dependabot[bot] bfc5fc5178 chore(deps): bump lodash-es from 4.17.21 to 4.17.23 in /web (#1359)
Bumps [lodash-es](https://github.com/lodash/lodash) from 4.17.21 to 4.17.23.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.21...4.17.23)

---
updated-dependencies:
- dependency-name: lodash-es
  dependency-version: 4.17.23
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-18 14:11:57 +08:00
dependabot[bot] 91e538734b chore(deps): bump minimatch from 9.0.5 to 9.0.9 in /web (#1360)
Bumps [minimatch](https://github.com/isaacs/minimatch) from 9.0.5 to 9.0.9.
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v9.0.5...v9.0.9)

---
updated-dependencies:
- dependency-name: minimatch
  dependency-version: 9.0.9
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-18 14:11:40 +08:00
dependabot[bot] 3a2fb424f9 chore(deps): bump rollup from 4.24.0 to 4.59.0 in /web (#1353)
Bumps [rollup](https://github.com/rollup/rollup) from 4.24.0 to 4.59.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.24.0...v4.59.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-version: 4.59.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-18 14:11:17 +08:00
XianBW 7800805e04 feat: add a web UI server (#1345)
* update rdagent cmd

* fix log error message

* use multiProcessing.Process instead of subprocess.Popen

* add traces to gitignore

* add user interactor in RDLoop (finance scenarios)

* add interactor (feedback, hypothesis) for quant scens

* fix the test_end in qlib conf

* add features init config, general instruction to qlib scenarios

* set base features for based exp

* fix bug when combine factors

* move traces folder to git_ignore_folder

* fix bug in features init

* fix quant interact bug

* fix logger warning error

* bug fixes

* modify rdagent logger, now it can set file output

* adjust cli functions and fix logger bug

* fix server port transport problem

* update server_ui in cli

* add web code

* fix CI problem

* black fix

* update web ui README

* update README

* update readme
2026-03-18 14:04:52 +08:00
BarryC 77fdb00e25 feat(rl): add AutoRL-Bench framework and benchmark integrations (#1348)
* feat: rdkit for chemcotbench

* update qwen2.5&llama3.1 context

* fix: force failure on validation error and remove try/except in validator

* feat: unified error sample extraction (with test scripts)

* feat: set conda cache with .env

* feat: skip data eval if data pass in last evo

* fix: rm redundant param

* fix ui bug

* refactor: centralize assign_code_list_to_evo in MultiProcessEvolvingStrategy

* feat: add test_params.yaml generation and workspace cleanup improvements for finetune

* refactor: replace get_clear_ws_cmd with clear_workspace and update prompts for hard check criteria

* add bioprobench dataset

* fix: handle commas in training config extraction and refactor prompt includes

* bioprobench description

* add bioprobench readme

* feat: merge lora adapter for blackwell gpu

* feat: support for multi benchmarks in one job

* change dfficult aware content for training

* update difficulty-aware and logging principles

* fix: resolve variable name conflict in FTRunnerEvaluator

* set job id accuracy to minute

* feat(ui): display one selected metric per benchmark

* feat: store sota exp, and fix ws_ckp bug

* fix: truncate data.json in feedback

* fix: opencompass data for conda env

* fix: save only the last model

* feat: set log path and ws path

* fix: set overwrite_cache to avoid lock contention(through injecting params)

* feat: redirect stdout to file in localenv

* add pickle cache to dataset desc

* fix CI

* fix: remove redundant wrapper

* feat: set python_unbuffered

* move redirect stdout to env run

* fix a small bug

* move model folder

* feat(ui): display benchmark baseline

* fix: enrich scenario and benchmark description

* fix: rewrite runner eval to accept easier

* feat: compare with baseline when no SOTA

* update tablebench readme

* fix: switch back to single benchmark (for baseline)

* feat(ui): add ws path in ui

* refactor: update SOTA tracking to use DAG traversal and parent selection

* fix: prioritize local_selection in trace and refactor sibling retrieval logic

* refactor: unify error handling in feedback generation and update workspace injection

* feat: add skip_loop_error_stepname to control error skip step in LoopBase

* fix: set local_selection to NEW_ROOT for experiments without parent

* feat: set different ports for jobs

* feat: set different ports for jobs

* feat: add upper data size limit for LLM fine-tuning and update related prompts

* fix: replace get_truncated_stdout() with stdout for consistent output handling

* refactor: remove data.json from cache and workspace logic, focus on script-based reuse

* fix: rm target_scenario

* feat: add selective cache extraction and custom cache key for data processing

* fix(ui): bug when displaying tablebench

* fix: filter config in dataset_info.json

* feat: add test set, set valid set

* feat(ui): update test score, and set color for final decision

* feat: add test score for baseline and update ui

* fix: use [-100:] as test range

* feat: update data_stats in runner

* feat: wait for opencompass init when run multi jobs

* fix: adjust test&valid split

* feat: force to generate COT(with <think> token), and add answer format in scenarios.json

* feat: improve ui

* fix: unify benchmark volume mounts and set extra_volumes for conda env

* fix(ui): number color

* fix: update GPU memory handling to use total memory in GB and streamline code

* fix: set use_cot_postprocessor

* feat: add env_dict to config classes and merge env vars in Env run

* fix: let coder obey proposal

* fix(ui): direction bug and update chemcot core metirc

* fix: set consistent benchmark mount points and env vars for docker and conda

* fix: addintional target for LoRA

* feat: workspace dir log for benchmark running

* fix: tableInstruct path bug and update benchmark description

* feat: timeout for whole job

* fix: align FinanceIQ import to opencompass

* feat: use llm_judge for FinanceIQ

* feat: switch to turn on <think> or not

* feat: using scripts to redirect stdout, and run in different windows

* feat: sync litellm log

* fix: gpu memory format

* fix: escape special characters in benchmark desc

* fix: set data processing timeout to 1h

* feat: set valid_loss and save_best_model

* fix: inject timeout and stage

* fix: loss history extract logic

* feat: inject output dir

* feat: inject eval batch size

* feat: inject save_total_limit

* feat: update data prompt

* fix:  escape shell special characters

* fix: tablebench visualization UI

* fix: move implementation validation to coder, and ignore injected params

* docs: add README for RL-PostTraining evaluation system

* Add AutoRL-Bench evaluation framework for RL post-training

* Add architecture documentation

* docs: update architecture and interface documentation for AutoRL-Bench

* improve doc

* fix

* refactor: YAML配置驱动

* feat: add RL Docker env, workspace test, and update project structure

* feat: 重命名 autorl_bench, 新增 RLWorkspace, 配置 Docker extra_volumes

* Add eval-only AutoRL-Bench pipeline

* sturcture clean

* docs: add autorl_bench README

* feat(rl): Implement RL post-training agent scaffold and example

* refactor: simplify RL scenario classes and update RL CoSTEER integration

* feat(rl): 调通 scaffold,mock 数据跑完 5 步循环

* feat(rl): 接入 LLM 生成代码,支持 model_path 传递

* feat(rl): Docker 执行框架,RLWorkspace.run() + RLPostTrainingRunner

* feat(rl): LLM 生成假设/反馈,完整 loop 跑通

* feat: add RL post-training entry point with configurable options

* refactor: simplify RL proposal and trace classes, update config and docs

* Update rl eval autorl_bench layout

* Update RL workflow and evaluation setup

* Integrate AutoRL-Bench evaluation in RL workflow

* feat(rl): 添加 --base-model/--benchmark CLI 参数,简化 RLTask

* feat(rl): Docker 环境动态选择 + example_agent 完整训练评测流程(无llm)

* fix(rl): 修复 feedback 传递 + 添加 verl 依赖

* refactor: remove unused validate in BenchmarkAdapter and add core utils module

* feat(rl): UI

* Refactor autorl_bench layout and docker entrypoint

* autorl_bench: add aider autoloop tool

* feat(rl): environment docker

* refactor: simplify aider autoloop tooling

* chore: update misc files

* feat(rl): yaml-driven dataset download & auto-download on startup

* feat(rl): yaml-driven dataset download & auto-download on startup

* Refactor RL eval runner and clean up

* Simplify RL eval runner and env

* rl: include litellm in RL docker image

* feat(rl): unified resource path & model repo_id structure

* feat(rl): refactor eval with OpenCompass & add training code template

* feat(rl): refactor eval with OpenCompass & add training code template

* feat(rl): delete test bench

* docs: add benchmark interface notes and TODOs for unified evaluation

* feat(rl): unified benchmark eval interface + shared configs

* feat(rl): 优雅

* feat(rl): prompt prososal+coder improve

* feat(rl): fix eval

* fix(rl): docker

* fix(rl): eval

* v 1.0 tmep

* benchmark v1.0

* benchmark v1.1

* benchmark v1.1: grading日志+代码去重

* benchmark v1.1: grading日志+代码去重

* benchmark v1.1: grading日志+代码去重+task description

* benchmark v1.2: fix

* benchmark v1.3: fix,example-agent ok,rdagent test,openhands develop

* benchmark v1.4: fix,example-agent ok,rdagent ok,openhands develop

* benchmark : add alfworld

* benchmark : update readme

* benchmark : update readme

* benchmark :

* chore: add eval bypass block and mark TODO in grading server

* benchmark

* benchmark

* benchmark

* benchmark

* alfworld

* alfworld

* benchmark

* rdagent

* rdagent

* benchmark

* benchmark:ui

* benchmark:delete docker + log

* 1

* alfworld

* ui

* alfworld

* readme

* alfworld

* parallex

* alfworld

* run

* eval gpu

* alfworld

* alfworld

* fix conda init in start.sh for non-interactive shells

Fallback to common miniconda paths when conda is not in PATH.
Fixes B200 pod startup failure (conda: command not found).

Made-with: Cursor

* simplify start.sh: read TRAINING_PYTHON from .env

No more conda detection logic. Just set TRAINING_PYTHON in .env.
Fallback to conda only if not set.

Made-with: Cursor

* use OPENHANDS_PYTHON from .env to run agent

start.sh now uses OPENHANDS_PYTHON for main.py execution,
since the parent process may be in a different conda env.

Made-with: Cursor

* feat: register OpenCode agent into autorl_bench framework

- Add agents/opencode/ with config.yaml, start.sh, README.md
- Include opencode-rl pipeline code (pipeline/, runner_fsm/, benchmarks/)
- Merge opencode-rl dependencies into autorl_bench requirements.txt
- Remove separate venv requirement, share main environment

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Update opencode agent, benchmarks, and eval configs

- Sync opencode-rl runner_fsm with latest simplifications
- Add smith benchmarks integration
- Update opencompass configs and server with GPU support + error handling

* Update OpenCode agent docs for external opencode-rl integration

- Document external repo architecture (opencode-rl as independent plugin)
- Add setup instructions for cloning and configuring opencode-rl
- Add architecture diagram showing RD-Agent ↔ opencode-rl interaction
- Document OPENCODE_RL_ROOT for custom paths

* feat: add smith benchmark discovery and per-sample evaluator

- Add smith/ module for dynamic benchmark discovery from rl-smith
- Add PerSampleEvaluator for per-sample scoring via vLLM
- Update utils.py to support script-based data download for smith benchmarks
- Update opencode agent config

* enforce RL-only in instructions.md; remove embedded opencode-rl

- instructions.md: prohibit SFT, require RL (GRPO/PPO) for all benchmarks
- remove agents/opencode/opencode-rl/ (runtime uses external OPENCODE_RL_ROOT)

Made-with: Cursor

* comment out OpenCode-only deps in requirements.txt

openai, httpx, python-dotenv, tenacity are for OpenCode agent's
separate environment. Keep peft and pydantic as shared deps.

Made-with: Cursor

* refactor: extract _kill_process_group, narrow exception catches

- run.py: replace 2x nested 3-level try/except with shared
  _kill_process_group() using loop + specific exceptions
- server.py: except Exception → except (RuntimeError, ValueError, OSError)
- utils.py: except Exception → except requests.ConnectionError

Made-with: Cursor

* move kill_process_group to core/utils for reuse

Extract from run.py into core/utils.py so other runners
can also use it. Exported via core/__init__.py.

Made-with: Cursor

* add comments to run.py for workspace isolation and signal handling

Made-with: Cursor

* remove OpenCode-only deps from requirements.txt entirely

Made-with: Cursor

* allow SFT in instructions, RL as ultimate goal

Made-with: Cursor

* add workspace isolation rules to instructions.md

Use relative paths, forbid cd outside workspace, ignore symlink targets.

Made-with: Cursor

* update opencode start.sh: use OPENCODE_PYTHON, add PATH for opencode CLI, remove unsupported args

Made-with: Cursor

* opencode start.sh: pass --run-dir to use AutoRL-Bench workspace

Ensures OpenCode-FSM-Runner writes outputs into the workspace prepared
by AutoRL-Bench instead of creating its own runs/ directory.

Made-with: Cursor

* opencode start.sh: prepend training env bin to PATH

Ensures LLM agent bash calls (e.g. python3 -c "from trl import ...")
resolve to the correct training environment, instead of relying on
parent shell conda activation.

Made-with: Cursor

* opencode start.sh: restore --max-retries and --eval-timeout for opencode-rl

Made-with: Cursor

* add humaneval benchmark

* Replace import * cleanup hack with explicit imports in OpenCompass config

- Resolve dataset variable names via importlib before generating config,
  so the template uses `from xxx import datasets` instead of `import *`
- Remove the fragile runtime cleanup hack that set leaked modules to None
- Increase OpenCompass timeout from 3600s to 7200s
- Fix score parsing to average across multiple subdatasets

* refine opencompass config file generating

* add humaneval benchmark dependency instructions

human-eval package requires clone from open-compass/human-eval with
a one-line patch to relax assertion for partial evaluation (test split only).

Made-with: Cursor

* fix: sanitize user-provided paths in RL UI (CodeQL)

* fix: resolve user path relative to safe root (CodeQL)

* fix: use Copilot-suggested path sanitization pattern (CodeQL)

* fix: normalize and reject absolute user paths (CodeQL)

* Fix training params, vLLM OOM cleanup, OpenCompass score parsing, and baseline cache logic

* fix: add setuptools<75 to requirements for opencompass pkg_resources dependency

uv venv does not include setuptools by default, causing OpenCompass baseline
evaluation to fail with "No module named 'pkg_resources'".

Made-with: Cursor

* webshop

* feat(autorl_bench): improve smith benchmark integration and evaluator robustness

- Add smith benchmark docs to README: usage examples, discovery mechanism, SMITH_BENCH_DIR
- Improve PerSampleEvaluator: vLLM GPU cleanup, test_range slicing
- Refactor server.py: extract grading server from utils
- Fix OpenCompass score parsing and baseline cache logic

* fix: add smart fallback for OpenCompass dataset variable resolution

When build_dataset_imports_explicit() fails to import an OpenCompass
dataset module (common in grading server subprocess), it now guesses
the correct variable name from the module path convention instead of
falling back to empty names (which causes import * and breaks BBH
due to leaked file handle objects).

* revert: restore opencompass.py to pre-modification state

Revert vLLM pid cleanup, dash-value checks, and metric-based
score parsing added in 31caff2f and bb32e555.

* keep metric-aware score parsing in opencompass; add baseline column to UI

- opencompass.py: retain metric-type filtering (accuracy/score) instead
  of naive averaging, avoids polluting scores with pass/timeout counters
- ui.py: add Baseline column to Agent Summary table

Made-with: Cursor

* fix: handle non-string answers in extract_answer to prevent TypeError

arc_agi and other benchmarks can have non-string answer fields (e.g. lists),
which caused a crash in re.search(). Adding str() coercion fixes this.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* update deepsearch qa tasks

* fix: benchmark evaluation reliability (B1-B4)

- B1: auto-detect LoRA adapters and enable vLLM LoRA mode (read base_model from adapter_config.json)
- B2: serialize evaluations with threading.Lock to prevent GPU contention
- B3: cache eval results by model_path to deduplicate concurrent submissions
- B4: propagate error details from OpenCompass to agent (non-numeric scores, load failures)

Made-with: Cursor

* fix(B1): reject LoRA adapter submissions with clear merge instructions

- opencompass.py: detect adapter_config.json and return error with
  merge_and_unload() instructions instead of broken vLLM LoRA mode
- instructions.md: add requirement to submit full merged models
- opencompass_template.yaml: remove unused is_lora/lora_path params

Made-with: Cursor

* update chat completion

* update

* update deepsearch

* md

* codex + benchmark update

* codex + benchmark update

* codex + benchmark update

* codex

* codex

* fix: grading server cache key includes mtime to detect model overwrites

Previously cache used only resolved_path, so overwritten models at the
same path returned stale scores. Now cache key = path@max_mtime so
re-evaluation is triggered when model files change.

Made-with: Cursor

* feat: add gemini/claude agent scaffolds, fix codex binary path

- codex/start.sh: use CODEX_BIN env var instead of bare 'codex'
- Add gemini/ and claude/ agent directories with config.yaml and start.sh

Made-with: Cursor

* chore: remove copied human_readable_trace.py from PostTrainBench

Made-with: Cursor

* update evaluation

* benchmark

* Fix log cleanup and OpenHands env

* fix: webshop env pth problem

* benchmark alpacaeval

* style(rl): apply auto-lint fixes

* fix(rl): address CI and CodeQL issues

* fix(rl): make autorl bench imports CI-safe

---------

Co-authored-by: Qizheng Li <jenssenlee@163.com>
Co-authored-by: Young <afe.young@gmail.com>
Co-authored-by: Bowen Xian <xianbowen@outlook.com>
Co-authored-by: chelsea97 <zhuowbrown@gmail.com>
Co-authored-by: Xu Yang <peteryang@vip.qq.com>
Co-authored-by: sakura657 <yctangcse@gmail.com>
Co-authored-by: shatianming5 <tianming.sha@stonybrook.edu>
Co-authored-by: Yeyuqing0913 <shatianming4@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 15:49:30 +08:00
XianBW 342d78e234 feat: add LLM-finetune scenario (#1314)
* refine prompt

* small update

* fix a small bug

* remove debug config after execution

* fix: only remove <think> at start

* feat: support creating dataset & multi-eval frame (#1302)

* feat: add iterative evolve and evaluation support with partial chain stop

* feat: add FTDataEvaluator and support multiple implement functions in finetune

* feat: data implement for pre-proposal and proposal and add datasets (#1303)

* feat:(1) support for multi layer dataset extraction (2) add category.json for dataset in datasets/

* fix: fix bug for generate category.json

* feat: add get_dataset_folder_desc

* init data proposal and merge qzli/ft

* update data proposal prompts and add max_position_embeddings and resolve confilcts

* remove sample counts in data proposal

* turn data and train to unified hypo_gen

* refine prompts

* remove category.json and add it to dataset_info

* fix jinja problem and proposal done

* lint

* add ai-generated description and raw readme into dataset_info.json

* update prompt for description

* add datasets

* initial fix for proposal of data

* final version for data proposal

* lint

* feat: add stats in dataset_info, and enable data coder (#1306)

* refactor(dataset): add stats into dataset_info.json, and remove dataset from gitignore_folder

* feat: enable data coder and run data process

* feat: Merge data coder (#1307)

* feat: implement finetune data coding, evaluation, and config improvements

* fix: deepspeed config path

* fix: dataset info columns

---------

Co-authored-by: Young <afe.young@gmail.com>

* replace str length with token_limit

* add readme to dataset_info and remove useless blank lines in scenario description

* feat: dataset prepare

* fix: extract prams script name

* feat: add loss&predictions samples to feedback

* remove duplicate envs and and add llm_api_preferences and enhance reasoning token limits

* feat: network for ft_env

* fix: remove gpt-4o, which has low quota

* feat: a simple ui

* feat: merge data and train task type (#1309)

* feat: filter redundant prams of lf

* fix: ui bug caused by removing task_type

* fix: force agent to use high concurrency, and remove redundant prompt

* feat: extract info from llama factory log, and check data exists before download

* fix: add compatibility rules

* feat: llm evaluator for data coder

* feat: openai package in ft docker, and refine prompt

* feat: refine ft ui, add more info

* feat: add raw logs

* refine data coder prompt(for feedback debug)

* feat: select dataset in scen init

* fix: ui for docker log seperately

* feat: sync log through blob

* improve ui, and add llm feedback in Runner&Exp2FB (#1312)

* fix: ui bug to visualize docker log, and lint

* feat: unified docker log for ft env, and some refactor

* fix bugs and improve ui

* feat: save log of evaluator(single feedback)

* feat: add evaluator, set cleanup docker log

* feat: call llm in RunnerEvaluator and Feedback

* fix: extract structured error message in RunnerEvaluator

* feat: feedback improve, and fix some bugs

* feat: feedback improve when runner fails

* small update

* feat(UI): add running info and benchmark metric in loop expander

* feat(UI): add render markdown toggle

* feat: refine prompts and add error type in exp2fb

* feat: add filterd params reason, set default benchmark timeout to infinite, and refine train loss express

* recover dataset deepscaler

* feat: set timeout in .env

* refactor: unifiied ft_env timeout

* feat: debug mode for data coder

* feat: deliver data_stats after generate debug_data

* feat: use gpt-5.1 as judge model, set judge_retry, and refine debug mode prompt

* refine prompt

* refactor: llama factory manager logic, and refine data processing prompt

* feat(DockerEnv): support GPU selection via CUDA_VISIBLE_DEVICES

* feat: set api concurrency via .env

* fix: ft env timeout bug

* feat: enable CondaEnv run

* fix: can't update bin path in first run, and path bug in lf manager

* feat(ui): set log path through .env

* refactor(ui): wrap_lines, remove css

* feat(coder): retry when parse code-block fail

* fix: refine single-fb in ui, and fix path bug(not allow proposal to decide path)

* fix: opencompass CondaEnv torch compatible with vllm

* fix: refine error text in coding

* feat: deepspeed config for CondaEnv

* feat: memory estimator

* fix: deepspeed package for condaenv

* fix: use `client.chat.completions.create()` only

* feat: flash attention for condaenv

* feat: strong and weak models interface

* fix: condaenv package dependency

* use multi round conversation in llm finetune proposal

* refine prompt for data processing

* enable evolving in data coder

* maximize output token size

* fix: refine ui

* fix: optional packages for llama factory

* fix: torch denpendency for b200

* fix: opencompass dependency

* update cot prompts

* skip the sub implement

* skip conda preparation if env exists

* update chemcot datasets

* fix: unify docker to use litellm

* update readme and instructions

* fix: set CUDA_VISIBLE_DEVICES for CondaEnv

* feat: add panorama dataset, refactor dataset interface

* feat: calculate token using tiktoken, and ndarray bug

* fix: download subtasks of chemcotdataset seperately

* feat: customized prepare func for datasets

* feat: update new benchmarks

* add datasets package

* docs: readme for llm finetune

* feat: download raw data directly, with post-process function

* feat: analyze raw dataset

* suppress litellm debug info

* feat(ui): summary page

* feat: run multi-jobs

* feat: improve ui

* feat: add path and checkout options to LLM finetune loop entrypoint

* feat: add FinanceIQ_ppl benchmark with auto-download and dataset desc rendering

* refactor: remove unused imports and dead code, fix session folder logging

* feat: enable tablebench and tableInstruct dataset

* refine dataset readme, and coder prompt

* refine proposal and coder prompt

* fix: ui path (default log path)

* feat: add automatic LoRA model merging for benchmarking with vLLM

* refactor: reorganize finetune benchmark and merge modules under benchmark dir

* refactor: modularize benchmark config and error extraction for finetune scenario

* fix: update benchmark import paths and disable env cache for device info

* refactor docke&conda env and fix import bugs

* modify init python file

* feat: add FinanceIQ dataset split utility and integrate with pipeline

* feat: set weak and strong model by env, distribute workload across models

* feat: sample dataset and rm params for tensorboard, wandb

* update script to run jobs

* refine proposal prompt, remove specific dataset name

* fix(ui): auto switch log folder

* fix: estimate the processed full data after sample

* feat: filter raw data more aggressively, and lower data_eval standard

* feat: sync workspace to blob

* feat: rdkit for chemcotbench

* update qwen2.5&llama3.1 context

* fix: force failure on validation error and remove try/except in validator

* feat: unified error sample extraction (with test scripts)

* feat: set conda cache with .env

* feat: skip data eval if data pass in last evo

* fix: rm redundant param

* fix ui bug

* refactor: centralize assign_code_list_to_evo in MultiProcessEvolvingStrategy

* feat: add test_params.yaml generation and workspace cleanup improvements for finetune

* refactor: replace get_clear_ws_cmd with clear_workspace and update prompts for hard check criteria

* add bioprobench dataset

* fix: handle commas in training config extraction and refactor prompt includes

* bioprobench description

* add bioprobench readme

* feat: merge lora adapter for blackwell gpu

* feat: support for multi benchmarks in one job

* change dfficult aware content for training

* update difficulty-aware and logging principles

* fix: resolve variable name conflict in FTRunnerEvaluator

* set job id accuracy to minute

* feat(ui): display one selected metric per benchmark

* feat: store sota exp, and fix ws_ckp bug

* fix: truncate data.json in feedback

* fix: opencompass data for conda env

* fix: save only the last model

* feat: set log path and ws path

* fix: set overwrite_cache to avoid lock contention(through injecting params)

* feat: redirect stdout to file in localenv

* add pickle cache to dataset desc

* fix CI

* fix: remove redundant wrapper

* feat: set python_unbuffered

* move redirect stdout to env run

* fix a small bug

* move model folder

* feat(ui): display benchmark baseline

* fix: enrich scenario and benchmark description

* fix: rewrite runner eval to accept easier

* feat: compare with baseline when no SOTA

* update tablebench readme

* fix: switch back to single benchmark (for baseline)

* feat(ui): add ws path in ui

* refactor: update SOTA tracking to use DAG traversal and parent selection

* fix: prioritize local_selection in trace and refactor sibling retrieval logic

* refactor: unify error handling in feedback generation and update workspace injection

* feat: add skip_loop_error_stepname to control error skip step in LoopBase

* fix: set local_selection to NEW_ROOT for experiments without parent

* feat: set different ports for jobs

* feat: set different ports for jobs

* feat: add upper data size limit for LLM fine-tuning and update related prompts

* fix: replace get_truncated_stdout() with stdout for consistent output handling

* refactor: remove data.json from cache and workspace logic, focus on script-based reuse

* fix: rm target_scenario

* feat: add selective cache extraction and custom cache key for data processing

* fix(ui): bug when displaying tablebench

* fix: filter config in dataset_info.json

* feat: add test set, set valid set

* feat(ui): update test score, and set color for final decision

* feat: add test score for baseline and update ui

* fix: use [-100:] as test range

* feat: update data_stats in runner

* feat: wait for opencompass init when run multi jobs

* fix: adjust test&valid split

* feat: force to generate COT(with <think> token), and add answer format in scenarios.json

* feat: improve ui

* fix: unify benchmark volume mounts and set extra_volumes for conda env

* fix(ui): number color

* fix: update GPU memory handling to use total memory in GB and streamline code

* fix: set use_cot_postprocessor

* feat: add env_dict to config classes and merge env vars in Env run

* fix: let coder obey proposal

* fix(ui): direction bug and update chemcot core metirc

* fix: set consistent benchmark mount points and env vars for docker and conda

* fix: addintional target for LoRA

* feat: workspace dir log for benchmark running

* fix: tableInstruct path bug and update benchmark description

* feat: timeout for whole job

* fix: align FinanceIQ import to opencompass

* feat: use llm_judge for FinanceIQ

* feat: switch to turn on <think> or not

* feat: using scripts to redirect stdout, and run in different windows

* feat: sync litellm log

* fix: gpu memory format

* fix: escape special characters in benchmark desc

* fix: set data processing timeout to 1h

* feat: set valid_loss and save_best_model

* fix: inject timeout and stage

* fix: loss history extract logic

* feat: inject output dir

* feat: inject eval batch size

* feat: inject save_total_limit

* feat: update data prompt

* fix:  escape shell special characters

* fix: tablebench visualization UI

* fix: move implementation validation to coder, and ignore injected params

* feat: README for FinanceIQ dataset

* fix: bioprobench desc error

* fix: remove task alignment when coder eval

* fix: FinanceIQ now extracts last capital as answer

* fix: stdout contains binary data

* feat: recover estimate full output and set eval setting automatically

* fix(ui): precision for summary table

* fix(ui): import error

* feat: try to use lora

* fix(api): fix litellm bug for code block

* fix: refine prompts to give agent more decision space

* chore(ci): fix mypy typing issues

* chore(ci): format code with black

* chore(ci): fix ruff lint violations

* chore(ci): sort imports with isort

* chore(ci): format code with black

* test: temporarily skip extract_parameters imports due to numpy pin

* fix: compatibility issues for qlib scenarios on finetune branch

* fix(fin_factor): skip to fb for coder error

* fix(loop): default skip to feedback step on skip_loop_error

When skip_loop_error exception happens and skip_loop_error_stepname is not
explicitly set, default to jumping to 'feedback' step if it exists,
otherwise fall back to the last step (record).

This prevents KeyError when record step tries to access feedback data that
doesn't exist because we skipped the feedback phase.

Also removed redundant skip_loop_error_stepname from finetune loop since
it's now the default behavior.

* add 'skip to record' to DS scenario like other scenarios

* fix 2 scenarios bug about rd_loop class

* fix: lint(mypy, ruff, black) error

* fix: mypy lint error

* fix data science scenario bug

---------

Co-authored-by: Xu Yang <peteryang@vip.qq.com>
Co-authored-by: Qizheng Li <jenssenlee@163.com>
Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>
Co-authored-by: amstrongzyf <201840057@smail.nju.edu.cn>
Co-authored-by: Young <afe.young@gmail.com>
Co-authored-by: amstrongzyf <amstrongzyf@126.com>
Co-authored-by: chelsea97 <zhuowbrown@gmail.com>
Co-authored-by: SunsetWolf <Lv.Linlang@hotmail.com>
2026-03-02 19:04:10 +08:00
Linlang 747a764664 fix: preserve null end_time when rendering dataset segments template (#1326)
* fix: preserve null end_time when rendering dataset segments template

* deps(qlib): bump qlib revision to 2fb9380

* fix: lint error
2026-02-13 10:50:46 +08:00
Linlang 56bd807d63 fix: prevent calendar index overflow when signal data ends early (#1324)
* fix: prevent calendar index overflow when signal data ends early

* fix: make test_end optional to resolve Qlib backtest calendar misalignment

* fix: enhance GPU information output in get_gpu_info function

* fix: improve GPU information output in get_gpu_info function for better clarity

---------

Co-authored-by: Xu Yang <peteryang@vip.qq.com>
2026-01-13 14:41:35 +08:00
Linlang 9b52be686d refactor: unify qlib experiment configs, runners, and templates (#1320)
* refactor: unify qlib experiment configs, runners, and templates

* fix: use PropSetting instances instead of class attributes in qlib runners

* docs: add configurable train/valid/test time segments for fintech scenarios
2026-01-07 12:49:15 +08:00
Linlang 6cd9a8c9fc fix(collect_info): parse package names safely from requirements constraints (#1313)
* fix(collect_info): parse package names safely from requirements constraints

* chore(collect_info): replace custom requirement parser with packaging.Requirement

* chore(collect_info): improve variable naming when parsing package requirements
2025-12-09 17:54:47 +08:00
Linlang 24f0818146 docs: add documentation for Data Science configurable options (#1301) 2025-11-25 16:56:30 +08:00
Linlang b39a71e09e fix(ci): remove env-print step to avoid leaking sensitive environment variables (#1299) 2025-11-24 11:13:12 +08:00
XianBW 58abebded5 update setuptools to resolve install bug (#1295) 2025-11-20 10:51:20 +08:00
you-n-g a027f6851c fix: (to main) litellm's Timeout error is not picklable (#1294) 2025-11-19 19:41:49 +08:00
Breezy 5e0d969206 docs: add execution environment configuration guide (Docker vs Conda) (#1288)
* docs: add execution environment configuration guide (Docker vs Conda)

* docs: extend execution environment configuration with additional scenario support
2025-11-18 16:08:05 +08:00
you-n-g e891a6bd7f fix: avoid triggering errors like "RuntimeError: dictionary changed s… (#1285)
* fix: avoid triggering errors like "RuntimeError: dictionary changed size during iteration"

* style: reformat run_in_executor call for improved readability
2025-11-08 22:55:29 +08:00
you-n-g ca56c8a7ea chore: release 0.8.0
Release-As: 0.8.0
2025-11-03 22:01:18 +08:00
Linlang b485cdefb2 fix: handle mixed str and dict types in code_list (#1279)
* fix: handle mixed str and dict types in code_list

* fix: handle missing token_costs entry for loop 0 in summarize_win
2025-11-03 21:52:41 +08:00
you-n-g c8901ab8a0 feat: show the summarized final difference between the final workspace and the base workspace (#1281) 2025-11-03 17:59:46 +08:00
XianBW 91e0e734df fix litellm log content (#1278) 2025-10-24 12:30:30 +08:00
Xu Yang 903d4beeef fix: refine task scheduling logic in MultiProcessEvolvingStrategy for… (#1275)
* fix: refine task scheduling logic in MultiProcessEvolvingStrategy for improved handling of feedback in improve mode

* fix: add empty implementation for skipped tasks in MultiProcessEvolvingStrategy
2025-10-23 17:09:18 +08:00
Xu Yang 68d5eb4aad fix: enhance feedback handling in MultiProcessEvolvingStrategy for improved task evolution (#1274) 2025-10-23 16:00:23 +08:00
Xu Yang 1134c0b327 feat: add improve_mode to MultiProcessEvolvingStrategy for selective task implementation (#1273) 2025-10-22 17:35:18 +08:00
amstrongzyf f44a7bea0b fix: replace hardcoded ChromeDriver path with webdriver-manager (#1271) 2025-10-20 22:15:44 +08:00
XianBW a3ba1db7e4 feat: add a rag mcp in proposal (#1267)
* add simple rag mcp

* add rag_agent in expGen v2

* add conf config for research rag

* fix CI

* refactor: move context7 and rag config files to new conf modules

* make rag agent general

* fix CI

---------

Co-authored-by: Young <afe.young@gmail.com>
2025-10-20 16:46:25 +08:00
Star dust 02e021db2d fix: fix mcts (#1270)
* init mcts class

* full ver of MCTS

* auto-lint

* make MCTS feedback in exp-gen()

* refactor: move reset logic from Trace to ExpGen and update usage accordingly

* fix: reinitialize trace on consecutive errors in DataScienceRDLoop

* feat: add reset method to BaseScheduler and call in MCTSScheduler reset

* style: reorder imports for consistency and PEP8 compliance

* lint

* fix observe_feedback

* fix bug

* remove uncommited_rec_status

* more simple

* refactor: move commit observation logic to process_uncommitted_nodes method

* docs: add TODO comment about rule-based virtual root node expansion

* add score reward

* fix bug

* fix small bug

* lint

* change reward

* small small change

* autolint

---------

Co-authored-by: xuangu-fang <xuangufang@gmail.com>
Co-authored-by: Young <afe.young@gmail.com>
2025-10-17 16:57:28 +08:00
Jensen 6eac96c380 feat(mcp): cache with one-click toggle (#1269)
* feat: enable cache in mcp

* refactor: remove redundant setting

* fix: conflicts during installation

---------

Co-authored-by: Linlang <Lv.Linlang@hotmail.com>
2025-10-17 16:30:59 +08:00
xuangu-fang ef7a62fd7d feat: mcts policy based on trace scheduler (#1203)
* init mcts class

* full ver of MCTS

* auto-lint

* make MCTS feedback in exp-gen()

* refactor: move reset logic from Trace to ExpGen and update usage accordingly

* fix: reinitialize trace on consecutive errors in DataScienceRDLoop

* feat: add reset method to BaseScheduler and call in MCTSScheduler reset

* style: reorder imports for consistency and PEP8 compliance

* lint

* fix observe_feedback

* fix bug

* remove uncommited_rec_status

* more simple

* refactor: move commit observation logic to process_uncommitted_nodes method

* docs: add TODO comment about rule-based virtual root node expansion

* add score reward

* fix bug

* fix small bug

* lint

* change reward

* lint

---------

Co-authored-by: Young <afe.young@gmail.com>
Co-authored-by: jingyuanlm <842442862@qq.com>
Co-authored-by: amstrongzyf <amstrongzyf@126.com>
2025-10-17 16:21:39 +08:00
Utsab Dahal 9f6881c050 fix: model/factor experiment filtering in Qlib proposals (#1257)
* Fix model/factor experiment filtering in Qlib proposals

* fix(dockerfile): install coreutils to resolve timeout command error (#1260)

* chore: remove unused experiment_list and target_list from Qlib proposals

* fix CI

* fix target list

---------

Co-authored-by: Xu Yang <peteryang@vip.qq.com>
2025-10-10 22:49:46 +08:00
Utsab Dahal 9b169fcd75 fix(dockerfile): install coreutils to resolve timeout command error (#1260) 2025-10-10 10:44:22 +08:00
Utsab Dahal dc3941e331 fix: prevent JSON content from being added multiple times during retries (#1255) 2025-10-02 09:45:58 +08:00
Dex 8e126b0b57 fix(docs): update rdagent ui with correct params (#1249) 2025-09-23 16:20:00 +08:00
Tim 718a7ab779 fix: merge candidates (#1254)
* fix: add hypotheses_candidates
2025-09-22 21:04:07 +08:00
Xu Yang 4e6adc1f20 feat: update README with latest paper acceptance to NeurIPS 2025 (#1252)
* feat: update README with latest news and announcements

* update readme
2025-09-19 10:58:07 +08:00
Xu Yang 07c228ef9f feat: add user interaction in data science scenario (#1251)
* feat: add interactor classes and user interaction handling for experiments

* update code

* use fragment retry mechanism instead of rerun()

* fix a bug

* integrate user instructions into proposal and coder

* fix CI

* fix CI

* feat: add approval option for user instructions submission

* feat: enhance user instructions handling in Task and DSExperiment classes

* fix CI

* add user instructions into hypothesis rewrite

* add interface to command line

---------

Co-authored-by: Bowen Xian <xianbowen@outlook.com>
2025-09-18 11:10:12 +08:00
Tim 121b2dbe48 chore: valid selector update (#1248)
* chore: add medal info

* return sota_exp_stat

* update hit check

* update experiment

* udpate experiment

* extract log

* remove old log folder

* update candidates

* keep highest score

* early stop if no medal candidate
2025-09-17 15:48:16 +08:00
you-n-g e78398996c fix: add json format response fallback to prompt templates (#1246)
* fix: add json format response fallback to prompt templates

* more json prompt
2025-09-15 23:27:24 +08:00
you-n-g 6577f61df0 fix: set requires_documentation_search to None to disable feature in eval (#1245) 2025-09-15 07:45:08 +08:00
you-n-g 4f0b2be7a7 feat: init pydantic ai agent & context 7 mcp (#1240)
* feat: init pydantic ai agent & context 7 mcp

* feat: integrate MCP documentation search into data science pipeline evaluation

* fix: disable MCP documentation search and update related docstrings and defaults

* lint

* fix: correct prompt formatting and conditional blocks in pipeline_eval section

* lint

* feat: add query method to PAIAgent for synchronous agent execution

* fix: apply nest_asyncio for agent and update context7 query method

* lint

* lint

* lint

* lint

* docs: update MCP folder docstring and rename test class in test_pydantic.py

* refactor: centralize completion kwargs logic and update pydantic_ai integration

* fixbug

* typo

* fix: bug triggered by padantic-ai version backtracking.

---------

Co-authored-by: Linlang <Lv.Linlang@hotmail.com>
2025-09-13 10:25:02 +08:00
amstrongzyf 7f94e3a9c3 fix: fix chat_max_tokens calculation method to show true input_max_tokens (#1241)
* fix: use real max_input_length

* lint

* Update rdagent/oai/backend/litellm.py

Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>

* fix lint

* lint

* lint

---------

Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>
2025-09-12 15:09:20 +08:00
amstrongzyf 4de999c4a3 fix: revert 2 commits (#1239)
* revert commit:c51a3008f897416a7416f92d1286cbbf6a2291ae. PR 1179

* Revert "fix: change runner prompts (#1223)"

This reverts commit db2ebc27d70663d6aa85e0b05d9b81f5f6443c17.

* fix ruff check error

* fix: change switch place for fix_seed_and_data_split
2025-09-11 16:14:48 +08:00
you-n-g 6c132204c1 fix: move task cancellation to finally block and fix subprocess kill typo (#1234) 2025-09-10 10:05:08 +08:00
you-n-g 262081b2a5 feat: add stdout into workspace for easier debugging (#1236)
* refactor: use get_truncated_stdout for consistent stdout handling across modules

* lint

* feat: add dump_stdout_type to DSRunnerCoSTEERSettings and use in eval

* fix: avoid circular import by moving DSRunnerEvaluator import inside method
2025-09-10 10:02:49 +08:00
Tim 33fde3a0bb feat: offline selector (#1231)
* offline selector test
* fix score with tensor
* sort sota list

---------

Co-authored-by: Xu Yang <peteryang@vip.qq.com>
2025-09-09 11:56:42 +08:00
Star dust 337389bd3f fix: add a switch for ensemble_time_upper_bound and fix some bug in main (#1226)
* change runner prompts

* v1

* ensemble_time_upper_bound

* lint

* fix inf bug in function prob_dis_torch() and ensemble prompts

* lint

* lint

---------

Co-authored-by: amstrongzyf <amstrongzyf@126.com>
2025-09-08 16:35:42 +08:00
you-n-g 2e09996154 fix: increase retry count in hypothesis_gen decorator to 10 (#1230) 2025-09-08 12:23:58 +08:00
you-n-g 39de6bd168 fix: handle ValueError in stdout shrinking and refactor shrink logic (#1228) 2025-09-07 23:24:45 +08:00
Tim 956df9906c chore: make sure token size below limit (#1225)
* chore: make sure token size below limit

* refactor: refactor and add import

---------

Co-authored-by: amstrongzyf <amstrongzyf@126.com>
2025-09-04 15:07:42 +08:00
Star dust 2eaa69536c fix: change runner prompts (#1223)
* change runner prompts

* v1
2025-09-04 11:31:42 +08:00
amstrongzyf 71689b2cac fix: revert to v10 setting (#1220)
* feat: add runner_patience

* task gen prompts and torch version

* fix ensemble time bug

* small bug

* lint

* add torch

* fiix: remove useless code and change formula

* fix: rename parameter

---------

Co-authored-by: jingyuanlm <842442862@qq.com>
2025-09-03 16:37:33 +08:00
XianBW 4347c2e98c fix: summary page bug (#1219)
* fix summary bug

* fix CI
2025-09-02 17:06:54 +08:00
you-n-g dd4edb8331 feat: ui, support disable cache (#1217)
* fix: (drop) add cache_enable for functions in ui.utils

* fix: (drop) handle no logging, rename sota_exp to last_sota_exp for clarity in running_win
2025-09-01 15:58:05 +08:00
amstrongzyf c8830f3f3d fix: jinja problem of enumerate (#1216) 2025-09-01 14:50:26 +08:00
XianBW 88a1b08b8c for ui, a simple fix (#1215) 2025-09-01 14:46:51 +08:00
you-n-g f0b7fa2466 fix: allow prev_out keys to be None in workspace cleanup assertion (#1214)
* fix: allow prev_out keys to be None in workspace cleanup assertion

* fix: clean workspace only for non-None DSExperiment instances
2025-08-30 07:27:12 +08:00
amstrongzyf 19eb7ae138 fix: add missing self parameter to instance methods in DSProposalV2ExpGen (#1213) 2025-08-30 00:45:55 +08:00
you-n-g ac31473bfc fix: handle None output and conditional step dump in LoopBase execution (#1212) 2025-08-29 20:19:09 +08:00
you-n-g fbc1beb927 fix: update fallback criterion (#1210)
* fix: update fallback criterion

* fix: ensure evo_fb is initialized and used correctly in fallback logic

* refactor: rename use_new_evo to should_use_new_evo for clarity
2025-08-29 17:07:41 +08:00
you-n-g 1b15b53c1a feat: add option to enable hyperparameter tuning only in first eval loop (#1211)
* feat: add option to enable hyperparameter tuning only in first eval loop

* fix: use total_seconds() for accurate time calculations in evolution and tracking
2025-08-29 16:59:22 +08:00
XianBW 7735e121b4 chore: ui updates (#1209)
* show a workspace path string for easier copy, only percent existing columns when percent summary dataframe

* catch summary exception

* fix a bug

* fix ci
2025-08-29 15:05:15 +08:00
amstrongzyf da8f61f874 fix: fix bug for hypo_select_with_llm when not support response_schema (#1208) 2025-08-28 14:36:23 +08:00
XianBW 11b0f1b9ee fix ui bug (#1207) 2025-08-28 14:18:58 +08:00
you-n-g 64734fba4c fix: move snapshot saving after step index update in loop execution (#1206) 2025-08-28 10:58:57 +08:00
amstrongzyf 40f26ac54d feat: enable LLM‑based hypothesis selection with time‑aware prompt & colored logging (#1122)
* add hypo select by llm (without time)

* add time_info and log color

* select no smooth

* 2 hypo

* change select

* small change

* fix bug

* fix bug and add hypothesis router and begin flag

* fix bug v1

* fix bug v2

* fix feedback

* add new model

* add filter

* fix bug v3

* fix bug v4

* change prompts v2

* fix bug v5

* fix bug v6

* fix hypo

* fix some bug(sota socre, prompts, ensemble prompts  ) and add path legth.

* fix bug v7

* fix bug v8

* fix bug v9

* fix bug v10

* reset to v10 and refine

* fix: translate to english

* fix bug

* fix: use differnet increase_stage for coder & runner

* fix: use different timeout_increase_stage for coder and runner.

* fix: revert logger

* fix: remove duplicate content

* feat: implement LLM-driven extra hypothesis selection and adjust logic

* refactor: relocate Hypothesis models below TraceChallenges

* remove torch fix bug

* fix small bug

* refactor: prefix internal methods with underscore for llm-based hypothesis selection

* add fix_seed_and_data_split and enable_simple_hypothesis

* lint

* refine proposal config order

* code review; comments

* lint

* merge int to float

---------

Co-authored-by: jingyuanlm <842442862@qq.com>
Co-authored-by: Young <afe.young@gmail.com>
2025-08-27 18:36:51 +08:00
XianBW 0018429dc4 chore: refine get_summary_df and sota exp stat in log utils (#1201)
* add best valid selector to get sota exp stat

* remove unused in summary & refine get_summary_df

* fix hypothesis table bug in trace
2025-08-26 18:31:21 +08:00
Linlang b4e11f1895 style: convert CLI flags from snake_case to kebab-case (#1198)
Co-authored-by: Young <afe.young@gmail.com>
2025-08-25 20:07:01 +08:00
Xu Yang 3b57ea2666 fix: increase time default not controlled by LLM (#1196)
* fix: add longer timeout configuration for data science scenarios

* fix CI
2025-08-21 11:27:17 +08:00
XianBW 2f54199b44 fix: kaggle competition metric direction (#1195)
* fix leaderboard and competition direction

* ui fix
2025-08-20 16:40:53 +08:00
amstrongzyf 2173fc8c25 fix bug for embedding caused by PR 1188 (#1194) 2025-08-18 20:15:18 +08:00
Tim 08db63e0fe chore: refine env command (#1193) 2025-08-18 18:16:16 +08:00
XianBW 4728df7f38 fix: ui bug (#1192)
* small bug

* fix ci
2025-08-18 17:48:49 +08:00
amstrongzyf 5785bcf2ba fix: enable embedding truncation (#1188)
* fix: enable embedding auto truncation

* move embedding_utils to utils.embedding

* fix bug

* fix(embedding): improve text truncation with retry strategies and binary search optimization

* new way for embedding truncate

* fix ci errors
2025-08-18 17:20:41 +08:00
xuangu-fang ceabfe9686 feat: enable to inject diversity cross async multi-trace (#1173)
* init multi_trace_async_ diversity inject

* lint

* add task in context for diversity injection, add abstract class for diversity injection

* lint

* feat: update diversity injection strategy and enhance sibling context handling in experiment generation

* add always inject

---------

Co-authored-by: Xu Yang <peteryang@vip.qq.com>
2025-08-18 12:43:21 +08:00
you-n-g 0885d4d218 change the trace number from 3 to 1 (simpler default value) (#1191) 2025-08-18 12:13:23 +08:00
XianBW c3ef9e2d48 fix ui bugs (#1190) 2025-08-18 10:56:51 +08:00
you-n-g 00b588ffd4 fix: skip res_ratio check if timer or res_time is None (#1189) 2025-08-17 16:08:55 +08:00
Tim 0dae88e2cd chore: add inference mode for model dump (#1182)
* chore: add inference mode for model dump
* check runtime environment
* update opened_trace_lines
---------

Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>
2025-08-15 15:34:49 +08:00
you-n-g bfbdbcfbbd fix: insert await asyncio.sleep(0) to yield control in loop (#1186) 2025-08-15 13:27:29 +08:00
you-n-g 254eb56da3 refactor: use UI_SETTING.amlt_path for combined log folder path (#1184) 2025-08-14 21:51:05 +08:00
Tim f87dc2a5b8 chore: catch log_workflow error (#1183) 2025-08-14 16:12:37 +08:00
amstrongzyf 5b785346f7 fix: refine prompts and add additional package info (#1179)
* refine prompts and add additional package info

* refine prompts to be specific for GBDT models

* minor refine prompts

* use include to replace duplicate info

* refine prompts

* refactor: import DSTrace from base and remove exp_gen __init__

* lint

---------

Co-authored-by: Young <afe.young@gmail.com>
2025-08-13 23:00:23 +08:00
Tim aa2a5bae15 chore: add merge statistics (#1176)
* chore: add stat for merge
* use best selector
* use trace.hist
2025-08-13 22:59:34 +08:00
Chaos Yu 30d6afbb45 fix(graph): using assignment expression to avoid repeated function call (#1174)
* using assignment expression to avoid repeated function call

* format
2025-08-13 17:16:58 +08:00
Roland Minrui b94414a8ed feat: refine the logic of enabling hyperparameter tuning and add criteira (#1175)
* add 4 tuning criteria

* fix equation direction

* fix ci

* add comment

Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>

---------

Co-authored-by: Xu <v-xuminrui@microsoft.com>
Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>
2025-08-12 21:12:54 +08:00
you-n-g 137bdc15c5 fix: cancel tasks on resume and kill subprocesses on termination (#1166)
* fix: cancel tasks on resume and kill subprocesses on termination

* lint

* lint
2025-08-09 19:39:13 +08:00
XianBW 5b6a7d1d9b fix exec_time in summary because of parallel (#1171) 2025-08-08 17:14:02 +08:00
XianBW dbbf43558d add auto sota selector llm log in trace (#1169) 2025-08-08 16:26:48 +08:00
Xu Yang 3fe2ba44df feat: streamline hyperparameter tuning checks and update evaluation g… (#1167)
* feat: streamline hyperparameter tuning checks and update evaluation guidelines

* fix task_gen json check
2025-08-08 13:49:01 +08:00
Xu Yang 2764da68a3 feat: improve fallback handling in CoSTEER and add GPU usage guidelin… (#1165)
* feat: improve fallback handling in CoSTEER and add GPU usage guideline in share.yaml

* update prompt

* update
2025-08-07 15:52:55 +08:00
XianBW bad433ac47 add parent & root node in trace page (#1164) 2025-08-07 15:02:46 +08:00
Xu Yang 6dab8fd7dd feat: add reasoning attribute to DSRunnerFeedback for enhanced evaluation context (#1162) 2025-08-07 00:50:08 +08:00
Roland Minrui 16aadb7a0d fix: refine DSCoSTEER_eval prompts (#1157)
* change DSCoSTEER_eval prompts

* fallback to better exp only

* fix fallback

* fix and reformat

* fix bug when base_fb is None

* add reasoning to hyperparameter evaluation

* feat: add acceptable assessment in exp_feedback (#1159)

* add time

* refine eval prompt and make the logic of tuning check more clear

* some refinement

* fix CI

* fix a small bug, only consider score in runner

* refine comment

* simplify compare function

---------

Co-authored-by: jingyuanlm <842442862@qq.com>
Co-authored-by: Xu <v-xuminrui@microsoft.com>
Co-authored-by: Jensen Lee <91518020+Jensen246@users.noreply.github.com>
Co-authored-by: Xu Yang <peteryang@vip.qq.com>
2025-08-06 22:55:25 +08:00
Jensen Lee acfbd1b097 fix: ignore case when checking metric name (#1160)
* fix: ignore case when checking metric name

* add case-sensitive to prompts

---------

Co-authored-by: amstrongzyf <amstrongzyf@126.com>
2025-08-06 20:54:08 +08:00
XianBW 0334805744 chore: show timeline and change load_times (#1161)
* show timeline, deperacate old load_times

* fix bug
2025-08-06 18:42:17 +08:00
xuangu-fang 3244ba6833 feat: prob-based trace scheduler (#1131)
* draft prob-based trace scheduler

* refactor ProbabilisticScheduler

* auto lint

* keep random, Sota-based, length-based trace schedluer

* lint

* example

* example

* refactor

* add inverse option for sota Scheduler

* add trace_Scheduler in conf

* lint

* add scheduler_temperature

---------

Co-authored-by: Young <afe.young@gmail.com>
2025-08-06 16:42:51 +08:00
XianBW 912163d753 fix loop step time log problem (#1158) 2025-08-06 15:43:28 +08:00
Tim f5d17a1508 feat: enable finetune llm (#1055)
* feat: start with previous workspace

* feat: finetune llm

* add PrevModelLoadEvaluator

---------

Co-authored-by: Young <afe.young@gmail.com>
Co-authored-by: v-jianwan <v-jianwan@microsoft.com>
Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>
2025-08-06 12:24:44 +08:00
Xu Yang 0284b73596 feat: refactor CoSTEER classes to use DSCoSTEER and update max seconds handling (#1156)
* feat: refactor CoSTEER classes to use DSCoSTEER and update max seconds handling

* remove useless line

* enable time_ratio_limit_to_enable_hyperparameter_tuning
2025-08-05 18:16:10 +08:00
Paul 50916fa6c9 feat: create Jupyter notebook pipeline file based on main.py file (#1134)
* First commit

* isort

* black

* tweak prompt

* fix for argparse

* fix typo

* add e2e

* Add test files, clean

* fix black settings

* revert

* fix trailing

* remove extra

* comment

* small fix, updated prompt

* Fix argparse

* small improvements

* fix for merge

* fix for merge
2025-08-05 18:06:57 +08:00
Linlang 067b5908f4 docs: update configuration docs (#1155)
* update configuration docs

* update configuration docs

* update configuration docs
2025-08-05 15:48:28 +08:00
Jensen Lee fcfea1943c feat: add mask inference in debug mode (#1154) 2025-08-05 14:09:12 +08:00
amstrongzyf 84b7c30a90 fix: add metric in scores.csv and avoid reading sample_submission.csv (#1152)
* add scores.csv metric name in both task_gen and coder

* a little fix to column names

* small fix

* avoid sample submission read in task_gen

* avoid sample_submission reading in coding

* code change summary bug fix

* little update

* little refinement to eval

* refine coder and runner eval prompts

---------

Co-authored-by: Xu Yang <peteryang@vip.qq.com>
2025-08-04 19:53:08 +08:00
Xu Yang 5b541841cf feat: enhance timeout handling in CoSTEER and DataScience scenarios (#1150)
* add prev loops to runner history

* fix evolving history

* fix bug on initializing feedback without final decision

* reformat

* refine

* add comments

* feat: enhance timeout handling in CoSTEER and DataScience scenarios

---------

Co-authored-by: Xu <v-xuminrui@microsoft.com>
2025-08-04 17:44:51 +08:00
Roland Minrui f3cb3f8870 feat: add previous runner loops to runner history (#1142)
* add prev loops to runner history

* fix evolving history

* fix bug on initializing feedback without final decision

* reformat

* refine

* add comments

* fix ci

* a little refinement

* fix CI

---------

Co-authored-by: Xu <v-xuminrui@microsoft.com>
Co-authored-by: Xu Yang <peteryang@vip.qq.com>
2025-08-04 17:38:27 +08:00
XianBW cf070a004e save more time info (#1151) 2025-08-04 17:28:25 +08:00
XianBW 88e346b6b5 change something for ui compatiblity (#1149) 2025-08-04 12:40:35 +08:00
Roland Minrui 4b444097b2 fix (#1148)
Co-authored-by: Xu <v-xuminrui@microsoft.com>
2025-08-02 18:36:31 +08:00
XianBW a99b9aad39 chore: overwrite sota exp stat in summary page (#1146)
* overwrite sota exp stat in summary page

* remove unused import
2025-08-01 18:55:26 +08:00
Xu Yang ea7483f5a7 feat: add show_hard_limit option and update time limit handling in DataScience settings (#1144) 2025-08-01 18:32:15 +08:00
XianBW d08ce38fb8 bug fix (#1145) 2025-08-01 18:07:19 +08:00
Yuante Li 8c454afd17 fix: fix some bugs in RD-Agent(Q) (#1143)
* fix some bugs in RD-Agent(Q)

* fix factor from report

* fix ci
2025-08-01 13:20:09 +08:00
you-n-g fe9b625091 fix: ignore RuntimeError for shared workspace double recovery (#1140)
* fix: ignore RuntimeError for shared workspace double recovery

* add print
2025-07-31 21:02:37 +08:00
XianBW 692f3006ce use popover instead of expander (#1138) 2025-07-31 18:14:38 +08:00
you-n-g 6b0fae5000 fix: clear ws_ckp after extraction to reduce workspace object size (#1137) 2025-07-31 18:10:32 +08:00
you-n-g 684e41f43a feat: fallback to acceptable results (#1129)
* refactor: add is_acceptable, fallback logic and generify evolving agent

* refine lint

* small

* lint

* lint

* lint

* feat: add is_acceptable to CoSTEERMultiFeedback

* feat: add in-memory workspace checkpoint and recovery

* feat: preserve symbolic links in workspace checkpoints and recovery

* lint

* lint

* feat: limit workspace checkpoint to files under 100KB

* feat: add workspace checkpoint size limit setting

* prompt

* lint
2025-07-31 17:53:18 +08:00
Xu Yang 66659e9de2 fix: remove unused imports in data science scenario module (#1136) 2025-07-31 17:05:14 +08:00
Xu Yang e554b3a680 feat: add time ratio limit for hyperparameter tuning in Kaggle settin… (#1135)
* feat: add time ratio limit for hyperparameter tuning in Kaggle settings and update evaluator logic

* add recommend time limit

* remove 25% hard line

* small fix
2025-07-31 16:47:19 +08:00
Xu Yang 1aa5cc2535 feat: enhance timeout management and knowledge base handling in CoSTEER components (#1130)
* feat: enhance timeout management and knowledge base handling in CoSTEER components

* fix a little bug

* fix small bug

* fix a small bug

* Update rdagent/scenarios/data_science/loop.py

Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>

* add scale check

* fix a small bug

* fix CI

* use dynamic chat_token_limit & remove repeated lines

* fix CI

* remove useless comment

* fix small bug

* update draft appendix

* fix prompt

* add code correctness as top priority

---------

Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>
2025-07-31 13:06:28 +08:00
you-n-g ce25bafbf7 fix: update requirements.txt's streamlit (#1133) 2025-07-30 21:30:53 +08:00
XianBW af7b1f6c4b log time duration when call LLM and show timeout ratio of coding & running in trace UI (#1128) 2025-07-29 17:54:29 +08:00
Xu Yang dd2e06ade6 feat: add coder check and give more time (#1127)
* feat: introduce max_seconds_multiplier for timeout management across components

* avoid using assert in test

* hot fix a very small bug

* runner multiply twice

* revert feedback change

* add a switch to longer timeout
2025-07-29 14:59:38 +08:00
amstrongzyf 53dd98abf4 feat: add hypo_critic and hypo_rewrite in proposal (#1106)
add hypo_critique and hypo_rewrite in proposal.py, controlled by `DS_RD_SETTING.enable_hypo_critique_rewrite` (default True)
2025-07-29 14:20:09 +08:00
Roland Minrui 82011ea444 small fix to runner eval order to prevent both final decision and hyperparameter decision to be true
Co-authored-by: Xu <v-xuminrui@microsoft.com>
2025-07-29 13:31:35 +08:00
XianBW 8790503e8d fix current_selection maybe empty (#1125) 2025-07-29 11:56:59 +08:00
XianBW 60cae0f588 fix find last SOTA diff (#1124) 2025-07-29 10:56:41 +08:00
Linlang 99a3cad9c9 chore: implement runtime_env func (#1104)
* implement runtime_env func for quant

* add runtime_info code

* add runtime env information to the prompt

* format with black

* optimize get_runtime_env code

* delete unnecessary files

* some refinement

* fix fin_quant bugs

---------

Co-authored-by: Xu Yang <peteryang@vip.qq.com>
2025-07-28 14:19:41 +08:00
Roland Minrui b03b070138 fix: fix code diff bug (#1115)
* fix code diff bug

* fix minor bug

* reformat

* fix minor bug

* fix

* fix

* fix the prefix type

---------

Co-authored-by: Xu <v-xuminrui@microsoft.com>
2025-07-26 22:51:59 +08:00
XianBW 3149557351 fix sota_exp is None (#1121) 2025-07-25 11:53:26 +08:00
amstrongzyf b08cb3b7c8 fix a small bug in feedback (#1120) 2025-07-24 22:33:08 +08:00
XianBW d531faab38 add lite curves figure (#1119) 2025-07-24 20:11:09 +08:00
XianBW e63961f00e fix curve (#1118) 2025-07-24 19:15:01 +08:00
XianBW 7a8b11e7b6 chore: some ui features change (#1117)
* add some todos

* fix bug

* fix leaderboard download function

* summary stat fix

* show medal

* show SOTA Loop

* fix CI
2025-07-24 18:50:29 +08:00
Tim 1eb60d9cb7 chore: avoid more traces during merge (#1108)
* avoid more traces during merge

* restore change

* remove duplicate experiments

* add dropped pool

* use scenario

* remove drop_pool

* use max_sota_retrieved_num
2025-07-24 18:27:23 +08:00
Xu Yang 061870a71e feat: analyze feedback based on sota numbers (#1116)
* give sota numbers to feedback

* refine prompt
2025-07-24 14:17:52 +08:00
XianBW 4fc5eb2285 fix cli command type checker (#1114) 2025-07-23 19:43:25 +08:00
Xu Yang 9e0612ec67 fix: prompt yaml (#1112)
* small fix to prompt yaml

* shrink the content

* remove parallel.py
2025-07-23 15:03:59 +08:00
Linlang a7b5141501 fix health check bug (#1111) 2025-07-23 12:29:09 +08:00
Xu Yang 66d07c73f6 feat: enable meta planner (#1103)
* enable meta planner

* fix a small bug

* ADD PLAN TO GEN

* remove ensemble in planner

* fix CI

* fix CI

* fix planner threshold
2025-07-23 12:20:06 +08:00
xuangu-fang 47458d612c feat: new prompt for auto-sota-selector (#1109)
* fix mismmatch typo

* new sota_select_submit prompt

* update

* polish prompt
2025-07-22 21:51:31 +08:00
Tim 7ed3cd1240 chore: show merge loop in figure (#1105) 2025-07-22 17:02:56 +08:00
Tim 2f87089f21 chore: update figure (#1102)
* chore: update figure

* add record id
2025-07-21 18:53:07 +08:00
Tim bbd08460c7 chore: merge enable parallel (#1093)
* chore: merge enable parallel
2025-07-21 14:28:36 +08:00
XianBW 2f48a95d43 chore: add response format in chatbot (#1099)
* add response format in chatbot

* fix CI
2025-07-21 12:19:05 +08:00
you-n-g 8bab00d558 feat: add loop ID mapping to trace nodes and update UI labels (#1098)
* Add loop index

* feat: add loop ID mapping to trace nodes and update UI labels

* lint

* doc lint
2025-07-21 11:02:37 +08:00
you-n-g f603f2b20f feat: add extra_eval config and import_class for custom evaluators (#1097)
* feat: add extra_eval config and import_class for custom evaluators

* lint

* build: update litellm requirement to >=1.73 for get_valid_models

* refactor: remove *args/**kwargs from _create_embedding_inner_function signature
2025-07-20 16:31:43 +08:00
you-n-g 16b552a6e0 fix: use CoSTEERSettings for DSRunnerCoSTEERSettings (#1096)
* refactor: use CoSTEERSettings for DSRunnerCoSTEERSettings

* lint
2025-07-20 10:53:09 +08:00
Linlang cb3064e57d docs: update data science docs (#1015)
* update data science docs part1

* update data science docs part2

* update data science docs part3

* update data science docs part4

* update data science docs part5

* format with isort

* update data science docs part6

* add check environment scripts

* format with isort

* format with isort

* merge env_check to health_check

* format with isort

* format with black

* optimize code

* use boolean cli options

* replace fire with typer

* replace fire with typer

* optimizing parameter and variable naming
2025-07-19 18:35:24 +08:00
Tim 34c0848b6c chore: extend eda output (#1086) 2025-07-18 21:07:43 +08:00
amstrongzyf c44e593ba1 fix: add gpu_info in research phase (#1094) 2025-07-18 21:00:06 +08:00
Xu Yang 4de0a85114 fix: package and timer bug (#1092)
* fix package bug & timer bug

* fix typo
2025-07-18 16:22:57 +08:00
XianBW f40c1b1df5 use enum value when generate hypothesis (#1091) 2025-07-18 16:22:34 +08:00
XianBW 88eed1474f fix ui bugs (#1090) 2025-07-18 16:01:39 +08:00
Xu Yang f99ceb4158 fix: minor fix to runtime_environment (#1089)
* minor fix to funtime_environment

* add python runtime info header
2025-07-17 19:58:06 +08:00
XianBW f113e88461 chore: add a simple chatbot in LLM_LOG window in DataScience UI (#1088)
* refine time show

* updates

* add chatbot in llm_log_win

* use newest litellm
2025-07-17 19:29:25 +08:00
Xu Yang e8c62ab46b feat: query & cache package_info (#1083)
* feat: add package query in draft.py (not yet enabled)

* feat: integrate package query into task_gen and cache runtime environment

- Remove pkg_query modifications from draft components
- Add package declaration requirement in task_gen prompts
- Add optional packages field to CodingSketch model
- Cache runtime_environment in scenario object for loop-wide reuse
- Parse packages from LLM response and generate runtime environment dynamically

* some refinement

* feat: merge default packages with CLI args in package_info.py

* fix: code style

---------

Co-authored-by: Qizheng Li <jenssenlee@163.com>
2025-07-17 18:35:36 +08:00
Tim 105b5791d9 chore: change default setting (#1087)
live_output = True
2025-07-17 17:19:10 +08:00
you-n-g ec1a5e7a88 fix: ignore class types when filtering workflow steps (#1085)
* fix: ignore class types when filtering workflow steps

* chore: add TODO for record method in RDLoop

* lint
2025-07-17 15:50:41 +08:00
amstrongzyf 32ecc61153 fix: refine the prompt to force complete code & refine the logic of running (#1069)
* change refine prompt for full code

* fix: fix the logic of running

* refine prompt

* fix some bugs

* fix

* add two guidelines

* refactor the code

* make costeer evaluator more logical

* refine eval prompt

* make costeer eval prompt markdown

* update code diff prompt

* correct pipeline

* feat: add apply_patch utility and update ret.py with patch functionality (#1071)

* restore to the right version

* fix the docstring

* fix extract_output fcn

* add inplace parameter to apply patch

* remove enable_runner_iteration and make the eval prompt same as main

* refine runner eval prompt based on main

* Update rdagent/scenarios/data_science/dev/runner/prompts.yaml

* add wait_retry

* refactor: move enable_runner_code_diff to DSRunnerCoSTEERSettings as diff_mode

* reformat and remove enable_runner_code_diff

---------

Co-authored-by: yuanteli <1957922024@qq.com>
Co-authored-by: Xu <v-xuminrui@microsoft.com>
Co-authored-by: Jensen Lee <91518020+Jensen246@users.noreply.github.com>
Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>
Co-authored-by: Qizheng Li <jenssenlee@163.com>
2025-07-17 11:59:27 +08:00
Shuo Yin dd259f5302 docs: update docs/installation_and_configuration.rst for Configuration (#1061)
* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update installation_and_configuration.rst

* Update installation_and_configuration.rst

* Update installation_and_configuration.rst

* Update docs/installation_and_configuration.rst

Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>

* Update installation_and_configuration.rst

* Update installation_and_configuration.rst

---------

Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>
2025-07-16 22:20:49 +08:00
Xu Yang fd2c3b0c50 fix: minor conflict in prompts (#1081) 2025-07-16 16:10:56 +08:00
Xu Yang 9897739ad3 fix: align scenario descriptions and include debug timeout (#1079)
* Align scenario descriptions and include debug timeout

- Updated config.py to support debug timeout configuration
- Synchronized prompts in exp_gen and scen modules
- Refactored proposal.py for consistency with new scenario descriptions
- Improved __init__.py for better scenario management

* remove running time in stdout

---------

Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-07-16 14:30:17 +08:00
you-n-g 11c2298958 fix: refine prompt; runner focus on low hanging fruit (#1076)
* fix: refine prompts formatting and logic across data science scenarios

* Make runner evaluator more detailed

* feat: switch to system_debugger prompt and print early stopping stats
2025-07-16 12:29:57 +08:00
you-n-g 0f7f6d176b feat: add enable_cache toggle for UI data caching (#1075) 2025-07-15 22:26:06 +08:00
you-n-g ac55b8bfa1 fix: refine prompt, equal lightgbm, discourage over hypertuning (#1072)
* feat: add mount_path parameter to run command

* feat: add runtime environment info and dynamic timeouts to DS runners
2025-07-15 21:58:19 +08:00
XianBW 07407b770d chore: log LITELLM_SETTINGS when first use (#1074)
* log LITELLM_SETTINGS when first use

* fix ci
2025-07-15 18:41:18 +08:00
XianBW a6acd3d959 fix: filter log folders bug in ui (#1073)
* fix bug

* fix ci
2025-07-15 18:11:48 +08:00
you-n-g 3e6bb27dd1 feat: add ws CLI and support optional timeout/cache (#1066)
* feat: add ws CLI and support optional timeout/cache

* lint

* fix bugs

* convert extra_volumes to dict for multiprocess

* lint
2025-07-12 18:26:45 +08:00
Tim 4c78a601a5 fix: error in prompt template (#1065)
* fix prompt error

* fix prompt error
2025-07-12 09:32:46 +08:00
Yuante Li fa3846df31 refactor: try to convert the DS coder prompt into automaton logic (#1052)
* try to convert the DS coder prompt into automaton logic

* refine

* refine coder

* refine eval

* polish eval

* changes to pipeline_coder_system

* refine eval.py

* merge eval guidelines and steps

* fix a small bug

---------

Co-authored-by: Xu <v-xuminrui@microsoft.com>
Co-authored-by: amstrongzyf <amstrongzyf@126.com>
2025-07-11 21:42:52 +08:00
XianBW 2e1d0624d2 refactor: move selector codes to an independent folder (#1059)
* refactor: move exp_gen selection files into select directory

* fix selector value in data_science conf

* fix selector template name

* fix CI

---------

Co-authored-by: Young <afe.young@gmail.com>
2025-07-11 17:42:40 +08:00
Jensen Lee 33c0362296 fix: correct DS_LOCAL_DATA_PATH error in devcontainer (#1063) 2025-07-11 17:29:21 +08:00
xuangu-fang be9490f417 fix: handle the no-update case of root node in uncommited_rec_status (#1062)
* fix: improve scheduler API (suggest_sel) and add timer.remain_time()

* chore: exclude .venv from auto-black and auto-isort tasks

* refactor: wrap RoundRobinScheduler commit and selection in retry loop

* set search_type="ancestors" for experiment_and_feedback_list_after_init

* fix bug:  no update of uncommited_rec_status with root node

---------

Co-authored-by: Young <afe.young@gmail.com>
2025-07-11 17:13:00 +08:00
you-n-g c1834c634e docs: add Properties code-block for BACKEND setting in docs (#1060) 2025-07-11 16:57:08 +08:00
amstrongzyf 020e39d0d7 docs: update installation methods in readme (#1058) 2025-07-11 16:26:16 +08:00
amstrongzyf e8a45db801 fix: improve the logic of json_schema and refine the reasoning extraction logic for reasoning model (#1044)
* fix: fix a small bug in response_schema

* feat: support response_format parameter in chat completion

* fix: fix between json_mode and response_format

* Update base.py

* Update deprec.py

* add unittest and refine logic

* fix the reasoning extraction logic and refine prompt for deepseek adaptation

* refactor: introduce workflow_check and streamline task parsing

* refine prompt

---------

Co-authored-by: Young <afe.young@gmail.com>
2025-07-11 15:36:03 +08:00
XianBW bd23d1759e add data science ui & grade_summary to rdagent cli (#1057) 2025-07-11 15:30:24 +08:00
Xu Yang f0f5c221bd feat: add sample submission file check (#1053)
* check sample submission & add  package constraint

* add trace.log into clear

* change default

* simplify

* clear CI workspace before running

* move to CI

* use sudo to clean workspace

* move prepare out of global var

---------

Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-07-10 18:10:32 +08:00
you-n-g c28fe11bca docs: add submission grading steps to devcontainer README (#1054)
* docs: add submission grading steps to devcontainer README

* add change

---------

Co-authored-by: jingyuanlm <842442862@qq.com>
2025-07-10 16:48:25 +08:00
Xu Yang 8d5fd9943d fix: path traversal risk (#1050)
* check the target file path is in a designed folder and make sure it's pdf

* Potential fix for code scanning alert no. 55: Uncontrolled data used in path expression

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for code scanning alert no. 56: Uncontrolled data used in path expression

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* continue improving

* Potential fix for code scanning alert no. 62: Uncontrolled data used in path expression

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* apply secure_filename

* Potential fix for code scanning alert no. 64: Uncontrolled data used in path expression

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* fix CI

---------

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-07-10 13:16:14 +08:00
you-n-g 369bd8bc78 feat: add only success filter toggle for traces (#1047) 2025-07-10 12:35:03 +08:00
Roland Minrui a03e0e81c9 fix draft bugs (#1048)
Co-authored-by: Xu <v-xuminrui@microsoft.com>
2025-07-10 11:47:23 +08:00
amstrongzyf 0424cd1baf fix: fix a small bug in response_schema (#1043)
* fix: fix a small bug in response_schema

* black fix
2025-07-09 18:40:48 +08:00
Roland Minrui e5260cb4ac feat: enable drafting with knowledge (#998)
* add pipeline for drafting v2

* fix the pipeline and add general knowledge

* debug

* fix bug

* fix bug

* change draft version1

* add function calling to task gen

* fix circular import bug

* change draft version3

* exp1_test

* feat: add DraftRouterExpGen and make summarizer configurable

* Update rdagent/scenarios/data_science/proposal/exp_gen/proposal.py

* change code structure

* stashed changes

* test

* test1

* revert conf.py

* add runtime enviornment info to general knowledge

* remove redundant code

* clean code

* remove files

* reformat

* fix bug

* fix bug

* simplify code

* fix minor bug

* fix bug and reformat

* revert config

* remove unused prompt

* add general knowledge

* fix ci

---------

Co-authored-by: Xu <v-xuminrui@microsoft.com>
Co-authored-by: jingyuanlm <842442862@qq.com>
Co-authored-by: Young <afe.young@gmail.com>
Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>
2025-07-09 18:36:42 +08:00
you-n-g faadc1312e fix: prevent parallelism in feedback and record steps (#1046) 2025-07-09 18:36:05 +08:00
Yuante Li 1459ec3bac fix: fix a bug in return curve display (#1042)
* fix a bug in return curve display

* fix ci
2025-07-09 15:53:03 +08:00
Xu Yang 21809f2a9d fix: split then sample & remove simple model guide in ds proposal (#1034)
* fix code timeout & split_then_sample

* change- code

* change-prompts_v2

* remove more simple guidance in proposal

---------

Co-authored-by: Xu Yang <xuyang1@microsoft.com>
Co-authored-by: jingyuanlm <842442862@qq.com>
2025-07-09 15:47:37 +08:00
Xu Yang f1d38d5750 fix: stop evolve if global timer is timeout (#1039) 2025-07-09 15:45:25 +08:00
amstrongzyf 7c41fce8b9 fix: fix a small bug in json_mode (#1041) 2025-07-09 14:33:24 +08:00
XianBW 5c7030964b chore: show llm filter calls info, remove redundant remove_timestamp param in Env (#1040)
* show llm calls info

* remove `remove_timestamp` param in Env

* use cache default
2025-07-09 14:20:33 +08:00
Tim 8ee602f178 fix: TypeError: cannot unpack non-iterable bool object (#1036) 2025-07-08 21:25:02 +08:00
you-n-g ed92831712 fix: based on response schema; not function calling (#1038)
* fix: based on response schema; not function calling

* replace all
2025-07-08 21:11:52 +08:00
you-n-g 10c0d0c70a fix: properly assign sota_exp_fb before None comparison (#1037) 2025-07-08 20:31:21 +08:00
you-n-g 061554ef87 refactor: add string validation for feedback attrs and remove unused var (#1035) 2025-07-08 20:24:31 +08:00
XianBW 156549715d ui updates (#1033) 2025-07-08 18:20:27 +08:00
you-n-g 12cf0fb459 fix: scheduler next selection parallel disorder (#1028)
* fix: improve scheduler API (suggest_sel) and add timer.remain_time()

* chore: exclude .venv from auto-black and auto-isort tasks

* refactor: wrap RoundRobinScheduler commit and selection in retry loop

* set search_type="ancestors" for experiment_and_feedback_list_after_init

* refactor: merge sync_dag_parent_and_hist and hist.append into one call

* fix uncommited rec bug

* lint

---------

Co-authored-by: xuangu-fang <xuangufang@gmail.com>
2025-07-08 17:23:05 +08:00
Xu Yang af67910000 fix: remove refine decision & bug fix (#1031)
* remove refine decision & bug fix

* code simpler

* fix CI

---------

Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-07-08 16:34:25 +08:00
Roland Minrui 717f9b9e53 fix: add spec for hyperparameters in task design and coder (#995)
* init commit

* remove the 5-fold spec from prompts

* refine the hyperparameter specification

* do not sample data

* a small spelling issue

* refine prompt to avoid submission cheating

* do not sample data

* simplify code

* refine the coder evaluator prompt

* refine wording

* remove runtime from proposal

* refine wording

* refine prompt

* add gpu info in runtime_info.py

* modify the spec

* add router and add refinement exp gen

* fix prompt bug

* use rule-based logic for router

* complete the prompt

* fix circular import bug

* fix bug

* make refine_decision optional

* update pipeline prompts: (1) add scenary: in an iterative cooding loop and use sample datasets (2)add some generation tops in coding (3)add evaluation guidelines in evaluation (4)polish the json schema and description

* fix a small bug

* fix a small bug

* rdagent/scenarios/data_science/loop.py back to the original version

* refactor: replace _get_exp_gen with default_exp_gen for exp generation

* import

* refactor: make the __init__ back to main

* fix small bugs

* fix bugs for proposal_version

* move refine into runner

* check early stop

* EDA improvement & coder classes number

* fix CI

* slightly refine the prompt

* remove rule_base_eval and remove useless prompt

---------

Co-authored-by: Xu <v-xuminrui@microsoft.com>
Co-authored-by: TPLin22 <tplin2@163.com>
Co-authored-by: amstrongzyf <amstrongzyf@126.com>
Co-authored-by: Xu Yang <peteryang@vip.qq.com>
Co-authored-by: Xu Yang <xuyang1@microsoft.com>
Co-authored-by: Young <afe.young@gmail.com>
2025-07-08 15:22:39 +08:00
you-n-g 11be3a480b chore: release 0.7.0
Release-As: 0.7.0
2025-07-08 11:19:08 +08:00
Linlang a7cc6fa5f1 add dependence (#1029) 2025-07-08 11:12:44 +08:00
Tim ed086dcec4 feat: merge code summary and support more traces (#1025)
* merge with code_change_summary

* fix: prevent max_sota_retrieved_num_per_trace from becoming zero

* select sota from more than 2 traces
2025-07-08 10:00:52 +08:00
Yuante Li b05c2cba09 fix: fix some bugs in quant scen (#1026)
* fix some  bugs

* fix ci

* fix

* refine

* fix ci
2025-07-07 19:21:05 +08:00
you-n-g f71a005d55 refactor: privatize remain_time_duration and use remain_time() (#1027) 2025-07-07 18:52:17 +08:00
Tim a0015c1511 chore: sort trace by loop_id (#977)
* last as sota to submit

* chore: sort trace by loop_id

* Update rdagent/log/ui/utils.py

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* reformat

* update _log_path_hash_func

* compare sota_exp_to_submit

* fix ui storage

* move sota_exp_to_submit setting to record(from direct_exp_gen)

* save sota_exp_to_submit

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Bowen Xian <xianbowen@outlook.com>
2025-07-07 17:08:55 +08:00
amstrongzyf ea86b537eb fix: support experimental support for Deepseek models and update docs about configuration (#1024)
* fix qlib running bug for deepseek and add configuration docs about deepseek
2025-07-07 14:18:56 +08:00
Tim 4bf16d03cf chore: restore parameter timeout in loop (#1022)
* restore parameter timeout in loop
2025-07-05 14:55:26 +08:00
you-n-g 6dbef13837 chore: document APIBackend parameters and remove sparse dep (#1019) 2025-07-04 20:31:06 +08:00
XianBW eff5dcc879 add trace DAG in trace, make exp show compatible with old versions (#1018) 2025-07-04 15:47:45 +08:00
Xu Yang 4608a0c63e feat: try coder on whole data (#1017)
* commit all code

* fix feedback bug

* add debug mode in ds

* update prompt

* prioritize performance than time lit

* use run instead

* store running time

* move all data running into running phase

* fix a bug

* use sample data as default

---------

Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-07-04 14:30:40 +08:00
XianBW 6e57d0adc4 chore: ui server updates (#951)
* ui server update

* update

* fix bugs

* updates

* use randomname

* fix

* fix bugs

* change time interval in debug server

* some change

* fix CI

* time interval change

* updates

* some changes

* fix

* fix curves

* one IP, one pointers to show msgs return progress

* enable /control

* fix bugs

* fix CI

* fix isort
2025-07-04 12:32:14 +08:00
XianBW 76660b1ace feat: show first evo round codes diff (#1009)
* log settings

* add first diff in evolving

* save dict settings

* load settings in data science ui
2025-07-03 19:21:14 +08:00
you-n-g 05bb19ad4b docs: add README for exp_gen folder structure proposal (#1010)
* docs: add README for exp_gen folder structure proposal

* docs: update README with tool strategy and adjust folder structure

* docs: rename 'Tool strategy' section to 'Tools' in exp_gen README
2025-07-03 11:31:51 +08:00
you-n-g 7a7f865733 refactor: replace run_ret_code with run and adjust helper methods (#1013) 2025-07-03 11:24:05 +08:00
Yuante Li 92bb49fc8f fix: fix a minor bug in DS eval (#1012) 2025-07-02 23:31:29 +08:00
you-n-g a67ec5ba01 chore: add devcontainer Dockerfile, devcontainer.json, and env (#997)
* chore: add devcontainer Dockerfile, devcontainer.json, and env

* style: remove unnecessary comment on ENABLE_CACHE setting

* docs: add internal devcontainer README with setup instructions

* Update README in .devcontainer based on PR #997

---------

Co-authored-by: jingyuanlm <842442862@qq.com>
2025-07-02 18:54:49 +08:00
Tim c4007b4655 chore: sample data map (#1005)
* chore: map data sampler
2025-07-02 15:11:57 +08:00
Yuante Li 3d227787e8 feat: added running time statistics for the DS scenario experiment (#1007)
* added running time statistics for the DS scenario experiment

* update execute_ret_code to return running_time

* fix

* fix

* update describe

* add EnvResult

* update corresponding calls

* add RunningInfo class

* fix

* fix

* fix

* fix ci

* rename function name

* fix ci

* fix

* refine running_time logic

* fix ci
2025-07-02 15:11:18 +08:00
XianBW 92ce8a898b add code diff in evolving window (#1008) 2025-06-30 20:10:34 +08:00
you-n-g 55f7ccc93d feat: add hide_base_name option and update data folder prompts (#1004)
* feat: add hide_base_name option and update data folder prompts

* rename folder
2025-06-29 21:22:16 +08:00
you-n-g 49aec3135e feat: add code change summary (#1000)
* feat: add code change summary and dict_get_with_warning util

* feat: support code_change_summary in feedback classes

* lint

* feat: validate response_format using BaseModel and warn unknown formats
2025-06-29 13:40:15 +08:00
amstrongzyf 69500fc52d refactor: convert data describe functions to class-based implementation and add output example (#999)
* feat: Enhance data folder description for clarity and robustness

* fix bug

* fix present bugs

* delete useless files

* add output example and refactor the hole util.py

* fix bug for file tree

* add corner case example

* delete useless file
2025-06-28 21:23:40 +08:00
you-n-g d89fb2a82e chore: release 0.6.1
Release-As: 0.6.1
2025-06-28 20:06:57 +08:00
Linlang 976b86664f fix: fix mount (#1001)
* docs: document extra_volumes dict format in DockerConf

* feat: accept dict values in extra_volumes to specify bind and mode

* fix: skip invalid PDF reports to prevent infinite loop

* from break to raise self.LoopTerminationError

* format with black

---------

Co-authored-by: Young <afe.young@gmail.com>
2025-06-28 20:01:14 +08:00
xuangu-fang 05b584b184 fix: handle the bug of wrong dag_parant index (#996)
* fix the dag_parant_index bug caused by the wrong calling order of

* auto-lint
2025-06-27 17:01:29 +08:00
Yuante Li c701a8105b fix: improve log folder sorting and selection UX (#993)
* fix ui

* update
2025-06-27 11:38:05 +08:00
you-n-g f075824a16 chore: release 0.6.0
Release-As: 0.6.0
2025-06-26 22:32:15 +08:00
you-n-g 5c5508c8cc fix: add async to direct_exp_gen avoid infinite loop (#992)
* refactor: convert direct_exp_gen to async and enforce parallel limit

* fix bug

* change coroutine function position

* fix fin_quant's direct_exp_gen

* format with isort

---------

Co-authored-by: Bowen Xian <xianbowen@outlook.com>
Co-authored-by: SunsetWolf <Lv.Linlang@hotmail.com>
2025-06-26 22:10:52 +08:00
xuangu-fang a5c5c7172b feat: async mechanism for multi-trace (#981)
* start to work on multi-trace + async

* init ver of async-multi-tarce, to test

* add eng-ver log

* complete version of async+ mul-trace

* debug

* fix bug on         DS_RD_SETTING.get()

* update

* fix bug + simplif the usage of async in multi-trace

* fix mini bug of arg_name

* Move local_selection into class Experiment & clean the code
2025-06-26 15:49:47 +08:00
you-n-g 58b5cc1458 fix: refine prompt (#987)
* refactor: rename failed_exp_and_feedback_list to include _after_sota suffix

* refactor: merge prompts_v3 into prompts_v2 and update references
2025-06-26 12:08:31 +08:00
Xu Yang 80d81c8ea9 support tar in dataset & fix a small bug in loop (#986)
Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-06-25 15:32:37 +08:00
XianBW 1b762ceddd fix LLM log bug (#985) 2025-06-25 10:38:20 +08:00
Tim ed84b6b0a3 chore: merge with more trace (#982)
* merge support more traces
* use feedback from all traces
2025-06-24 10:47:45 +08:00
you-n-g 46367e15f5 fix: refine details (#979)
* feat: add parquet preview and extract common DataFrame preview logic

* refactor: improve error messages, prompts, regex, and session loading

* lint
2025-06-23 10:38:27 +08:00
Yuante Li 0859b9f3a2 fix: fix a bug and update the docs (#978) 2025-06-20 10:58:14 +08:00
Copilot e03fca3206 fix: docker container cleanup to prevent accumulation and system slowdown (#975)
* Initial plan for issue

* Fix Docker container cleanup issue by using try-finally block

Co-authored-by: peteryang1 <25981102+peteryang1@users.noreply.github.com>

* Fix additional Docker container leaks in health_check and GPU test functions

Co-authored-by: peteryang1 <25981102+peteryang1@users.noreply.github.com>

* Remove temporary test files and finalize Docker container cleanup fix

Co-authored-by: peteryang1 <25981102+peteryang1@users.noreply.github.com>

* Refactor container cleanup code to reduce duplication as requested in review feedback

Co-authored-by: peteryang1 <25981102+peteryang1@users.noreply.github.com>

* Refactor container cleanup to use shared function and always stop before remove

Co-authored-by: peteryang1 <25981102+peteryang1@users.noreply.github.com>

* fix CI

* Fix mypy type checking errors for Docker container cleanup

Co-authored-by: peteryang1 <25981102+peteryang1@users.noreply.github.com>

* fix CI

* Remove unnecessary _cleanup_container wrapper method in DockerEnv class

Co-authored-by: peteryang1 <25981102+peteryang1@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: peteryang1 <25981102+peteryang1@users.noreply.github.com>
Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-06-19 18:32:50 +08:00
Xu Yang 977136f1f3 fix: merge datascience v3 and v2 (#974)
* add coder version

* merge cooder and feedback prompts

* align v2 and v3 proposal prompts

* fix a small bug

* fix a bug

* fix another bug

* support both function calling and json mode in v2 proposal

* fix minor bug

* reformat

* remove proposal v3

* fix a small bug in json mode

* fix CI

* remove tmp file

* remove v3 check

---------

Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-06-19 13:25:10 +08:00
you-n-g bf9efe127d chore: release 0.5.0
Release-As: 0.5.0
2025-06-18 15:08:11 +08:00
Yuante Li 243d5259f7 docs: update readme for v0.5.0 release (#973) 2025-06-18 14:49:24 +08:00
Linlang dd10ddf9fd fix: main bug (#938)
* feat: parameterize cache paths with USER to avoid conflicts

* guide for missing training_hyperparameters

* guidance for  KeyError: 'concise_reason'

* fixed three bugs in the test

* fix general_model task bug

* fixed some bugs in the med_model scenario

* delete comments

* format with black

* fix mypy error

* fix ruff error

* fix isort error

* sync code

* revert cache_path code

* revert cache_path code

* delete data mining scenario

* fix factor report loop

* fix LiteLLMAPIBackend log_llm_chat_content setting

* refine fin factor report scenario

* remove unused LogColors

* fix UI

* remove medical scenario docs

* change **kaggle** to **data_science**

* remove default dataset_path in create_debug_data

* remove KAGGLE_SETTINGS in kaggle_crawler

* limit litellm versions

* reformat with black

* change README

* fix_data_science_docs

* make hypothesis observations string

* Hiding old versions of kaggle docs

* hidding kaggle agent docs

---------

Co-authored-by: Young <afe.young@gmail.com>
Co-authored-by: Bowen Xian <xianbowen@outlook.com>
Co-authored-by: yuanteli <1957922024@qq.com>
2025-06-18 14:35:45 +08:00
Yuante Li a619ff999b refactor: refactor RD-Agent(Q) configuration files (#972)
* refactor rdagent(q) conf files

* fix

* fix ci
2025-06-18 12:28:29 +08:00
Tim c215e735c2 fix: use simple stdout and stderr (#966)
* use simple stdout and stderr
* add live_output config in LocalConf
2025-06-18 11:54:27 +08:00
Yuante Li 0c219b81e0 docs: update the documentation for custom dataset (#969) 2025-06-18 10:58:28 +08:00
Tim 9f793d58b3 fix: get_metric_direction for aerial-cactus-identification (#970) 2025-06-17 18:06:38 +08:00
Yuante Li f0deace7a7 docs: add readme for custom data in R&D Agent DS scenario (#968) 2025-06-17 16:29:07 +08:00
Tim 682f657637 chore: break when loop_n runs out (#964)
* raise loop termination in execute_loop

* add SENTINEL
2025-06-17 15:46:38 +08:00
Yuante Li af5898211b refactor: add custom data setting for data science scene (#967)
* add custom data setting for the data science scene

* fix ci?

* fix ci

* add custom data as an example

* fix ci

* add package

* fix test_import ci error
2025-06-17 14:55:11 +08:00
XianBW 1a1e88c47c fix: log info (#965)
* fix log caller_info

* make env info beauty
2025-06-16 19:52:44 +08:00
amstrongzyf 9890bb4b00 docs: update explanation for separate config use in litellm (#958)
* docs: update explanation for separate config use in litellm

* docs: update default backend to `rdagent.oai.backend.LiteLLMAPIBackend`

* docs: update .rst format

* Update installation_and_configuration.rst
2025-06-13 18:32:39 +08:00
XianBW 5a3a2bf2be chore: remove redundant tag in old scenarios (#917)
* remove state.times in old ui

* remove "r" tag

* remove "d" tag

* remove "ef" tag

* remove "init" tag

* fix CI

* remove old tag in app UI

* fix bugs

* fix CI

* some updates

* filter tags
2025-06-13 17:49:58 +08:00
you-n-g 77e9f186d5 fix: add missing semicolon after chmod in env shell command (#955) 2025-06-12 21:02:07 +08:00
you-n-g 2187081905 feat: replace hard-coded cache paths with dynamic cache_path config (#952)
* feat: replace hard-coded cache paths with dynamic cache_path config

* style: reorder wait_retry import and format chmod list

* refactor: pass workspace_path to chmod command and use DockerConf check
2025-06-12 17:44:31 +08:00
Xu Yang 698f89e07c print out the qlib data generation error message to help user find the problem (#954)
Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-06-12 17:34:51 +08:00
you-n-g 304d3fad2e feat: parallel loop running based on asyncio (#932)
* refactor: split workflow into pkg, add WorkflowTracker & wait_retry

* feat: add async LoopBase with parallel workers and step semaphores

* fix: replace pickle with dill and run blocking tasks via joblib wrapper

* feat: add log format settings, dynamic parallelism & pickle-based snapshot

* fix: default step semaphore to 1 and avoid subprocess when single worker

* merge bowen's changes

* merge tim's changes

* refactor: extract component task mapping, add conditional logger setup

* lint

* refactor: add type hints and safer remain_time metric logging in workflow

* lint

* fix: allow BadRequestError to be pickled via custom copyreg reducer

* fix: stop loop when LoopTerminationError is raised in LoopBase

* lint

* refactor: make log tag context-local using ContextVar for thread safety

* feat: add subproc_step flag and helper to decide subprocess execution

* fix: use ./cache path and normalize relative volume bind paths

* fix: reset loop_idx to 0 on loop restart/resume to ensure correct flow

* fix: avoid chmod on cache and input dirs in Env timeout wrapper

* fix: skip chmod on 'cache' and 'input' dirs using find -prune

* fix: restrict chmod to immediate mount dirs excluding cache/input

* fix: chmod cache and input dirs alongside their contents after entry run

* fix: guard chmod with directory checks for cache and input

* fix: prefix mount_path in chmod command for cache/input dirs

* fix: drop quotes from find exclude patterns to ensure chmod executes

* fix: skip chmod on cache/input directories to avoid warning spam

* feat: support string volume mappings and poll subprocess stdout/stderr

* support remove symbolic link

* test: use dynamic home path and code volume in LocalEnv local_simple

* fix: skip trace and progress update when loop step is withdrawn

* refactor: add clean_workspace util and non-destructive workspace backup

* fix: preserve symlinks when backing up workspace with copytree

* fix: prevent AttributeError when _pbar not yet initialized in LoopBase

* perf: replace shutil.copytree with rsync for faster workspace backup

* fix: cast log directory Path to str in tar command of data science loop

* fix: use portable 'cp -r -P' instead of rsync for workspace backup

* fix: add retry and logging to workspace backup for robustness

* refactor: extract backup_folder helper and reuse in DataScienceRDLoop

* fix: propagate backup errors & default _pbar getattr to avoid error

* fix the division by zero bug

* refactor: execute RD loops via asyncio.run and add necessary imports

* lint

* lint

* lint

---------

Co-authored-by: Xu <v-xuminrui@microsoft.com>
2025-06-12 11:44:14 +08:00
xuangu-fang ba76063069 feat: enable to set different version of idea-proposal for multi traces (#895)
* fix the logic of kb-inject, allow different verion

* set more flexiable proposal-version change for multi-tarce

* auto-lint

* fix the divede-zero-bug in a trival way

* keep the dump imp. first, update in next version

* use get_sub_trace_count() to get trace_num_count

* fix the conern case bug of divide-zero

* update corner case

* fix the bug

* auto-lint

* fis the bug

* fix the logic bug in max_sota_filter

* fix bug of old version of self.exp_gen.gen

* update the reset_exp_gen_version

* use get_parent_exps to replace all  collect_all_ancestors

* auto lint

* fix the bug of reset_exp_gen_version

* fix bug: update V3's old hypothesis_rank

* trival patch on gap of V3 & V2

* make dump patch to unify proposal_V3's dentify_problems

* auto-lint

* fix the bug of sub_trace_count
2025-06-11 23:13:30 +08:00
Haoran Pan d18271275e docs: update llm setting guidance and "REASONING_THINK_RM" description (#943)
* update llm setting guidance and "REASONING_THINK_RM" description

* remove deprecated backend in readme
2025-06-11 15:45:22 +08:00
Tim a4986c415c fix: 'DSProposalV2ExpGen' object has no attribute 'COMPONENT_TASK_MAP… (#950)
* fix: 'DSProposalV2ExpGen' object has no attribute 'COMPONENT_TASK_MAPPING'
* chore: add get_component function
2025-06-09 21:49:46 +08:00
Jensen Lee 155675d4bf fix: filter system metadata dirs and init missing DSTrace attribute (#946)
* fix: filter system metadata dirs and init missing DSTrace attribute

* style:pre-commit
2025-06-07 19:44:23 +08:00
you-n-g 15e3ba9004 docs: Update README.md (#948) 2025-06-07 15:24:25 +08:00
Yuante Li 671771a626 docs: update document for RD-Agent(Q) (#940) 2025-06-07 14:41:02 +08:00
Tim 63ba3296dd chore: continue to read output (#945) 2025-06-07 13:22:56 +08:00
Linlang 805f337fc4 chore: add a rdagent server with UI & logger storage refinement(#553)
* change_log_object

* lint code

* delete comments

* change_log_object

* change_log_object

* fix import test error

* update code

* update code

* fix bugs

* skip mypy error

* skip mypy error

* skip mypy error

* Start the flask server before running the demo.

* achieve front and back interaction

* fix github-advanced-security comments

* fix github-advanced-security comments

* tmp ignore

* fix CI

* move some logic

* change format

* adjust logic

* log2json changes

* tmp

* fix

* fix bug

* refine log2json between 5 scenarios

* fix

* refine codes

* fix logic

* use localhost

* add loop & all_duration param for old scenario startup

* merge control logic

* add README for server ui api

* update README

* reuse code in logger

* add loop_n and all_duration param

* fix upload

* ui server now use port in setting

* fix port setting

* fix port setting

* fix mypy check

* refine logger and log storage

* fix ruff error

* fix CI

* refine logger, loop, storage

* bind one FileStorage with one logger

* not truncate log storage

* refine LoopBase.load(), use `checkout` instead of `output_path` and `do_truncate`

* clear session folder when loading loop to run

* move component info init step to ExpGen Class

* Update rdagent/utils/workflow.py

* move truncate_session function to LoopBase class

* add checkout param for other scenarios

* fix bug

* move WebStorage to UI

* change web_storage name

* add randomname to requirements

* add typer

* fix requirements

---------

Co-authored-by: WinstonLiyte <1957922024@qq.com>
Co-authored-by: Bowen Xian <xianbowen@outlook.com>
Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>
2025-06-06 18:52:19 +08:00
you-n-g bdaa376569 chore: update load add & (#944) 2025-06-06 16:58:09 +08:00
Haoran Pan de6b7f7648 feat: update prompt to improve json respond format of some LLM models (#928)
* update prompt to improve json respond format of some LLM models

* fix

* fix

---------

Co-authored-by: WinstonLiyte <1957922024@qq.com>
2025-06-06 11:49:40 +08:00
Tim 5bb5722921 fix: conda error information (#941)
* test with conda error

* reformat
2025-06-06 11:45:48 +08:00
XianBW 1a61d51fa8 change qlib install method (#937) 2025-06-05 11:40:46 +08:00
XianBW 2b7e0c4bd0 refine debug window logic (#936) 2025-06-05 11:29:37 +08:00
XianBW 311c2bf977 fix detect scenario logic (#935) 2025-06-05 11:19:09 +08:00
XianBW 50702e254e some update (#934) 2025-06-05 10:56:54 +08:00
Tim 543fb2c1ef fix: ds trace (#929)
* fix: remove_ansi_codes
* chore: rename function
2025-06-04 18:30:29 +08:00
Tim 51a5247285 feat: merge selectively (#888)
* chore: avoid incorporate changes
best as sota
merge hypothesis
fix: max_retrieve_num after decision
chore: select last experiments and feedbacks
* add the set_current_selection before the exp_gen when merging
add trace.NEW_ROOT
fix: no scen_prob_multiplier
fix: use regex with timeout
chore: hypothesis_rank with selected_idx
chore: define is_parent in proposal
chore: rename collect_all_ancestors to get_parent_exps
---------

Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>
Co-authored-by: Young <afe.young@gmail.com>
Co-authored-by: Xu <v-xuminrui@microsoft.com>
Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-06-04 14:46:47 +08:00
you-n-g a1843a9c4e feat: log reaching max time limit before breaking CoSTEER evolution (#921) 2025-06-03 12:51:56 +08:00
Yuante Li b1029cbd5a docs: update README for RD-Agent(Q) (#913) 2025-05-30 12:28:52 +08:00
you-n-g 0611a0846a fix: default cost to NaN when calculation fails in LiteLLM backend (#912)
* fix: default cost to NaN when calculation fails in LiteLLM backend

* lint

* lint
2025-05-29 22:58:29 +08:00
you-n-g 4974277f1c feat: add last_exp_fb to DSTrace and update feedback retrieval usage (#910)
* feat: add last_exp_fb to DSTrace and update feedback retrieval usage

* fix: use trace.last_exp_fb for previous trial feedback description
2025-05-29 20:32:06 +08:00
Tim a7c6fca8b4 chore: withdraw for policy error (#907)
* chore: withdraw for policy error

Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>

* Apply suggestions from code review
2025-05-29 17:23:06 +08:00
Tim 1091d5ea29 fix: use trace count as index (#909) 2025-05-29 16:52:37 +08:00
XianBW 63ebdb5ada fix loop_num calc logic (#911) 2025-05-29 16:40:57 +08:00
Yuante Li d6ce70b551 feat: add RD-Agent-Quant scenario (#838)
* fix model input shape bug and costeer_model bug

* fix a bug

* fix a bug in docker result extraction

* a system-level optimization

* add a filter of stdout

* update

* add stdout to model

* model training_hyperparameters update

* quant scenario

* update some quant settings

* llm choose action

* Thompson Sampling Bandit for action choosing

* refine both scens

* add trace messages for quant scen

* fix some bugs

* fix some bugs

* update

* update

* update

* fix

* fix

* fix

* update for merge

* fix ci

* fix some bugs

* fix ci

* fix ci

* fix ci

* fix ci

* refactor

* default qlib4rdagent local env downloading

* fix ci

* fix ci

* fix a bug

* fix ci

* fix: align all prompts on template (#908)

* use template to render all prompts

* fix CI

---------

Co-authored-by: Xu Yang <xuyang1@microsoft.com>

* add fin_quant in cli

* fix a bug

* fix ci

* fix some bugs

* refactor

* remove the columns in hypothesis if no value generated in this column

* fix a bug

* fix ci

* fix conda env

* add qlib gitignore

* remove existed qlib folder & install torch in qlib conda

* fix workspace ui in feedback

* align model config in coder and runner in docker or conda

* fix CI

* fix CI

---------

Co-authored-by: Xu Yang <peteryang@vip.qq.com>
Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-05-29 16:16:51 +08:00
Haoran Pan 628deade72 feat: enhance compatibility with more LLM models (#905)
* add try-except to avoid retry when using completion_cost

* feat: add JSON prompt injection and think tag removal handling

* refactor: simplify cost handling in LiteLLM backend and clean up style

* docs: clarify purpose of reasoning_think_rm in LLMSettings

* refactor: remove unused *args and redundant cost assignment

---------

Co-authored-by: Young <afe.young@gmail.com>
2025-05-29 15:21:34 +08:00
Roland Minrui 29c245c6e3 fix: fix the problems weights bug (#898)
* fix the problems weights bug

* refactor: remove DSExpGen

* update problems weights calculation

* update problems weights calculation

* remove the selection parameter from exp_gen

* v2 support draft

* v3 also support decomposition

* make the identify_problems an independent function

* fix minor bug

* reformat

* rename exp_num to weighted_exp_num

* add the set_current_selection before the exp_gen when merging

* reformat

* fix wrong selection

* refactor: drop selection arg from ExpGen.gen and DS merge generators

---------

Co-authored-by: Xu <v-xuminrui@microsoft.com>
Co-authored-by: Young <afe.young@gmail.com>
Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-05-28 11:14:37 +08:00
amstrongzyf 2e39700eeb docs: add docstring for confusing columns in logs dir (#902)
* Docs updated

docs: add docstring for confusing columns in ds-summary

* update

* update black format
2025-05-27 20:54:32 +08:00
Roland Minrui 370adbfa1e fix: refine feedback prompt (#901)
* feedback observation must base on evidence

* avoid too strong constrain

---------

Co-authored-by: Xu <v-xuminrui@microsoft.com>
2025-05-27 19:41:23 +08:00
Tim dbaf70ce57 chore: add kill after for timeout (#899) 2025-05-27 12:02:22 +08:00
Haoran Pan 3c6f9ef76d docs: update guidance for running mle-bench (#896)
* update guidance for running mle-bench

* ci issue

* Update guidance for setting kaggle api
2025-05-26 17:43:43 +08:00
XianBW 0109b044a0 add select_best param for log.ui.utils.compare tool function (#897) 2025-05-23 18:32:31 +08:00
Yuante Li 5a62b47e95 fix: fix the bug in the regular expression matching for stdout (#890) 2025-05-23 14:13:31 +08:00
Tim 5b47c0ab5c feat: raise policy violation (#894) 2025-05-22 16:54:34 +08:00
xuangu-fang 3e60749f70 fix: fix the bug of Exceed-LLM-Context in online merge of multi-tarce (#892)
* set constrains on max_sota_retrieved, fix logis on identical problem

* fix: only Auto SOTA selector use max_sota_retrieved_num

* set max_sota_retrieved_num=10 by default

* minor update

* auto lint
2025-05-22 16:10:00 +08:00
you-n-g cfa5f382aa docs: update paper report (#893)
* doc: update paper report

* Update README.md

* Update README.md

* Update README.md
2025-05-22 15:37:34 +08:00
Yuge Zhang 9ea44be5f8 feat: new proposal (structured outputs) prompts (#887)
* some initial modifications

* first prompt

* refine prompts

* isolate to v3 exp gen

* Revert prompts

* Add hypothesis

* task gen prompt

* minor updates

* minor updates

* update proposal

* Move the pydantic schema upfront to avoid loading error

* Update first prompts

* New prompt

* Update prompt

* Update data folder

* .

* Revert changes

* support v3 in pipeline and feedback

* sort imports

* black format

* Update rdagent/scenarios/data_science/dev/prompts.yaml

Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>

---------

Co-authored-by: Xu Yang <peteryang@vip.qq.com>
Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>
2025-05-22 15:08:33 +08:00
XianBW 37e9912ac0 chore: organize the tool functions related to trace and summary (#889)
* provide get metric direction in kaggle_crawler.py

* move utils function

* move statistics logic

* fix CI

* fix CI

* fix CI

* fix CI

* move some tool functions

* fix CI

* move curves win

* add compare tool

* change function name

* fix CI
2025-05-21 17:20:31 +08:00
xuangu-fang bc9cee49ba feat: multi-trace online merge (#886)
* prompt: highlight overfitting rist in AutoSOTAexpSelector

* set online merge time in conf

* online multi-trace merge with time-limit policy

* fix typo

* feat: allow soft-knowledge-base + multi_trace

* fix: improve file tree and _walk symlink handling (#877)

* refactor: improve file tree and _walk symlink handling

* remove unused code

* lint

* prompt: highlight overfitting rist in AutoSOTAexpSelector

* set online merge time in conf

* online multi-trace merge with time-limit policy

* fix typo

* feat: allow soft-knowledge-base + multi_trace

* auto-lint

* put the multi-trace related config together

---------

Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>
2025-05-19 17:59:42 +08:00
Linlang 763dff1596 fix mypy check dependence error (#885) 2025-05-18 15:15:32 +08:00
XianBW fe11ee92e6 chore: ui bug fix (#884)
* bug fix

* bug fix

* test ci

* bug fix

* ci fix

* ci fix
2025-05-18 11:08:41 +08:00
XianBW 2c11752a54 chore: log storage refine (#883)
* log storage change

* fix bug

* fix ci
2025-05-16 18:29:59 +08:00
you-n-g 7aea9a27dc fix: use fallback messages for missing submission and scores files (#882) 2025-05-16 14:39:47 +08:00
Linlang 0c97fe4ae7 update_QR_code_url (#881) 2025-05-16 14:13:40 +08:00
you-n-g 586349af36 fix: update DS env setup with competition volume and timeout (#878)
* refactor: update DS env setup with competition volume and timeout

* refactor: update volume mapping and timeout based on run type
2025-05-16 02:05:15 +08:00
you-n-g 5b3f5f66cf fix: improve file tree and _walk symlink handling (#877)
* refactor: improve file tree and _walk symlink handling

* remove unused code

* lint
2025-05-16 00:11:25 +08:00
Xu Yang 69e5c3a7de doc: small typo in README (#876) 2025-05-15 21:40:39 +08:00
cslwqxx b76abe839b Update README.md (#875) 2025-05-15 21:32:20 +08:00
Xu Yang c8c8e26812 add multi trace results (#873)
Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-05-15 20:29:52 +08:00
XianBW 42ea6f106b fix debug_tpl and debug_llm saving method(#874) 2025-05-15 18:37:51 +08:00
you-n-g 7742a9e759 docs: update README.md (#871) 2025-05-14 11:32:23 +08:00
you-n-g 8acd24a016 chore: news MLE-bench release (#870)
* docs: add MLE-bench details to README

* docs: update README with revised MLE-bench description and leaderboard

* docs: update RD-Agent text and add trial info in README

* Update README.md

* Update README.md

* update by M

* update format

* Add documents

* docs: update RD-Agent references to R&D-Agent

* docs: update README with MLE-Bench complexity level details
2025-05-14 11:21:13 +08:00
you-n-g 54465d6e82 feat: add competition level filter and extract constants to utils (#869)
* feat: add competition level filter and extract constants to utils

* lint
2025-05-12 21:56:57 +08:00
Roland Minrui 90f6c94d3e fix coder bug (#868)
Co-authored-by: Xu <v-xuminrui@microsoft.com>
2025-05-12 17:20:26 +08:00
Tim 7f4e5096e8 chore: custom data refine (#864)
* chore: print up to 100 columns in simple mode

* fix: check content for model dump

* chore: add show_nan_columns config
2025-05-10 17:02:12 +08:00
you-n-g a294bc74e0 feat: truncate by time (#863)
* refactor: move session file lookup logic to folder utils module

* print more info

* lint
2025-05-10 00:42:59 +08:00
xuangu-fang e71d8f6c3c feat: advanced checkpoint selectors (#790)
* rebase selection code

* bug-free run: checkpoint selection and dynamic EDA loading

* add prototypes of various selectors, to imp. and test later

* fix EDA write bug

* imp SOTA-Jump policy

* fix small bug

* allow to set different selector by .env

* add always-win selector

* add init length for AlwaysWinCKPSelector

* add back_jump selector

* auto lint

* add sota_exp_to_submit attribute; change the name of ckp_selector and sota-selector

* fix bug

* auto lint

* working on auto sota selector

* add subtrace counter

* fix bug, remove unuse selector

* add auto sota selector

* auto lint

* fix bug

* fix small logic bug

* add logging

* add inject_diverse feat

* auto lint

* capable to None-select

* feat: add hypothesis_gen config and ExpGen2TraceAndMerge functionality

* refactor: use dynamic import for experiment generator instantiation

* feat: add BestValidSelector for improved SOTA experiment selection

* runnable twin-trace version

* fix logic error of trace-merge

* auto lint

* use import_class to set selector,

* auto-lint

---------

Co-authored-by: Young <afe.young@gmail.com>
2025-05-09 15:38:25 +08:00
Xu Yang 5c7cdf298c fix: typo in workflow (#861) 2025-05-09 13:29:36 +08:00
Xu Yang 8a0a0fa3c4 feat: log api status to mlflow (#860)
* log api status to mlflow to frontend tracking

* fix CI

---------

Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-05-09 12:20:49 +08:00
Xu Yang 69c630e983 make timeout fail a hyper parameter (#859)
Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-05-08 21:30:44 +08:00
XianBW ad12fccb61 change method of cut log trace (#858) 2025-05-08 21:07:33 +08:00
Roland Minrui 9986b5f9ce fix: refine the time/memory constraints prompt in hypothesis proposal (#856)
* refine prompt

* refine the wording

* add ratelimit retry to align with the suggested wait seconds

* add max retry to 0

* don't delete hist

---------

Co-authored-by: Xu <v-xuminrui@microsoft.com>
Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-05-08 21:05:07 +08:00
Linlang eb1cefb202 fix: fixed CI execution failures caused by document builds (#857)
* fixed CI execution failures caused by document builds

* add comments
2025-05-08 20:35:13 +08:00
XianBW 4f5cce0607 add cache for summary, remove workspace dependency when generate summary (#854) 2025-05-08 12:24:48 +08:00
you-n-g 495063c385 fix: adjust ds_trace lookup and add stderr redirect to mlebench command (#853)
* fix: adjust ds_trace lookup and add stderr redirect to mlebench command

* style: reformat SOTA experiment lookup in ds_trace.py

* feat: add DS_RD_SETTING pipeline to MergeExpGen success message
2025-05-08 02:40:49 +08:00
Xu Yang 318acb4922 fix: trace list but (#852) 2025-05-07 21:28:24 +08:00
XianBW 8340ab5d09 add aide.py (#851) 2025-05-07 19:59:40 +08:00
Xu Yang 22a0c7fe56 feat: revert draft stage into a soft decay in hypothesis selection (#849)
* revert drafting

* update hypothesis rank logic

* prioritize time constraint in task design

* refine trace_desc and feedback problem prompt

* refine experiment_and_feedback_list_after_init

* fix DSHypothesis default parameter and print logic

* refine the selection weight

* merge simple_trace and trace

* refine weight and prompt

* refine sample logic

* fix CI

* robust code

---------

Co-authored-by: WinstonLiyte <1957922024@qq.com>
Co-authored-by: Xu <v-xuminrui@microsoft.com>
Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-05-07 19:05:50 +08:00
Tim 02534cfd88 chore: dump test data (#850)
* debug path for model dump
* update prompt
2025-05-07 17:24:50 +08:00
you-n-g 9a8426f373 fix: non-exist variable test_eval.py (#847) 2025-05-07 04:36:00 +08:00
you-n-g 6eef7517ad fix: wrong variable test_eval.py (#846) 2025-05-07 04:17:57 +08:00
XianBW 29a14e1e22 fix bug (#845) 2025-05-06 18:15:20 +08:00
Tim 6f9843a7df feat: custom data (#810)
* custom data

* fix: simplify competition check and log local description file

* no sample data

* feat: add test evaluation module with error handling support

* fix: update eval path to use eval_sub_dir and add valid_check TODO

* refactor: add MLETestEval check to conditionally run grading steps

* avoid blank stdout

* valid in testeval

* rename test.csv to avoid conflict

* Support Disabling sample submission

* refactoring

* fix: remove DS_KAGGLE_DATA and update prompt instructions

* add try for grade

* ignore submission

* fix: remove tee from eval command and warn about pipeline exit code detection

* optional to use raw description

* support old data

* add execution result to stdout

* add metric to raw description

* custom data explain

* add debug_path

* rst update

---------

Co-authored-by: Young <afe.young@gmail.com>
2025-05-06 16:00:13 +08:00
XianBW aa97d5a09d chore: ui change (#844)
* ui change

* ui change
2025-05-06 11:34:21 +08:00
you-n-g 6b7988fba1 feat: refine merge (#842)
* feat: add search_type param and customize success trial desc

* docs: simplify trial descriptions in share.yaml

* lint
2025-05-04 23:17:58 +08:00
you-n-g 93303873d0 fix: adapting UI to mock trace (#841)
* fix: return first index if 'SOTA Exp Score (valid)' is empty

* feat: add get_state_data_range helper for loops and slider bounds

* fix: exclude batch embedding tag from log filtering

* feat: add feedback support in sota_experiment and adjust merge flow

* fix: use fb function for merging experiments

* style: remove extra whitespace and reformat code
2025-05-04 15:51:32 +08:00
Xu Yang d0e3fc1573 fix new draft bugs (#840) 2025-04-30 18:53:27 +08:00
Haoran Pan cbedbc7d54 feat: reanalyze competition info & pipeline coding evaluator prompt (#837)
* update coding evaluator prompt similar to feedback

* reanaylyzing competition description when three sonsecutive coding failures

* update reanalyzing competition implementation

* fix bug

* update prompts and reanalyze

* fix bugs

* ci issue

* improve some code

* fix CI

---------

Co-authored-by: Xu Yang <peteryang@vip.qq.com>
Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-04-30 17:36:35 +08:00
Roland Minrui 03040de35f feat: add drafting pipeline (#832)
* init commit

* add drafting prompt

* complete the drafting

* remove scenario problems from proposal

* rename prompts_drafting.yaml

* fix bug

* fix DSHypothesis print bug

* add failed drafting exp to prompt

* fix small bug

* use get_task_information() for task design

* resolve all comments

* add problem_desc to pesudo hypothesis

---------

Co-authored-by: Xu <v-xuminrui@microsoft.com>
2025-04-30 16:25:32 +08:00
you-n-g a73f2dbc12 feat: trace merging (#836)
* feat: runnalbe -- add exp_gen_cls param, get_leaves and merge exp gen functionalities

* fix: remove unused scenario_desc and update YAML task labels

* feat: override selection and update merge task description

* lint

* lint

* lint

* lint

* lint

* fix: log competition setting to enable mle_summary

* fix name error
2025-04-29 09:30:45 +08:00
Xu Yang 45931b1012 when restart with kb and different pkl path, we need to initialize the kb from json file (#835) 2025-04-28 15:51:51 +08:00
Tim 6c179442bf chore: log cost object (#829) 2025-04-25 19:26:08 +08:00
Xu Yang 8affbf89a9 add pipeline to hypothesis spec (#828) 2025-04-25 18:29:14 +08:00
Roland Minrui 8968ab8c9a feat: propose hypothesis across multiple parts in pipeline (#827)
* refine hypothesis for pipeline

* refine component selection prompt

* update feedback prompt

* remove feat_eng in pipeline coding

---------

Co-authored-by: Xu <v-xuminrui@microsoft.com>
Co-authored-by: Xu Yang <peteryang@vip.qq.com>
2025-04-25 17:17:53 +08:00
Xu Yang c89321f5a2 fix: add time to timer when api timeout bug (#826)
* If not use the session stored timer, need to replace it with the default timer

* when api timeout, add the waiting time to timer
2025-04-25 10:50:27 +08:00
Xu Yang d6990a12b8 If not use the session stored timer, need to replace it with the default timer (#825) 2025-04-25 00:39:31 +08:00
Yuante Li 86e05e6d35 fix: fix a bug in docker result extraction (#824)
* fix a bug in docker result extraction
2025-04-24 19:02:38 +08:00
XianBW fda5c281a8 can set reasoning_effor=None in chat_model_map (#823) 2025-04-24 18:47:24 +08:00
XianBW 4f2a915da5 feat: using different chat model in different part (#822)
* using model in the chat_model_map in one tag

* add replace timer to DS loop

* fix CI

* fix CI

* add more custom config in chat_model_map

* fix CI

* fix CI

* fix CI

---------

Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-04-24 18:22:51 +08:00
Yuante Li ff99e4dc2c fix: fix model input shape bug and costeer_model bug (#821)
* fix model input shape bug and costeer_model bug

* fix a bug
2025-04-24 12:48:25 +08:00
Xu Yang c5beaeeaf8 fix: update runner max loop to 1 in DS scenario (#820) 2025-04-23 19:15:29 +08:00
Yuante Li 82b037cb63 fix: fix some minor bugs in qlib scenario (#817)
* fix some bugs

* fix a bug

* fix a bug in qlib frontend

* fix ci

* fic ci

* fix qlib Dockerfile
2025-04-23 18:48:02 +08:00
Haoran Pan 456ed100a0 update qrcode (#818) 2025-04-23 16:12:48 +08:00
Yuante Li 0798c05cb7 fix: improve eval alignment check (e.g. small-scale finetuning) (#802)
* fix

* fix
2025-04-22 18:47:24 +08:00
Xu Yang 7dbffc516d feat: add mlflow logger in RD loop to log (#815)
* add mlflow logger in DS loop

* fix CI

* fix CI

---------

Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-04-22 01:23:40 +08:00
Xu Yang 4509d92ea7 feat: archive python and csv files in workspace to maintain results (#814)
* archive workspace also

* remove non python csv and md files in workspace to avoid big workspace dump

* FIX ci
2025-04-21 16:34:29 +08:00
XianBW 19bb2e740e fix: align competion_full_desc and scenario_all_desc, remove redundant info in problems proposal (#808)
* align competition desc & scenario desc string

* remove competition_desc when having used scenario_desc in problem gen

* fix bug

* remove redundant competition desc in naive expgen

* improve proposal prompt

* modify phrase

---------

Co-authored-by: Xu Yang <peteryang@vip.qq.com>
2025-04-18 16:48:26 +08:00
XianBW 2fea82bee7 add select lite and select best button (#809) 2025-04-18 16:28:31 +08:00
Xu Yang c68b597069 fix: bug fix in timer start (#807) 2025-04-18 16:16:28 +08:00
Xu Yang bbb9d36f77 fix: bug in problem identification (#806) 2025-04-18 15:46:11 +08:00
Roland Minrui e44bb2dcc1 feat: idea pool integrated to exp_gen & add timer to RD-Agent & pause-resume to RD-loops (#795)
* update all code

* update all code

* dump knowledge base

* rename the tag

* add timer to RD-Agent

* fix CI

* fix CI

* use batch embedding

* fix a small bug

* fix prompt bug

* feat: add pause resume to handle K8S cluster pause (#804)

* add resume to cluster running

* fix non-pickle problem

* fix a small bug

* fix a small bug

* avoid shutil move error

* refine the logic

* move knowledge base out of session

* avoid mistake information to pipeline coding

* avoid load and dump in steps

* archive the right folder

* small improvement

* avoid restart when timer is already started

* fix CI

---------

Co-authored-by: Xu Yang <xuyang1@microsoft.com>

---------

Co-authored-by: Xu Yang <peteryang@vip.qq.com>
Co-authored-by: Xu Yang <xuyang1@microsoft.com>
Co-authored-by: Xu <v-xuminrui@microsoft.com>
2025-04-18 14:01:03 +08:00
Linlang 08fc2dcef3 chore: modify kaggle docs & Adding ds_loop at program entry (#786)
* modify kaggle docs

* optimise code based on comments

* Update docs/scens/kaggle_agent.rst

* fix docs build error

---------

Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>
2025-04-17 22:02:49 +08:00
you-n-g c2759a2a0a refactor: use remove_eda_part for EDA cleanup, fix diff eval (#800) 2025-04-17 16:19:26 +08:00
Linlang 05092c5c5b update wechat qrcode (#798) 2025-04-16 21:39:56 +08:00
XianBW d9cee55063 fix retry when hypothesis gen (#796) 2025-04-16 19:01:46 +08:00
you-n-g fe3337d6ff refactor: use dynamic input path and update template loader (#792)
* refactor: use dynamic input path and update template loader

* fix: update include syntax for data source in prompts.yaml

* add customization path

* docs: update prompts for ensemble scoring and metric direction

* chore: remove obsolete data_science/share.yaml file
2025-04-16 18:11:46 +08:00
Xu Yang 90f6fde3d4 feat: raise error when timeout in api call (#793)
* small change to try catch in backend

* fix CI

* add timeout tolerance to 3
2025-04-16 13:50:20 +08:00
you-n-g 0e3dcc2d8d feat: refine prompt (#760)
* style: Simplify language and improve clarity in prompts and share.yaml

* style: Update prompt wording for clarity in raw_data_loader

* style: Simplify conditional logic in task_gen system prompt

* refactor: Update prompts and proposal for component output format handling

* fix: Correct grammar and add clarification in prompts.yaml

* feat: Include coding guidelines in data science component prompts

* lint
2025-04-16 09:35:30 +08:00
you-n-g aedd0a0f72 fix: update metric direction to return bool (#791) 2025-04-15 17:10:31 +08:00
Roland Minrui 214da4826f fix: add wait_retry to exp_gen v2 (#783)
* add wait retry to v2

* format

* fix a bug

---------

Co-authored-by: Xu <v-xuminrui@microsoft.com>
Co-authored-by: yuanteli <1957922024@qq.com>
2025-04-14 11:02:45 +08:00
you-n-g f25d729a02 fix: import path of T (#787)
* feat: add DocDev for auto-generating workspace documentation

* fix: update markdown instructions in tpl.yaml

* feat: add enable_doc_dev flag and conditionally call DocDev

* refactor: update T import and prompt keys for DocDev

* fix: update include path for MarkdownOut template

* fix: update file search, README injection, and brief prompt text

* docs: update prompt to only introduce models

* lint
2025-04-13 10:21:24 +08:00
Yuante Li 773b7ac439 fix: fix competition metric direction (#784) 2025-04-11 16:25:30 +08:00
Yuante Li 19dd259165 refactor: refactor feedback logic and fix bug in task_gen (#782)
* task gen refine & feedback refine

* fix

* refine feedback logic

* fix a bug

* fix

* fix

* fix ci
2025-04-11 15:52:52 +08:00
you-n-g ab52e1b65c feat: add DocDev for auto-generating workspace documentation (#781)
* feat: add DocDev for auto-generating workspace documentation

* fix: update markdown instructions in tpl.yaml

* feat: add enable_doc_dev flag and conditionally call DocDev
2025-04-10 20:12:21 +08:00
Xu Yang 959f2fa076 still assign five component to pipeline (#780) 2025-04-10 18:30:32 +08:00
Tim f06e6986c8 chore: fit more competition (#723)
1. Remove potential <code> tags from the generated code.
2. Use return codes in data_loader, feature, and model.
3. Configure the debug timeout.
2025-04-10 17:56:57 +08:00
Tim b5631b9f78 feat: pull image with progress (#777)
pull image with progress
2025-04-10 12:00:27 +08:00
you-n-g b662f45021 feat: dump model (#776)
* feat: add model dump flag and multi-evaluator support

* tmp code

* refactor: update evaluator feedback and FBWorkspace types

* feat: add get_clear_ws_cmd and CPU count in Docker environment

* feat: Add model dump check level and enhance evaluator functionality

fix data type bug

* fix: Ensure required files exist before model dump evaluation

* refactor: streamline prompt and file checks in model dump evaluation

* fix: add assertions and reorder file reads in model dump evaluator

* feat: remove EDA part from evaluation output

* docs: update dump_model guidelines and eval prompt to include template

* style: reformat multiline dicts and lists in conf and eval files

* fix: add DOTALL flag to EDA removal regex
2025-04-09 23:24:12 +08:00
XianBW 92d007e179 ui updates (#778) 2025-04-09 20:11:00 +08:00
you-n-g c40f22361c refactor: update MLEBench submission validation logic in runner and eval (#769)
* refactor: Update MLEBench submission validation logic in runner and eval

* lint

* Delete docs/scens/data_science.rst

* fix: update variable name in feedback prompt

* define a variable: submission_check_out

* fix: update submission check handling for MLE data

* refactor: reformat if condition for clarity

---------

Co-authored-by: Linlang <Lv.Linlang@hotmail.com>
2025-04-09 13:34:48 +08:00
Linlang e22fb84fb3 update wechat qrcode (#775) 2025-04-09 12:23:38 +08:00
XianBW 80c5eb209e catch llm_data pkl read exception (#774) 2025-04-09 12:21:54 +08:00
xuangu-fang 67114540b1 feat: checkpoint selection (#744)
* rebase selection code

* bug-free run: checkpoint selection and dynamic EDA loading

* add prototypes of various selectors, to imp. and test later

* fix EDA write bug

* move selector to from proposal.py tp seletc.py

* auto lint

* fix line-too-long typos

* aligh the design of "selection", rm extra instance check

* make auto-lint

* add non-trival selector: SOTAjump
2025-04-09 09:42:30 +08:00
Xu Yang 8517eb4a18 fix: update feedback.py (#772) 2025-04-08 23:35:11 +08:00
Xu Yang a16c79e45b small bug fix in feedback (#771) 2025-04-08 22:17:47 +08:00
XianBW ce23e1c30b chore: data science scenario UI updates (#770)
* fix some pandas warning

* fix load time logic

* optimize load_time logic

* fix CI

* fix bug
2025-04-08 19:33:20 +08:00
Xu Yang 92e7932126 add rule-based eval to speed up the whole process (#768) 2025-04-08 17:27:21 +08:00
Yuante Li 31752bb8f0 feat: merge failed and successful traces together (#766)
* merge failed and successful traces together

* delete the task description from the trace display

* prune unnecessary info for the proposal stage
2025-04-08 17:04:55 +08:00
Yuante Li 7372d1011e feat: add reviewer in feedback (#765) 2025-04-08 16:20:13 +08:00
XianBW a918f941dd add hypothesis table (#764) 2025-04-07 20:16:37 +08:00
XianBW dee11fbd9c fix: duplicate model names test in pipeline coder & runner (#763)
* add model name duplicate test in pipeline costeer

* fix ci
2025-04-07 19:06:42 +08:00
you-n-g 0dcc990bd4 fix: Set PYTHONPATH in env.run_ret_code call in FBWorkspace class (#755) 2025-04-07 18:15:33 +08:00
XianBW 3f41e868b3 chore: data science scenario UI updates (#757)
* ui changes

* add ours vs medal threshold

* add success loop statistic of components

* show times info

* UI updates

* summary selected

* change colors

* fix CI

* add stat hours param for `mle_summary.py --summary` command

* add 24h summary button

* fix CI

* add logger info for dockerEnv/condaEnv running time
2025-04-07 16:24:27 +08:00
Roland Minrui fac39e5588 remove buggy info in hypothesis rank (#762)
Co-authored-by: Xu <v-xuminrui@microsoft.com>
2025-04-07 14:09:36 +08:00
Xu Yang fce5342ad4 pretrained & validation alignment (#761) 2025-04-07 13:29:41 +08:00
you-n-g 44ada185f4 feat: add naive experiment generator and update proposal configurations (#759)
* feat: Add naive experiment generator and update proposal configurations

* lint

* lint
2025-04-07 13:01:29 +08:00
Yuante Li 6818ada2cf fix: fix some minor bugs (#758) 2025-04-04 23:54:54 +08:00
Yuante Li 11e8acc88b feat: add a check for whether values in score_df are NaN (#756)
* add a check for whether values in score_df are NaN

* fix ci

* change raise to assert
2025-04-04 22:44:55 +08:00
you-n-g 9415113e01 feat: add reasoning_effort parameter to LiteLLMAPIBackend and LLMSett… (#754)
* feat: Add reasoning_effort parameter to LiteLLMAPIBackend and LLMSettings

* style: Use consistent quotation marks for reasoning_effort literals
2025-04-04 19:37:40 +08:00
Xu Yang d3414ea07d fix: task_gen for better understanding (#752) 2025-04-04 17:09:26 +08:00
Tim 8bd2714814 feat: joblib cache (#749)
* cache function

* fix test

* bin cache

* fix test

* fix test

* fix test

* cache for different source

* cache for localenv

* remove unnecessary log

* reformat

* remove unrelated modify
2025-04-04 12:08:18 +08:00
Tim 200764d38b workflow entrypoint check (#748) 2025-04-04 12:07:46 +08:00
you-n-g c1c1342a9e chore(main): release 0.4.0 (#454)
Release-As: 0.4.0
2025-04-04 11:51:31 +08:00
Linlang 756dfba53f fix: fix kaggle templates path error (#747)
* fix kaggle templates path error

* add env.py dependence

* reformat with lint
2025-04-04 11:20:33 +08:00
Xu Yang 1f0032bc50 fix when score is a string (#750) 2025-04-03 23:48:38 +08:00
Roland Minrui 9eded6faa8 feat: add hypothesis guidelines and rule-based ranking (#746)
* 1. add hypothesis guidelines 2. add weighted scoring

* fix CI & speed up exp_gen

* random but reproduciable choice on hypothesis

---------

Co-authored-by: Xu <v-xuminrui@microsoft.com>
Co-authored-by: Xu Yang <peteryang@vip.qq.com>
2025-04-03 18:48:28 +08:00
you-n-g 8783781daa refactor: Improve data handling and representation in eval tests and prompts (#740) 2025-04-03 13:53:25 +08:00
Roland Minrui da8fbcf4ee feat: add pipeline coder (#742)
* init commit

* limit problem numbers

* ensemble lower case

* add runtime and spec to coder

* submission check notice

* sub EDA in sample execution

* avoid lightgbm

* add time limit to scenario

* rephrase the submission check

* give positive feedback when facing warning in check

* ENABLE FEEDBACK

* fix feedback bug

---------

Co-authored-by: Xu Yang <peteryang@vip.qq.com>
2025-04-03 13:00:11 +08:00
Linlang 22ed8b522b fix: fix KeyError direct_exp_gen (#735)
* fix KeyError direct_exp_gen

* fix KeyError direct_exp_gen

* fix fin_factor fetch data error
2025-04-03 12:01:10 +08:00
Haoran Pan 7fc5e73f76 fix: replace func "len()" in ensemble test code to support various data type (#739)
* replace len with def get_length

* update get_length implementation
2025-04-02 19:52:54 +08:00
Yuante Li e30768969d feat: add describe_data_folder_v2 (#738)
* add describe_data_folder_v2

* fix ci

* fix

* add packages
2025-04-02 19:38:43 +08:00
Xu Yang bc8e9dc23a costeer max loop as hyperp & skip workflow in eval (#737) 2025-04-02 14:18:42 +08:00
Roland Minrui 1474478768 feat: new exp gen v2 implementation (#725)
* first framework commit

* idea proposal v2

Co-authored-by: Roland Minrui <RolandMinrui@users.noreply.github.com>

* fix a small bug in v1

* fix a small bug

* add problem to DShypothesis

* use exp gen as unified interface

* merge yuante's code into pr

* fix a small bug in draft

* update all minrui's code

* small update

* fix small bug & remove useless code

* fix return type

* fix CI

---------

Co-authored-by: Xu Yang <peteryang@vip.qq.com>
Co-authored-by: Roland Minrui <RolandMinrui@users.noreply.github.com>
Co-authored-by: Xu <v-xuminrui@microsoft.com>
Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-04-02 13:37:47 +08:00
you-n-g 260b563710 feat: loader prompt & simplify YAML loading and update data loader specifications (#736)
* refactor: Simplify YAML loading and update data loader specifications

* docs: Add comment explaining FunctionLoader usage in tpl.py

* lint

* lint
2025-04-01 22:36:25 +08:00
XianBW 3ef0b21350 chore: split dsapp to pages & add llm_logs showing (#733)
* split dsapp to pages & add llm_logs showing

* some changes

* small bug

* add time info

* do not test UI in test_import

* cache stdout
2025-04-01 20:55:10 +08:00
you-n-g 473b9000b9 feat: update prompts and descriptions for data science components (#731)
* docs: Update prompts and descriptions for data science components

* chore: Remove outdated comments from conf.py

* feat: Add metric_name attribute to DataScienceScen class

* style: Update description in prompts.yaml and reorder metric_name init

* docs: Update prompts.yaml with feature engineering guidelines
2025-04-01 20:54:42 +08:00
Yuante Li 00b31fa752 fix: fix a bug in regular expression exception processing (#734)
* fix a bug in regular expression exception precessing

* fix ci

* fix
2025-04-01 16:54:05 +08:00
Haoran Pan cc8ae7e1f0 update wechat group qrcode (#732) 2025-03-31 19:20:04 +08:00
Yuante Li 752de9dc67 feat: add a tool to enable saving workspace files into a specific folder (#728)
* add a tool to enable saving workspace files into a specific folder

* fix

* fix
2025-03-28 16:22:27 +08:00
you-n-g a99276d59b feat: track and log accumulated completion cost in LiteLLMAPIBackend (#727)
* feat: Track and log accumulated completion cost in LiteLLMAPIBackend

* refactor: Use variable for retry count and update import formatting

* lint

* fix: Allow chat_max_tokens to be None in LLMSettings

* feat: Add logging for LiteLLM settings and finish reason in cost calculation
2025-03-28 12:24:19 +08:00
XianBW 450571e86e fix: add metric name check for valid scores (#724)
* update metric_name

* fix some bugs

* add an evaluation in workflow

* add an evalution in runner

* fix ci

* test change

* fix CI

---------

Co-authored-by: TPLin22 <tplin2@163.com>
Co-authored-by: yuanteli <1957922024@qq.com>
2025-03-27 19:36:57 +08:00
XianBW 7fc9e18a71 feat: make spec optional (#719)
* feat: Add spec_enabled configuration for data science settings

* make spec alternative

* change spec logic in exp_gen

* remove some general texts

* align

---------

Co-authored-by: Young <afe.young@gmail.com>
Co-authored-by: yuanteli <1957922024@qq.com>
2025-03-27 17:17:41 +08:00
you-n-g 031d264957 docs: Add note on running Docker without sudo in installation guides (#721) 2025-03-27 10:28:06 +08:00
Linlang 6da6fb5ee5 refactor: remove unused code and update documentation in CoSTEER module (#720)
* refactor: Remove unused code and update documentation in CoSTEER module

* fix mypy error

* fix black error

---------

Co-authored-by: Young <afe.young@gmail.com>
2025-03-26 22:48:01 +08:00
Haoran Pan 525b1a2136 update wechat qrcode (#718) 2025-03-25 22:23:33 +08:00
XianBW 61813cba67 chore: update data science scenario UI (#717)
* UI changes

* remove hardcode

* fix CI
2025-03-21 18:11:06 +08:00
Hamza Bouajila b33be5ed5b docs: add contributing guidelines for rdagent (#710)
* docs: add contributing guidelines for RD-Agent

* docs: update contributing guide to include CI checks before pull requests and refrer to it in the home page README
2025-03-21 15:56:13 +08:00
Haoran Pan 6b856e2217 docs: update readme and installation guide for litellm backend addition (#703)
* docs: Update README and installation guide for LiteLLM backend addition

* docs: update LiteLLM Backend configuration guide

* remove and add some llm settings docs

* CI Issue

* CI Issue

* update docs

---------

Co-authored-by: Young <afe.young@gmail.com>
2025-03-21 14:55:30 +08:00
Linlang f5f3e050ab fix: fix docs build error (#711)
* fix docs build error

* delete test code

* add comments
2025-03-21 14:44:35 +08:00
you-n-g 9a43e15bf4 feat: Add line length limit to shrink_text function and settings (#715) 2025-03-21 00:41:52 +08:00
XianBW 251800396d add task type logger tag in coding (#714) 2025-03-20 19:15:37 +08:00
Yuante Li 5f3e382248 fix: fix a bug in ensemble test script (#713)
* fix a bug in ensemble test script

* fix

* add a comment
2025-03-20 17:35:39 +08:00
Yuante Li fa0dbb69fe fix: fix a bug in progress_bar filter (#712)
* fix a bug in progress_bar filter

* fix
2025-03-20 16:02:09 +08:00
Linlang f1e4e9900c fix docs build error (#709) 2025-03-20 11:39:19 +08:00
Haoran Pan 203be39ad6 docs: update wechat community qrcode (#704) 2025-03-19 20:17:41 +08:00
XianBW 60b66aa6c9 change only model codes in model coder (#707) 2025-03-19 19:37:26 +08:00
XianBW b91471181c fix coverage using method (#706) 2025-03-19 19:00:53 +08:00
Yuante Li a48abf4a84 fix: clarify an ambiguous explanation (#705) 2025-03-19 17:57:04 +08:00
Yuante Li 5b14779f69 feat: add cross validation to workflow (#700) 2025-03-19 17:56:42 +08:00
you-n-g 8ea8817e7d fix: default emb model (#702)
* fix: Remove incorrect prefix from default embedding model name

* refactor: Consolidate model settings in LLMSettings class
2025-03-19 12:27:45 +08:00
Yuante Li fd747fe741 fix: align components' name (#701) 2025-03-19 11:27:43 +08:00
Linlang b666397786 fix: fix combined_factors_df.pkl not loading in docker (#697)
* Fix combined_factors_df.pkl not loading in docker

* change combined factors file type

* change qlib commit id
2025-03-18 18:36:21 +08:00
XianBW 31381743f7 feat: out spec change for o1-preview (#666)
* add not_json batcheditout

* ensemble out_spec change

* feature out_spec change

* model out_spec change

* workflow out_spec change

* runner debugger out_spec change

* filter_progress_bar return format fix

* data_loader and spec out_spec change

* show finish_reason in llm log

* json_mode fix

* remove hardcode

* fix CI

* fix grammer

* complete PythonBatchEditOut logic

---------

Co-authored-by: yuanteli <1957922024@qq.com>
2025-03-18 17:43:44 +08:00
Yuante Li e564b418e1 fix: fix some description errors in direct_exp_gen (#698)
* fix some description errors in direct_exp_gen

* delete an unused module
2025-03-18 16:21:59 +08:00
Ikko Eltociear Ashimine d1031ed24d refactor: update evolving_strategy.py (#686)
implmentation -> implementation
2025-03-18 16:15:08 +08:00
XianBW d66c045115 fix: add check when retrying gen model codes (#699)
* add check when retrying gen model codes

* fix CI
2025-03-18 15:59:34 +08:00
Yuante Li 7b3473cf30 feat: add model removal and adjust some framework logic (#681)
* prune model task

* add component_description

* add model removal logic to component, hypo, and task gen

* fix ci

* adjust coder to meet the requirement of model removal

* fix and refine the logic of model removal

* add model removal logic in model_eval

* fix ci

* fix ci

* prune some unnecessary codes
2025-03-18 14:42:53 +08:00
XianBW 1d6e97cb99 fix preds_dict's keys (#695) 2025-03-17 23:33:17 +08:00
XianBW 3d7b2b4567 fix: runner COSTEER evaluator (#693)
* fix scores.csv and submission.csv check in runner eval

* add coverage check info in running COSTEER feedback

* feedback value fix
2025-03-17 23:12:59 +08:00
Yuante Li b8a699a0df fix: fix a minor bug (#694) 2025-03-17 21:43:26 +08:00
Jake Roggenbuck 93b41c1414 fix: change devault to default (#688) 2025-03-17 21:28:13 +08:00
Yuante Li bb91201dd2 fix: fix a bug related to model_name in ensemble (#692)
* fix a bug related to model_name in ensemble

* refine
2025-03-17 21:23:57 +08:00
XianBW e0ae91b497 validate and update 'final_decision' before init CosTeerFeedback (#691) 2025-03-17 19:53:09 +08:00
Yuante Li b20692cbd4 fix: fix an error in model_coder prompt (#690) 2025-03-17 15:38:39 +08:00
cslwqxx 78e2665617 Update README.md (#689) 2025-03-17 14:11:34 +08:00
you-n-g 40f2b8f98b doc: Update README.md new (#679) 2025-03-16 22:34:29 +08:00
XianBW b033215ca9 fix: add force parameter for cache_with_pickle & using cache when get kaggle leaderboard (#687)
* use kaggleApi latest edition

* add 'force' for cache_with_pickle, use cache when getting kaggle leaderboard
2025-03-16 00:50:17 +08:00
XianBW 1f4432c39b fix PythonAgentOut extract (#685) 2025-03-14 21:12:10 +08:00
XianBW a9f0fd9786 fix: rich.print error when some control char in output (#684)
* fix rich.print error when some control char in output

* change conda env info printing

* fix import
2025-03-14 21:03:46 +08:00
XianBW 05bf05ca49 fix running part timeout (#683) 2025-03-14 17:56:41 +08:00
XianBW 9bba28093c check 'ensemble' in scores.csv in workflow eval (#682) 2025-03-14 17:40:06 +08:00
Roland Minrui 3519b718ea feat: add constraint labels for semantic search (#680)
* add constraint labels for semantic search

* reformat

* reformat

* reformat

---------

Co-authored-by: Xu <v-xuminrui@microsoft.com>
2025-03-14 16:08:29 +08:00
XianBW cde173688b timeout message adjustment for Run Env (#677) 2025-03-13 16:57:10 +08:00
Yuante Li 68668d7a5b feat: display LLM prompt (#676)
* log llm prompt

* fix

* fix log llm messages problem

---------

Co-authored-by: Bowen Xian <xianbowen@outlook.com>
2025-03-13 15:57:17 +08:00
XianBW 55b914fe22 fix: save only one mle_score pkl for a running exp (#675)
* save only one mle_score pkl for a running exp

* fix_CI
2025-03-13 14:55:13 +08:00
XianBW b2c1b68d51 fix: mle_score save problem (#674)
* fix mle_score save problem

* fix CI
2025-03-12 20:54:05 +08:00
XianBW 14270354d1 change default to False of 'do_truncate' (#673) 2025-03-12 20:21:34 +08:00
XianBW 7b981cbf09 save mle_score to log folder with 'mle_score' tag (#672) 2025-03-12 19:40:23 +08:00
you-n-g 27596473c7 fix: correct the configuration inheritance relationship (#671)
* fix: Correct the configuration inheritance relationship

* lint
2025-03-12 18:49:00 +08:00
Roland Minrui 14421c6cde fix: return 1D embedding if create_embedding receive a string input (#670)
* return single dimension embedding for string input of create_embedding

* Update base.py

* fix

* fix

* fix

* fix

---------

Co-authored-by: Xu <v-xuminrui@microsoft.com>
2025-03-12 16:10:33 +08:00
you-n-g 918b0b0d43 feat: condaenv & full docker env (#668)
* use conda to run kaggle and mlebench code

* refactor: Simplify environment configuration and execution logic

* add setting to use local env in ds

* refine dockerfile

* fix: Move MLEBDockerEnv initialization inside conditionals &  fix condaenv

* refactor: reformat code for better readability and consistency

* feat: add conda env to all envs.

* fix: fix bugs when run loop

* refactor: Simplify DockerEnv configuration in mle_summary.py

* fix image bug

* style: reformat code for better readability and consistency

* change commit

* feat: Add entrypoint script for sing_docker scenario in rdagent

* refactor: add Any type hints and comments for clarity in env.py

* feat: Create log directory if it doesn't exist in entrypoint script

* feat: Add debug mode and list root directory in entrypoint script

* fix: Remove specific branch checkout in Dockerfile for RD-Agent

* fix: Add competition argument to loop.py script execution

* fix: Correct directory navigation and dependency installation in entrypoint.sh

* fix: Correct user ownership assignment in entrypoint script

* refactor: Comment out redundant log copying to RD_OUTPUT_DIR

* fix: Unset LOG_TRACE_PATH to prevent log contamination in entrypoint.sh

---------

Co-authored-by: Xu Yang <peteryang@vip.qq.com>
2025-03-12 11:36:28 +08:00
Yuante Li 4cd20a464d feat: add rank into report (mle_summary) (#665)
* add rank into report (mle_summary)

* fix CI

* fix
2025-03-10 15:25:38 +08:00
Haoran Pan 1c628c6c1a update qrcode 25/03/07 (#664) 2025-03-07 17:59:49 +08:00
you-n-g a55af6fa00 fix: target json type & round (#662)
* refactor: Rename direct_exp_gen to json_target_type in DSExpGen class

* fix type

* fix: Adjust loop iterations and update json_target_type for nested dicts
2025-03-05 22:46:43 +08:00
you-n-g 824390e33c fix: direct_exp_gen to json_target_type in DSExpGen class (#661)
* refactor: Rename direct_exp_gen to json_target_type in DSExpGen class

* fix type
2025-03-05 22:27:46 +08:00
you-n-g 2171e99416 fix: fix ExtendedSettingsConfigDict does not work (#660)
* refactor: Replace ExtendedSettingsConfigDict with SettingsConfigDict

* lint

* lint
2025-03-05 18:30:02 +08:00
Haoran Pan b6ad5a6ed3 avoid selecting the same components too many times (#654) 2025-03-05 13:12:08 +08:00
Haoran Pan b49505be8e feat: variable printing tool of data_science coder testing (#658)
* update debug_info printing

* refine infomation printing

* update ensemble evaluator prompt

* substitute repr with reprlib.repr

* strip comments
2025-03-05 13:08:30 +08:00
Roland Minrui 2ed6ec53d9 feat: add do_truncate control for the load function (#656)
feat: add do_truncate control for the load function (#656)
2025-03-04 15:18:36 +08:00
Tim 30b52d7d57 scores.csv should not be rewritten (#653) 2025-02-28 19:56:20 +08:00
Haoran Pan d753daf758 update Wechat group QR code (#652) 2025-02-28 15:39:52 +08:00
Xu Yang 74cfc5b906 feat: add type checker to api backend & align litellm and old backend (#647)
* move cache auto continue and retry to all api backend

* add type checker to json mode output

* fix CI

* feat: Add json_mode handling and streaming support in chat completion function

* lint

* fix a bug when returning a dict which value could contain int or bool

* remove litellm

---------

Co-authored-by: Xu Yang <xuyang1@microsoft.com>
Co-authored-by: Young <afe.young@gmail.com>
2025-02-28 15:13:43 +08:00
you-n-g 58910d2ce6 docs: Add guidelines for competition participation in prompts.yaml (#651) 2025-02-28 10:40:14 +08:00
XianBW bd258fe970 fix workflow eval logic (#650) 2025-02-27 22:07:20 +08:00
Yuante Li 68bf5665f0 fix: fix some bugs (ensemble output, HPO, model tuning) (#648) 2025-02-27 18:28:13 +08:00
Xu Yang a57e625b17 feat: add eda to data science scenario (#639)
* add eda to data science scenario

* fix CI
2025-02-26 22:35:44 +08:00
Xu Yang d7da15c826 feat: add max time config to costeer in data science (#645)
* add max time config to costeer

* fix a small bug

---------

Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-02-26 18:36:51 +08:00
Yuante Li ac7c2155e4 fix: clarify cross_validation (#644) 2025-02-26 17:52:30 +08:00
you-n-g bccf5aed8a fix: Set default value for 'entry' parameter in Env.run method (#643) 2025-02-26 16:51:38 +08:00
Tim 5bb73ff6cb chore: sample unique labels (#642)
* sample unique labels

* reformat
2025-02-26 15:24:39 +08:00
Roland Minrui b772fe2191 load code from file dict instead of folder (#641)
Co-authored-by: Xu <v-xuminrui@microsoft.com>
2025-02-26 14:21:28 +08:00
XianBW 28f072da31 change ensemble metric prompt's code tips (#640) 2025-02-26 11:40:25 +08:00
XianBW 34e143cd66 fix: avoid try-except in ensemble eval prompts (#637)
* avoid try-except in prompts

* remove try-except limit from coder prompt

* add no try-except criteria in ensemble eval
2025-02-25 23:06:41 +08:00
Tim e73db7e0d7 ignore new numeric type (#638) 2025-02-25 18:20:14 +08:00
Xu Yang f120341c9c fix: qlib and other scenario bugs (#636)
* fix qlib and other scenario bugs

* bug fix
2025-02-25 12:06:07 +08:00
XianBW 54cd73eb85 fix: add ensemble test, change to "use cross-validation if possible" in workflow spec (#634)
* change to "use cross-validation if possible" in workflow spec

* Limit the evaluation indicator to only one

* add metric tips

* string change
2025-02-24 20:28:32 +08:00
Yuante Li 20bd55c3a5 fix: fix a bug in initial tasks (#635)
* fix a bug in initial tasks

* fix ci
2025-02-24 20:23:54 +08:00
you-n-g 403d7fcf80 feat: Make system prompt role customizable in LLM settings (#632) 2025-02-23 00:52:30 +08:00
Yuante Li f5761b1f2d feat: improve the framework's ability to adaptively adjust the model (#629) 2025-02-21 22:46:14 +08:00
Xu Yang d4ade36184 refine component choosing part (#630) 2025-02-21 18:35:36 +08:00
Roland Minrui 982b43e4fd feat: add output_path to load function of LoopBase (#628)
* feat: add output_path to load from checkpoint function

* add default value to output_path

* sort import

* sort imports

---------

Co-authored-by: Xu <v-xuminrui@microsoft.com>
2025-02-21 16:46:58 +08:00
Yuante Li b64ab18caa fix: fix a bug in cross validation (#618)
* fix a bug in cross_validation

* fix cross-validation prompt position

* fix

* fix

* append all error messages and full traceback details in execution

---------

Co-authored-by: Bowen Xian <xianbowen@outlook.com>
2025-02-20 16:18:40 +08:00
Yuante Li 433594297a fix: fix some bugs in workflow unit test (#624)
* fix some bugs in workflow unit test

* fix ci
2025-02-20 15:42:17 +08:00
you-n-g dff89d2950 refactor: add run_ret_code method and update run method to use it (#623)
* refactor: Add run_ret_code method and update run method to use it

* feat: Add kwargs support to run methods and test for run_ret_code

* fix: preserve exit code after chmod in DockerEnv entry command

* chore: Change file permissions from 755 to 644 in env_tpl directory

* refactor: Return execution code and update evaluator logic

* lint

* refactor: Use MappingProxyType for running_extra_volume in DockerEnv methods

* lint
2025-02-20 00:42:10 +08:00
Xu Yang 0bd8366254 several bug fix (#621) 2025-02-19 22:03:39 +08:00
XianBW 2222897b3f fix: change ensemble test (#622)
* change ensemble test

* remove redundant info

* fix bug

* add model name duplication check in ensemble test

* change text
2025-02-19 21:26:09 +08:00
XianBW fc5f295de7 fix: move docker timeout message to __run() (#620)
* move docker timeout msg to __run()

* fix CI
2025-02-19 19:09:52 +08:00
Haoran Pan 05c7712770 update qrcode (#616) 2025-02-19 13:44:40 +08:00
you-n-g 1737aff7c9 fix: Runnable on first complete & Rename method to next_incomplete_component for clarity (#615) 2025-02-19 01:00:25 +08:00
Yuante Li 464222094f add a check for the name of ensemble's score in scores.csv (#614) 2025-02-18 22:24:11 +08:00
you-n-g 42d15623ca fix: move next_component_required logic to DSTrace class and accurate implement (#612)
* refactor: Move next_component_required logic to DSTrace class

* lint
2025-02-18 21:56:32 +08:00
Haoran Pan 6c20263e2e fix: sota comparison logic (#608)
* concat sota and current result

* fix the bug in current_exp's score vs sota's score

* fix ci

---------

Co-authored-by: yuanteli <1957922024@qq.com>
2025-02-18 20:43:28 +08:00
XianBW 50e637f9cd add PYTHONUNBUFFERED=1 for docker env (#613) 2025-02-18 20:07:49 +08:00
Roland Minrui 1605cddb40 feat: add loop_n parameter to the main loop (#611)
* add loop_n parameter to main loop

* complete the loop_n

---------

Co-authored-by: Xu <v-xuminrui@microsoft.com>
2025-02-18 19:22:52 +08:00
Xu Yang 75e496d461 fix restart bug (#609) 2025-02-18 15:39:34 +08:00
you-n-g 9fcd5d473e refactor: replace Evaluator with CoSTEEREvaluator in eva_utils.py (#607)
* refactor: Replace Evaluator with CoSTEEREvaluator in eva_utils.py

* fix bug

---------

Co-authored-by: Linlang <Lv.Linlang@hotmail.com>
2025-02-18 13:38:13 +08:00
Xu Yang 5f1c814355 fix: a small bug in exp_gen (#606) 2025-02-17 22:40:05 +08:00
Yuante Li 21d88f38d0 fix: fix some minor bugs and add AutoML & cross-validation (#604)
* fix some complex sentences

* add AutoML in model and cross-validation in workflow
2025-02-17 19:14:50 +08:00
Tim fd27842a98 print head for txt files and shuffle when sample (#603) 2025-02-17 18:44:26 +08:00
Xu Yang bddb5eb935 fix: docker error will trigger retry and data science runner loop set to 3 (#602)
* docker error will trigger retry
data science runner loop set to 3

* fix CI
2025-02-17 17:36:05 +08:00
you-n-g ffc85936f1 refactor: refactor core framework to better propogate feedbacks (#599)
* refactor: Update type annotations and remove unused class in evolving modules

* refactor: Simplify evolving agent and feedback handling in CoSTEER module

* lint & CI

* mypy

* ruff for core

* mypy

* refactor: remove unnecessary comments and update feedback handling logic

* refactor: Add prev_task_feedback parameter to evolving strategies

* feat: Clear folder before extracting zip file in DockerEnv

* fix: Correct retrieval of last experiment from history
2025-02-16 01:40:44 +08:00
Tim 241c05ccac chore: print txt info (#600)
* print head for txt files

* update sample
2025-02-14 19:16:28 +08:00
Xu Yang 50e020b75d fix: auto continue small bug (#598) 2025-02-14 17:03:57 +08:00
Yuante Li d1c005ff6d fix: fix a bug in proposal (add last loop's exception to last task desc) (#596)
* fix a bug in proposal (add last loop's exception to last task desc)

* fix
2025-02-14 16:36:49 +08:00
Xu Yang 96ee62c7a2 small bugs in cache rerun (#597) 2025-02-14 16:24:26 +08:00
Yuante Li c321ebfbcb fix: fix some bugs in the ensemble component (#595)
* allow the LLM in the ensemble to focus on the significance of metrics

* fix a bug in feedback

* prun spec

* fix a bug in ensemble

* delete unnecessary prompts

* fix the logic in spec

* generalize dataset split
2025-02-14 15:32:40 +08:00
Xu Yang 1a44a954df feat: integrate azure deepseek r1 (#591)
* fix several task & integrate deepseek R1

* fix CI

---------

Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-02-13 22:20:17 +08:00
Tim 4d8e334ef8 fix error (#594) 2025-02-13 19:34:49 +08:00
Tim b7be0f35f8 fix: ensure expected type (#593)
* ensure expected type

* reformat
2025-02-13 19:04:26 +08:00
炼金术师华华 97c1f7a021 feat(backend): integrate LiteLLM API Backend (#564)
* File structure for supporting litellm

* more litellm support

* feat: Add CachedAPIBackend class and dynamic API backend retrieval function

* fix: update benchmark folder path and add default values for architecture and hyperparameters

* feat: add LiteLLMAPIBackend and DeprecBackend ; changed structure of the project ; with bus

* fix : deprec_backend

* feat: Add LiteLLMAPIBackend class and related features; update configuration and test cases.

* feat: Enhance LiteLLMAPIBackend with encoder support and dynamic argument handling;Enhance log Colors

* lint

* fix lint...

* fix: Lint

* fix:make auto-lint

* fix:test oai

* fix:redundant _abckend.py

* fix: Optimize LiteLLMAPIBackend on token counting functiona, and clean up unused code;add test on this function

* feat: Add LiteLLMSettings class and update model settings usage

* fix: Update LiteLLMSettings environment variable prefix and model configurations

* fix : gitignore

* test: Consolidate and relocate test files for litellm backend and oai

* fix : lint

* fix: lint

* auto lint

* lint

* LINT

* lint

* chore: remove deprecated backend configuration comments

* refactor: Remove unused functions and imports from deprec.py and llm_utils.py

* refactor: Move md5_hash function from deprec.py to llm_utils.py

* chore: Remove extra newline and add missing import in deprec.py

* lint

* refactor: Move md5_hash function to utils module

* lint

* lint

* lint

---------

Co-authored-by: Young <afe.young@gmail.com>
Co-authored-by: Yihua Chen <v-yihuachen@microsoft.com>
2025-02-13 15:16:18 +08:00
Yuante Li f362a1618d fix: fix a bug in threshold score display (#592)
* fix a bug in threshold score display

* fix
2025-02-13 14:50:56 +08:00
Yuante Li 43703d45d2 feat: add baseline score stat (#590)
* add baseline score stat

* fix ci

* fix

* fix
2025-02-12 18:57:08 +08:00
Tim f06412e628 sample group files by basename (#589) 2025-02-12 16:36:46 +08:00
Xu Yang dc2bf4b442 fix: sort file name for cache reproduction (#588) 2025-02-12 15:29:57 +08:00
you-n-g 8f1f19d4b9 fix: Handle ValueError when resolving relative path for uri (#585) 2025-02-12 13:23:08 +08:00
Xu Yang 064733d82b fix runner as costeer when using static task (#587) 2025-02-12 12:35:17 +08:00
Tim da7169675c ignore score value (#586) 2025-02-12 11:39:49 +08:00
XianBW 6de33fa13b fix: coder prompt & model test text (#583)
* test text fix

* Require LLM to use print() instead of logging
2025-02-11 21:12:25 +08:00
Xu Yang c1085921b5 add feedback to workspace and ds runner base on costeer 2025-02-11 20:50:19 +08:00
XianBW 18de5eea43 feat: summary and UI update (#581)
* summary and UI update

* fix CI

* fix

* fix CI
2025-02-11 20:48:30 +08:00
Tim 13214ba5d0 avoid length exception (#580) 2025-02-11 18:12:45 +08:00
you-n-g 56f3a668f2 fix: handle invalid regex patterns in filter_progress_bar function (#579)
* fix: handle invalid regex patterns in filter_progress_bar function

* Update rdagent/utils/__init__.py
2025-02-11 18:07:16 +08:00
Yuante Li 75f29f0dd9 refine the code in hypo&task generating (#578) 2025-02-10 22:09:42 +08:00
Yuante Li 345a702501 fix: fix the errors in the coder and evaluator of the five components (#576)
* refine the prompt in feat coder

* refine data loader prompt in coder & eval

* fix

* fix

* refine model prompt in coder & eval

* refine ensemble prompt in coder & eval

* refine workflow prompt in coder & eval

* fix
2025-02-10 20:20:30 +08:00
Yuante Li d2baa40fb1 add the none check for data loader & feature output (#577) 2025-02-10 20:18:01 +08:00
XianBW 216361c640 score chart error catch (#575) 2025-02-10 12:19:29 +08:00
you-n-g 904f4b8523 refactor: Use file dictionaries for diff generation in feedback module (#574) 2025-02-10 09:03:13 +08:00
you-n-g 59337a9050 fix: add retry mechanism for GPU device check in DockerEnv (#573)
* fix: add retry mechanism for GPU device check in DockerEnv

* lint

* my py linting

* refactor: Improve type annotations and retry logic in workflow utils

* fix syntax
2025-02-10 08:59:46 +08:00
you-n-g 0db49991cb feat: add retry mechanism with wait_retry decorator and refactor diff generation (#572) 2025-02-10 01:35:54 +08:00
Yuante Li 34bf87c410 refine the logic in feedback (#571) 2025-02-08 21:14:30 +08:00
XianBW f37ec32981 text change (#568) 2025-02-08 21:14:13 +08:00
Haoran Pan f8a4d2a7b5 update qrcode (#570) 2025-02-08 20:48:19 +08:00
you-n-g cefef61d0e feat: diff mode fix (#569)
* feat: Add last runnable experiment feedback retrieval and improve diff generation

* lint
2025-02-08 20:13:38 +08:00
you-n-g 3090718ca3 fix: include data information in cache key generation (#566) 2025-02-08 20:05:57 +08:00
XianBW 7eb7f49f52 fix: add scores.csv checking in ensemble_test (#567)
* add scores.csv checking in ensemble_test

* text modify
2025-02-08 19:03:29 +08:00
Tim c255b79da4 chore: format check result (#565)
* format check result placed next to the metric result

* reformat
2025-02-08 18:53:16 +08:00
Tim 94d0eca0ca support multiple types in feature engineering (#562) 2025-02-08 15:21:11 +08:00
XianBW bfdee6b692 add time info and stdout window (#563) 2025-02-07 22:00:45 +08:00
Yuante Li 732839e4bd feat: add the shape of the CSV to the dataset description (#561)
* add csv's shape info to data description

* fix CI
2025-02-07 18:12:18 +08:00
XianBW 98a0801a32 fix bugs (#560) 2025-02-07 11:00:18 +08:00
you-n-g e1f86d7ca0 fix: add stdout context length setting and improve text shrinking logic (#559)
* feat: Add stdout context length setting and improve text shrinking logic

* lint
2025-02-06 23:00:15 +08:00
you-n-g 5c7ceec37f fix: fix task return dict with wrong format (#558)
* refactor: Simplify exp_gen and enhance workflow with init_kwargs_update_func

* fix: Correct type hint for init_kwargs_udpate_func parameter

* lint

* lint

* lint

* lint
2025-02-06 19:24:14 +08:00
Tim 723a3f4225 fix: keep some txt files (#557)
* keep some txt files

* reformat
2025-02-06 18:01:15 +08:00
Xu Yang b2d56e39e5 fix: move mlebench check into runner (#556)
* abandon mlebench check in workflow

* move mlebench check to runner and put it into the exp
2025-02-06 15:37:41 +08:00
XianBW 0e447a3a19 feat: multi log folder, replace "epxx" in workspace path (#555)
* multi log folder, replace "epxx" in workspace path

* valid trace path

* hypothesis show change

* fix CI

* add total stat in all summary page
2025-02-06 15:14:34 +08:00
you-n-g e937f8710c feat: exclude invalid session log folder (#554)
* refactor: Add is_valid_session check in save_all_grade_info

* refactor: Use is_valid_session to check log trace validity
2025-02-06 09:56:34 +08:00
XianBW b1fce69153 fix: change summary info of log folder (#552)
* update stat data in log summary

* show logic change

* add workspace None judgement

* fix CI
2025-02-05 16:31:30 +08:00
XianBW b092c24374 fix: trace summary df showing in dsapp (#551)
* fix trace summary df show

* fix ci
2025-02-05 10:48:25 +08:00
you-n-g 1678461f5a fix: handle division by zero in percentage calculations (#550)
* fix: Handle division by zero in percentage calculations

* lint
2025-02-05 10:21:53 +08:00
you-n-g 35e3156018 fix: replace API call with build_cls_from_json_with_retry function (#548)
* refactor: Replace API call with build_cls_from_json_with_retry function

* fix lint error

* fix lint errors

* lint

* trigger
2025-01-27 20:19:11 +08:00
Xu Yang 611fb28c58 fix: refine prompt to generate the most simple task in init stage (#546)
* refine prompt to generate the most simple task in init stage

* feature test dtype check improve
2025-01-27 00:51:40 +08:00
XianBW 10abb20117 feat: add mlebench submission validitor (#545)
* add mlebench submission check

* fix CI

* fix bug
2025-01-27 00:41:35 +08:00
you-n-g 6e96cff435 fix: fix submission file search and add TODO in env.py (#544) 2025-01-26 17:08:59 +08:00
XianBW fcf17d3292 fix summary loop_num count (#543) 2025-01-26 11:58:12 +08:00
you-n-g 4235440ff4 feat: Dynamically find and use sample submission file in eval tests (#542) 2025-01-24 18:16:15 +08:00
Tim 111dddda18 chore: rename ens_and_decision (#541)
* rename ens_and_decision

* clarify workflow prompt

* rename
2025-01-24 17:24:31 +08:00
Xu Yang 4b25dd1913 fix score bug and refine restart strategy (#540) 2025-01-24 16:02:21 +08:00
you-n-g 2453a6bff7 feat: add timeout settings and cleanup step in data science runner (#539)
* feat: Add timeout settings and cleanup step in data science runner

* lint
2025-01-24 15:03:21 +08:00
you-n-g f596e59bd8 feat: add configurable volume mode for Docker volumes in env.py (#537)
* feat: Add configurable volume mode for Docker volumes in env.py

* fix: Change default extra_volume_mode to read-only in DockerConf
2025-01-24 14:08:38 +08:00
Xu Yang cb5127735f feat: add restart and fix unzip (#538)
* add restart function

* update

* fix ci

* update code

* fix restart

---------

Co-authored-by: yuanteli <1957922024@qq.com>
Co-authored-by: Xu Yang <xuyang1@microsoft.com>
2025-01-24 13:34:47 +08:00
XianBW 993f16a089 fix ui on new log trace (#536) 2025-01-24 12:40:56 +08:00
you-n-g 90ffb6cc8a fix: add DSExperiment type check and directory validation in log proc… (#535)
* fix: Add DSExperiment type check and directory validation in log processing

* style: Reformat FileNotFoundError message for readability
2025-01-24 00:03:41 +08:00
XianBW 17526da856 fix: filter empty log traces in ds UI (#533)
* filter empty log traces

* fix CI
2025-01-23 18:01:30 +08:00
XianBW eb597924b2 feat: base data science scenario UI (#525)
* base data science ui

* fix bug

* fix mle grade

* not cache when mle prepare

* fix

* fix grade sample

* fix a small bug

* fix

* cache mle score

* fix

* add gen_mle_score script

* update for mle score

* simple debug show

* small change

* summary folder

* add evo loop tag

* add loop id

* add comment

* fix CI

* add enable_cache for docker conf

* CI

* use setting data path

* fix ui bug

---------

Co-authored-by: yuanteli <1957922024@qq.com>
2025-01-23 16:12:22 +08:00
Xu Yang e5b1912bfd fix inject code bug and improve dataloader spec code (#532) 2025-01-23 13:24:44 +08:00
Xu Yang f19a91abfc fix minor bug in feature test (#531) 2025-01-23 10:15:21 +08:00
Xu Yang 7ff55f0013 update all (#530) 2025-01-22 22:22:48 +08:00
you-n-g 17a901e8da feat: Enhance eval script with file cleanup and detailed submission checks (#529) 2025-01-22 21:51:34 +08:00
Tim 1a19622add chore: clean unused scripts (#528)
* clean unused scripts

* reformat
2025-01-22 14:21:08 +08:00
Xu Yang 7cfeaff95b add former task to exp_gen (#527) 2025-01-22 12:15:20 +08:00
Tim a355b57623 chore: add runtime info (#526)
* add runtime info

* Update rdagent/scenarios/data_science/scen/__init__.py

Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>

* reformatted by black

---------

Co-authored-by: you-n-g <you-n-g@users.noreply.github.com>
2025-01-21 16:15:45 +08:00
Yuante Li 14f7fc5e53 fix a small bug (#524) 2025-01-20 12:19:21 +08:00
you-n-g 7f4c2d18c6 feat: refactor for general data science (#498)
* refine ds modal for more cases: eval and es

* update model template

* prompts for model and ensemble

* fix a bug

* fix a bug

* init: ds workflow evovingstrategy

* Adding ensemble (#505)

* Initial Draft

* Updating logic for init

* Revising

* Successful Testing

* Updating to use the latest & right class

* bug: bug-fixing for testing

* data science loop changes

* data science loop base

* ds loop feedback

* fix

* remove measure_time because it's duplicated (in LoopBase)

* add the knowledge query for data_loader & feature

* edit ds workflow evaluator

* data_loader bug fix

* stop evolving when all tasks completed

* llm app change

* fix break all complete strategy

* Adding queried knowledge (#508)

Co-authored-by: XianBW <36835909+XianBW@users.noreply.github.com>

* fix loop bug

* ds workflow evaluator; test; refine prompts

* workflow spec

* fix ci

* feature task changes

* ds loop change

* fix a bug in feat

* add query knowledge for model and workflow

* llm_debug info(for show) using pickle instead of json

* remove NextLoopException

* loop change

* coder raise CoderError when all sub_tasks failed

* rename code_dict to file_dict in FBWorkspace

* add CoSTEER unittest

* now show self.version in Task.get_task_information(), simplify CoSTEER sub tasks definition

* remove some properties in ModelTask, add model_type in it.

* fix llm app bug

* llm web app bug fix

* ds loop bug fix

* fix: give component code to feature&ens eval

* loop catch error bug

* rename load_from_raw_data to load_data

* feat: Add debug data creation functionality for data science scenarios

* support local folder (#511)

* support local folder

* remove unnecessary random

* KaggleScen Subclass

* small fix

* use template for style description

* update default scen to kaggle

* update sample data script

* make sure frac < 1

* fix a bug

* feature spec changes

* fix

* changeimport order

* clear unnecessary std outputs

* fix a typo

* create sample folder after unzip kaggle data

* feature/model test script update

* Align the data types across modules.

* fix a bug in model eval

* show line number

* move sample entry point to app

* spec & model prompt changes

* Refine the competition specification to address the data type problem and the coherence issue.

* fix some bugs

* add file filter in FBworkspace.code property

* support non-binary prediction

* avoid too much warnings

* fix a bug in ensemble module

* filtered the knowledge query in all modules

* delete RAG in idea proposal

* refine the code in ensemble

* show exp workspace in llm_st

* exp_gen bug fix

* feedback bug fix

* use `feature` instead of `feat01`

* Trace & method of judging if exp is completed change

* fix a bug in package calling and execute ci

* fix code

* bug fix

* bug fix

* fix a bug

* fix some bugs

* fix a bug

* refactor: Enhance error handling and feedback in data science loop

* support different use_azure on chat and embedding models

* multi-model proposal logic

* fix a small syntax error

* loopBase and some changes

* ensemble scores change

* fbworkspace.code -> .all_codes

* use all model codes in workflow coder

* check scores.csv's keys(model_names)

* model name changes

* add a todo in  ensemble test

* sota_exp changes

* give model info in exp gen

* add runner time limit

* config using debug data or not in evals

* exp to feedback base

* add feature code when writing model task

* small problem

* copying during sampling

* update

* refactor: Simplify code handling and improve workspace management

* model part output fix

* print model's execution time

* bug fix

* ensemble test fix

* ens small change

* ens_test bug fix

* Refine partial expansion logic to display only a few subfolders when their structure is uniform, improving readability in nested directories.

* several update on prompts

* sample subfolders

* Filter the stdout after code execution to remove irrelevant information e.g. progress bars, whitespace characters, excessive line breaks.

* Add some more prompts and comments

* several update on the first init rounds

* model timeout as error

* fix pattern of getting model codes in workspace

* small bux fix on model prompts

* remove get_code_with_key since we have regex pattern

* fix: Correct tqdm progress bar update logic in LoopBase class

* feat: Add diff generation and enhance feedback mechanism in data science loop

* update some fix to model and workflow prompts

* refine the logic of progress bar filter

* add last_successful_exp in exp_gen

* fix a one line bug

* add a hint in prompt

* fix data sample for bms

* fix data sample for bms

* hypothesis small fix

* crawler readme update

* fix component gen

* fix bug

* annotation change

* load description.md if it exists

* refactor: Simplify SOTA description handling in feedback and prompts

* refactor: Use shared templates for feedback and experiment descriptions

* change webapp for model codes changes

* update proposal

* add timeout message for docker run output

* fix

* refine the code in docker time processing

* use .shape instead of len() when do shape eval

* won't change size during iteration

* support bson sample

* sample support jsonl and bson

* add former_code to coder prompts

* a little speed us in debug data creating

* filter progress bar when eval ens and main

* avoid costeer makes no change to former code

* fix several log error

* add timeout judge threshold

* fix some bugs in the evaluation of component output shapes

* File structure for supporting litellm (#517)

Co-authored-by: Young <afe.young@gmail.com>

* ignore submission and show processing

* ignore submission and show processing

* add efficiency notice

* refactor: Enhance error message with detailed feedback summary

* refactor: Simplify component handling in DSExpGen class

* refactor: Update code structure and add docstring for clarity

* reserve one sample to each label in data sampling

* add Evaluation info

* refine costeer code to avoid giving same code twice

* use raw_description as plain text

* add a prompt hint to avoid same dict key

* model task name bug in first model exp gen

* fix a typo

* add some debug info in costeer tests

* task init change

* enhance data sampling

* refine the code in data_loader

* more reasonable loop

* fix a bug in data folder description

* add error msg & traceback to execution feedback

* fix llm error msg detection

* add task information to costeer eval & add cache to docker run(use zipfile to store the whole workspace)

* fix CI first round

* fix CI second round

* use txt to store test script to avoid pytest

* remove zipfile in requirements

* add azure.identity to requirements

* ignore debug web page

* component test changes

* remove redundent task_desc in model coder

* feat: Add APE module and prompts for automated prompt engineering

* fix: Update .gitignore and improve text formatting in eval.py

* refactor: Update print output and improve code comments and imports

* style: Fix string formatting and import order in ape.py and fmt.py

* exclude ape

* add a data folder notice

* reduce unnecessary output to stdout

* refine the code of describe_data_folder

* fix ci

* style: streamlit style update (#522)

* streamlit style update

* fix import

* fix format

* fix llm_st loop progress bar

* debugapp small change

* fix model str

* refine some prompts

* fix model str

* fix CI

* refine the logic associated with the data_folder

* fix ci

* small change

* set filter_progress_bar as default in execute

* model proposal with workflow

* add submission check in workflow eval

* fix bug

* small change

* fix CI

* fix CI

* refactor: Move generate_diff to utils and update DSExpGen logic

* more reasonable prompt describing metric direction

* fix a minor jinja2 bug

* quick fix exp_gen bugs

* fix the following bug

* fix

* fix some bugs

* remove workflow from model

* add pending_tasks_list in data science to enable coding model and workflow

* refine the code for handling JSON-formatted data descriptions

* assert with information

* ensure correct csv file name

* add logging to help record the output

* log competition

* add log tag for debug llm app

* test: Test ds refactor ll (#523)

* fix bugs to former scenario

* fix a bug because coding in rdloop changed

* fix the bug when feedback gets no hypothesis

* fix trace structure

* change all trace hist when merging hypothesis to experiments

* ignore some error in ruff

* fix kaggle scenario bugs

* refine one line

* another bug

* another small bug

* fix ui bugs

* chage kaggle  train.py path

---------

Co-authored-by: Xu Yang <peteryang@vip.qq.com>

* fix CI

* Update rdagent/app/data_science/loop.py

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* add samplecsv into spec prompts

* fix CI

---------

Co-authored-by: TPLin22 <tplin2@163.com>
Co-authored-by: yuanteli <1957922024@qq.com>
Co-authored-by: Xisen Wang <118058822+xisen-w@users.noreply.github.com>
Co-authored-by: Bowen Xian <xianbowen@outlook.com>
Co-authored-by: Xu Yang <peteryang@vip.qq.com>
Co-authored-by: XianBW <36835909+XianBW@users.noreply.github.com>
Co-authored-by: Tim <illking@foxmail.com>
Co-authored-by: 炼金术师华华 <37462254+YeewahChan@users.noreply.github.com>
Co-authored-by: Linlang <30293408+SunsetWolf@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-01-17 22:53:05 +08:00
Haoran Pan d1fdfe10ea update new qr group code (#521) 2025-01-14 17:25:06 +08:00
Xu Yang 4546ebba98 Update factor_runner.py to ignore failed implementation (#514) 2025-01-02 23:29:52 +08:00
Yuante Li dd600c0b0c docs: update WeChat QR code on Dec 31, 2024 (#513) 2024-12-31 14:01:17 +08:00
Haoran Pan 0a89784116 fix: avoid warning for missing llama installation when not in use (#509)
* Update llm_utils to check llama use

* modify the logic of the condition
2024-12-20 17:54:13 +08:00
Haoran Pan cb66555a9c fix: a default conf in scen qlib (#503) 2024-12-10 18:07:19 +08:00
Haoran Pan 1a5aaf3fea update wechat qrcode at Dec 2nd (#502) 2024-12-03 14:07:26 +08:00
Haoran Pan cff2d79c42 fix bug in model evaluator final feedback ignoring shape feedback (#501) 2024-12-03 13:55:28 +08:00
Linlang ea85d5efc8 chore: fix PR template (#487)
* fix PR template

* subfolders of the log displayed on the web page

* fix code error

* add health check

* reformat with isort

* reformat with black

* update README

* fix bug && experience confusing

* reformat with black & update health check code

* reformat with isort

* reformat with black

* update README.md

* Removed duplicates in documentation and health_check && Upgraded code for filtering folders

* update docs

* reformat with black
2024-11-28 15:35:13 +08:00
you-n-g c3f78f8bce feat: run benchmark on gpt-4o & llama 3.1 (#497)
* Run benchmark on gpt-4o & llama 3.1

* update link
2024-11-26 12:02:09 +08:00
Xu Yang d54e14f1d9 very small fix (#496) 2024-11-25 20:08:05 +08:00
Xu Yang b7fcb13c33 feat: a unified CoSTEER to fit more scenarios (#491)
* Use ExtendedBaseSettings to replace BaseSettings

* update a more general way to pass the default setting

* update all code

* fix CI

* fix CI

* fix qlib scenario

* fix CI

* fix CI

* fix CI & add data science interfaces

* remove redundant code

* abandon costeer knowledge base v1

---------

Co-authored-by: Xu Yang <xuyang1@microsoft.com>
Co-authored-by: XianBW <36835909+XianBW@users.noreply.github.com>
2024-11-25 16:27:34 +08:00
you-n-g e1032b6a31 fix: patching weird azure deployment (#494)
* patching weird azure deployment

* Auto link
2024-11-25 13:47:21 +08:00
Haoran Pan ca46d11123 update qr_code (#492) 2024-11-22 13:16:45 +08:00
you-n-g f9bd19179f feat: kaggle refactor (#489)
* init trail

* Add spec info

* auto unzip mlebench prepared data for out scenario

* successfully run example

* successfully run main

* simplify load traing

* extract load_from_raw_data

* split the fies(still buggy)
It should stop on ~20 epoch and reach the end

* some changes

* Fix bug to run example

* (success) until feature

* refine model and ensemble

* add metrics in ens.py

* update README &  spec.md

* ens change

* fix ens bug

* Delete rdagent/scenarios/kaggle/tpl_ex/aerial-cactus-identification/train.py

* add template_path in KG_conf

* fix test kaggle

* CI

* make test_import not check kaggle template codes

---------

Co-authored-by: Bowen Xian <xianbowen@outlook.com>
2024-11-20 17:01:18 +08:00
you-n-g ae8fc773cb feat: new-york-city-taxi-fare-prediction_template (#488)
* copy init version

* feat: new-york-city-taxi-fare-prediction_template

* add move to linear model

* Add more details about docker

* auto lint

* auto lint with new black
2024-11-15 16:47:44 +08:00
Xu Yang 8662211492 feat: align mlebench data and evaluation & several fix on kaggle workflow (#477)
* several improvement on kaggle loop

* small refinement on prompt

* fix bugs

* add the score of each model in every experiment

* fix ci error

* fix error in ventilator tpl

* fix CI

---------

Co-authored-by: Xu Yang <xuyang1@microsoft.com>
Co-authored-by: Bowen Xian <xianbowen@outlook.com>
Co-authored-by: WinstonLiye <1957922024@qq.com>
Co-authored-by: TPLin22 <tplin2@163.com>
2024-11-15 15:40:22 +08:00
XianBW 892283dc89 feat: template changes for some kaggle competitions (#484)
* change tpl metric codes

* change tpl
2024-11-12 11:24:01 +08:00
Linlang 76b8f073e4 update QR (#483) 2024-11-11 23:41:48 +08:00
XianBW fe7eb4cbe1 add kaggle tpl (#482) 2024-11-11 22:31:32 +08:00
XianBW 8c4c53339c feat: (Kaggle) add base template for competition: tabular-playground-series-may-2022 (#481)
* add tpl kaggle

* CI
2024-11-11 21:18:07 +08:00
Linlang ef66c56c2b docs: fix url in docs (#478)
* Fix the links in documents don't jump properly

* recover badge
2024-11-08 14:19:06 +08:00
Yuante Li e512d08439 docs: fix a bug in the document (#466)
* fix a bug

* edit guidance to run kaggle application

* update docs

* optimize docs

* read RTD badge

---------

Co-authored-by: TPLin22 <tplin2@163.com>
Co-authored-by: Linlang <Lv.Linlang@hotmail.com>
2024-11-08 13:55:24 +08:00
dependabot[bot] c6304add4a build(actions): bump actions/setup-node from 3 to 4 (#425)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3 to 4.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-06 13:17:50 +08:00
Xu Yang 90d9cdd0e9 feat(kaggle): several update in kaggle scenarios (#476)
* udpate plot

* log and reduce token

* trace tag

* add simple_background parameter to get_scenario_all_desc

* update trace

* update first version code

* chat model map

* add annotation for stack index

* add annotation

* reformatted by black

* several update on kaggle scenarios

* update some new change

* fix CI

* fix CI

* fix a bug

* fix bugs in graph RAG

---------

Co-authored-by: Tim <illking@foxmail.com>
2024-11-06 13:14:35 +08:00
Yuante Li bf719e0993 feat: add a new competition (#474)
* add tabular-playground-series-dec-2021

* finished

* fix a mistake

* fix a bug

* fix a bug
2024-11-05 20:42:20 +08:00
Yuante Li 1726caa414 feat: end-to-end optimization (#473)
* fix

* refine the code

* aligned data with MLE Kaggle competition dataset

* fix ci error

* fix ci
2024-11-05 15:41:50 +08:00
Xu Yang 25af7e6cce fix a bug (#470) 2024-11-04 15:05:05 +08:00
Linlang cbbbb4e9a5 fix: unzip kaggle data (#464)
* unzip kaggle data

* read local_data_path from .env file

* fix build docs error

* recover azure-identity packages

* optimize code logic

* add error when downloading data from kaggle

---------

Co-authored-by: Xu Yang <peteryang@vip.qq.com>
2024-11-04 14:57:10 +08:00
WinstonLiyt 450317d8fe fix a bug in kaggle runner cache and kaggle costeer execute template (#467) 2024-11-04 11:16:16 +08:00
Haoran Pan d62407cfbb docs: correct some mistakes in Kaggle scenario guidance (#465)
* update readme correct some mistakes in guide

* update the doc

---------

Co-authored-by: WinstonLiye <1957922024@qq.com>
2024-11-01 17:33:59 +08:00
WinstonLiyt 09325aed89 feat: refine logic for qlib_factor_from_report (#463)
* fix a bug in kaggle conf

* fix a ci error

* refine logic for qlib_factor_from_report
2024-10-31 16:04:32 +08:00
Haoran Pan e0ce86b180 docs: update readme (#462)
* update readme

* update some concrete description

* update quick start
2024-10-31 12:49:38 +08:00
XianBW 2c206e9ce5 docs: some changes in kaggle doc (#461)
* add kaggle scenario description for webapp

* catch download button error

* change kaggle auto_submit to False default

* Added guidance for custom templates in kaggle doc

* CI

* CI

* add kaggle data set instruction(NOTE)

* delete repeated description for kaggle scenario

---------

Co-authored-by: TPLin22 <tplin2@163.com>
2024-10-30 17:00:56 +08:00
WinstonLiyt 80e4a2aa79 fix: fix a bug in kaggle conf (#459)
* fix a bug in kaggle conf

* fix a ci error
2024-10-29 15:13:18 +08:00
Haoran Pan 3da6af95bd add docs for scen catalog (#458) 2024-10-29 11:08:15 +08:00
Haoran Pan 62beb3a7ae fix: templates bug (#456)
* Update model_nn.py

* ci issue
2024-10-28 14:22:04 +08:00
Haoran Pan a7ec1485a7 docs: improve kaggle scenario description (#455)
* add docs

* add docs

* add docs for roadmap & guide

* edit roapmap format

* edit design image
2024-10-26 00:03:59 +08:00
dependabot[bot] 992956db8e build(requirements): bump the prod group across 1 directory with 164 updates (#443)
* build(requirements): bump the prod group across 1 directory with 164 updates

Bumps the prod group with 164 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [pydantic-settings](https://github.com/pydantic/pydantic-settings) | `2.1.0` | `2.6.0` |
| [cython](https://github.com/cython/cython) | `3.0.7` | `3.0.11` |
| [scipy](https://github.com/scipy/scipy) | `1.11.4` | `1.14.1` |
| [python-levenshtein](https://github.com/rapidfuzz/python-Levenshtein) | `0.25.1` | `0.26.0` |
| [scikit-learn](https://github.com/scikit-learn/scikit-learn) | `1.5.1` | `1.5.2` |
| [filelock](https://github.com/tox-dev/py-filelock) | `3.13.1` | `3.16.1` |
| [fire](https://github.com/google/python-fire) | `0.5.0` | `0.7.0` |
| [openai](https://github.com/openai/openai-python) | `1.6.1` | `1.52.0` |
| [ruamel-yaml]() | `0.18.5` | `0.18.6` |
| [torch](https://github.com/pytorch/pytorch) | `2.1.2` | `2.5.0` |
| [torch-geometric](https://github.com/pyg-team/pytorch_geometric) | `2.5.3` | `2.6.1` |
| [numpy](https://github.com/numpy/numpy) | `1.26.2` | `2.1.2` |
| [pandas](https://github.com/pandas-dev/pandas) | `2.1.4` | `2.2.3` |
| [matplotlib](https://github.com/matplotlib/matplotlib) | `3.9.1` | `3.9.2` |
| [langchain](https://github.com/langchain-ai/langchain) | `0.0.353` | `0.3.4` |
| [langchain-community](https://github.com/langchain-ai/langchain) | `0.0.7` | `0.3.3` |
| [tiktoken](https://github.com/openai/tiktoken) | `0.7.0` | `0.8.0` |
| [pymupdf](https://github.com/pymupdf/pymupdf) | `1.24.9` | `1.24.11` |
| [azure-identity](https://github.com/Azure/azure-sdk-for-python) | `1.17.1` | `1.19.0` |
| [pypdf](https://github.com/py-pdf/pypdf) | `3.17.4` | `5.0.1` |
| [azure-core](https://github.com/Azure/azure-sdk-for-python) | `1.29.6` | `1.31.0` |
| [azure-ai-formrecognizer](https://github.com/Azure/azure-sdk-for-python) | `3.3.2` | `3.3.3` |
| [statsmodels](https://github.com/statsmodels/statsmodels) | `0.14.2` | `0.14.4` |
| [tables](https://github.com/PyTables/PyTables) | `3.9.2` | `3.10.1` |
| [tree-sitter-python](https://github.com/tree-sitter/tree-sitter-python) | `0.21.0` | `0.23.2` |
| [tree-sitter](https://github.com/tree-sitter/py-tree-sitter) | `0.22.3` | `0.23.1` |
| [jupyter](https://jupyter.org) | `1.0.0` | `1.1.1` |
| [python-dotenv](https://github.com/theskumar/python-dotenv) | `1.0.0` | `1.0.1` |
| [setuptools-scm](https://github.com/pypa/setuptools_scm) | `8.0.4` | `8.1.0` |
| [sphinx](https://github.com/sphinx-doc/sphinx) | `7.2.6` | `8.1.3` |
| [furo](https://github.com/pradyunsg/furo) | `2023.9.10` | `2024.8.6` |
| [importlib-metadata](https://github.com/python/importlib_metadata) | `7.0.1` | `8.5.0` |
| [aiohttp](https://github.com/aio-libs/aiohttp) | `3.9.1` | `3.10.10` |
| [alabaster](https://github.com/sphinx-doc/alabaster) | `0.7.13` | `1.0.0` |
| [annotated-types](https://github.com/annotated-types/annotated-types) | `0.6.0` | `0.7.0` |
| [anyio](https://github.com/agronholm/anyio) | `4.2.0` | `4.6.2.post1` |
| [attrs](https://github.com/sponsors/hynek) | `23.2.0` | `24.2.0` |
| [autodoc-pydantic](https://github.com/mansenfranzen/autodoc_pydantic) | `2.0.1` | `2.2.0` |
| [babel](https://github.com/python-babel/babel) | `2.14.0` | `2.16.0` |
| [beautifulsoup4](https://www.crummy.com/software/BeautifulSoup/bs4/) | `4.12.2` | `4.12.3` |
| [black](https://github.com/psf/black) | `23.12.1` | `24.10.0` |
| [build](https://github.com/pypa/build) | `1.0.3` | `1.2.2.post1` |
| [certifi](https://github.com/certifi/python-certifi) | `2023.11.17` | `2024.8.30` |
| [cffi](https://github.com/python-cffi/cffi) | `1.16.0` | `1.17.1` |
| [charset-normalizer](https://github.com/Ousret/charset_normalizer) | `3.3.2` | `3.4.0` |
| [contourpy](https://github.com/contourpy/contourpy) | `1.2.1` | `1.3.0` |
| [coverage](https://github.com/nedbat/coveragepy) | `7.4.0` | `7.6.4` |
| [cryptography](https://github.com/pyca/cryptography) | `41.0.7` | `43.0.3` |
| [dataclasses-json](https://github.com/lidatong/dataclasses-json) | `0.6.3` | `0.6.7` |
| [debugpy](https://github.com/microsoft/debugpy) | `1.8.2` | `1.8.7` |
| [dill](https://github.com/uqfoundation/dill) | `0.3.8` | `0.3.9` |
| [docutils](https://docutils.sourceforge.io) | `0.20.1` | `0.21.2` |
| [executing](https://github.com/alexmojaki/executing) | `2.0.1` | `2.1.0` |
| [fonttools](https://github.com/fonttools/fonttools) | `4.53.1` | `4.54.1` |
| [fsspec](https://github.com/fsspec/filesystem_spec) | `2023.12.2` | `2024.10.0` |
| [git-changelog](https://github.com/pawamoy/git-changelog) | `2.4.0` | `2.5.2` |
| [greenlet](https://github.com/python-greenlet/greenlet) | `3.0.3` | `3.1.1` |
| [httpcore](https://github.com/encode/httpcore) | `1.0.2` | `1.0.6` |
| [httpx](https://github.com/encode/httpx) | `0.26.0` | `0.27.2` |
| [idna](https://github.com/kjd/idna) | `3.6` | `3.10` |
| [ipython](https://github.com/ipython/ipython) | `8.26.0` | `8.28.0` |
| [ipywidgets](https://github.com/jupyter-widgets/ipywidgets) | `8.1.3` | `8.1.5` |
| [isodate](https://github.com/gweis/isodate) | `0.6.1` | `0.7.2` |
| [jaraco-classes](https://github.com/jaraco/jaraco.classes) | `3.3.0` | `3.4.0` |
| [jinja2](https://github.com/pallets/jinja) | `3.1.2` | `3.1.4` |
| [jsonpointer](https://github.com/stefankoegl/python-json-pointer) | `2.4` | `3.0.0` |
| [jsonschema-specifications](https://github.com/python-jsonschema/jsonschema-specifications) | `2023.12.1` | `2024.10.1` |
| [jupyter-client](https://github.com/jupyter/jupyter_client) | `8.6.2` | `8.6.3` |
| [jupyterlab](https://github.com/jupyterlab/jupyterlab) | `4.2.4` | `4.2.5` |
| [jupyterlab-widgets](https://github.com/jupyter-widgets/ipywidgets) | `3.0.11` | `3.0.13` |
| [keyring](https://github.com/jaraco/keyring) | `24.3.0` | `25.4.1` |
| [kiwisolver](https://github.com/nucleic/kiwi) | `1.4.5` | `1.4.7` |
| [langchain-core](https://github.com/langchain-ai/langchain) | `0.1.4` | `0.3.12` |
| [langsmith](https://github.com/langchain-ai/langsmith-sdk) | `0.0.75` | `0.1.136` |
| [levenshtein](https://github.com/rapidfuzz/Levenshtein) | `0.25.1` | `0.26.0` |
| [livereload](https://github.com/lepture/python-livereload) | `2.6.3` | `2.7.0` |
| [lxml](https://github.com/lxml/lxml) | `5.0.0` | `5.3.0` |
| [markupsafe](https://github.com/pallets/markupsafe) | `2.1.3` | `3.0.2` |
| [marshmallow](https://github.com/marshmallow-code/marshmallow) | `3.20.1` | `3.23.0` |
| [mdit-py-plugins](https://github.com/executablebooks/mdit-py-plugins) | `0.4.0` | `0.4.2` |
| [more-itertools](https://github.com/more-itertools/more-itertools) | `10.1.0` | `10.5.0` |
| [msal](https://github.com/AzureAD/microsoft-authentication-library-for-python) | `1.30.0` | `1.31.0` |
| [msgpack](https://github.com/msgpack/msgpack-python) | `1.0.8` | `1.1.0` |
| [multidict](https://github.com/aio-libs/multidict) | `6.0.4` | `6.1.0` |
| [mypy](https://github.com/python/mypy) | `1.10.0` | `1.12.1` |
| [myst-parser](https://github.com/executablebooks/MyST-Parser) | `2.0.0` | `4.0.0` |
| [ndindex](https://github.com/Quansight-Labs/ndindex) | `1.8` | `1.9.2` |
| [networkx](https://github.com/networkx/networkx) | `3.2.1` | `3.4.1` |
| [nh3](https://github.com/messense/nh3) | `0.2.15` | `0.2.18` |
| [notebook](https://github.com/jupyter/notebook) | `7.2.1` | `7.2.2` |
| [nvidia-cublas-cu12](https://developer.nvidia.com/cuda-zone) | `12.1.3.1` | `12.6.3.3` |
| [nvidia-cuda-cupti-cu12](https://developer.nvidia.com/cuda-zone) | `12.1.105` | `12.6.80` |
| [nvidia-cuda-nvrtc-cu12](https://developer.nvidia.com/cuda-zone) | `12.1.105` | `12.6.77` |
| [nvidia-cuda-runtime-cu12](https://developer.nvidia.com/cuda-zone) | `12.1.105` | `12.6.77` |
| [nvidia-cudnn-cu12](https://developer.nvidia.com/cuda-zone) | `8.9.2.26` | `9.5.0.50` |
| [nvidia-cufft-cu12](https://developer.nvidia.com/cuda-zone) | `11.0.2.54` | `11.3.0.4` |
| [nvidia-curand-cu12](https://developer.nvidia.com/cuda-zone) | `10.3.2.106` | `10.3.7.77` |
| [nvidia-cusolver-cu12](https://developer.nvidia.com/cuda-zone) | `11.4.5.107` | `11.7.1.2` |
| [nvidia-cusparse-cu12](https://developer.nvidia.com/cuda-zone) | `12.1.0.106` | `12.5.4.2` |
| [nvidia-nccl-cu12](https://developer.nvidia.com/cuda-zone) | `2.18.1` | `2.23.4` |
| [nvidia-nvjitlink-cu12](https://developer.nvidia.com/cuda-zone) | `12.3.101` | `12.6.77` |
| [nvidia-nvtx-cu12](https://developer.nvidia.com/cuda-zone) | `12.1.105` | `12.6.77` |
| [packaging](https://github.com/pypa/packaging) | `23.2` | `24.1` |
| [pillow](https://github.com/python-pillow/Pillow) | `10.4.0` | `11.0.0` |
| [pkginfo](https://code.launchpad.net/~tseaver/pkginfo/trunk) | `1.9.6` | `1.11.2` |
| [platformdirs](https://github.com/tox-dev/platformdirs) | `4.1.0` | `4.3.6` |
| [pluggy](https://github.com/pytest-dev/pluggy) | `1.3.0` | `1.5.0` |
| [prometheus-client](https://github.com/prometheus/client_python) | `0.20.0` | `0.21.0` |
| [prompt-toolkit](https://github.com/prompt-toolkit/python-prompt-toolkit) | `3.0.47` | `3.0.48` |
| [psutil](https://github.com/giampaolo/psutil) | `6.0.0` | `6.1.0` |
| [pycparser](https://github.com/eliben/pycparser) | `2.21` | `2.22` |
| [pydantic](https://github.com/pydantic/pydantic) | `2.5.3` | `2.9.2` |
| [pydantic-core](https://github.com/pydantic/pydantic-core) | `2.14.6` | `2.24.2` |
| [pygments](https://github.com/pygments/pygments) | `2.17.2` | `2.18.0` |
| [pyjwt](https://github.com/jpadilla/pyjwt) | `2.8.0` | `2.9.0` |
| [pymupdfb](https://github.com/pymupdf/pymupdf) | `1.24.9` | `1.24.10` |
| [pyparsing](https://github.com/pyparsing/pyparsing) | `3.1.2` | `3.2.0` |
| [pyproject-hooks](https://github.com/pypa/pyproject-hooks) | `1.0.0` | `1.2.0` |
| [pytest](https://github.com/pytest-dev/pytest) | `7.4.4` | `8.3.3` |
| [python-dateutil](https://github.com/dateutil/dateutil) | `2.8.2` | `2.9.0.post0` |
| [pytz](https://github.com/stub42/pytz) | `2023.3.post1` | `2024.2` |
| [pyyaml](https://github.com/yaml/pyyaml) | `6.0.1` | `6.0.2` |
| [pyzmq](https://github.com/zeromq/pyzmq) | `26.0.3` | `26.2.0` |
| [qtconsole](https://github.com/jupyter/qtconsole) | `5.5.2` | `5.6.0` |
| [rapidfuzz](https://github.com/rapidfuzz/RapidFuzz) | `3.9.5` | `3.10.0` |
| [readme-renderer](https://github.com/pypa/readme_renderer) | `42.0` | `44.0` |
| [regex](https://github.com/mrabarnett/mrab-regex) | `2024.7.24` | `2024.9.11` |
| [requests](https://github.com/psf/requests) | `2.31.0` | `2.32.3` |
| [requests-oauthlib](https://github.com/requests/requests-oauthlib) | `1.3.1` | `2.0.0` |
| [rich](https://github.com/Textualize/rich) | `13.7.0` | `13.9.2` |
| [rpds-py](https://github.com/crate-py/rpds) | `0.19.1` | `0.20.0` |
| ruamel-yaml-clib | `0.2.8` | `0.2.12` |
| [ruff](https://github.com/astral-sh/ruff) | `0.4.5` | `0.7.0` |
| [sniffio](https://github.com/python-trio/sniffio) | `1.3.0` | `1.3.1` |
| [soupsieve](https://github.com/facelessuser/soupsieve) | `2.5` | `2.6` |
| [sphinx-autobuild](https://github.com/sphinx-doc/sphinx-autobuild) | `2021.3.14` | `2024.10.3` |
| [sphinx-click](https://github.com/click-contrib/sphinx-click) | `5.1.0` | `6.0.0` |
| [sphinxcontrib-applehelp](https://github.com/sphinx-doc/sphinxcontrib-applehelp) | `1.0.7` | `2.0.0` |
| [sphinxcontrib-devhelp](https://github.com/sphinx-doc/sphinxcontrib-devhelp) | `1.0.5` | `2.0.0` |
| [sphinxcontrib-htmlhelp](https://github.com/sphinx-doc/sphinxcontrib-htmlhelp) | `2.0.4` | `2.1.0` |
| [sphinxcontrib-qthelp](https://github.com/sphinx-doc/sphinxcontrib-qthelp) | `1.0.6` | `2.0.0` |
| [sphinxcontrib-serializinghtml](https://github.com/sphinx-doc/sphinxcontrib-serializinghtml) | `1.1.9` | `2.0.0` |
| [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) | `2.0.24` | `2.0.36` |
| [sympy](https://github.com/sympy/sympy) | `1.12` | `1.13.3` |
| [tenacity](https://github.com/jd/tenacity) | `8.2.3` | `9.0.0` |
| [termcolor](https://github.com/termcolor/termcolor) | `2.4.0` | `2.5.0` |
| [tomlkit](https://github.com/sdispater/tomlkit) | `0.12.3` | `0.13.2` |
| [tornado](https://github.com/tornadoweb/tornado) | `6.4` | `6.4.1` |
| [tqdm](https://github.com/tqdm/tqdm) | `4.66.1` | `4.66.5` |
| [triton](https://github.com/triton-lang/triton) | `2.1.0` | `3.1.0` |
| [twine](https://github.com/pypa/twine) | `4.0.2` | `5.1.1` |
| [typer](https://github.com/fastapi/typer) | `0.9.0` | `0.12.5` |
| [types-psutil](https://github.com/python/typeshed) | `6.0.0.20240621` | `6.0.0.20241011` |
| [types-python-dateutil](https://github.com/python/typeshed) | `2.9.0.20240316` | `2.9.0.20241003` |
| [types-pyyaml](https://github.com/python/typeshed) | `6.0.12.20240724` | `6.0.12.20240917` |
| [typing-extensions](https://github.com/python/typing_extensions) | `4.9.0` | `4.12.2` |
| [tzdata](https://github.com/python/tzdata) | `2023.4` | `2024.2` |
| [urllib3](https://github.com/urllib3/urllib3) | `2.1.0` | `2.2.3` |
| [webcolors](https://github.com/ubernostrum/webcolors) | `24.6.0` | `24.8.0` |
| [widgetsnbextension](http://jupyter.org) | `4.0.11` | `4.0.13` |
| [yarl](https://github.com/aio-libs/yarl) | `1.9.4` | `1.15.5` |
| [zipp](https://github.com/jaraco/zipp) | `3.17.0` | `3.20.2` |
| [exceptiongroup](https://github.com/agronholm/exceptiongroup) | `1.2.0` | `1.2.2` |
| [tomli](https://github.com/hukkin/tomli) | `2.0.1` | `2.0.2` |



Updates `pydantic-settings` from 2.1.0 to 2.6.0
- [Release notes](https://github.com/pydantic/pydantic-settings/releases)
- [Commits](https://github.com/pydantic/pydantic-settings/compare/v2.1.0...v2.6.0)

Updates `cython` from 3.0.7 to 3.0.11
- [Release notes](https://github.com/cython/cython/releases)
- [Changelog](https://github.com/cython/cython/blob/master/CHANGES.rst)
- [Commits](https://github.com/cython/cython/compare/3.0.7...3.0.11)

Updates `scipy` from 1.11.4 to 1.14.1
- [Release notes](https://github.com/scipy/scipy/releases)
- [Commits](https://github.com/scipy/scipy/compare/v1.11.4...v1.14.1)

Updates `python-levenshtein` from 0.25.1 to 0.26.0
- [Release notes](https://github.com/rapidfuzz/python-Levenshtein/releases)
- [Changelog](https://github.com/rapidfuzz/python-Levenshtein/blob/main/HISTORY.md)
- [Commits](https://github.com/rapidfuzz/python-Levenshtein/compare/v0.25.1...v0.26.0)

Updates `scikit-learn` from 1.5.1 to 1.5.2
- [Release notes](https://github.com/scikit-learn/scikit-learn/releases)
- [Commits](https://github.com/scikit-learn/scikit-learn/compare/1.5.1...1.5.2)

Updates `filelock` from 3.13.1 to 3.16.1
- [Release notes](https://github.com/tox-dev/py-filelock/releases)
- [Changelog](https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst)
- [Commits](https://github.com/tox-dev/py-filelock/compare/3.13.1...3.16.1)

Updates `fire` from 0.5.0 to 0.7.0
- [Release notes](https://github.com/google/python-fire/releases)
- [Commits](https://github.com/google/python-fire/compare/v0.5.0...v0.7.0)

Updates `openai` from 1.6.1 to 1.52.0
- [Release notes](https://github.com/openai/openai-python/releases)
- [Changelog](https://github.com/openai/openai-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/openai/openai-python/compare/v1.6.1...v1.52.0)

Updates `ruamel-yaml` from 0.18.5 to 0.18.6

Updates `torch` from 2.1.2 to 2.5.0
- [Release notes](https://github.com/pytorch/pytorch/releases)
- [Changelog](https://github.com/pytorch/pytorch/blob/main/RELEASE.md)
- [Commits](https://github.com/pytorch/pytorch/compare/v2.1.2...v2.5.0)

Updates `torch-geometric` from 2.5.3 to 2.6.1
- [Release notes](https://github.com/pyg-team/pytorch_geometric/releases)
- [Changelog](https://github.com/pyg-team/pytorch_geometric/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pyg-team/pytorch_geometric/compare/2.5.3...2.6.1)

Updates `numpy` from 1.26.2 to 2.1.2
- [Release notes](https://github.com/numpy/numpy/releases)
- [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst)
- [Commits](https://github.com/numpy/numpy/compare/v1.26.2...v2.1.2)

Updates `pandas` from 2.1.4 to 2.2.3
- [Release notes](https://github.com/pandas-dev/pandas/releases)
- [Commits](https://github.com/pandas-dev/pandas/compare/v2.1.4...v2.2.3)

Updates `matplotlib` from 3.9.1 to 3.9.2
- [Release notes](https://github.com/matplotlib/matplotlib/releases)
- [Commits](https://github.com/matplotlib/matplotlib/compare/v3.9.1...v3.9.2)

Updates `langchain` from 0.0.353 to 0.3.4
- [Release notes](https://github.com/langchain-ai/langchain/releases)
- [Commits](https://github.com/langchain-ai/langchain/compare/v0.0.353...langchain==0.3.4)

Updates `langchain-community` from 0.0.7 to 0.3.3
- [Release notes](https://github.com/langchain-ai/langchain/releases)
- [Commits](https://github.com/langchain-ai/langchain/compare/langchain-robocorp==0.0.7...langchain-community==0.3.3)

Updates `tiktoken` from 0.7.0 to 0.8.0
- [Release notes](https://github.com/openai/tiktoken/releases)
- [Changelog](https://github.com/openai/tiktoken/blob/main/CHANGELOG.md)
- [Commits](https://github.com/openai/tiktoken/compare/0.7.0...0.8.0)

Updates `pymupdf` from 1.24.9 to 1.24.11
- [Release notes](https://github.com/pymupdf/pymupdf/releases)
- [Changelog](https://github.com/pymupdf/PyMuPDF/blob/main/changes.txt)
- [Commits](https://github.com/pymupdf/pymupdf/compare/1.24.9...1.24.11)

Updates `azure-identity` from 1.17.1 to 1.19.0
- [Release notes](https://github.com/Azure/azure-sdk-for-python/releases)
- [Changelog](https://github.com/Azure/azure-sdk-for-python/blob/main/doc/esrp_release.md)
- [Commits](https://github.com/Azure/azure-sdk-for-python/compare/azure-identity_1.17.1...azure-identity_1.19.0)

Updates `pypdf` from 3.17.4 to 5.0.1
- [Release notes](https://github.com/py-pdf/pypdf/releases)
- [Changelog](https://github.com/py-pdf/pypdf/blob/main/CHANGELOG.md)
- [Commits](https://github.com/py-pdf/pypdf/compare/3.17.4...5.0.1)

Updates `azure-core` from 1.29.6 to 1.31.0
- [Release notes](https://github.com/Azure/azure-sdk-for-python/releases)
- [Changelog](https://github.com/Azure/azure-sdk-for-python/blob/main/doc/esrp_release.md)
- [Commits](https://github.com/Azure/azure-sdk-for-python/compare/azure-core_1.29.6...azure-core_1.31.0)

Updates `azure-ai-formrecognizer` from 3.3.2 to 3.3.3
- [Release notes](https://github.com/Azure/azure-sdk-for-python/releases)
- [Changelog](https://github.com/Azure/azure-sdk-for-python/blob/main/doc/esrp_release.md)
- [Commits](https://github.com/Azure/azure-sdk-for-python/compare/azure-ai-formrecognizer_3.3.2...azure-ai-formrecognizer_3.3.3)

Updates `statsmodels` from 0.14.2 to 0.14.4
- [Release notes](https://github.com/statsmodels/statsmodels/releases)
- [Changelog](https://github.com/statsmodels/statsmodels/blob/main/CHANGES.md)
- [Commits](https://github.com/statsmodels/statsmodels/compare/v0.14.2...v0.14.4)

Updates `tables` from 3.9.2 to 3.10.1
- [Release notes](https://github.com/PyTables/PyTables/releases)
- [Changelog](https://github.com/PyTables/PyTables/blob/master/RELEASE_NOTES.rst)
- [Commits](https://github.com/PyTables/PyTables/compare/v3.9.2...v3.10.1)

Updates `tree-sitter-python` from 0.21.0 to 0.23.2
- [Commits](https://github.com/tree-sitter/tree-sitter-python/compare/v0.21.0...v0.23.2)

Updates `tree-sitter` from 0.22.3 to 0.23.1
- [Release notes](https://github.com/tree-sitter/py-tree-sitter/releases)
- [Commits](https://github.com/tree-sitter/py-tree-sitter/compare/v0.22.3...v0.23.1)

Updates `jupyter` from 1.0.0 to 1.1.1

Updates `python-dotenv` from 1.0.0 to 1.0.1
- [Release notes](https://github.com/theskumar/python-dotenv/releases)
- [Changelog](https://github.com/theskumar/python-dotenv/blob/main/CHANGELOG.md)
- [Commits](https://github.com/theskumar/python-dotenv/compare/v1.0.0...v1.0.1)

Updates `setuptools-scm` from 8.0.4 to 8.1.0
- [Release notes](https://github.com/pypa/setuptools_scm/releases)
- [Changelog](https://github.com/pypa/setuptools-scm/blob/main/CHANGELOG.md)
- [Commits](https://github.com/pypa/setuptools_scm/compare/v8.0.4...v8.1.0)

Updates `sphinx` from 7.2.6 to 8.1.3
- [Release notes](https://github.com/sphinx-doc/sphinx/releases)
- [Changelog](https://github.com/sphinx-doc/sphinx/blob/v8.1.3/CHANGES.rst)
- [Commits](https://github.com/sphinx-doc/sphinx/compare/v7.2.6...v8.1.3)

Updates `furo` from 2023.9.10 to 2024.8.6
- [Release notes](https://github.com/pradyunsg/furo/releases)
- [Changelog](https://github.com/pradyunsg/furo/blob/main/docs/changelog.md)
- [Commits](https://github.com/pradyunsg/furo/compare/2023.09.10...2024.08.06)

Updates `importlib-metadata` from 7.0.1 to 8.5.0
- [Release notes](https://github.com/python/importlib_metadata/releases)
- [Changelog](https://github.com/python/importlib_metadata/blob/main/NEWS.rst)
- [Commits](https://github.com/python/importlib_metadata/compare/v7.0.1...v8.5.0)

Updates `aiohttp` from 3.9.1 to 3.10.10
- [Release notes](https://github.com/aio-libs/aiohttp/releases)
- [Changelog](https://github.com/aio-libs/aiohttp/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/aiohttp/compare/v3.9.1...v3.10.10)

Updates `alabaster` from 0.7.13 to 1.0.0
- [Release notes](https://github.com/sphinx-doc/alabaster/releases)
- [Changelog](https://github.com/sphinx-doc/alabaster/blob/master/docs/changelog.rst)
- [Commits](https://github.com/sphinx-doc/alabaster/compare/0.7.13...1.0.0)

Updates `annotated-types` from 0.6.0 to 0.7.0
- [Release notes](https://github.com/annotated-types/annotated-types/releases)
- [Commits](https://github.com/annotated-types/annotated-types/compare/v0.6.0...v0.7.0)

Updates `anyio` from 4.2.0 to 4.6.2.post1
- [Release notes](https://github.com/agronholm/anyio/releases)
- [Changelog](https://github.com/agronholm/anyio/blob/master/docs/versionhistory.rst)
- [Commits](https://github.com/agronholm/anyio/compare/4.2.0...4.6.2.post1)

Updates `attrs` from 23.2.0 to 24.2.0
- [Commits](https://github.com/sponsors/hynek/commits)

Updates `autodoc-pydantic` from 2.0.1 to 2.2.0
- [Release notes](https://github.com/mansenfranzen/autodoc_pydantic/releases)
- [Changelog](https://github.com/mansenfranzen/autodoc_pydantic/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mansenfranzen/autodoc_pydantic/compare/v2.0.1...v2.2.0)

Updates `babel` from 2.14.0 to 2.16.0
- [Release notes](https://github.com/python-babel/babel/releases)
- [Changelog](https://github.com/python-babel/babel/blob/master/CHANGES.rst)
- [Commits](https://github.com/python-babel/babel/compare/v2.14.0...v2.16.0)

Updates `beautifulsoup4` from 4.12.2 to 4.12.3

Updates `black` from 23.12.1 to 24.10.0
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/23.12.1...24.10.0)

Updates `build` from 1.0.3 to 1.2.2.post1
- [Release notes](https://github.com/pypa/build/releases)
- [Changelog](https://github.com/pypa/build/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/build/compare/1.0.3...1.2.2.post1)

Updates `certifi` from 2023.11.17 to 2024.8.30
- [Commits](https://github.com/certifi/python-certifi/compare/2023.11.17...2024.08.30)

Updates `cffi` from 1.16.0 to 1.17.1
- [Release notes](https://github.com/python-cffi/cffi/releases)
- [Commits](https://github.com/python-cffi/cffi/compare/v1.16.0...v1.17.1)

Updates `charset-normalizer` from 3.3.2 to 3.4.0
- [Release notes](https://github.com/Ousret/charset_normalizer/releases)
- [Changelog](https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Ousret/charset_normalizer/compare/3.3.2...3.4.0)

Updates `contourpy` from 1.2.1 to 1.3.0
- [Release notes](https://github.com/contourpy/contourpy/releases)
- [Changelog](https://github.com/contourpy/contourpy/blob/main/docs/changelog.rst)
- [Commits](https://github.com/contourpy/contourpy/compare/v1.2.1...v1.3.0)

Updates `coverage` from 7.4.0 to 7.6.4
- [Release notes](https://github.com/nedbat/coveragepy/releases)
- [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst)
- [Commits](https://github.com/nedbat/coveragepy/compare/7.4.0...7.6.4)

Updates `cryptography` from 41.0.7 to 43.0.3
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/41.0.7...43.0.3)

Updates `dataclasses-json` from 0.6.3 to 0.6.7
- [Release notes](https://github.com/lidatong/dataclasses-json/releases)
- [Commits](https://github.com/lidatong/dataclasses-json/compare/v0.6.3...v0.6.7)

Updates `debugpy` from 1.8.2 to 1.8.7
- [Release notes](https://github.com/microsoft/debugpy/releases)
- [Commits](https://github.com/microsoft/debugpy/compare/v1.8.2...v1.8.7)

Updates `dill` from 0.3.8 to 0.3.9
- [Release notes](https://github.com/uqfoundation/dill/releases)
- [Commits](https://github.com/uqfoundation/dill/compare/0.3.8...0.3.9)

Updates `docutils` from 0.20.1 to 0.21.2

Updates `executing` from 2.0.1 to 2.1.0
- [Release notes](https://github.com/alexmojaki/executing/releases)
- [Commits](https://github.com/alexmojaki/executing/compare/v2.0.1...v2.1.0)

Updates `fonttools` from 4.53.1 to 4.54.1
- [Release notes](https://github.com/fonttools/fonttools/releases)
- [Changelog](https://github.com/fonttools/fonttools/blob/main/NEWS.rst)
- [Commits](https://github.com/fonttools/fonttools/compare/4.53.1...4.54.1)

Updates `fsspec` from 2023.12.2 to 2024.10.0
- [Commits](https://github.com/fsspec/filesystem_spec/compare/2023.12.2...2024.10.0)

Updates `git-changelog` from 2.4.0 to 2.5.2
- [Release notes](https://github.com/pawamoy/git-changelog/releases)
- [Changelog](https://github.com/pawamoy/git-changelog/blob/main/CHANGELOG.md)
- [Commits](https://github.com/pawamoy/git-changelog/compare/2.4.0...2.5.2)

Updates `greenlet` from 3.0.3 to 3.1.1
- [Changelog](https://github.com/python-greenlet/greenlet/blob/master/CHANGES.rst)
- [Commits](https://github.com/python-greenlet/greenlet/compare/3.0.3...3.1.1)

Updates `httpcore` from 1.0.2 to 1.0.6
- [Release notes](https://github.com/encode/httpcore/releases)
- [Changelog](https://github.com/encode/httpcore/blob/master/CHANGELOG.md)
- [Commits](https://github.com/encode/httpcore/compare/1.0.2...1.0.6)

Updates `httpx` from 0.26.0 to 0.27.2
- [Release notes](https://github.com/encode/httpx/releases)
- [Changelog](https://github.com/encode/httpx/blob/master/CHANGELOG.md)
- [Commits](https://github.com/encode/httpx/compare/0.26.0...0.27.2)

Updates `idna` from 3.6 to 3.10
- [Release notes](https://github.com/kjd/idna/releases)
- [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst)
- [Commits](https://github.com/kjd/idna/compare/v3.6...v3.10)

Updates `ipython` from 8.26.0 to 8.28.0
- [Release notes](https://github.com/ipython/ipython/releases)
- [Commits](https://github.com/ipython/ipython/compare/8.26.0...8.28.0)

Updates `ipywidgets` from 8.1.3 to 8.1.5
- [Release notes](https://github.com/jupyter-widgets/ipywidgets/releases)
- [Commits](https://github.com/jupyter-widgets/ipywidgets/compare/8.1.3...8.1.5)

Updates `isodate` from 0.6.1 to 0.7.2
- [Changelog](https://github.com/gweis/isodate/blob/master/CHANGES.txt)
- [Commits](https://github.com/gweis/isodate/compare/0.6.1...0.7.2)

Updates `jaraco-classes` from 3.3.0 to 3.4.0
- [Release notes](https://github.com/jaraco/jaraco.classes/releases)
- [Changelog](https://github.com/jaraco/jaraco.classes/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/jaraco.classes/compare/v3.3.0...v3.4.0)

Updates `jinja2` from 3.1.2 to 3.1.4
- [Release notes](https://github.com/pallets/jinja/releases)
- [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.4)

Updates `jsonpointer` from 2.4 to 3.0.0
- [Commits](https://github.com/stefankoegl/python-json-pointer/compare/v2.4...v3.0.0)

Updates `jsonschema-specifications` from 2023.12.1 to 2024.10.1
- [Release notes](https://github.com/python-jsonschema/jsonschema-specifications/releases)
- [Commits](https://github.com/python-jsonschema/jsonschema-specifications/compare/v2023.12.1...v2024.10.1)

Updates `jupyter-client` from 8.6.2 to 8.6.3
- [Release notes](https://github.com/jupyter/jupyter_client/releases)
- [Changelog](https://github.com/jupyter/jupyter_client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jupyter/jupyter_client/compare/v8.6.2...v8.6.3)

Updates `jupyterlab` from 4.2.4 to 4.2.5
- [Release notes](https://github.com/jupyterlab/jupyterlab/releases)
- [Changelog](https://github.com/jupyterlab/jupyterlab/blob/@jupyterlab/lsp@4.2.5/CHANGELOG.md)
- [Commits](https://github.com/jupyterlab/jupyterlab/compare/@jupyterlab/lsp@4.2.4...@jupyterlab/lsp@4.2.5)

Updates `jupyterlab-widgets` from 3.0.11 to 3.0.13
- [Release notes](https://github.com/jupyter-widgets/ipywidgets/releases)
- [Commits](https://github.com/jupyter-widgets/ipywidgets/commits)

Updates `keyring` from 24.3.0 to 25.4.1
- [Release notes](https://github.com/jaraco/keyring/releases)
- [Changelog](https://github.com/jaraco/keyring/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/keyring/compare/v24.3.0...v25.4.1)

Updates `kiwisolver` from 1.4.5 to 1.4.7
- [Release notes](https://github.com/nucleic/kiwi/releases)
- [Changelog](https://github.com/nucleic/kiwi/blob/main/releasenotes.rst)
- [Commits](https://github.com/nucleic/kiwi/compare/1.4.5...1.4.7)

Updates `langchain-core` from 0.1.4 to 0.3.12
- [Release notes](https://github.com/langchain-ai/langchain/releases)
- [Commits](https://github.com/langchain-ai/langchain/compare/v0.1.4...langchain-core==0.3.12)

Updates `langsmith` from 0.0.75 to 0.1.136
- [Release notes](https://github.com/langchain-ai/langsmith-sdk/releases)
- [Commits](https://github.com/langchain-ai/langsmith-sdk/compare/v0.0.75...v0.1.136)

Updates `levenshtein` from 0.25.1 to 0.26.0
- [Release notes](https://github.com/rapidfuzz/Levenshtein/releases)
- [Changelog](https://github.com/rapidfuzz/Levenshtein/blob/main/HISTORY.md)
- [Commits](https://github.com/rapidfuzz/Levenshtein/compare/v0.25.1...v0.26.0)

Updates `livereload` from 2.6.3 to 2.7.0
- [Release notes](https://github.com/lepture/python-livereload/releases)
- [Changelog](https://github.com/lepture/python-livereload/blob/master/CHANGES.rst)
- [Commits](https://github.com/lepture/python-livereload/compare/2.6.3...2.7.0)

Updates `lxml` from 5.0.0 to 5.3.0
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-5.0.0...lxml-5.3.0)

Updates `markupsafe` from 2.1.3 to 3.0.2
- [Release notes](https://github.com/pallets/markupsafe/releases)
- [Changelog](https://github.com/pallets/markupsafe/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/markupsafe/compare/2.1.3...3.0.2)

Updates `marshmallow` from 3.20.1 to 3.23.0
- [Changelog](https://github.com/marshmallow-code/marshmallow/blob/dev/CHANGELOG.rst)
- [Commits](https://github.com/marshmallow-code/marshmallow/compare/3.20.1...3.23.0)

Updates `mdit-py-plugins` from 0.4.0 to 0.4.2
- [Release notes](https://github.com/executablebooks/mdit-py-plugins/releases)
- [Changelog](https://github.com/executablebooks/mdit-py-plugins/blob/master/CHANGELOG.md)
- [Commits](https://github.com/executablebooks/mdit-py-plugins/compare/v0.4.0...v0.4.2)

Updates `more-itertools` from 10.1.0 to 10.5.0
- [Release notes](https://github.com/more-itertools/more-itertools/releases)
- [Commits](https://github.com/more-itertools/more-itertools/compare/v10.1.0...v10.5.0)

Updates `msal` from 1.30.0 to 1.31.0
- [Release notes](https://github.com/AzureAD/microsoft-authentication-library-for-python/releases)
- [Commits](https://github.com/AzureAD/microsoft-authentication-library-for-python/compare/1.30.0...1.31.0)

Updates `msgpack` from 1.0.8 to 1.1.0
- [Release notes](https://github.com/msgpack/msgpack-python/releases)
- [Changelog](https://github.com/msgpack/msgpack-python/blob/main/ChangeLog.rst)
- [Commits](https://github.com/msgpack/msgpack-python/compare/v1.0.8...v1.1.0)

Updates `multidict` from 6.0.4 to 6.1.0
- [Release notes](https://github.com/aio-libs/multidict/releases)
- [Changelog](https://github.com/aio-libs/multidict/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/multidict/compare/v6.0.4...v6.1.0)

Updates `mypy` from 1.10.0 to 1.12.1
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python/mypy/compare/v1.10.0...v1.12.1)

Updates `myst-parser` from 2.0.0 to 4.0.0
- [Release notes](https://github.com/executablebooks/MyST-Parser/releases)
- [Changelog](https://github.com/executablebooks/MyST-Parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/executablebooks/MyST-Parser/compare/v2.0.0...v4.0.0)

Updates `ndindex` from 1.8 to 1.9.2
- [Release notes](https://github.com/Quansight-Labs/ndindex/releases)
- [Changelog](https://github.com/Quansight-Labs/ndindex/blob/main/docs/changelog.md)
- [Commits](https://github.com/Quansight-Labs/ndindex/compare/1.8...1.9.2)

Updates `networkx` from 3.2.1 to 3.4.1
- [Release notes](https://github.com/networkx/networkx/releases)
- [Commits](https://github.com/networkx/networkx/compare/networkx-3.2.1...networkx-3.4.1)

Updates `nh3` from 0.2.15 to 0.2.18
- [Release notes](https://github.com/messense/nh3/releases)
- [Commits](https://github.com/messense/nh3/compare/v0.2.15...v0.2.18)

Updates `notebook` from 7.2.1 to 7.2.2
- [Release notes](https://github.com/jupyter/notebook/releases)
- [Changelog](https://github.com/jupyter/notebook/blob/@jupyter-notebook/tree@7.2.2/CHANGELOG.md)
- [Commits](https://github.com/jupyter/notebook/compare/@jupyter-notebook/tree@7.2.1...@jupyter-notebook/tree@7.2.2)

Updates `nvidia-cublas-cu12` from 12.1.3.1 to 12.6.3.3

Updates `nvidia-cuda-cupti-cu12` from 12.1.105 to 12.6.80

Updates `nvidia-cuda-nvrtc-cu12` from 12.1.105 to 12.6.77

Updates `nvidia-cuda-runtime-cu12` from 12.1.105 to 12.6.77

Updates `nvidia-cudnn-cu12` from 8.9.2.26 to 9.5.0.50

Updates `nvidia-cufft-cu12` from 11.0.2.54 to 11.3.0.4

Updates `nvidia-curand-cu12` from 10.3.2.106 to 10.3.7.77

Updates `nvidia-cusolver-cu12` from 11.4.5.107 to 11.7.1.2

Updates `nvidia-cusparse-cu12` from 12.1.0.106 to 12.5.4.2

Updates `nvidia-nccl-cu12` from 2.18.1 to 2.23.4

Updates `nvidia-nvjitlink-cu12` from 12.3.101 to 12.6.77

Updates `nvidia-nvtx-cu12` from 12.1.105 to 12.6.77

Updates `packaging` from 23.2 to 24.1
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/packaging/compare/23.2...24.1)

Updates `pillow` from 10.4.0 to 11.0.0
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/10.4.0...11.0.0)

Updates `pkginfo` from 1.9.6 to 1.11.2

Updates `platformdirs` from 4.1.0 to 4.3.6
- [Release notes](https://github.com/tox-dev/platformdirs/releases)
- [Changelog](https://github.com/tox-dev/platformdirs/blob/main/CHANGES.rst)
- [Commits](https://github.com/tox-dev/platformdirs/compare/4.1.0...4.3.6)

Updates `pluggy` from 1.3.0 to 1.5.0
- [Changelog](https://github.com/pytest-dev/pluggy/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pluggy/compare/1.3.0...1.5.0)

Updates `prometheus-client` from 0.20.0 to 0.21.0
- [Release notes](https://github.com/prometheus/client_python/releases)
- [Commits](https://github.com/prometheus/client_python/compare/v0.20.0...v0.21.0)

Updates `prompt-toolkit` from 3.0.47 to 3.0.48
- [Release notes](https://github.com/prompt-toolkit/python-prompt-toolkit/releases)
- [Changelog](https://github.com/prompt-toolkit/python-prompt-toolkit/blob/master/CHANGELOG)
- [Commits](https://github.com/prompt-toolkit/python-prompt-toolkit/compare/3.0.47...3.0.48)

Updates `psutil` from 6.0.0 to 6.1.0
- [Changelog](https://github.com/giampaolo/psutil/blob/master/HISTORY.rst)
- [Commits](https://github.com/giampaolo/psutil/compare/release-6.0.0...release-6.1.0)

Updates `pycparser` from 2.21 to 2.22
- [Release notes](https://github.com/eliben/pycparser/releases)
- [Changelog](https://github.com/eliben/pycparser/blob/main/CHANGES)
- [Commits](https://github.com/eliben/pycparser/compare/release_v2.21...release_v2.22)

Updates `pydantic` from 2.5.3 to 2.9.2
- [Release notes](https://github.com/pydantic/pydantic/releases)
- [Changelog](https://github.com/pydantic/pydantic/blob/main/HISTORY.md)
- [Commits](https://github.com/pydantic/pydantic/compare/v2.5.3...v2.9.2)

Updates `pydantic-core` from 2.14.6 to 2.24.2
- [Release notes](https://github.com/pydantic/pydantic-core/releases)
- [Commits](https://github.com/pydantic/pydantic-core/compare/v2.14.6...v2.24.2)

Updates `pygments` from 2.17.2 to 2.18.0
- [Release notes](https://github.com/pygments/pygments/releases)
- [Changelog](https://github.com/pygments/pygments/blob/master/CHANGES)
- [Commits](https://github.com/pygments/pygments/compare/2.17.2...2.18.0)

Updates `pyjwt` from 2.8.0 to 2.9.0
- [Release notes](https://github.com/jpadilla/pyjwt/releases)
- [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/jpadilla/pyjwt/compare/2.8.0...2.9.0)

Updates `pymupdfb` from 1.24.9 to 1.24.10
- [Release notes](https://github.com/pymupdf/pymupdf/releases)
- [Changelog](https://github.com/pymupdf/PyMuPDF/blob/main/changes.txt)
- [Commits](https://github.com/pymupdf/pymupdf/compare/1.24.9...1.24.10)

Updates `pyparsing` from 3.1.2 to 3.2.0
- [Release notes](https://github.com/pyparsing/pyparsing/releases)
- [Changelog](https://github.com/pyparsing/pyparsing/blob/master/CHANGES)
- [Commits](https://github.com/pyparsing/pyparsing/compare/pyparsing_3.1.2...3.2.0)

Updates `pyproject-hooks` from 1.0.0 to 1.2.0
- [Changelog](https://github.com/pypa/pyproject-hooks/blob/main/docs/changelog.rst)
- [Commits](https://github.com/pypa/pyproject-hooks/compare/v1.0.0...v1.2.0)

Updates `pytest` from 7.4.4 to 8.3.3
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.4.4...8.3.3)

Updates `python-dateutil` from 2.8.2 to 2.9.0.post0
- [Release notes](https://github.com/dateutil/dateutil/releases)
- [Changelog](https://github.com/dateutil/dateutil/blob/master/NEWS)
- [Commits](https://github.com/dateutil/dateutil/compare/2.8.2...2.9.0.post0)

Updates `pytz` from 2023.3.post1 to 2024.2
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2023.3.post1...release_2024.2)

Updates `pyyaml` from 6.0.1 to 6.0.2
- [Release notes](https://github.com/yaml/pyyaml/releases)
- [Changelog](https://github.com/yaml/pyyaml/blob/main/CHANGES)
- [Commits](https://github.com/yaml/pyyaml/compare/6.0.1...6.0.2)

Updates `pyzmq` from 26.0.3 to 26.2.0
- [Release notes](https://github.com/zeromq/pyzmq/releases)
- [Commits](https://github.com/zeromq/pyzmq/compare/v26.0.3...v26.2.0)

Updates `qtconsole` from 5.5.2 to 5.6.0
- [Changelog](https://github.com/jupyter/qtconsole/blob/main/RELEASE.md)
- [Commits](https://github.com/jupyter/qtconsole/compare/5.5.2...5.6.0)

Updates `rapidfuzz` from 3.9.5 to 3.10.0
- [Release notes](https://github.com/rapidfuzz/RapidFuzz/releases)
- [Changelog](https://github.com/rapidfuzz/RapidFuzz/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/rapidfuzz/RapidFuzz/compare/v3.9.5...v3.10.0)

Updates `readme-renderer` from 42.0 to 44.0
- [Release notes](https://github.com/pypa/readme_renderer/releases)
- [Changelog](https://github.com/pypa/readme_renderer/blob/main/CHANGES.rst)
- [Commits](https://github.com/pypa/readme_renderer/compare/42.0...44.0)

Updates `regex` from 2024.7.24 to 2024.9.11
- [Changelog](https://github.com/mrabarnett/mrab-regex/blob/hg/changelog.txt)
- [Commits](https://github.com/mrabarnett/mrab-regex/compare/2024.7.24...2024.9.11)

Updates `requests` from 2.31.0 to 2.32.3
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.31.0...v2.32.3)

Updates `requests-oauthlib` from 1.3.1 to 2.0.0
- [Release notes](https://github.com/requests/requests-oauthlib/releases)
- [Changelog](https://github.com/requests/requests-oauthlib/blob/master/HISTORY.rst)
- [Commits](https://github.com/requests/requests-oauthlib/compare/v1.3.1...v2.0.0)

Updates `rich` from 13.7.0 to 13.9.2
- [Release notes](https://github.com/Textualize/rich/releases)
- [Changelog](https://github.com/Textualize/rich/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Textualize/rich/compare/v13.7.0...v13.9.2)

Updates `rpds-py` from 0.19.1 to 0.20.0
- [Release notes](https://github.com/crate-py/rpds/releases)
- [Commits](https://github.com/crate-py/rpds/compare/v0.19.1...v0.20.0)

Updates `ruamel-yaml-clib` from 0.2.8 to 0.2.12

Updates `ruff` from 0.4.5 to 0.7.0
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/v0.4.5...0.7.0)

Updates `sniffio` from 1.3.0 to 1.3.1
- [Commits](https://github.com/python-trio/sniffio/compare/v1.3.0...v1.3.1)

Updates `soupsieve` from 2.5 to 2.6
- [Release notes](https://github.com/facelessuser/soupsieve/releases)
- [Commits](https://github.com/facelessuser/soupsieve/compare/2.5...2.6)

Updates `sphinx-autobuild` from 2021.3.14 to 2024.10.3
- [Release notes](https://github.com/sphinx-doc/sphinx-autobuild/releases)
- [Changelog](https://github.com/sphinx-doc/sphinx-autobuild/blob/main/NEWS.rst)
- [Commits](https://github.com/sphinx-doc/sphinx-autobuild/compare/2021.03.14...2024.10.03)

Updates `sphinx-click` from 5.1.0 to 6.0.0
- [Release notes](https://github.com/click-contrib/sphinx-click/releases)
- [Commits](https://github.com/click-contrib/sphinx-click/compare/5.1.0...6.0.0)

Updates `sphinxcontrib-applehelp` from 1.0.7 to 2.0.0
- [Release notes](https://github.com/sphinx-doc/sphinxcontrib-applehelp/releases)
- [Changelog](https://github.com/sphinx-doc/sphinxcontrib-applehelp/blob/master/CHANGES.rst)
- [Commits](https://github.com/sphinx-doc/sphinxcontrib-applehelp/compare/1.0.7...2.0.0)

Updates `sphinxcontrib-devhelp` from 1.0.5 to 2.0.0
- [Release notes](https://github.com/sphinx-doc/sphinxcontrib-devhelp/releases)
- [Changelog](https://github.com/sphinx-doc/sphinxcontrib-devhelp/blob/master/CHANGES.rst)
- [Commits](https://github.com/sphinx-doc/sphinxcontrib-devhelp/compare/1.0.5...2.0.0)

Updates `sphinxcontrib-htmlhelp` from 2.0.4 to 2.1.0
- [Release notes](https://github.com/sphinx-doc/sphinxcontrib-htmlhelp/releases)
- [Changelog](https://github.com/sphinx-doc/sphinxcontrib-htmlhelp/blob/master/CHANGES.rst)
- [Commits](https://github.com/sphinx-doc/sphinxcontrib-htmlhelp/compare/2.0.4...2.1.0)

Updates `sphinxcontrib-qthelp` from 1.0.6 to 2.0.0
- [Release notes](https://github.com/sphinx-doc/sphinxcontrib-qthelp/releases)
- [Changelog](https://github.com/sphinx-doc/sphinxcontrib-qthelp/blob/master/CHANGES.rst)
- [Commits](https://github.com/sphinx-doc/sphinxcontrib-qthelp/compare/1.0.6...2.0.0)

Updates `sphinxcontrib-serializinghtml` from 1.1.9 to 2.0.0
- [Release notes](https://github.com/sphinx-doc/sphinxcontrib-serializinghtml/releases)
- [Changelog](https://github.com/sphinx-doc/sphinxcontrib-serializinghtml/blob/master/CHANGES.rst)
- [Commits](https://github.com/sphinx-doc/sphinxcontrib-serializinghtml/compare/1.1.9...2.0.0)

Updates `sqlalchemy` from 2.0.24 to 2.0.36
- [Release notes](https://github.com/sqlalchemy/sqlalchemy/releases)
- [Changelog](https://github.com/sqlalchemy/sqlalchemy/blob/main/CHANGES.rst)
- [Commits](https://github.com/sqlalchemy/sqlalchemy/commits)

Updates `sympy` from 1.12 to 1.13.3
- [Release notes](https://github.com/sympy/sympy/releases)
- [Commits](https://github.com/sympy/sympy/compare/sympy-1.12...sympy-1.13.3)

Updates `tenacity` from 8.2.3 to 9.0.0
- [Release notes](https://github.com/jd/tenacity/releases)
- [Commits](https://github.com/jd/tenacity/compare/8.2.3...9.0.0)

Updates `termcolor` from 2.4.0 to 2.5.0
- [Release notes](https://github.com/termcolor/termcolor/releases)
- [Changelog](https://github.com/termcolor/termcolor/blob/main/CHANGES.md)
- [Commits](https://github.com/termcolor/termcolor/compare/2.4.0...2.5.0)

Updates `tomlkit` from 0.12.3 to 0.13.2
- [Release notes](https://github.com/sdispater/tomlkit/releases)
- [Changelog](https://github.com/python-poetry/tomlkit/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sdispater/tomlkit/compare/0.12.3...0.13.2)

Updates `tornado` from 6.4 to 6.4.1
- [Changelog](https://github.com/tornadoweb/tornado/blob/master/docs/releases.rst)
- [Commits](https://github.com/tornadoweb/tornado/compare/v6.4.0...v6.4.1)

Updates `tqdm` from 4.66.1 to 4.66.5
- [Release notes](https://github.com/tqdm/tqdm/releases)
- [Commits](https://github.com/tqdm/tqdm/compare/v4.66.1...v4.66.5)

Updates `triton` from 2.1.0 to 3.1.0
- [Commits](https://github.com/triton-lang/triton/commits)

Updates `twine` from 4.0.2 to 5.1.1
- [Release notes](https://github.com/pypa/twine/releases)
- [Changelog](https://github.com/pypa/twine/blob/main/docs/changelog.rst)
- [Commits](https://github.com/pypa/twine/compare/4.0.2...v5.1.1)

Updates `typer` from 0.9.0 to 0.12.5
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.9.0...0.12.5)

Updates `types-psutil` from 6.0.0.20240621 to 6.0.0.20241011
- [Commits](https://github.com/python/typeshed/commits)

Updates `types-python-dateutil` from 2.9.0.20240316 to 2.9.0.20241003
- [Commits](https://github.com/python/typeshed/commits)

Updates `types-pyyaml` from 6.0.12.20240724 to 6.0.12.20240917
- [Commits](https://github.com/python/typeshed/commits)

Updates `typing-extensions` from 4.9.0 to 4.12.2
- [Release notes](https://github.com/python/typing_extensions/releases)
- [Changelog](https://github.com/python/typing_extensions/blob/main/CHANGELOG.md)
- [Commits](https://github.com/python/typing_extensions/compare/4.9.0...4.12.2)

Updates `tzdata` from 2023.4 to 2024.2
- [Release notes](https://github.com/python/tzdata/releases)
- [Changelog](https://github.com/python/tzdata/blob/master/NEWS.md)
- [Commits](https://github.com/python/tzdata/compare/2023.4...2024.2)

Updates `urllib3` from 2.1.0 to 2.2.3
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/2.1.0...2.2.3)

Updates `webcolors` from 24.6.0 to 24.8.0
- [Changelog](https://github.com/ubernostrum/webcolors/blob/trunk/docs/changelog.rst)
- [Commits](https://github.com/ubernostrum/webcolors/compare/24.6.0...24.8.0)

Updates `widgetsnbextension` from 4.0.11 to 4.0.13

Updates `yarl` from 1.9.4 to 1.15.5
- [Release notes](https://github.com/aio-libs/yarl/releases)
- [Changelog](https://github.com/aio-libs/yarl/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/yarl/compare/v1.9.4...v1.15.5)

Updates `zipp` from 3.17.0 to 3.20.2
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/NEWS.rst)
- [Commits](https://github.com/jaraco/zipp/compare/v3.17.0...v3.20.2)

Updates `exceptiongroup` from 1.2.0 to 1.2.2
- [Release notes](https://github.com/agronholm/exceptiongroup/releases)
- [Changelog](https://github.com/agronholm/exceptiongroup/blob/main/CHANGES.rst)
- [Commits](https://github.com/agronholm/exceptiongroup/compare/1.2.0...1.2.2)

Updates `tomli` from 2.0.1 to 2.0.2
- [Changelog](https://github.com/hukkin/tomli/blob/master/CHANGELOG.md)
- [Commits](https://github.com/hukkin/tomli/compare/2.0.1...2.0.2)

---
updated-dependencies:
- dependency-name: pydantic-settings
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: cython
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: scipy
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: python-levenshtein
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: scikit-learn
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: filelock
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: fire
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: openai
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: ruamel-yaml
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: torch
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: torch-geometric
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: numpy
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: pandas
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: matplotlib
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: langchain
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: langchain-community
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: tiktoken
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: pymupdf
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: azure-identity
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: pypdf
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: azure-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: azure-ai-formrecognizer
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: statsmodels
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: tables
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: tree-sitter-python
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: tree-sitter
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: jupyter
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: python-dotenv
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: setuptools-scm
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: sphinx
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: furo
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: importlib-metadata
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: aiohttp
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: alabaster
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: annotated-types
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: anyio
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: attrs
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: autodoc-pydantic
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: babel
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: beautifulsoup4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: black
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: build
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: cffi
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: charset-normalizer
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: contourpy
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: coverage
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: cryptography
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: dataclasses-json
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: debugpy
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: dill
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: docutils
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: executing
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: fonttools
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: fsspec
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: git-changelog
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: greenlet
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: httpcore
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: httpx
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: idna
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: ipython
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: ipywidgets
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: isodate
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: jaraco-classes
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: jinja2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: jsonpointer
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: jsonschema-specifications
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: jupyter-client
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: jupyterlab
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: jupyterlab-widgets
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: keyring
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: kiwisolver
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: langchain-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: langsmith
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: levenshtein
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: livereload
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: lxml
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: markupsafe
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: marshmallow
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: mdit-py-plugins
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: more-itertools
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: msal
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: msgpack
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: multidict
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: mypy
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: myst-parser
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: ndindex
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: networkx
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: nh3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: notebook
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: nvidia-cublas-cu12
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: nvidia-cuda-cupti-cu12
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: nvidia-cuda-nvrtc-cu12
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: nvidia-cuda-runtime-cu12
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: nvidia-cudnn-cu12
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: nvidia-cufft-cu12
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: nvidia-curand-cu12
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: nvidia-cusolver-cu12
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: nvidia-cusparse-cu12
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: nvidia-nccl-cu12
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: nvidia-nvjitlink-cu12
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: nvidia-nvtx-cu12
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: packaging
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: pillow
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: pkginfo
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: platformdirs
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: pluggy
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: prometheus-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: prompt-toolkit
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: psutil
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: pycparser
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: pydantic
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: pydantic-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: pygments
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: pyjwt
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: pymupdfb
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: pyparsing
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: pyproject-hooks
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: pytest
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: python-dateutil
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: pyyaml
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod
- dependency-name: pyzmq
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: qtconsole
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: rapidfuzz
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: readme-renderer
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: regex
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: requests
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod
- dependency-name: requests-oauthlib
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: prod
- dependency-name: rich
  depende...

Signed-off-by: dependabot[bot] <support@github.com>

* build: Update constraints for dependabot.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: Linlang <30293408+SunsetWolf@users.noreply.github.com>
2024-10-25 13:02:33 +08:00
Linlang 6fe0d75b38 chore: remove package (#449)
* remove package

* reformat with black

* fix pytest error

* fix pytest error

* fix pytest error

* add packages

* change code
2024-10-24 20:38:13 +08:00
Xu Yang c379b9221a feat: independent use_azure_token_provider on chat and embedding (#452)
* independent use_azure_token_provider

* fix CI

* fix doc format
2024-10-23 18:22:58 +08:00
Tim effce1df15 always return str (#453) 2024-10-23 16:47:36 +08:00
XianBW d57477aefa fix KGFactorRunner cache system bug (#451) 2024-10-23 15:17:38 +08:00
WinstonLiyt 972d8602c2 docs: add documentation for kaggle scen (#448)
* init for bg & quickstart for kaggle docs

* Add documentation for the environment configuration in the Kaggle scenario.

* add some descriptions in documents

* remove useless docs

* ci issue

---------

Co-authored-by: TPLin22 <tplin2@163.com>
2024-10-23 13:26:57 +08:00
Linlang b3e627fb80 remove_package (#447) 2024-10-22 11:40:31 +08:00
872 changed files with 88714 additions and 10327 deletions
-6
View File
@@ -1,6 +0,0 @@
[bumpversion]
current_version = 0.0.0
commit = True
tag = True
[bumpversion:file:pyproject.toml]
-21
View File
@@ -1,21 +0,0 @@
module.exports = {
extends: ["@commitlint/config-conventional"],
rules: {
// Configuration Format: [level, applicability, value]
// level: Error level, usually expressed as a number:
// 0 - disable rule
// 1 - Warning (does not prevent commits)
// 2 - Error (will block the commit)
// applicability: the conditions under which the rule applies, commonly used values:
// “always” - always apply the rule
// “never” - never apply the rule
// value: the specific value of the rule, e.g. a maximum length of 100.
// Refs: https://commitlint.js.org/reference/rules-configuration.html
"header-max-length": [2, "always", 100],
"type-enum": [
2,
"always",
["build", "chore", "ci", "docs", "feat", "fix", "perf", "refactor", "revert", "style", "test", "Release-As"]
]
}
};
-30
View File
@@ -1,30 +0,0 @@
"""
This file is a template for the .env file.
Please copy this file to .env and fill in the values.
For more information about configuration options, please refer to the documentation
"""
# Global configs:
USE_AZURE=False
USE_AZURE_TOKEN_PROVIDER=False
MAX_RETRY=10
RETRY_WAIT_SECONDS=20
# LLM API Setting:
OPENAI_API_KEY=<your_api_key>
CHAT_MODEL=gpt-4-turbo
CHAT_MAX_TOKENS=3000
CHAT_TEMPERATURE=0.7
# CHAT_AZURE_API_BASE=<for_Azure_user>
# CHAT_AZURE_API_VERSION=<for_Azure_user>
EMBEDDING_MODEL=text-embedding-3-small
# EMBEDDING_AZURE_API_BASE=<for_Azure_user>
# EMBEDDING_AZURE_API_VERSION=<for_Azure_user>
# Cache Setting (Optional):
# Senario Configs:
-2
View File
@@ -1,2 +0,0 @@
github:
- MIIC-finance
-51
View File
@@ -1,51 +0,0 @@
---
name: "\U0001F41B Bug Report"
about: Submit a bug report to help us improve RD-Agent
labels: bug
---
## 🐛 Bug Description
<!-- A clear and concise description of what the bug is. -->
## To Reproduce
Steps to reproduce the behavior:
1.
2.
3.
## Expected Behavior
<!-- A clear and concise description of what you expected to happen. -->
## Screenshot
<!-- A screenshot of the error message or anything shouldn't appear-->
## Environment
**Note**: Users can run `rdagent collect_info` to get system information and paste it directly here.
- Name of current operating system:
- Processor architecture:
- System, version, and hardware information:
- Version number of the system:
- Python version:
- Container ID:
- Container Name:
- Container Status:
- Image ID used by the container:
- Image tag used by the container:
- Container port mapping:
- Container Label:
- Startup Commands:
- RD-Agent version:
- Package version:
## Additional Notes
<!-- Add any other information about the problem here. -->
-9
View File
@@ -1,9 +0,0 @@
---
name: "\U0001F4D6 Documentation"
about: Report an issue related to documentation
---
## 📖 Documentation
<!-- Please specify whether it's tutorial part or API reference part, and describe it.-->
-25
View File
@@ -1,25 +0,0 @@
---
name: "\U0001F31FFeature Request"
about: Request for a new RD-Agent feature
labels: enhancement
---
## 🌟 Feature Description
<!-- A clear and concise description of the feature proposal -->
## Motivation
1. Application scenario
2. Related works (Papers, Github repos etc.):
3. Any other relevant and important information:
<!-- Please describe why the feature is important. -->
## Alternatives
<!-- A short description of any alternative solutions or features you've considered. -->
## Additional Notes
<!-- Add any other context or screenshots about the feature request here. -->
-10
View File
@@ -1,10 +0,0 @@
---
name: "❓Questions & Help"
about: Have some questions? We can offer help.
labels: question
---
## ❓ Questions and Help
We sincerely suggest you to carefully read the [documentation](http://rdagent.readthedocs.io/). After that, if you still feel puzzled, please describe the question clearly under this issue.
-36
View File
@@ -1,36 +0,0 @@
<!--- Thank you for submitting a Pull Request! In order to make our work smoother. -->
<!--- please make sure your Pull Request meets the following requirements: -->
<!--- 1. Provide a general summary of your changes in the Title above; -->
<!--- 2. Add appropriate prefixes to titles, such as `build:`, `chore:`, `ci:`, `docs:`, `feat:`, `fix:`, `perf:`, `refactor:`, `revert:`, `style:`, `test:`(Ref: https://www.conventionalcommits.org/). -->
<!--- Category: -->
<!--- Patch Updates: `fix:` -->
<!--- Example: fix(auth): correct login validation issue -->
<!--- minor update (introduces new functionality): `feat` -->
<!--- Example: feature(parser): add ability to parse arrays -->
<!--- major update(destructive update): Include BREAKING CHANGE in the commit message footer, or add `! ` in the commit footer to indicate that there is a destructive update. -->
<!--- Example: feat(auth)! : remove support for old authentication method -->
<!--- Other updates: `build:`, `chore:`, `ci:`, `docs:`, `perf:`, `refactor:`, `revert:`, `style:`, `test:`. -->
## Description
<!--- Describe your changes in detail -->
## Motivation and Context
<!--- Are there any related issues? If so, please put the link here. -->
<!--- Why is this change required? What problem does it solve? -->
## How Has This Been Tested?
<!--- Put an `x` in all the boxes that apply: --->
- [ ] Pass the test by running: `pytest qlib/tests/test_all_pipeline.py` under upper directory of `qlib`.
- [ ] If you are adding a new feature, test on your own test scripts.
<!--- **ATTENTION**: If you are adding a new feature, please make sure your codes are **correctly tested**. If our test scripts do not cover your cases, please provide your own test scripts under the `tests` folder and test them. More information about test scripts can be found [here](https://docs.python.org/3/library/unittest.html#basic-example), or you could refer to those we provide under the `tests` folder. -->
## Screenshots of Test Results (if appropriate):
1. Pipeline test:
2. Your own tests:
## Types of changes
<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
- [ ] Fix bugs
- [ ] Add new feature
- [ ] Update documentation
-19
View File
@@ -1,19 +0,0 @@
updates:
- commit-message:
prefix: build(actions)
directory: /
package-ecosystem: github-actions
schedule:
interval: weekly
- commit-message:
prefix: build(requirements)
directory: /
groups:
dev:
dependency-type: development
prod:
dependency-type: production
package-ecosystem: pip
schedule:
interval: weekly
version: 2
-70
View File
@@ -1,70 +0,0 @@
concurrency:
cancel-in-progress: true
group: ${{ github.workflow }}-${{ github.ref }}
jobs:
ci:
if: ${{ !cancelled() && ! failure() }}
needs: dependabot
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
cache: pip
python-version: ${{ matrix.python-version }}
- run: env | sort
- run: make dev
- name: lint test docs and build
run: make lint docs-gen test-offline # test docs build
strategy:
matrix:
python-version:
- '3.10'
- '3.11'
dependabot:
if: ${{ github.actor == 'dependabot[bot]' && startsWith(github.head_ref, 'dependabot/pip/') }}
permissions:
contents: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.head_ref }}
- name: Set up Git
run: |
git config --global user.name github-actions
git config --global user.email github-actions@github.com
- name: Set up Python with multiple versions.
uses: actions/setup-python@v5
with:
cache: pip
python-version: |
3.10
3.11
- name: Install pipenv using pipx
run: pipx install pipenv
- name: Generate constraints for all supported Python versions
run: |
CI= PYTHON_VERSION=3.10 make constraints
CI= PYTHON_VERSION=3.11 make constraints
- name: Push changes if applicable
run: |
if [[ -n `git status --porcelain` ]]; then
git commit -a -m "build: Update constraints for dependabot."
git push
fi
name: CI
on:
pull_request:
types:
- opened
- synchronize
push:
branches:
- main
-35
View File
@@ -1,35 +0,0 @@
name: Lint pull request title
on:
pull_request:
types:
- opened
- synchronize
- reopened
- edited
concurrency:
cancel-in-progress: true
group: ${{ github.workflow }}-${{ github.ref }}
jobs:
lint-title:
runs-on: ubuntu-latest
steps:
# This step is necessary because the lint title uses the .commitlintrc.js file in the project root directory.
- name: Checkout Repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '16'
- name: Install commitlint
run: npm install --save-dev @commitlint/{config-conventional,cli}
- name: Validate PR Title with commitlint
env:
BODY: ${{ github.event.pull_request.title }}
run: |
echo "$BODY" | npx commitlint --config .commitlintrc.js
-17
View File
@@ -1,17 +0,0 @@
concurrency:
cancel-in-progress: true
group: ${{ github.workflow }}-${{ github.ref }}
jobs:
documentation-links:
runs-on: ubuntu-latest
steps:
- uses: readthedocs/actions/preview@v1
with:
project-slug: RDAgent
name: Read the Docs Pull Request Preview
on:
pull_request_target:
types:
- opened
permissions:
pull-requests: write
-50
View File
@@ -1,50 +0,0 @@
name: Release
on:
push:
branches:
- main
permissions:
contents: read
jobs:
release_and_publish:
permissions:
contents: write
pull-requests: read
runs-on: ubuntu-latest
steps:
- name: Release please
id: release_please
uses: googleapis/release-please-action@v4
with:
# The current PAT (personal access token) was created on 2024-08-05,
# since the maximum validity of PAT is 1 year, you need to change the PAT before 2025-08-05.
token: ${{ secrets.PAT }}
release-type: simple
- uses: actions/checkout@v4
if: ${{ steps.release_please.outputs.release_created }}
with:
fetch-depth: 0
- name: Set up Python
if: ${{ steps.release_please.outputs.release_created }}
uses: actions/setup-python@v5
with:
cache: pip
python-version: '3.10'
- name: Install dependencies
if: ${{ steps.release_please.outputs.release_created }}
run: |
python -m pip install --upgrade pip
pip install setuptools wheel twine # better-exceptions(optional for debug)
- run: env | sort
if: ${{ steps.release_please.outputs.release_created }}
- run: make dev
if: ${{ steps.release_please.outputs.release_created }}
- run: make build
if: ${{ steps.release_please.outputs.release_created }}
- name: upload
if: ${{ steps.release_please.outputs.release_created }}
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
run: |
make upload
+33 -138
View File
@@ -1,19 +1,13 @@
# Custom
*.swp
.DS_Store
Pipfile
public
release-notes.md
# Environment
.env
.env.*
!.env.example
# Byte-compiled / optimized / DLL files
# Python
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
@@ -27,146 +21,47 @@ parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Virtual environments
venv/
ENV/
env/
.venv/
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# IDE
.idea/
.vscode/
*.swp
*.swo
*~
# Unit test / coverage reports
# Testing
.pytest_cache/
.coverage
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
# Translations
*.mo
*.pot
# Django stuff:
# Logs
*.log
/log/
local_settings.py
db.sqlite3
db.sqlite3-journal
log/
# Flask stuff:
instance/
.webassets-cache
# Cache
pickle_cache/
prompt_cache.db
.cache/
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
.python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
^env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# all pkl files
*.pkl
# all h5 files
*.h5
# all vs-code files
.vscode/
# reports
reports/
# git_ignore_folder
# Generated/processed data
git_ignore_folder/
data_raw/
#cache
*cache*/
*cache.json
# Build artifacts
*.manifest
*.spec
# DB files
*.db
# Docker
factor_template/mlruns/
env_tpl
mlruns/
# possible output from coder or runner
*.pth
*qlib_res.csv
# shell script
*.out
*.sh
# Local scripts (generated)
convert_1min.py
import_1min_qlib.py
-26
View File
@@ -1,26 +0,0 @@
# .readthedocs.yml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
# Required
version: 2
# Set the version of Python and other tools you might need
build:
os: ubuntu-22.04
tools:
python: "3.10"
# Build documentation in the docs/ directory with Sphinx
sphinx:
configuration: docs/conf.py
# Build all formats
formats: all
# Optionally set the version of Python and requirements required to build your docs
python:
install:
- requirements: requirements/docs.txt
- method: pip
path: .
-2
View File
@@ -1,2 +0,0 @@
[client]
showSidebarNavigation = false
+14 -176
View File
@@ -1,185 +1,23 @@
# Changelog
## [0.3.0](https://github.com/microsoft/RD-Agent/compare/v0.2.1...v0.3.0) (2024-10-21)
All notable changes to Predix will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
### Features
## [Unreleased]
* add a new template for kaggle ([#289](https://github.com/microsoft/RD-Agent/issues/289)) ([eee3ab5](https://github.com/microsoft/RD-Agent/commit/eee3ab5b25198224826cb7a8a17eab28bd5d1f7d))
* add download submission.csv button for kaggle scenario ([#317](https://github.com/microsoft/RD-Agent/issues/317)) ([dcdcbe4](https://github.com/microsoft/RD-Agent/commit/dcdcbe46b4858bfb133ae3cca056e7f602d5cf63))
* add kaggle command ([#271](https://github.com/microsoft/RD-Agent/issues/271)) ([0938394](https://github.com/microsoft/RD-Agent/commit/0938394b7084ffbf3294d8c23d2d34bf7322ca0b))
* add kaggle tpl: feedback-prize ([#331](https://github.com/microsoft/RD-Agent/issues/331)) ([a288e39](https://github.com/microsoft/RD-Agent/commit/a288e399e6b0beec62729bd7d46b98a55de5ab79))
* add more templates for kaggle ([#291](https://github.com/microsoft/RD-Agent/issues/291)) ([da752ec](https://github.com/microsoft/RD-Agent/commit/da752ec806e6f5f5679bc27ac1c072ed9a319251))
* add normal rag into framework ([#360](https://github.com/microsoft/RD-Agent/issues/360)) ([91b0b1f](https://github.com/microsoft/RD-Agent/commit/91b0b1f66c3c1bf757cb64c4cfbdcaafe59eab74))
* add qlib_factor_strategy ([#307](https://github.com/microsoft/RD-Agent/issues/307)) ([f8f59ff](https://github.com/microsoft/RD-Agent/commit/f8f59ff0a1be4428a68c8c27f220aabad0b6c9f0))
* Add ranking in kaggle scenario ([#401](https://github.com/microsoft/RD-Agent/issues/401)) ([b16b4be](https://github.com/microsoft/RD-Agent/commit/b16b4beb402e0c27dfb39ee9d2a120f1b56d447c))
* Add runtime measurement for each step and loop in RDLoop. ([#281](https://github.com/microsoft/RD-Agent/issues/281)) ([83058c8](https://github.com/microsoft/RD-Agent/commit/83058c864ceeec413dd29bf501030d5a7bd34679))
* add s3e11 kaggle template ([#324](https://github.com/microsoft/RD-Agent/issues/324)) ([8c57524](https://github.com/microsoft/RD-Agent/commit/8c57524bead1c8f655a08763d608eb7a6dd5975e))
* Added RepoAnalyzer to empower auto-summary of a workspace ([#264](https://github.com/microsoft/RD-Agent/issues/264)) ([0bd349a](https://github.com/microsoft/RD-Agent/commit/0bd349af50b9b881ba1774bdeb4d723529ef2aa9))
* Added support for loading and storing RAG in Kaggle scenarios. ([#269](https://github.com/microsoft/RD-Agent/issues/269)) ([c4895de](https://github.com/microsoft/RD-Agent/commit/c4895de83f1ed000e563d42b3468a6bd9e5a4965))
* announce Discord and WeChat ([#367](https://github.com/microsoft/RD-Agent/issues/367)) ([acac507](https://github.com/microsoft/RD-Agent/commit/acac5078a103b71afa6bd6c053b0766a6a7e609d))
* auto submit result after one kaggle RDLoop ([#345](https://github.com/microsoft/RD-Agent/issues/345)) ([ab55d70](https://github.com/microsoft/RD-Agent/commit/ab55d7052b53a928b84dc5d5d0d2999d90ca9056))
* better feedback & evaluation ([#346](https://github.com/microsoft/RD-Agent/issues/346)) ([cc9a8c1](https://github.com/microsoft/RD-Agent/commit/cc9a8c1eab3ca89f8c1e5de4a2bb4e7fcc0cc615))
* Dynamic scenario based on task ([#392](https://github.com/microsoft/RD-Agent/issues/392)) ([665a037](https://github.com/microsoft/RD-Agent/commit/665a037e4fd7326c450e3fa0d0605eea26fd9ef3))
* Factor Implement Search Enhancement ([#294](https://github.com/microsoft/RD-Agent/issues/294)) ([4ecf25f](https://github.com/microsoft/RD-Agent/commit/4ecf25f0acf2389a172b14d3dab20895daf2ab89))
* Feature selection v3 to support all actions ([#280](https://github.com/microsoft/RD-Agent/issues/280)) ([0047641](https://github.com/microsoft/RD-Agent/commit/00476413fbf00e36e71ab3ccb48d4e766b6ccf4d))
* fix some bugs and add original features' description ([#259](https://github.com/microsoft/RD-Agent/issues/259)) ([1a5f45a](https://github.com/microsoft/RD-Agent/commit/1a5f45a40d821c017bdba14af8c93710707c5ea5))
* get kaggle notebooks & disscussion text for RAG ([#371](https://github.com/microsoft/RD-Agent/issues/371)) ([cead345](https://github.com/microsoft/RD-Agent/commit/cead3450a14bf4b142ac988c27fa098c7656a95c))
* Iceberge competition ([#372](https://github.com/microsoft/RD-Agent/issues/372)) ([c10ea4f](https://github.com/microsoft/RD-Agent/commit/c10ea4f5d4cc56a75b47cf23c7084ee189ba1a25))
* implement isolated model feature selection loop ([#370](https://github.com/microsoft/RD-Agent/issues/370)) ([cf1292d](https://github.com/microsoft/RD-Agent/commit/cf1292de1a0153ca14ea64971e73a1c93f7d89e3))
* Initial version if Graph RAG in KAGGLE scenario ([#301](https://github.com/microsoft/RD-Agent/issues/301)) ([fd3c0fd](https://github.com/microsoft/RD-Agent/commit/fd3c0fd26eff7d3be72fa4f2a234e33b9f796627))
* Integrate RAG into the Kaggle scenarios. ([#262](https://github.com/microsoft/RD-Agent/issues/262)) ([be0e48a](https://github.com/microsoft/RD-Agent/commit/be0e48a7dfbee2b5d2947d09115db5db2e5266f1))
* Kaggle loop update (Feature & Model) ([#241](https://github.com/microsoft/RD-Agent/issues/241)) ([4cf22a6](https://github.com/microsoft/RD-Agent/commit/4cf22a65c964123b4267569ee02c0c7094c54ca4))
* kaggle templates related ([#287](https://github.com/microsoft/RD-Agent/issues/287)) ([785fdc1](https://github.com/microsoft/RD-Agent/commit/785fdc144d16fa8454b7c9d2e53e78fe7f22a29a))
* Model context for tuning and selection ([#284](https://github.com/microsoft/RD-Agent/issues/284)) ([f2831e7](https://github.com/microsoft/RD-Agent/commit/f2831e7442510668b0ca75953b3359894803ef3c))
* Modify FactorRowCountEvaluator and FactorIndexEvaluator to return the ratio ([#328](https://github.com/microsoft/RD-Agent/issues/328)) ([8f43f8e](https://github.com/microsoft/RD-Agent/commit/8f43f8e87a92e05b541e925910608606ec8f6c4b))
* New competition - Optiver ([#356](https://github.com/microsoft/RD-Agent/issues/356)) ([3705efe](https://github.com/microsoft/RD-Agent/commit/3705efe3b923748655a57d76b7a236e54d361831))
* random forest for s3e11 ([#347](https://github.com/microsoft/RD-Agent/issues/347)) ([b57846d](https://github.com/microsoft/RD-Agent/commit/b57846d29314e9a5967945d1b4895f0f48c0f5ce))
* refine the code in model description and fix some bugs in feedback.py ([#288](https://github.com/microsoft/RD-Agent/issues/288)) ([5b124d7](https://github.com/microsoft/RD-Agent/commit/5b124d7372137e4c613eb2749ddcc773922cc7b6))
* refine the template in several Kaggle competitions ([#343](https://github.com/microsoft/RD-Agent/issues/343)) ([034f238](https://github.com/microsoft/RD-Agent/commit/034f238ed5ec351486b21250eabc75114961936c))
* Revise to support better hypothesis proposal ([#390](https://github.com/microsoft/RD-Agent/issues/390)) ([c55ec0a](https://github.com/microsoft/RD-Agent/commit/c55ec0a0f577bbf7fc6228f7b87d2089ded83b31))
* show workspace in demo ([#348](https://github.com/microsoft/RD-Agent/issues/348)) ([ddf567c](https://github.com/microsoft/RD-Agent/commit/ddf567c551b553788be022e9312c209ef6137d64))
* support Multi output ([#330](https://github.com/microsoft/RD-Agent/issues/330)) ([3d36c45](https://github.com/microsoft/RD-Agent/commit/3d36c452ff0983800e5343834cc69f24a508ea70))
* Supporting COVID-19 competition ([#374](https://github.com/microsoft/RD-Agent/issues/374)) ([a1b63db](https://github.com/microsoft/RD-Agent/commit/a1b63db79600edc9a74ba713c9d0be290214a592))
* supporting Mnist competition ([#375](https://github.com/microsoft/RD-Agent/issues/375)) ([e958a34](https://github.com/microsoft/RD-Agent/commit/e958a34f5632a46ac43bff8e0d07d6ed020fdfc2))
* Supporting Model Specifications ([#319](https://github.com/microsoft/RD-Agent/issues/319)) ([e126471](https://github.com/microsoft/RD-Agent/commit/e1264719e10b76158a91cd0ef331848e7c2de7c7))
* supporting various Kaggle competitions & scenarios for RD-Agent ([#409](https://github.com/microsoft/RD-Agent/issues/409)) ([75eea22](https://github.com/microsoft/RD-Agent/commit/75eea22cc3d4e6f5a94c88cce915e27c507f8c50))
* template for kaggle ([#308](https://github.com/microsoft/RD-Agent/issues/308)) ([ff97cf0](https://github.com/microsoft/RD-Agent/commit/ff97cf0155ab6941e4b5cf7d103575f934b70dc9))
* use auto gen seed when using LLM cache ([#441](https://github.com/microsoft/RD-Agent/issues/441)) ([ca15365](https://github.com/microsoft/RD-Agent/commit/ca15365d23eeb094f42cf3dc8f5269b2f1c42bd3))
* use unified pickle cacher & move llm config into a isolated config ([#424](https://github.com/microsoft/RD-Agent/issues/424)) ([2879ecf](https://github.com/microsoft/RD-Agent/commit/2879ecff816d97688b60909a79c7e568d42608a1))
* xgboost gpu accelerate ([#359](https://github.com/microsoft/RD-Agent/issues/359)) ([56a5b8f](https://github.com/microsoft/RD-Agent/commit/56a5b8f9b2c6726cc64ec5b04b4ce7935d59b572))
### Changed
- Rebranded from RD-Agent to Predix for EUR/USD quantitative trading
- Updated project metadata for PredixAI organization
### Fixed
- Removed all Chinese stock references, replaced with EUR/USD 1min FX data
- Migrated to 1min EURUSD data (2020-2026)
- Injected MultiIndex warning into factor interface prompt
### Bug Fixes
---
* a bug of developer& edit s4e8 template ([#338](https://github.com/microsoft/RD-Agent/issues/338)) ([f12ce72](https://github.com/microsoft/RD-Agent/commit/f12ce726e7de96d478a232a3c27f92439820f8b4))
* actively raised errors aer also considered as negative feedback. ([#268](https://github.com/microsoft/RD-Agent/issues/268)) ([46ec908](https://github.com/microsoft/RD-Agent/commit/46ec908e3594ac5e4cdc4057268e2f8800f5ed1f))
* bug of saving preprocess cache files ([#310](https://github.com/microsoft/RD-Agent/issues/310)) ([5fb0608](https://github.com/microsoft/RD-Agent/commit/5fb0608f39f113cc9807fb1f381284a0bd4da318))
* cache ([#383](https://github.com/microsoft/RD-Agent/issues/383)) ([f2a6e75](https://github.com/microsoft/RD-Agent/commit/f2a6e75b36ca96f7733b9c2a7154ac67bd2d7c6f))
* change css tag of kaggle competition info crawler ([#306](https://github.com/microsoft/RD-Agent/issues/306)) ([1e3d38b](https://github.com/microsoft/RD-Agent/commit/1e3d38bf1ca3654f3a90ff392ecba1dbb4e80224))
* debug dsagent ([#387](https://github.com/microsoft/RD-Agent/issues/387)) ([8fe9511](https://github.com/microsoft/RD-Agent/commit/8fe9511e606ba148c66f384add6ab94857079541))
* eval_method cannot catch run factor error ([#260](https://github.com/microsoft/RD-Agent/issues/260)) ([2aaab31](https://github.com/microsoft/RD-Agent/commit/2aaab317ccb7a0121063bcd85fc36c21c7b8a391))
* fix a bug in competition metric evaluation ([#407](https://github.com/microsoft/RD-Agent/issues/407)) ([94c47d6](https://github.com/microsoft/RD-Agent/commit/94c47d6fd5c3e38fc786a83e6d0d05e8d04498f3))
* fix a bug in mini case ([#389](https://github.com/microsoft/RD-Agent/issues/389)) ([e75bb57](https://github.com/microsoft/RD-Agent/commit/e75bb5746f63933b750406bbd34ee63c5ba76b9f))
* fix a bug in model tuning feedback ([#316](https://github.com/microsoft/RD-Agent/issues/316)) ([8aa088d](https://github.com/microsoft/RD-Agent/commit/8aa088da2dc7525a3970c01d01987246f47d6238))
* fix a bug in scenario.py ([#388](https://github.com/microsoft/RD-Agent/issues/388)) ([999a1eb](https://github.com/microsoft/RD-Agent/commit/999a1eb0eff9088e1b02419db741db4acf8d9ff7))
* fix a bug in the format of the model input ([#327](https://github.com/microsoft/RD-Agent/issues/327)) ([8f0574e](https://github.com/microsoft/RD-Agent/commit/8f0574eaaadb245b8c38e09ad4821306996d926f))
* fix a small bug in cache using module name and function name as unique folder name ([#429](https://github.com/microsoft/RD-Agent/issues/429)) ([4f8134a](https://github.com/microsoft/RD-Agent/commit/4f8134a697d952f7ac824d7ebeec64bbc4545ab3))
* fix a typo ([#362](https://github.com/microsoft/RD-Agent/issues/362)) ([9fafabd](https://github.com/microsoft/RD-Agent/commit/9fafabdf321b818bdd2211a2324d50cd0ebe1c1f))
* fix cache result logic ([#430](https://github.com/microsoft/RD-Agent/issues/430)) ([5e34263](https://github.com/microsoft/RD-Agent/commit/5e342637dcc862679fd0642c6ba9ef048c984845))
* fix command injection ([#421](https://github.com/microsoft/RD-Agent/issues/421)) ([52f30a6](https://github.com/microsoft/RD-Agent/commit/52f30a6184af1295be15e855a80b84bc424fc75d))
* fix json load error ([#386](https://github.com/microsoft/RD-Agent/issues/386)) ([bba55fb](https://github.com/microsoft/RD-Agent/commit/bba55fb48fe105f4847c1b9c476eedc80835f523))
* fix some bugs in feedback.py and refine the prompt ([#292](https://github.com/microsoft/RD-Agent/issues/292)) ([d834052](https://github.com/microsoft/RD-Agent/commit/d8340527f133dcc649d599d90d6402eddd37859e))
* fix some bugs in knowledge base ([#378](https://github.com/microsoft/RD-Agent/issues/378)) ([fa6ff8e](https://github.com/microsoft/RD-Agent/commit/fa6ff8e591cf1847df77d73116649c5623161573))
* fix some bugs in rag ([#399](https://github.com/microsoft/RD-Agent/issues/399)) ([194215c](https://github.com/microsoft/RD-Agent/commit/194215c4559aee5b6ece18d65c95fb30968e2db6))
* fix some bugs in the entire loop ([#274](https://github.com/microsoft/RD-Agent/issues/274)) ([8a564ec](https://github.com/microsoft/RD-Agent/commit/8a564ece1d87b27ee98b76db317935e802468965))
* fix some errors in scenario.py, proposal.py and runner.py and several complex competition scenarios([#365](https://github.com/microsoft/RD-Agent/issues/365)) ([2e383b1](https://github.com/microsoft/RD-Agent/commit/2e383b175d8448a67cb470f4e3ae8977d8ec6b5b))
* improve_execution_time_in_kaggle_loop ([#279](https://github.com/microsoft/RD-Agent/issues/279)) ([4c8f998](https://github.com/microsoft/RD-Agent/commit/4c8f998c76f1e983a5687d2c65d3251750f2a9a0))
* kaggle data mount problem ([#297](https://github.com/microsoft/RD-Agent/issues/297)) ([795df31](https://github.com/microsoft/RD-Agent/commit/795df311e3f93cd2f3fb51ba5698adaf10f6bd62))
* Optiver fixes ([#357](https://github.com/microsoft/RD-Agent/issues/357)) ([b054017](https://github.com/microsoft/RD-Agent/commit/b054017463af0d1784407030f2477d212118f341))
* partial bug in bench ([#368](https://github.com/microsoft/RD-Agent/issues/368)) ([af9808f](https://github.com/microsoft/RD-Agent/commit/af9808f98736a2df07e121c2f6d7bfeb7b7d3581))
* preprocess output format & some mistake in spelling ([#358](https://github.com/microsoft/RD-Agent/issues/358)) ([b8b2cd6](https://github.com/microsoft/RD-Agent/commit/b8b2cd6ccd3b27aa73de847e50899a8a53b71b8f))
* rag save file ([#385](https://github.com/microsoft/RD-Agent/issues/385)) ([1cb01dd](https://github.com/microsoft/RD-Agent/commit/1cb01dd6fe595f2f5fb86487601326611dd1a57a))
* raise error in demo when no Metric in a Loop ([#313](https://github.com/microsoft/RD-Agent/issues/313)) ([e46a78e](https://github.com/microsoft/RD-Agent/commit/e46a78eb69271cb19978aab2f3b976c2870ca082))
* refactor Bench ([#302](https://github.com/microsoft/RD-Agent/issues/302)) ([78a87f6](https://github.com/microsoft/RD-Agent/commit/78a87f624780ff67c0fa995ae4692678a120f99c))
* refine some codes ([#353](https://github.com/microsoft/RD-Agent/issues/353)) ([866c2e6](https://github.com/microsoft/RD-Agent/commit/866c2e63ffa3876a3d16ad37f96da41d0558b714))
* refine the prompt ([#286](https://github.com/microsoft/RD-Agent/issues/286)) ([77966c4](https://github.com/microsoft/RD-Agent/commit/77966c4f5e9f492c437c5b4b78d89c0f875ef0d8))
* refine the ucb algorithm ([#406](https://github.com/microsoft/RD-Agent/issues/406)) ([14f7d97](https://github.com/microsoft/RD-Agent/commit/14f7d976e03c92d6e727524e0cdad8a03b585016))
* revert model and make SOTA model available to COSTEER ([#351](https://github.com/microsoft/RD-Agent/issues/351)) ([3b7437b](https://github.com/microsoft/RD-Agent/commit/3b7437b87e685188259779cd85a78a0b592de9de))
* stop using markup in docker env print ([#336](https://github.com/microsoft/RD-Agent/issues/336)) ([3009889](https://github.com/microsoft/RD-Agent/commit/3009889b5e2605b5427c76f3084e0e58026bb5ae))
* support seed and fix absolute path ([#278](https://github.com/microsoft/RD-Agent/issues/278)) ([26352e1](https://github.com/microsoft/RD-Agent/commit/26352e13121cad5be95c0de78bb9f5dda4330614))
* template for kaggle foreset & s4e9 ([#334](https://github.com/microsoft/RD-Agent/issues/334)) ([2393a41](https://github.com/microsoft/RD-Agent/commit/2393a41e7237615ced2c3fdd5c49308236b9f276))
* test kaggle method ([#296](https://github.com/microsoft/RD-Agent/issues/296)) ([91a6196](https://github.com/microsoft/RD-Agent/commit/91a619618be1d7db660ea2b413a78dfaba9417a1))
* update code to fix a small bug in model cache md5 hash ([#303](https://github.com/microsoft/RD-Agent/issues/303)) ([b00e4dc](https://github.com/microsoft/RD-Agent/commit/b00e4dc2eff5b16029a2a12a6589eadac5cfd148))
* update new feature engineering code format ([#272](https://github.com/microsoft/RD-Agent/issues/272)) ([7850b80](https://github.com/microsoft/RD-Agent/commit/7850b8006a7c89d22629b345b4f361b0f35bc60d))
* Update prompts.yaml to constrain only one model type ([#341](https://github.com/microsoft/RD-Agent/issues/341)) ([5b5dfee](https://github.com/microsoft/RD-Agent/commit/5b5dfeefbc7eb9dcbd9923544005c5d281262c03))
* Update runner.py to fix a small bug ([#282](https://github.com/microsoft/RD-Agent/issues/282)) ([8aef3ab](https://github.com/microsoft/RD-Agent/commit/8aef3abcecd6002bd4bfeedcbe2c786d8bbfe2be))
* Use fixed file name in model costeer & fixing cache ([#311](https://github.com/microsoft/RD-Agent/issues/311)) ([1f910a5](https://github.com/microsoft/RD-Agent/commit/1f910a5248bc576895ed66c2f7b2c3e046a2bc28))
## Historical Changes (from RD-Agent upstream)
### Performance Improvements
* some small upgrade to factor costeer to improve the performance ([#420](https://github.com/microsoft/RD-Agent/issues/420)) ([9eb931f](https://github.com/microsoft/RD-Agent/commit/9eb931ffd971f252380dbd33ad1db259a4f229fd))
### Reverts
* Revert feat: Factor Implement Search Enhancement ([#294](https://github.com/microsoft/RD-Agent/issues/294)) ([#305](https://github.com/microsoft/RD-Agent/issues/305)) ([f663cf4](https://github.com/microsoft/RD-Agent/commit/f663cf42a2f75cd52aef1c6b18be7c27f0641fed))
## [0.2.1](https://github.com/microsoft/RD-Agent/compare/v0.2.0...v0.2.1) (2024-09-10)
### Bug Fixes
* default model value in config ([#256](https://github.com/microsoft/RD-Agent/issues/256)) ([c097585](https://github.com/microsoft/RD-Agent/commit/c097585f631f401c2c0966f6ad4c17286924f011))
* fix_dotenv_error ([#257](https://github.com/microsoft/RD-Agent/issues/257)) ([923063c](https://github.com/microsoft/RD-Agent/commit/923063c1fd957c4ed42e97272c72b5e9545451dc))
* readme ([#248](https://github.com/microsoft/RD-Agent/issues/248)) ([8cede22](https://github.com/microsoft/RD-Agent/commit/8cede2209922876490148459e1134da828e1fda0))
## [0.2.0](https://github.com/microsoft/RD-Agent/compare/v0.1.0...v0.2.0) (2024-09-07)
### Features
* add collect info ([#233](https://github.com/microsoft/RD-Agent/issues/233)) ([89f4af9](https://github.com/microsoft/RD-Agent/commit/89f4af90fb4d95a0689bf9efc8ffd9326469c0aa))
* add cross validation for kaggle scenario ([#236](https://github.com/microsoft/RD-Agent/issues/236)) ([e0b03ba](https://github.com/microsoft/RD-Agent/commit/e0b03ba6b5c3d9aa552b99d470e106d4e348e64d))
* add progress status for docker env ([#215](https://github.com/microsoft/RD-Agent/issues/215)) ([538d4ef](https://github.com/microsoft/RD-Agent/commit/538d4ef2e52de795b90d3f75b2e1e877ab85c18d))
* Added loop code for Kaggle scene. ([#211](https://github.com/microsoft/RD-Agent/issues/211)) ([975c327](https://github.com/microsoft/RD-Agent/commit/975c32715e51aec6b49537401f5fc59115e04a01))
* Demo display effect and usage ([#162](https://github.com/microsoft/RD-Agent/issues/162)) ([8cf122a](https://github.com/microsoft/RD-Agent/commit/8cf122a0155f434fa4477ae7a6d616b5caecd3e0))
* piloting of the framework ([#227](https://github.com/microsoft/RD-Agent/issues/227)) ([e9b103e](https://github.com/microsoft/RD-Agent/commit/e9b103e684fdd2b98cd1a89971a3fce2d6e884a1))
* support more models for kaggle scenario ([#223](https://github.com/microsoft/RD-Agent/issues/223)) ([e3a9659](https://github.com/microsoft/RD-Agent/commit/e3a96598c0720fe092ec86d7ca8c195c7d6bcc72))
* update model_experiment.py to support basic EDA ([#220](https://github.com/microsoft/RD-Agent/issues/220)) ([bf2684c](https://github.com/microsoft/RD-Agent/commit/bf2684c4d55ab8e1048ac0291695475ad53b0cd6))
### Bug Fixes
* fix some bugs in llm calling ([#217](https://github.com/microsoft/RD-Agent/issues/217)) ([7b010f8](https://github.com/microsoft/RD-Agent/commit/7b010f8b5940aba65a58f1d78192aa80bcd0e654))
* package dependency. ([#234](https://github.com/microsoft/RD-Agent/issues/234)) ([46be295](https://github.com/microsoft/RD-Agent/commit/46be2952952af534fd8d98a656c704c688d7cbdd))
* remove useless line ([#177](https://github.com/microsoft/RD-Agent/issues/177)) ([64e9a8e](https://github.com/microsoft/RD-Agent/commit/64e9a8e39a2072a962111db18f5b9565df5b0176))
## [0.1.0](https://github.com/microsoft/RD-Agent/compare/v0.0.1...v0.1.0) (2024-08-09)
### Features
* add entry for rdagent. ([#187](https://github.com/microsoft/RD-Agent/issues/187)) ([121b6d9](https://github.com/microsoft/RD-Agent/commit/121b6d98de38cd03be30cbee47b40baf39a2b60b))
* change ui entry ([#197](https://github.com/microsoft/RD-Agent/issues/197)) ([fa5d335](https://github.com/microsoft/RD-Agent/commit/fa5d3354d22240888f4fc4007d9834f7424632aa))
* remove pdfs and enable online pdf readings ([#183](https://github.com/microsoft/RD-Agent/issues/183)) ([18c0501](https://github.com/microsoft/RD-Agent/commit/18c05016a23d694c7b12759cf1322562dcffc56a))
### Bug Fixes
* Fix a fail href in readme ([#189](https://github.com/microsoft/RD-Agent/issues/189)) ([1b89218](https://github.com/microsoft/RD-Agent/commit/1b89218f6bc697494f4a1b8a42ad18963002714f))
* fix quick start problem ([#191](https://github.com/microsoft/RD-Agent/issues/191)) ([44f61bf](https://github.com/microsoft/RD-Agent/commit/44f61bfa1058a8efb59ca48b7f1417765aeea33e))
* update command line in readme.md ([#192](https://github.com/microsoft/RD-Agent/issues/192)) ([9c45d24](https://github.com/microsoft/RD-Agent/commit/9c45d24a192da02f7d9765cb001097da1bc36c61))
## 0.0.1 (2024-08-08)
### Features
* Add description for scenario experiments. ([#174](https://github.com/microsoft/RD-Agent/issues/174)) ([fbd8c6d](https://github.com/microsoft/RD-Agent/commit/fbd8c6d87e1424c08997103b8e8fbf264858c4ed))
* Added QlibFactorFromReportScenario and improved the report-factor loop. ([#161](https://github.com/microsoft/RD-Agent/issues/161)) ([882c79b](https://github.com/microsoft/RD-Agent/commit/882c79bf11583980e646b130f71cfa20201ffc7b))
* filter feature which is high correlation to former implemented features ([#145](https://github.com/microsoft/RD-Agent/issues/145)) ([e818326](https://github.com/microsoft/RD-Agent/commit/e818326422740e04a4863f7c3c18744dde2ad98f))
* Remove redundant 'key steps' section in frontend scene display. ([#169](https://github.com/microsoft/RD-Agent/issues/169)) ([e767005](https://github.com/microsoft/RD-Agent/commit/e76700513bee29232c93b97414419df330d9be8d))
* streamlit webapp demo for different scenarios ([#135](https://github.com/microsoft/RD-Agent/issues/135)) ([d8da7db](https://github.com/microsoft/RD-Agent/commit/d8da7db865e6653fc4740efee9a843b69bd79699))
* Uploaded Documentation, Updated Prompts & Some Code for model demo ([#144](https://github.com/microsoft/RD-Agent/issues/144)) ([529f935](https://github.com/microsoft/RD-Agent/commit/529f935aa98623f0dc1dda29eecee3ef738dd446))
### Bug Fixes
* Add framework handling for task coding failure. ([#176](https://github.com/microsoft/RD-Agent/issues/176)) ([5e14fa5](https://github.com/microsoft/RD-Agent/commit/5e14fa54a9dd30a94aebe2643b8c9a3b85517a11))
* Comprehensive update to factor extraction. ([#143](https://github.com/microsoft/RD-Agent/issues/143)) ([b5ea040](https://github.com/microsoft/RD-Agent/commit/b5ea04019fd5fa15c0f8b9a7e4f18f490f7057d4))
* first round app folder cleaning ([#166](https://github.com/microsoft/RD-Agent/issues/166)) ([6a5a750](https://github.com/microsoft/RD-Agent/commit/6a5a75021912927deb5e8e4c7ad3ec4b51bfc788))
* fix pickle problem ([#140](https://github.com/microsoft/RD-Agent/issues/140)) ([7ee4258](https://github.com/microsoft/RD-Agent/commit/7ee42587b60d94417f34332cee395cf210dc8a0e))
* fix release CI ([#165](https://github.com/microsoft/RD-Agent/issues/165)) ([85d6a5e](https://github.com/microsoft/RD-Agent/commit/85d6a5ed91113fda34ae079b23c89aa24acd2cb2))
* fix release CI error ([#160](https://github.com/microsoft/RD-Agent/issues/160)) ([1c9f8ef](https://github.com/microsoft/RD-Agent/commit/1c9f8ef287961731944acc9008496b4dddeddca7))
* fix several bugs in data mining scenario ([#147](https://github.com/microsoft/RD-Agent/issues/147)) ([b233380](https://github.com/microsoft/RD-Agent/commit/b233380e2c66fb030db39424f0f040c86e37f5c4))
* fix some small bugs in report-factor loop ([#152](https://github.com/microsoft/RD-Agent/issues/152)) ([a79f9f9](https://github.com/microsoft/RD-Agent/commit/a79f9f93406aff6305a76e6a6abd3852642e4c62))
* fix_release_ci_error ([#150](https://github.com/microsoft/RD-Agent/issues/150)) ([4f82e99](https://github.com/microsoft/RD-Agent/commit/4f82e9960a2638af9d831581185ddd3bac5711fc))
* Fixed some bugs introduced during refactoring. ([#167](https://github.com/microsoft/RD-Agent/issues/167)) ([f8f1445](https://github.com/microsoft/RD-Agent/commit/f8f1445283fb89aefeb2918243c35a219a51a56c))
* optimize some prompts in factor loop. ([#158](https://github.com/microsoft/RD-Agent/issues/158)) ([c2c1330](https://github.com/microsoft/RD-Agent/commit/c2c13300b9ad315a663ec2d0eada414e56c6f54f))
### Miscellaneous Chores
* release 0.0.1 ([1feacd3](https://github.com/microsoft/RD-Agent/commit/1feacd39b21193de11e9bbecf880ddf96d7c261c))
For earlier changes inherited from the RD-Agent project, see the [upstream changelog](https://github.com/microsoft/RD-Agent/blob/main/CHANGELOG.md).
+68 -6
View File
@@ -1,9 +1,71 @@
# Microsoft Open Source Code of Conduct
# Contributor Covenant Code of Conduct
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
## Our Pledge
Resources:
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)
- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
nico@predix.io.
All complaints will be reviewed and investigated promptly and fairly.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.
+50
View File
@@ -0,0 +1,50 @@
# Contributing to Predix
We welcome contributions and suggestions to improve Predix. Whether it's solving an issue, addressing a bug, enhancing documentation, or even correcting a typo, every contribution is valuable and helps improve the project.
## Getting Started
To get started, you can explore the issues list or search for `TODO:` comments in the codebase by running:
```sh
grep -r "TODO:"
```
## How to Contribute
1. **Fork the Repository**: Create a fork of the repository on GitHub.
2. **Clone the Repository**: Clone your forked repository to your local machine.
```sh
git clone https://github.com/your-username/predix.git
```
3. **Create a Branch**: Create a new branch for your changes.
```sh
git checkout -b feature/your-feature-name
```
4. **Make Changes**: Make your changes to the codebase.
5. **Commit Changes**: Commit your changes with a descriptive commit message.
```sh
git commit -m "Description of your changes"
```
6. **Push Changes**: Push your changes to your forked repository.
```sh
git push origin feature/your-feature-name
```
7. **Ensure CI Passes**: Make sure your code passes the automatic CI checks on GitHub.
8. **Create a Pull Request**: Create a pull request from your forked repository to the main repository.
## Code of Conduct
Please adhere to the [Code of Conduct](CODE_OF_CONDUCT.md) in all your interactions with the project.
## Reporting Issues
If you encounter any issues or have suggestions for improvements, please open an issue on GitHub.
## Guidelines
- Ensure your code follows the project's coding standards.
- Write clear and concise commit messages.
- Update documentation as needed.
- Test your changes thoroughly before submitting a pull request.
Thank you for contributing to Predix!
+17 -17
View File
@@ -1,21 +1,21 @@
MIT License
MIT License
Copyright (c) Microsoft Corporation.
Copyright (c) 2025 Predix Team
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+9 -7
View File
@@ -19,7 +19,7 @@ CONSTRAINTS_FILE := constraints/$(PYTHON_VERSION).txt
PUBLIC_DIR := $(shell [ "$$READTHEDOCS" = "True" ] && echo "$$READTHEDOCS_OUTPUT/html" || echo "public")
# URL and Path of changelog source code.
CHANGELOG_URL := $(shell echo $${CI_PAGES_URL:-https://microsoft.github.io/rdagent}/_sources/changelog.md.txt)
CHANGELOG_URL := $(shell echo $${CI_PAGES_URL:-https://predixai.github.io/predix}/_sources/changelog.md.txt)
CHANGELOG_PATH := docs/changelog.md
########################################################################################
@@ -67,7 +67,9 @@ init-qlib-env:
@source $$(conda info --base)/etc/profile.d/conda.sh && conda activate qlibRDAgent && which pip && pip install pyqlib && pip install ruamel-yaml==0.17.21 && pip install torch==2.1.1 && pip install catboost==0.24.3 && conda deactivate
dev:
$(PIPRUN) pip install -U pip setuptools wheel
$(PIPRUN) pip install -e .[docs,lint,package,test] -c $(CONSTRAINTS_FILE)
$(PIPRUN) pip install -U kaggle
if [ "$(CI)" != "true" ] && command -v pre-commit > /dev/null 2>&1; then pre-commit install --hook-type pre-push; fi
# Generate constraints for current Python version.
@@ -81,23 +83,23 @@ constraints: deepclean
# Check lint with black.
black:
$(PIPRUN) python -m black --check --diff . --extend-exclude test/scripts --extend-exclude git_ignore_folder -l 120
$(PIPRUN) python -m black --check --diff . --extend-exclude "(test/scripts|test/notebook/testfiles|git_ignore_folder|web)" -l 120
# Check lint with isort.
isort:
$(PIPRUN) python -m isort --check . -s git_ignore_folder -s test/scripts
$(PIPRUN) python -m isort --check . -s git_ignore_folder -s test/scripts -s test/notebook/testfiles -s web
# Check lint with mypy.
# First deal with the core folder, and then gradually increase the scope of detection,
# and eventually realize the detection of the complete project.
mypy:
$(PIPRUN) python -m mypy rdagent/core # --exclude rdagent/scripts,git_ignore_folder
$(PIPRUN) python -m mypy rdagent/core
# Check lint with ruff.
# First deal with the core folder, and then gradually increase the scope of detection,
# and eventually realize the detection of the complete project.
ruff:
$(PIPRUN) ruff check rdagent/core --ignore FBT001,FBT002,I001 # --exclude rdagent/scripts,git_ignore_folder
$(PIPRUN) ruff check rdagent/core --ignore FBT001,FBT002,I001,E501 # --exclude rdagent/scripts,git_ignore_folder
# Check lint with toml-sort.
toml-sort:
@@ -118,11 +120,11 @@ pre-commit:
# Auto lint with black.
auto-black:
$(PIPRUN) python -m black . --extend-exclude test/scripts --extend-exclude git_ignore_folder -l 120
$(PIPRUN) python -m black . --extend-exclude "(test/scripts|test/notebook/testfiles|git_ignore_folder|.venv|web)" -l 120
# Auto lint with isort.
auto-isort:
$(PIPRUN) python -m isort . -s git_ignore_folder -s test/scripts
$(PIPRUN) python -m isort . -s git_ignore_folder -s test/scripts -s test/notebook/testfiles -s .venv -s web
# Auto lint with toml-sort.
auto-toml-sort:
+277 -226
View File
@@ -1,262 +1,313 @@
# Predix
<h4 align="center">
<img src="docs/_static/logo.png" alt="RA-Agent logo" style="width:70%; ">
<a href="https://rdagent.azurewebsites.net" target="_blank">🖥️ Live Demo</a> | <a href="https://rdagent.azurewebsites.net/factor_loop" target="_blank">🎥 Demo Video</a> <a href="https://www.youtube.com/watch?v=JJ4JYO3HscM&list=PLALmKB0_N3_i52fhUmPQiL4jsO354uopR" target="_blank">▶️YouTube</a> | <a href="https://rdagent.readthedocs.io/en/latest/index.html" target="_blank">📖 Documentation</a> | <a href="#-paperwork-list"> 📃 Papers </a>
</h3>
<strong>AI-powered Quantitative Trading Agent for EUR/USD Forex</strong>
</h4>
<p align="center">
<a href="#installation">Installation</a> •
<a href="#quick-start">Quick Start</a> •
<a href="#configuration">Configuration</a> •
<a href="#features">Features</a>
</p>
[![CI](https://github.com/microsoft/RD-Agent/actions/workflows/ci.yml/badge.svg)](https://github.com/microsoft/RD-Agent/actions/workflows/ci.yml)
[![CodeQL](https://github.com/microsoft/RD-Agent/actions/workflows/github-code-scanning/codeql/badge.svg)](https://github.com/microsoft/RD-Agent/actions/workflows/github-code-scanning/codeql)
[![Dependabot Updates](https://github.com/microsoft/RD-Agent/actions/workflows/dependabot/dependabot-updates/badge.svg)](https://github.com/microsoft/RD-Agent/actions/workflows/dependabot/dependabot-updates)
[![Lint PR Title](https://github.com/microsoft/RD-Agent/actions/workflows/pr.yml/badge.svg)](https://github.com/microsoft/RD-Agent/actions/workflows/pr.yml)
[![Release.yml](https://github.com/microsoft/RD-Agent/actions/workflows/release.yml/badge.svg)](https://github.com/microsoft/RD-Agent/actions/workflows/release.yml)
[![Platform](https://img.shields.io/badge/platform-Linux-blue)](https://pypi.org/project/rdagent/#files)
[![PyPI](https://img.shields.io/pypi/v/rdagent)](https://pypi.org/project/rdagent/)
[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/rdagent)](https://pypi.org/project/rdagent/)
[![Release](https://img.shields.io/github/v/release/microsoft/RD-Agent)](https://github.com/microsoft/RD-Agent/releases)
[![GitHub](https://img.shields.io/github/license/microsoft/RD-Agent)](https://github.com/microsoft/RD-Agent/blob/main/LICENSE)
[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit)](https://github.com/pre-commit/pre-commit)
[![Checked with mypy](https://www.mypy-lang.org/static/mypy_badge.svg)](http://mypy-lang.org/)
[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
[![Chat](https://img.shields.io/badge/chat-discord-blue)](https://discord.gg/ybQ97B6Jjy)
[![Readthedocs Preview](https://github.com/microsoft/RD-Agent/actions/workflows/readthedocs-preview.yml/badge.svg)](https://github.com/microsoft/RD-Agent/actions/workflows/readthedocs-preview.yml) <!-- this badge is too long, please place it in the last one to make it pretty -->
<p align="center">
<a href="https://github.com/PredixAI/predix/blob/main/LICENSE"><img src="https://img.shields.io/github/license/PredixAI/predix" alt="License"></a>
<a href="https://pypi.org/project/predix/"><img src="https://img.shields.io/pypi/v/predix" alt="PyPI"></a>
<a href="https://github.com/PredixAI/predix/actions/workflows/ci.yml"><img src="https://github.com/PredixAI/predix/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
<a href="https://github.com/astral-sh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff"></a>
</p>
# 📰 News
| 🗞️ News | 📝 Description |
| -- | ------ |
| Official WeChat group release | We created a WeChat group, welcome to join! (🗪[QR Code](docs/WeChat_QR_code.jpg)) |
| Official Discord release | We launch our first chatting channel in Discord (🗪[![Chat](https://img.shields.io/badge/chat-discord-blue)](https://discord.gg/ybQ97B6Jjy)) |
| First release | **RDAgent** is released on GitHub |
---
## Overview
# 🌟 Introduction
<div align="center">
<img src="docs/_static/scen.png" alt="Our focused scenario" style="width:80%; ">
</div>
**Predix** is an autonomous AI agent for quantitative trading strategies in the EUR/USD forex market. Built on a multi-agent framework, Predix automates the full research and development cycle:
RDAgent aims to automate the most critical and valuable aspects of the industrial R&D process, and we begin with focusing on the data-driven scenarios to streamline the development of models and data.
Methodologically, we have identified a framework with two key components: 'R' for proposing new ideas and 'D' for implementing them.
We believe that the automatic evolution of R&D will lead to solutions of significant industrial value.
- 📊 **Data Analysis** Automatically analyzes market patterns and microstructure
- 💡 **Strategy Discovery** Proposes novel trading factors and signals
- 🧠 **Model Evolution** Iteratively improves predictive models
- 📈 **Backtesting** Validates strategies on historical 1-minute data
Predix is optimized for **1-minute EUR/USD FX data** (20202026) and uses Qlib as the underlying backtesting engine.
<!-- Tag Cloud -->
R&D is a very general scenario. The advent of RDAgent can be your
- 💰 **Automatic Quant Factory** ([🎥Demo Video](https://rdagent.azurewebsites.net/factor_loop)|[▶️YouTube](https://www.youtube.com/watch?v=X4DK2QZKaKY&t=6s))
- 🤖 **Data Mining Agent:** Iteratively proposing data & models ([🎥Demo Video 1](https://rdagent.azurewebsites.net/model_loop)|[▶️YouTube](https://www.youtube.com/watch?v=dm0dWL49Bc0&t=104s)) ([🎥Demo Video 2](https://rdagent.azurewebsites.net/dmm)|[▶️YouTube](https://www.youtube.com/watch?v=VIaSTZuoZg4)) and implementing them by gaining knowledge from data.
- 🦾 **Research Copilot:** Auto read research papers ([🎥Demo Video](https://rdagent.azurewebsites.net/report_model)|[▶️YouTube](https://www.youtube.com/watch?v=BiA2SfdKQ7o)) / financial reports ([🎥Demo Video](https://rdagent.azurewebsites.net/report_factor)|[▶️YouTube](https://www.youtube.com/watch?v=ECLTXVcSx-c)) and implement model structures or building datasets.
- ...
---
You can click the links above to view the demo. We're continuously adding more methods and scenarios to the project to enhance your R&D processes and boost productivity.
## Installation
Additionally, you can take a closer look at the examples in our **[🖥️ Live Demo](https://rdagent.azurewebsites.net/)**.
### Prerequisites
<div align="center">
<a href="https://rdagent.azurewebsites.net/" target="_blank">
<img src="docs/_static/demo.png" alt="Watch the demo" width="80%">
</a>
</div>
- **Python 3.10 or 3.11**
- **Docker** (required for sandboxed code execution)
- **Linux** (officially supported; macOS/Windows may work with adjustments)
# ⚡ Quick start
You can try above demos by running the following command:
### 🐳 Docker installation.
Users must ensure Docker is installed before attempting most scenarios. Please refer to the [official 🐳Docker page](https://docs.docker.com/engine/install/) for installation instructions.
### 🐍 Create a Conda Environment
- Create a new conda environment with Python (3.10 and 3.11 are well-tested in our CI):
```sh
conda create -n rdagent python=3.10
```
- Activate the environment:
```sh
conda activate rdagent
```
### 🛠️ Install the RDAgent
- You can directly install the RDAgent package from PyPI:
```sh
pip install rdagent
```
### ⚙️ Configuration
- You have to config your GPT model in the `.env`
```bash
cat << EOF > .env
OPENAI_API_KEY=<your_api_key>
# EMBEDDING_MODEL=text-embedding-3-small
CHAT_MODEL=gpt-4-turbo
EOF
```
### 🚀 Run the Application
The **[🖥️ Live Demo](https://rdagent.azurewebsites.net/)** is implemented by the following commands(each item represents one demo, you can select the one you prefer):
- Run the **Automated Quantitative Trading & Iterative Factors Evolution**: [Qlib](http://github.com/microsoft/qlib) self-loop factor proposal and implementation application
```sh
rdagent fin_factor
```
- Run the **Automated Quantitative Trading & Iterative Model Evolution**: [Qlib](http://github.com/microsoft/qlib) self-loop model proposal and implementation application
```sh
rdagent fin_model
```
- Run the **Automated Medical Prediction Model Evolution**: Medical self-loop model proposal and implementation application
>(1) Apply for an account at [PhysioNet](https://physionet.org/). <br /> (2) Request access to FIDDLE preprocessed data: [FIDDLE Dataset](https://physionet.org/content/mimic-eicu-fiddle-feature/1.0.0/). <br />
(3) Place your username and password in `.env`.
```bash
cat << EOF >> .env
DM_USERNAME=<your_username>
DM_PASSWORD=<your_password>
EOF
```
```sh
rdagent med_model
```
- Run the **Automated Quantitative Trading & Factors Extraction from Financial Reports**: Run the [Qlib](http://github.com/microsoft/qlib) factor extraction and implementation application based on financial reports
```sh
# 1. Generally, you can run this scenario using the following command:
rdagent fin_factor_report --report_folder=<Your financial reports folder path>
# 2. Specifically, you need to prepare some financial reports first. You can follow this concrete example:
wget https://github.com/SunsetWolf/rdagent_resource/releases/download/reports/all_reports.zip
unzip all_reports.zip -d git_ignore_folder/reports
rdagent fin_factor_report --report_folder=git_ignore_folder/reports
```
- Run the **Automated Model Research & Development Copilot**: model extraction and implementation application
```sh
# 1. Generally, you can run your own papers/reports with the following command:
rdagent general_model <Your paper URL>
# 2. Specifically, you can do it like this. For more details and additional paper examples, use `rdagent general_model -h`:
rdagent general_model "https://arxiv.org/pdf/2210.09789"
```
### 🖥️ Monitor the Application Results
- You can serve our demo app to monitor the RD loop by running the following command:
```sh
rdagent ui --port 80 --log_dir <your log folder like "log/">
```
# 🏭 Scenarios
We have applied RD-Agent to multiple valuable data-driven industrial scenarios.
## 🎯 Goal: Agent for Data-driven R&D
In this project, we are aiming to build an Agent to automate Data-Driven R\&D that can
+ 📄 Read real-world material (reports, papers, etc.) and **extract** key formulas, descriptions of interested **features** and **models**, which are the key components of data-driven R&D .
+ 🛠️ **Implement** the extracted formulas (e.g., features, factors, and models) in runnable codes.
+ Due to the limited ability of LLM in implementing at once, build an evolving process for the agent to improve performance by learning from feedback and knowledge.
+ 💡 Propose **new ideas** based on current knowledge and observations.
<!-- ![Data-Centric R&D Overview](docs/_static/overview.png) -->
## 📈 Scenarios/Demos
In the two key areas of data-driven scenarios, model implementation and data building, our system aims to serve two main roles: 🦾Copilot and 🤖Agent.
- The 🦾Copilot follows human instructions to automate repetitive tasks.
- The 🤖Agent, being more autonomous, actively proposes ideas for better results in the future.
The supported scenarios are listed below:
| Scenario/Target | Model Implementation | Data Building |
| -- | -- | -- |
| **💹 Finance** | 🤖 [Iteratively Proposing Ideas & Evolving](https://rdagent.azurewebsites.net/model_loop)[▶️YouTube](https://www.youtube.com/watch?v=dm0dWL49Bc0&t=104s) | 🤖 [Iteratively Proposing Ideas & Evolving](https://rdagent.azurewebsites.net/factor_loop) [▶️YouTube](https://www.youtube.com/watch?v=X4DK2QZKaKY&t=6s) <br/> 🦾 [Auto reports reading & implementation](https://rdagent.azurewebsites.net/report_factor)[▶️YouTube](https://www.youtube.com/watch?v=ECLTXVcSx-c) |
| **🩺 Medical** | 🤖 [Iteratively Proposing Ideas & Evolving](https://rdagent.azurewebsites.net/dmm)[▶️YouTube](https://www.youtube.com/watch?v=VIaSTZuoZg4) | - |
| **🏭 General** | 🦾 [Auto paper reading & implementation](https://rdagent.azurewebsites.net/report_model)[▶️YouTube](https://www.youtube.com/watch?v=BiA2SfdKQ7o) | - |
Different scenarios vary in entrance and configuration. Please check the detailed setup tutorial in the scenarios documents.
Here is a gallery of [successful explorations](https://github.com/SunsetWolf/rdagent_resource/releases/download/demo_traces/demo_traces.zip) (5 traces showed in **[🖥️ Live Demo](https://rdagent.azurewebsites.net/)**). You can download and view the execution trace using the command below:
### Quick Install
```bash
rdagent ui --port 80 --log_dir ./demo_traces
# Install from PyPI
pip install predix
# Or install from source
git clone https://github.com/PredixAI/predix
cd predix
pip install -e .
```
Please refer to **[📖readthedocs_scen](https://rdagent.readthedocs.io/en/latest/scens/catalog.html)** for more details of the scenarios.
### Development Setup
# ⚙️ Framework
```bash
# Create conda environment
conda create -n predix python=3.10
conda activate predix
<div align="center">
<img src="docs/_static/Framework-RDAgent.png" alt="Framework-RDAgent" width="85%">
</div>
# Install in editable mode with dev dependencies
make dev
```
---
Automating the R&D process in data science is a highly valuable yet underexplored area in industry. We propose a framework to push the boundaries of this important research field.
## Quick Start
The research questions within this framework can be divided into three main categories:
| Research Area | Paper/Work List |
|--------------------|-----------------|
| **Benchmark the R&D abilities** | [Benchmark](#benchmark) |
| **Idea proposal:** Explore new ideas or refine existing ones | [Research](#research) |
| **Ability to realize ideas:** Implement and execute ideas | [Development](#development) |
### 1. Health Check
We believe that the key to delivering high-quality solutions lies in the ability to evolve R&D capabilities. Agents should learn like human experts, continuously improving their R&D skills.
Verify your environment is properly configured:
More documents can be found in the **[📖 readthedocs](https://rdagent.readthedocs.io/)**.
```bash
rdagent health_check --no-check-env
```
# 📃 Paper/Work list
### 2. Configure LLM Backend
## 📊 Benchmark
- [Towards Data-Centric Automatic R&D](https://arxiv.org/abs/2404.11276)
```BibTeX
@misc{chen2024datacentric,
title={Towards Data-Centric Automatic R&D},
author={Haotian Chen and Xinjie Shen and Zeqi Ye and Wenjun Feng and Haoxue Wang and Xiao Yang and Xu Yang and Weiqing Liu and Jiang Bian},
year={2024},
eprint={2404.11276},
archivePrefix={arXiv},
primaryClass={cs.AI}
Create a `.env` file in your project root:
```bash
# Example: OpenAI configuration
cat << EOF > .env
CHAT_MODEL=gpt-4o
EMBEDDING_MODEL=text-embedding-3-small
OPENAI_API_BASE=https://api.openai.com/v1
OPENAI_API_KEY=your-api-key-here
EOF
```
**Alternative providers:**
- **Azure OpenAI**: Set `AZURE_API_KEY`, `AZURE_API_BASE`, `AZURE_API_VERSION`
- **DeepSeek**: Use `CHAT_MODEL=deepseek/deepseek-chat` with `DEEPSEEK_API_KEY`
- **SiliconFlow (embedding)**: Use `EMBEDDING_MODEL=litellm_proxy/BAAI/bge-m3`
### 3. Run Quantitative Trading Loop
```bash
# Full factor & model co-evolution
rdagent fin_quant
# Factor-only evolution
rdagent fin_factor
# Model-only evolution
rdagent fin_model
```
### 4. Monitor Results
```bash
# Start the UI dashboard
rdagent ui --port 19899 --log-dir log/ --data-science
```
Then open `http://127.0.0.1:19899` in your browser.
---
## Configuration
### Data Configuration
Edit [`data_config.yaml`](data_config.yaml) to customize:
```yaml
instrument: EURUSD
frequency: 1min
data_path: ~/.qlib/qlib_data/eurusd_1min_data
# Walk-forward split
train_start: "2022-03-14"
train_end: "2024-06-30"
valid_start: "2024-07-01"
valid_end: "2024-12-31"
test_start: "2025-01-01"
test_end: "2026-03-20"
# Market context for LLM prompts
market_context:
spread_bps: 1.5
target_arr: 9.62 # Target annual return (%)
max_drawdown: 20 # Max drawdown (%)
```
### Environment Variables
| Variable | Description | Example |
|----------|-------------|---------|
| `CHAT_MODEL` | LLM for reasoning | `gpt-4o`, `deepseek-chat` |
| `EMBEDDING_MODEL` | Embedding model | `text-embedding-3-small` |
| `OPENAI_API_KEY` | API key for OpenAI | `sk-...` |
| `DEEPSEEK_API_KEY` | API key for DeepSeek | `sk-...` |
| `DS_LOCAL_DATA_PATH` | Local data directory | `./data` |
---
## Features
### 🔄 Iterative Factor Evolution
Predix continuously proposes, implements, and validates new alpha factors:
- Learns from backtest feedback
- Avoids overfitting through walk-forward validation
- Discovers non-obvious patterns in order flow, volatility, and session dynamics
### 🧠 Model Architecture Search
Automatically explores and refines predictive models:
- Linear baselines (LightGBM, XGBoost)
- Deep learning (LSTM, Transformer, Temporal CNN)
- Ensemble methods
### 📚 Knowledge Base
Built-in knowledge accumulation across loops:
- Successful factors are archived
- Failed attempts inform future proposals
- Cross-loop learning improves robustness
### 🖥️ Interactive UI
Real-time dashboard for monitoring:
- Factor performance metrics
- Model architecture evolution
- Cumulative returns and drawdowns
- Code diffs and implementation history
---
## Project Structure
```
predix/
├── rdagent/ # Core agent framework
│ ├── app/ # CLI and scenario apps
│ ├── components/ # Reusable agent components
│ ├── core/ # Core abstractions
│ ├── scenarios/ # Domain-specific scenarios
│ └── utils/ # Utilities
├── constraints/ # Constraint definitions
├── docs/ # Documentation
├── web/ # Web UI frontend
├── data_config.yaml # Data configuration
├── pyproject.toml # Project metadata
└── requirements.txt # Dependencies
```
---
## Data Setup
Predix uses 1-minute EUR/USD data. To prepare your dataset:
```bash
# Run the data setup script (if provided)
./setup_predix_eurusd.sh
# Or manually place data in:
# ~/.qlib/qlib_data/eurusd_1min_data/
```
Expected data columns: `$open`, `$close`, `$high`, `$low`, `$volume`
---
## CLI Commands
| Command | Description |
|---------|-------------|
| `rdagent fin_quant` | Full factor & model co-evolution |
| `rdagent fin_factor` | Factor-only evolution |
| `rdagent fin_model` | Model-only evolution |
| `rdagent fin_factor_report --report-folder=<path>` | Extract factors from financial reports |
| `rdagent general_model <paper-url>` | Extract model from research paper |
| `rdagent data_science --competition <name>` | Kaggle/data science competition mode |
| `rdagent ui --port 19899 --log-dir <path>` | Start monitoring dashboard |
| `rdagent health_check` | Validate environment setup |
---
## Requirements
Core dependencies (see [`requirements.txt`](requirements.txt) for full list):
- **LLM**: `openai`, `litellm`
- **Data**: `pandas`, `numpy`, `pyarrow`
- **ML**: `scikit-learn`, `lightgbm`, `xgboost`
- **Backtesting**: `qlib` (via Docker)
- **UI**: `streamlit`, `plotly`, `flask`
---
## License
This project is licensed under the **MIT License** see the [`LICENSE`](LICENSE) file for details.
---
## Contributing
Contributions are welcome! Please:
1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
For major changes, please open an issue first to discuss your approach.
---
## Citation
If you use Predix in your research, please cite the underlying framework:
```bibtex
@misc{yang2025rdagentllmagentframeworkautonomous,
title={R&D-Agent: An LLM-Agent Framework Towards Autonomous Data Science},
author={Yang, Xu and Yang, Xiao and Fang, Shikai and Zhang, Yifei and Wang, Jian and Xian, Bowen and Li, Qizheng and Li, Jingyuan and Xu, Minrui and Li, Yuante and others},
year={2025},
eprint={2505.14738},
archivePrefix={arXiv},
primaryClass={cs.AI}
}
```
![image](https://github.com/user-attachments/assets/494f55d3-de9e-4e73-ba3d-a787e8f9e841)
## 🔍 Research
---
In a data mining expert's daily research and development process, they propose a hypothesis (e.g., a model structure like RNN can capture patterns in time-series data), design experiments (e.g., finance data contains time-series and we can verify the hypothesis in this scenario), implement the experiment as code (e.g., Pytorch model structure), and then execute the code to get feedback (e.g., metrics, loss curve, etc.). The experts learn from the feedback and improve in the next iteration.
## Support
Based on the principles above, we have established a basic method framework that continuously proposes hypotheses, verifies them, and gets feedback from the real-world practice. This is the first scientific research automation framework that supports linking with real-world verification.
- **Issues**: [GitHub Issues](https://github.com/PredixAI/predix/issues)
- **Documentation**: [Read the Docs](https://rdagent.readthedocs.io/)
For more detail, please refer to our **[🖥️ Live Demo page](https://rdagent.azurewebsites.net)**.
---
## 🛠️ Development
## Disclaimer
- [Collaborative Evolving Strategy for Automatic Data-Centric Development](https://arxiv.org/abs/2407.18690)
```BibTeX
@misc{yang2024collaborative,
title={Collaborative Evolving Strategy for Automatic Data-Centric Development},
author={Xu Yang and Haotian Chen and Wenjun Feng and Haoxue Wang and Zeqi Ye and Xinjie Shen and Xiao Yang and Shizhao Sun and Weiqing Liu and Jiang Bian},
year={2024},
eprint={2407.18690},
archivePrefix={arXiv},
primaryClass={cs.AI}
}
```
![image](https://github.com/user-attachments/assets/75d9769b-0edd-4caf-9d45-57d1e577054b)
Predix is provided "as is" for **research and educational purposes only**. It is **not** intended for:
- Live trading or financial advice
- Production use without thorough testing
- Replacement of qualified financial professionals
# 🤝 Contributing
## 📝 Guidelines
This project welcomes contributions and suggestions.
Contributing to this project is straightforward and rewarding. Whether it's solving an issue, addressing a bug, enhancing documentation, or even correcting a typo, every contribution is valuable and helps improve RDAgent.
To get started, you can explore the issues list, or search for `TODO:` comments in the codebase by running the command `grep -r "TODO:"`.
<img src="https://img.shields.io/github/contributors-anon/microsoft/RD-Agent"/>
<a href="https://github.com/microsoft/RD-Agent/graphs/contributors">
<img src="https://contrib.rocks/image?repo=microsoft/RD-Agent&max=100&columns=15" />
</a>
Before we released RD-Agent as an open-source project on GitHub, it was an internal project within our group. Unfortunately, the internal commit history was not preserved when we removed some confidential code. As a result, some contributions from our group members, including Haotian Chen, Wenjun Feng, Haoxue Wang, Zeqi Ye, Xinjie Shen, and Jinhui Li, were not included in the public commits.
# ⚖️ Legal disclaimer
<p style="line-height: 1; font-style: italic;">The RD-agent is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. The RD-agent is aimed to facilitate research and development process in the financial industry and not ready-to-use for any financial investment or advice. Users shall independently assess and test the risks of the RD-agent in a specific use scenario, ensure the responsible use of AI technology, including but not limited to developing and integrating risk mitigation measures, and comply with all applicable laws and regulations in all applicable jurisdictions. The RD-agent does not provide financial opinions or reflect the opinions of Microsoft, nor is it designed to replace the role of qualified financial professionals in formulating, assessing, and approving finance products. The inputs and outputs of the RD-agent belong to the users and users shall assume all liability under any theory of liability, whether in contract, torts, regulatory, negligence, products liability, or otherwise, associated with use of the RD-agent and any inputs and outputs thereof.</p>
Users assume all liability and should comply with applicable laws and regulations in their jurisdiction. Past performance does not guarantee future results.
+8 -29
View File
@@ -1,41 +1,20 @@
<!-- BEGIN MICROSOFT SECURITY.MD V0.0.9 BLOCK -->
# Security Policy
## Security
## Reporting a Vulnerability
Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet) and [Xamarin](https://github.com/xamarin).
If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/security.md/definition), please report it to us as described below.
## Reporting Security Issues
We take the security of Predix seriously. If you believe you have found a security vulnerability, please report it to us as described below.
**Please do not report security vulnerabilities through public GitHub issues.**
Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/security.md/msrc/create-report).
Instead, please report them via email to:
- **Email**: nico@predix.io
If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/security.md/msrc/pgp).
You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc).
Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:
* Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)
* Full paths of source file(s) related to the manifestation of the issue
* The location of the affected source code (tag/branch/commit or direct URL)
* Any special configuration required to reproduce the issue
* Step-by-step instructions to reproduce the issue
* Proof-of-concept or exploit code (if possible)
* Impact of the issue, including how an attacker might exploit the issue
This information will help us triage your report more quickly.
If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/security.md/msrc/bounty) page for more details about our active programs.
You should receive a response within 48 hours. If for some reason you do not, please follow up via email to ensure we received your original message.
## Preferred Languages
We prefer all communications to be in English.
## Policy
## Security Updates
Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/security.md/cvd).
<!-- END MICROSOFT SECURITY.MD BLOCK -->
Security updates will be released as patch versions. Please ensure you are using the latest version of Predix to benefit from security fixes.
+25 -25
View File
@@ -1,25 +1,25 @@
# TODO: The maintainer of this repo has not yet edited this file
**REPO OWNER**: Do you want Customer Service & Support (CSS) support for this product/project?
- **No CSS support:** Fill out this template with information about how to file issues and get help.
- **Yes CSS support:** Fill out an intake form at [aka.ms/onboardsupport](https://aka.ms/onboardsupport). CSS will work with/help you to determine next steps.
- **Not sure?** Fill out an intake as though the answer were "Yes". CSS will help you decide.
*Then remove this first heading from this SUPPORT.MD file before publishing your repo.*
# Support
## How to file issues and get help
This project uses GitHub Issues to track bugs and feature requests. Please search the existing
issues before filing new issues to avoid duplicates. For new issues, file your bug or
feature request as a new Issue.
For help and questions about using this project, please **REPO MAINTAINER: INSERT INSTRUCTIONS HERE
FOR HOW TO ENGAGE REPO OWNERS OR COMMUNITY FOR HELP. COULD BE A STACK OVERFLOW TAG OR OTHER
CHANNEL. WHERE WILL YOU HELP PEOPLE?**.
## Microsoft Support Policy
Support for this **PROJECT or PRODUCT** is limited to the resources listed above.
# Support
## How to file issues and get help
This project uses GitHub Issues to track bugs and feature requests. Please search the existing
issues before filing new issues to avoid duplicates. For new issues, file your bug or
feature request as a new Issue.
- **Issues**: [https://github.com/PredixAI/predix/issues](https://github.com/PredixAI/predix/issues)
For help and questions about using this project, please reach out via:
- **Email**: nico@predix.io
- **GitHub Discussions**: [https://github.com/PredixAI/predix/discussions](https://github.com/PredixAI/predix/discussions)
## Community Support
We encourage users to help each other through GitHub Discussions or by contributing
answers to issues. If you find a solution to a problem, please consider sharing it
publicly to help others.
## Support Policy
Support is provided on a best-effort basis by the maintainers and community.
For critical issues or commercial support needs, please contact the maintainers directly.
+14 -8
View File
@@ -1,10 +1,16 @@
We encourage to set the TODOs in code. But some TODOs are more global.
So we place it here.
# TODOs
This file tracks global TODOs for the Predix project. Individual TODOs in code should be addressed in their respective modules.
- [ ] Aligning the naming of files in components & scenarios.
- We would like to have the same logic for naming convention in components(reusable components for all scenarios) and scenarios (componets for specific scenario).
- But now we have following mismatch
- `coder` in `components` & `developer` in `components`
- [ ] The name of the folders mismatch with the content in them.
- Why are scenarios in experiments?
## Current Global TODOs
- [ ] Align naming conventions for files in `components/` and `scenarios/` directories
- Current mismatch: `coder` in `components/` vs `developer` in `scenarios/`
- [ ] Clean up folder naming inconsistencies
- Investigate why some scenario-related code is in `experiments/` folders
## Completed
- [x] Rebrand from RD-Agent to Predix for EUR/USD focus
- [x] Remove Microsoft-specific references
- [x] Update documentation for PredixAI organization
+91
View File
@@ -0,0 +1,91 @@
#!/usr/bin/env python3
"""
Liest data_config.yaml und schreibt alle Werte in:
- .env (Zeiträume, Pfade)
- generate.py (Qlib Datengenerierung)
"""
import yaml
import re
from pathlib import Path
CONFIG = Path(__file__).parent / "data_config.yaml"
ENV = Path(__file__).parent / ".env"
GENERATE = Path("/home/nico/miniconda3/envs/rdagent/lib/python3.10/site-packages/rdagent/scenarios/qlib/experiment/factor_data_template/generate.py")
with open(CONFIG) as f:
cfg = yaml.safe_load(f)
# --- .env updaten ---
env_text = ENV.read_text()
replacements = {
r"QLIB_DATA_DIR=.*": f"QLIB_DATA_DIR={cfg['data_path'].replace('~', str(Path.home()))}",
r"QLIB_FREQ=.*": f"QLIB_FREQ={cfg['frequency']}",
r"QLIB_FACTOR_TRAIN_START=.*": f"QLIB_FACTOR_TRAIN_START={cfg['train_start']}",
r"QLIB_FACTOR_TRAIN_END=.*": f"QLIB_FACTOR_TRAIN_END={cfg['train_end']}",
r"QLIB_FACTOR_VALID_START=.*": f"QLIB_FACTOR_VALID_START={cfg['valid_start']}",
r"QLIB_FACTOR_VALID_END=.*": f"QLIB_FACTOR_VALID_END={cfg['valid_end']}",
r"QLIB_FACTOR_TEST_START=.*": f"QLIB_FACTOR_TEST_START={cfg['test_start']}",
r"QLIB_FACTOR_TEST_END=.*": f"QLIB_FACTOR_TEST_END={cfg['test_end']}",
r"QLIB_MODEL_TRAIN_START=.*": f"QLIB_MODEL_TRAIN_START={cfg['train_start']}",
r"QLIB_MODEL_TRAIN_END=.*": f"QLIB_MODEL_TRAIN_END={cfg['train_end']}",
r"QLIB_MODEL_VALID_START=.*": f"QLIB_MODEL_VALID_START={cfg['valid_start']}",
r"QLIB_MODEL_VALID_END=.*": f"QLIB_MODEL_VALID_END={cfg['valid_end']}",
r"QLIB_MODEL_TEST_START=.*": f"QLIB_MODEL_TEST_START={cfg['test_start']}",
r"QLIB_MODEL_TEST_END=.*": f"QLIB_MODEL_TEST_END={cfg['test_end']}",
r"QLIB_QUANT_TRAIN_START=.*": f"QLIB_QUANT_TRAIN_START={cfg['train_start']}",
r"QLIB_QUANT_TRAIN_END=.*": f"QLIB_QUANT_TRAIN_END={cfg['train_end']}",
r"QLIB_QUANT_VALID_START=.*": f"QLIB_QUANT_VALID_START={cfg['valid_start']}",
r"QLIB_QUANT_VALID_END=.*": f"QLIB_QUANT_VALID_END={cfg['valid_end']}",
r"QLIB_QUANT_TEST_START=.*": f"QLIB_QUANT_TEST_START={cfg['test_start']}",
r"QLIB_QUANT_TEST_END=.*": f"QLIB_QUANT_TEST_END={cfg['test_end']}",
}
for pattern, replacement in replacements.items():
env_text = re.sub(pattern, replacement, env_text)
ENV.write_text(env_text)
print("✓ .env aktualisiert")
# --- generate.py updaten ---
data_path = cfg['data_path']
freq = cfg['frequency']
train_start = cfg['train_start']
test_end = cfg['test_end']
valid_start = cfg['valid_start']
cols = str(cfg['columns'])
generate_text = f'''import qlib
import pandas as pd
qlib.init(provider_uri="{data_path}", freq="{freq}")
from qlib.data import D
instruments = D.instruments(market="all")
fields = {cols}
data = (
D.features(instruments, fields, freq="{freq}")
.swaplevel()
.sort_index()
.loc["{train_start}":]
.sort_index()
)
data.to_hdf("./daily_pv_all.h5", key="data")
data_debug = (
D.features(instruments, fields, start_time="{valid_start}", end_time="{test_end}", freq="{freq}")
.swaplevel()
.sort_index()
)
data_debug.to_hdf("./daily_pv_debug.h5", key="data")
'''
GENERATE.write_text(generate_text)
print("✓ generate.py aktualisiert")
print(f"\nKonfiguration angewendet:")
print(f" Instrument: {cfg['instrument']}")
print(f" Frequenz: {cfg['frequency']}")
print(f" Train: {cfg['train_start']}{cfg['train_end']}")
print(f" Test: {cfg['test_start']}{cfg['test_end']}")
+4 -242
View File
@@ -1,243 +1,5 @@
aiohttp==3.9.1
aiosignal==1.3.1
alabaster==0.7.13
annotated-types==0.6.0
anyio==4.2.0
appdirs==1.4.4
argon2-cffi==23.1.0
argon2-cffi-bindings==21.2.0
arrow==1.3.0
asttokens==2.4.1
async-lru==2.0.4
async-timeout==4.0.3
attrs==23.2.0
autodoc-pydantic==2.0.1
azure-ai-formrecognizer==3.3.2
azure-common==1.1.28
azure-core==1.29.6
azure-identity==1.17.1
Babel==2.14.0
beautifulsoup4==4.12.2
black==23.12.1
bleach==6.1.0
blosc2==2.7.1
build==1.0.3
certifi==2023.11.17
cffi==1.16.0
charset-normalizer==3.3.2
click==8.1.7
colorama==0.4.6
comm==0.2.2
contourpy==1.2.1
coverage==7.4.0
cryptography==41.0.7
cycler==0.12.1
Cython==3.0.7
dataclasses-json==0.6.3
debugpy==1.8.2
decorator==5.1.1
defusedxml==0.7.1
dill==0.3.8
distro==1.9.0
docker==7.1.0
docutils==0.20.1
exceptiongroup==1.2.0
executing==2.0.1
fastjsonschema==2.20.0
feedparser==6.0.11
filelock==3.13.1
fire==0.5.0
fonttools==4.53.1
fqdn==1.5.1
frozenlist==1.4.1
fsspec==2023.12.2
furo==2023.9.10
fuzzywuzzy==0.18.0
git-changelog==2.4.0
greenlet==3.0.3
h11==0.14.0
httpcore==1.0.2
httpx==0.26.0
idna==3.6
imagesize==1.4.1
importlib-metadata==7.0.1
iniconfig==2.0.0
ipykernel==6.29.5
ipython==8.26.0
ipywidgets==8.1.3
isodate==0.6.1
isoduration==20.11.0
isort==5.13.2
jaraco.classes==3.3.0
jedi==0.19.1
jeepney==0.8.0
joblib==1.4.2
json5==0.9.25
jsonpatch==1.33
jsonpointer==2.4
jsonschema==4.23.0
jsonschema-specifications==2023.12.1
jupyter==1.0.0
jupyter-console==6.6.3
jupyter-events==0.10.0
jupyter-lsp==2.2.5
jupyter_client==8.6.2
jupyter_core==5.7.2
jupyter_server==2.14.2
jupyter_server_terminals==0.5.3
jupyterlab==4.2.4
jupyterlab_pygments==0.3.0
jupyterlab_server==2.27.3
jupyterlab_widgets==3.0.11
keyring==24.3.0
kiwisolver==1.4.5
langchain==0.0.353
langchain-community==0.0.7
langchain-core==0.1.4
langsmith==0.0.75
Levenshtein==0.25.1
livereload==2.6.3
loguru==0.7.2
loguru-mypy==0.0.4
lxml==5.0.0
markdown-it-py==3.0.0
marshmallow==3.20.1
matplotlib==3.9.1
matplotlib-inline==0.1.7
mdit-py-plugins==0.4.0
mdurl==0.1.2
mistune==3.0.2
more-itertools==10.1.0
msal==1.30.0
msal-extensions==1.2.0
msgpack==1.0.8
msrest==0.7.1
multidict==6.0.4
mypy==1.10.0
mypy-extensions==1.0.0
myst-parser==2.0.0
nbclient==0.10.0
nbconvert==7.16.4
nbformat==5.10.4
ndindex==1.8
nest-asyncio==1.6.0
nh3==0.2.15
notebook==7.2.1
notebook_shim==0.2.4
numexpr==2.10.1
numpy==1.26.2
oauthlib==3.2.2
openai==1.6.1
overrides==7.7.0
packaging==23.2
pandarallel==1.6.5
pandas==2.1.4
pandocfilters==1.5.1
parso==0.8.4
pathspec==0.12.1
patsy==0.5.6
pexpect==4.9.0
pkginfo==1.9.6
platformdirs==4.1.0
pluggy==1.3.0
portalocker==2.10.1
prometheus_client==0.20.0
prompt_toolkit==3.0.47
psutil==6.0.0
ptyprocess==0.7.0
pure_eval==0.2.3
py-cpuinfo==9.0.0
pycparser==2.21
pydantic==2.5.3
pydantic-settings==2.1.0
pydantic_core==2.14.6
Pygments==2.17.2
PyJWT==2.8.0
PyMuPDF==1.24.9
PyMuPDFb==1.24.9
pyparsing==3.1.2
pypdf==3.17.4
pyproject_hooks==1.0.0
pytest==7.4.4
python-dateutil==2.8.2
python-dotenv==1.0.0
python-json-logger==2.0.7
python-Levenshtein==0.25.1
pytz==2023.3.post1
PyYAML==6.0.1
pyzmq==26.0.3
qtconsole==5.5.2
QtPy==2.4.1
rapidfuzz==3.9.5
readme-renderer==42.0
referencing==0.35.1
regex==2024.7.24
requests==2.31.0
requests-oauthlib==1.3.1
requests-toolbelt==1.0.0
rfc3339-validator==0.1.4
rfc3986==2.0.0
rfc3986-validator==0.1.1
rich==13.7.0
rpds-py==0.19.1
ruamel.yaml==0.18.5
ruamel.yaml.clib==0.2.8
ruff==0.4.5
scikit-learn==1.5.1
SecretStorage==3.3.3
semver==3.0.2
Send2Trash==1.8.3
setuptools-scm==8.0.4
sgmllib3k==1.0.0
shellingham==1.5.4
six==1.16.0
sniffio==1.3.0
snowballstemmer==2.2.0
soupsieve==2.5
Sphinx==7.2.6
sphinx-autobuild==2021.3.14
sphinx-basic-ng==1.0.0b2
sphinx-click==5.1.0
sphinx-togglebutton==0.3.2
sphinxcontrib-applehelp==1.0.7
sphinxcontrib-devhelp==1.0.5
sphinxcontrib-htmlhelp==2.0.4
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.6
sphinxcontrib-serializinghtml==1.1.9
SQLAlchemy==2.0.24
stack-data==0.6.3
statsmodels==0.14.2
tables==3.9.2
tabulate==0.9.0
tenacity==8.2.3
termcolor==2.4.0
terminado==0.18.1
threadpoolctl==3.5.0
tiktoken==0.7.0
tinycss2==1.3.0
toml-sort==0.23.1
tomli==2.0.1
tomlkit==0.12.3
tornado==6.4
tqdm==4.66.1
traitlets==5.14.3
tree-sitter==0.22.3
tree-sitter-python==0.21.0
twine==4.0.2
typer==0.9.0
types-psutil==6.0.0.20240621
types-python-dateutil==2.9.0.20240316
types-PyYAML==6.0.12.20240724
types-tqdm==4.66.0.20240417
typing-inspect==0.9.0
tzdata==2023.4
uri-template==1.3.0
urllib3==2.1.0
wcwidth==0.2.13
webcolors==24.6.0
webencodings==0.5.1
websocket-client==1.8.0
widgetsnbextension==4.0.11
yarl==1.9.4
zipp==3.17.0
dill==0.3.9
pillow==10.4.0
psutil==6.1.0
scipy==1.14.1
+4 -239
View File
@@ -1,240 +1,5 @@
aiohttp==3.9.1
aiosignal==1.3.1
alabaster==0.7.13
annotated-types==0.6.0
anyio==4.2.0
appdirs==1.4.4
argon2-cffi==23.1.0
argon2-cffi-bindings==21.2.0
arrow==1.3.0
asttokens==2.4.1
async-lru==2.0.4
attrs==23.2.0
autodoc-pydantic==2.0.1
azure-ai-formrecognizer==3.3.2
azure-common==1.1.28
azure-core==1.29.6
azure-identity==1.17.1
Babel==2.14.0
beautifulsoup4==4.12.2
black==23.12.1
bleach==6.1.0
blosc2==2.7.1
build==1.0.3
certifi==2023.11.17
cffi==1.16.0
charset-normalizer==3.3.2
click==8.1.7
colorama==0.4.6
comm==0.2.2
contourpy==1.2.1
coverage==7.4.0
cryptography==41.0.7
cycler==0.12.1
Cython==3.0.7
dataclasses-json==0.6.3
debugpy==1.8.2
decorator==5.1.1
defusedxml==0.7.1
dill==0.3.8
distro==1.9.0
docker==7.1.0
docutils==0.20.1
executing==2.0.1
fastjsonschema==2.20.0
feedparser==6.0.11
filelock==3.13.1
fire==0.5.0
fonttools==4.53.1
fqdn==1.5.1
frozenlist==1.4.1
fsspec==2023.12.2
furo==2023.9.10
fuzzywuzzy==0.18.0
git-changelog==2.4.0
greenlet==3.0.3
h11==0.14.0
httpcore==1.0.2
httpx==0.26.0
idna==3.6
imagesize==1.4.1
importlib-metadata==7.0.1
iniconfig==2.0.0
ipykernel==6.29.5
ipython==8.26.0
ipywidgets==8.1.3
isodate==0.6.1
isoduration==20.11.0
isort==5.13.2
jaraco.classes==3.3.0
jedi==0.19.1
jeepney==0.8.0
joblib==1.4.2
json5==0.9.25
jsonpatch==1.33
jsonpointer==2.4
jsonschema==4.23.0
jsonschema-specifications==2023.12.1
jupyter==1.0.0
jupyter-console==6.6.3
jupyter-events==0.10.0
jupyter-lsp==2.2.5
jupyter_client==8.6.2
jupyter_core==5.7.2
jupyter_server==2.14.2
jupyter_server_terminals==0.5.3
jupyterlab==4.2.4
jupyterlab_pygments==0.3.0
jupyterlab_server==2.27.3
jupyterlab_widgets==3.0.11
keyring==24.3.0
kiwisolver==1.4.5
langchain==0.0.353
langchain-community==0.0.7
langchain-core==0.1.4
langsmith==0.0.75
Levenshtein==0.25.1
livereload==2.6.3
loguru==0.7.2
loguru-mypy==0.0.4
lxml==5.0.0
markdown-it-py==3.0.0
marshmallow==3.20.1
matplotlib==3.9.1
matplotlib-inline==0.1.7
mdit-py-plugins==0.4.0
mdurl==0.1.2
mistune==3.0.2
more-itertools==10.1.0
msal==1.30.0
msal-extensions==1.2.0
msgpack==1.0.8
msrest==0.7.1
multidict==6.0.4
mypy==1.10.0
mypy-extensions==1.0.0
myst-parser==2.0.0
nbclient==0.10.0
nbconvert==7.16.4
nbformat==5.10.4
ndindex==1.8
nest-asyncio==1.6.0
nh3==0.2.15
notebook==7.2.1
notebook_shim==0.2.4
numexpr==2.10.1
numpy==1.26.2
oauthlib==3.2.2
openai==1.6.1
overrides==7.7.0
packaging==23.2
pandarallel==1.6.5
pandas==2.1.4
pandocfilters==1.5.1
parso==0.8.4
pathspec==0.12.1
patsy==0.5.6
pexpect==4.9.0
pkginfo==1.9.6
platformdirs==4.1.0
pluggy==1.3.0
portalocker==2.10.1
prometheus_client==0.20.0
prompt_toolkit==3.0.47
psutil==6.0.0
ptyprocess==0.7.0
pure_eval==0.2.3
py-cpuinfo==9.0.0
pycparser==2.21
pydantic==2.5.3
pydantic-settings==2.1.0
pydantic_core==2.14.6
Pygments==2.17.2
PyJWT==2.9.0
PyMuPDF==1.24.9
PyMuPDFb==1.24.9
pyparsing==3.1.2
pypdf==3.17.4
pyproject_hooks==1.0.0
pytest==7.4.4
python-dateutil==2.8.2
python-dotenv==1.0.0
python-json-logger==2.0.7
python-Levenshtein==0.25.1
pytz==2023.3.post1
PyYAML==6.0.1
pyzmq==26.0.3
qtconsole==5.5.2
QtPy==2.4.1
rapidfuzz==3.9.5
readme-renderer==42.0
referencing==0.35.1
regex==2024.7.24
requests==2.31.0
requests-oauthlib==1.3.1
requests-toolbelt==1.0.0
rfc3339-validator==0.1.4
rfc3986==2.0.0
rfc3986-validator==0.1.1
rich==13.7.0
rpds-py==0.19.1
ruamel.yaml==0.18.5
ruamel.yaml.clib==0.2.8
ruff==0.4.5
scikit-learn==1.5.1
SecretStorage==3.3.3
semver==3.0.2
Send2Trash==1.8.3
setuptools-scm==8.0.4
sgmllib3k==1.0.0
shellingham==1.5.4
six==1.16.0
sniffio==1.3.0
snowballstemmer==2.2.0
soupsieve==2.5
Sphinx==7.2.6
sphinx-autobuild==2021.3.14
sphinx-basic-ng==1.0.0b2
sphinx-click==5.1.0
sphinx-togglebutton==0.3.2
sphinxcontrib-applehelp==1.0.7
sphinxcontrib-devhelp==1.0.5
sphinxcontrib-htmlhelp==2.0.4
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.6
sphinxcontrib-serializinghtml==1.1.9
SQLAlchemy==2.0.24
stack-data==0.6.3
statsmodels==0.14.2
tables==3.9.2
tabulate==0.9.0
tenacity==8.2.3
termcolor==2.4.0
terminado==0.18.1
threadpoolctl==3.5.0
tiktoken==0.7.0
tinycss2==1.3.0
toml-sort==0.23.1
tomlkit==0.12.3
tornado==6.4
tqdm==4.66.1
traitlets==5.14.3
tree-sitter==0.22.3
tree-sitter-python==0.21.0
twine==4.0.2
typer==0.9.0
types-psutil==6.0.0.20240621
types-python-dateutil==2.9.0.20240316
types-PyYAML==6.0.12.20240724
types-tqdm==4.66.0.20240417
typing-inspect==0.9.0
tzdata==2023.4
uri-template==1.3.0
urllib3==2.1.0
wcwidth==0.2.13
webcolors==24.6.0
webencodings==0.5.1
websocket-client==1.8.0
widgetsnbextension==4.0.11
yarl==1.9.4
zipp==3.17.0
dill==0.3.9
pillow==10.4.0
psutil==6.1.0
scipy==1.14.1
+44
View File
@@ -0,0 +1,44 @@
# ============================================================
# Predix Data Configuration
# Ändere hier Instrument, Frequenz und Zeiträume
# Alle anderen Komponenten lesen aus dieser Datei
# ============================================================
instrument: EURUSD
frequency: 1min # 1min, 5min, 15min, 1h, 1d
data_path: ~/.qlib/qlib_data/eurusd_1min_data
# Verfügbare Spalten (keine $factor Spalte!)
columns:
- $open
- $close
- $high
- $low
- $volume
# Walk-Forward Split
train_start: "2022-03-14"
train_end: "2024-06-30"
valid_start: "2024-07-01"
valid_end: "2024-12-31"
test_start: "2025-01-01"
test_end: "2026-03-20"
# Markt-Kontext für LLM Prompts
market_context:
spread_bps: 1.5
sessions:
asian: "00:00-08:00 UTC"
london: "08:00-16:00 UTC"
ny: "13:00-21:00 UTC"
overlap: "13:00-16:00 UTC"
target_arr: 9.62 # % ARR zu schlagen
max_drawdown: 20 # % maximaler Drawdown
# Lookback Referenz (in Bars)
lookback:
1h: 4
2h: 8
4h: 16
8h: 32
1d: 96
Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

+332
View File
@@ -0,0 +1,332 @@
{
"alpha053_15": {
"description": "Reversal class factor, negative delta of a ratio involving close, low, and high prices over 15 days.",
"formulation": "-1 times Deltaleft(frac{(text{close} - text{low}) - (text{high} - text{close})}{text{close} - text{low}}, 15right)",
"variables": {
"Delta(x, d)": "Change in 'x' over 'd' days.",
"text{close}": "Closing price of the stock.",
"text{low}": "Lowest price of the stock for the day.",
"text{high}": "Highest price of the stock for the day."
},
"Category": "Volume&Price",
"Difficulty": "Easy",
"gt_code": "import pandas as pd\ndata_pv = pd.read_hdf('daily_pv.h5')\nnew_df= data_pv.reset_index()\n# Calculate Alpha053\nnew_df['ratio'] = (new_df['$close'] - new_df['$low'] - (new_df['$high'] - new_df['$close'])) / (new_df['$close'] - new_df['$low'])\n# the change of ratio in new_df over the 15 days\nnew_df['result']=-new_df['ratio'].diff(15)\n# transfer the result to series\nresult=pd.DataFrame(new_df['result']).set_index(data_pv.index)\nresult=result['result']\nresult.to_hdf('result.h5', key='data')"
},
"liquidity_imbalance": {
"description": "liquidity_imbalance=std(minute trading liquidity_imbalance)/mean(minute trading liquidity_imbalance).",
"formulation": "liquidity_imbalance = frac{text{std}(text{minute trading liquidity_imbalance})}{text{mean}(text{minute liquidity_imbalance})}",
"variables": {
"std(minute liquidity_imbalance)": "Standard deviation of trading liquidity_imbalance for each minute of the trading day.",
"mean(minute liquidity_imbalance)": "Mean of trading liquidity_imbalance for each minute of the trading day.",
"liquidity_imbalance": "(bid_size-ask_size)/(bid_size+ask_size), we use something like bidV for the size"
},
"Category": "High-Frequency",
"Difficulty": "Medium",
"gt_code": "import pandas as pd\ndata_hf = pd.read_hdf('high_freq.h5')\nsample_df= data_hf.reset_index()\n# Convert 'datetime' column to datetime and extract date for grouping\nsample_df['date'] = sample_df['datetime'].dt.date\nsample_df['liquidity_imbalance']=(sample_df['bidV']-sample_df['askV'])/(sample_df['bidV']+sample_df['askV'])\n# Group by instrument and date\ngrouped = sample_df.groupby(['date','instrument'])['liquidity_imbalance']\n# Calculate mean and standard deviation of the volume for each group\nstats = grouped.agg(['mean', 'std'])\n# Calculate Z value for each instrument per day\nstats['liquidity_imbalance'] = stats['std'] / stats['mean']\n# Display the calculated Z values\nresult=stats['liquidity_imbalance']\nresult.index.names = ['datetime','instrument']\n# result = result.swaplevel().sort_index()\nresult.to_hdf('result.h5', key='data')"
},
"liquidity_imbalance_2": {
"description": "liquidity_imbalance=std(minute trading liquidity_imbalance)/mean(minute trading liquidity_imbalance).",
"formulation": "liquidity_imbalance = frac{text{std}(text{minute trading liquidity_imbalance})}{text{mean}(text{minute liquidity_imbalance})}",
"variables": {
"std(minute liquidity_imbalance)": "Standard deviation of trading liquidity_imbalance for each minute of the trading day.",
"mean(minute liquidity_imbalance)": "Mean of trading liquidity_imbalance for each minute of the trading day.",
"liquidity_imbalance": "(bid_size-ask_size)/2*(bid_size+ask_size), we use something like bidV for the size"
},
"Category": "High-Frequency",
"Difficulty": "Medium",
"gt_code": "import pandas as pd\ndata_hf = pd.read_hdf('high_freq.h5')\nsample_df= data_hf.reset_index()\n# Convert 'datetime' column to datetime and extract date for grouping\nsample_df['date'] = sample_df['datetime'].dt.date\nsample_df['liquidity_imbalance']=(sample_df['bidV']-sample_df['askV'])/((sample_df['bidV']+sample_df['askV'])*2)\n# Group by instrument and date\ngrouped = sample_df.groupby(['date','instrument'])['liquidity_imbalance']\n# Calculate mean and standard deviation of the volume for each group\nstats = grouped.agg(['mean', 'std'])\n# Calculate Z value for each instrument per day\nstats['liquidity_imbalance'] = stats['std'] / stats['mean']\n# Display the calculated Z values\nresult=stats['liquidity_imbalance']\nresult.index.names = ['datetime','instrument']\n# result = result.swaplevel().sort_index()\nresult.to_hdf('result.h5', key='data')"
},
"liquidity_imbalance_3": {
"description": "liquidity_imbalance=std(minute trading liquidity_imbalance)/mean(minute trading liquidity_imbalance).",
"formulation": "liquidity_imbalance = frac{text{std}(text{minute trading liquidity_imbalance})}{text{mean}(text{minute liquidity_imbalance})}",
"variables": {
"std(minute liquidity_imbalance)": "Standard deviation of trading liquidity_imbalance for each minute of the trading day.",
"mean(minute liquidity_imbalance)": "Mean of trading liquidity_imbalance for each minute of the trading day.",
"liquidity_imbalance": "(bid_size-ask_size)/3*(bid_size+ask_size), we use something like bidV for the size"
},
"Category": "High-Frequency",
"Difficulty": "Medium",
"gt_code": "import pandas as pd\ndata_hf = pd.read_hdf('high_freq.h5')\nsample_df= data_hf.reset_index()\n# Convert 'datetime' column to datetime and extract date for grouping\nsample_df['date'] = sample_df['datetime'].dt.date\nsample_df['liquidity_imbalance']=(sample_df['bidV']-sample_df['askV'])/((sample_df['bidV']+sample_df['askV'])*3)\n# Group by instrument and date\ngrouped = sample_df.groupby(['date','instrument'])['liquidity_imbalance']\n# Calculate mean and standard deviation of the volume for each group\nstats = grouped.agg(['mean', 'std'])\n# Calculate Z value for each instrument per day\nstats['liquidity_imbalance'] = stats['std'] / stats['mean']\n# Display the calculated Z values\nresult=stats['liquidity_imbalance']\nresult.index.names = ['datetime','instrument']\n# result = result.swaplevel().sort_index()\nresult.to_hdf('result.h5', key='data')"
},
"micro_price": {
"description": "micro_price=std(minute trading micro_price)/mean(minute trading micro_price).",
"formulation": "micro_price = frac{text{std}(text{minute trading micro_price})}{text{mean}(text{minute micro_price})}",
"variables": {
"std(minute micro_price)": "Standard deviation of trading micro_price for each minute of the trading day.",
"mean(minute micro_price)": "Mean of trading micro_price for each minute of the trading day.",
"micro_price": "((df['bid_price'] * df['ask_size']) + (df['ask_price'] * df['bid_size'])) / (df['bid_size'] + df['ask_size'])"
},
"Category": "High-Frequency",
"Difficulty": "Hard",
"gt_code": "import pandas as pd\ndata_hf = pd.read_hdf('high_freq.h5')\nsample_df= data_hf.reset_index()\n# Convert 'datetime' column to datetime and extract date for grouping\nsample_df['date'] = sample_df['datetime'].dt.date\nsample_df['micro_price']=(sample_df['bid']*sample_df['askV']+sample_df['ask']*sample_df['bidV'])/(sample_df['bidV']+sample_df['askV'])\n# Group by instrument and date\ngrouped = sample_df.groupby(['date','instrument'])['micro_price']\n# Calculate mean and standard deviation of the volume for each group\nstats = grouped.agg(['mean', 'std'])\n# Calculate Z value for each instrument per day\nstats['micro_price'] = stats['std'] / stats['mean']\n# Display the calculated Z values\nresult=stats['micro_price']\nresult.index.names = ['datetime','instrument']\n# result = result.swaplevel().sort_index()\nresult.to_hdf('result.h5', key='data')"
},
"micro_price_2": {
"description": "micro_price_2=std(minute trading micro_price)/mean(minute trading micro_price).",
"formulation": "micro_price_2 = frac{text{std}(text{minute trading micro_price})}{text{mean}(text{minute micro_price})}",
"variables": {
"std(minute micro_price)": "Standard deviation of trading micro_price for each minute of the trading day.",
"mean(minute micro_price)": "Mean of trading micro_price for each minute of the trading day.",
"micro_price": "((df['bid_price'] * df['ask_size']) + (df['ask_price'] * df['bid_size'])) / 2*(df['bid_size'] + df['ask_size']), we use something like bidV for the size"
},
"Category": "High-Frequency",
"Difficulty": "Hard",
"gt_code": "import pandas as pd\ndata_hf = pd.read_hdf('high_freq.h5')\nsample_df= data_hf.reset_index()\n# Convert 'datetime' column to datetime and extract date for grouping\nsample_df['date'] = sample_df['datetime'].dt.date\nsample_df['micro_price']=(sample_df['bid']*sample_df['askV']+sample_df['ask']*sample_df['bidV'])/((sample_df['bidV']+sample_df['askV'])*2)\n# Group by instrument and date\ngrouped = sample_df.groupby(['date','instrument'])['micro_price']\n# Calculate mean and standard deviation of the volume for each group\nstats = grouped.agg(['mean', 'std'])\n# Calculate Z value for each instrument per day\nstats['micro_price'] = stats['std'] / stats['mean']\n# Display the calculated Z values\nresult=stats['micro_price']\nresult.index.names = ['datetime','instrument']\n# result = result.swaplevel().sort_index()\nresult.to_hdf('result.h5', key='data')"
},
"micro_price_3": {
"description": "micro_price_3=std(minute trading micro_price)/mean(minute trading micro_price).",
"formulation": "micro_price_3 = frac{text{std}(text{minute trading micro_price})}{text{mean}(text{minute micro_price})}",
"variables": {
"std(minute micro_price)": "Standard deviation of trading micro_price for each minute of the trading day.",
"mean(minute micro_price)": "Mean of trading micro_price for each minute of the trading day.",
"micro_price": "((df['bid_price'] * df['ask_size']) + (df['ask_price'] * df['bid_size'])) / 3*(df['bid_size'] + df['ask_size']), we use something like bidV for the size"
},
"Category": "High-Frequency",
"Difficulty": "Hard",
"gt_code": "import pandas as pd\ndata_hf = pd.read_hdf('high_freq.h5')\nsample_df= data_hf.reset_index()\n# Convert 'datetime' column to datetime and extract date for grouping\nsample_df['date'] = sample_df['datetime'].dt.date\nsample_df['micro_price']=(sample_df['bid']*sample_df['askV']+sample_df['ask']*sample_df['bidV'])/((sample_df['bidV']+sample_df['askV'])*3)\n# Group by instrument and date\ngrouped = sample_df.groupby(['date','instrument'])['micro_price']\n# Calculate mean and standard deviation of the volume for each group\nstats = grouped.agg(['mean', 'std'])\n# Calculate Z value for each instrument per day\nstats['micro_price'] = stats['std'] / stats['mean']\n# Display the calculated Z values\nresult=stats['micro_price']\nresult.index.names = ['datetime','instrument']\n# result = result.swaplevel().sort_index()\nresult.to_hdf('result.h5', key='data')"
},
"mid_price": {
"description": "mid_price=std(minute trading mid_price)/mean(minute trading mid_price).",
"formulation": "mid_price = frac{text{std}(text{minute trading mid price})}{text{mean}(text{minute mid price})}",
"variables": {
"std(minute mid_price)": "Standard deviation of trading mid_price for each minute of the trading day.",
"mean(minute mid_price)": "Mean of trading mid_price for each minute of the trading day.",
"mid_price": "The average of the bid and ask prices."
},
"Category": "High-Frequency",
"Difficulty": "Easy",
"gt_code": "import pandas as pd\ndata_hf = pd.read_hdf('high_freq.h5')\nsample_df= data_hf.reset_index()\n# Convert 'datetime' column to datetime and extract date for grouping\nsample_df['date'] = sample_df['datetime'].dt.date\nsample_df['mid_price']=(sample_df['bid']+sample_df['ask'])/2\n# Group by instrument and date\ngrouped = sample_df.groupby(['date','instrument'])['mid_price']\n# Calculate mean and standard deviation of the volume for each group\nstats = grouped.agg(['mean', 'std'])\nstats['mid_price'] = stats['std'] / stats['mean']\nresult=stats['mid_price']\nresult.index.names = ['datetime','instrument']\n# result = result.swaplevel().sort_index()\nresult.to_hdf('result.h5', key='data')"
},
"mid_price_2": {
"description": "mid_price=std(minute trading mid_price)/mean(minute trading mid_price).",
"formulation": "mid_price = frac{text{std}(text{minute trading mid price})}{text{mean}(text{minute mid price})}",
"variables": {
"std(minute mid_price)": "Standard deviation of trading mid_price for each minute of the trading day.",
"mean(minute mid_price)": "Mean of trading mid_price for each minute of the trading day.",
"mid_price_2": "the average of the bid and ask prices plus the the average of the bid and ask size (bidV and askV)."
},
"Category": "High-Frequency",
"Difficulty": "Easy",
"gt_code": "import pandas as pd\ndata_hf = pd.read_hdf('high_freq.h5')\nsample_df= data_hf.reset_index()\n# Convert 'datetime' column to datetime and extract date for grouping\nsample_df['date'] = sample_df['datetime'].dt.date\nsample_df['mid_price']=(sample_df['bid']+sample_df['ask'])/2+(sample_df['bidV']+sample_df['askV'])/2\n# Group by instrument and date\ngrouped = sample_df.groupby(['date','instrument'])['mid_price']\n# Calculate mean and standard deviation of the volume for each group\nstats = grouped.agg(['mean', 'std'])\nstats['mid_price'] = stats['std'] / stats['mean']\nresult=stats['mid_price']\nresult.index.names = ['datetime','instrument']\n# result = result.swaplevel().sort_index()\nresult.to_hdf('result.h5', key='data')"
},
"mid_price_3": {
"description": "mid_price=std(minute trading mid_price)/mean(minute trading mid_price).",
"formulation": "mid_price = frac{text{std}(text{minute trading mid price})}{text{mean}(text{minute mid price})}",
"variables": {
"std(minute mid_price)": "Standard deviation of trading mid_price for each minute of the trading day.",
"mean(minute mid_price)": "Mean of trading mid_price for each minute of the trading day.",
"mid_price_3": "The coefficient of variation (CV) of the mid-price for each minute of the trading day, calculated as the standard deviation of the mid-price divided by the mean mid-price."
},
"Category": "High-Frequency",
"Difficulty": "Easy",
"gt_code": "import pandas as pd\ndata_hf = pd.read_hdf('high_freq.h5')\nsample_df= data_hf.reset_index()\n# Convert 'datetime' column to datetime and extract date for grouping\nsample_df['date'] = sample_df['datetime'].dt.date\nsample_df['mid_price']=(sample_df['bid']+sample_df['ask'])/3\n# Group by instrument and date\ngrouped = sample_df.groupby(['date','instrument'])['mid_price']\n# Calculate mean and standard deviation of the volume for each group\nstats = grouped.agg(['mean', 'std'])\nstats['mid_price'] = stats['std'] / stats['mean']\nresult=stats['mid_price']\nresult.index.names = ['datetime','instrument']\n# result = result.swaplevel().sort_index()\nresult.to_hdf('result.h5', key='data')"
},
"PB_ROE": {
"description": "Constructed using the ranking difference between PB and ROE, with regression versions of PB and ROE replacing original PB and ROE to obtain reconstructed factor values.",
"formulation": "text{rank}(PB_t) - rank(ROE_t)",
"variables": {
"text{rank}(PB_t)": "Ranking of regression version PB on cross-section at time t.",
"text{rank}(ROE_t)": "Ranking of regression version single-quarter ROE on cross-section at time t."
},
"Category": "Fundamentals",
"Difficulty": "Easy",
"gt_code": "import pandas as pd\ndata_f = pd.read_hdf('daily_f.h5')\ndata = data_f.reset_index()\n# Calculate the rank of PB and ROE\ndata['PB_rank'] = data.groupby('datetime')['B/P'].rank()\ndata['ROE_rank'] = data.groupby('datetime')['ROE'].rank()\n# Calculate the difference between the ranks\ndata['PB_ROE'] = data['PB_rank'] - data['ROE_rank']\n# set the datetime and instrument as index and drop the original index\nresult=pd.DataFrame(data['PB_ROE']).set_index(data_f.index)\n# transfer the result to series\nresult=result['PB_ROE']\nresult.to_hdf('result.h5', key='data')"
},
"PB_ROE_2": {
"description": "Constructed using the ranking difference between PB/2 and ROE, with regression versions of PB and ROE replacing original PB and ROE to obtain reconstructed factor values.",
"formulation": "text{rank}(PB_t)/2 - rank(ROE_t)",
"variables": {
"text{rank}(PB_t)": "Ranking of regression version PB on cross-section at time t.",
"text{rank}(ROE_t)": "Ranking of regression version single-quarter ROE on cross-section at time t."
},
"Category": "Fundamentals",
"Difficulty": "Easy",
"gt_code": "import pandas as pd\ndata_f = pd.read_hdf('daily_f.h5')\ndata = data_f.reset_index()\n# Calculate the rank of PB and ROE\ndata['PB_rank'] = data.groupby('datetime')['B/P'].rank()\ndata['ROE_rank'] = data.groupby('datetime')['ROE'].rank()\n# Calculate the difference between the ranks\ndata['PB_ROE'] = data['PB_rank']/2 - data['ROE_rank']\n# set the datetime and instrument as index and drop the original index\nresult=pd.DataFrame(data['PB_ROE']).set_index(data_f.index)\n# transfer the result to series\nresult=result['PB_ROE']\nresult.to_hdf('result.h5', key='data')"
},
"PB_ROE_3": {
"description": "Constructed using the ranking difference between PB/3 and ROE, with regression versions of PB and ROE replacing original PB and ROE to obtain reconstructed factor values.",
"formulation": "text{rank}(PB_t)/3 - rank(ROE_t)",
"variables": {
"text{rank}(PB_t)": "Ranking of regression version PB on cross-section at time t.",
"text{rank}(ROE_t)": "Ranking of regression version single-quarter ROE on cross-section at time t."
},
"Category": "Fundamentals",
"Difficulty": "Easy",
"gt_code": "import pandas as pd\ndata_f = pd.read_hdf('daily_f.h5')\ndata = data_f.reset_index()\n# Calculate the rank of PB and ROE\ndata['PB_rank'] = data.groupby('datetime')['B/P'].rank()\ndata['ROE_rank'] = data.groupby('datetime')['ROE'].rank()\n# Calculate the difference between the ranks\ndata['PB_ROE'] = data['PB_rank']/3 - data['ROE_rank']\n# set the datetime and instrument as index and drop the original index\nresult=pd.DataFrame(data['PB_ROE']).set_index(data_f.index)\n# transfer the result to series\nresult=result['PB_ROE']\nresult.to_hdf('result.h5', key='data')"
},
"PB_ROE_movement": {
"description": "PB_ROE_movement=five day PB_ROE movement indicator(-1 and 1 or 0).",
"formulation": "PB_ROE_movement = 5_day_movement(PB_ROE), PB_ROE = text{rank}(PB_t) - rank(ROE_t)",
"variables": {
"PB_ROE": "the ranking difference between PB and ROE.",
"5_day_PB_ROE_movement": "1 if PB_ROE is higher than the PB_ROE 5 days ago, -1 if PB_ROE is lower than the PB_ROE 5 days ago, 0 if PB_ROE is the same as the PB_ROE 5 days ago.",
"text{rank}(PB_t)": "Ranking of regression version PB on cross-section at time t.",
"text{rank}(ROE_t)": "Ranking of regression version single-quarter ROE on cross-section at time t."
},
"Category": "Fundamentals",
"Difficulty": "Hard",
"gt_code": "import pandas as pd\ndata_f = pd.read_hdf('daily_f.h5')\nsample_df = data_f.reset_index()\n# Calculate the rank of PB and ROE\nsample_df['PB_rank'] = sample_df.groupby('datetime')['B/P'].rank()\nsample_df['ROE_rank'] = sample_df.groupby('datetime')['ROE'].rank()\nsample_df['PB_ROE'] = sample_df['PB_rank'] - sample_df['ROE_rank']\n# Group by instrument and date\nsample_df['PB_ROE_movement'] = sample_df['PB_ROE'].diff(periods=5).apply(lambda x: 1 if x > 0 else (-1 if x < 0 else 0))\n#calculate the mid_price_movement ratio for each day\n# set the datetime and instrument as index and drop the original index\nresult=pd.DataFrame(sample_df['PB_ROE_movement']).set_index(data_f.index)\n# transfer the result to series\nresult=result['PB_ROE_movement']\nresult.to_hdf('result.h5', key='data')"
},
"PB_ROE_movement_10": {
"description": "PB_ROE_movement=10 days PB_ROE movement indicator(-1 and 1 or 0).",
"formulation": "PB_ROE_movement = 10_day_movement(PB_ROE), PB_ROE = text{rank}(PB_t) - rank(ROE_t)",
"variables": {
"PB_ROE": "the ranking difference between PB and ROE.",
"10_day_PB_ROE_movement": "1 if PB_ROE is higher than the PB_ROE 10 days ago, -1 if PB_ROE is lower than the PB_ROE 10 days ago, 0 if PB_ROE is the same as the PB_ROE 10 days ago.",
"text{rank}(PB_t)": "Ranking of regression version PB on cross-section at time t.",
"text{rank}(ROE_t)": "Ranking of regression version single-quarter ROE on cross-section at time t."
},
"Category": "Fundamentals",
"Difficulty": "Hard",
"gt_code": "import pandas as pd\ndata_f = pd.read_hdf('daily_f.h5')\nsample_df = data_f.reset_index()\n# Calculate the rank of PB and ROE\nsample_df['PB_rank'] = sample_df.groupby('datetime')['B/P'].rank()\nsample_df['ROE_rank'] = sample_df.groupby('datetime')['ROE'].rank()\nsample_df['PB_ROE'] = sample_df['PB_rank'] - sample_df['ROE_rank']\n# Group by instrument and date\nsample_df['PB_ROE_movement'] = sample_df['PB_ROE'].diff(periods=10).apply(lambda x: 1 if x > 0 else (-1 if x < 0 else 0))\n#calculate the mid_price_movement ratio for each day\n# set the datetime and instrument as index and drop the original index\nresult=pd.DataFrame(sample_df['PB_ROE_movement']).set_index(data_f.index)\n# transfer the result to series\nresult=result['PB_ROE_movement']\nresult.to_hdf('result.h5', key='data')"
},
"PB_ROE_movement_20": {
"description": "PB_ROE_movement=20 days PB_ROE movement indicator(-1 and 1 or 0).",
"formulation": "PB_ROE_movement = 20_day_movement(PB_ROE), PB_ROE = text{rank}(PB_t) - rank(ROE_t)",
"variables": {
"PB_ROE": "the ranking difference between PB and ROE.",
"20_day_PB_ROE_movement": "1 if PB_ROE is higher than the PB_ROE 20 days ago, -1 if PB_ROE is lower than the PB_ROE 20 days ago, 0 if PB_ROE is the same as the PB_ROE 20 days ago.",
"text{rank}(PB_t)": "Ranking of regression version PB on cross-section at time t.",
"text{rank}(ROE_t)": "Ranking of regression version single-quarter ROE on cross-section at time t."
},
"Category": "Fundamentals",
"Difficulty": "Hard",
"gt_code": "import pandas as pd\ndata_f = pd.read_hdf('daily_f.h5')\nsample_df = data_f.reset_index()\n# Calculate the rank of PB and ROE\nsample_df['PB_rank'] = sample_df.groupby('datetime')['B/P'].rank()\nsample_df['ROE_rank'] = sample_df.groupby('datetime')['ROE'].rank()\nsample_df['PB_ROE'] = sample_df['PB_rank'] - sample_df['ROE_rank']\n# Group by instrument and date\nsample_df['PB_ROE_movement'] = sample_df['PB_ROE'].diff(periods=20).apply(lambda x: 1 if x > 0 else (-1 if x < 0 else 0))\n#calculate the mid_price_movement ratio for each day\n# set the datetime and instrument as index and drop the original index\nresult=pd.DataFrame(sample_df['PB_ROE_movement']).set_index(data_f.index)\n# transfer the result to series\nresult=result['PB_ROE_movement']\nresult.to_hdf('result.h5', key='data')"
},
"ROE_movement": {
"description": "ROE_movement=five day ROE movement indicator(-1 and 1 or 0).",
"formulation": "ROE_movement = 5_day_movement(ROE)",
"variables": {
"ROE": "ROE in fundamental statistics.",
"5_day_ROE_movement": "1 if ROE is higher than the ROE 5 days ago, -1 if ROE is lower than the ROE 5 days ago, 0 if ROE is the same as the ROE 5 days ago."
},
"Category": "Fundamentals",
"Difficulty": "Medium",
"gt_code": "import pandas as pd\ndata_f = pd.read_hdf('daily_f.h5')\nsample_df = data_f.reset_index()\n# Group by instrument and date\nsample_df['ROE_movement'] = sample_df['ROE'].diff(periods=5).apply(lambda x: 1 if x > 0 else (-1 if x < 0 else 0))\n#calculate the mid_price_movement ratio for each day\n# set the datetime and instrument as index and drop the original index\nresult=pd.DataFrame(sample_df['ROE_movement']).set_index(data_f.index)\n# transfer the result to series\nresult=result['ROE_movement']\nresult.to_hdf('result.h5', key='data')"
},
"ROE_movement_10": {
"description": "ROE_movement_10=ten day ROE movement indicator(-1 and 1 or 0).",
"formulation": "ROE_movement = 10_day_movement(ROE)",
"variables": {
"ROE": "ROE in fundamental statistics.",
"10_day_ROE_movement": "1 if ROE is higher than the ROE 10 days ago, -1 if ROE is lower than the ROE 10 days ago, 0 if ROE is the same as the ROE 10 days ago."
},
"Category": "Fundamentals",
"Difficulty": "Medium",
"gt_code": "import pandas as pd\ndata_f = pd.read_hdf('daily_f.h5')\nsample_df = data_f.reset_index()\n# Group by instrument and date\nsample_df['ROE_movement'] = sample_df['ROE'].diff(periods=10).apply(lambda x: 1 if x > 0 else (-1 if x < 0 else 0))\n#calculate the mid_price_movement ratio for each day\n# set the datetime and instrument as index and drop the original index\nresult=pd.DataFrame(sample_df['ROE_movement']).set_index(data_f.index)\n# transfer the result to series\nresult=result['ROE_movement']\nresult.to_hdf('result.h5', key='data')"
},
"ROE_movement_20": {
"description": "ROE_movement_20=20 day ROE movement indicator(-1 and 1 or 0).",
"formulation": "ROE_movement_20 = 20_day_movement(ROE)",
"variables": {
"ROE": "ROE in fundamental statistics.",
"20_day_ROE_movement": "1 if ROE is higher than the ROE 20 days ago, -1 if ROE is lower than the ROE 20 days ago, 0 if ROE is the same as the ROE 20 days ago."
},
"Category": "Fundamentals",
"Difficulty": "Medium",
"gt_code": "import pandas as pd\ndata_f = pd.read_hdf('daily_f.h5')\nsample_df = data_f.reset_index()\n# Group by instrument and date\nsample_df['ROE_movement'] = sample_df['ROE'].diff(periods=20).apply(lambda x: 1 if x > 0 else (-1 if x < 0 else 0))\n#calculate the mid_price_movement ratio for each day\n# set the datetime and instrument as index and drop the original index\nresult=pd.DataFrame(sample_df['ROE_movement']).set_index(data_f.index)\n# transfer the result to series\nresult=result['ROE_movement']\nresult.to_hdf('result.h5', key='data')"
},
"alpha_pv_diff": {
"description": "alpha_pv_diff is defined as the ratio of the difference between close prices 10 days change and open prices 10 days change to the sum of the highest minus lowest prices plus a small constant.",
"formulation": "frac{(text{close_diff10} - text{open_diff10})}{(text{high} - text{low} + 0.001)}",
"variables": {
"close": "Closing price of the stock",
"open": "Opening price of the stock",
"high": "Highest price of the stock during the day",
"low": "Lowest price of the stock during the day"
},
"Category": "Volume&Price",
"Difficulty": "Medium",
"gt_code": "import pandas as pd\ndata_pv = pd.read_hdf('daily_pv.h5')\nnew_df= data_pv.reset_index()\n# Calculate Alpha101\nnew_df['result'] = (new_df['$close'].diff(10) - new_df['$open'].diff(10)) / (new_df['$high'] - new_df['$low'] + 0.001)\n# keep the index of the original dataframe\nresult=pd.DataFrame(new_df['result']).set_index(data_pv.index)\n# transfer the result to series\nresult=result['result']\nresult.to_hdf('result.h5', key='data')"
},
"alpha_pv_diff_15": {
"description": "alpha_pv_diff is defined as the ratio of the difference between close prices 15 days change and open prices 15 days change to the sum of the highest minus lowest prices plus a small constant.",
"formulation": "frac{(text{close_diff15} - text{open_diff15})}{(text{high} - text{low} + 0.001)}",
"variables": {
"close": "Closing price of the stock",
"open": "Opening price of the stock",
"high": "Highest price of the stock during the day",
"low": "Lowest price of the stock during the day"
},
"Category": "Volume&Price",
"Difficulty": "Medium",
"gt_code": "import pandas as pd\ndata_pv = pd.read_hdf('daily_pv.h5')\nnew_df= data_pv.reset_index()\n# Calculate Alpha101\nnew_df['result'] = (new_df['$close'].diff(15) - new_df['$open'].diff(15)) / (new_df['$high'] - new_df['$low'] + 0.001)\n# keep the index of the original dataframe\nresult=pd.DataFrame(new_df['result']).set_index(data_pv.index)\n# transfer the result to series\nresult=result['result']\nresult.to_hdf('result.h5', key='data')"
},
"alpha_pv_diff_20": {
"description": "alpha_pv_diff is defined as the ratio of the difference between close prices 20 days change and open prices 20 days change to the sum of the highest minus lowest prices plus a small constant.",
"formulation": "frac{(text{close_diff20} - text{open_diff20})}{(text{high} - text{low} + 0.001)}",
"variables": {
"close": "Closing price of the stock",
"open": "Opening price of the stock",
"high": "Highest price of the stock during the day",
"low": "Lowest price of the stock during the day"
},
"Category": "Volume&Price",
"Difficulty": "Medium",
"gt_code": "import pandas as pd\ndata_pv = pd.read_hdf('daily_pv.h5')\nnew_df= data_pv.reset_index()\n# Calculate Alpha101\nnew_df['result'] = (new_df['$close'].diff(20) - new_df['$open'].diff(20)) / (new_df['$high'] - new_df['$low'] + 0.001)\n# keep the index of the original dataframe\nresult=pd.DataFrame(new_df['result']).set_index(data_pv.index)\n# transfer the result to series\nresult=result['result']\nresult.to_hdf('result.h5', key='data')"
},
"alpha_pv_diff_pct": {
"description": "alpha_pv is defined as the ratio of the difference between close prices 10 days change and open prices 10 days change to the sum of the highest prices 10 days change ratio minus lowest prices 10 days change ratio plus a small constant.",
"formulation": "frac{(text{close_diff10} - text{open_diff10})}{(text{high_pct10} - text{low_pct10} + 0.001)}",
"variables": {
"close": "Closing price of the stock",
"open": "Opening price of the stock",
"high": "Highest price of the stock during the day",
"low": "Lowest price of the stock during the day"
},
"Category": "Volume&Price",
"Difficulty": "Hard",
"gt_code": "import pandas as pd\ndata_pv = pd.read_hdf('daily_pv.h5')\nnew_df= data_pv.reset_index()\n# Calculate Alpha101\nnew_df['result'] = (new_df['$close'].diff(10) - new_df['$open'].diff(10)) / (new_df['$high'].pct_change(10) - new_df['$low'].pct_change(10) + 0.001)\n# keep the index of the original dataframe\nresult=pd.DataFrame(new_df['result']).set_index(data_pv.index)\n# transfer the result to series\nresult=result['result']\nresult.to_hdf('result.h5', key='data')"
},
"alpha_pv_diff_pct_15": {
"description": "alpha_pv is defined as the ratio of the difference between close prices 15 days change and open prices 15 days change to the sum of the highest prices 10 days change ratio minus lowest prices 10 days change ratio plus a small constant.",
"formulation": "frac{(text{close_diff15} - text{open_diff15})}{(text{high_pct10} - text{low_pct10} + 0.001)}",
"variables": {
"close": "Closing price of the stock",
"open": "Opening price of the stock",
"high": "Highest price of the stock during the day",
"low": "Lowest price of the stock during the day"
},
"Category": "Volume&Price",
"Difficulty": "Hard",
"gt_code": "import pandas as pd\ndata_pv = pd.read_hdf('daily_pv.h5')\nnew_df= data_pv.reset_index()\n# Calculate Alpha101\nnew_df['result'] = (new_df['$close'].diff(15) - new_df['$open'].diff(15)) / (new_df['$high'].pct_change(10) - new_df['$low'].pct_change(10) + 0.001)\n# keep the index of the original dataframe\nresult=pd.DataFrame(new_df['result']).set_index(data_pv.index)\n# transfer the result to series\nresult=result['result']\nresult.to_hdf('result.h5', key='data')"
},
"alpha_pv_diff_pct_20": {
"description": "alpha_pv is defined as the ratio of the difference between close prices 20 days change and open prices 20 days change to the sum of the highest prices 10 days change ratio minus lowest prices 10 days change ratio plus a small constant.",
"formulation": "frac{(text{close_diff20} - text{open_diff20})}{(text{high_pct10} - text{low_pct10} + 0.001)}",
"variables": {
"close": "Closing price of the stock",
"open": "Opening price of the stock",
"high": "Highest price of the stock during the day",
"low": "Lowest price of the stock during the day"
},
"Category": "Volume&Price",
"Difficulty": "Hard",
"gt_code": "import pandas as pd\ndata_pv = pd.read_hdf('daily_pv.h5')\nnew_df= data_pv.reset_index()\n# Calculate Alpha101\nnew_df['result'] = (new_df['$close'].diff(20) - new_df['$open'].diff(20)) / (new_df['$high'].pct_change(10) - new_df['$low'].pct_change(10) + 0.001)\n# keep the index of the original dataframe\nresult=pd.DataFrame(new_df['result']).set_index(data_pv.index)\n# transfer the result to series\nresult=result['result']\nresult.to_hdf('result.h5', key='data')"
},
"alpha053": {
"description": "Reversal class factor, negative delta of a ratio involving close, low, and high prices over 9 days.",
"formulation": "-1 times Deltaleft(frac{(text{close} - text{low}) - (text{high} - text{close})}{text{close} - text{low}}, 9right)",
"variables": {
"Delta(x, d)": "Change in 'x' over 'd' days.",
"text{close}": "Closing price of the stock.",
"text{low}": "Lowest price of the stock for the day.",
"text{high}": "Highest price of the stock for the day."
},
"Category": "Volume&Price",
"Difficulty": "Easy",
"gt_code": "import pandas as pd\ndata_pv = pd.read_hdf('daily_pv.h5')\nnew_df= data_pv.reset_index()\n# Calculate Alpha053\nnew_df['ratio'] = (new_df['$close'] - new_df['$low'] - (new_df['$high'] - new_df['$close'])) / (new_df['$close'] - new_df['$low'])\n# the change of ratio in new_df over the 9 days\nnew_df['result']=-new_df['ratio'].diff(9)\n# transfer the result to series\nresult=pd.DataFrame(new_df['result']).set_index(data_pv.index)\nresult=result['result']\nresult.to_hdf('result.h5', key='data')"
},
"alpha053_5": {
"description": "Reversal class factor, negative delta of a ratio involving close, low, and high prices over 5 days.",
"formulation": "-1 times Deltaleft(frac{(text{close} - text{low}) - (text{high} - text{close})}{text{close} - text{low}}, 5right)",
"variables": {
"Delta(x, d)": "Change in 'x' over 'd' days.",
"text{close}": "Closing price of the stock.",
"text{low}": "Lowest price of the stock for the day.",
"text{high}": "Highest price of the stock for the day."
},
"Category": "Volume&Price",
"Difficulty": "Easy",
"gt_code": "import pandas as pd\ndata_pv = pd.read_hdf('daily_pv.h5')\nnew_df= data_pv.reset_index()\n# Calculate Alpha053\nnew_df['ratio'] = (new_df['$close'] - new_df['$low'] - (new_df['$high'] - new_df['$close'])) / (new_df['$close'] - new_df['$low'])\n# the change of ratio in new_df over the 5 days\nnew_df['result']=-new_df['ratio'].diff(5)\n# transfer the result to series\nresult=pd.DataFrame(new_df['result']).set_index(data_pv.index)\nresult=result['result']\nresult.to_hdf('result.h5', key='data')"
}
}
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 88 KiB

+4 -4
View File
@@ -10,9 +10,9 @@ import subprocess
latest_tag = subprocess.check_output(["git", "describe", "--tags", "--abbrev=0"], text=True).strip()
project = "RDAgent"
copyright = "2024, Microsoft"
author = "Microsoft"
project = "Predix"
copyright = "2025, Predix Team"
author = "Predix Team"
# -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
@@ -66,7 +66,7 @@ html_static_path = ["_static"]
html_favicon = "_static/favicon.ico"
html_theme_options = {
"source_repository": "https://github.com/microsoft/RD-Agent",
"source_repository": "https://github.com/PredixAI/predix",
"source_branch": "main",
"source_directory": "docs/",
}
+4 -4
View File
@@ -1,13 +1,13 @@
.. RDAgent documentation master file, created by
.. Predix documentation master file, created by
sphinx-quickstart on Mon Jul 15 04:27:50 2024.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to RDAgent's documentation!
Welcome to Predix's documentation!
===================================
.. image:: _static/logo.png
:alt: RD-Agent Logo
:alt: Predix Logo
.. toctree::
:maxdepth: 3
@@ -23,7 +23,7 @@ Welcome to RDAgent's documentation!
api_reference
policy
GitHub <https://github.com/microsoft/RD-Agent>
GitHub <https://github.com/PredixAI/predix>
Indices and tables
+317 -36
View File
@@ -11,13 +11,291 @@ Installation
- for dev users: `See development <development.html>`_
**Install Docker**: RDAgent is designed for research and development, acting like a human researcher and developer. It can write and run code in various environments, primarily using Docker for code execution. This keeps the remaining dependencies simple. Users must ensure Docker is installed before attempting most scenarios. Please refer to the `official 🐳Docker page <https://docs.docker.com/engine/install/>`_ for installation instructions.
Ensure the current user can run Docker commands **without using sudo**. You can verify this by executing `docker run hello-world`.
Configuration
=============
LiteLLM Backend Configuration (Default)
=======================================
.. note::
🔥 **Attention**: We now provide experimental support for **DeepSeek** models! You can use DeepSeek's official API for cost-effective and high-performance inference. See the configuration example below for DeepSeek setup.
Option 1: Unified API base for both models
------------------------------------------
.. code-block:: Properties
# Set to any model supported by LiteLLM.
CHAT_MODEL=gpt-4o
EMBEDDING_MODEL=text-embedding-3-small
# Configure unified API base
# The backend api_key fully follows the convention of litellm.
OPENAI_API_BASE=<your_unified_api_base>
OPENAI_API_KEY=<replace_with_your_openai_api_key>
Option 2: Separate API bases for Chat and Embedding models
----------------------------------------------------------
.. code-block:: Properties
# Set to any model supported by LiteLLM.
# CHAT MODEL:
CHAT_MODEL=gpt-4o
OPENAI_API_BASE=<your_chat_api_base>
OPENAI_API_KEY=<replace_with_your_openai_api_key>
# EMBEDDING MODEL:
# TAKE siliconflow as an example, you can use other providers.
# Note: embedding requires litellm_proxy prefix
EMBEDDING_MODEL=litellm_proxy/BAAI/bge-large-en-v1.5
LITELLM_PROXY_API_KEY=<replace_with_your_siliconflow_api_key>
LITELLM_PROXY_API_BASE=https://api.siliconflow.cn/v1
Configuration Example: DeepSeek Setup
-------------------------------------
Many users encounter configuration errors when setting up DeepSeek. Here's a complete working example:
.. code-block:: Properties
# CHAT MODEL: Using DeepSeek Official API
CHAT_MODEL=deepseek/deepseek-chat
DEEPSEEK_API_KEY=<replace_with_your_deepseek_api_key>
# EMBEDDING MODEL: Using SiliconFlow for embedding since DeepSeek has no embedding model.
# Note: embedding requires litellm_proxy prefix
EMBEDDING_MODEL=litellm_proxy/BAAI/bge-m3
LITELLM_PROXY_API_KEY=<replace_with_your_siliconflow_api_key>
LITELLM_PROXY_API_BASE=https://api.siliconflow.cn/v1
Necessary parameters include:
- `CHAT_MODEL`: The model name of the chat model.
- `EMBEDDING_MODEL`: The model name of the embedding model.
- `OPENAI_API_BASE`: The base URL of the API. If `EMBEDDING_MODEL` does not start with `litellm_proxy/`, this is used for both chat and embedding models; otherwise, it is used for `CHAT_MODEL` only.
Optional parameters (required if your embedding model is provided by a different provider than `CHAT_MODEL`):
- `LITELLM_PROXY_API_KEY`: The API key for the embedding model, required if `EMBEDDING_MODEL` starts with `litellm_proxy/`.
- `LITELLM_PROXY_API_BASE`: The base URL for the embedding model, required if `EMBEDDING_MODEL` starts with `litellm_proxy/`.
**Note:** If you are using an embedding model from a provider different from the chat model, remember to add the `litellm_proxy/` prefix to the `EMBEDDING_MODEL` name.
The `CHAT_MODEL` and `EMBEDDING_MODEL` parameters will be passed into LiteLLM's completion function.
Therefore, when utilizing models provided by different providers, first review the interface configuration of LiteLLM. The model names must match those allowed by LiteLLM.
Additionally, you need to set up the the additional parameters for the respective model provider, and the parameter names must align with those required by LiteLLM.
For example, if you are using a DeepSeek model, you need to set as follows:
.. code-block:: Properties
# For some models LiteLLM requires a prefix to the model name.
CHAT_MODEL=deepseek/deepseek-chat
DEEPSEEK_API_KEY=<replace_with_your_deepseek_api_key>
Besides, when you are using reasoning models, the response might include the thought process. For this case, you need to set the following environment variable:
.. code-block:: Properties
REASONING_THINK_RM=True
For more details on LiteLLM requirements, refer to the `official LiteLLM documentation <https://docs.litellm.ai/docs>`_.
Configuration Example 2: Azure OpenAI Setup
-------------------------------------------
Heres a sample configuration specifically for Azure OpenAI, based on the `official LiteLLM documentation <https://docs.litellm.ai/docs>`_:
If you're using Azure OpenAI, below is a working example using the Python SDK, following the `LiteLLM Azure OpenAI documentation <https://docs.litellm.ai/docs/providers/azure/>`_:
.. code-block:: Properties
from litellm import completion
import os
# Set Azure OpenAI environment variables
os.environ["AZURE_API_KEY"] = "<your_azure_api_key>"
os.environ["AZURE_API_BASE"] = "<your_azure_api_base>"
os.environ["AZURE_API_VERSION"] = "<version>"
# Make a request to your Azure deployment
response = completion(
"azure/<your_deployment_name>",
messages = [{ "content": "Hello, how are you?", "role": "user" }]
)
To align with the Python SDK example above, you can configure the `CHAT_MODEL` based on the `response` model setting and use the corresponding `os.environ` variables by writing them into your local `.env` file as follows:
.. code-block:: Properties
cat << EOF > .env
# CHAT MODEL: Azure OpenAI via LiteLLM
CHAT_MODEL=azure/<your_deployment_name>
AZURE_API_BASE=https://<your_azure_base>.openai.azure.com/
AZURE_API_KEY=<your_azure_api_key>
AZURE_API_VERSION=<version>
# EMBEDDING MODEL: Using SiliconFlow via litellm_proxy
EMBEDDING_MODEL=litellm_proxy/BAAI/bge-large-en-v1.5
LITELLM_PROXY_API_KEY=<your_siliconflow_api_key>
LITELLM_PROXY_API_BASE=https://api.siliconflow.cn/v1
EOF
This configuration allows you to call Azure OpenAI through LiteLLM while using an external provider (e.g., SiliconFlow) for embeddings.
If your `Azure OpenAI API Key`` supports `embedding model`, you can refer to the following configuration example.
.. code-block:: Properties
cat << EOF > .env
EMBEDDING_MODEL=azure/<Model deployment supporting embedding>
CHAT_MODEL=azure/<your deployment name>
AZURE_API_KEY=<replace_with_your_openai_api_key>
AZURE_API_BASE=<your_unified_api_base>
AZURE_API_VERSION=<azure api version>
Execution Environment Configuration
===================================
Coder Environment Configuration (Docker vs. Conda)
RD-Agent's coders can execute code in different environments. You can control this behavior by setting environment variables in your ``.env`` file. This is useful for switching between a local Conda environment and an isolated Docker container.
To configure the environment, add the corresponding line to your ``.env`` file based on the scenario you are running.
**For the Model (Quant) Scenario:**
The execution environment is determined by the ``MODEL_COSTEER_ENV_TYPE`` variable, which is read from ``rdagent/components/coder/model_coder/conf.py``.
* **To use Docker** (recommended for isolated execution):
.. code-block:: properties
MODEL_COSTEER_ENV_TYPE=docker
* **To use Conda** (for running in a local Conda environment):
.. code-block:: properties
MODEL_COSTEER_ENV_TYPE=conda
**For the Data Science Scenario:**
The execution environment is determined by the ``DS_CODER_COSTEER_ENV_TYPE`` variable, which is read from ``rdagent/components/coder/data_science/conf.py``.
* **To use Docker** (recommended for isolated execution):
.. code-block:: properties
DS_CODER_COSTEER_ENV_TYPE=docker
* **To use Conda** (for running in a local Conda environment):
.. code-block:: properties
DS_CODER_COSTEER_ENV_TYPE=conda
Custom Time Segment Configuration (Train / Valid / Test)
=========================================================
RD-Agent now supports user-defined time segments for training, validation,
and testing (backtesting). Users can customize these segments via environment
variables in the ``.env`` file, depending on the scenario being executed.
This feature allows greater flexibility when running experiments on different
time ranges without modifying code or YAML configurations.
Fin-Factor Scenario
-------------------
When running the **fin_factor** scenario, you can configure the time segments
using the following environment variables. These variables are read by the
Factor-related PropSettings and directly affect the execution process.
Add the following entries to your ``.env`` file as needed:
.. code-block:: properties
QLIB_FACTOR_TRAIN_START=<train start date, default is 2008-01-01>
QLIB_FACTOR_TRAIN_END=<train end date, default is 2014-12-31>
QLIB_FACTOR_VALID_START=<valid start date, default is 2015-01-01>
QLIB_FACTOR_VALID_END=<valid end date, default is 2016-12-31>
QLIB_FACTOR_TEST_START=<test / backtest start date, default is 2017-01-01>
QLIB_FACTOR_TEST_END=<test / backtest end date, default is 2020-12-31>
Fin-Model Scenario
------------------
When running the **fin_model** scenario, the model training, validation, and
testing time segments can be configured independently via the following
environment variables:
.. code-block:: properties
QLIB_MODEL_TRAIN_START=<train start date, default is 2008-01-01>
QLIB_MODEL_TRAIN_END=<train end date, default is 2014-12-31>
QLIB_MODEL_VALID_START=<valid start date, default is 2015-01-01>
QLIB_MODEL_VALID_END=<valid end date, default is 2016-12-31>
QLIB_MODEL_TEST_START=<test / backtest start date, default is 2017-01-01>
QLIB_MODEL_TEST_END=<test / backtest end date, default is 2020-12-31>
These settings are used during model training and evaluation and directly
impact the execution workflow.
Fin-Quant Scenario
------------------
When running the **fin_quant** scenario, RD-Agent supports configuring time
segments for factor, model, and quant stages simultaneously.
**Note:** The ``QLIB_QUANT_*`` variables are only used for front-end UI display
purposes and do **not** affect the actual execution process.
You may configure the following variables in your ``.env`` file:
.. code-block:: properties
QLIB_FACTOR_TRAIN_START=<train start date, default is 2008-01-01>
QLIB_FACTOR_TRAIN_END=<train end date, default is 2014-12-31>
QLIB_FACTOR_VALID_START=<valid start date, default is 2015-01-01>
QLIB_FACTOR_VALID_END=<valid end date, default is 2016-12-31>
QLIB_FACTOR_TEST_START=<test / backtest start date, default is 2017-01-01>
QLIB_FACTOR_TEST_END=<test / backtest end date, default is 2020-12-31>
QLIB_MODEL_TRAIN_START=<train start date, default is 2008-01-01>
QLIB_MODEL_TRAIN_END=<train end date, default is 2014-12-31>
QLIB_MODEL_VALID_START=<valid start date, default is 2015-01-01>
QLIB_MODEL_VALID_END=<valid end date, default is 2016-12-31>
QLIB_MODEL_TEST_START=<test / backtest start date, default is 2017-01-01>
QLIB_MODEL_TEST_END=<test / backtest end date, default is 2020-12-31>
QLIB_QUANT_TRAIN_START=<train start date, default is 2008-01-01>
QLIB_QUANT_TRAIN_END=<train end date, default is 2014-12-31>
QLIB_QUANT_VALID_START=<valid start date, default is 2015-01-01>
QLIB_QUANT_VALID_END=<valid end date, default is 2016-12-31>
QLIB_QUANT_TEST_START=<test / backtest start date, default is 2017-01-01>
QLIB_QUANT_TEST_END=<test / backtest end date, default is 2020-12-31>
This setup allows the front-end to display consistent segment information
across different stages while keeping execution logic unchanged.
Configuration(deprecated)
=========================
To run the application, please create a `.env` file in the root directory of the project and add environment variables according to your requirements.
The standard configuration options for the user using the OpenAI API are provided in the `.env.example` file.
If you are using this deprecated version, you should set `BACKEND` to `rdagent.oai.backend.DeprecBackend`.
.. code-block:: Properties
BACKEND=rdagent.oai.backend.DeprecBackend
Here are some other configuration options that you can use:
@@ -38,22 +316,23 @@ Azure OpenAI
The following environment variables are standard configuration options for the user using the OpenAI API.
.. code-block:: Properties
USE_AZURE=True
OPENAI_API_KEY=<replace_with_your_openai_api_key>
EMBEDDING_OPENAI_API_KEY=<replace_with_your_azure_openai_api_key>
EMBEDDING_AZURE_API_BASE= # The endpoint for the Azure OpenAI API.
EMBEDDING_AZURE_API_VERSION= # The version of the Azure OpenAI API.
EMBEDDING_MODEL=text-embedding-3-small
EMBEDDING_AZURE_API_BASE= # The base URL for the Azure OpenAI API.
EMBEDDING_AZURE_API_VERSION = # The version of the Azure OpenAI API.
CHAT_MODEL=gpt-4-turbo
CHAT_AZURE_API_VERSION = # The version of the Azure OpenAI API.
CHAT_OPENAI_API_KEY=<replace_with_your_azure_openai_api_key>
CHAT_AZURE_API_BASE= # The endpoint for the Azure OpenAI API.
CHAT_AZURE_API_VERSION= # The version of the Azure OpenAI API.
CHAT_MODEL= # The model name of the Azure OpenAI API.
Use Azure Token Provider
------------------------
If you are using the Azure token provider, you need to set the `USE_AZURE_TOKEN_PROVIDER` environment variable to `True`. then
If you are using the Azure token provider, you need to set the `CHAT_USE_AZURE_TOKEN_PROVIDER` and `EMBEDDING_USE_AZURE_TOKEN_PROVIDER` environment variable to `True`. then
use the environment variables provided in the `Azure Configuration section <installation_and_configuration.html#azure-openai>`_.
@@ -80,31 +359,33 @@ Configuration List
- OpenAI API Setting
+-----------------------------+--------------------------------------------------+-------------------------+
| Configuration Option | Meaning | Default Value |
+=============================+==================================================+=========================+
| OPENAI_API_KEY | API key for both chat and embedding models | None |
+-----------------------------+--------------------------------------------------+-------------------------+
| EMBEDDING_OPENAI_API_KEY | Use a different API key for embedding model | None |
+-----------------------------+--------------------------------------------------+-------------------------+
| CHAT_OPENAI_API_KEY | Set to use a different API key for chat model | None |
+-----------------------------+--------------------------------------------------+-------------------------+
| EMBEDDING_MODEL | Name of the embedding model | text-embedding-3-small |
+-----------------------------+--------------------------------------------------+-------------------------+
| CHAT_MODEL | Name of the chat model | gpt-4-turbo |
+-----------------------------+--------------------------------------------------+-------------------------+
| EMBEDDING_AZURE_API_BASE | Base URL for the Azure OpenAI API | None |
+-----------------------------+--------------------------------------------------+-------------------------+
| EMBEDDING_AZURE_API_VERSION | Version of the Azure OpenAI API | None |
+-----------------------------+--------------------------------------------------+-------------------------+
| CHAT_AZURE_API_BASE | Base URL for the Azure OpenAI API | None |
+-----------------------------+--------------------------------------------------+-------------------------+
| CHAT_AZURE_API_VERSION | Version of the Azure OpenAI API | None |
+-----------------------------+--------------------------------------------------+-------------------------+
| USE_AZURE | True if you are using Azure OpenAI | False |
+-----------------------------+--------------------------------------------------+-------------------------+
| USE_AZURE_TOKEN_PROVIDER | True if you are using a Azure Token Provider | False |
+-----------------------------+--------------------------------------------------+-------------------------+
+-----------------------------------+-----------------------------------------------------------------+-------------------------+
| Configuration Option | Meaning | Default Value |
+===================================+=================================================================+=========================+
| OPENAI_API_KEY | API key for both chat and embedding models | None |
+-----------------------------------+-----------------------------------------------------------------+-------------------------+
| EMBEDDING_OPENAI_API_KEY | Use a different API key for embedding model | None |
+-----------------------------------+-----------------------------------------------------------------+-------------------------+
| CHAT_OPENAI_API_KEY | Set to use a different API key for chat model | None |
+-----------------------------------+-----------------------------------------------------------------+-------------------------+
| EMBEDDING_MODEL | Name of the embedding model | text-embedding-3-small |
+-----------------------------------+-----------------------------------------------------------------+-------------------------+
| CHAT_MODEL | Name of the chat model | gpt-4-turbo |
+-----------------------------------+-----------------------------------------------------------------+-------------------------+
| EMBEDDING_AZURE_API_BASE | Base URL for the Azure OpenAI API | None |
+-----------------------------------+-----------------------------------------------------------------+-------------------------+
| EMBEDDING_AZURE_API_VERSION | Version of the Azure OpenAI API | None |
+-----------------------------------+-----------------------------------------------------------------+-------------------------+
| CHAT_AZURE_API_BASE | Base URL for the Azure OpenAI API | None |
+-----------------------------------+-----------------------------------------------------------------+-------------------------+
| CHAT_AZURE_API_VERSION | Version of the Azure OpenAI API | None |
+-----------------------------------+-----------------------------------------------------------------+-------------------------+
| USE_AZURE | True if you are using Azure OpenAI | False |
+-----------------------------------+-----------------------------------------------------------------+-------------------------+
| CHAT_USE_AZURE_TOKEN_PROVIDER | True if you are using an Azure Token Provider in chat model | False |
+-----------------------------------+-----------------------------------------------------------------+-------------------------+
| EMBEDDING_USE_AZURE_TOKEN_PROVIDER| True if you are using an Azure Token Provider in embedding model| False |
+-----------------------------------+-----------------------------------------------------------------+-------------------------+
- Globol Setting
+21 -30
View File
@@ -5,21 +5,12 @@ Benchmark
Introduction
=============
Benchmarking the capabilities of the R&D is a very important research problem of the research area.
Currently we are continuously exploring how to benchmark them.
The current benchmarks are listed in this page
Benchmarking the capabilities of R&D is a crucial research problem in this area. We are continuously exploring methods to benchmark these capabilities. The current benchmarks are listed on this page.
Development Capability Benchmarking
===================================
Benchmark is used to evaluate the effectiveness of factors with fixed data.
It mainly includes the following steps:
Benchmarking is used to evaluate the effectiveness of factors with fixed data. It mainly includes the following steps:
1. :ref:`read and prepare the eval_data <data>`
@@ -27,34 +18,31 @@ It mainly includes the following steps:
3. :ref:`declare the eval method and pass the arguments <config>`
4. :ref:`run the eval <run>`
4. :ref:`run the eval <run>`
5. :ref:`save and show the result <show>`
5. :ref:`save and show the result <show>`
Configuration
Configuration
-------------
.. _config:
.. autopydantic_settings:: rdagent.components.benchmark.conf.BenchmarkSettings
Example
++++++++
+++++++
.. _example:
The default value for ``bench_test_round`` is 10, and it will take about 2 hours to run 10 rounds.
To modify it from ``10`` to ``2`` you can adjust this by adding environment variables in the .env file as shown below.
The default value for ``bench_test_round`` is 10, which takes about 2 hours to run. To modify it from ``10`` to ``2``, adjust the environment variables in the .env file as shown below.
.. code-block:: Properties
BENCHMARK_BENCH_TEST_ROUND=1
BENCHMARK_BENCH_TEST_ROUND=2
Data Format
-------------
.. _data:
The sample data in ``bench_data_path`` is a dictionary where each key represents a factor name.
The value associated with each key is factor data containing the following information:
The sample data in ``bench_data_path`` is a dictionary where each key represents a factor name. The value associated with each key is factor data containing the following information:
- **description**: A textual description of the factor.
- **formulation**: A LaTeX formula representing the model's formulation.
@@ -63,22 +51,24 @@ The value associated with each key is factor data containing the following infor
- **Difficulty**: The difficulty level of implementing or understanding the factor.
- **gt_code**: A piece of code associated with the factor.
Here is the example of this data format:
Here is an example of this data format:
.. literalinclude:: ../../rdagent/components/benchmark/example.json
:language: json
Ensure the data is placed in the ``FACTOR_COSTEER_SETTINGS.data_folder_debug``. The data files should be in ``.h5`` or ``.md`` format and must not be stored in any subfolders. LLM-Agents will review the file content and implement the tasks.
.. TODO: Add a script to automatically generate the data in the `rdagent/app/quant_factor_benchmark/data` folder.
Run Benchmark
-------------
.. _run:
Start benchmark after finishing the :doc:`../installation_and_configuration`.
Start the benchmark after completing the :doc:`../installation_and_configuration`.
.. code-block:: Properties
python rdagent/app/quant_factor_benchmark/eval.py
dotenv run -- python rdagent/app/benchmark/factor/eval.py
Once completed, a pkl file will be generated, and its path will be printed on the last line of the console.
@@ -86,18 +76,16 @@ Show Result
-------------
.. _show:
The ``analysis.py`` script is used to read data from pkl and convert it to an image.
Modify the python code in ``rdagent/app/quant_factor_benchmark/analysis.py`` to specify the path to the pkl file and the output path for the png file.
The ``analysis.py`` script reads data from the pkl file and converts it to an image. Modify the Python code in ``rdagent/app/quant_factor_benchmark/analysis.py`` to specify the path to the pkl file and the output path for the png file.
.. code-block:: Properties
python rdagent/app/quant_factor_benchmark/analysis.py
dotenv run -- python rdagent/app/benchmark/factor/analysis.py <log/path to.pkl>
A png file will be saved to the designated path as shown below.
.. image:: ../_static/benchmark.png
Related Paper
-------------
@@ -116,3 +104,6 @@ Related Paper
}
.. image:: https://github.com/user-attachments/assets/494f55d3-de9e-4e73-ba3d-a787e8f9e841
To replicate the benchmark detailed in the paper, please consult the factors listed in the following file: `RD2bench.json <../_static/RD2bench.json>`_.
Please note use ``only_correct_format=False`` when evaluating the results.
+19 -19
View File
@@ -13,34 +13,34 @@ In the two key areas of data-driven scenarios, model implementation and data bui
The supported scenarios are listed below:
.. list-table::
.. list-table::
:header-rows: 1
* - Scenario/Target
- Model Implementation
- Data Building
* - 💹 Finance
- :ref:`🤖Iteratively Proposing Ideas & Evolving <model_agent_fin>`
- :ref:`🦾Auto reports reading & implementation <data_copilot_fin>`
- :ref:`🥇The First Data-Centric Quant Multi-Agent Framework <quant_agent_fin>`
- :ref:`🤖Iteratively Proposing Ideas & Evolving <model_agent_fin>`
:ref:`🦾Auto reports reading & implementation <data_copilot_fin>`
:ref:`🤖Iteratively Proposing Ideas & Evolving <data_agent_fin>`
* - 🩺 Medical
- :ref:`🤖Iteratively Proposing Ideas & Evolving <model_agent_med>`
-
* - 🏭 General
- :ref:`🦾Auto paper reading & implementation <model_copilot_general>`
-
- :ref:`🦾Auto paper reading & implementation <model_copilot_general>`
- :ref:`🤖 Data Science <data_science_agent>`
.. toctree::
:maxdepth: 1
:caption: Doctree:
:hidden:
data_agent_fin
data_copilot_fin
model_agent_fin
model_agent_med
model_copilot_general
:maxdepth: 1
:caption: Doctree:
:hidden:
quant_agent_fin
data_agent_fin
data_copilot_fin
model_agent_fin
model_copilot_general
data_science
finetune
+2 -2
View File
@@ -131,8 +131,8 @@ The following environment variables can be set in the `.env` file to customize t
:settings-show-field-summary: False
:exclude-members: Config
.. autopydantic_settings:: rdagent.components.coder.factor_coder.config.FactorImplementSettings
.. autopydantic_settings:: rdagent.components.coder.factor_coder.config.FactorCoSTEERSettings
:settings-show-field-summary: False
:members: coder_use_cache, data_folder, data_folder_debug, file_based_execution_timeout, select_method, select_threshold, max_loop, knowledge_base_path, new_knowledge_base_path
:members: coder_use_cache, data_folder, data_folder_debug, file_based_execution_timeout, select_method, max_loop, knowledge_base_path, new_knowledge_base_path
:exclude-members: Config, fail_task_trial_limit, v1_query_former_trace_limit, v1_query_similar_success_limit, v2_query_component_limit, v2_query_error_limit, v2_query_former_trace_limit, v2_error_summary, v2_knowledge_sampler
:no-index:
+3 -3
View File
@@ -125,7 +125,7 @@ You can try our demo by running the following command:
.. code-block:: sh
rdagent fin_factor_report --report_folder=git_ignore_folder/reports
rdagent fin_factor_report --report-folder=git_ignore_folder/reports
- Alternatively, you can store the paths of the reports in `report_result_json_file_path`. The format should be:
@@ -157,8 +157,8 @@ The following environment variables can be set in the `.env` file to customize t
:show-inheritance:
:exclude-members: Config
.. autopydantic_settings:: rdagent.components.coder.factor_coder.config.FactorImplementSettings
.. autopydantic_settings:: rdagent.components.coder.factor_coder.config.FactorCoSTEERSettings
:settings-show-field-summary: False
:members: coder_use_cache, data_folder, data_folder_debug, file_based_execution_timeout, select_method, select_threshold, max_loop, knowledge_base_path, new_knowledge_base_path
:members: coder_use_cache, data_folder, data_folder_debug, file_based_execution_timeout, select_method, max_loop, knowledge_base_path, new_knowledge_base_path
:exclude-members: Config, python_bin, fail_task_trial_limit, v1_query_former_trace_limit, v1_query_similar_success_limit, v2_query_component_limit, v2_query_error_limit, v2_query_former_trace_limit, v2_error_summary, v2_knowledge_sampler
:no-index:
+566
View File
@@ -0,0 +1,566 @@
.. _data_science_agent:
=======================
Data Science Agent
=======================
**🤖 Automated Feature Engineering & Model Tuning Evolution**
------------------------------------------------------------------------------------------
The Data Science Agent is an agent that can automatically perform feature engineering and model tuning. It can be used to solve various data science problems, such as image classification, time series forecasting, and text classification.
🌟 Introduction
~~~~~~~~~~~~~~~~~~
In this scenario, our automated system proposes hypothesis, choose action, implements code, conducts validation, and utilizes feedback in a continuous, iterative process.
The goal is to automatically optimize performance metrics within the validation set or Kaggle Leaderboard, ultimately discovering the most efficient features and models through autonomous research and development.
Here's an enhanced outline of the steps:
**Step 1 : Hypothesis Generation 🔍**
- Generate and propose initial hypotheses based on previous experiment analysis and domain expertise, with thorough reasoning and financial justification.
**Step 2 : Experiment Creation ✨**
- Transform the hypothesis into a task.
- Choose a specific action within feature engineering or model tuning.
- Develop, define, and implement a new feature or model, including its name, description, and formulation.
**Step 3 : Model/Feature Implementation 👨‍💻**
- Implement the model code based on the detailed description.
- Evolve the model iteratively as a developer would, ensuring accuracy and efficiency.
**Step 4 : Validation on Test Set or Kaggle 📉**
- Validate the newly developed model using the test set or Kaggle dataset.
- Assess the model's effectiveness and performance based on the validation results.
**Step 5: Feedback Analysis 🔍**
- Analyze validation results to assess performance.
- Use insights to refine hypotheses and enhance the model.
**Step 6: Hypothesis Refinement ♻️**
- Adjust hypotheses based on validation feedback.
- Iterate the process to continuously improve the model.
📖 Data Science Background
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In the evolving landscape of artificial intelligence, **Data Science** represents a powerful paradigm where machines engage in autonomous exploration, hypothesis testing, and model development across diverse domains — from healthcare and finance to logistics and research.
The **Data Science** Agent stands as a central engine in this transformation, enabling users to automate the entire machine learning workflow: from hypothesis generation to code implementation, validation, and refinement — all guided by performance feedback.
By leveraging the **Data Science** Agent, researchers and developers can accelerate experimentation cycles. Whether fine-tuning custom models or competing in high-stakes benchmarks like Kaggle, the Data Science Agent unlocks new frontiers in intelligent, self-directed discovery.
🧭 Example Guide - Customized dataset
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
🔧 **Set up RD-Agent Environment**
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Before you start, please make sure you have installed RD-Agent and configured the environment for RD-Agent correctly. If you want to know how to install and configure the RD-Agent, please refer to the `documentation <../installation_and_configuration.html>`_.
- 🔩 **Setting the Environment variables at .env file**
- Determine the path where the data will be stored and add it to the ``.env`` file.
.. code-block:: sh
dotenv set DS_LOCAL_DATA_PATH <your local directory>/ds_data
dotenv set DS_SCEN rdagent.scenarios.data_science.scen.DataScienceScen
📥 **Prepare Customized datasets**
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- A data science competition dataset usually consists of two parts: ``competition dataset`` and ``evaluation dataset``. (We provide `a sample <https://github.com/microsoft/RD-Agent/tree/main/rdagent/scenarios/data_science/example>`_ of a customized dataset named: `arf-12-hours-prediction-task as a reference`.)
- The ``competition dataset`` contains **training data**, **test data**, **description files**, **formatted submission files**, **data sampling codes**.
- The ``evaluation dataset`` contains **standard answer file**, **data checking codes**, and **Code for calculation of scores**.
- We use the ``arf-12-hours-prediction-task`` data as a sample to introduce the preparation workflow for the competition dataset.
- Create a ``ds_data/source_data/arf-12-hours-prediction-task`` folder, which will be used to store your raw dataset.
- The raw files for the competition ``arf-12-hours-prediction-task`` have two files: ``ARF_12h.csv`` and ``X.npz``.
- Create a ``ds_data/source_data/arf-12-hours-prediction-task/prepare.py`` file that splits your raw data into **training data**, **test data**, **formatted submission file**, and **standard answer file**. (You will need to write a script based on your raw data.)
- The following shows the preprocessing code for the raw data of ``arf-12-hours-prediction-task``.
.. literalinclude:: ../../rdagent/scenarios/data_science/example/source_data/arf-12-hours-prediction-task/prepare.py
:language: python
:caption: ds_data/source_data/arf-12-hours-prediction-task/prepare.py
:linenos:
- At the end of program execution, the ``ds_data`` folder structure will look like this:
.. code-block:: text
ds_data
├── arf-12-hours-prediction-task
│ ├── train
│ │ ├── ARF_12h.csv
│ │ └── X.npz
│ ├── test
│ │ ├── ARF_12h.csv
│ │ └── X.npz
│ └── sample_submission.csv
├── eval
│ └── arf-12-hours-prediction-task
│ └── submission_test.csv
└── source_data
└── arf-12-hours-prediction-task
├── ARF_12h.csv
├── prepare.py
└── X.npz
- Create a ``ds_data/arf-12-hours-prediction-task/description.md`` file to describe your competition, Objective, dataset, and other information.
- The following shows the description file for ``arf-12-hours-prediction-task``
.. literalinclude:: ../../rdagent/scenarios/data_science/example/arf-12-hours-prediction-task/description.md
:language: markdown
:caption: ds_data/arf-12-hours-prediction-task/description.md
:linenos:
- Create a ``ds_data/arf-12-hours-prediction-task/sample.py`` file to construct the debugging sample data.
- The following shows the script for constructing the debugging sample data based on the ``arf-12-hours-prediction-task`` dataset implementation.
.. literalinclude:: ../../rdagent/scenarios/data_science/example/arf-12-hours-prediction-task/sample.py
:language: markdown
:caption: ds_data/arf-12-hours-prediction-task/sample.py
:linenos:
- Create a ``ds_data/eval/arf-12-hours-prediction-task/valid.py`` file, which is used to check the validity of the submission files to ensure that their formatting is consistent with the reference file.
- The following shows a script that checks the validity of a submission based on the ``arf-12-hours-prediction-task`` data.
.. literalinclude:: ../../rdagent/scenarios/data_science/example/eval/arf-12-hours-prediction-task/valid.py
:language: markdown
:caption: ds_data/eval/arf-12-hours-prediction-task/valid.py
:linenos:
- Create a ``ds_data/eval/arf-12-hours-prediction-task/grade.py`` file, which is used to calculate the score based on the submission file and the **standard answer file**, and output the result in JSON format.
- The following shows a grading script based on the ``arf-12-hours-prediction-task`` data implementation.
.. literalinclude:: ../../rdagent/scenarios/data_science/example/eval/arf-12-hours-prediction-task/grade.py
:language: markdown
:caption: ds_data/eval/arf-12-hours-prediction-task/grade.py
:linenos:
- At this point, you have created a complete dataset. The correct structure of the dataset should look like this.
.. code-block:: text
ds_data
├── arf-12-hours-prediction-task
│ ├── train
│ │ ├── ARF_12h.csv
│ │ └── X.npz
│ ├── test
│ │ ├── ARF_12h.csv
│ │ └── X.npz
│ ├── description.md
│ ├── sample_submission.csv
│ └── sample.py
├── eval
│ └── arf-12-hours-prediction-task
│ ├── grade.py
│ ├── submission_test.csv
│ └── valid.py
└── source_data
└── arf-12-hours-prediction-task
├── ARF_12h.csv
├── prepare.py
└── X.npz
- The above shows the complete dataset creation workflow, some of the files are not required, in practice you can customize the dataset according to your own needs.
- If we don't need the test set scores, then we can choose not to generate **formatted submission files** and **standard answer file** in the prepare code, and we don't need to write **data checking codes** and **Code for calculation of scores**.
- **Data sampling code** can also be created according to the actual need, if you do not provide **data sampling code**, RD-Agent will be handed over to the LLM sampling at runtime.
- In the default sampling method (``create_debug_data``), the default sampling ratio (parameter: ``min_frac``) is 1%, if 1% of the data is less than 5, then 5 data will be sampled (parameter: ``min_num``), you can adjust the sampling ratio by adjusting these two parameters.
- If you have customized data sampling code, you need to set ``DS_SAMPLE_DATA_BY_LLM`` to ``False`` (default is True) in the ``.env`` file before running, so that the program will use the customized sampling code when running, and you can just execute this line of code in the command line:
.. code-block:: sh
dotenv set DS_SAMPLE_DATA_BY_LLM False
- In addition, we provide a data sampling method in `rdagent.scenarios.data_science.debug.data.create_debug_data <https://github.com/microsoft/RD-Agent/blob/main/rdagent/scenarios/data_science/debug/data.py#L605>`_, in this method, the default sampling ratio (parameter: ``min_frac``) is 1%, if 1% of the data is less than 5, then 5 data will be sampled (parameter: ``min_num``), you can use this method by the following two ways.
- You can set ``DS_SAMPLE_DATA_BY_LLM`` to ``False`` in the ``.env`` file so that when the program runs, it will use the sampling code provided by RD-Agent.
.. code-block:: sh
dotenv set DS_SAMPLE_DATA_BY_LLM False
- If you think that the parameters in the receipt sampling method provided by RD-Agent are not suitable, you can customize the parameters in the following command and run it, and set ``DS_SAMPLE_DATA_BY_LLM`` to ``False`` in the ``.env`` so that the program will use the sampling data you provided when running.
.. code-block:: sh
python rdagent/app/data_science/debug.py --dataset_path <dataset path> --competition <competiton_name> --min_frac <sampling ratio> --min_num <minimum number of sampling>
dotenv set DS_SAMPLE_DATA_BY_LLM False
- If you don't need the scores from the test set and leave the data sampling to the LLM, or if you use the sampling method provided by the RD-Agent, you only need to prepare a minimal dataset. The structure of the simplest dataset should be as shown below.
.. code-block:: text
ds_data
├── arf-12-hours-prediction-task
│ ├── train
│ │ ├── ARF_12h.csv
│ │ └── X.npz
│ ├── test
│ │ ├── ARF_12h.csv
│ │ └── X.npz
│ └── description.md
└── source_data
└── arf-12-hours-prediction-task
├── ARF_12h.csv
├── prepare.py
└── X.npz
- We have prepared a dataset based on the above description for your reference. You can download it with the following command.
.. code-block:: sh
wget https://github.com/SunsetWolf/rdagent_resource/releases/download/ds_data/arf-12-hours-prediction-task.zip
⚙️ **Set up Environment for Customized datasets**
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: sh
dotenv set DS_SCEN rdagent.scenarios.data_science.scen.DataScienceScen
dotenv set DS_LOCAL_DATA_PATH <your local directory>/ds_data
dotenv set DS_CODER_ON_WHOLE_PIPELINE True
- 📘 More Environment Variables (Optional)
- If you want to see all the available environment variables, you can refer to the configuration file for Data Science scenarios:
.. literalinclude:: ../../rdagent/app/data_science/conf.py
:language: python
:linenos:
- These variables allow you to have finer-grained control in Data Science scenarios.
🚀 **Run the Application**
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- 🌏 You can directly run the application by using the following command:
.. code-block:: sh
rdagent data_science --competition <Competition ID>
- The following shows the command to run based on the ``arf-12-hours-prediction-task`` data
.. code-block:: sh
rdagent data_science --competition arf-12-hours-prediction-task
- More CLI Parameters for `rdagent data_science` command:
.. automodule:: rdagent.app.data_science.loop
:members:
:no-index:
- 📈 Visualize the R&D Process
- We provide a web UI to visualize the log. You just need to run:
.. code-block:: sh
rdagent ui --port <custom port> --log-dir <your log folder like "log/"> --data_science True
- Then you can input the log path and visualize the R&D process.
- 🧪 Scoring the test results
- Finally, shutdown the program, and get the test set scores with this command.
.. code-block:: sh
dotenv run -- python rdagent/log/mle_summary.py grade <url_to_log>
Here, <url_to_log> refers to the parent directory of the log folder generated during the run.
🕹️ Kaggle Agent
~~~~~~~~~~~~~~~~
📖 Background
^^^^^^^^^^^^^^
In the landscape of data science competitions, Kaggle serves as the ultimate arena where data enthusiasts harness the power of algorithms to tackle real-world challenges.
The Kaggle Agent stands as a pivotal tool, empowering participants to seamlessly integrate cutting-edge models and datasets, transforming raw data into actionable insights.
By utilizing the **Kaggle Agent**, data scientists can craft innovative solutions that not only uncover hidden patterns but also drive significant advancements in predictive accuracy and model robustness.
🧭 Example Guide - Kaggle Dataset
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
🛠️ Preparing For The Competition
""""""""""""""""""""""""""""""""""
- 🔨 **Configuring the Kaggle API**
- Register and login on the `Kaggle <https://www.kaggle.com/>`_ website.
- Click on the avatar (usually in the top right corner of the page) -> ``Settings`` -> ``Create New Token``, A file called ``kaggle.json`` will be downloaded.
- Move ``kaggle.json`` to ``~/.config/kaggle/``
- Modify the permissions of the ``kaggle.json`` file.
.. code-block:: sh
chmod 600 ~/.config/kaggle/kaggle.json
- For more information about Kaggle API Settings, refer to the `Kaggle API <https://github.com/Kaggle/kaggle-api>`_.
- 🔩 **Setting the Environment variables at .env file**
- Determine the path where the data will be stored and add it to the ``.env`` file.
.. code-block:: sh
mkdir -p <your local directory>/ds_data
dotenv set KG_LOCAL_DATA_PATH <your local directory>/ds_data
- 📘 More Environment Variables (Optional)
- If you want to see all the available environment variables, you can refer to the configuration file for Data Science scenarios:
.. literalinclude:: ../../rdagent/app/data_science/conf.py
:language: python
:linenos:
- These variables allow you to have finer-grained control in Data Science scenarios.
- 🗳️ **Join the competition**
- If your Kaggle API account has not joined a competition, you will need to join the competition before running the program.
- At the bottom of the competition details page, you can find the ``Join the competition`` button, click on it and select ``I Understand and Accept`` to join the competition.
- In the **Competition List Available** below, you can jump to the competition details page.
📥 Preparing Competition DataDataset && Set up RD-Agent Environment
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
- As a subset of data science, kaggle's dataset still follows the data science format. Based on this, the kaggle dataset can be divided into two categories depending on whether or not it is supported by the **MLE-Bench**.
- What is **MLE-Bench**?
- **MLE-Bench** is a comprehensive benchmark designed to evaluate the **machine learning engineering** capabilities of AI systems using real-world scenarios. The dataset includes multiple Kaggle competitions. Since Kaggle does not provide reserved test sets for these competitions, the benchmark includes preparation scripts for splitting publicly available training data into new training and test sets, and scoring scripts for each competition to accurately evaluate submission scores.
- I'm running a competition Is **MLE-Bench** supported?
- You can see all the competitions supported by **MLE-Bench** `here <https://github.com/openai/mle-bench/tree/main/mlebench/competitions>`_.
- Prepare datasets for **MLE-Bench** supported competitions.
- If you agree with the **MLE-Bench** standard, then you don't need to prepare the dataset, you just need to configure your ``.env`` file to automate the download of the dataset.
- Configure environment variables, add ``DS_IF_USING_MLE_DATA`` to environment variables, and set it to ``True``.
.. code-block:: sh
dotenv set DS_IF_USING_MLE_DATA True
- Configure environment variables, add ``DS_SAMPLE_DATA_BY_LLM`` to environment variables, and set it to ``True``.
.. code-block:: sh
dotenv set DS_SAMPLE_DATA_BY_LLM True
- Configure environment variables, add ``DS_SCEN`` to environment variables, and set it to ``rdagent.scenarios.data_science.scen.KaggleScen``.
.. code-block:: sh
dotenv set DS_SCEN rdagent.scenarios.data_science.scen.KaggleScen
- At this point, you are ready to start running your competition, which will automatically download the data, and the LLM will automatically extract the minimum dataset.
- After running the program the structure of the ds_data folder should look like this (Using the ``tabular-playground-series-dec-2021`` contest as an example).
.. code-block:: text
ds_data
├── tabular-playground-series-dec-2021
│ ├── description.md
│ ├── sample_submission.csv
│ ├── test.csv
│ └── train.csv
└── zip_files
└── tabular-playground-series-dec-2021
└── tabular-playground-series-dec-2021.zip
- The ``ds_data/zip_files`` folder contains a zip file of the raw competition data downloaded from kaggle website.
- At runtime, RD-Agent will automatically build the Docker image specified at `rdagent/scenarios/kaggle/docker/mle_bench_docker/Dockerfile <https://github.com/microsoft/RD-Agent/blob/main/rdagent/scenarios/kaggle/docker/mle_bench_docker/Dockerfile>`_. This image is responsible for downloading the required datasets and grading files for MLE-Bench.
Note: The first run may take longer than subsequent runs as the Docker image and data are being downloaded and set up for the first time.
- Prepare datasets for competitions that are not supported by **MLE-Bench**.
- As a subset of data science, we can follow the format and steps of data science dataset to prepare kaggle dataset. Below we will describe the workflow for preparing a kaggle dataset using the competition ``playground-series-s4e9`` as an example.
- Create a ``ds_data/source_data/playground-series-s4e9`` folder, which will be used to store your raw dataset.
- The raw files for the competition ``playground-series-s4e9`` have two files: ``train.csv``, ``test.csv``, ``sample_submission.csv``, and there are two ways to get the raw data:
- You can find the raw data required for the competition on the `official kaggle website <https://www.kaggle.com/competitions/playground-series-s4e9/data>`_.
- Or you can use the command line to download the raw data for the competition, the download command is as follows.
.. code-block:: sh
kaggle competitions download -c playground-series-s4e9
- Create a ``ds_data/source_data/playground-series-s4e9/prepare.py`` file that splits your raw data into **training data**, **test data**, **formatted submission file**, and **standard answer file**. (You will need to write a script based on your raw data.)
- The following shows the preprocessing code for the raw data of ``playground-series-s4e9``.
.. literalinclude:: ../../rdagent/scenarios/data_science/example/source_data/playground-series-s4e9/prepare.py
:language: python
:caption: ds_data/source_data/playground-series-s4e9/prepare.py
:linenos:
- At the end of program execution, the ``ds_data`` folder structure will look like this:
.. code-block:: text
ds_data
├── playground-series-s4e9
│ ├── train.csv
│ ├── test.csv
│ └── sample_submission.csv
├── eval
│ └── playground-series-s4e9
│ └── submission_test.csv
└── source_data
└── playground-series-s4e9
├── prepare.py
├── sample_submission.csv
├── test.csv
└── train.csv
- Create a ``ds_data/playground-series-s4e9/description.md`` file to describe your competition, dataset description, and other information. We can find the `competition description information <https://www.kaggle.com/competitions/playground-series-s4e9/overview>`_ and the `dataset description information <https://www.kaggle.com/competitions/playground-series-s4e9/data>`_ from the Kaggle website.
- The following shows the description file for ``playground-series-s4e9``
.. literalinclude:: ../../rdagent/scenarios/data_science/example/playground-series-s4e9/description.md
:language: markdown
:caption: ds_data/playground-series-s4e9/description.md
:linenos:
- Create a ``ds_data/eval/playground-series-s4e9/valid.py`` file, which is used to check the validity of the submission files to ensure that their formatting is consistent with the reference file.
- The following shows a script that checks the validity of a submission based on the ``playground-series-s4e9`` data.
.. literalinclude:: ../../rdagent/scenarios/data_science/example/eval/playground-series-s4e9/valid.py
:language: markdown
:caption: ds_data/eval/playground-series-s4e9/valid.py
:linenos:
- Create a ``ds_data/eval/playground-series-s4e9/grade.py`` file, which is used to calculate the score based on the submission file and the **standard answer file**, and output the result in JSON format.
- The following shows a grading script based on the ``playground-series-s4e9`` data implementation.
.. literalinclude:: ../../rdagent/scenarios/data_science/example/eval/playground-series-s4e9/grade.py
:language: markdown
:caption: ds_data/eval/playground-series-s4e9/grade.py
:linenos:
- In this example we don't create a ``ds_data/eval/playground-series-s4e9/sample.py``, we use the sample method provided by RD-Agent by default.
- At this point, you have created a complete dataset. The correct structure of the dataset should look like this.
.. code-block:: text
ds_data
├── playground-series-s4e9
│ ├── train.csv
│ ├── test.csv
│ ├── description.md
│ └── sample_submission.csv
├── eval
│ └── playground-series-s4e9
│ ├── grade.py
│ ├── submission_test.csv
│ └── valid.py
└── source_data
└── playground-series-s4e9
├── prepare.py
├── sample_submission.csv
├── test.csv
└── train.csv
- We have prepared a dataset based on the above description for your reference. You can download it with the following command.
.. code-block:: sh
wget https://github.com/SunsetWolf/rdagent_resource/releases/download/ds_data/playground-series-s4e9.zip
- Next, we need to configure the environment for the ``playground-series-s4e9`` contest. You can do this by executing the following command at the command line.
.. code-block:: sh
dotenv set DS_IF_USING_MLE_DATA False
dotenv set DS_SAMPLE_DATA_BY_LLM False
dotenv set DS_SCEN rdagent.scenarios.data_science.scen.KaggleScen
🚀 **Run the Application**
""""""""""""""""""""""""""""""""""""
- 🌏 You can directly run the application by using the following command:
.. code-block:: sh
rdagent data_science --competition <Competition ID>
- The following shows the command to run based on the ``playground-series-s4e9`` data
.. code-block:: sh
rdagent data_science --competition playground-series-s4e9
- More CLI Parameters for `rdagent data_science` command:
.. automodule:: rdagent.app.data_science.loop
:members:
:no-index:
- 📈 Visualize the R&D Process
- We provide a web UI to visualize the log. You just need to run:
.. code-block:: sh
rdagent ui --port <custom port> --log-dir <your log folder like "log/"> --data_science True
- Then you can input the log path and visualize the R&D process.
- 🧪 Scoring the test results
- Finally, shutdown the program, and get the test set scores with this command.
.. code-block:: sh
dotenv run -- python rdagent/log/mle_summary.py grade <url_to_log>
- If you have configured the full output in ``ds_data/eval/playground-series-s4e9/grade.py``, or if you are running a competition that receives **MLE-Bench** support, you can also summarize the scores by running the following command.
.. code-block:: sh
rdagent grade_summary --log-folder=<url_to_log>
Here, <url_to_log> refers to the parent directory of the log folder generated during the run.
+163
View File
@@ -0,0 +1,163 @@
.. _finetune_agent:
=============================
Fine-tuning an Existing Model
=============================
## **🎯 Scenario: Continue Training on a Pre-trained Model**
In this workflow the **Data Science Agent** starts from a *previously trained* model (and its training script), performs additional fine-tuning on new data, and then re-uses the updated weights for subsequent inference runs.
🚧 Directory Structure
Your competition folder (here called ``custom_data``) must contain **one extra sub-directory** named ``prev_model`` where you keep the old weights and the code that produced them:
.. code-block:: text
ds_data
└── custom_data
├── train.csv
├── test.csv
├── sample_submission.csv # optional
├── description.md # optional
├── sample.py # optional
└── prev_model # ← NEW
├── models/ # previous checkpoints (e.g. *.bin, *.pt, *.ckpt)
└── main.py # training/inference scripts you used before
If your competition provides custom grading/validation scripts, keep them under ``ds_data/eval/custom_data`` exactly as before.
🔧 Environment Setup
~~~~~~~~~~~~~~~~~~~~~~
Add or update the following variables in **.env** (examples shown):
.. code-block:: sh
# required for all Data-Science runs
dotenv set DS_LOCAL_DATA_PATH <your local path>/ds_data
# optional: choose docker / conda, etc.
dotenv set DS_CODER_COSTEER_ENV_TYPE docker
🚀 How It Works at Runtime
1. **First run**
* `rdagent` detects `prev_model/models`.
* It loads the latest checkpoint and prepare the fine-tuning based on code found under `prev_model/*.py` (or your own pipeline if you override it).
* Fine-tuned weights are written to `./workspace_input/models`.
2. **Subsequent runs**
* When you execute `python ./workspace_input/main.py`, the script first looks for a checkpoint in `./workspace_input/models`.
* If found, it **skips fine-tuning** and goes straight to prediction / submission generation.
⏰ Managing Timeouts
By default:
* **Debug loop**: 1 hour (``DS_DEBUG_TIMEOUT=3600`` seconds)
* **Full run** : 3 hours (``DS_FULL_TIMEOUT=10800`` seconds)
Override either value in **.env**:
.. code-block:: sh
# give the debug loop 45 min and the full loop 6 h
dotenv set DS_DEBUG_TIMEOUT 2700
dotenv set DS_FULL_TIMEOUT 21600
- 🚀 **Run the Application**
- You can directly run the application by using the following command:
.. code-block:: sh
dotenv run -- python rdagent/app/finetune/data_science/loop.py --competition <Competition ID>
- Then, you can run the test set score corresponding to each round of the loop.
.. code-block:: sh
dotenv run -- python rdagent/log/mle_summary.py grade <url_to_log>
Here, <url_to_log> refers to the parent directory of the log folder generated during the run.
- 📥 **Visualize the R&D Process**
- We provide a web UI to visualize the log. You just need to run:
.. code-block:: sh
streamlit run rdagent/log/ui/dsapp.py
- Then you can input the log path and visualize the R&D process.
🔍 MLE-bench Guide: Running ML Engineering via MLE-bench
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 📝 **MLE-bench Overview**
- MLE-bench is a comprehensive benchmark designed to evaluate the ML engineering capabilities of AI systems using real-world scenarios. The dataset comprises 75 Kaggle competitions. Since Kaggle does not provide held-out test sets for these competitions, the benchmark includes preparation scripts that split the publicly available training data into new training and test sets, and grading scripts are provided for each competition to accurately evaluate submission scores.
- 🔧 **Set up Environment for MLE-bench**
- Running R&D-Agent on MLE-bench is designed for full automation. There is no need for manual downloads and data preparation. Simply set the environment variable ``DS_IF_USING_MLE_DATA`` to True.
- At runtime, R&D-Agent will automatically build the Docker image specified at ``rdagent/scenarios/kaggle/docker/mle_bench_docker/Dockerfile``. This image is responsible for downloading the required datasets and grading files for MLE-bench.
- Note: The first run may take longer than subsequent runs as the Docker image and data are being downloaded and set up for the first time.
.. code-block:: sh
dotenv set DS_LOCAL_DATA_PATH <your local directory>/ds_data
dotenv set DS_IF_USING_MLE_DATA True
- 🔨 **Configuring the Kaggle API**
- Downloading Kaggle competition data requires the Kaggle API. You can set up the Kaggle API by following these steps:
- Register and login on the `Kaggle <https://www.kaggle.com/>`_ website.
- Click on the avatar (usually in the top right corner of the page) -> ``Settings`` -> ``Create New Token``, A file called ``kaggle.json`` will be downloaded.
- Move ``kaggle.json`` to ``~/.config/kaggle/``
- Modify the permissions of the ``kaggle.json`` file.
.. code-block:: sh
chmod 600 ~/.config/kaggle/kaggle.json
- For more information about Kaggle API Settings, refer to the `Kaggle API <https://github.com/Kaggle/kaggle-api>`_.
- 🔩 **Setting the Environment Variables for MLE-bench**
- In addition to auto-downloading the benchmark data, you must also configure the runtime environment for executing the competition code.
- Use the environment variable ``DS_CODER_COSTEER_ENV_TYPE`` to select the execution mode:
• When set to docker (the default), RD-Agent utilizes the official Kaggle Docker image (``gcr.io/kaggle-gpu-images/python:latest``) to ensure that all required packages are available.
• If you prefer to use a custom Docker setup, you can modify the configuration using ``DS_DOCKER_IMAGE`` or ``DS_DOCKERFILE_FOLDER_PATH``.
• Alternatively, if your competition work only demands basic libraries, you may set ``DS_CODER_COSTEER_ENV_TYPE`` to conda. In this mode, you must create a local conda environment named “kaggle” and pre-install the necessary packages. RD-Agent will execute the competition code within this “kaggle” conda environment.
.. code-block:: sh
# Configure the runtime environment: choice between 'docker' (default) or 'conda'
dotenv set DS_CODER_COSTEER_ENV_TYPE docker
- **Additional Guidance**
- **Combine different LLM Models at R&D Stage**
- You can combine different LLM models at the R&D stage.
- By default, when you set environment variable ``CHAT_MODEL``, it covers both R&D stages. When customizing the model for the development stage, you can set:
.. code-block:: sh
# This example sets the model to "o3-mini". For some models, the reasoning effort shoule be set to "None".
dotenv set LITELLM_CHAT_MODEL_MAP '{"coding":{"model":"o3-mini","reasoning_effort":"high"},"running":{"model":"o3-mini","reasoning_effort":"high"}}'
Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

-128
View File
@@ -1,128 +0,0 @@
.. _model_agent_med:
=======================
Medical Model Agent
=======================
**🤖 Automated Medical Predtion Model Evolution**
------------------------------------------------------------------------------------------
📖 Background
~~~~~~~~~~~~~~
In this scenario, we consider the problem of risk prediction from patients' ICU monitoring data. We use the a public EHR dataset - MIMIC-III and extract a binary classification task for evaluating the framework.
In this task, we aim at predicting the whether the patients will suffer from Acute Respiratory Failure (ARF) based their first 12 hours ICU monitoring data.
🎥 `Demo <https://rdagent.azurewebsites.net/dmm>`_
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. raw:: html
<div style="display: flex; justify-content: center; align-items: center;">
<video width="600" controls>
<source src="https://rdagent.azurewebsites.net/media/1653542fc1b9fa14a306c35c1b1fc48288f980793f38abe82b023af9.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>
</div>
🌟 Introduction
~~~~~~~~~~~~~~~~
In this scenario, our automated system proposes hypothesis, constructs model, implements code, receives back-testing, and uses feedbacks.
Hypothesis is iterated in this continuous process.
The system aims to automatically optimise performance metrics of medical prediction thereby finding the optimised code through autonomous research and development.
Here's an enhanced outline of the steps:
**Step 1 : Hypothesis Generation 🔍**
- Generate and propose initial hypotheses based on previous experiment analysis and domain expertise, with thorough reasoning and justification.
**Step 2 : Model Creation ✨**
- Transform the hypothesis into a model.
- Develop, define, and implement a machine learning model, including its name, description, and formulation.
**Step 3 : Model Implementation 👨‍💻**
- Implement the model code based on the detailed description.
- Evolve the model iteratively as a developer would, ensuring accuracy and efficiency.
**Step 4 : Backtesting with MIMIC-III 📉**
- Conduct backtesting using the newly developed model on the extracted task from MIMIC-III.
- Evaluate the model's effectiveness and performance in terms of AUROC score.
**Step 5 : Feedback Analysis 🔍**
- Analyze backtest results to assess performance.
- Incorporate feedback to refine hypotheses and improve the model.
**Step 6 :Hypothesis Refinement ♻️**
- Refine hypotheses based on feedback from backtesting.
- Repeat the process to continuously improve the model.
⚡ Quick Start
~~~~~~~~~~~~~~~~~
Please refer to the installation part in :doc:`../installation_and_configuration` to prepare your system dependency.
You can try our demo by running the following command:
- 🐍 Create a Conda Environment
- Create a new conda environment with Python (3.10 and 3.11 are well tested in our CI):
.. code-block:: sh
conda create -n rdagent python=3.10
- Activate the environment:
.. code-block:: sh
conda activate rdagent
- 📦 Install the RDAgent
- You can install the RDAgent package from PyPI:
.. code-block:: sh
pip install rdagent
- 📦 Request PhysioNet Account
- Apply for an account at `PhysioNet <https://physionet.org/>`_.
- Request access to FIDDLE preprocessed data: `FIDDLE Dataset <https://physionet.org/content/mimic-eicu-fiddle-feature/1.0.0/>`_.
- Place your username and password in `.env`.
.. code-block:: bash
cat << EOF >> .env
DM_USERNAME=<your_username>
DM_PASSWORD=<your_password>
EOF
- 🚀 Run the Application
- You can directly run the application by using the following command:
.. code-block:: sh
rdagent med_model
🛠️ Usage of modules
~~~~~~~~~~~~~~~~~~~~~
.. _Env Config:
- **Env Config**
The following environment variables can be set in the `.env` file to customize the application's behavior:
.. autopydantic_settings:: rdagent.app.data_mining.conf.MedBasePropSetting
:settings-show-field-summary: False
:exclude-members: Config
+1 -1
View File
@@ -96,4 +96,4 @@ You can try our demo by running the following command:
.. code-block:: sh
rdagent general_model --report_file_path=<path_to_pdf_file>
rdagent general_model --report-file-path=<path_to_pdf_file>
+113
View File
@@ -0,0 +1,113 @@
.. _quant_agent_fin:
=====================
Finance Quant Agent
=====================
**🥇The First Data-Centric Quant Multi-Agent Framework RD-Agent(Q)**
---------------------------------------------------------------------
R&D-Agent for Quantitative Finance, in short **RD-Agent(Q)**, is the first data-centric, multi-agent framework designed to automate the full-stack research and development of quantitative strategies via coordinated factor-model co-optimization.
You can learn more details about **RD-Agent(Q)** through the `paper <https://arxiv.org/abs/2505.15155>`_.
⚡ Quick Start
~~~~~~~~~~~~~~~~~
Before you start, please make sure you have installed RD-Agent and configured the environment for RD-Agent correctly. If you want to know how to install and configure the RD-Agent, please refer to the `documentation <../installation_and_configuration.html>`_.
Then, you can run the framework by running the following command:
- 🐍 Create a Conda Environment
- Create a new conda environment with Python (3.10 and 3.11 are well tested in our CI):
.. code-block:: sh
conda create -n rdagent python=3.10
- Activate the environment:
.. code-block:: sh
conda activate rdagent
- 📦 Install the RDAgent
- You can install the RDAgent package from PyPI:
.. code-block:: sh
pip install rdagent
- 🚀 Run the Application
- You can directly run the application by using the following command:
.. code-block:: sh
rdagent fin_quant
🛠️ Usage of modules
~~~~~~~~~~~~~~~~~~~~~
.. _Env Config:
- **Env Config**
The following environment variables can be set in the `.env` file to customize the application's behavior:
.. autopydantic_settings:: rdagent.app.qlib_rd_loop.conf.QuantBasePropSetting
:settings-show-field-summary: False
:exclude-members: Config
.. autopydantic_settings:: rdagent.components.coder.factor_coder.config.FactorCoSTEERSettings
:settings-show-field-summary: False
:members: coder_use_cache, data_folder, data_folder_debug, file_based_execution_timeout, select_method, max_loop, knowledge_base_path, new_knowledge_base_path
:exclude-members: Config, fail_task_trial_limit, v1_query_former_trace_limit, v1_query_similar_success_limit, v2_query_component_limit, v2_query_error_limit, v2_query_former_trace_limit, v2_error_summary, v2_knowledge_sampler
:no-index:
- **Qlib Configuration**
- The `.yaml` files in both the `model_template` and `factor_template` directories contain some configurations for running the corresponding models or factors within the Qlib framework. Below is an overview of their contents and roles:
- **General Settings**:
- **provider_uri**: Specifies the local Qlib data path, set to `~/.qlib/qlib_data/cn_data`.
- **market**: Configured to `csi300`, representing the CSI 300 index constituents.
- **benchmark**: Set to `SH000300`, used for backtesting evaluation.
- **Data Handling**:
- **start_time** and **end_time**: Define the full data range, from `2008-01-01` to `2022-08-01`.
- **fit_start_time**: The start date for fitting the model, set to `2008-01-01`.
- **fit_end_time**: The end date for fitting the model, set to `2014-12-31`.
- **features and labels**: Generated via a nested data loader combining `Alpha158DL` (for engineered features such as `RESI5`, `WVMA5`, `RSQR5`, `KLEN`, etc.) and a `StaticDataLoader` that loads precomputed factor files (`combined_factors_df.parquet`).
- **normalization**: The pipeline includes `RobustZScoreNorm` (with clipping) and `Fillna` for inference, and `DropnaLabel` with `CSZScoreNorm` for training.
- **Training Configuration**:
- **Model**: Uses `GeneralPTNN`, a PyTorch-based neural network model.
- **Dataset Splits**:
- **train**: `2008-01-01` to `2014-12-31`
- **valid**: `2015-01-01` to `2016-12-31`
- **test**: `2017-01-01` to `2020-08-01`
- **Default Hyperparameters** (can be overridden by command-line arguments):
- **n_epochs**: `100`
- **lr**: `2e-4`
- **early_stop**: `10`
- **batch_size**: `256`
- **weight_decay**: `0.0`
- **metric**: `loss`
- **loss**: `mse`
- **n_jobs**: `20`
- **GPU**: `0` (uses GPU 0 if available)
- **Backtesting and Evaluation**:
- **strategy**: `TopkDropoutStrategy`, which selects the top 50 stocks and randomly drops 5 to introduce exploration.
- **backtest period**: `2017-01-01` to `2020-08-01`
- **initial capital**: `100,000,000`
- **cost configuration**: Includes open/close costs, minimum transaction costs, and slippage control.
- **Recording and Analysis**:
- **SignalRecord**: Logs predicted signals.
- **SigAnaRecord**: Performs signal analysis without long-short separation.
- **PortAnaRecord**: Conducts portfolio analysis using the configured strategy and backtest settings.
+2 -1
View File
@@ -18,7 +18,7 @@ In `RD-Agent/` folder, run:
.. code-block:: bash
rdagent ui --port <port> --log_dir <log_dir like "log/"> [--debug]
rdagent ui --port <port> --log-dir <log_dir like "log/"> [--debug]
This will start a web app on `http://localhost:<port>`.
@@ -38,6 +38,7 @@ Use Web App
- Qlib Factor
- Data Mining
- Model from Paper
- Kaggle
3. Click the `Config⚙️` button and input the log path (if you set the log_dir parameter, you can select a log_path in the dropdown list).
+553
View File
@@ -0,0 +1,553 @@
import io
import json
from abc import abstractmethod
from typing import Dict, Tuple
import pandas as pd
from rdagent.components.coder.factor_coder.config import FACTOR_COSTEER_SETTINGS
from rdagent.components.coder.factor_coder.factor import FactorTask
from rdagent.core.experiment import Task, Workspace
from rdagent.oai.llm_conf import LLM_SETTINGS
from rdagent.oai.llm_utils import APIBackend
from rdagent.utils.agent.tpl import T
class FactorEvaluator:
"""Although the init method is same to Evaluator, but we want to emphasize they are different"""
def __init__(self, scen=None) -> None:
self.scen = scen
@abstractmethod
def evaluate(
self,
target_task: Task,
implementation: Workspace,
gt_implementation: Workspace,
**kwargs,
) -> Tuple[str, object]:
"""You can get the dataframe by
.. code-block:: python
_, gen_df = implementation.execute()
_, gt_df = gt_implementation.execute()
Returns
-------
Tuple[str, object]
- str: the text-based description of the evaluation result
- object: a comparable metric (bool, integer, float ...) None for evaluator with only text-based result
"""
raise NotImplementedError("Please implement the `evaluator` method")
def _get_df(self, gt_implementation: Workspace, implementation: Workspace):
if gt_implementation is not None:
_, gt_df = gt_implementation.execute()
if isinstance(gt_df, pd.Series):
gt_df = gt_df.to_frame("gt_factor")
if isinstance(gt_df, pd.DataFrame):
gt_df = gt_df.sort_index()
else:
gt_df = None
_, gen_df = implementation.execute()
if isinstance(gen_df, pd.Series):
gen_df = gen_df.to_frame("source_factor")
if isinstance(gen_df, pd.DataFrame):
gen_df = gen_df.sort_index()
return gt_df, gen_df
def __str__(self) -> str:
return self.__class__.__name__
class FactorCodeEvaluator(FactorEvaluator):
def evaluate(
self,
target_task: FactorTask,
implementation: Workspace,
execution_feedback: str,
value_feedback: str = "",
gt_implementation: Workspace = None,
**kwargs,
):
factor_information = target_task.get_task_information()
code = implementation.all_codes
system_prompt = T(".prompts:evaluator_code_feedback_v1_system").r(
scenario=(
self.scen.get_scenario_all_desc(
target_task,
filtered_tag="feature",
simple_background=FACTOR_COSTEER_SETTINGS.simple_background,
)
if self.scen is not None
else "No scenario description."
)
)
execution_feedback_to_render = execution_feedback
for _ in range(10): # 10 times to split the content is enough
user_prompt = T(".prompts:evaluator_code_feedback_v1_user").r(
factor_information=factor_information,
code=code,
execution_feedback=execution_feedback_to_render,
value_feedback=value_feedback,
gt_code=gt_implementation.code if gt_implementation else None,
)
if (
APIBackend().build_messages_and_calculate_token(
user_prompt=user_prompt,
system_prompt=system_prompt,
)
> APIBackend().chat_token_limit
):
execution_feedback_to_render = execution_feedback_to_render[len(execution_feedback_to_render) // 2 :]
else:
break
critic_response = APIBackend().build_messages_and_create_chat_completion(
user_prompt=user_prompt,
system_prompt=system_prompt,
json_mode=False,
)
return critic_response, None
class FactorInfEvaluator(FactorEvaluator):
def evaluate(
self,
implementation: Workspace,
gt_implementation: Workspace,
) -> Tuple[str, object]:
_, gen_df = self._get_df(gt_implementation, implementation)
if gen_df is None:
return (
"The source dataframe is None. Please check the implementation.",
False,
)
INF_count = gen_df.isin([float("inf"), -float("inf")]).sum().sum()
if INF_count == 0:
return "The source dataframe does not have any infinite values.", True
else:
return (
f"The source dataframe has {INF_count} infinite values. Please check the implementation.",
False,
)
class FactorSingleColumnEvaluator(FactorEvaluator):
def evaluate(
self,
implementation: Workspace,
gt_implementation: Workspace,
) -> Tuple[str, object]:
_, gen_df = self._get_df(gt_implementation, implementation)
if gen_df is None:
return (
"The source dataframe is None. Please check the implementation.",
False,
)
if len(gen_df.columns) == 1:
return "The source dataframe has only one column which is correct.", True
else:
return (
"The source dataframe has more than one column. Please check the implementation. We only evaluate the first column.",
False,
)
class FactorOutputFormatEvaluator(FactorEvaluator):
def evaluate(
self,
implementation: Workspace,
gt_implementation: Workspace,
) -> Tuple[str, object]:
gt_df, gen_df = self._get_df(gt_implementation, implementation)
if gen_df is None:
return (
"The source dataframe is None. Skip the evaluation of the output format.",
False,
)
buffer = io.StringIO()
gen_df.info(buf=buffer)
gen_df_info_str = f"The user is currently working on a feature related task.\nThe output dataframe info is:\n{buffer.getvalue()}"
system_prompt = T(".prompts:evaluator_output_format_system").r(
scenario=(
self.scen.get_scenario_all_desc(implementation.target_task, filtered_tag="feature")
if self.scen is not None
else "No scenario description."
)
)
# TODO: with retry_context(retry_n=3, except_list=[KeyError]):
max_attempts = 3
attempts = 0
final_evaluation_dict = None
while attempts < max_attempts:
try:
api = APIBackend() if attempts == 0 else APIBackend(use_chat_cache=False)
resp = api.build_messages_and_create_chat_completion(
user_prompt=gen_df_info_str,
system_prompt=system_prompt,
json_mode=True,
json_target_type=Dict[str, str | bool | int],
)
resp_dict = json.loads(resp)
resp_dict["output_format_decision"] = str(resp_dict["output_format_decision"]).lower() in ["true", "1"]
return (
str(resp_dict["output_format_feedback"]),
resp_dict["output_format_decision"],
)
except (KeyError, json.JSONDecodeError) as e:
attempts += 1
if attempts >= max_attempts:
raise KeyError(
"Wrong JSON Response or missing 'output_format_decision' or 'output_format_feedback' key after multiple attempts."
) from e
return "Failed to evaluate output format after multiple attempts.", False
class FactorDatetimeDailyEvaluator(FactorEvaluator):
def evaluate(
self,
implementation: Workspace,
gt_implementation: Workspace,
) -> Tuple[str | object]:
_, gen_df = self._get_df(gt_implementation, implementation)
if gen_df is None:
return "The source dataframe is None. Skip the evaluation of the datetime format.", False
if "datetime" not in gen_df.index.names:
return "The source dataframe does not have a datetime index. Please check the implementation.", False
try:
pd.to_datetime(gen_df.index.get_level_values("datetime"))
except Exception:
return (
f"The source dataframe has a datetime index but it is not in the correct format (maybe a regular string or other objects). Please check the implementation.\n The head of the output dataframe is: \n{gen_df.head()}",
False,
)
time_diff = pd.to_datetime(gen_df.index.get_level_values("datetime")).to_series().diff().dropna()
min_diff = time_diff.min()
if min_diff <= pd.Timedelta(minutes=1):
return (
"The generated dataframe is not daily. The implementation is definitely wrong. Please check the implementation.",
False,
)
if min_diff <= pd.Timedelta(minutes=30):
return "The generated dataframe is intraday (1min bars). This is correct for EURUSD.", True
return "The generated dataframe is daily.", True
class FactorRowCountEvaluator(FactorEvaluator):
def evaluate(
self,
implementation: Workspace,
gt_implementation: Workspace,
) -> Tuple[str, object]:
gt_df, gen_df = self._get_df(gt_implementation, implementation)
if gen_df is None:
return (
"The source dataframe is None. Please check the implementation.",
False,
)
ratio = min(len(gen_df), len(gt_df)) / max(len(gen_df), len(gt_df))
return (
(
f"The ratio of rows count in the source dataframe to the ground truth dataframe is {ratio:.2f}. "
+ "Please verify the implementation. "
if ratio <= 0.99
else ""
),
ratio,
)
class FactorIndexEvaluator(FactorEvaluator):
def evaluate(
self,
implementation: Workspace,
gt_implementation: Workspace,
) -> Tuple[str, object]:
gt_df, gen_df = self._get_df(gt_implementation, implementation)
if gen_df is None:
return (
"The source dataframe is None. Please check the implementation.",
False,
)
gen_index_set, gt_index_set = set(gen_df.index), set(gt_df.index)
similarity = len(gen_index_set.intersection(gt_index_set)) / len(gen_index_set.union(gt_index_set))
return (
(
f"The source dataframe and the ground truth dataframe have different index with a similarity of {similarity:.2%}. The similarity is calculated by the number of shared indices divided by the union indices. "
+ "Please check the implementation."
if similarity <= 0.99
else ""
),
similarity,
)
class FactorMissingValuesEvaluator(FactorEvaluator):
def evaluate(
self,
implementation: Workspace,
gt_implementation: Workspace,
) -> Tuple[str, object]:
gt_df, gen_df = self._get_df(gt_implementation, implementation)
if gen_df is None:
return (
"The source dataframe is None. Please check the implementation.",
False,
)
if gen_df.isna().sum().sum() == gt_df.isna().sum().sum():
return "Both dataframes have the same missing values.", True
else:
return (
f"The dataframes do not have the same missing values. The source dataframe has {gen_df.isna().sum().sum()} missing values, while the ground truth dataframe has {gt_df.isna().sum().sum()} missing values. Please check the implementation.",
False,
)
class FactorEqualValueRatioEvaluator(FactorEvaluator):
def evaluate(
self,
implementation: Workspace,
gt_implementation: Workspace,
) -> Tuple[str, object]:
gt_df, gen_df = self._get_df(gt_implementation, implementation)
if gen_df is None:
return (
"The source dataframe is None. Please check the implementation.",
-1,
)
try:
close_values = gen_df.sub(gt_df).abs().lt(1e-6)
result_int = close_values.astype(int)
pos_num = result_int.sum().sum()
acc_rate = pos_num / close_values.size
except:
close_values = gen_df
if close_values.all().iloc[0]:
return (
"All values in the dataframes are equal within the tolerance of 1e-6.",
acc_rate,
)
else:
return (
"Some values differ by more than the tolerance of 1e-6. Check for rounding errors or differences in the calculation methods.",
acc_rate,
)
class FactorCorrelationEvaluator(FactorEvaluator):
def __init__(self, hard_check: bool, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
self.hard_check = hard_check
def evaluate(
self,
implementation: Workspace,
gt_implementation: Workspace,
) -> Tuple[str, object]:
gt_df, gen_df = self._get_df(gt_implementation, implementation)
if gen_df is None:
return (
"The source dataframe is None. Please check the implementation.",
False,
)
concat_df = pd.concat([gen_df, gt_df], axis=1)
concat_df.columns = ["source", "gt"]
ic = concat_df.groupby("datetime").apply(lambda df: df["source"].corr(df["gt"])).dropna().mean()
ric = (
concat_df.groupby("datetime")
.apply(lambda df: df["source"].corr(df["gt"], method="spearman"))
.dropna()
.mean()
)
if self.hard_check:
if ic > 0.99 and ric > 0.99:
return (
f"The dataframes are highly correlated. The ic is {ic:.6f} and the rankic is {ric:.6f}.",
True,
)
else:
return (
f"The dataframes are not sufficiently high correlated. The ic is {ic:.6f} and the rankic is {ric:.6f}. Investigate the factors that might be causing the discrepancies and ensure that the logic of the factor calculation is consistent.",
False,
)
else:
return f"The ic is ({ic:.6f}) and the rankic is ({ric:.6f}).", ic
class FactorValueEvaluator(FactorEvaluator):
def evaluate(
self,
implementation: Workspace,
gt_implementation: Workspace,
version: int = 1, # 1 for qlib factors and 2 for kaggle factors
**kwargs,
) -> Tuple:
conclusions = []
# Initialize result variables
row_result = 0
index_result = 0
output_format_result = None
equal_value_ratio_result = 0
high_correlation_result = False
row_result = None
# Check if both dataframe has only one columns Mute this since factor task might generate more than one columns now
if version == 1:
feedback_str, _ = FactorSingleColumnEvaluator(self.scen).evaluate(implementation, gt_implementation)
conclusions.append(feedback_str)
elif version == 2:
input_shape = self.scen.input_shape
_, gen_df = self._get_df(gt_implementation, implementation)
if gen_df.shape[-1] > input_shape[-1]:
conclusions.append(
"Output dataframe has more columns than input feature which is not acceptable in feature processing tasks. Please check the implementation to avoid generating too many columns. Consider this implementation as a failure."
)
feedback_str, inf_evaluate_res = FactorInfEvaluator(self.scen).evaluate(implementation, gt_implementation)
conclusions.append(feedback_str)
# Check if the index of the dataframe is ("datetime", "instrument")
feedback_str, _ = FactorOutputFormatEvaluator(self.scen).evaluate(implementation, gt_implementation)
conclusions.append(feedback_str)
if version == 1:
feedback_str, daily_check_result = FactorDatetimeDailyEvaluator(self.scen).evaluate(
implementation, gt_implementation
)
conclusions.append(feedback_str)
else:
daily_check_result = None
# Check dataframe format
if gt_implementation is not None:
feedback_str, row_result = FactorRowCountEvaluator(self.scen).evaluate(implementation, gt_implementation)
conclusions.append(feedback_str)
feedback_str, index_result = FactorIndexEvaluator(self.scen).evaluate(implementation, gt_implementation)
conclusions.append(feedback_str)
feedback_str, output_format_result = FactorMissingValuesEvaluator(self.scen).evaluate(
implementation, gt_implementation
)
conclusions.append(feedback_str)
feedback_str, equal_value_ratio_result = FactorEqualValueRatioEvaluator(self.scen).evaluate(
implementation, gt_implementation
)
conclusions.append(feedback_str)
if index_result > 0.99:
feedback_str, high_correlation_result = FactorCorrelationEvaluator(
hard_check=True, scen=self.scen
).evaluate(implementation, gt_implementation)
else:
high_correlation_result = False
feedback_str = "The source dataframe and the ground truth dataframe have different index. Give up comparing the values and correlation because it's useless"
conclusions.append(feedback_str)
# Combine all conclusions into a single string
conclusion_str = "\n".join(conclusions)
if gt_implementation is not None and (equal_value_ratio_result > 0.99) or high_correlation_result:
decision_from_value_check = True
elif (
row_result is not None
and row_result <= 0.99
or output_format_result is False
or daily_check_result is False
or inf_evaluate_res is False
):
decision_from_value_check = False
else:
decision_from_value_check = None
return conclusion_str, decision_from_value_check
class FactorFinalDecisionEvaluator(FactorEvaluator):
def evaluate(
self,
target_task: FactorTask,
execution_feedback: str,
value_feedback: str,
code_feedback: str,
**kwargs,
) -> Tuple:
system_prompt = T(".prompts:evaluator_final_decision_v1_system").r(
scenario=(
self.scen.get_scenario_all_desc(target_task, filtered_tag="feature")
if self.scen is not None
else "No scenario description."
)
)
execution_feedback_to_render = execution_feedback
for _ in range(10): # 10 times to split the content is enough
user_prompt = T(".prompts:evaluator_final_decision_v1_user").r(
factor_information=target_task.get_task_information(),
execution_feedback=execution_feedback_to_render,
code_feedback=code_feedback,
value_feedback=(
value_feedback
if value_feedback is not None
else "No Ground Truth Value provided, so no evaluation on value is performed."
),
)
if (
APIBackend().build_messages_and_calculate_token(
user_prompt=user_prompt,
system_prompt=system_prompt,
)
> APIBackend().chat_token_limit
):
execution_feedback_to_render = execution_feedback_to_render[len(execution_feedback_to_render) // 2 :]
else:
break
# TODO: with retry_context(retry_n=3, except_list=[KeyError]):
final_evaluation_dict = None
attempts = 0
max_attempts = 3
while attempts < max_attempts:
try:
api = APIBackend() if attempts == 0 else APIBackend(use_chat_cache=False)
final_evaluation_dict = json.loads(
api.build_messages_and_create_chat_completion(
user_prompt=user_prompt,
system_prompt=system_prompt,
json_mode=True,
seed=attempts, # in case of useless retrying when cache enabled.
json_target_type=Dict[str, str | bool | int],
),
)
final_decision = final_evaluation_dict["final_decision"]
final_feedback = final_evaluation_dict["final_feedback"]
final_decision = str(final_decision).lower() in ["true", "1"]
return final_decision, final_feedback
except json.JSONDecodeError as e:
raise ValueError("Failed to decode JSON response from API.") from e
except KeyError as e:
attempts += 1
if attempts >= max_attempts:
raise KeyError(
"Response from API is missing 'final_decision' or 'final_feedback' key after multiple attempts."
) from e
return None, None
+36
View File
@@ -0,0 +1,36 @@
# How to read files.
For example, if you want to read `filename.h5`
```Python
import pandas as pd
df = pd.read_hdf("filename.h5", key="data")
```
NOTE: **key is always "data" for all hdf5 files **.
# Here is a short description about the data
| Filename | Description |
| -------------- | -----------------------------------------------------------------|
| "daily_pv.h5" | EURUSD 15-minute OHLCV intraday data. |
# For different data, We have some basic knowledge for them
## EURUSD 15min intraday data
$open: open price of EURUSD at the start of the 15min bar.
$close: close price of EURUSD at the end of the 15min bar.
$high: highest price of EURUSD during the 15min bar.
$low: lowest price of EURUSD during the 15min bar.
$volume: traded volume during the 15min bar.
**IMPORTANT: There is NO $factor column. Use only $open, $close, $high, $low, $volume.**
## Market sessions (UTC)
- Asian session: 00:00 - 08:00 (mean reversion tendencies)
- London session: 08:00 - 16:00 (trending, momentum works)
- NY session: 13:00 - 21:00 (high volatility)
- London-NY overlap: 13:00 - 16:00 (highest volume)
## Lookback reference
- 4 bars = 1 hour
- 8 bars = 2 hours
- 16 bars = 4 hours
- 32 bars = 8 hours
- 96 bars = 1 day
+132
View File
@@ -0,0 +1,132 @@
import json
from typing import List, Tuple
from rdagent.components.coder.factor_coder.factor import FactorExperiment, FactorTask
from rdagent.components.proposal import FactorHypothesis2Experiment, FactorHypothesisGen
from rdagent.core.proposal import Hypothesis, Scenario, Trace
from rdagent.scenarios.qlib.experiment.factor_experiment import QlibFactorExperiment
from rdagent.scenarios.qlib.experiment.model_experiment import QlibModelExperiment
from rdagent.scenarios.qlib.experiment.quant_experiment import QlibQuantScenario
from rdagent.utils.agent.tpl import T
QlibFactorHypothesis = Hypothesis
class QlibFactorHypothesisGen(FactorHypothesisGen):
def __init__(self, scen: Scenario) -> Tuple[dict, bool]:
super().__init__(scen)
def prepare_context(self, trace: Trace) -> Tuple[dict, bool]:
hypothesis_and_feedback = (
T("scenarios.qlib.prompts:hypothesis_and_feedback").r(
trace=trace,
)
if len(trace.hist) > 0
else "No previous hypothesis and feedback available since it's the first round."
)
last_hypothesis_and_feedback = (
T("scenarios.qlib.prompts:last_hypothesis_and_feedback").r(
experiment=trace.hist[-1][0], feedback=trace.hist[-1][1]
)
if len(trace.hist) > 0
else "No previous hypothesis and feedback available since it's the first round."
)
context_dict = {
"hypothesis_and_feedback": hypothesis_and_feedback,
"last_hypothesis_and_feedback": last_hypothesis_and_feedback,
"RAG": (
"Try EURUSD-specific FX factors: momentum (4-32 bars), mean reversion, ATR volatility, volume spikes, session-based signals. Use only $open $close $high $low $volume columns. No $factor column exists."
if len(trace.hist) < 15
else "Now, you need to try factors that can achieve high IC (e.g., machine learning-based factors)."
),
"hypothesis_output_format": T("scenarios.qlib.prompts:factor_hypothesis_output_format").r(),
"hypothesis_specification": T("scenarios.qlib.prompts:factor_hypothesis_specification").r(),
}
return context_dict, True
def convert_response(self, response: str) -> Hypothesis:
response_dict = json.loads(response)
hypothesis = QlibFactorHypothesis(
hypothesis=response_dict.get("hypothesis"),
reason=response_dict.get("reason"),
concise_reason=response_dict.get("concise_reason"),
concise_observation=response_dict.get("concise_observation"),
concise_justification=response_dict.get("concise_justification"),
concise_knowledge=response_dict.get("concise_knowledge"),
)
return hypothesis
class QlibFactorHypothesis2Experiment(FactorHypothesis2Experiment):
def prepare_context(self, hypothesis: Hypothesis, trace: Trace) -> Tuple[dict | bool]:
if isinstance(trace.scen, QlibQuantScenario):
scenario = trace.scen.get_scenario_all_desc(action="factor")
else:
scenario = trace.scen.get_scenario_all_desc()
experiment_output_format = T("scenarios.qlib.prompts:factor_experiment_output_format").r()
if len(trace.hist) == 0:
hypothesis_and_feedback = "No previous hypothesis and feedback available since it's the first round."
else:
specific_trace = Trace(trace.scen)
for i in range(len(trace.hist) - 1, -1, -1):
if not hasattr(trace.hist[i][0].hypothesis, "action") or trace.hist[i][0].hypothesis.action == "factor":
specific_trace.hist.insert(0, trace.hist[i])
if len(specific_trace.hist) > 0:
specific_trace.hist.reverse()
hypothesis_and_feedback = T("scenarios.qlib.prompts:hypothesis_and_feedback").r(
trace=specific_trace,
)
else:
hypothesis_and_feedback = "No previous hypothesis and feedback available."
return {
"target_hypothesis": str(hypothesis),
"scenario": scenario,
"hypothesis_and_feedback": hypothesis_and_feedback,
"experiment_output_format": experiment_output_format,
"target_list": [],
"RAG": None,
}, True
def convert_response(self, response: str, hypothesis: Hypothesis, trace: Trace) -> FactorExperiment:
response_dict = json.loads(response)
tasks = []
for factor_name in response_dict:
description = response_dict[factor_name]["description"]
formulation = response_dict[factor_name]["formulation"]
variables = response_dict[factor_name]["variables"]
tasks.append(
FactorTask(
factor_name=factor_name,
factor_description=description,
factor_formulation=formulation,
variables=variables,
)
)
exp = QlibFactorExperiment(tasks, hypothesis=hypothesis)
exp.based_experiments = [QlibFactorExperiment(sub_tasks=[])] + [
t[0] for t in trace.hist if t[1] and isinstance(t[0], FactorExperiment)
]
unique_tasks = []
for task in tasks:
duplicate = False
for based_exp in exp.based_experiments:
if isinstance(based_exp, QlibModelExperiment):
continue
for sub_task in based_exp.sub_tasks:
if task.factor_name == sub_task.factor_name:
duplicate = True
break
if duplicate:
break
if not duplicate:
unique_tasks.append(task)
exp.tasks = unique_tasks
return exp
+21
View File
@@ -0,0 +1,21 @@
import subprocess
import sys
import os
# Qlib läuft in rdagent4qlib environment
result = subprocess.run(
["/home/nico/miniconda3/envs/rdagent4qlib/bin/python3", "-c", """
import qlib
from qlib.data import D
qlib.init(provider_uri="~/.qlib/qlib_data/eurusd_1min_data")
fields = ["$open", "$close", "$high", "$low", "$volume"]
data = (D.features(["EURUSD"], fields, start_time="2022-03-14", end_time="2026-03-20", freq="1min")
.swaplevel().sort_index())
data.to_hdf("./daily_pv_all.h5", key="data")
data_debug = (D.features(["EURUSD"], fields, start_time="2024-01-01", end_time="2026-03-20", freq="1min")
.swaplevel().sort_index())
data_debug.to_hdf("./daily_pv_debug.h5", key="data")
print(f"Done: {data.shape[0]} rows")
"""],
capture_output=False
)
+257
View File
@@ -0,0 +1,257 @@
qlib_quant_background: |-
Quantitative investment is a data-driven approach to asset management that relies on mathematical models, statistical techniques, and computational methods to analyze financial markets and make investment decisions. Two essential components of this approach are factors and models.
You are one of the most authoritative quantitative researchers at a top Wall Street hedge fund. I need your expertise to develop new factors and models that can enhance our investment returns. Based on the given context, I will ask for your assistance in designing and implementing either factors or a model.
{% if runtime_environment is not none %}
====== Runtime Environment ======
You have following environment to run the code:
{{ runtime_environment }}
{% endif %}
qlib_factor_background: |-
The factor is a characteristic or variable used in quant investment that can help explain the returns and risks of a portfolio or a single asset. Factors are used by investors to identify and exploit sources of excess returns, and they are central to many quantitative investment strategies.
Each number in the factor represents a physics value to an instrument on a day.
User will train a model to predict the next several days return based on the factor values of the previous days.
The factor is defined in the following parts:
1. Name: The name of the factor.
2. Description: The description of the factor.
3. Formulation: The formulation of the factor.
4. Variables: The variables or functions used in the formulation of the factor.
The factor might not provide all the parts of the information above since some might not be applicable.
Please specifically give all the hyperparameter in the factors like the window size, look back period, and so on. One factor should statically defines one output with a static source data. For example, last 10 days momentum and last 20 days momentum should be two different factors.
{% if runtime_environment is not none %}
====== Runtime Environment ======
You have following environment to run the code:
{{ runtime_environment }}
{% endif %}
qlib_factor_interface: |-
Your python code should follow the interface to better interact with the user's system.
CRITICAL DATA FORMAT: The HDF5 file has a MultiIndex with levels ['datetime', 'instrument']. The instrument is an INDEX LEVEL, NOT a column. Never use df['instrument']. Always use df.index.get_level_values('instrument') or df.groupby(level='instrument'). For rolling calculations use df['$close'].unstack(level='instrument'), apply rolling, then .stack() to restore MultiIndex.
Your python code should contain the following part: the import part, the function part, and the main part. You should write a main function name: "calculate_{function_name}" and call this function in "if __name__ == __main__" part. Don't write any try-except block in your python code. The user will catch the exception message and provide the feedback to you.
User will write your python code into a python file and execute the file directly with "python {your_file_name}.py". You should calculate the factor values and save the result into a HDF5(H5) file named "result.h5" in the same directory as your python file. The result file is a HDF5(H5) file containing a pandas dataframe. The index of the dataframe is the "datetime" and "instrument", and the single column name is the factor name,and the value is the factor value. The result file should be saved in the same directory as your python file.
qlib_factor_strategy: |-
Ensure that for every step of data processing, the data format (including indexes) is clearly explained through comments.
Each transformation or calculation should be accompanied by a detailed description of how the data is structured, especially focusing on key aspects like whether the data has multi-level indexing, how to access specific columns or index levels, and any operations that affect the data shape (e.g., `reset_index()`, `groupby()`, `merge()`).
This step-by-step explanation will ensure clarity and accuracy in data handling. For example:
1. **Start with multi-level index**:
```python
# The initial DataFrame has a multi-level index with 'datetime' and 'instrument'.
# To access the 'datetime' index, use df.index.get_level_values('datetime').
datetime_values = df.index.get_level_values('datetime')
```
2. **Reset the index if necessary**:
```python
# Resetting the index to move 'datetime' and 'instrument' from the index to columns.
# This operation flattens the multi-index structure.
df = df.reset_index()
```
3. **Perform groupby operations**:
```python
# Grouping by 'datetime' and 'instrument' to aggregate the data.
# After groupby, the result will maintain 'datetime' and 'instrument' as a multi-level index.
df_grouped = df.groupby(['datetime', 'instrument']).sum()
```
4. **Ensure consistent datetime formats**:
```python
# Before merging, ensure that the 'datetime' column in both DataFrames is of the same format.
# Convert to datetime format if necessary.
df['datetime'] = pd.to_datetime(df['datetime'])
other_df['datetime'] = pd.to_datetime(other_df['datetime'])
```
5. **Merge operations**:
```python
# When merging DataFrames, ensure you are merging on both 'datetime' and 'instrument'.
# If these are part of the index, reset the index before merging.
merged_df = pd.merge(df, other_df, on=['datetime', 'instrument'], how='inner')
```
qlib_factor_output_format: |-
Your output should be a pandas dataframe similar to the following example information:
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 2261923 entries, (Timestamp('2020-01-01 17:00:00'), 'EURUSD') to (Timestamp('2026-03-20 15:58:00'), 'EURUSD')
Data columns (total 1 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 your factor name 2261923 non-null float64
dtypes: float64(1)
memory usage: <ignore>
Notice: The non-null count is OK to be different to the total number of entries since some instruments may not have the factor value on some days.
One possible format of `result.h5` may be like following:
datetime instrument
2020-01-01 EURUSD 1.094240
2020-01-02 EURUSD 1.094280
2020-01-03 EURUSD 1.095920
...
2026-03-20 EURUSD 1.083150
qlib_factor_simulator: |-
The factors will be sent into Qlib to train a model to predict the next several days return based on the factor values of the previous days.
Qlib is an AI-oriented quantitative investment platform that aims to realize the potential, empower research, and create value using AI technologies in quantitative investment, from exploring ideas to implementing productions. Qlib supports diverse machine learning modeling paradigms. including supervised learning, market dynamics modeling, and RL.
User will use Qlib to automatically do the following things:
1. generate a new factor table based on the factor values.
2. train a model like LightGBM, CatBoost, LSTM or simple PyTorch model to predict the next several days return based on the factor values.
3. build a portfolio based on the predicted return based on a strategy.
4. evaluate the portfolio's performance including the return, sharpe ratio, max drawdown, and so on.
qlib_factor_rich_style_description : |-
### R&D Agent-Qlib: Automated Quantitative Trading & Iterative Factors Evolution Demo
#### [Overview](#_summary)
The demo showcases the iterative process of hypothesis generation, knowledge construction, and decision-making. It highlights how financial factors evolve through continuous feedback and refinement.
#### [Automated R&D](#_rdloops)
- **[R (Research)](#_research)**
- Iterative development of ideas and hypotheses.
- Continuous learning and knowledge construction.
- **[D (Development)](#_development)**
- Progressive implementation and code generation of factors.
- Automated testing and validation of financial factors.
#### [Objective](#_summary)
To demonstrate the dynamic evolution of financial factors through the Qlib platform, emphasizing how each iteration enhances the accuracy and reliability of the resulting financial factors.
qlib_factor_from_report_rich_style_description : |-
### R&D Agent-Qlib: Automated Quantitative Trading & Factor Extraction from Financial Reports Demo
#### [Overview](#_summary)
This demo showcases the process of extracting factors from financial research reports, implementing these factors, and analyzing their performance through Qlib backtest, continually expanding and refining the factor library.
#### [Automated R&D](#_rdloops)
- **[R (Research)](#_research)**
- Iterative development of ideas and hypotheses from financial reports.
- Continuous learning and knowledge construction.
- **[D (Development)](#_development)**
- Progressive factor extraction and code generation.
- Automated implementation and testing of financial factors.
#### [Objective](#_summary)
<table border="1" style="width:100%; border-collapse: collapse;">
<tr>
<td>💡 <strong>Innovation </strong></td>
<td>Tool to quickly extract and test factors from research reports.</td>
</tr>
<tr>
<td>⚡ <strong>Efficiency </strong></td>
<td>Rapid identification of valuable factors from numerous reports.</td>
</tr>
<tr>
<td>🗃️ <strong>Outputs </strong></td>
<td>Expand and refine the factor library to support further research.</td>
</tr>
</table>
qlib_factor_experiment_setting: |-
| Dataset 📊 | Model 🤖 | Factors 🌟 | Data Split 🧮 |
|---------|----------|---------------|-------------------------------------------------|
| EURUSD | LGBModel | Alpha158 Plus | Train: 2022-01-01 to 2024-06-30 <br> Valid: 2024-07-01 to 2024-12-31 <br> Test &nbsp;: 2025-01-01 to 2026-03-20 |
qlib_model_background: |-
The model is a machine learning or deep learning structure used in quantitative investment to predict the returns and risks of a portfolio or a single asset. Models are employed by investors to generate forecasts based on historical data and identified factors, which are central to many quantitative investment strategies.
Each model takes the factors as input and predicts the future returns. Usually, the bigger the model is, the better the performance would be.
The model is defined in the following parts:
1. Name: The name of the model.
2. Description: The description of the model.
3. Architecture: The detailed architecture of the model, such as neural network layers or tree structures.
4. Hyperparameters: The hyperparameters used in the model.
5. Training_hyperparameters: The hyperparameters used during the training process.
6. ModelType: The type of the model, "Tabular" for tabular model and "TimeSeries" for time series model.
The model should provide clear and detailed documentation of its architecture and hyperparameters. One model should statically define one output with a fixed architecture and hyperparameters.
{% if runtime_environment is not none %}
====== Runtime Environment ======
You have following environment to run the code:
{{ runtime_environment }}
{% endif %}
qlib_model_interface: |-
Your python code should follow the interface to better interact with the user's system.
You code should contain several parts:
1. The import part: import the necessary libraries.
2. A class which is a sub-class of pytorch.nn.Module. This class should should have a init function and a forward function which inputs a tensor and outputs a tensor.
3. Set a variable called "model_cls" to the class you defined.
The user will save your code into a python file called "model.py". Then the user imports model_cls in file "model.py" after setting the cwd into the directory:
```python
from model import model_cls
```
So your python code should follow the pattern:
```python
class XXXModel(torch.nn.Module):
...
model_cls = XXXModel
```
The model can be configured as either "Tabular" for tabular models or "TimeSeries" for time series models. For a tabular model, the input shape is (batch_size, num_features), while for a time series model, the input shape is (batch_size, num_timesteps, num_features). In both cases, the output shape of the model should be (batch_size, 1).
`num_features` will be directly set for the model based on the input data shape.
User will initialize the tabular model with the following code:
```python
model = model_cls(num_features=num_features)
```
User will initialize the time series model with the following code:
```python
model = model_cls(num_features=num_features, num_timesteps=num_timesteps)
```
No other parameters will be passed to the model so give other parameters a default value or just make them static.
Don't write any try-except block in your python code. The user will catch the exception message and provide the feedback to you. Also, don't write main function in your python code. The user will call the forward method in the model_cls to get the output tensor.
Please notice that your model should only use current features as input. The user will provide the input tensor to the model's forward function.
qlib_model_output_format: |-
Your output should be a tensor with shape (batch_size, 1).
The output tensor should be saved in a file named "output.pth" in the same directory as your python file.
The user will evaluate the shape of the output tensor so the tensor read from "output.pth" should be 8 numbers.
qlib_model_simulator: |-
The models will be sent into Qlib to train and evaluate their performance in predicting future returns. Hypothesis is improved upon checking the feedback on the results.
Qlib is an AI-oriented quantitative investment platform that aims to realize the potential, empower research, and create value using AI technologies in quantitative investment, from exploring ideas to implementing productions. Qlib supports diverse machine learning modeling paradigms, including supervised learning, market dynamics modeling, and reinforcement learning (RL).
User will use Qlib to automatically perform the following tasks:
1. Generate a baseline factor table.
2. Train the model defined in your class Net to predict the next several days' returns based on the factor values.
3. Build a portfolio based on the predicted returns using a specific strategy.
4. Evaluate the portfolio's performance, including metrics such as return, IC, max drawdown, and others.
5. Iterate on growing the hypothesis to enable model improvements based on performance evaluations and feedback.
qlib_model_rich_style_description: |-
### Qlib Model Evolving Automatic R&D Demo
#### [Overview](#_summary)
The demo showcases the iterative process of hypothesis generation, knowledge construction, and decision-making in model construction in quantitative finance. It highlights how models evolve through continuous feedback and refinement.
#### [Automated R&D](#_rdloops)
- **[R (Research)](#_research)**
- Iteration of ideas and hypotheses.
- Continuous learning and knowledge construction.
- **[D (Development)](#_development)**
- Evolving code generation and model refinement.
- Automated implementation and testing of models.
#### [Objective](#_summary)
To demonstrate the dynamic evolution of models through the Qlib platform, emphasizing how each iteration enhances the accuracy and reliability of the resulting models.
qlib_model_experiment_setting: |-
| Dataset 📊 | Model 🤖 | Factors 🌟 | Data Split 🧮 |
|---------|----------|---------------|-------------------------------------------------|
| EURUSD | RDAgent-dev | 20 factors (Alpha158) | Train: 2022-01-01 to 2024-06-30 <br> Valid: 2024-07-01 to 2024-12-31 <br> Test &nbsp;: 2025-01-01 to 2026-03-20 |
+23
View File
@@ -0,0 +1,23 @@
hypothesis_generation:
system: |-
You are an expert in FX and quantitative trading, specialized in EURUSD intraday strategies.
Your task is to generate a well-reasoned hypothesis for new alpha factors based on EURUSD 1min OHLCV data.
Key market knowledge:
- EURUSD trades 24h with three main sessions: Asian (00:00-08:00 UTC), London (08:00-16:00 UTC), NY (13:00-21:00 UTC)
- London-NY overlap (13:00-16:00 UTC) has highest volume and momentum
- Asian session shows mean reversion tendencies
- Spread costs approximately 1.5 bps per trade — avoid overtrading
- No overnight gap risk like stocks, but weekend gaps exist
- Volume spikes signal news events (NFP, ECB, Fed)
Please ensure your response is in JSON format as shown below:
{
"hypothesis": "A clear and concise hypothesis based on the provided information.",
"reason": "A detailed explanation supporting the generated hypothesis.",
}
user: |-
The following are the financial factors and their descriptions:
{{ factor_descriptions }}
The report content is as follows:
{{ report_content }}
+311
View File
@@ -0,0 +1,311 @@
hypothesis_and_feedback: |-
=========================================================
{% for experiment, feedback in trace.hist %}
# Trial {{ loop.index }}:
## Hypothesis
{{ experiment.hypothesis }}
## Specific task:
{% for task in experiment.sub_tasks %}
{% if task is not none and task.get_task_brief_information is defined %}
{{ task.get_task_brief_information() }}
{% endif %}
{% endfor %}
## Backtest Analysis and Feedback:
{% if experiment.result is not none %}
Backtest Result: {{ experiment.result.loc[["IC", "1day.excess_return_without_cost.annualized_return", "1day.excess_return_without_cost.max_drawdown"]] }}
{% endif %}
Observation: {{ feedback.observations }}
Hypothesis Evaluation: {{ feedback.hypothesis_evaluation }}
Decision (Whether the hypothesis was successful): {{ feedback.decision }}
=========================================================
{% endfor %}
last_hypothesis_and_feedback: |-
## Hypothesis
{{ experiment.hypothesis }}
## Specific task:
{% for task in experiment.sub_tasks %}
{% if task is not none and task.get_task_brief_information is defined %}
{{ task.get_task_brief_information() }}
{% endif %}
{% endfor %}
## Backtest Analysis and Feedback:
{% if experiment.result is not none %}
Backtest Result: {{ experiment.result.loc[["IC", "1day.excess_return_without_cost.annualized_return", "1day.excess_return_without_cost.max_drawdown"]] }}
{% endif %}
Training Log:
Here, you need to focus on analyzing whether there are any issues with the training. If any problems are identified, you must correct them in the next iteration and clearly describe how the changes will be made in the hypothesis.
{{ experiment.stdout }}
Observation: {{ feedback.observations }}
Evaluation: {{ feedback.hypothesis_evaluation }}
Decision (Whether this experiment is SOTA): {{ feedback.decision }}
New Hypothesis (Given in feedback stage, just for reference, and can be accepted or rejected in the next round): {{ feedback.new_hypothesis }}
Reasoning (Justification for the new hypothesis): {{ feedback.reason }}
sota_hypothesis_and_feedback: |-
## Hypothesis
{{ experiment.hypothesis }}
## Specific task:
{% for task in experiment.sub_tasks %}
{% if task is not none and task.get_task_brief_information is defined %}
{{ task.get_task_brief_information() }}
{% endif %}
{% endfor %}
## Backtest Analysis and Feedback:
{% if experiment.result is not none %}
Backtest Result: {{ experiment.result.loc[["IC", "1day.excess_return_without_cost.annualized_return", "1day.excess_return_without_cost.max_drawdown"]] }}
{% endif %}
Training Log: {{ experiment.stdout }}
Observation: {{ feedback.observations }}
Evaluation: {{ feedback.hypothesis_evaluation }}
Decision (Whether this experiment is SOTA): {{ feedback.decision }}
hypothesis_output_format: |-
The output should follow JSON format. The schema is as follows:
{
"hypothesis": "An exact, testable, and innovative statement derived from previous experimental trace analysis. Avoid overly general ideas and ensure precision. The hypothesis should clearly specify the exact approach and expected improvement in performance in two or three sentences.",
"reason": "Provide a clear, logical explanation for why this hypothesis was proposed, grounded in evidence (e.g., trace history, domain principles). Reason should be short with no more than two sentences.",
}
factor_hypothesis_output_format: |-
The output should follow JSON format. The schema is as follows:
{
"hypothesis": "The new hypothesis generated based on the information provided. Limit in two or three sentences.",
"reason": "The reason why you generate this hypothesis. It should be comprehensive and logical. It should cover the other keys below and extend them. Limit in two or three sentences.",
}
hypothesis_output_format_with_action: |-
The output should follow JSON format. The schema is as follows:
{
"action": "If `hypothesis_specification` provides the action you need to take, please follow "hypothesis_specification" to choose the action. Otherwise, based on previous experimental results, suggest the action you believe is most appropriate at the moment. It should be one of [`factor`, `model`].",
"hypothesis": "The new hypothesis generated based on the information provided,should be a string.",
"reason": "The reason why you generate this hypothesis. It should be comprehensive and logical. It should cover the other keys below and extend them. Limit in two or three sentences.",
}
model_hypothesis_specification: |-
1. First, observe and analyze the overall experimental progression in `hypothesis_and_feedback`. Analyze where the previous model designs were inadequate — whether it was due to parameter settings, architectural flaws, or a lack of novelty (proposing entirely new concepts is highly encouraged as long as they demonstrate effectiveness).
2. Second, `last_hypothesis_and_feedback` and `sota_hypothesis_and_feedback` are key references you should pay close attention to. You can choose to optimize based on either of them or generate new ideas to form hypotheses and experiments.
3. If there is no prior experiment or result available at the beginning, you can start by implementing a simple and small architecture.
4. If a series of attempts fail to achieve SOTA, consider exploring entirely new directions; at this point, it is acceptable to return to simple architectures.
5. Focus exclusively on the architecture of PyTorch models. Each hypothesis should specifically address architectural decisions, such as layer configurations, activation functions, regularization methods, and overall model structure. DO NOT do any feature-specific processing. Instead, you can propose innovative transformations on the input time-series data to enhance model training effectiveness.
6. Avoid including aspects unrelated to architecture, such as input features or optimization strategies.
7. Sometimes, when training performance is poor, adjusting hyperparameters can also be an effective strategy for improvement.
8. Use standard libraries for baseline models, but also explore custom architecture designs to investigate novel structures. After sufficient trials with traditional models, aim for innovation comparable to top-tier AI conferences (NeurIPS, ICLR, ICML, SIGKDD, etc.) in time series modeling.
factor_hypothesis_specification: |-
You are developing alpha factors for EURUSD intraday trading using 15-minute OHLCV bars.
**Market Context:**
- EURUSD trades 24h with three sessions: Asian (00:00-08:00 UTC), London (08:00-16:00 UTC), NY (13:00-21:00 UTC)
- London-NY overlap (13:00-16:00 UTC) has highest volume and trending behavior
- Asian session shows mean reversion tendencies
- Spread cost ~1.5 bps per trade — avoid high-turnover factors
- No $factor column exists — use only $open, $close, $high, $low, $volume
- Each "instrument" is EURUSD, each "day" is a 1min bar
**Factor Generation Rules:**
1. **3-5 Factors per Generation** — cover different signal types per round
2. **FX-Specific Signals First:**
- Momentum: price change over last N bars (N=4,8,16,32 = 1h,2h,4h,8h)
- Mean Reversion: deviation from rolling mean, Bollinger Band position
- Volatility: ATR, realized vol, high-low range normalized
- Volume: volume spike ratio, volume trend
- Session: time-of-day encoded signals (London open, NY open)
3. **Gradual Complexity:**
- Rounds 1-5: single indicators (RSI, momentum, ATR)
- Rounds 6-15: combined signals (momentum + volume filter)
- Rounds 15+: ML-based factors (LSTM embeddings, XGBoost residuals)
4. **Avoid:**
- Factors requiring $factor column
- Daily-frequency assumptions (no overnight gaps in logic)
- Factors with >100 bar lookback without justification
5. No matter how many factors you plan to generate, only reply with one set of hypothesis and reason.
factor_experiment_output_format: |-
The output should follow JSON format. The schema is as follows:
{
"factor name 1": {
"description": "description of factor 1, start with its type, e.g. [Momentum Factor]",
"formulation": "latex formulation of factor 1",
"variables": {
"variable or function name 1": "description of variable or function 1",
"variable or function name 2": "description of variable or function 2"
}
},
"factor name 2": {
"description": "description of factor 2, start with its type, e.g. [Machine Learning based Factor]",
"formulation": "latex formulation of factor 2",
"variables": {
"variable or function name 1": "description of variable or function 1",
"variable or function name 2": "description of variable or function 2"
}
}
# Don't add ellipsis (...) or any filler text that might cause JSON parsing errors here!
}
model_experiment_output_format: |-
So far please only design one model to test the hypothesis!
The output should follow JSON format. The schema is as follows (value in training_hyperparameters is a basic setting for reference, you CAN CHANGE depends on the previous training log):
{
"model_name (The name of the model)": {
"description": "A detailed description of the model",
"formulation": "A LaTeX formula representing the model's formulation",
"architecture": "A detailed description of the model's architecture, e.g., neural network layers or tree structures",
"variables": {
"\\hat{y}_u": "The predicted output for node u",
"variable_name_2": "Description of variable 2",
"variable_name_3": "Description of variable 3"
},
"hyperparameters": {
"hyperparameter_name_1": "value of hyperparameter 1",
"hyperparameter_name_2": "value of hyperparameter 2",
"hyperparameter_name_3": "value of hyperparameter 3"
},
"training_hyperparameters" { # All values are for reference; you can set them yourself
"n_epochs": "100",
"lr": "1e-3",
"early_stop": 10,
"batch_size": 256,
"weight_decay": 1e-4,
}
"model_type": "Tabular or TimeSeries" # Should be one of "Tabular" or "TimeSeries"
},
}
factor_feedback_generation:
system: |-
You are a professional FX quantitative analyst specializing in EURUSD intraday strategies.
The task is described in the following scenario:
{{ scenario }}
You will receive a hypothesis, multiple tasks with their factors, their results, and the SOTA result.
Your feedback should specify whether the current result supports or refutes the hypothesis, compare it with previous SOTA results, and suggest FX-specific improvements.
**FX-specific evaluation criteria:**
- IC > 0.02 is meaningful for 1min EURUSD data
- Annualized return target: >9.62% (current SOTA to beat)
- Spread cost ~1.5 bps per trade — penalize high-turnover factors
- Factors using $factor column are INVALID — only $open $close $high $low $volume allowed
- Session-aware factors (London/NY) tend to outperform session-agnostic ones
- Mean reversion works in Asian session, momentum in London-NY overlap
Please understand the following operation logic:
1. Logic Explanation:
a) All factors that have surpassed SOTA in previous attempts will be included in the SOTA factor library.
b) New experiments will generate new factors, combined with the SOTA library factors.
c) These combined factors will be backtested and compared against current SOTA.
2. Development Directions:
a) New Direction: Propose a new FX-specific factor (session filter, volatility regime, volume spike).
b) Optimization: Refine lookback windows (4/8/16/32 bars), add ADX filter, adjust for spread costs.
3. Final Goal: Beat 9.62% ARR on EURUSD 1min with controlled drawdown (<20%).
When judging results:
1. Any small improvement in annualized return → set Replace Best Result as yes.
2. If IC < 0 consistently → factor has no predictive power, change direction entirely.
3. High turnover with low return → add volume or volatility filter to reduce trade frequency.
Respond in JSON format:
{
"Observations": "Your overall observations here",
"Feedback for Hypothesis": "Observations related to the hypothesis",
"New Hypothesis": "Your new FX-specific hypothesis here",
"Reasoning": "Reasoning for the new hypothesis",
"Replace Best Result": "yes or no"
}
user: |-
Target hypothesis:
{{ hypothesis_text }}
Tasks and Factors:
{% for task in task_details %}
- {{ task.factor_name }}: {{ task.factor_description }}
- Factor Formulation: {{ task.factor_formulation }}
- Variables: {{ task.variables }}
- Factor Implementation: {{ task.factor_implementation }}
{% if task.factor_implementation == "False" %}
**Note: This factor was not implemented in the current experiment. Only the hypothesis for implemented factors can be verified.**
{% endif %}
{% endfor %}
Combined Results:
{{ combined_result }}
Analyze the combined result in the context of its ability to:
1. Support or refute the hypothesis.
2. Show improvement or deterioration compared to the SOTA experiment.
Note: Only factors with 'Factor Implementation' as True are implemented and tested in this experiment. If 'Factor Implementation' is False, the hypothesis for that factor cannot be verified in this run.
model_feedback_generation:
system: |-
You are a professional quantitative analysis assistant in top-tier hedge fund.
The task is described in the following scenario:
{{ scenario }}
You will receive a quantitative model hypothesis, its specific task description, and it market backtest result.
Your feedback should specify whether the current result supports or refutes the hypothesis, compare it with previous SOTA results, examine the model's training logs to analyze whether there are issues with hyperparameter settings, and suggest improvements or new directions.
Please provide detailed and constructive feedback.
Example JSON Structure for Result Analysis:
{
"Observations": "First analyze the model's training logs to determine whether there are any issues with its parameter settings. Then clearly summarize the current results and the SOTA results with exact scores and any notable patterns. Limit your summary to no more than three concise, data-focused sentences.",
"Feedback for Hypothesis": "Explicitly confirm or refute the hypothesis based on specific data points or performance trends. Limit to two sentences.",
"New Hypothesis": "Propose a revised hypothesis, considering observed patterns and limitations in the current one. Limit to no more than two sentences.",
"Reasoning": "Explain the rationale for the new hypothesis using specific trends or performance shifts. Be concise but technically complete. Limit to two sentences.",
"Decision": <true or false>,
}
user: |-
{% if sota_hypothesis %}
# SOTA Round Information:
Hypothesis: {{ sota_hypothesis.hypothesis }}
Specific Task: {{ sota_task }}
Code Implementation: {{ sota_code }}
Result: {{ sota_result }}
{% else %}
# This is the first round. No previous information available. As long as the performance is not too negative (eg.ICIR is greater than 0), treat it as successful. Do not set the threshold too high.
{% endif %}
# Current Round Information:
Hypothesis: {{ hypothesis.hypothesis }}
Why propose this hypothesis: {{ hypothesis.reason }}
Specific Task: {{ exp.sub_tasks[0].get_task_information() }}
Code Implementation: {{ exp.sub_workspace_list[0].file_dict.get("model.py") }}
Training Log: {{ exp.stdout }}
Result: {{ exp_result }}
# When judging the results:
1. **Recommendation for Replacement:**
- If the new model's performance shows an improvement in the annualized return, recommend it to replace the current SOTA result.
- Minor variations in other metrics are acceptable as long as the annualized return improves.
2. Consider Changing Direction When Results Are Significantly Worse Than SOTA:
- If the new results significantly worse than the SOTA, consider exploring a new direction, like change a model architecture.
action_gen:
system: |-
Quantitative investment is a data-driven approach to asset management that relies on mathematical models, statistical techniques, and computational methods to analyze financial markets and make investment decisions. Two essential components of this approach are factors and models.
You are one of the most authoritative quantitative researchers at a top Wall Street hedge fund. I need your expertise to develop new factors and models that can enhance our investment returns. Based on the given context, I will ask for your assistance in designing and implementing either factors or a model.
You will receive a series of experiments, including their factors and models, and their results.
Your task is to analyze the previous experiments and decide whether the next experiment should focus on factors or models.
Example JSON Structure for your return:
{
"action": "factor" or "model", # You must choose one of the two
}
user: |-
{% if hypothesis_and_feedback|length == 0 %}
It is the first round of hypothesis generation. The user has no hypothesis on this scenario yet.
{% else %}
The former hypothesis and the corresponding feedbacks are as follows:
{{ hypothesis_and_feedback }}
{% endif %}
{% if last_hypothesis_and_feedback != "" %}
Here is the last trial's hypothesis and the corresponding feedback. The main feedback includes a new hypothesis for your reference only. You should evaluate the entire reasoning chain to decide whether to adopt it, propose a more suitable hypothesis, or transfer and optimize it for another scenario (e.g., factor/model), since transfers are generally encouraged:
{{ last_hypothesis_and_feedback }}
{% endif %}
+21 -8
View File
@@ -7,7 +7,7 @@ requires = [
[project]
authors = [
{email = "xuyang1@microsoft.com", name = "MSRA-MIIC"},
{email = "nico@predix.io", name = "Predix Team"},
]
classifiers = [
"Development Status :: 3 - Alpha",
@@ -16,18 +16,20 @@ classifiers = [
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
]
description = "Research & Development Agent"
description = "Predix - AI-gestützter Quantitative Trading Agent für EUR/USD"
dynamic = [
"dependencies",
"optional-dependencies",
"version",
]
keywords = [
"Quantitative Trading",
"Autonomous Agents",
"Large Language Models",
"Research and Development",
"EUR/USD",
"Forex",
]
name = "rdagent"
name = "predix"
readme = "README.md"
requires-python = ">=3.10"
@@ -35,8 +37,8 @@ requires-python = ">=3.10"
rdagent = "rdagent.app.cli:app"
[project.urls]
homepage = "https://github.com/microsoft/RD-Agent/"
issue = "https://github.com/microsoft/RD-Agent/issues"
homepage = "https://github.com/PredixAI/predix/"
issue = "https://github.com/PredixAI/predix/issues"
[tool.coverage.report]
fail_under = 80
@@ -61,13 +63,23 @@ explicit_package_bases = true
warn_return_any = true
warn_unused_ignores = true
[[tool.mypy.overrides]]
ignore_missing_imports = true
module = "llama"
[tool.pytest.ini_options]
addopts = "-l -s --durations=0"
log_cli = true
log_cli_level = "info"
log_date_format = "%Y-%m-%d %H:%M:%S"
log_format = "%(asctime)s %(levelname)s %(message)s"
markers = [
"offline: tests that do not require external API calls",
]
minversion = "6.0"
norecursedirs = [
"workspace",
]
[tool.ruff]
fix = true
@@ -77,10 +89,10 @@ src = ["rdagent"]
[tool.ruff.lint]
ignore = [
# https://docs.astral.sh/ruff/rules/#pydocstyle-d
"ANN101",
"ANN401",
"D",
"ERA001",
"EXE002",
"FIX",
"INP001",
"PGH",
@@ -88,7 +100,7 @@ ignore = [
"S101",
"S301",
"T20",
"TCH003",
"TC003",
"TD",
]
select = ["ALL"]
@@ -108,6 +120,7 @@ docs = {file = ["requirements/docs.txt"]}
lint = {file = ["requirements/lint.txt"]}
package = {file = ["requirements/package.txt"]}
test = {file = ["requirements/test.txt"]}
torch = {file = ["requirements/torch.txt"]} # some agent algorithms need torch. pip install rdagent[torch]
[tool.setuptools_scm]
local_scheme = "no-local-version"
+39 -24
View File
@@ -13,9 +13,10 @@ from rdagent.components.benchmark.eval_method import FactorImplementEval
class BenchmarkAnalyzer:
def __init__(self, settings):
def __init__(self, settings, only_correct_format=False):
self.settings = settings
self.index_map = self.load_index_map()
self.only_correct_format = only_correct_format
def load_index_map(self):
index_map = {}
@@ -82,12 +83,12 @@ class BenchmarkAnalyzer:
for i in x:
order_v.append(
{
"avg. Run successful rate": 0,
"avg. Format successful rate": 1,
"avg. Correlation (value only)": 2,
"max. Correlation": 3,
"max. accuracy": 4,
"avg. accuracy": 5,
"Avg Run SR": 0,
"Avg Format SR": 1,
"Avg Correlation": 2,
"Max Correlation": 3,
"Max Accuracy": 4,
"Avg Accuracy": 5,
}.get(i, i),
)
return order_v
@@ -119,11 +120,13 @@ class BenchmarkAnalyzer:
format_succ_rate_f = self.reformat_index(format_succ_rate)
corr = sum_df_clean["FactorCorrelationEvaluator"].fillna(0.0)
corr = corr.unstack().T.mean(axis=0).to_frame("corr(only success)")
corr_res = self.reformat_index(corr)
corr_max = sum_df_clean["FactorCorrelationEvaluator"]
if self.only_correct_format:
corr = corr.loc[format_issue == 1.0]
corr_max = corr_max.unstack().T.max(axis=0).to_frame("corr(only success)")
corr_res = corr.unstack().T.mean(axis=0).to_frame("corr(only success)")
corr_res = self.reformat_index(corr_res)
corr_max = corr.unstack().T.max(axis=0).to_frame("corr(only success)")
corr_max_res = self.reformat_index(corr_max)
value_max = sum_df_clean["FactorEqualValueRatioEvaluator"]
@@ -140,19 +143,25 @@ class BenchmarkAnalyzer:
result_all = pd.concat(
{
"avg. Correlation (value only)": corr_res.iloc[:, 0],
"avg. Format successful rate": format_succ_rate_f.iloc[:, 0],
"avg. Run successful rate": succ_rate_f.iloc[:, 0],
"max. Correlation": corr_max_res.iloc[:, 0],
"max. accuracy": value_max_res.iloc[:, 0],
"avg. accuracy": value_avg_res.iloc[:, 0],
"Avg Correlation": corr_res.iloc[:, 0],
"Avg Format SR": format_succ_rate_f.iloc[:, 0],
"Avg Run SR": succ_rate_f.iloc[:, 0],
"Max Correlation": corr_max_res.iloc[:, 0],
"Max Accuracy": value_max_res.iloc[:, 0],
"Avg Accuracy": value_avg_res.iloc[:, 0],
},
axis=1,
)
df = result_all.sort_index(axis=1, key=self.result_all_key_order)
df = result_all.sort_index(axis=1, key=self.result_all_key_order).sort_index(axis=0)
print(df)
print()
print(df.groupby("Category").mean())
print()
print(df.mean())
# Calculate the mean of each column
mean_values = df.fillna(0.0).mean()
mean_df = pd.DataFrame(mean_values).T
@@ -179,11 +188,16 @@ class Plotter:
@staticmethod
def plot_data(data, file_name, title):
plt.figure(figsize=(10, 6))
sns.barplot(x="index", y="b", hue="a", data=data)
plt.xlabel("Method")
plt.figure(figsize=(10, 10))
plt.ylabel("Value")
plt.title(title)
colors = ["#3274A1", "#E1812C", "#3A923A", "#C03D3E"]
plt.bar(data["a"], data["b"], color=colors, capsize=5)
for idx, row in data.iterrows():
plt.text(idx, row["b"] + 0.01, f"{row['b']:.2f}", ha="center", va="bottom")
plt.suptitle(title, y=0.98)
plt.xticks(rotation=45)
plt.ylim(0, 1)
plt.tight_layout()
plt.savefig(file_name)
@@ -191,9 +205,10 @@ def main(
path="git_ignore_folder/eval_results/res_promptV220240724-060037.pkl",
round=1,
title="Comparison of Different Methods",
only_correct_format=False,
):
settings = BenchmarkSettings()
benchmark = BenchmarkAnalyzer(settings)
benchmark = BenchmarkAnalyzer(settings, only_correct_format=only_correct_format)
results = {
f"{round} round experiment": path,
}
@@ -201,7 +216,7 @@ def main(
final_results_df = pd.DataFrame(final_results)
Plotter.change_fs(20)
plot_data = final_results_df.drop(["max. accuracy", "avg. accuracy"], axis=0).T
plot_data = final_results_df.drop(["Max Accuracy", "Avg Accuracy"], axis=0).T
plot_data = plot_data.reset_index().melt("index", var_name="a", value_name="b")
Plotter.plot_data(plot_data, "./comparison_plot.png", title)
+2 -9
View File
@@ -1,16 +1,9 @@
import os
import pickle
import time
from pathlib import Path
from pprint import pprint
from rdagent.app.qlib_rd_loop.conf import FACTOR_PROP_SETTING
from rdagent.components.benchmark.conf import BenchmarkSettings
from rdagent.components.benchmark.eval_method import FactorImplementEval
from rdagent.core.scenario import Scenario
from rdagent.core.utils import import_class
from rdagent.log import rdagent_logger as logger
from rdagent.scenarios.qlib.experiment.factor_experiment import QlibFactorScenario
from rdagent.scenarios.qlib.factor_experiment_loader.json_loader import (
FactorTestCaseLoaderFromJsonFile,
)
@@ -25,7 +18,7 @@ if __name__ == "__main__":
# 3.declare the method to be tested and pass the arguments.
scen: Scenario = import_class(FACTOR_PROP_SETTING.scen)()
generate_method = import_class(bs.bench_method_cls)(scen=scen)
generate_method = import_class(bs.bench_method_cls)(scen=scen, **bs.bench_method_extra_kwargs)
# 4.declare the eval method and pass the arguments.
eval_method = FactorImplementEval(
method=generate_method,
@@ -36,7 +29,7 @@ if __name__ == "__main__":
)
# 5.run the eval
res = eval_method.eval()
res = eval_method.eval(eval_method.develop())
# 6.save the result
logger.log_object(res)
+2 -2
View File
@@ -1,6 +1,6 @@
from pathlib import Path
from rdagent.components.coder.model_coder.CoSTEER import ModelCoSTEER
from rdagent.components.coder.model_coder import ModelCoSTEER
from rdagent.components.loader.task_loader import ModelTaskLoaderJson, ModelWsLoader
from rdagent.scenarios.qlib.experiment.model_experiment import (
QlibModelExperiment,
@@ -13,7 +13,7 @@ if __name__ == "__main__":
from rdagent.components.coder.model_coder.benchmark.eval import ModelImpValEval
from rdagent.components.coder.model_coder.one_shot import ModelCodeWriter
bench_folder = DIRNAME.parent.parent / "components" / "coder" / "model_coder" / "benchmark"
bench_folder = DIRNAME.parent.parent.parent / "components" / "coder" / "model_coder" / "benchmark"
mtl = ModelTaskLoaderJson(str(bench_folder / "model_dict.json"))
task_l = mtl.load()
+163 -17
View File
@@ -1,10 +1,13 @@
"""
CLI entrance for all rdagent application.
This will
This will
- make rdagent a nice entry and
- autoamtically load dotenv
"""
import sys
from dotenv import load_dotenv
load_dotenv(".env")
@@ -13,24 +16,41 @@ load_dotenv(".env")
import subprocess
from importlib.resources import path as rpath
from typing import Optional
import fire
import typer
from typing_extensions import Annotated
from rdagent.app.data_mining.model import main as med_model
from rdagent.app.data_science.loop import main as data_science
from rdagent.app.finetune.llm.loop import main as llm_finetune
from rdagent.app.general_model.general_model import (
extract_models_and_implement as general_model,
)
from rdagent.app.kaggle.loop import main as kaggle_main
from rdagent.app.qlib_rd_loop.factor import main as fin_factor
from rdagent.app.qlib_rd_loop.factor_from_report import main as fin_factor_report
from rdagent.app.qlib_rd_loop.model import main as fin_model
from rdagent.app.qlib_rd_loop.quant import main as fin_quant
from rdagent.app.utils.health_check import health_check
from rdagent.app.utils.info import collect_info
from rdagent.log.mle_summary import grade_summary as grade_summary
app = typer.Typer()
CheckoutOption = Annotated[bool, typer.Option("--checkout/--no-checkout", "-c/-C")]
CheckEnvOption = Annotated[bool, typer.Option("--check-env/--no-check-env", "-e/-E")]
CheckDockerOption = Annotated[bool, typer.Option("--check-docker/--no-check-docker", "-d/-D")]
CheckPortsOption = Annotated[bool, typer.Option("--check-ports/--no-check-ports", "-p/-P")]
def ui(port=80, log_dir="", debug=False):
def ui(port=19899, log_dir="", debug: bool = False, data_science: bool = False):
"""
start web app to show the log traces.
"""
if data_science:
with rpath("rdagent.log.ui", "dsapp.py") as app_path:
cmds = ["streamlit", "run", app_path, f"--server.port={port}"]
subprocess.run(cmds)
return
with rpath("rdagent.log.ui", "app.py") as app_path:
cmds = ["streamlit", "run", app_path, f"--server.port={port}"]
if log_dir or debug:
@@ -42,16 +62,142 @@ def ui(port=80, log_dir="", debug=False):
subprocess.run(cmds)
def app():
fire.Fire(
{
"fin_factor": fin_factor,
"fin_factor_report": fin_factor_report,
"fin_model": fin_model,
"med_model": med_model,
"general_model": general_model,
"ui": ui,
"collect_info": collect_info,
"kaggle": kaggle_main,
}
def server_ui(port=19899):
"""
start the Flask log server in real time
"""
from rdagent.log.server.app import main as log_server_main
log_server_main(port=port)
def ds_user_interact(port=19900):
"""
start web app to show the log traces in real time
"""
commands = ["streamlit", "run", "rdagent/log/ui/ds_user_interact.py", f"--server.port={port}"]
subprocess.run(commands)
@app.command(name="fin_factor")
def fin_factor_cli(
path: Optional[str] = None,
step_n: Optional[int] = None,
loop_n: Optional[int] = None,
all_duration: Optional[str] = None,
checkout: CheckoutOption = True,
):
fin_factor(path=path, step_n=step_n, loop_n=loop_n, all_duration=all_duration, checkout=checkout)
@app.command(name="fin_model")
def fin_model_cli(
path: Optional[str] = None,
step_n: Optional[int] = None,
loop_n: Optional[int] = None,
all_duration: Optional[str] = None,
checkout: CheckoutOption = True,
):
fin_model(path=path, step_n=step_n, loop_n=loop_n, all_duration=all_duration, checkout=checkout)
@app.command(name="fin_quant")
def fin_quant_cli(
path: Optional[str] = None,
step_n: Optional[int] = None,
loop_n: Optional[int] = None,
all_duration: Optional[str] = None,
checkout: CheckoutOption = True,
):
fin_quant(path=path, step_n=step_n, loop_n=loop_n, all_duration=all_duration, checkout=checkout)
@app.command(name="fin_factor_report")
def fin_factor_report_cli(
report_folder: Optional[str] = None,
path: Optional[str] = None,
all_duration: Optional[str] = None,
checkout: CheckoutOption = True,
):
fin_factor_report(report_folder=report_folder, path=path, all_duration=all_duration, checkout=checkout)
@app.command(name="general_model")
def general_model_cli(report_file_path: str):
general_model(report_file_path)
@app.command(name="data_science")
def data_science_cli(
path: Optional[str] = None,
checkout: CheckoutOption = True,
step_n: Optional[int] = None,
loop_n: Optional[int] = None,
timeout: Optional[str] = None,
competition: Optional[str] = None,
):
data_science(
path=path,
checkout=checkout,
step_n=step_n,
loop_n=loop_n,
timeout=timeout,
competition=competition,
)
@app.command(name="llm_finetune")
def llm_finetune_cli(
path: Optional[str] = None,
checkout: CheckoutOption = True,
benchmark: Optional[str] = None,
benchmark_description: Optional[str] = None,
dataset: Optional[str] = None,
base_model: Optional[str] = None,
upper_data_size_limit: Optional[int] = None,
step_n: Optional[int] = None,
loop_n: Optional[int] = None,
timeout: Optional[str] = None,
):
llm_finetune(
path=path,
checkout=checkout,
benchmark=benchmark,
benchmark_description=benchmark_description,
dataset=dataset,
base_model=base_model,
upper_data_size_limit=upper_data_size_limit,
step_n=step_n,
loop_n=loop_n,
timeout=timeout,
)
@app.command(name="grade_summary")
def grade_summary_cli(log_folder: str):
grade_summary(log_folder)
app.command(name="ui")(ui)
app.command(name="server_ui")(server_ui)
@app.command(name="health_check")
def health_check_cli(
check_env: CheckEnvOption = True,
check_docker: CheckDockerOption = True,
check_ports: CheckPortsOption = True,
):
health_check(check_env=check_env, check_docker=check_docker, check_ports=check_ports)
@app.command(name="collect_info")
def collect_info_cli():
collect_info()
app.command(name="ds_user_interact")(ds_user_interact)
if __name__ == "__main__":
app()
-49
View File
@@ -1,49 +0,0 @@
from pathlib import Path
from pydantic_settings import BaseSettings
from rdagent.components.workflow.conf import BasePropSetting
class MedBasePropSetting(BasePropSetting):
class Config:
env_prefix = "DM_"
"""Use `DM_` as prefix for environment variables"""
protected_namespaces = ()
"""Add 'model_' to the protected namespaces"""
# 1) overriding the default
scen: str = "rdagent.scenarios.data_mining.experiment.model_experiment.DMModelScenario"
"""Scenario class for data mining model"""
hypothesis_gen: str = "rdagent.scenarios.data_mining.proposal.model_proposal.DMModelHypothesisGen"
"""Hypothesis generation class"""
hypothesis2experiment: str = "rdagent.scenarios.data_mining.proposal.model_proposal.DMModelHypothesis2Experiment"
"""Hypothesis to experiment class"""
coder: str = "rdagent.scenarios.data_mining.developer.model_coder.DMModelCoSTEER"
"""Coder class"""
runner: str = "rdagent.scenarios.data_mining.developer.model_runner.DMModelRunner"
"""Runner class"""
summarizer: str = "rdagent.scenarios.data_mining.developer.feedback.DMModelHypothesisExperiment2Feedback"
"""Summarizer class"""
evolving_n: int = 10
"""Number of evolutions"""
evolving_n: int = 10
# 2) Extra config for the scenario
# physionet account
# NOTE: You should apply the account in https://physionet.org/
username: str = ""
"""Physionet account username"""
password: str = ""
"""Physionet account password"""
MED_PROP_SETTING = MedBasePropSetting()
-31
View File
@@ -1,31 +0,0 @@
import fire
from rdagent.app.data_mining.conf import MED_PROP_SETTING
from rdagent.components.workflow.rd_loop import RDLoop
from rdagent.core.exception import ModelEmptyError
class ModelRDLoop(RDLoop):
skip_loop_error = (ModelEmptyError,)
def main(path=None, step_n=None):
"""
Auto R&D Evolving loop for models in a medical scenario.
You can continue running session by
.. code-block:: python
dotenv run -- python rdagent/app/data_mining/model.py $LOG_PATH/__session__/1/0_propose --step_n 1 # `step_n` is a optional paramter
"""
if path is None:
model_loop = ModelRDLoop(MED_PROP_SETTING)
else:
model_loop = ModelRDLoop.load(path)
model_loop.run(step_n=step_n)
if __name__ == "__main__":
fire.Fire(main)
+206
View File
@@ -0,0 +1,206 @@
from pathlib import Path
from typing import Literal
from pydantic_settings import SettingsConfigDict
from rdagent.app.kaggle.conf import KaggleBasePropSetting
class DataScienceBasePropSetting(KaggleBasePropSetting):
# TODO: Kaggle Setting should be the subclass of DataScience
model_config = SettingsConfigDict(env_prefix="DS_", protected_namespaces=())
# Main components
## Scen
scen: str = "rdagent.scenarios.data_science.scen.KaggleScen"
"""
Scenario class for data science tasks.
- For Kaggle competitions, use: "rdagent.scenarios.data_science.scen.KaggleScen"
- For custom data science scenarios, use: "rdagent.scenarios.data_science.scen.DataScienceScen"
"""
planner: str = "rdagent.scenarios.data_science.proposal.exp_gen.planner.DSExpPlannerHandCraft"
hypothesis_gen: str = "rdagent.scenarios.data_science.proposal.exp_gen.router.ParallelMultiTraceExpGen"
interactor: str = "rdagent.components.interactor.SkipInteractor"
trace_scheduler: str = "rdagent.scenarios.data_science.proposal.exp_gen.trace_scheduler.RoundRobinScheduler"
"""Hypothesis generation class"""
summarizer: str = "rdagent.scenarios.data_science.dev.feedback.DSExperiment2Feedback"
summarizer_init_kwargs: dict = {
"version": "exp_feedback",
}
## Workflow Related
consecutive_errors: int = 5
## Coding Related
coding_fail_reanalyze_threshold: int = 3
debug_recommend_timeout: int = 600
"""The recommend time limit for running on debugging data"""
debug_timeout: int = 600
"""The timeout limit for running on debugging data"""
full_recommend_timeout: int = 3600
"""The recommend time limit for running on full data"""
full_timeout: int = 3600
"""The timeout limit for running on full data"""
#### model dump
enable_model_dump: bool = False
enable_doc_dev: bool = False
model_dump_check_level: Literal["medium", "high"] = "medium"
#### MCP documentation search integration
enable_mcp_documentation_search: bool = False
"""Enable MCP documentation search for error resolution. Requires MCP_ENABLED=true and MCP_CONTEXT7_ENABLED=true in environment."""
### specific feature
### notebook integration
enable_notebook_conversion: bool = False
#### enable specification
spec_enabled: bool = True
#### proposal related
# proposal_version: str = "v2" deprecated
coder_on_whole_pipeline: bool = True
max_trace_hist: int = 3
coder_max_loop: int = 10
runner_max_loop: int = 3
sample_data_by_LLM: bool = True
use_raw_description: bool = False
show_nan_columns: bool = False
### knowledge base
enable_knowledge_base: bool = False
knowledge_base_version: str = "v1"
knowledge_base_path: str | None = None
idea_pool_json_path: str | None = None
### archive log folder after each loop
enable_log_archive: bool = True
log_archive_path: str | None = None
log_archive_temp_path: str | None = (
None # This is to store the mid tar file since writing the tar file is preferred in local storage then copy to target storage
)
#### Evaluation on Test related
eval_sub_dir: str = "eval" # TODO: fixme, this is not a good name
"""We'll use f"{DS_RD_SETTING.local_data_path}/{DS_RD_SETTING.eval_sub_dir}/{competition}"
to find the scriipt to evaluate the submission on test"""
"""---below are the settings for multi-trace---"""
### multi-trace related
max_trace_num: int = 1
"""The maximum number of traces to grow before merging"""
scheduler_temperature: float = 1.0
"""The temperature for the trace scheduler for softmax calculation, used in ProbabilisticScheduler"""
# PUCT exploration constant for MCTSScheduler (ignored by other schedulers)
scheduler_c_puct: float = 1.0
"""Exploration constant used by MCTSScheduler (PUCT)."""
enable_score_reward: bool = False
"""Enable using score-based reward for trace selection in multi-trace scheduling."""
#### multi-trace:checkpoint selector
selector_name: str = "rdagent.scenarios.data_science.proposal.exp_gen.select.expand.LatestCKPSelector"
"""The name of the selector to use"""
sota_count_window: int = 5
"""The number of trials to consider for SOTA count"""
sota_count_threshold: int = 1
"""The threshold for SOTA count"""
#### multi-trace: SOTA experiment selector
sota_exp_selector_name: str = "rdagent.scenarios.data_science.proposal.exp_gen.select.submit.GlobalSOTASelector"
"""The name of the SOTA experiment selector to use"""
### multi-trace:inject optimals for multi-trace
# inject diverse when start a new sub-trace
enable_inject_diverse: bool = False
# inject diverse from other traces when start a new sub-trace
enable_cross_trace_diversity: bool = True
"""Enable cross-trace diversity injection when starting a new sub-trace.
This is different from `enable_inject_diverse` which is for non-parallel cases."""
diversity_injection_strategy: str = (
"rdagent.scenarios.data_science.proposal.exp_gen.diversity_strategy.InjectUntilSOTAGainedStrategy"
)
"""The strategy to use for injecting diversity context."""
# enable different version of DSExpGen for multi-trace
enable_multi_version_exp_gen: bool = False
exp_gen_version_list: str = "v3,v2"
#### multi-trace: time for final multi-trace merge
merge_hours: float = 0
"""The time for merge"""
#### multi-trace: max SOTA-retrieved number, used in AutoSOTAexpSelector
# constrains the number of SOTA experiments to retrieve, otherwise too many SOTA experiments to retrieve will cause the exceed of the context window of LLM
max_sota_retrieved_num: int = 10
"""The maximum number of SOTA experiments to retrieve in a LLM call"""
#### enable draft before first sota experiment
enable_draft_before_first_sota: bool = False
enable_planner: bool = False
model_architecture_suggestion_time_percent: float = 0.75
allow_longer_timeout: bool = False
coder_enable_llm_decide_longer_timeout: bool = False
runner_enable_llm_decide_longer_timeout: bool = False
coder_longer_timeout_multiplier_upper: int = 3
runner_longer_timeout_multiplier_upper: int = 2
coder_timeout_increase_stage: float = 0.3
runner_timeout_increase_stage: float = 0.3
runner_timeout_increase_stage_patience: int = 2
"""Number of failures tolerated before escalating to next timeout level (stage width). Every 'patience' failures, timeout increases by 'runner_timeout_increase_stage'"""
show_hard_limit: bool = True
#### enable runner code change summary
runner_enable_code_change_summary: bool = True
### Proposal workflow related
#### Hypothesis Generate related
enable_simple_hypothesis: bool = False
"""If true, generate simple hypothesis, no more than 2 sentences each."""
enable_generate_unique_hypothesis: bool = False
"""Enable generate unique hypothesis. If True, generate unique hypothesis for each component. If False, generate unique hypothesis for each component."""
enable_research_rag: bool = False
"""Enable research RAG for hypothesis generation."""
#### hypothesis critique and rewrite
enable_hypo_critique_rewrite: bool = False
"""Enable hypothesis critique and rewrite stages for improving hypothesis quality"""
enable_scale_check: bool = False
##### select related
ratio_merge_or_ensemble: int = 70
"""The ratio of merge or ensemble to be considered as a valid solution"""
llm_select_hypothesis: bool = False
"""Whether to use LLM to select hypothesis. If True, use LLM selection; if False, use the existing ranking method."""
#### Task Generate related
fix_seed_and_data_split: bool = False
ensemble_time_upper_bound: bool = False
user_interaction_wait_seconds: int = 6000 # seconds to wait for user interaction
user_interaction_mid_folder: Path = Path.cwd() / "git_ignore_folder" / "RD-Agent_user_interaction"
DS_RD_SETTING = DataScienceBasePropSetting()
# enable_cross_trace_diversity and llm_select_hypothesis should not be true at the same time
assert not (
DS_RD_SETTING.enable_cross_trace_diversity and DS_RD_SETTING.llm_select_hypothesis
), "enable_cross_trace_diversity and llm_select_hypothesis cannot be true at the same time"
+6
View File
@@ -0,0 +1,6 @@
import fire
from rdagent.scenarios.data_science.debug.data import create_debug_data
if __name__ == "__main__":
fire.Fire(create_debug_data)
+83
View File
@@ -0,0 +1,83 @@
import asyncio
from pathlib import Path
from typing import Optional
import fire
from rdagent.app.data_science.conf import DS_RD_SETTING
from rdagent.core.utils import import_class
from rdagent.log import rdagent_logger as logger
from rdagent.scenarios.data_science.loop import DataScienceRDLoop
def main(
path: Optional[str] = None,
checkout: bool = True,
checkout_path: Optional[str] = None,
step_n: Optional[int] = None,
loop_n: Optional[int] = None,
timeout: Optional[str] = None,
competition="bms-molecular-translation",
replace_timer=True,
exp_gen_cls: Optional[str] = None,
):
"""
Parameters
----------
path :
A path like `$LOG_PATH/__session__/1/0_propose`. This indicates that we restore the state after finishing step 0 in loop 1.
checkout :
Used to control the log session path. Boolean type, default is True.
- If True, the new loop will use the existing folder and clear logs for sessions after the one corresponding to the given path.
- If False, the new loop will use the existing folder but keep the logs for sessions after the one corresponding to the given path.
checkout_path:
If a checkout_path (or a str like Path) is provided, the new loop will be saved to that path, leaving the original path unchanged.
step_n :
Number of steps to run; if None, the process will run indefinitely until an error or KeyboardInterrupt occurs.
loop_n :
Number of loops to run; if None, the process will run indefinitely until an error or KeyboardInterrupt occurs.
- If the current loop is incomplete, it will be counted as the first loop for completion.
- If both step_n and loop_n are provided, the process will stop as soon as either condition is met.
timeout :
Maximum duration to run the loop. Accepts a string format recognized by the internal timer.
- If None, the loop will run until completion, error, or KeyboardInterrupt.
competition :
Competition name.
replace_timer :
If a session is loaded, determines whether to replace the timer with session.timer.
exp_gen_cls :
When there are different stages, the exp_gen can be replaced with the new proposal.
Auto R&D Evolving loop for models in a Kaggle scenario.
You can continue running a session by using the command:
.. code-block:: bash
dotenv run -- python rdagent/app/data_science/loop.py [--competition titanic] $LOG_PATH/__session__/1/0_propose --step_n 1 # `step_n` is an optional parameter
rdagent kaggle --competition playground-series-s4e8 # This command is recommended.
"""
if not checkout_path is None:
checkout = Path(checkout_path)
if competition is not None:
DS_RD_SETTING.competition = competition
if not DS_RD_SETTING.competition:
logger.error("Please specify competition name.")
if path is None:
kaggle_loop = DataScienceRDLoop(DS_RD_SETTING)
else:
kaggle_loop: DataScienceRDLoop = DataScienceRDLoop.load(path, checkout=checkout, replace_timer=replace_timer)
# replace exp_gen if we have new class
if exp_gen_cls is not None:
kaggle_loop.exp_gen = import_class(exp_gen_cls)(kaggle_loop.exp_gen.scen)
asyncio.run(kaggle_loop.run(step_n=step_n, loop_n=loop_n, all_duration=timeout))
if __name__ == "__main__":
fire.Fire(main)
+40
View File
@@ -0,0 +1,40 @@
import os
from pydantic_settings import SettingsConfigDict
from rdagent.app.data_science.conf import DS_RD_SETTING
from rdagent.core.conf import RD_AGENT_SETTINGS, ExtendedBaseSettings
class DSFinetuneScen(ExtendedBaseSettings):
model_config = SettingsConfigDict(env_prefix="FT_", protected_namespaces=())
scen: str = "rdagent.app.finetune.data_science.scen.DSFinetuneScen"
"""
Scenario class for data science tasks.
- For Kaggle competitions, use: "rdagent.scenarios.data_science.scen.KaggleScen"
- For custom data science scenarios, use: "rdagent.scenarios.data_science.scen.DataScienceScen"
- For LLM finetune scenarios, use: "rdagent.app.finetune.llm.scen.LLMFinetuneScen"
- For Data science finetune scenarios, use: "rdagent.app.finetune.data_science.scen.DSFinetuneScen"
"""
debug_timeout: int = 3600
"""The timeout limit for running on debugging data"""
full_timeout: int = 10800
"""The timeout limit for running on full data"""
coder_on_whole_pipeline: bool = True
enable_model_dump: bool = True
app_tpl: str = "app/finetune/data_science/tpl"
def update_settings(competition: str):
"""
Update the RD_AGENT_SETTINGS with the values from DS_FINETUNE_SETTINGS.
"""
DS_FINETUNE_SETTINGS = DSFinetuneScen()
RD_AGENT_SETTINGS.app_tpl = DS_FINETUNE_SETTINGS.app_tpl
os.environ["DS_CODER_COSTEER_EXTRA_EVALUATOR"] = '["rdagent.app.finetune.share.eval.PrevModelLoadEvaluator"]'
for field_name, new_value in DS_FINETUNE_SETTINGS.model_dump().items():
if hasattr(DS_RD_SETTING, field_name):
setattr(DS_RD_SETTING, field_name, new_value)
DS_RD_SETTING.competition = competition
+40
View File
@@ -0,0 +1,40 @@
import asyncio
from pathlib import Path
import fire
from rdagent.app.data_science.conf import DS_RD_SETTING
from rdagent.app.finetune.data_science.conf import update_settings
from rdagent.core.utils import import_class
from rdagent.log import rdagent_logger as logger
from rdagent.scenarios.data_science.loop import DataScienceRDLoop
def main(
model: str | None = None,
competition: str | None = None,
):
"""
Parameters
----------
competition :
Competition name.
Auto R&D Evolving loop for models finetune.
You can continue running a session by using the command:
.. code-block:: bash
dotenv run -- python rdagent/app/finetune/data_science/loop.py --competition aerial-cactus-identification
"""
if not competition:
raise Exception("Please specify competition name.")
model_folder = Path(DS_RD_SETTING.local_data_path) / competition / "prev_model"
if not model_folder.exists():
raise Exception(f"Please put the model path to {model_folder}.")
update_settings(competition)
rd_loop: DataScienceRDLoop = DataScienceRDLoop(DS_RD_SETTING)
asyncio.run(rd_loop.run())
if __name__ == "__main__":
fire.Fire(main)
+20
View File
@@ -0,0 +1,20 @@
from pathlib import Path
from rdagent.app.data_science.conf import DS_RD_SETTING
from rdagent.core.scenario import Scenario
from rdagent.log import rdagent_logger as logger
from rdagent.scenarios.data_science.scen import DataScienceScen
from rdagent.scenarios.data_science.scen.utils import describe_data_folder_v2
from rdagent.utils.agent.tpl import T
class DSFinetuneScen(DataScienceScen):
"""DSFinetuneScen Scenario"""
def _get_data_folder_description(self) -> str:
folder_desc = describe_data_folder_v2(
Path(DS_RD_SETTING.local_data_path) / self.competition,
show_nan_columns=DS_RD_SETTING.show_nan_columns,
max_length=20000, # more context for model script
)
return folder_desc
@@ -0,0 +1,4 @@
pipeline_coder:
system: |-
{% include "rdagent.components.coder.data_science.pipeline.prompts:pipeline_coder.system" %}
NOTE: Ensure that base model form `{% include "scenarios.data_science.share:scen.input_path" %}prev_model` is correctly loaded, you are supposed to finetune the base model.
@@ -0,0 +1,6 @@
task_gen:
system: |-
{% include "rdagent.scenarios.data_science.proposal.exp_gen.prompts_v2:task_gen.system" %}
NOTE: You MUST load base model form `{% include "scenarios.data_science.share:scen.input_path" %}prev_model`. Your main goal is to finetune it.
+256
View File
@@ -0,0 +1,256 @@
# LLM Fine-tuning (FT) 场景运行指南
本文档介绍如何运行 RD-Agent 的 LLM Fine-tuning 场景。
## 简介
FT 场景用于自动化优化大语言模型在特定 benchmark 上的表现。系统会自动:
1. 生成数据处理和训练代码
2. 执行模型微调
3. 在目标 benchmark 上评估模型性能
4. 根据反馈迭代改进
## 支持的 Benchmark
| 类别 | Benchmark | 数据集 | 描述 |
|------|-----------|--------|------|
| Math | `aime24`, `aime25` | `deepscaler` | AIME 数学竞赛 |
| Patent | `panorama_par4pc` | `panorama-par4pc` | 专利现有技术检索 |
| Patent | `panorama_pi4pc` | `panorama-pi4pc` | 专利段落识别 |
| Patent | `panorama_noc4pc` | `panorama-noc4pc` | 专利新颖性分类 |
| Chemistry | `chemcotbench_mol_und` | `chemcot-mol_und` | 分子理解 |
| Chemistry | `chemcotbench_mol_edit` | `chemcot-mol_edit` | 分子编辑 |
| Chemistry | `chemcotbench_mol_opt` | `chemcot-mol_opt` | 分子优化 |
| Chemistry | `chemcotbench_reaction` | `chemcot-rxn` | 化学反应预测 |
> 数据集配置位于 `rdagent/scenarios/finetune/datasets/__init__.py` 的 `DATASETS` 字典中。
>运行时agent会查看所有数据集,根据target benchmark和scenario选出与之相关的。
## 环境配置
### 1. 运行环境
确保已安装 `rdagent` 主运行环境,其他需要的运行环境会自动创建
> 在 `.env` 配置文件中通过设置 `FT_Coder_CoSTEER_env_type = conda/docker` 来配置
### 2. .env 配置文件
在项目根目录创建 `.env` 文件,参考以下模板:
```bash
# ========== API Configuration ==========
BACKEND=rdagent.oai.backend.LiteLLMAPIBackend
CHAT_MODEL=gpt-5.2
CHAT_TEMPERATURE=1
CHAT_STREAM=True
OPENAI_API_KEY=sk-xxx
OPENAI_API_BASE=http://your-api-endpoint
EMBEDDING_MODEL=text-embedding-ada-002
EMBEDDING_USE_AZURE=True
# ========== Global Configs ==========
MAX_RETRY=12000
RETRY_WAIT_SECONDS=5
MULTI_PROC_N=16
STEP_SEMAPHORE=1
# ========== Cache Settings ==========
DUMP_CHAT_CACHE=False
USE_CHAT_CACHE=False
DUMP_EMBEDDING_CACHE=True
USE_EMBEDDING_CACHE=True
LOG_LLM_CHAT_CONTENT=True
CHAT_FREQUENCY_PENALTY=0.1
CHAT_PRESENCE_PENALTY=0.0
# ========== FT Scenario Specific ==========
FT_FILE_PATH=/path/to/your/finetune/workspace
# Environment type: docker or conda
# Set to "conda" when Docker is unavailable
FT_Coder_CoSTEER_env_type=conda
# Docker settings (only used when env_type=docker)
FT_DOCKER_ENABLE_CACHE=True
FT_UPDATE_LLAMA_FACTORY=False
# Data processing API concurrency (adjust based on target API capacity)
FT_API_MAX_WORKERS=1000
# Data processing Model
FT_STRONG_MODELS='["gpt-5", "gpt-5.1"]'
FT_WEAK_MODELS='["gpt-4o-mini"]'
# Benchmark and target (can be overridden in script)
FT_TARGET_BENCHMARK=aime25
FT_USER_TARGET_SCENARIO="I need to enhance the model's performance on math reasoning tasks."
# Timeout settings
FT_DATA_PROCESSING_TIMEOUT=28800
# Judge settings (optional)
# FT_JUDGE_MODEL=gpt-5.1
# FT_JUDGE_RETRY=10
REASONING_THINK_RM=True
# ========== Logging ==========
LOG_FORMAT_CONSOLE="{time:YYYY-MM-DD HH:mm:ss.SSS} | {level: <8} | <cyan>{process}</cyan> | {name}:{function}:{line} - {message}"
# ========== HuggingFace ==========
HF_TOKEN=hf_xxx
```
## 运行方法
### 基本命令
```bash
# 激活 conda 环境
conda activate rdagent
# 运行 FT 场景
dotenv run -- python rdagent/app/finetune/llm/loop.py --base-model <MODEL>
```
### 命令行参数
| 参数 | 说明 | 示例 |
|------|------|------|
| `--base-model` | 基础模型名称(必需,其他都可以不填) | `Qwen/Qwen2.5-7B-Instruct` |
| `--benchmark` | 目标 benchmark | `aime25` |
| `--benchmark-description` | Benchmark 描述 | - |
| `--dataset` | 指定数据集 | - |
| `--step-n` | 步数限制 | `10` |
| `--loop-n` | 循环次数限制 | `5` |
| `--timeout` | 总时间限制 | - |
### 运行示例
```bash
# 在 AIME25 上微调 Qwen2.5-7B
dotenv run -- python rdagent/app/finetune/llm/loop.py \
--base-model Qwen/Qwen2.5-7B-Instruct
# 指定 GPU 运行
CUDA_VISIBLE_DEVICES=0,1 dotenv run -- python rdagent/app/finetune/llm/loop.py \
--base-model Qwen/Qwen2.5-7B-Instruct
# 限制循环次数
dotenv run -- python rdagent/app/finetune/llm/loop.py \
--base-model Qwen/Qwen2.5-7B-Instruct \
--loop-n 3
```
### 多任务并行运行
创建 `tasks.json` 配置文件:
```json
{
"tasks": [
{"model": "Qwen/Qwen2.5-7B-Instruct", "benchmark": "aime25", "gpus": "0,1"},
{"model": "Qwen/Qwen2.5-7B-Instruct", "benchmark": "gsm8k", "gpus": "2,3"}
]
}
```
使用 `run_ft_deploy.sh` 脚本运行:
```bash
./run_ft_deploy.sh tasks.json # 正常运行
./run_ft_deploy.sh tasks.json --dry-run # 仅预览配置
./run_ft_deploy.sh tasks.json --no-sync # 禁用 blob 同步
```
<details>
<summary>run_ft_deploy.sh 脚本参考</summary>
```bash
#!/bin/bash
# 多任务并行部署脚本(简化版)
RDAGENT_DIR="$HOME/RD-Agent"
ENV_TEMPLATE=".env.ft"
STAGGER_DELAY=60
cd "$RDAGENT_DIR"
source ~/miniconda3/etc/profile.d/conda.sh
conda activate rdagent
CONFIG_FILE="${1:-tasks.json}"
NUM_TASKS=$(jq '.tasks | length' "$CONFIG_FILE")
for ((i=0; i<NUM_TASKS; i++)); do
model=$(jq -r ".tasks[$i].model" "$CONFIG_FILE")
benchmark=$(jq -r ".tasks[$i].benchmark" "$CONFIG_FILE")
gpus=$(jq -r ".tasks[$i].gpus" "$CONFIG_FILE")
# 更新 .env 中的 benchmark
cp "$ENV_TEMPLATE" .env
sed -i "s|^FT_TARGET_BENCHMARK=.*|FT_TARGET_BENCHMARK=$benchmark|" .env
CUDA_VISIBLE_DEVICES=$gpus \
dotenv run -- python rdagent/app/finetune/llm/loop.py --base-model "$model" &
# 首个任务等待环境创建,后续任务错开启动
[[ $i -eq 0 ]] && sleep 120 || sleep $STAGGER_DELAY
done
wait
```
</details>
## Blob 日志同步
使用 Azure Blob 在多台机器间同步日志文件。
### 1. 生成 SAS Token
```bash
# 首先登录 Azure CLI
az login
# 生成 Token(默认有效期 7 天)
bash rdagent/utils/blob/gen_token.sh
# 或指定过期时间
bash rdagent/utils/blob/gen_token.sh 2025-01-31T00:00Z
```
Token 会保存到 `git_ignore_folder/.az_sas_token`
### 2. 同步日志
同步路径:`log/``blob://epeastus/rdagent/FinetuneAgenticLLM/FT_qizheng/logs`
```bash
# 上传本地日志到 Blob
bash rdagent/utils/blob/azsync.sh up
# 从 Blob 下载日志到本地
bash rdagent/utils/blob/azsync.sh down
```
> 如需修改远程路径,编辑 `rdagent/utils/blob/azsync.sh` 中的 `REMOTE_PATH` 变量。
## 日志查看
运行日志保存在 `log/` 目录下:
```
log/
└── 2025-01-01_12-00-00-123456/
├── Loop_0/
│ ├── direct_exp_gen/ # 假设生成
│ ├── coding/ # 代码生成
│ ├── running/ # 训练执行
│ └── feedback/ # 反馈总结
└── Loop_1/
└── ...
```
+125
View File
@@ -0,0 +1,125 @@
from pathlib import Path
from pydantic_settings import SettingsConfigDict
from rdagent.core.conf import ExtendedBaseSettings
class LLMFinetunePropSetting(ExtendedBaseSettings):
"""LLM Fine-tune dedicated property settings.
- Adjust timeouts and template
- Use FT_ env prefix for overrides
"""
model_config = SettingsConfigDict(env_prefix="FT_", protected_namespaces=())
# Main Components
scen: str = "rdagent.scenarios.finetune.scen.scenario.LLMFinetuneScen"
"""Scenario class for LLM fine-tuning tasks."""
hypothesis_gen: str = "rdagent.scenarios.finetune.proposal.proposal.LLMFinetuneExpGen"
"""Hypothesis generation class for LLM fine-tuning tasks."""
coder: str = "rdagent.components.coder.finetune.LLMFinetuneCoSTEER"
"""Code generator.
Function: Generate LLM fine-tuning code based on experiment design.
"""
runner: str = "rdagent.scenarios.finetune.train.runner.LLMFinetuneRunner" # TODO
"""Code runner.
Function: Execute LLM fine-tuning code in a Docker environment.
"""
summarizer: str = "rdagent.scenarios.finetune.dev.feedback.FTExperiment2Feedback"
"""Result summarizer - To be implemented.
Function: Analyze fine-tuning results and generate feedback, including performance metrics and error analysis.
"""
# Timeouts (longer for LLM training, all for Docker container timeout)
full_timeout: int = 360000
"""Full training timeout in seconds (default 100 hours, env: FT_FULL_TIMEOUT). Used in running stage for complete model training."""
data_processing_timeout: int = 3600
"""Data processing script timeout in seconds (default 1 hour, env: FT_DATA_PROCESSING_TIMEOUT). Used for full data processing in running stage."""
debug_data_processing_timeout: int = 1200
"""Debug data processing timeout in seconds (default 20 minutes, env: FT_DEBUG_DATA_PROCESSING_TIMEOUT). Used for --debug mode in coding stage."""
micro_batch_timeout: int = 1800
"""Micro-batch test timeout in seconds (default 30 minutes, env: FT_MICRO_BATCH_TIMEOUT)."""
# Pipeline behavior
coder_on_whole_pipeline: bool = True
app_tpl: str = "scenarios/finetune"
# Benchmark evaluation (always enabled as part of evaluation pipeline)
benchmark_timeout: int = 0
"""Benchmark evaluation timeout in seconds. 0 means no timeout."""
# Judge API configuration (for llmjudge benchmarks like AIME)
judge_model: str = "gpt-5.1"
"""LLM judge model name for evaluation"""
judge_api_key: str | None = None
"""API key for judge model (if None, will try to use from environment)"""
judge_api_base: str | None = None
"""API base URL for judge model (if None, will use default)"""
judge_retry: int = 10
"""Number of retries for LLM judge API calls (env: FT_JUDGE_RETRY)"""
benchmark_limit: int | None = None
"""Limit number of samples for benchmark evaluation (None for full evaluation). Use for quick testing and debugging."""
benchmark_num_runs: int = 1
"""Number of times to run each sample (for computing average or pass@k). Set >1 for multiple runs."""
benchmark_pass_k: list[int] | None = None
"""Pass@k parameter list for code generation tasks (e.g., [1, 5, 10]). None to disable."""
# Data paths and processing
file_path: Path = Path.cwd() / "git_ignore_folder" / "finetune_files"
show_nan_columns: bool = False
sample_data_by_LLM: bool = True
# LLM-specific fields
user_target_scenario: str | None = None
target_benchmark: str | None = None
"""Benchmark dataset to evaluate on. Supported: aime25, aime24, mmlu, gsm8k, math, etc."""
benchmark_description: str | None = None
base_model: str | None = None
dataset: str | None = None
upper_data_size_limit: int = 2000
# Data processing LLM models (for API calls in data processing scripts)
strong_models: list[str] = ["gpt-5", "gpt-5.1"]
"""Strong models for complex tasks (CoT generation, reasoning) - supports list (env: FT_STRONG_MODELS)"""
weak_models: list[str] = ["gpt-4o-mini", "o4-mini", "gpt-5-mini"]
"""Weak models for simple tasks (filtering, format conversion) - supports list (env: FT_WEAK_MODELS)"""
embedding_models: list[str] = ["text-embedding-3-small", "text-embedding-3-large"]
# Docker settings
docker_enable_cache: bool = False
"""Enable Docker cache for training (set via FT_DOCKER_ENABLE_CACHE)"""
# data sample count
data_sample_count: int = 3
# API concurrency for data processing
api_max_workers: int = 1000
"""Max concurrent workers for LLM API calls in data processing scripts (env: FT_API_MAX_WORKERS)"""
# Coder settings
coder_max_loop: int = 10
# CoT format settings
force_think_token: bool = False
"""Force <think> token wrapping for CoT training data (env: FT_FORCE_THINK_TOKEN).
When True: Data must be wrapped in <think>...</think> format, benchmark uses extract-non-reasoning-content postprocessor.
When False: CoT reasoning required but format is flexible, no postprocessor needed."""
# Global setting instance for LLM finetuning scenario
FT_RD_SETTING = LLMFinetunePropSetting()
+131
View File
@@ -0,0 +1,131 @@
# FT Job Runner
批量并行运行多个 LLM 微调任务的脚本。
## 快速开始
```bash
# 1. 准备环境配置
cp .env.template .env
# 编辑 .env,填入 API key 等配置
# 2. 准备任务配置
cp tasks.json.example tasks.json
# 编辑 tasks.json,定义要运行的任务
# 3. 运行
./run_ft_job.sh
```
## 用法
```bash
./run_ft_job.sh [tasks.json]
```
| 参数 | 说明 |
|------|------|
| `tasks.json` | 任务配置文件路径(可选,默认使用同目录下的 `tasks.json` |
| `-h, --help` | 显示帮助信息 |
### 示例
```bash
# 使用默认配置
./run_ft_job.sh
# 指定自定义配置文件
./run_ft_job.sh /path/to/my_tasks.json
```
## 配置文件
### tasks.json
定义要并行运行的任务列表:
```json
{
"tasks": [
{
"model": "Qwen/Qwen3-8B",
"benchmark": "aime25",
"gpus": "0,1"
},
{
"model": "Qwen/Qwen3-8B",
"benchmark": "gsm8k",
"gpus": "2,3",
"scenario": "自定义优化目标"
}
]
}
```
| 字段 | 必填 | 默认值 | 说明 |
|------|:----:|--------|------|
| `model` | ✅ | - | HuggingFace 模型路径 |
| `benchmark` | ✅ | - | 评估基准(如 `aime25`, `gsm8k` |
| `gpus` | ❌ | `"0"` | 使用的 GPU 编号 |
| `scenario` | ❌ | `"Improve model performance on {benchmark}"` | 优化目标描述 |
### .env
环境配置文件,包含 API 密钥、模型设置等。从 `.env.template` 复制并修改:
```bash
cp .env.template .env
```
主要配置项:
| 配置 | 说明 |
|------|------|
| `OPENAI_API_KEY` | OpenAI API 密钥 |
| `OPENAI_API_BASE` | API 地址 |
| `FT_Coder_CoSTEER_env_type` | 环境类型:`docker``conda` |
| `HF_TOKEN` | HuggingFace Token |
## 输出
运行后会在 `log/` 目录下创建 job 文件夹:
```
log/2025-12-23/
├── aime25_Qwen3-8B.log # 任务日志
├── gsm8k_Qwen3-8B.log
└── aime25_Qwen3-8B/ # 任务 traceLoop 数据)
├── Loop_0/
└── ...
```
## 监控
### 命令行
```bash
# 查看所有任务日志
tail -f log/2025-12-23/*.log
# 查看特定任务
tail -f log/2025-12-23/aime25_Qwen3-8B.log
```
### Web UI
```bash
streamlit run rdagent/app/finetune/llm/ui/app.py
```
在 UI 中选择 Job Folder 为对应的日志目录即可查看运行状态。
## 依赖
- `jq`JSON 解析工具
- `conda` 环境:`rdagent`
## 注意事项
1. 任务启动间隔默认为 60 秒(`STAGGER_DELAY`),避免同时启动造成资源竞争
2. 确保指定的 GPU 编号不冲突
3. 如果同一天多次运行,会自动创建 `log/2025-12-23_1/``log/2025-12-23_2/` 等目录
+186
View File
@@ -0,0 +1,186 @@
#!/bin/bash
# Run multiple FT tasks in parallel under a single job directory
#
# Usage: ./run_ft_job.sh [tasks.json]
#
# Config format (tasks.json):
# {
# "tasks": [
# {"model": "Qwen/Qwen3-8B", "benchmark": "aime25", "gpus": "0,1"},
# {"model": "Qwen/Qwen3-8B", "benchmark": "gsm8k", "gpus": "2,3"}
# ]
# }
set -e
# ========== CONFIG ==========
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
RDAGENT_DIR="$(cd "$SCRIPT_DIR/../../../../.." && pwd)"
ENV_FILE="$SCRIPT_DIR/.env"
SCENARIOS_FILE="$SCRIPT_DIR/scenarios.json"
STAGGER_DELAY=60
usage() {
echo "Usage: $0 [tasks.json]"
echo "Run multiple FT tasks under a single job directory."
echo "UI: streamlit run rdagent/app/finetune/llm/ui/app.py"
exit 0
}
# ========== PARSE ARGS ==========
CONFIG_FILE=""
for arg in "$@"; do
case $arg in
-h|--help) usage ;;
*) [[ -z "$CONFIG_FILE" ]] && CONFIG_FILE="$arg" ;;
esac
done
[[ -z "$CONFIG_FILE" ]] && CONFIG_FILE="$SCRIPT_DIR/tasks.json"
[[ ! -f "$CONFIG_FILE" ]] && echo "Error: Config not found: $CONFIG_FILE" && exit 1
# Check .env file
if [[ ! -f "$ENV_FILE" ]]; then
echo "Error: .env not found at $ENV_FILE"
echo "Please create it from template: cp $SCRIPT_DIR/.env.template $ENV_FILE"
exit 1
fi
# Check jq
command -v jq &>/dev/null || { echo "Error: jq required"; exit 1; }
# ========== SETUP ==========
# Get log and workspace base paths from environment or use defaults
# Default to project-relative paths; can be overridden by environment variables
FT_LOG_BASE="${FT_LOG_BASE:-$RDAGENT_DIR/log}"
FT_WORKSPACE_BASE="${FT_WORKSPACE_BASE:-$RDAGENT_DIR/git_ignore_folder/RD-Agent_workspace}"
JOB_ID=$(date +%Y-%m-%d_%H-%M)
JOB_DIR="$FT_LOG_BASE/$JOB_ID"
if [[ -d "$JOB_DIR" ]]; then
i=1; while [[ -d "${JOB_DIR}_$i" ]]; do ((i++)); done
JOB_ID="${JOB_ID}_$i"; JOB_DIR="${JOB_DIR}_$i"
fi
mkdir -p "$JOB_DIR"
cd "$RDAGENT_DIR"
NUM_TASKS=$(jq '.tasks | length' "$CONFIG_FILE")
echo "=============================================="
echo "FT Job: $JOB_ID"
echo "=============================================="
echo "Config: $CONFIG_FILE"
echo "Tasks: $NUM_TASKS"
echo "Log: $JOB_DIR"
echo "Workspace: $FT_WORKSPACE_BASE/$JOB_ID"
echo ""
# Setup tmux session
TMUX_SESSION="rdagent"
tmux kill-session -t "$TMUX_SESSION" 2>/dev/null || true
tmux new-session -d -s "$TMUX_SESSION" -n "main"
echo "Tmux session created: $TMUX_SESSION"
echo ""
for ((i=0; i<NUM_TASKS; i++)); do
model=$(jq -r ".tasks[$i].model" "$CONFIG_FILE")
benchmark=$(jq -r ".tasks[$i].benchmark" "$CONFIG_FILE")
gpus=$(jq -r ".tasks[$i].gpus // \"0\"" "$CONFIG_FILE")
port=$(jq -r ".tasks[$i].port // empty" "$CONFIG_FILE")
task_timeout=$(jq -r ".tasks[$i].timeout // \"12h\"" "$CONFIG_FILE")
# Load benchmark_description: tasks.json -> scenarios.json
benchmark_desc=$(jq -r ".tasks[$i].benchmark_description // empty" "$CONFIG_FILE")
if [[ -z "$benchmark_desc" ]]; then
benchmark_desc=$(jq -r ".[\"$benchmark\"].benchmark_description // empty" "$SCENARIOS_FILE")
fi
# Note: Special characters in benchmark_desc are handled by writing to env file
model_name=$(basename "$model")
task_name="${benchmark}_${model_name}"
trace_path="$JOB_DIR/$task_name"
port_info=""
[[ -n "$port" ]] && port_info=", port=$port"
echo "Task $i: $task_name (model=$model, benchmark=$benchmark, gpus=$gpus$port_info)"
# Run task in tmux window with script -c for output capture
task_workspace="$FT_WORKSPACE_BASE/$JOB_ID/$task_name"
mkdir -p "$task_workspace"
LOG_FILE="$JOB_DIR/${task_name}.log"
# Write task-specific env file (avoids command-line escaping issues with special chars)
TASK_ENV_FILE="$task_workspace/.task_env"
cat > "$TASK_ENV_FILE" << EOF
CUDA_VISIBLE_DEVICES='$gpus'
LOG_TRACE_PATH='$trace_path'
WORKSPACE_PATH='$task_workspace'
FT_TARGET_BENCHMARK='$benchmark'
EOF
# Escape shell special characters for double-quoted string: \ " ` $
if [[ -n "$benchmark_desc" ]]; then
escaped_desc="$benchmark_desc"
escaped_desc="${escaped_desc//\\/\\\\}" # \ -> \\
escaped_desc="${escaped_desc//\"/\\\"}" # " -> \"
escaped_desc="${escaped_desc//\`/\\\`}" # ` -> \`
escaped_desc="${escaped_desc//\$/\\\$}" # $ -> \$
echo "FT_BENCHMARK_DESCRIPTION=\"$escaped_desc\"" >> "$TASK_ENV_FILE"
fi
[[ -n "$port" ]] && echo "OPENAI_API_BASE='http://localhost:$port'" >> "$TASK_ENV_FILE"
# Create tmux window for this task and get its full target (e.g., rdagent:1.0)
# Use "session:" format to ensure window is created in the correct session
WIN_TARGET=$(tmux new-window -t "$TMUX_SESSION:" -n "$benchmark" -P)
# Build the command with environment setup (env vars loaded from file)
timeout_arg=""
[[ -n "$task_timeout" ]] && timeout_arg="--timeout $task_timeout"
TASK_CMD="source ~/miniconda3/etc/profile.d/conda.sh && conda activate qz_rdagent"
TASK_CMD="$TASK_CMD && set -a && source '$ENV_FILE' && source '$TASK_ENV_FILE' && set +a"
TASK_CMD="$TASK_CMD && cd '$RDAGENT_DIR'"
TASK_CMD="$TASK_CMD && python rdagent/app/finetune/llm/loop.py --base-model '$model' $timeout_arg"
# Run with script -c to capture terminal output (using full target for reliability)
tmux send-keys -t "$WIN_TARGET" "script -q '$LOG_FILE' -c \"$TASK_CMD\"" Enter
echo " Window: $benchmark"
echo ""
# Stagger starts
if [[ $i -eq 0 ]]; then
# First task: wait for initialization
# Get FT_FILE_PATH from .env or use default
FT_FILE_PATH=$(grep -E "^FT_FILE_PATH=" "$ENV_FILE" | cut -d= -f2 | tr -d '"' || echo "")
[[ -z "$FT_FILE_PATH" ]] && FT_FILE_PATH="$RDAGENT_DIR/git_ignore_folder/finetune"
DATASET_INFO="$FT_FILE_PATH/datasets/dataset_info.json"
echo " Waiting for scenario initialization (dataset_info.json)..."
while [[ ! -f "$DATASET_INFO" ]]; do
sleep 5
done
echo " Scenario initialized!"
echo " Waiting for llm_finetune conda env..."
while ! conda run -n llm_finetune python -c "import requests" 2>/dev/null; do
sleep 10
done
echo " Waiting for opencompass conda env..."
while ! conda run -n opencompass python -c "import opencompass" 2>/dev/null; do
sleep 10
done
echo " Environment ready!"
elif [[ $i -lt $((NUM_TASKS - 1)) ]]; then
sleep $STAGGER_DELAY
fi
done
echo "=============================================="
echo "All tasks started in tmux session: $TMUX_SESSION"
echo " - Attach: tmux attach -t $TMUX_SESSION"
echo " - List: tmux list-windows -t $TMUX_SESSION"
echo " - Select: tmux select-window -t $TMUX_SESSION:{window_name}"
echo "Monitor: tail -f $JOB_DIR/*.log"
echo "UI: streamlit run rdagent/app/finetune/llm/ui/app.py (Job Folder: $JOB_DIR)"
+128
View File
@@ -0,0 +1,128 @@
{
"_comment": "Benchmark scenarios for FT tasks. Used by run_ft_job.sh and UI.",
"aime24": {
"category": "math",
"scenario": "Improve the model's ability to solve advanced competition math problems through multi-step reasoning, including number theory, combinatorics, geometry, and algebraic manipulation, with answers expressed as integers from 0 to 999.",
"benchmark_description": "AIME 2024 (American Invitational Mathematics Examination) - Advanced high school math competition problems requiring creative problem-solving. Each answer is an integer 0-999. Topics include number theory, algebra, geometry, trigonometry, probability, and combinatorics. Problems require multi-step reasoning and often have elegant solutions. Expected Output Format: Put final answer within \\boxed{}, e.g., \\boxed{42}."
},
"aime25": {
"category": "math",
"scenario": "Improve the model's ability to solve advanced competition math problems through multi-step reasoning, including number theory, combinatorics, geometry, and algebraic manipulation, with answers expressed as integers from 0 to 999.",
"benchmark_description": "AIME 2025 (American Invitational Mathematics Examination) - Advanced high school math competition problems requiring creative problem-solving. Each answer is an integer 0-999. Topics include number theory, algebra, geometry, trigonometry, probability, and combinatorics. Problems require multi-step reasoning and often have elegant solutions. Expected Output Format: Put final answer within \\boxed{}, e.g., \\boxed{42}."
},
"panorama": {
"category": "patent",
"scenario": "Improve the model's patent examination capabilities including prior art retrieval, paragraph identification, and novelty/obviousness classification based on USPTO standards.",
"benchmark_description": "PANORAMA tests patent examination capabilities based on real USPTO Office Actions. Tasks include: retrieving relevant prior art patents, identifying specific paragraphs in prior art that relate to claims, and classifying claims as allowable, lacking novelty (102), or obvious (103). Requires understanding patent law, technical document analysis, and legal reasoning. Expected Output Format: Return JSON with task-specific format (see subtask descriptions)."
},
"panorama_par4pc": {
"category": "patent",
"scenario": "Improve the model's ability to retrieve relevant prior art patents given a patent claim, by understanding claim scope, identifying technical similarities, and ranking patents by relevance for rejection analysis.",
"benchmark_description": "PAR4PC (Prior Art Retrieval for Patent Claims) - Given a patent claim, retrieve the most relevant prior art patents from a candidate pool. Requires understanding claim scope, identifying technical similarities, and ranking patents by relevance for potential 35 USC 102/103 rejections. Expected Output Format: Return JSON: {\"answer\": \"A\"} for single patent or {\"answer\": [\"A\", \"C\"]} for multiple patents (codes A-H)."
},
"panorama_pi4pc": {
"category": "patent",
"scenario": "Improve the model's ability to identify specific paragraphs in prior art patents that are most relevant for evaluating a claim's novelty and obviousness through element-by-element analysis.",
"benchmark_description": "PI4PC (Paragraph Identification for Patent Claims) - Given a patent claim and cited prior art patent, identify specific paragraphs most relevant for evaluating novelty and obviousness. Requires detailed technical reading, element-by-element claim analysis, and understanding how prior art teachings map to claim limitations. Expected Output Format: Return JSON: {\"answer\": \"<paragraph_id>\"}."
},
"panorama_noc4pc": {
"category": "patent",
"scenario": "Improve the model's ability to classify patent claims as allowable, anticipated, or obvious by applying patent law standards to analyze claim limitations against prior art.",
"benchmark_description": "NOC4PC (Novelty/Obviousness Classification) - Classify patent claims as ALLOW (patentable), 102 (anticipated/lacks novelty), or 103 (obvious). Requires applying patent law standards: 102 when single reference discloses all elements, 103 when combination of references with motivation makes claim obvious to skilled artisan. Expected Output Format: Return JSON: {\"code\": \"ALLOW\"} or {\"code\": \"102\"} or {\"code\": \"103\"}."
},
"panorama_par4pc_cot": {
"category": "patent",
"scenario": "Improve the model's ability to retrieve relevant prior art patents while providing explicit chain-of-thought reasoning explaining which claim elements each patent teaches and how it supports a rejection.",
"benchmark_description": "PAR4PC with chain-of-thought - Retrieve relevant prior art while providing explicit reasoning. Explain why each retrieved patent is relevant: which claim elements it teaches, what technical problems it addresses, and how it could support a rejection. Expected Output Format: Provide reasoning first, then return JSON: {\"answer\": \"A\"} or {\"answer\": [\"A\", \"C\"]}."
},
"panorama_pi4pc_cot": {
"category": "patent",
"scenario": "Improve the model's ability to identify relevant prior art paragraphs while providing element-by-element mapping showing how specific paragraph teachings correspond to claim limitations.",
"benchmark_description": "PI4PC with chain-of-thought - Identify relevant prior art paragraphs while explaining the technical connections. Provide element-by-element mapping showing how specific paragraph teachings correspond to claim limitations. Expected Output Format: Provide reasoning first, then return JSON: {\"answer\": \"<paragraph_id>\"}."
},
"panorama_noc4pc_cot": {
"category": "patent",
"scenario": "Improve the model's ability to classify patent claims with examiner-style rationale, explaining how references anticipate limitations or how combinations with motivation render claims obvious.",
"benchmark_description": "NOC4PC with chain-of-thought - Classify claims with examiner-style rationale. For 102: explain how reference anticipates each limitation. For 103: identify references, explain motivation to combine, and show how combination renders claim obvious. Use proper USPTO citation format. Expected Output Format: Return JSON: {\"reason\": \"<Office Action analysis>\", \"code\": \"ALLOW\"|\"102\"|\"103\"}."
},
"chemcotbench": {
"category": "chemistry",
"scenario": "Improve the model's chemical reasoning capabilities on molecular structures including understanding molecular features, editing molecules, optimizing properties, and predicting reaction outcomes.",
"benchmark_description": "ChemCoTBench tests step-wise chemical reasoning on SMILES molecular structures. Tasks include molecule understanding (identify functional groups, ring systems), molecule editing (add/delete/substitute groups while maintaining validity), molecule optimization (modify for desired properties), and reaction prediction (products, mechanisms, conditions). Contains subtasks with different output requirements. Expected Output Format: Return JSON: {\"output\": \"<answer>\"} where answer format depends on subtask - SMILES string for molecular tasks, numeric count for counting tasks, or Yes/No for equivalence tasks."
},
"chemcotbench_mol_und": {
"category": "chemistry",
"scenario": "Improve the model's ability to analyze molecular structures and identify structural features including functional groups (hydroxyl, carboxyl, amine), ring systems (aromatic, aliphatic), and molecular scaffolds.",
"benchmark_description": "Molecule Understanding - Analyze SMILES strings for structural features. Subtasks: (1) fg_count/ring_count: return integer count, (2) equivalence/ring_system_scaffold: return Yes or No, (3) Murcko_scaffold: return SMILES string. Requires parsing SMILES notation and applying organic chemistry knowledge. Expected Output Format: Return JSON: {\"output\": \"<answer>\"} where answer is integer/Yes/No/SMILES depending on subtask."
},
"chemcotbench_mol_edit": {
"category": "chemistry",
"scenario": "Improve the model's ability to perform precise structural modifications on molecules (add, delete, substitute functional groups) while maintaining chemical validity and molecule integrity.",
"benchmark_description": "Molecule Editing - Perform structural modifications on SMILES. Subtasks: add (add functional group), delete (remove group), sub (substitute group). Output must be valid SMILES representing chemically feasible molecules. Expected Output Format: Return JSON: {\"output\": \"<valid SMILES>\"}. SMILES validity is verified using RDKit."
},
"chemcotbench_mol_opt": {
"category": "chemistry",
"scenario": "Improve the model's ability to modify molecular structures to achieve target properties such as improved solubility, drug-likeness, or binding affinity to specific biological targets.",
"benchmark_description": "Molecule Optimization - Modify structures to achieve target properties. Subtasks: drd/gsk/jnk (binding affinity to DRD2/GSK3β/JNK3 targets), logp (lipophilicity), qed (drug-likeness), solubility. Requires understanding structure-property relationships. Expected Output Format: Return JSON: {\"output\": \"<optimized SMILES>\"}."
},
"chemcotbench_reaction": {
"category": "chemistry",
"scenario": "Improve the model's ability to predict chemical reaction outcomes including forward synthesis, retrosynthesis, mechanism selection, and reaction conditions based on functional group transformations.",
"benchmark_description": "Reaction Prediction - Predict reaction outcomes. Subtasks: fs (forward synthesis: reactants→products), retro (retrosynthesis: products→reactants), rcr (reaction condition recommendation), nepp (named reaction prediction), mechsel (mechanism selection). Requires understanding reaction types and functional group transformations. Expected Output Format: Return JSON: {\"output\": \"<SMILES or text answer>\"}."
},
"tablebench_data_analysis": {
"category": "table_qa",
"scenario": "Improve the model's ability to analyze tabular data for complex questions including trend identification, correlation analysis, statistical computation, and data-driven forecasting.",
"benchmark_description": "Table Data Analysis - Analyze tabular data to answer complex questions. Subtask types with different evaluation: (1) CorrelationAnalysis/TrendForecasting/StatisticalAnalysis: numeric answers with ±10% relative error tolerance, (2) ImpactAnalysis: exact match required, (3) Other analysis types: evaluated using ROUGE-L. Requires reading tables accurately and applying analytical reasoning. Expected Output Format: End response with \"Final Answer: <value>\"."
},
"tablebench_fact_checking": {
"category": "table_qa",
"scenario": "Improve the model's ability to verify factual claims against tabular data through accurate data extraction, implicit relationship understanding, and multi-hop reasoning across table cells.",
"benchmark_description": "Table Fact Checking - Answer table-based factual questions accurately. Questions may ask for specific information (numbers, names, dates) or verification (Yes/No, True/False). Uses Exact Match evaluation. Expected Output Format: End response with \"Final Answer: <value>\" where value is the precise answer to the question."
},
"tablebench_numerical_reasoning": {
"category": "table_qa",
"scenario": "Improve the model's ability to perform mathematical operations on table data including arithmetic, aggregations (sum, average, count), comparisons, percentages, and multi-step calculations.",
"benchmark_description": "Table Numerical Reasoning - Perform mathematical operations on table data: arithmetic (sum, difference, product), aggregations (average, count, max/min), comparisons, percentages, and multi-step calculations. Requires accurate number extraction and correct mathematical computation. Expected Output Format: End response with \"Final Answer: <numeric value>\"."
},
"tablebench_visualization": {
"category": "table_qa",
"scenario": "Improve the model's ability to generate Python code that creates appropriate visualizations (bar, line, pie, scatter charts) from tabular data with correct chart type selection and data mapping.",
"benchmark_description": "Table Visualization - Generate Python code to create appropriate visualizations from tabular data: bar charts, line charts, pie charts, scatter plots. Select correct chart type for data, map columns correctly to axes, and produce executable matplotlib/pandas code. Expected Output Format: Return Python code in ```python code block using matplotlib/pandas. Code will be executed to verify correctness."
},
"tablebench_gen": {
"category": "table_qa",
"scenario": "Improve the model's overall table question answering capabilities across fact checking, numerical reasoning, data analysis, and visualization by understanding table structure and generating accurate answers.",
"benchmark_description": "TableBench General - Comprehensive table QA covering fact checking, numerical reasoning, data analysis, and visualization. Questions require understanding table structure, extracting relevant data, performing reasoning or computation, and generating accurate answers or code. Expected Output Format: End response with \"Final Answer: <answer>\"."
},
"FinanceIQ_gen": {
"category": "finance",
"scenario": "Improve the model's financial domain knowledge and reasoning capabilities across Chinese financial certification exams including CPA, banking, securities, fund, futures, insurance, tax, and actuarial qualifications through multiple-choice question answering.",
"benchmark_description": "FinanceIQ tests financial domain knowledge through multiple-choice questions (A/B/C/D). Covers 10 Chinese financial certification exams: CPA (注册会计师), banking qualification, securities qualification, fund qualification, futures qualification, insurance qualification (CICE), tax advisor, economist, financial planner, and actuary. Uses LLM Judge for evaluation with 5-shot in-context learning. Evaluation metric: accuracy."
},
"bioprobench_gen": {
"category": "biology",
"scenario": "Improve the model's ability to generate complete, detailed experimental protocol steps from research context, including specific reagent concentrations, temperatures, incubation times, and equipment settings.",
"benchmark_description": "Protocol Generation - Generate complete experimental protocol steps given research context and objectives. Output detailed, actionable instructions: specify reagent concentrations, temperatures, incubation times, equipment settings. Protocols must be scientifically valid and reproducible. Expected Output Format: Wrap protocol steps in [ANSWER_START]Step 1: ... Step 2: ...[ANSWER_END]. Evaluated using BLEU, ROUGE, and step matching metrics."
},
"bioprobench_ord": {
"category": "biology",
"scenario": "Improve the model's ability to arrange shuffled experimental steps in correct sequence. Output MUST be a valid Python list format: [ANSWER_START][0, 2, 1, 3][ANSWER_END]. Use brackets and commas, NOT space-separated indices.",
"benchmark_description": "Step Ordering - Arrange shuffled experimental procedure steps in correct logical and temporal sequence. Requires understanding procedural dependencies: which steps must precede others, timing constraints, and scientific logic of experimental workflows. CRITICAL OUTPUT FORMAT: Answer MUST be a valid Python list with brackets and commas, e.g., [ANSWER_START][2, 0, 1, 3][ANSWER_END]. NOT space-separated (0 2 1 3 is WRONG), NOT without brackets (0, 2, 1, 3 is WRONG). Evaluated using Exact Match and Kendall's Tau."
},
"bioprobench_err": {
"category": "biology",
"scenario": "Improve the model's ability to identify errors in biological protocol text. CRITICAL SEMANTICS: True = step is CORRECT (no errors), False = step HAS ERRORS. This matches the benchmark prompt: 'If you find anything wrong, answer False.' Output format: [ANSWER_START]True or False[ANSWER_END].",
"benchmark_description": "Error Correction - Identify errors in biological protocol text including incorrect temperatures, concentrations, reagents, or procedural mistakes. CRITICAL: The benchmark expects True if the protocol step is CORRECT (no errors), and False if it HAS ERRORS. This follows the prompt: 'If you find anything wrong, answer False.' Do NOT invert this logic. Expected Output Format: [ANSWER_START]True[ANSWER_END] for correct steps, [ANSWER_START]False[ANSWER_END] for erroneous steps."
},
"bioprobench_pqa": {
"category": "biology",
"scenario": "Improve the model's ability to extract specific factual information from experimental protocols including temperatures, concentrations, incubation times, reagent quantities, and procedural details.",
"benchmark_description": "Protocol QA - Extract specific factual information from experimental protocols: temperatures, concentrations, incubation times, reagent quantities, equipment specifications, and procedural details. Requires careful reading and accurate information extraction from technical text. Expected Output Format: Return [ANSWER_START]<answer text> & <confidence 0-100>%[ANSWER_END], e.g., [ANSWER_START]Option A & 95%[ANSWER_END]. Evaluated using accuracy and Brier Score."
}
}
@@ -0,0 +1,20 @@
{
"tasks": [
{
"model": "Qwen/Qwen3-8B",
"benchmark": "aime25",
"gpus": "0,1"
},
{
"model": "Qwen/Qwen3-8B",
"benchmark": "gsm8k",
"gpus": "2,3"
},
{
"model": "meta-llama/Llama-3-8B",
"benchmark": "aime25",
"gpus": "4,5",
"scenario": "Improve AIME 2025 math reasoning with custom approach"
}
]
}
+100
View File
@@ -0,0 +1,100 @@
"""
LLM Fine-tuning Entry Point
Standard RDLoop entry point for LLM fine-tuning, consistent with data science implementation.
"""
import asyncio
from typing import Optional, cast
import fire
from rdagent.app.finetune.llm.conf import FT_RD_SETTING
from rdagent.log import rdagent_logger as logger
from rdagent.scenarios.finetune.loop import LLMFinetuneRDLoop
def main(
path: Optional[str] = None,
checkout: bool = True,
user_target_scenario: Optional[str] = None,
benchmark: Optional[str] = None,
benchmark_description: Optional[str] = None,
dataset: Optional[str] = None,
base_model: Optional[str] = None,
upper_data_size_limit: Optional[int] = None,
step_n: Optional[int] = None,
loop_n: Optional[int] = None,
timeout: Optional[str] = None,
):
"""
LLM fine-tuning entry point
Parameters
----------
path :
A path like `$LOG_PATH/__session__/1/0_propose`. This indicates that we restore the state after finishing step 0 in loop 1.
checkout :
Used to control the log session path. Boolean type, default is True.
- If True, the new loop will use the existing folder and clear logs for sessions after the one corresponding to the given path.
- If False, the new loop will use the existing folder but keep the logs for sessions after the one corresponding to the given path.
dataset : str
Dataset name for fine-tuning (e.g., 'shibing624/alpaca-zh')
base_model : str, optional
Model name for fine-tuning (e.g., 'Qwen/Qwen2.5-1.5B-Instruct').
If not provided, auto-selects optimal model based on hardware and dataset.
step_n : int, optional
Number of steps to run; if None, runs indefinitely until completion or error
loop_n : int, optional
Number of loops to run; if None, runs indefinitely until completion or error
timeout : str, optional
Maximum duration for the entire process
Examples:
.. code-block:: bash
dotenv run -- python rdagent/app/finetune/llm/loop.py --dataset shibing624/alpaca-zh --base-model Qwen/Qwen2.5-1.5B-Instruct
dotenv run -- python rdagent/app/finetune/llm/loop.py --dataset shibing624/alpaca-zh # TODO: not enabled yet
"""
if user_target_scenario:
FT_RD_SETTING.user_target_scenario = user_target_scenario
assert (
FT_RD_SETTING.user_target_scenario is None
), "user_target_scenario is not yet supported, please specify via benchmark and benchmark_description"
if upper_data_size_limit:
FT_RD_SETTING.upper_data_size_limit = upper_data_size_limit
logger.info(f"Set upper_data_size_limit to {FT_RD_SETTING.upper_data_size_limit}")
if benchmark and benchmark_description:
FT_RD_SETTING.target_benchmark = benchmark
FT_RD_SETTING.benchmark_description = benchmark_description
assert FT_RD_SETTING.user_target_scenario or (
FT_RD_SETTING.target_benchmark and FT_RD_SETTING.benchmark_description
), "Either user_target_scenario or target_benchmark must be specified for LLM fine-tuning."
# Update configuration with provided parameters
if dataset:
FT_RD_SETTING.dataset = dataset
if base_model:
FT_RD_SETTING.base_model = base_model
# Create and run LLM fine-tuning loop
data_set_target = FT_RD_SETTING.dataset if FT_RD_SETTING.dataset else "auto generated dataset"
model_target = FT_RD_SETTING.base_model if FT_RD_SETTING.base_model else "auto selected model"
# Temporary assertion until auto-selection is implemented
assert (
FT_RD_SETTING.base_model is not None
), "Base model auto selection not yet supported, please specify via --base-model"
logger.info(f"Starting LLM fine-tuning on dataset='{data_set_target}' with model='{model_target}'")
if path is None:
loop = LLMFinetuneRDLoop(FT_RD_SETTING)
else:
loop = cast(LLMFinetuneRDLoop, LLMFinetuneRDLoop.load(str(path), checkout=checkout))
asyncio.run(loop.run(step_n=step_n, loop_n=loop_n, all_duration=timeout))
if __name__ == "__main__":
fire.Fire(main)
+1
View File
@@ -0,0 +1 @@
# FT (Fine-tune) scenario UI
+207
View File
@@ -0,0 +1,207 @@
"""
FT (Fine-tune) Timeline Viewer
Hierarchical view: Session > Loop > Stage > EvoLoop > Events
Run:
streamlit run rdagent/app/finetune/llm/ui/app.py
"""
import os
from pathlib import Path
import streamlit as st
from streamlit import session_state as state
from rdagent.app.finetune.llm.ui.benchmarks import get_core_metric_score
from rdagent.app.finetune.llm.ui.components import render_session, render_summary
from rdagent.app.finetune.llm.ui.config import ALWAYS_VISIBLE_TYPES, OPTIONAL_TYPES
from rdagent.app.finetune.llm.ui.data_loader import (
get_summary,
get_valid_sessions,
load_ft_session,
)
from rdagent.app.finetune.llm.ui.ft_summary import render_job_summary
DEFAULT_LOG_BASE = "log/"
def get_job_options(base_path: Path) -> list[str]:
"""
Scan directory and return job options list.
- "." means standalone tasks in root directory
- Others are job directory names
"""
options = []
has_root_tasks = False
job_dirs = []
if not base_path.exists():
return options
for d in base_path.iterdir():
if not d.is_dir():
continue
# Check if standalone task (has __session__ directly)
if (d / "__session__").exists():
has_root_tasks = True
# Check if job directory (subdirs have __session__)
else:
try:
if any((sub / "__session__").exists() for sub in d.iterdir() if sub.is_dir()):
job_dirs.append(d.name)
except PermissionError:
pass
# Sort job dirs by name descending (newest first, since names are date-based)
job_dirs.sort(reverse=True)
# Add job dirs first, then root tasks at the end
options.extend(job_dirs)
if has_root_tasks:
options.append(". (Current)")
return options
def main():
st.set_page_config(layout="wide", page_title="FT Timeline", page_icon="🔬")
# ========== Sidebar ==========
with st.sidebar:
# View mode selection
view_mode = st.radio("View Mode", ["Job Summary", "Single Task"], horizontal=True)
st.divider()
default_log = os.environ.get("FT_LOG_PATH", DEFAULT_LOG_BASE)
job_folder = default_log # Initialize for both modes
selected_types = ALWAYS_VISIBLE_TYPES.copy() # Initialize for both modes
is_root_job = False # Track if viewing root tasks
if view_mode == "Job Summary":
# Job Summary mode
st.header("Job")
base_folder = st.text_input("Base Folder", value=default_log, key="base_folder_input")
base_path = Path(base_folder)
job_options = get_job_options(base_path)
if job_options:
selected_job = st.selectbox("Select Job", job_options, key="job_select")
if selected_job.startswith("."):
job_folder = base_folder
is_root_job = True
else:
job_folder = str(base_path / selected_job)
# Save to session_state for Single Task mode
state.selected_job_folder = job_folder
else:
st.warning("No jobs found in this directory")
job_folder = base_folder
if st.button("Refresh", type="primary", key="refresh_job"):
st.rerun()
else:
# Single Task mode
st.header("Session")
# Use job_folder from Job Summary mode if available
default_path = getattr(state, "selected_job_folder", default_log)
log_folder = st.text_input("Log Folder", value=default_path)
log_path = Path(log_folder)
sessions = get_valid_sessions(log_path)
if not sessions:
st.warning("No valid sessions found")
return
selected_session = st.selectbox("Session", sessions)
if st.button("Load", type="primary") or "session" not in state:
with st.spinner("Loading..."):
state.session = load_ft_session(log_path / selected_session)
state.session_name = selected_session
st.divider()
# Optional type toggles
st.subheader("Show More")
selected_types = ALWAYS_VISIBLE_TYPES.copy()
for event_type, (label, default) in OPTIONAL_TYPES.items():
if st.toggle(label, value=default, key=f"toggle_{event_type}"):
selected_types.append(event_type)
st.divider()
# Display options
st.subheader("Display Options")
state.render_markdown = st.toggle("Render Prompts", value=False, key="render_markdown_toggle")
st.divider()
# Summary in sidebar
if "session" in state:
summary = get_summary(state.session)
st.subheader("Summary")
st.metric("Loops", summary.get("loop_count", 0))
st.metric("LLM Calls", summary.get("llm_call_count", 0))
success = summary.get("docker_success", 0)
fail = summary.get("docker_fail", 0)
st.metric("Docker", f"{success}✓ / {fail}")
# ========== Main Content ==========
if view_mode == "Job Summary":
st.title("📊 FT Job Summary")
job_path = Path(job_folder)
if job_path.exists():
render_job_summary(job_path, is_root=is_root_job)
else:
st.warning(f"Job folder not found: {job_folder}")
return
# Single Task mode
st.title("🔬 FT Timeline Viewer")
if "session" not in state:
st.info("Select a session and click **Load** to view")
return
session = state.session
summary = get_summary(session)
# Global info header (Base Model, Datasets, Benchmark) - compact style
scenario_event = next((e for e in session.init_events if e.type == "scenario"), None)
dataset_event = next((e for e in session.init_events if e.type == "dataset_selection"), None)
if scenario_event or dataset_event:
if scenario_event and hasattr(scenario_event.content, "base_model"):
st.markdown(f"🧠 **Model:** `{scenario_event.content.base_model}`")
if dataset_event:
selected = (
dataset_event.content.get("selected_datasets", []) if isinstance(dataset_event.content, dict) else []
)
if selected:
st.markdown(f"📂 **Datasets:** `{', '.join(selected)}`")
if scenario_event and hasattr(scenario_event.content, "target_benchmark"):
st.markdown(f"🎯 **Benchmark:** `{scenario_event.content.target_benchmark}`")
# Display baseline benchmark score
if scenario_event and hasattr(scenario_event.content, "baseline_benchmark_score"):
baseline = scenario_event.content.baseline_benchmark_score
if baseline and isinstance(baseline, dict):
benchmark_name = getattr(scenario_event.content, "target_benchmark", "")
accuracy_summary = baseline.get("accuracy_summary", {})
if accuracy_summary:
result = get_core_metric_score(benchmark_name, accuracy_summary)
if result:
metric_name, score, _ = result
st.markdown(f"📊 **Baseline:** `{metric_name} = {score:.1f}`")
# Summary bar
render_summary(summary)
st.divider()
# Hierarchical view
render_session(session, selected_types)
if __name__ == "__main__":
main()
@@ -0,0 +1,70 @@
"""Benchmark processors for core metric extraction.
Each benchmark has its own processor that knows how to extract
the core metric name and value from accuracy_summary data.
"""
from .bioprobench import BioProBenchProcessor
from .chemcotbench import ChemCotBenchProcessor
from .financeiq import FinanceIQProcessor
from .panorama import PanoramaProcessor
from .tablebench import TableBenchProcessor
PROCESSORS = [
FinanceIQProcessor,
PanoramaProcessor,
ChemCotBenchProcessor,
TableBenchProcessor,
BioProBenchProcessor,
]
def get_core_metric_score(benchmark_name: str, accuracy_summary: dict) -> tuple[str, float, bool] | None:
"""Get core metric name, score, and direction for a benchmark.
Args:
benchmark_name: The benchmark name (e.g., "FinanceIQ", "panorama_par4pc")
accuracy_summary: {dataset_name: {metric: value, ...}, ...}
Returns:
(metric_name, value, higher_is_better) or None
- metric_name: includes "(average)" suffix if multiple datasets are averaged
- value: the score
- higher_is_better: True if higher values are better (use ↑), False otherwise (use ↓)
"""
for processor in PROCESSORS:
if processor.match(benchmark_name):
return processor.get_core_metric(accuracy_summary)
# Default fallback: use first numeric value with "accuracy" label
scores = []
for ds, metrics in accuracy_summary.items():
if not isinstance(metrics, dict):
continue
if "accuracy" in metrics:
scores.append(float(metrics["accuracy"]))
else:
for v in metrics.values():
if isinstance(v, (int, float)):
scores.append(float(v))
break
if not scores:
return None
avg = sum(scores) / len(scores)
if len(scores) == 1:
return ("accuracy", avg, True) # higher is better
else:
return ("accuracy (average)", avg, True) # higher is better
__all__ = [
"get_core_metric_score",
"PROCESSORS",
"FinanceIQProcessor",
"PanoramaProcessor",
"ChemCotBenchProcessor",
"TableBenchProcessor",
"BioProBenchProcessor",
]
@@ -0,0 +1,53 @@
"""Base class for benchmark core metric extraction."""
from abc import ABC, abstractmethod
class BenchmarkProcessor(ABC):
"""Base class for benchmark core metric extraction."""
# Metrics where higher values are better (default assumption)
# Override in subclass if needed
HIGHER_IS_BETTER: set[str] = {
"accuracy",
"exact_match",
"f1",
"f1_score",
"macro_f1",
"correct_rate",
"success_rate",
"gold_hit_rate",
"score",
"scaffold_hard",
"kendall_tau",
"ROUGE-L",
}
@classmethod
@abstractmethod
def match(cls, benchmark_name: str) -> bool:
"""Check if this processor handles the given benchmark."""
pass
@classmethod
@abstractmethod
def get_core_metric(cls, accuracy_summary: dict) -> tuple[str, float, bool] | None:
"""Extract core metric name, value, and direction from accuracy_summary.
Args:
accuracy_summary: {dataset_name: {metric: value, ...}, ...}
Returns:
(metric_name, value, higher_is_better) or None
- metric_name: includes "(average)" suffix if multiple datasets
- value: the score
- higher_is_better: True if higher values are better, False otherwise
"""
pass
@classmethod
def is_higher_better(cls, metric_name: str) -> bool:
"""Check if higher values are better for this metric."""
# Remove (average) suffix for checking
base_metric = metric_name.replace(" (average)", "").strip()
return base_metric.lower() in {m.lower() for m in cls.HIGHER_IS_BETTER}
@@ -0,0 +1,60 @@
"""BioProBench benchmark processor."""
from .base import BenchmarkProcessor
class BioProBenchProcessor(BenchmarkProcessor):
"""BioProBench: Biology protocol benchmark with different task types."""
CORE_METRICS = {
"pqa": "accuracy",
"ord": "kendall_tau",
"err": "f1",
"gen": "ROUGE-L",
}
@classmethod
def match(cls, benchmark_name: str) -> bool:
return "bioprobench" in benchmark_name.lower()
@classmethod
def get_core_metric(cls, accuracy_summary: dict) -> tuple[str, float, bool] | None:
scores = []
metrics_used = []
for ds, metrics in accuracy_summary.items():
if not isinstance(metrics, dict):
continue
ds_lower = ds.lower()
# Find matching core metric
core_metric = "accuracy" # fallback
for pattern, metric in cls.CORE_METRICS.items():
if pattern in ds_lower:
core_metric = metric
break
if core_metric in metrics:
scores.append(float(metrics[core_metric]))
metrics_used.append(core_metric)
elif core_metric.lower() in [k.lower() for k in metrics.keys()]:
# Case-insensitive fallback for metrics like "ROUGE-L"
for k, v in metrics.items():
if k.lower() == core_metric.lower():
scores.append(float(v))
metrics_used.append(core_metric)
break
if not scores:
return None
avg = sum(scores) / len(scores)
unique = list(set(metrics_used))
if len(scores) == 1:
metric_name = unique[0]
elif len(unique) == 1:
metric_name = f"{unique[0]} (average)"
else:
metric_name = "mixed (average)"
return (metric_name, avg, cls.is_higher_better(metric_name))
@@ -0,0 +1,105 @@
"""ChemCotBench benchmark processor."""
from .base import BenchmarkProcessor
class ChemCotBenchProcessor(BenchmarkProcessor):
"""ChemCotBench: Chemistry reasoning with various subtasks.
All metrics are 0-100 percentages, enabling unified averaging within each subset.
"""
# Define core metric field names for each task
CORE_METRICS = {
# Molecular understanding
"mol_und_fg_count": "accuracy",
"mol_und_ring_count": "accuracy",
"mol_und_murcko_scaffold": "scaffold_hard", # Exact match rate (0-100%)
"mol_und_ring_system_scaffold": "score", # "Yes" ratio (0-100%)
"mol_und_equivalence": "accuracy",
# Molecular editing
"mol_edit_add": "correct_rate",
"mol_edit_delete": "correct_rate",
"mol_edit_sub": "correct_rate",
# Molecular optimization (prefix match)
"mol_opt_": "success_rate",
# Reaction tasks - unified to exact_match
"reaction_fs": "exact_match",
"reaction_retro": "exact_match",
"reaction_nepp": "exact_match",
"reaction_rcr": "exact_match",
"reaction_mechsel": "exact_match", # Will fallback to accuracy if exact_match not found
}
# Metric groups: unified display names for each subset
METRIC_GROUPS = {
"mol_und": "accuracy", # mol_und subset displays as accuracy
"mol_edit": "correct_rate",
"mol_opt": "success_rate",
"reaction": "exact_match", # reaction subset displays as exact_match
}
@classmethod
def match(cls, benchmark_name: str) -> bool:
return "chemcot" in benchmark_name.lower()
@classmethod
def get_core_metric(cls, accuracy_summary: dict) -> tuple[str, float, bool] | None:
scores = []
group_detected = None
for ds, metrics in accuracy_summary.items():
if not isinstance(metrics, dict):
continue
ds_lower = ds.lower()
# Detect subset type
for group in cls.METRIC_GROUPS:
if group in ds_lower:
group_detected = group
break
# Find matching core metric
core_metric = "accuracy" # fallback
for pattern, metric in cls.CORE_METRICS.items():
# Prefix match for patterns ending with _
if pattern.endswith("_"):
if pattern in ds_lower:
core_metric = metric
break
else:
if pattern in ds_lower:
core_metric = metric
break
# Try to get metric value with fallback support
value = None
if core_metric in metrics:
value = float(metrics[core_metric])
elif core_metric == "exact_match" and "accuracy" in metrics:
# reaction_mechsel fallback: exact_match -> accuracy
value = float(metrics["accuracy"])
if value is not None:
scores.append(value)
if not scores:
return None
avg = sum(scores) / len(scores)
# Use unified metric name for the detected subset
if group_detected and group_detected in cls.METRIC_GROUPS:
unified_name = cls.METRIC_GROUPS[group_detected]
if len(scores) == 1:
metric_name = unified_name
else:
metric_name = f"{unified_name} (average)"
else:
# Fallback for unknown subsets
if len(scores) == 1:
metric_name = "accuracy"
else:
metric_name = "accuracy (average)"
return (metric_name, avg, cls.is_higher_better(metric_name))
@@ -0,0 +1,29 @@
"""FinanceIQ benchmark processor."""
from .base import BenchmarkProcessor
class FinanceIQProcessor(BenchmarkProcessor):
"""FinanceIQ: 10 exam subjects, all use accuracy."""
@classmethod
def match(cls, benchmark_name: str) -> bool:
return "financeiq" in benchmark_name.lower()
@classmethod
def get_core_metric(cls, accuracy_summary: dict) -> tuple[str, float, bool] | None:
scores = []
for ds, metrics in accuracy_summary.items():
if not isinstance(metrics, dict):
continue
if "accuracy" in metrics:
scores.append(float(metrics["accuracy"]))
if not scores:
return None
avg = sum(scores) / len(scores)
if len(scores) == 1:
return ("accuracy", avg, True) # higher is better
else:
return ("accuracy (average)", avg, True) # higher is better
@@ -0,0 +1,52 @@
"""Panorama benchmark processor."""
from .base import BenchmarkProcessor
class PanoramaProcessor(BenchmarkProcessor):
"""Panorama: Different sub-datasets use different metrics."""
CORE_METRICS = {
"par4pc": "macro_f1",
"pi4pc": "gold_hit_rate",
"noc4pc": "macro_f1",
}
@classmethod
def match(cls, benchmark_name: str) -> bool:
return "panorama" in benchmark_name.lower()
@classmethod
def get_core_metric(cls, accuracy_summary: dict) -> tuple[str, float, bool] | None:
scores = []
metrics_used = []
for ds, metrics in accuracy_summary.items():
if not isinstance(metrics, dict):
continue
ds_lower = ds.lower()
# Find matching core metric
core_metric = "accuracy" # fallback
for pattern, metric in cls.CORE_METRICS.items():
if pattern in ds_lower:
core_metric = metric
break
if core_metric in metrics:
scores.append(float(metrics[core_metric]))
metrics_used.append(core_metric)
if not scores:
return None
avg = sum(scores) / len(scores)
unique = list(set(metrics_used))
if len(scores) == 1:
metric_name = unique[0]
elif len(unique) == 1:
metric_name = f"{unique[0]} (average)"
else:
metric_name = "mixed (average)"
return (metric_name, avg, cls.is_higher_better(metric_name))
@@ -0,0 +1,60 @@
"""TableBench benchmark processor."""
from .base import BenchmarkProcessor
class TableBenchProcessor(BenchmarkProcessor):
"""TableBench: Table QA with different subtasks."""
CORE_METRICS = {
"fact": "accuracy",
"numerical": "accuracy",
"analysis": "accuracy",
"visualization": "Pass@1", # TableBench visualization uses Pass@1 as core metric
}
# TableBench-specific metrics where higher is better
HIGHER_IS_BETTER = BenchmarkProcessor.HIGHER_IS_BETTER | {
"Pass@1",
"ECR@1",
"Parse@1",
}
@classmethod
def match(cls, benchmark_name: str) -> bool:
return "tablebench" in benchmark_name.lower()
@classmethod
def get_core_metric(cls, accuracy_summary: dict) -> tuple[str, float, bool] | None:
scores = []
metrics_used = []
for ds, metrics in accuracy_summary.items():
if not isinstance(metrics, dict):
continue
ds_lower = ds.lower()
# Find matching core metric
core_metric = "accuracy" # fallback
for pattern, metric in cls.CORE_METRICS.items():
if pattern in ds_lower:
core_metric = metric
break
if core_metric in metrics:
scores.append(float(metrics[core_metric]))
metrics_used.append(core_metric)
if not scores:
return None
avg = sum(scores) / len(scores)
unique = list(set(metrics_used))
if len(scores) == 1:
metric_name = unique[0]
elif len(unique) == 1:
metric_name = f"{unique[0]} (average)"
else:
metric_name = "mixed (average)"
return (metric_name, avg, cls.is_higher_better(metric_name))
+721
View File
@@ -0,0 +1,721 @@
"""
FT UI Components - Hierarchical Event Renderers
"""
import re
from pathlib import Path
from typing import Any
import plotly.graph_objects as go
import streamlit as st
from rdagent.app.finetune.llm.ui.benchmarks import get_core_metric_score
from rdagent.app.finetune.llm.ui.config import ICONS
from rdagent.app.finetune.llm.ui.data_loader import Event, EvoLoop, Loop, Session
def convert_latex_for_streamlit(text: str) -> str:
"""Convert LaTeX syntax to Streamlit-compatible format.
Streamlit uses $...$ and $$...$$ for LaTeX rendering.
This converts \(...\) and \[...\] to the Streamlit format.
"""
if not text:
return text
# Convert \(...\) to $...$
text = text.replace(r"\(", "$").replace(r"\)", "$")
# Convert \[...\] to $$...$$
text = text.replace(r"\[", "$$").replace(r"\]", "$$")
return text
def format_duration(seconds: float | None) -> str:
if seconds is None:
return ""
if seconds < 60:
return f"{seconds:.1f}s"
minutes = int(seconds // 60)
secs = seconds % 60
return f"{minutes}m {secs:.0f}s"
def render_session(session: Session, show_types: list[str]) -> None:
"""Render full session with hierarchy"""
# Init events (before any loop)
if session.init_events:
filtered = [e for e in session.init_events if e.type in show_types]
if filtered:
with st.expander("🚀 **Initialization**", expanded=False):
for event in filtered:
render_event(event)
# Loops
for loop_id in sorted(session.loops.keys()):
loop = session.loops[loop_id]
render_loop(loop, show_types)
def render_loop(loop: Loop, show_types: list[str]) -> None:
"""Render a single loop with lazy loading"""
# 1. Coding stage results
evo_results = []
for evo in loop.coding.values():
if evo.success is True:
evo_results.append("")
elif evo.success is False:
evo_results.append("")
coding_str = f"💻{''.join(evo_results)}" if evo_results else ""
# 2. Running stage results
runner_success = None
benchmark_score = None
for event in loop.runner:
# Docker (Full Train) result - check exit_code, not LLM evaluation
if event.type == "docker_exec" and "Full Train" in event.title and event.success is not None:
runner_success = event.success
# Benchmark score - use core metric from processor
if event.type == "feedback" and "Benchmark Result" in event.title:
content = event.content
if isinstance(content, dict):
benchmark_name = content.get("benchmark_name", "")
accuracy_summary = content.get("accuracy_summary", {})
if isinstance(accuracy_summary, dict) and accuracy_summary:
result = get_core_metric_score(benchmark_name, accuracy_summary)
if result is not None:
_, benchmark_score, _ = result
# 3. Get feedback decision for benchmark score coloring
feedback_decision = None
for event in loop.feedback:
if event.type == "feedback" and "Feedback:" in event.title:
feedback_decision = event.success
break
# 4. Build title string (only show existing stages)
parts = []
if coding_str:
parts.append(coding_str)
if runner_success is not None:
runner_str = "🏃✓" if runner_success else "🏃✗"
parts.append(runner_str)
# Show benchmark score with emoji based on feedback decision
if benchmark_score is not None:
if feedback_decision is True:
parts.append(f"✅📊{benchmark_score:.2f}")
elif feedback_decision is False:
parts.append(f"❌📊{benchmark_score:.2f}")
else:
parts.append(f"📊{benchmark_score:.2f}")
result_str = " ".join(parts) if parts else ""
loop_key = f"loop_{loop.loop_id}_loaded"
with st.expander(f"🔄 **Loop {loop.loop_id}** {result_str}", expanded=False):
if not st.session_state.get(loop_key, False):
# Lazy load: show button first
if st.button("📥 Load Content", key=f"load_{loop.loop_id}"):
st.session_state[loop_key] = True
st.rerun()
else:
# Render actual content
_render_loop_content(loop, show_types)
def _render_loop_content(loop: Loop, show_types: list[str]) -> None:
"""Render loop content (called after lazy load)"""
# Exp Gen
if loop.exp_gen:
filtered = [e for e in loop.exp_gen if e.type in show_types]
if filtered:
st.markdown("#### 🧪 Experiment Generation")
for event in filtered:
render_event(event)
# Coding (Evo Loops)
if loop.coding:
st.markdown("#### 💻 Coding")
for evo_id in sorted(loop.coding.keys()):
evo = loop.coding[evo_id]
render_evo_loop(evo, show_types)
# Runner
if loop.runner:
filtered = [e for e in loop.runner if e.type in show_types]
if filtered:
st.markdown("#### 🏃 Running(Full Train)")
for event in filtered:
render_event(event)
# Feedback
if loop.feedback:
filtered = [e for e in loop.feedback if e.type in show_types]
if filtered:
st.markdown("#### 📊 Feedback")
for event in filtered:
render_event(event)
def render_evo_loop(evo: EvoLoop, show_types: list[str]) -> None:
"""Render evolution loop"""
filtered = [e for e in evo.events if e.type in show_types]
if not filtered:
return
status = "🟢" if evo.success else "🔴" if evo.success is False else ""
with st.expander(f"{status} Evo {evo.evo_id}", expanded=False):
for event in filtered:
render_event(event)
def render_event(event: Event) -> None:
"""Render a single event"""
icon = ICONS.get(event.type, "📌")
duration_str = f" ({format_duration(event.duration)})" if event.duration else ""
status = ""
if event.success is True:
status = "🟢 "
elif event.success is False:
status = "🔴 "
title = f"{event.time_str} {icon} {status}{event.title}{duration_str}"
renderers = {
"scenario": render_scenario,
"llm_call": render_llm_call,
"template": render_template,
"experiment": render_experiment,
"code": render_code,
"docker_exec": render_docker_exec,
"evaluator": render_docker_exec, # Reuse docker_exec renderer for evaluator feedback
"feedback": render_feedback,
"token": render_token,
"time": render_time_info,
"settings": render_settings,
"hypothesis": render_hypothesis,
"dataset_selection": render_dataset_selection,
}
renderer = renderers.get(event.type, render_generic)
with st.expander(title, expanded=False):
# Pass event.title to docker_exec/evaluator renderers for context-aware labels
if event.type in ("docker_exec", "evaluator"):
renderer(event.content, event.title)
else:
renderer(event.content)
def render_scenario(content: Any) -> None:
"""Render scenario details (main info shown in page header, this shows extras)."""
import json
# 1. User target scenario
if hasattr(content, "user_target_scenario") and content.user_target_scenario:
st.markdown(f"**Target Scenario:** {content.user_target_scenario}")
# 2. Benchmark description
if hasattr(content, "benchmark_description") and content.benchmark_description:
st.markdown(f"**Benchmark Description:** {content.benchmark_description}")
# 3. Full timeout
if hasattr(content, "real_full_timeout"):
try:
timeout_hours = content.real_full_timeout() / 60 / 60
st.markdown(f"**Full Train Timeout:** {timeout_hours:.2f} hours")
except Exception:
pass
# 4. Device info - formatted nicely
if hasattr(content, "device_info") and content.device_info:
device = content.device_info
# Parse string to dict if needed
if isinstance(device, str):
try:
device = json.loads(device)
except json.JSONDecodeError:
st.markdown(f"**Device:** `{device}`")
device = None
if isinstance(device, dict):
parts = []
# Runtime info
runtime = device.get("runtime", {})
if runtime.get("python_version"):
parts.append(f"🐍 Python `{runtime['python_version'].split()[0]}`")
if runtime.get("os"):
parts.append(f"💻 {runtime['os']}")
# GPU info
gpu_info = device.get("gpu", {})
gpus = gpu_info.get("gpus", [])
if gpus:
gpu_name = gpus[0].get("name", "Unknown")
gpu_mem_gb = gpus[0].get("memory_total_gb", 0)
if len(gpus) > 1:
parts.append(f"🎮 {len(gpus)}x {gpu_name} ({gpu_mem_gb}GB)")
else:
parts.append(f"🎮 {gpu_name} ({gpu_mem_gb}GB)")
if parts:
st.markdown(" · ".join(parts))
# 5. Model info (detailed specs)
if hasattr(content, "model_info") and content.model_info:
model_info = content.model_info
if isinstance(model_info, dict) and model_info:
with st.expander("Model Info", expanded=False):
# Show key specs in a readable format
if "specs" in model_info and model_info["specs"]:
st.markdown("**Specs:**")
st.code(model_info["specs"], language="text", wrap_lines=True)
# Show other fields
other_info = {k: v for k, v in model_info.items() if k != "specs" and v}
if other_info:
st.json(other_info)
# 6. Memory report (estimation based on hardware and model)
if hasattr(content, "memory_report") and content.memory_report:
with st.expander("Memory Estimation", expanded=False):
st.code(content.memory_report, language="text", wrap_lines=True)
def render_dataset_selection(content: Any) -> None:
if not isinstance(content, dict):
st.json(content) if content else st.info("No content")
return
selected = content.get("selected_datasets", [])
total = content.get("total_datasets", 0)
reasoning = content.get("reasoning", "")
if selected:
st.markdown(f"**Selected ({len(selected)}/{total}):** " + ", ".join(f"`{ds}`" for ds in selected))
if reasoning:
with st.expander("Selection Reasoning", expanded=True):
st.markdown(reasoning)
def render_hypothesis(content: Any) -> None:
"""Render hypothesis content (Base Model shown in page header, not here)."""
if hasattr(content, "hypothesis") and content.hypothesis:
st.markdown("**Hypothesis:**")
st.markdown(content.hypothesis)
if hasattr(content, "reason") and content.reason:
with st.expander("Reason", expanded=False):
st.markdown(content.reason)
def render_settings(content: Any) -> None:
if isinstance(content, dict):
st.json(content)
else:
st.code(str(content), wrap_lines=True)
def render_llm_call(content: Any) -> None:
if not isinstance(content, dict):
st.json(content) if content else st.info("No content")
return
if content.get("start") and content.get("end"):
duration = (content["end"] - content["start"]).total_seconds()
st.caption(f"Duration: {format_duration(duration)}")
# Check if markdown rendering is enabled
render_md = st.session_state.get("render_markdown_toggle", False)
system = content.get("system", "")
if system:
with st.expander("System Prompt", expanded=False):
if render_md:
st.markdown(system)
else:
st.code(system, language="text", line_numbers=True, wrap_lines=True)
user = content.get("user", "")
if user:
with st.expander("User Prompt", expanded=False):
if render_md:
st.markdown(user)
else:
st.code(user, language="text", line_numbers=True, wrap_lines=True)
resp = content.get("resp", "")
if resp:
st.markdown("**Response:**")
if render_md:
st.markdown(resp)
elif resp.strip().startswith("{") or resp.strip().startswith("["):
st.code(resp, language="json", line_numbers=True, wrap_lines=True)
elif resp.strip().startswith("```"):
st.markdown(resp)
else:
st.code(resp, language="text", line_numbers=True, wrap_lines=True)
def render_template(content: Any) -> None:
if not isinstance(content, dict):
st.json(content) if content else st.info("No content")
return
uri = content.get("uri", "")
st.caption(f"URI: `{uri}`")
context = content.get("context", {})
if context:
with st.expander("Context Variables", expanded=False):
st.json(context)
template = content.get("template", "")
if template:
with st.expander("Template", expanded=False):
st.code(template, language="text", line_numbers=True, wrap_lines=True)
rendered = content.get("rendered", "")
if rendered:
with st.expander("Rendered", expanded=True):
st.code(rendered, language="text", line_numbers=True, wrap_lines=True)
def render_experiment(content: Any) -> None:
"""Render experiment tasks (Base Model and Datasets shown in page header, not here)."""
if isinstance(content, list):
for i, task in enumerate(content):
if len(content) > 1:
st.markdown(f"**Task {i}**")
if hasattr(task, "description") and task.description:
st.markdown("**Description:**")
st.markdown(task.description)
else:
st.json(content) if content else st.info("No content")
def render_code(content: Any) -> None:
if not isinstance(content, list):
st.info("No code available")
return
for i, ws in enumerate(content):
if not hasattr(ws, "file_dict") or not ws.file_dict:
continue
if len(content) > 1:
st.markdown(f"**Workspace {i}**")
for filename, code in ws.file_dict.items():
lang = "yaml" if filename.endswith((".yaml", ".yml")) else "python"
with st.expander(filename, expanded=False):
st.code(code, language=lang, line_numbers=True, wrap_lines=True)
def _extract_evaluator_name(title: str) -> str:
"""Extract evaluator name from event title like 'Eval (Data Processing) ✓'."""
match = re.search(r"\(([^)]+)\)", title)
return match.group(1) if match else ""
def _render_single_feedback(fb: Any, evaluator_name: str = "") -> None:
"""Render a single CoSTEERSingleFeedback object.
Structure:
- execution: LLM-generated execution summary (what happened, success/failure reason)
- raw_execution: Raw script stdout/stderr output
- return_checking: LLM-generated data quality assessment
- code: LLM-generated code improvement suggestions
"""
decision = getattr(fb, "final_decision", None)
if decision is True:
st.success("Execution: PASS")
elif decision is False:
st.error("Execution: FAIL")
# 1. Execution Summary (LLM-generated)
execution = getattr(fb, "execution", "")
if execution:
label = f"{evaluator_name} Summary" if evaluator_name else "Execution Summary"
with st.expander(label, expanded=True):
st.code(execution, language="text", line_numbers=True, wrap_lines=True)
# 2. Raw Execution Log (script stdout)
raw_execution = getattr(fb, "raw_execution", "")
if raw_execution:
with st.expander("Raw Output (stdout)", expanded=False):
st.code(raw_execution, language="text", line_numbers=True, wrap_lines=True)
# 3. Data Quality Check (LLM-generated)
return_checking = getattr(fb, "return_checking", "")
if return_checking:
with st.expander("Data Quality Check", expanded=False):
st.code(return_checking, language="text", line_numbers=True, wrap_lines=True)
# 4. Code Improvement Suggestions (LLM-generated, often very long)
code_fb = getattr(fb, "code", "")
if code_fb:
with st.expander("Code Improvement Suggestions", expanded=False):
# Use markdown rendering if content contains markdown formatting
if "**" in code_fb or "```" in code_fb or "- " in code_fb:
st.markdown(code_fb)
else:
st.code(code_fb, language="text", line_numbers=True, wrap_lines=True)
def render_docker_exec(content: Any, event_title: str = "") -> None:
# Extract evaluator name from event title for context-aware labels
evaluator_name = _extract_evaluator_name(event_title)
# Docker run raw output (dict with exit_code/stdout)
if isinstance(content, dict) and ("exit_code" in content or "stdout" in content or "success" in content):
# Show workspace ID if available (only the UUID part)
workspace_path = content.get("workspace_path")
if workspace_path:
workspace_id = Path(workspace_path).name
st.caption(f"📁 `{workspace_id}`")
exit_code = content.get("exit_code")
success = content.get("success")
if exit_code is not None:
if exit_code == 0:
st.success(f"Exit code: {exit_code}")
else:
st.error(f"Exit code: {exit_code}")
elif success is not None:
if success:
st.success("Execution: PASS")
else:
st.error("Execution: FAIL")
stdout = content.get("stdout", "")
if stdout:
label = f"{evaluator_name} Output" if evaluator_name else "Execution Output"
with st.expander(label, expanded=True):
st.code(stdout, language="text", line_numbers=True, wrap_lines=True)
return
# CoSTEERMultiFeedback (has feedback_list)
if hasattr(content, "feedback_list"):
for i, fb in enumerate(content.feedback_list):
if len(content.feedback_list) > 1:
st.markdown(f"**Feedback {i}**")
_render_single_feedback(fb, evaluator_name)
return
# Single CoSTEERSingleFeedback (has final_decision)
if hasattr(content, "final_decision"):
_render_single_feedback(content, evaluator_name)
return
# FTExperiment (runner result)
if hasattr(content, "sub_workspace_list"):
for ws in content.sub_workspace_list:
if not hasattr(ws, "running_info") or ws.running_info is None:
continue
info = ws.running_info
running_time = getattr(info, "running_time", None)
if running_time:
st.metric("Running Time", f"{running_time:.1f}s")
stdout = getattr(info, "stdout", "")
if stdout:
with st.expander("Full Train Log", expanded=True):
st.code(stdout, language="text", line_numbers=True, wrap_lines=True)
result = getattr(info, "result", {})
if result:
render_training_result(result)
return
st.json(content) if content else st.info("No content")
def render_feedback(content: Any) -> None:
# Handle benchmark result (dict with accuracy_summary)
if isinstance(content, dict) and "accuracy_summary" in content:
render_benchmark_result(content)
return
col1, col2, col3 = st.columns(3)
with col1:
decision = getattr(content, "decision", None)
if decision is not None:
st.metric("Decision", "Accept" if decision else "Reject")
with col2:
acceptable = getattr(content, "acceptable", None)
if acceptable is not None:
st.metric("Acceptable", "Yes" if acceptable else "No")
with col3:
error_type = getattr(content, "observations", None)
if error_type:
st.metric("Error Type", error_type)
# FT scenario only uses code_change_summary (observations, hypothesis_evaluation,
# new_hypothesis, eda_improvement are DS scenario specific)
fields = [
("code_change_summary", "Code Change Summary"),
]
for attr, label in fields:
value = getattr(content, attr, None)
if value:
with st.expander(label, expanded=False):
st.markdown(value)
reason = getattr(content, "reason", None)
if reason:
with st.expander("Reason (Full Details)", expanded=True):
st.code(reason, language="text", line_numbers=True, wrap_lines=True)
exception = getattr(content, "exception", None)
if exception:
st.error(f"Exception: {exception}")
def render_token(content: Any) -> None:
if isinstance(content, dict):
col1, col2, col3 = st.columns(3)
with col1:
st.metric("Prompt", content.get("prompt_tokens", 0))
with col2:
st.metric("Completion", content.get("completion_tokens", 0))
with col3:
st.metric("Total", content.get("total_tokens", 0))
else:
st.json(content) if content else st.info("No content")
def render_time_info(content: Any) -> None:
if isinstance(content, dict):
for k, v in content.items():
st.metric(k, f"{v:.1f}s" if isinstance(v, (int, float)) else str(v))
else:
st.json(content) if content else st.info("No content")
def render_generic(content: Any) -> None:
if hasattr(content, "__dict__"):
st.json(vars(content))
elif content:
st.json(content)
else:
st.info("No content")
def render_training_result(result: dict) -> None:
training_metrics = result.get("training_metrics", {})
loss_history = training_metrics.get("loss_history", {})
# loss_history is Dict[str, List[Dict]] with "train" and "eval" keys
train_history = loss_history.get("train", []) if isinstance(loss_history, dict) else []
if train_history:
fig = go.Figure()
steps = [entry.get("step", i) for i, entry in enumerate(train_history)]
losses = [entry.get("loss", 0) for entry in train_history]
fig.add_trace(go.Scatter(x=steps, y=losses, mode="lines+markers", name="Loss"))
fig.update_layout(title="Training Loss", xaxis_title="Step", yaxis_title="Loss", height=300)
st.plotly_chart(fig, use_container_width=True)
col1, col2 = st.columns(2)
initial_loss = training_metrics.get("initial_loss")
final_loss = training_metrics.get("final_loss")
if initial_loss:
col1.metric("Initial Loss", f"{initial_loss:.4f}")
if final_loss:
col2.metric("Final Loss", f"{final_loss:.4f}")
# Validation benchmark ([:100]) - used for SOTA judgment
benchmark = result.get("benchmark", {})
if benchmark:
st.markdown("**Validation Benchmark**")
# Detect format: old format has "accuracy_summary" at top level,
# new format has benchmark names as keys with nested accuracy_summary
if "accuracy_summary" in benchmark:
# Old format: {accuracy_summary: {...}, error_samples: [...]}
accuracy_summary = benchmark.get("accuracy_summary", {})
if accuracy_summary:
rows = [{"dataset": ds, **metrics} for ds, metrics in accuracy_summary.items()]
st.dataframe(rows)
else:
# New format: {bm_name: {accuracy_summary: {...}}, ...}
for bm_name, bm_result in benchmark.items():
if isinstance(bm_result, dict) and "accuracy_summary" in bm_result:
st.markdown(f"*{bm_name}:*")
accuracy_summary = bm_result.get("accuracy_summary", {})
if accuracy_summary:
rows = [{"dataset": ds, **metrics} for ds, metrics in accuracy_summary.items()]
st.dataframe(rows)
# Test benchmark ([100:200]) - frontend display only, not visible to agent
benchmark_test = result.get("benchmark_test", {})
if benchmark_test and benchmark_test != benchmark: # Avoid duplicate display for small datasets
st.markdown("**Test Benchmark**")
if "accuracy_summary" in benchmark_test:
accuracy_summary = benchmark_test.get("accuracy_summary", {})
if accuracy_summary:
rows = [{"dataset": ds, **metrics} for ds, metrics in accuracy_summary.items()]
st.dataframe(rows)
else:
for bm_name, bm_result in benchmark_test.items():
if isinstance(bm_result, dict) and "accuracy_summary" in bm_result:
st.markdown(f"*{bm_name}:*")
accuracy_summary = bm_result.get("accuracy_summary", {})
if accuracy_summary:
rows = [{"dataset": ds, **metrics} for ds, metrics in accuracy_summary.items()]
st.dataframe(rows)
def render_benchmark_result(content: dict) -> None:
"""Render benchmark evaluation result"""
import pandas as pd
benchmark_name = content.get("benchmark_name", "Unknown")
st.markdown(f"**Benchmark: {benchmark_name}**")
# Accuracy summary table
# accuracy_summary is a dict: {dataset_name: {metric: value, ...}, ...}
accuracy_summary = content.get("accuracy_summary", {})
if accuracy_summary and isinstance(accuracy_summary, dict):
st.markdown("**Accuracy Summary:**")
# Convert dict {dataset: {metric: value}} to list of dicts for dataframe
rows = []
for ds, metrics in accuracy_summary.items():
row = {"dataset": ds, **metrics}
rows.append(row)
# Create DataFrame and reorder columns
df = pd.DataFrame(rows)
cols = ["dataset"] + [c for c in df.columns if c != "dataset"]
df = df[cols]
st.dataframe(df)
# Error samples
error_samples = content.get("error_samples", [])
if error_samples:
with st.expander(f"Error Samples ({len(error_samples)})", expanded=False):
for i, sample in enumerate(error_samples):
with st.expander(f"Sample {i+1} (Gold: {sample.get('gold', 'N/A')})", expanded=False):
st.markdown(
'<div style="font-size: 0.85em;">',
unsafe_allow_html=True,
)
st.markdown("**Question:**")
st.markdown(convert_latex_for_streamlit(sample.get("question", "N/A")))
st.markdown("---")
st.markdown(f"**Gold:** `{sample.get('gold', 'N/A')}`")
st.markdown("---")
st.markdown("**Model Output:**")
st.markdown(convert_latex_for_streamlit(sample.get("model_output", "N/A")))
st.markdown("</div>", unsafe_allow_html=True)
def render_summary(summary: dict) -> None:
col1, col2, col3, col4 = st.columns(4)
with col1:
st.metric("Loops", summary.get("loop_count", 0))
with col2:
st.metric("LLM Calls", summary.get("llm_call_count", 0))
with col3:
llm_time = summary.get("llm_total_time", 0)
st.metric("LLM Time", format_duration(llm_time))
with col4:
success = summary.get("docker_success", 0)
fail = summary.get("docker_fail", 0)
st.metric("Executions", f"{success}✓ / {fail}")
+69
View File
@@ -0,0 +1,69 @@
"""
FT UI Configuration Constants
Centralized configuration for FT Timeline Viewer.
"""
from typing import Literal
# Event type definition
EventType = Literal[
"scenario",
"llm_call",
"template",
"experiment",
"code",
"docker_exec",
"evaluator", # Evaluator feedback (separate from docker_exec)
"feedback",
"token",
"time",
"settings",
"hypothesis",
"dataset_selection",
]
# Event type icons
ICONS = {
"scenario": "🎯",
"llm_call": "💬",
"template": "📋",
"experiment": "🧪",
"code": "📄",
"docker_exec": "🐳",
"evaluator": "📝", # Evaluator feedback icon
"feedback": "📊",
"token": "🔢",
"time": "⏱️",
"settings": "⚙️",
"hypothesis": "💡",
"dataset_selection": "📂",
}
# Evaluator configuration mapping (name, default_stage)
EVALUATOR_CONFIG = {
"FTDataEvaluator": ("Data Processing", "coding"),
"FTCoderEvaluator": ("Micro-batch Test", "coding"),
"FTRunnerEvaluator": ("Full Train", "runner"),
}
# Always visible event types
ALWAYS_VISIBLE_TYPES = [
"scenario",
"dataset_selection",
"hypothesis",
"llm_call",
"experiment",
"code",
"docker_exec",
"evaluator",
"feedback",
]
# Optional event types with toggle config (label, default_enabled)
OPTIONAL_TYPES = {
"template": ("📋 Template", False),
"token": ("🔢 Token", False),
"time": ("⏱️ Time", False),
"settings": ("⚙️ Settings", False),
}
+455
View File
@@ -0,0 +1,455 @@
"""
FT UI Data Loader
Load pkl logs and convert to hierarchical timeline structure
"""
import re
from dataclasses import dataclass, field
from datetime import datetime
from pathlib import Path
from typing import Any
import streamlit as st
from rdagent.app.finetune.llm.ui.config import EVALUATOR_CONFIG, EventType
from rdagent.log.storage import FileStorage
@dataclass
class Event:
"""Timeline event"""
type: EventType
timestamp: datetime
tag: str
title: str
content: Any
loop_id: int | None = None
evo_id: int | None = None
stage: str = ""
duration: float | None = None
success: bool | None = None
@property
def time_str(self) -> str:
return self.timestamp.strftime("%H:%M:%S")
@dataclass
class EvoLoop:
"""Evolution loop containing events"""
evo_id: int
events: list[Event] = field(default_factory=list)
success: bool | None = None
@dataclass
class Loop:
"""Main loop containing stages"""
loop_id: int
exp_gen: list[Event] = field(default_factory=list)
coding: dict[int, EvoLoop] = field(default_factory=dict) # evo_id -> EvoLoop
runner: list[Event] = field(default_factory=list)
feedback: list[Event] = field(default_factory=list)
@dataclass
class Session:
"""Session containing init events and loops"""
init_events: list[Event] = field(default_factory=list)
loops: dict[int, Loop] = field(default_factory=dict) # loop_id -> Loop
def extract_loop_id(tag: str) -> int | None:
match = re.search(r"Loop_(\d+)", tag)
return int(match.group(1)) if match else None
def extract_evo_id(tag: str) -> int | None:
match = re.search(r"evo_loop_(\d+)", tag)
return int(match.group(1)) if match else None
def extract_stage(tag: str) -> str:
if "direct_exp_gen" in tag:
return "exp_gen"
if "coding" in tag:
return "coding"
if "running" in tag: # Note: tag uses "running", not "runner"
return "runner"
if "feedback" in tag:
return "feedback"
return ""
def get_valid_sessions(log_folder: Path) -> list[str]:
if not log_folder.exists():
return []
sessions = []
for d in log_folder.iterdir():
if d.is_dir() and d.joinpath("__session__").exists():
sessions.append(d.name)
return sorted(sessions, reverse=True)
def parse_event(tag: str, content: Any, timestamp: datetime) -> Event | None:
loop_id = extract_loop_id(tag)
evo_id = extract_evo_id(tag)
stage = extract_stage(tag)
# Scenario
if tag == "scenario":
model = getattr(content, "base_model", "Unknown")
return Event(type="scenario", timestamp=timestamp, tag=tag, title=f"Scenario: {model}", content=content)
# Dataset selection
if "dataset_selection" in tag:
selected = content.get("selected_datasets", []) if isinstance(content, dict) else []
total = content.get("total_datasets", 0) if isinstance(content, dict) else 0
return Event(
type="dataset_selection",
timestamp=timestamp,
tag=tag,
title=f"Dataset Selection: {len(selected)}/{total}",
content=content,
)
# Settings
if "SETTINGS" in tag:
name = tag.replace("_SETTINGS", "").replace("SETTINGS", "")
return Event(type="settings", timestamp=timestamp, tag=tag, title=f"Settings: {name}", content=content)
# Hypothesis
if tag == "hypothesis" or (loop_id is not None and "hypothesis" in tag):
return Event(
type="hypothesis",
timestamp=timestamp,
tag=tag,
title="Hypothesis",
content=content,
loop_id=loop_id,
stage="exp_gen",
)
# LLM Call
if "debug_llm" in tag:
if isinstance(content, dict) and ("user" in content or "system" in content):
duration = None
if content.get("start") and content.get("end"):
duration = (content["end"] - content["start"]).total_seconds()
return Event(
type="llm_call",
timestamp=timestamp,
tag=tag,
title="LLM Call",
content=content,
loop_id=loop_id,
evo_id=evo_id,
stage=stage,
duration=duration,
)
# Template
if "debug_tpl" in tag:
if isinstance(content, dict) and "uri" in content:
uri = content.get("uri", "")
tpl_name = uri.split(":")[-1] if ":" in uri else uri
return Event(
type="template",
timestamp=timestamp,
tag=tag,
title=f"Template: {tpl_name}",
content=content,
loop_id=loop_id,
evo_id=evo_id,
stage=stage,
)
# Experiment generation
if "experiment generation" in tag:
task_count = len(content) if isinstance(content, list) else 1
return Event(
type="experiment",
timestamp=timestamp,
tag=tag,
title=f"Experiment ({task_count} task)",
content=content,
loop_id=loop_id,
stage=stage,
)
# Evolving code
if "evolving code" in tag:
file_count = 0
if isinstance(content, list):
for ws in content:
if hasattr(ws, "file_dict"):
file_count += len(ws.file_dict)
return Event(
type="code",
timestamp=timestamp,
tag=tag,
title=f"Code ({file_count} files)",
content=content,
loop_id=loop_id,
evo_id=evo_id,
stage=stage or "coding",
)
# Benchmark execution (Docker or Conda) - must check before generic docker_run/conda_run
if "docker_run.Benchmark" in tag or "conda_run.Benchmark" in tag:
benchmark_name = content.get("benchmark_name", "Unknown") if isinstance(content, dict) else "Unknown"
exit_code = content.get("exit_code") if isinstance(content, dict) else None
success = exit_code == 0 if exit_code is not None else None
env_type = "Docker" if "docker_run" in tag else "Conda"
return Event(
type="docker_exec",
timestamp=timestamp,
tag=tag,
title=f"Benchmark ({benchmark_name}) [{env_type}] {'' if success else '' if success is False else ''}",
content=content,
loop_id=loop_id,
stage="runner",
success=success,
)
# Environment run (Docker or Conda, raw execution logged before LLM evaluation)
if "docker_run." in tag or "conda_run." in tag:
is_docker = "docker_run." in tag
tag_prefix = "docker_run." if is_docker else "conda_run."
class_name = tag.split(tag_prefix)[-1].split(".")[0]
# FTWorkspace unified logging - determine type from entry command
if class_name == "FTWorkspace":
entry = content.get("entry", "") if isinstance(content, dict) else ""
if "llamafactory-cli train" in entry:
# Distinguish by yaml file name: debug_train.yaml for micro-batch, train.yaml for full training
if "debug_train.yaml" in entry:
evaluator_name, default_stage = "Micro-batch Test", "coding"
else:
evaluator_name, default_stage = "Full Train", "runner"
elif "process_data" in entry.lower():
evaluator_name, default_stage = "Data Processing", "coding"
elif entry.startswith("rm "):
evaluator_name, default_stage = "Cleanup", "runner"
else:
evaluator_name, default_stage = "Env Run", "coding"
else:
evaluator_name, default_stage = EVALUATOR_CONFIG.get(class_name, (class_name, "coding"))
exit_code = content.get("exit_code") if isinstance(content, dict) else None
success = exit_code == 0 if exit_code is not None else content.get("success")
env_label = "Docker" if is_docker else "Conda"
title = f"{env_label} ({evaluator_name}) {'' if success else '' if success is False else ''}"
return Event(
type="docker_exec",
timestamp=timestamp,
tag=tag,
title=title,
content=content,
loop_id=loop_id,
evo_id=evo_id,
stage=stage or default_stage,
success=success,
)
# Docker execution (individual evaluator feedback, logged after LLM evaluation)
if "docker_exec." in tag:
class_name = tag.split("docker_exec.")[-1].split(".")[0]
evaluator_name, default_stage = EVALUATOR_CONFIG.get(class_name, (class_name, "coding"))
success = getattr(content, "final_decision", None)
title = f"Eval ({evaluator_name}) {'' if success else '' if success is False else '?'}"
return Event(
type="docker_exec",
timestamp=timestamp,
tag=tag,
title=title,
content=content,
loop_id=loop_id,
evo_id=evo_id,
stage=stage or default_stage,
success=success,
)
# Evaluator feedback (logged from FT evaluators with final_decision)
if "evaluator_feedback." in tag:
class_name = tag.split("evaluator_feedback.")[-1].split(".")[0]
evaluator_name, default_stage = EVALUATOR_CONFIG.get(class_name, (class_name, "coding"))
success = getattr(content, "final_decision", None)
title = f"Eval ({evaluator_name}) {'' if success else '' if success is False else '?'}"
return Event(
type="evaluator", # Use dedicated evaluator type with 📝 icon
timestamp=timestamp,
tag=tag,
title=title,
content=content,
loop_id=loop_id,
evo_id=evo_id,
stage=stage or default_stage,
success=success,
)
# Final feedback
if "feedback.feedback" in tag or (tag.endswith(".feedback") and "evo_loop" not in tag):
decision = getattr(content, "decision", None)
return Event(
type="feedback",
timestamp=timestamp,
tag=tag,
title=f"Feedback: {'Accept' if decision else 'Reject'}",
content=content,
loop_id=loop_id,
stage="feedback",
success=decision,
)
# Benchmark result (supports benchmark_result, benchmark_result.validation, benchmark_result.test)
if "benchmark_result" in tag:
benchmark_name = content.get("benchmark_name", "Unknown") if isinstance(content, dict) else "Unknown"
accuracy = content.get("accuracy_summary", {}) if isinstance(content, dict) else {}
# Extract split from tag or content
split = content.get("split", "") if isinstance(content, dict) else ""
if not split and "." in tag:
split = tag.split(".")[-1] # e.g., "validation" or "test" from "benchmark_result.validation"
split_label = f" [{split.title()}]" if split and split != "default" else ""
return Event(
type="feedback",
timestamp=timestamp,
tag=tag,
title=f"Benchmark Result{split_label} ({benchmark_name}: {len(accuracy)} datasets)",
content=content,
loop_id=loop_id,
stage="runner",
)
# Runner result
if "runner result" in tag:
return Event(
type="docker_exec",
timestamp=timestamp,
tag=tag,
title="Full Train",
content=content,
loop_id=loop_id,
stage="runner",
)
# Token cost
if "token_cost" in tag:
if isinstance(content, dict):
total = content.get("total_tokens", 0)
return Event(
type="token",
timestamp=timestamp,
tag=tag,
title=f"Token: {total}",
content=content,
loop_id=loop_id,
evo_id=evo_id,
stage=stage,
)
# Time info
if "time_info" in tag:
return Event(
type="time", timestamp=timestamp, tag=tag, title="Time Info", content=content, loop_id=loop_id, stage=stage
)
return None
@st.cache_data(ttl=300, hash_funcs={Path: str})
def load_ft_session(log_path: Path) -> Session:
"""Load events into hierarchical session structure"""
session = Session()
storage = FileStorage(log_path)
events = []
for msg in storage.iter_msg():
if not msg.tag:
continue
event = parse_event(msg.tag, msg.content, msg.timestamp)
if event:
events.append(event)
# Sort by timestamp
events.sort(key=lambda e: e.timestamp)
# Organize into hierarchy
for event in events:
if event.loop_id is None:
session.init_events.append(event)
continue
# Ensure loop exists
if event.loop_id not in session.loops:
session.loops[event.loop_id] = Loop(loop_id=event.loop_id)
loop = session.loops[event.loop_id]
# Place event in appropriate stage
if event.stage == "exp_gen":
loop.exp_gen.append(event)
elif event.stage == "coding":
if event.evo_id is not None:
if event.evo_id not in loop.coding:
loop.coding[event.evo_id] = EvoLoop(evo_id=event.evo_id)
evo = loop.coding[event.evo_id]
evo.events.append(event)
# Use evaluator feedback (final_decision) for evo success, fallback to docker_exec
if event.type in ("evaluator", "docker_exec") and event.success is not None:
if evo.success is None:
evo.success = event.success
else:
evo.success = evo.success and event.success # AND logic: all evaluators must pass
else:
# Coding events without evo_id go to evo 0
if 0 not in loop.coding:
loop.coding[0] = EvoLoop(evo_id=0)
loop.coding[0].events.append(event)
elif event.stage == "runner":
loop.runner.append(event)
elif event.stage == "feedback":
loop.feedback.append(event)
else:
# Unknown stage - put in exp_gen
loop.exp_gen.append(event)
return session
def get_summary(session: Session) -> dict:
"""Get summary statistics"""
llm_calls = []
docker_execs = []
# Collect from init
for e in session.init_events:
if e.type == "llm_call":
llm_calls.append(e)
elif e.type == "docker_exec":
docker_execs.append(e)
# Collect from loops
for loop in session.loops.values():
for e in loop.exp_gen + loop.runner + loop.feedback:
if e.type == "llm_call":
llm_calls.append(e)
elif e.type == "docker_exec":
docker_execs.append(e)
for evo in loop.coding.values():
for e in evo.events:
if e.type == "llm_call":
llm_calls.append(e)
elif e.type == "docker_exec":
docker_execs.append(e)
return {
"loop_count": len(session.loops),
"llm_call_count": len(llm_calls),
"llm_total_time": sum(e.duration or 0 for e in llm_calls),
"docker_success": sum(1 for e in docker_execs if e.success is True),
"docker_fail": sum(1 for e in docker_execs if e.success is False),
}
+587
View File
@@ -0,0 +1,587 @@
"""
FT Job Summary View
Display summary table for all tasks in a job directory
"""
import pickle
from pathlib import Path
import pandas as pd
import streamlit as st
from pandas.io.formats.style import Styler
from rdagent.app.finetune.llm.ui.benchmarks import get_core_metric_score
def is_valid_task(task_path: Path) -> bool:
"""Check if directory is a valid FT task (has __session__ subdirectory)"""
return task_path.is_dir() and (task_path / "__session__").exists()
def get_loop_dirs(task_path: Path) -> list[Path]:
"""Get sorted list of Loop directories"""
loops = [d for d in task_path.iterdir() if d.is_dir() and d.name.startswith("Loop_")]
return sorted(loops, key=lambda d: int(d.name.split("_")[1]))
def extract_benchmark_score(loop_path: Path, split: str = "") -> tuple[str, float, bool] | None:
"""Extract benchmark score, metric name, and direction from loop directory.
Args:
loop_path: Path to loop directory
split: Filter by split type ("validation", "test", or "" for any)
Returns:
(metric_name, score, higher_is_better) or None
- metric_name includes "(average)" suffix if multiple datasets are averaged
- higher_is_better: True if higher values are better
"""
for pkl_file in loop_path.rglob("**/benchmark_result*/**/*.pkl"):
try:
with open(pkl_file, "rb") as f:
content = pickle.load(f)
if isinstance(content, dict):
# Check split filter
content_split = content.get("split", "")
if split and content_split != split:
continue
benchmark_name = content.get("benchmark_name", "")
accuracy_summary = content.get("accuracy_summary", {})
if isinstance(accuracy_summary, dict) and accuracy_summary:
result = get_core_metric_score(benchmark_name, accuracy_summary)
if result is not None:
return result
except Exception:
pass
return None
def extract_benchmark_scores(loop_path: Path) -> dict[str, tuple[str, float, bool] | None]:
"""Extract both validation and test benchmark scores from loop directory.
Returns:
Dict with keys "validation" and "test", each containing
(metric_name, score, higher_is_better) or None
"""
return {
"validation": extract_benchmark_score(loop_path, split="validation"),
"test": extract_benchmark_score(loop_path, split="test"),
}
def extract_baseline_score(task_path: Path) -> tuple[str, float] | None:
"""Extract baseline benchmark score from scenario object (legacy, validation only).
Returns:
(metric_name, score) or None
"""
scenario_dir = task_path / "scenario"
if not scenario_dir.exists():
return None
for pkl_file in scenario_dir.rglob("*.pkl"):
try:
with open(pkl_file, "rb") as f:
scenario = pickle.load(f)
baseline_score = getattr(scenario, "baseline_benchmark_score", None)
if baseline_score and isinstance(baseline_score, dict):
benchmark_name = getattr(scenario, "target_benchmark", "")
accuracy_summary = baseline_score.get("accuracy_summary", {})
if isinstance(accuracy_summary, dict) and accuracy_summary:
result = get_core_metric_score(benchmark_name, accuracy_summary)
if result is not None:
metric_name, score, _ = result
return metric_name, score
except Exception:
pass
return None
def extract_baseline_scores(task_path: Path) -> dict[str, tuple[str, float, bool] | None]:
"""Extract both validation and test baseline benchmark scores from scenario.
Returns:
{"validation": (metric_name, score, higher_is_better) or None,
"test": (metric_name, score, higher_is_better) or None}
"""
scenario_dir = task_path / "scenario"
if not scenario_dir.exists():
return {"validation": None, "test": None}
for pkl_file in scenario_dir.rglob("*.pkl"):
try:
with open(pkl_file, "rb") as f:
scenario = pickle.load(f)
benchmark_name = getattr(scenario, "target_benchmark", "")
result = {"validation": None, "test": None}
# Validation score
baseline_val = getattr(scenario, "baseline_benchmark_score", None)
if baseline_val and isinstance(baseline_val, dict):
accuracy_summary = baseline_val.get("accuracy_summary", {})
if isinstance(accuracy_summary, dict) and accuracy_summary:
core = get_core_metric_score(benchmark_name, accuracy_summary)
if core:
result["validation"] = core
# Test score (new format only)
baseline_test = getattr(scenario, "baseline_benchmark_score_test", None)
if baseline_test and isinstance(baseline_test, dict):
accuracy_summary = baseline_test.get("accuracy_summary", {})
if isinstance(accuracy_summary, dict) and accuracy_summary:
core = get_core_metric_score(benchmark_name, accuracy_summary)
if core:
result["test"] = core
return result
except Exception:
pass
return {"validation": None, "test": None}
def get_loop_status(
task_path: Path, loop_id: int
) -> tuple[str, float | None, float | None, str | None, bool | None, bool]:
"""
Get loop status, validation score, test score, metric name with direction arrow, feedback decision, and direction.
Returns: (status_str, val_score_or_none, test_score_or_none, metric_display_or_none, feedback_decision, higher_is_better)
Status: 'C'=Coding, 'R'=Running, 'X'=Failed, score_str=Success
metric_display: metric name with direction arrow (e.g., "accuracy ↑")
feedback_decision: True=accepted, False=rejected, None=no feedback
higher_is_better: True if higher values are better for this metric
"""
loop_path = task_path / f"Loop_{loop_id}"
if not loop_path.exists():
return "-", None, None, None, None, True
# Check for benchmark results first (highest priority - means completed)
scores = extract_benchmark_scores(loop_path)
val_result = scores.get("validation")
test_result = scores.get("test")
# Fallback to old format (no split) if no validation/test found
if val_result is None and test_result is None:
legacy_result = extract_benchmark_score(loop_path, split="")
if legacy_result is not None:
val_result = legacy_result # Treat legacy as validation
# Get feedback decision (used for both score coloring and fallback status)
feedback_decision = None
feedback_files = list(loop_path.rglob("**/feedback/**/*.pkl"))
for f in feedback_files:
try:
with open(f, "rb") as fp:
content = pickle.load(fp)
decision = getattr(content, "decision", None)
if decision is not None:
feedback_decision = decision
break
except Exception:
pass
if val_result is not None:
metric_name, val_score, higher_is_better = val_result
test_score = test_result[1] if test_result else None
arrow = "" if higher_is_better else ""
metric_display = f"{metric_name} {arrow}"
# Format: "val/test" or just "val" if no test
if test_score is not None:
status_str = f"{val_score:.2f}/{test_score:.2f}"
else:
status_str = f"{val_score:.2f}"
return status_str, val_score, test_score, metric_display, feedback_decision, higher_is_better
# Check feedback stage (no benchmark result, use feedback decision directly)
if feedback_decision is not None:
return ("OK" if feedback_decision else "X"), None, None, None, feedback_decision, True
# Check running stage
running_files = list(loop_path.rglob("**/running/**/*.pkl"))
if running_files:
return "R", None, None, None, None, True
# Check coding stage
coding_files = list(loop_path.rglob("**/coding/**/*.pkl"))
if coding_files:
return "C", None, None, None, None, True
# Has directory but no recognized files
return "?", None, None, None, None, True
def get_max_loops(job_path: Path) -> int:
"""Get maximum number of loops across all tasks"""
max_loops = 0
for task_dir in job_path.iterdir():
if is_valid_task(task_dir):
loops = get_loop_dirs(task_dir)
max_loops = max(max_loops, len(loops))
return max_loops
def get_job_summary_df(job_path: Path) -> tuple[pd.DataFrame, pd.DataFrame]:
"""Generate summary DataFrame and decision DataFrame for all tasks in job
Each loop column shows "val/test" format when both scores are available.
Best columns show the best validation and test scores separately.
Returns:
(df, decisions_df): df is display data, decisions_df has same structure
but values are True/False/None for feedback decision
"""
if not job_path.exists():
return pd.DataFrame(), pd.DataFrame()
tasks = [d for d in sorted(job_path.iterdir(), reverse=True) if is_valid_task(d)]
if not tasks:
return pd.DataFrame(), pd.DataFrame()
max_loops = get_max_loops(job_path)
if max_loops == 0:
max_loops = 10 # Default display columns
data = []
decisions_data = []
for task_path in tasks:
row = {"Task": task_path.name}
decision_row = {"Task": task_path.name}
best_val_score = None
best_test_score = None
best_metric = None
best_higher_is_better = True # Default to higher is better
# Extract baseline scores (validation and test) from scenario
baseline_scores = extract_baseline_scores(task_path)
val_baseline = baseline_scores.get("validation")
test_baseline = baseline_scores.get("test")
if val_baseline and test_baseline:
row["Baseline"] = f"{val_baseline[1]:.2f}/{test_baseline[1]:.2f}"
elif val_baseline:
row["Baseline"] = f"{val_baseline[1]:.2f}"
else:
row["Baseline"] = "-"
decision_row["Baseline"] = None
for i in range(max_loops):
status, val_score, test_score, metric_name, feedback_decision, higher_is_better = get_loop_status(
task_path, i
)
row[f"L{i}"] = status
decision_row[f"L{i}"] = feedback_decision
if val_score is not None:
# Use higher_is_better to determine if this score is better
if best_val_score is None:
best_val_score = val_score
best_higher_is_better = higher_is_better
best_metric = metric_name
elif (higher_is_better and val_score > best_val_score) or (
not higher_is_better and val_score < best_val_score
):
best_val_score = val_score
best_higher_is_better = higher_is_better
best_metric = metric_name
if test_score is not None:
# Use same direction as validation score for consistency
if best_test_score is None:
best_test_score = test_score
elif (best_higher_is_better and test_score > best_test_score) or (
not best_higher_is_better and test_score < best_test_score
):
best_test_score = test_score
# Show best validation and test scores
if best_val_score is not None and best_test_score is not None:
row["Best"] = f"{best_val_score:.2f}/{best_test_score:.2f}"
elif best_val_score is not None:
row["Best"] = f"{best_val_score:.2f}"
else:
row["Best"] = "-"
row["Metric"] = best_metric if best_metric else "-"
decision_row["Metric"] = None
decision_row["Best"] = None
data.append(row)
decisions_data.append(decision_row)
# Ensure column order: Task, Metric, Baseline, L0, L1, ..., Best
df = pd.DataFrame(data)
decisions_df = pd.DataFrame(decisions_data)
if not df.empty:
loop_cols = [c for c in df.columns if c.startswith("L")]
cols = ["Task", "Metric", "Baseline"] + sorted(loop_cols, key=lambda x: int(x[1:])) + ["Best"]
df = df[cols]
decisions_df = decisions_df[cols]
return df, decisions_df
def style_status_cell(val: str, decision: bool | None = None) -> str:
"""Style cell based on status value and feedback decision
Args:
val: The cell value
decision: True=accepted (green), False=rejected (red), None=no feedback (gray)
"""
if val == "-":
return "color: #888"
if val == "C":
return "color: #f0ad4e; font-weight: bold" # Orange for coding
if val == "R":
return "color: #5bc0de; font-weight: bold" # Blue for running
if val == "X":
return "color: #d9534f; font-weight: bold" # Red for failed
if val == "OK":
return "color: #5cb85c; font-weight: bold" # Green for success
if val == "?":
return "color: #888"
# Check if it's a numeric score (with optional "/" separator)
is_numeric = False
try:
float(val)
is_numeric = True
except ValueError:
if "/" in val:
parts = val.split("/")
try:
float(parts[0])
is_numeric = True
except ValueError:
pass
if is_numeric:
# Use decision for coloring (use == instead of is for numpy.bool_ compatibility)
if decision == True:
return "color: #5cb85c; font-weight: bold" # Green for accepted
elif decision == False:
return "color: #d9534f; font-weight: bold" # Red for rejected
else:
return "color: #888" # Gray for no feedback
return ""
def style_df_with_decisions(df: pd.DataFrame, decisions_df: pd.DataFrame) -> Styler:
"""Apply styling to dataframe based on decision data
Args:
df: Display dataframe
decisions_df: DataFrame with same shape, containing True/False/None values
"""
def apply_styles(row_idx: int, col: str) -> str:
val = df.iloc[row_idx][col]
decision = decisions_df.iloc[row_idx][col] if col in decisions_df.columns else None
return style_status_cell(str(val), decision)
# Build style matrix
styles = pd.DataFrame("", index=df.index, columns=df.columns)
for row_idx in range(len(df)):
for col in df.columns:
styles.iloc[row_idx][col] = apply_styles(row_idx, col)
return df.style.apply(lambda _: styles, axis=None)
def render_job_summary(job_path: Path, is_root: bool = False) -> None:
"""Render job summary UI"""
title = "Standalone Tasks" if is_root else f"Job: {job_path.name}"
st.subheader(title)
df, decisions_df = get_job_summary_df(job_path)
if df.empty:
st.warning("No valid tasks found in this job directory")
return
# Display legend
st.markdown(
"**Legend:** "
"<span style='color:#f0ad4e'>C</span>=Coding, "
"<span style='color:#5bc0de'>R</span>=Running, "
"<span style='color:#5cb85c'>Score</span>=Accepted, "
"<span style='color:#d9534f'>Score/X</span>=Rejected/Failed, "
"<span style='color:#888'>Score</span>=No feedback",
unsafe_allow_html=True,
)
# Style and display dataframe
styled_df = style_df_with_decisions(df, decisions_df)
st.dataframe(styled_df, use_container_width=True, hide_index=True)
# Summary stats
col1, col2, col3 = st.columns(3)
with col1:
st.metric("Tasks", len(df))
with col2:
# Count tasks with any score
tasks_with_score = df["Best"].apply(lambda x: x != "-").sum()
st.metric("With Score", tasks_with_score)
with col3:
# Count tasks with at least one improved loop (decision=True)
loop_cols = [c for c in decisions_df.columns if c.startswith("L")]
tasks_improved = decisions_df[loop_cols].apply(lambda row: any(v is True for v in row), axis=1).sum()
st.metric("Improved", tasks_improved)
# Detailed scores table
render_task_detail_selector(job_path)
def extract_full_benchmark(loop_path: Path, split: str = "") -> dict | None:
"""Extract full accuracy_summary from loop directory.
Args:
loop_path: Path to loop directory
split: Filter by split type ("validation", "test", or "" for any)
Returns:
accuracy_summary dict {dataset: {metric: value, ...}, ...} or None
"""
for pkl_file in loop_path.rglob("**/benchmark_result*/**/*.pkl"):
try:
with open(pkl_file, "rb") as f:
content = pickle.load(f)
if isinstance(content, dict):
# Check split filter
content_split = content.get("split", "")
if split and content_split != split:
continue
accuracy_summary = content.get("accuracy_summary", {})
if isinstance(accuracy_summary, dict) and accuracy_summary:
return accuracy_summary
except Exception:
pass
return None
def extract_baseline_full_benchmark(task_path: Path, split: str = "validation") -> dict | None:
"""Extract full accuracy_summary from baseline scenario.
Args:
task_path: Path to task directory
split: "validation" or "test"
Returns:
accuracy_summary dict or None
"""
scenario_dir = task_path / "scenario"
if not scenario_dir.exists():
return None
for pkl_file in scenario_dir.rglob("*.pkl"):
try:
with open(pkl_file, "rb") as f:
scenario = pickle.load(f)
if split == "validation":
baseline = getattr(scenario, "baseline_benchmark_score", None)
else:
baseline = getattr(scenario, "baseline_benchmark_score_test", None)
if baseline and isinstance(baseline, dict):
accuracy_summary = baseline.get("accuracy_summary", {})
if isinstance(accuracy_summary, dict) and accuracy_summary:
return accuracy_summary
except Exception:
pass
return None
def get_task_full_benchmark_df(task_path: Path, split: str) -> pd.DataFrame:
"""Generate full benchmark table for a single task and split.
Returns DataFrame with columns: Dataset, Metric, Baseline, Loop_0, Loop_1, ...
Each row is a dataset-metric combination.
"""
# Collect all sources (Baseline + Loops)
sources = ["Baseline"]
loop_dirs = sorted(
[d for d in task_path.iterdir() if d.is_dir() and d.name.startswith("Loop_")],
key=lambda x: int(x.name.split("_")[1]),
)
sources.extend([d.name for d in loop_dirs])
# Collect all accuracy_summaries
all_summaries = {}
# Baseline
baseline_summary = extract_baseline_full_benchmark(task_path, split)
if baseline_summary:
all_summaries["Baseline"] = baseline_summary
# Loops
for loop_dir in loop_dirs:
loop_summary = extract_full_benchmark(loop_dir, split)
if loop_summary:
all_summaries[loop_dir.name] = loop_summary
if not all_summaries:
return pd.DataFrame()
# Collect all dataset-metric combinations
all_keys = set()
for summary in all_summaries.values():
for dataset, metrics in summary.items():
if isinstance(metrics, dict):
for metric in metrics.keys():
all_keys.add((dataset, metric))
# Sort keys for consistent display
all_keys = sorted(all_keys)
# Build table data
data = []
for dataset, metric in all_keys:
row = {"Dataset": dataset, "Metric": metric}
for source in sources:
summary = all_summaries.get(source, {})
metrics_dict = summary.get(dataset, {})
value = metrics_dict.get(metric) if isinstance(metrics_dict, dict) else None
if value is not None:
row[source] = f"{value:.2f}" if isinstance(value, float) else str(value)
else:
row[source] = "-"
data.append(row)
df = pd.DataFrame(data)
# Ensure column order
if not df.empty:
cols = ["Dataset", "Metric"] + [s for s in sources if s in df.columns]
df = df[cols]
return df
def render_task_detail_selector(job_path: Path) -> None:
"""Render task selector dropdown and full benchmark tables."""
tasks = [d for d in sorted(job_path.iterdir(), reverse=True) if is_valid_task(d)]
if not tasks:
return
st.markdown("---")
st.subheader("Detailed Benchmark Scores")
# Task selector dropdown
task_names = [t.name for t in tasks]
selected_task = st.selectbox("Select Task", options=task_names, index=0, key="task_detail_selector")
if selected_task:
task_path = job_path / selected_task
# Display Validation and Test tables side by side
col1, col2 = st.columns(2)
with col1:
st.markdown("**Validation**")
df_val = get_task_full_benchmark_df(task_path, "validation")
if not df_val.empty:
st.dataframe(df_val, use_container_width=True, hide_index=True)
else:
st.info("No validation scores")
with col2:
st.markdown("**Test**")
df_test = get_task_full_benchmark_df(task_path, "test")
if not df_test.empty:
st.dataframe(df_test, use_container_width=True, hide_index=True)
else:
st.info("No test scores")
+52
View File
@@ -0,0 +1,52 @@
from pathlib import Path
from rdagent.components.coder.CoSTEER.evaluators import (
CoSTEEREvaluator,
CoSTEERSingleFeedback,
)
from rdagent.core.experiment import FBWorkspace, Task
from rdagent.core.scenario import Scenario
from rdagent.utils.agent.tpl import T
from rdagent.utils.agent.workflow import build_cls_from_json_with_retry
class PrevModelLoadEvaluator(CoSTEEREvaluator):
"""This evaluator checks whether the code actually loads a model from `prev_model`."""
def __init__(self, scen: Scenario):
super().__init__(scen)
def evaluate(
self, target_task: Task, implementation: FBWorkspace, gt_implementation: FBWorkspace, *args, **kwargs
) -> CoSTEERSingleFeedback:
data_source_path = T("scenarios.data_science.share:scen.input_path").r()
prev_model_dir = Path(data_source_path) / "prev_model"
# 1) Inspect the code itself for references to prev_model loading
code_str = implementation.file_dict["main.py"]
code_contain_prev = "prev_model" in code_str
print(f"Code references prev_model: {code_contain_prev}")
if not code_contain_prev:
err = (
"No evidence found that your code loads a model from `prev_model`. "
"Please check that you are calling the correct load function "
f"and pointing it to the `{prev_model_dir}` directory."
)
return CoSTEERSingleFeedback(
execution=err,
return_checking=err,
code=err,
final_decision=False,
)
system_prompt = T(".prompts:prev_model_eval.system").r()
user_prompt = T(".prompts:prev_model_eval.user").r(
code=implementation.all_codes,
)
csfb = build_cls_from_json_with_retry(
CoSTEERSingleFeedback,
system_prompt=system_prompt,
user_prompt=user_prompt,
)
return csfb
+23
View File
@@ -0,0 +1,23 @@
prev_model_eval:
system: |-
You are a data scientist tasked with evaluating code generation.
You will receive the following information:
- The implemented code
Focus on these aspects:
- Check if the code load the model in the "prev_model/" subfolder.
Please respond with your feedback in the following JSON format and order
```json
{
"execution": "Describe whether the code executed successfully. Include any errors or issues encountered, and append all error messages and full traceback details without summarizing or omitting any information. ."
"return_checking": "Detect whether the model is loaded from 'prev_model/' subfolder and finetune is prepared based on prev model.",
"code": "The code has explicity load the model from 'prev_model/' subfolder and prepares finetune based on prev model.",
"final_decision": <true or false in boolean type; only return true when ensuring that the code loads the model from 'prev_model/' subfolder and prepares finetune based on prev model.>
}
```
user: |-
------------ The implemented code ------------
{{code}}
+9 -13
View File
@@ -30,19 +30,15 @@ def extract_models_and_implement(report_file_path: str) -> None:
Returns:
None
"""
with logger.tag("init"):
scenario = GeneralModelScenario()
logger.log_object(scenario, tag="scenario")
with logger.tag("r"):
# Save Relevant Images
img = extract_first_page_screenshot_from_pdf(report_file_path)
logger.log_object(img, tag="pdf_image")
exp = ModelExperimentLoaderFromPDFfiles().load(report_file_path)
logger.log_object(exp, tag="load_experiment")
with logger.tag("d"):
exp = QlibModelCoSTEER(scenario).develop(exp)
logger.log_object(exp, tag="developed_experiment")
return exp
scenario = GeneralModelScenario()
logger.log_object(scenario, tag="scenario")
# Save Relevant Images
img = extract_first_page_screenshot_from_pdf(report_file_path)
logger.log_object(img, tag="pdf_image")
exp = ModelExperimentLoaderFromPDFfiles().load(report_file_path)
logger.log_object(exp, tag="load_experiment")
exp = QlibModelCoSTEER(scenario).develop(exp)
logger.log_object(exp, tag="developed_experiment")
if __name__ == "__main__":
+48 -24
View File
@@ -1,28 +1,15 @@
from pathlib import Path
from pydantic_settings import SettingsConfigDict
from pydantic_settings import BaseSettings
from rdagent.components.workflow.conf import BasePropSetting
from rdagent.core.conf import ExtendedBaseSettings
class KaggleBasePropSetting(BasePropSetting):
class Config:
env_prefix = "KG_"
"""Use `KG_` as prefix for environment variables"""
protected_namespaces = ()
"""Do not allow overriding of these namespaces"""
class KaggleBasePropSetting(ExtendedBaseSettings):
model_config = SettingsConfigDict(env_prefix="KG_", protected_namespaces=())
# 1) overriding the default
scen: str = "rdagent.scenarios.kaggle.experiment.scenario.KGScenario"
"""Scenario class for data mining model"""
knowledge_base: str = "" # TODO enable this line to use the knowledge base
# knowledge_base: str = "rdagent.scenarios.kaggle.knowledge_management.graph.KGKnowledgeGraph"
"""Knowledge base class"""
knowledge_base_path: str = "kg_graph.pkl"
"""Knowledge base path"""
hypothesis_gen: str = "rdagent.scenarios.kaggle.proposal.proposal.KGHypothesisGen"
"""Hypothesis generation class"""
@@ -44,29 +31,66 @@ class KaggleBasePropSetting(BasePropSetting):
model_runner: str = "rdagent.scenarios.kaggle.developer.runner.KGModelRunner"
"""Model Runner class"""
summarizer: str = "rdagent.scenarios.kaggle.developer.feedback.KGHypothesisExperiment2Feedback"
summarizer: str = "rdagent.scenarios.kaggle.developer.feedback.KGExperiment2Feedback"
"""Summarizer class"""
evolving_n: int = 10
"""Number of evolutions"""
competition: str = ""
"""Kaggle competition name, e.g., 'sf-crime'"""
local_data_path: str = "/data/userdata/share/kaggle"
template_path: str = "rdagent/scenarios/kaggle/experiment/templates"
"""Kaggle competition base templates path"""
local_data_path: str = ""
"""Folder storing Kaggle competition data"""
# Evaluation on Test related
if_using_mle_data: bool = False
auto_submit: bool = False
"""Automatically upload and submit each experiment result to Kaggle platform"""
# Conditionally set the knowledge_base based on the use of graph RAG
knowledge_base: str = ""
"""Knowledge base class, uses 'KGKnowledgeGraph' when advanced graph-based RAG is enabled, otherwise empty."""
if_action_choosing_based_on_UCB: bool = False
"""Enable decision mechanism based on UCB algorithm"""
domain_knowledge_path: str = "/data/userdata/share/kaggle/domain_knowledge"
"""Folder storing domain knowledge files in .case format"""
rag_path: str = "git_ignore_folder/rag"
knowledge_base_path: str = "kg_graph.pkl"
"""Advanced version of graph-based RAG"""
if_action_choosing_based_on_UCB: bool = False
if_using_graph_rag: bool = False
rag_path: str = "git_ignore_folder/kaggle_vector_base.pkl"
"""Base version of vector-based RAG"""
if_using_vector_rag: bool = False
"""Enable basic vector-based RAG"""
auto_submit: bool = True
if_using_graph_rag: bool = False
"""Enable advanced graph-based RAG"""
mini_case: bool = False
"""Enable mini-case study for experiments"""
time_ratio_limit_to_enable_hyperparameter_tuning: float = 1
"""
Runner time ratio limit to enable hyperparameter tuning, if not change, hyperparameter tuning is always enabled in the first evolution.
"""
res_time_ratio_limit_to_enable_hyperparameter_tuning: float = 1
"""
Overall rest time ratio limit to enable hyperparameter tuning, if not change, hyperparameter tuning is always enabled in the first evolution.
`1` indicate we enable hyperparameter tuning when we have 100% residual time. (so hyperparameter tuning is always enabled)
"""
only_first_loop_enable_hyperparameter_tuning: bool = True
"""Enable hyperparameter tuning feedback only in the first loop of evaluation."""
only_enable_tuning_in_merge: bool = False
"""Enable hyperparameter tuning only in the merge stage"""
KAGGLE_IMPLEMENT_SETTING = KaggleBasePropSetting()
+80 -83
View File
@@ -1,5 +1,4 @@
import subprocess
from collections import defaultdict
from typing import Any
import fire
@@ -8,17 +7,15 @@ from rdagent.app.kaggle.conf import KAGGLE_IMPLEMENT_SETTING
from rdagent.components.workflow.conf import BasePropSetting
from rdagent.components.workflow.rd_loop import RDLoop
from rdagent.core.developer import Developer
from rdagent.core.exception import FactorEmptyError, ModelEmptyError
from rdagent.core.exception import CoderError, FactorEmptyError, ModelEmptyError
from rdagent.core.proposal import (
Experiment2Feedback,
Hypothesis2Experiment,
HypothesisExperiment2Feedback,
HypothesisGen,
Trace,
)
from rdagent.core.scenario import Scenario
from rdagent.core.utils import import_class
from rdagent.log import rdagent_logger as logger
from rdagent.log.time import measure_time
from rdagent.scenarios.kaggle.experiment.scenario import (
KG_ACTION_FEATURE_ENGINEERING,
KG_ACTION_FEATURE_PROCESSING,
@@ -30,92 +27,88 @@ from rdagent.scenarios.kaggle.proposal.proposal import KGTrace
class KaggleRDLoop(RDLoop):
@measure_time
def __init__(self, PROP_SETTING: BasePropSetting):
with logger.tag("init"):
scen: Scenario = import_class(PROP_SETTING.scen)(PROP_SETTING.competition)
logger.log_object(scen, tag="scenario")
knowledge_base = (
import_class(PROP_SETTING.knowledge_base)(PROP_SETTING.knowledge_base_path, scen)
if PROP_SETTING.knowledge_base != ""
else None
)
logger.log_object(knowledge_base, tag="knowledge_base")
self.hypothesis_gen: HypothesisGen = import_class(PROP_SETTING.hypothesis_gen)(scen)
logger.log_object(self.hypothesis_gen, tag="hypothesis generator")
self.hypothesis2experiment: Hypothesis2Experiment = import_class(PROP_SETTING.hypothesis2experiment)()
logger.log_object(self.hypothesis2experiment, tag="hypothesis2experiment")
self.feature_coder: Developer = import_class(PROP_SETTING.feature_coder)(scen)
logger.log_object(self.feature_coder, tag="feature coder")
self.model_feature_selection_coder: Developer = import_class(PROP_SETTING.model_feature_selection_coder)(
scen
)
logger.log_object(self.model_feature_selection_coder, tag="model feature selection coder")
self.model_coder: Developer = import_class(PROP_SETTING.model_coder)(scen)
logger.log_object(self.model_coder, tag="model coder")
self.feature_runner: Developer = import_class(PROP_SETTING.feature_runner)(scen)
logger.log_object(self.feature_runner, tag="feature runner")
self.model_runner: Developer = import_class(PROP_SETTING.model_runner)(scen)
logger.log_object(self.model_runner, tag="model runner")
self.summarizer: HypothesisExperiment2Feedback = import_class(PROP_SETTING.summarizer)(scen)
logger.log_object(self.summarizer, tag="summarizer")
self.trace = KGTrace(scen=scen, knowledge_base=knowledge_base)
super(RDLoop, self).__init__()
scen: Scenario = import_class(PROP_SETTING.scen)(PROP_SETTING.competition)
logger.log_object(scen, tag="scenario")
knowledge_base = (
import_class(PROP_SETTING.knowledge_base)(PROP_SETTING.knowledge_base_path, scen)
if PROP_SETTING.knowledge_base != ""
else None
)
logger.log_object(knowledge_base, tag="knowledge_base")
self.hypothesis_gen: HypothesisGen = import_class(PROP_SETTING.hypothesis_gen)(scen)
logger.log_object(self.hypothesis_gen, tag="hypothesis generator")
self.hypothesis2experiment: Hypothesis2Experiment = import_class(PROP_SETTING.hypothesis2experiment)()
logger.log_object(self.hypothesis2experiment, tag="hypothesis2experiment")
self.feature_coder: Developer = import_class(PROP_SETTING.feature_coder)(scen)
logger.log_object(self.feature_coder, tag="feature coder")
self.model_feature_selection_coder: Developer = import_class(PROP_SETTING.model_feature_selection_coder)(scen)
logger.log_object(self.model_feature_selection_coder, tag="model feature selection coder")
self.model_coder: Developer = import_class(PROP_SETTING.model_coder)(scen)
logger.log_object(self.model_coder, tag="model coder")
self.feature_runner: Developer = import_class(PROP_SETTING.feature_runner)(scen)
logger.log_object(self.feature_runner, tag="feature runner")
self.model_runner: Developer = import_class(PROP_SETTING.model_runner)(scen)
logger.log_object(self.model_runner, tag="model runner")
self.summarizer: Experiment2Feedback = import_class(PROP_SETTING.summarizer)(scen)
logger.log_object(self.summarizer, tag="summarizer")
self.trace = KGTrace(scen=scen, knowledge_base=knowledge_base)
super(RDLoop, self).__init__()
@measure_time
def coding(self, prev_out: dict[str, Any]):
with logger.tag("d"): # develop
if prev_out["propose"].action in [KG_ACTION_FEATURE_ENGINEERING, KG_ACTION_FEATURE_PROCESSING]:
exp = self.feature_coder.develop(prev_out["exp_gen"])
elif prev_out["propose"].action == KG_ACTION_MODEL_FEATURE_SELECTION:
exp = self.model_feature_selection_coder.develop(prev_out["exp_gen"])
else:
exp = self.model_coder.develop(prev_out["exp_gen"])
logger.log_object(exp.sub_workspace_list, tag="coder result")
if prev_out["direct_exp_gen"]["propose"].action in [
KG_ACTION_FEATURE_ENGINEERING,
KG_ACTION_FEATURE_PROCESSING,
]:
exp = self.feature_coder.develop(prev_out["direct_exp_gen"]["exp_gen"])
elif prev_out["direct_exp_gen"]["propose"].action == KG_ACTION_MODEL_FEATURE_SELECTION:
exp = self.model_feature_selection_coder.develop(prev_out["direct_exp_gen"]["exp_gen"])
else:
exp = self.model_coder.develop(prev_out["direct_exp_gen"]["exp_gen"])
logger.log_object(exp.sub_workspace_list, tag="coder result")
return exp
@measure_time
def running(self, prev_out: dict[str, Any]):
with logger.tag("ef"): # evaluate and feedback
if prev_out["propose"].action in [KG_ACTION_FEATURE_ENGINEERING, KG_ACTION_FEATURE_PROCESSING]:
exp = self.feature_runner.develop(prev_out["coding"])
else:
exp = self.model_runner.develop(prev_out["coding"])
logger.log_object(exp, tag="runner result")
if KAGGLE_IMPLEMENT_SETTING.competition in [
"optiver-realized-volatility-prediction",
"covid19-global-forecasting-week-1",
]:
try:
python_files_to_notebook(
KAGGLE_IMPLEMENT_SETTING.competition, exp.experiment_workspace.workspace_path
)
except Exception as e:
logger.error(f"Merge python files to one file failed: {e}")
if KAGGLE_IMPLEMENT_SETTING.auto_submit:
csv_path = exp.experiment_workspace.workspace_path / "submission.csv"
try:
subprocess.run(
[
"kaggle",
"competitions",
"submit",
"-f",
str(csv_path.absolute()),
"-m",
str(csv_path.parent.absolute()),
KAGGLE_IMPLEMENT_SETTING.competition,
],
check=True,
)
except subprocess.CalledProcessError as e:
logger.error(f"Auto submission failed: \n{e}")
except Exception as e:
logger.error(f"Other exception when use kaggle api:\n{e}")
if prev_out["direct_exp_gen"]["propose"].action in [
KG_ACTION_FEATURE_ENGINEERING,
KG_ACTION_FEATURE_PROCESSING,
]:
exp = self.feature_runner.develop(prev_out["coding"])
else:
exp = self.model_runner.develop(prev_out["coding"])
logger.log_object(exp, tag="runner result")
if KAGGLE_IMPLEMENT_SETTING.competition in [
"optiver-realized-volatility-prediction",
"covid19-global-forecasting-week-1",
]:
try:
python_files_to_notebook(KAGGLE_IMPLEMENT_SETTING.competition, exp.experiment_workspace.workspace_path)
except Exception as e:
logger.error(f"Merge python files to one file failed: {e}")
if KAGGLE_IMPLEMENT_SETTING.auto_submit:
csv_path = exp.experiment_workspace.workspace_path / "submission.csv"
try:
subprocess.run(
[
"kaggle",
"competitions",
"submit",
"-f",
str(csv_path.absolute()),
"-m",
str(csv_path.parent.absolute()),
KAGGLE_IMPLEMENT_SETTING.competition,
],
check=True,
)
except subprocess.CalledProcessError as e:
logger.error(f"Auto submission failed: \n{e}")
except Exception as e:
logger.error(f"Other exception when use kaggle api:\n{e}")
return exp
skip_loop_error = (ModelEmptyError, FactorEmptyError)
skip_loop_error = (ModelEmptyError, FactorEmptyError, CoderError)
def main(path=None, step_n=None, competition=None):
@@ -128,7 +121,11 @@ def main(path=None, step_n=None, competition=None):
"""
if competition:
KAGGLE_IMPLEMENT_SETTING.competition = competition
download_data(competition=competition, local_path=KAGGLE_IMPLEMENT_SETTING.local_data_path)
download_data(competition=competition, settings=KAGGLE_IMPLEMENT_SETTING)
if KAGGLE_IMPLEMENT_SETTING.if_using_graph_rag:
KAGGLE_IMPLEMENT_SETTING.knowledge_base = (
"rdagent.scenarios.kaggle.knowledge_management.graph.KGKnowledgeGraph"
)
else:
logger.error("Please specify competition name.")
if path is None:
+109 -14
View File
@@ -1,14 +1,12 @@
from pydantic_settings import BaseSettings
from typing import Optional
from pydantic_settings import SettingsConfigDict
from rdagent.components.workflow.conf import BasePropSetting
class ModelBasePropSetting(BasePropSetting):
class Config:
env_prefix = "QLIB_MODEL_"
"""Use `QLIB_MODEL_` as prefix for environment variables"""
protected_namespaces = ()
"""Add 'model_' to the protected namespaces"""
model_config = SettingsConfigDict(env_prefix="QLIB_MODEL_", protected_namespaces=())
# 1) override base settings
scen: str = "rdagent.scenarios.qlib.experiment.model_experiment.QlibModelScenario"
@@ -26,19 +24,33 @@ class ModelBasePropSetting(BasePropSetting):
runner: str = "rdagent.scenarios.qlib.developer.model_runner.QlibModelRunner"
"""Runner class"""
summarizer: str = "rdagent.scenarios.qlib.developer.feedback.QlibModelHypothesisExperiment2Feedback"
summarizer: str = "rdagent.scenarios.qlib.developer.feedback.QlibModelExperiment2Feedback"
"""Summarizer class"""
evolving_n: int = 10
"""Number of evolutions"""
train_start: str = "2008-01-01"
"""Start date of the training segment"""
train_end: str = "2014-12-31"
"""End date of the training segment"""
valid_start: str = "2015-01-01"
"""Start date of the validation segment"""
valid_end: str = "2016-12-31"
"""End date of the validation segment"""
test_start: str = "2017-01-01"
"""Start date of the test / backtest segment"""
test_end: Optional[str] = "2020-08-01"
"""End date of the test / backtest segment"""
class FactorBasePropSetting(BasePropSetting):
class Config:
env_prefix = "QLIB_FACTOR_"
"""Use `QLIB_FACTOR_` as prefix for environment variables"""
protected_namespaces = ()
"""Add 'factor_' to the protected namespaces"""
model_config = SettingsConfigDict(env_prefix="QLIB_FACTOR_", protected_namespaces=())
# 1) override base settings
scen: str = "rdagent.scenarios.qlib.experiment.factor_experiment.QlibFactorScenario"
@@ -56,12 +68,30 @@ class FactorBasePropSetting(BasePropSetting):
runner: str = "rdagent.scenarios.qlib.developer.factor_runner.QlibFactorRunner"
"""Runner class"""
summarizer: str = "rdagent.scenarios.qlib.developer.feedback.QlibFactorHypothesisExperiment2Feedback"
summarizer: str = "rdagent.scenarios.qlib.developer.feedback.QlibFactorExperiment2Feedback"
"""Summarizer class"""
evolving_n: int = 10
"""Number of evolutions"""
train_start: str = "2008-01-01"
"""Start date of the training segment"""
train_end: str = "2014-12-31"
"""End date of the training segment"""
valid_start: str = "2015-01-01"
"""Start date of the validation segment"""
valid_end: str = "2016-12-31"
"""End date of the validation segment"""
test_start: str = "2017-01-01"
"""Start date of the test / backtest segment"""
test_end: Optional[str] = "2020-08-01"
"""End date of the test / backtest segment"""
class FactorFromReportPropSetting(FactorBasePropSetting):
# 1) override the scen attribute
@@ -72,10 +102,75 @@ class FactorFromReportPropSetting(FactorBasePropSetting):
report_result_json_file_path: str = "git_ignore_folder/report_list.json"
"""Path to the JSON file listing research reports for factor extraction"""
max_factors_per_exp: int = 10000
max_factors_per_exp: int = 6
"""Maximum number of factors implemented per experiment"""
report_limit: int = 20
"""Maximum number of reports to process"""
class QuantBasePropSetting(BasePropSetting):
model_config = SettingsConfigDict(env_prefix="QLIB_QUANT_", protected_namespaces=())
# 1) override base settings
scen: str = "rdagent.scenarios.qlib.experiment.quant_experiment.QlibQuantScenario"
"""Scenario class for Qlib Model"""
quant_hypothesis_gen: str = "rdagent.scenarios.qlib.proposal.quant_proposal.QlibQuantHypothesisGen"
"""Hypothesis generation class"""
model_hypothesis2experiment: str = "rdagent.scenarios.qlib.proposal.model_proposal.QlibModelHypothesis2Experiment"
"""Hypothesis to experiment class"""
model_coder: str = "rdagent.scenarios.qlib.developer.model_coder.QlibModelCoSTEER"
"""Coder class"""
model_runner: str = "rdagent.scenarios.qlib.developer.model_runner.QlibModelRunner"
"""Runner class"""
model_summarizer: str = "rdagent.scenarios.qlib.developer.feedback.QlibModelExperiment2Feedback"
"""Summarizer class"""
factor_hypothesis2experiment: str = (
"rdagent.scenarios.qlib.proposal.factor_proposal.QlibFactorHypothesis2Experiment"
)
"""Hypothesis to experiment class"""
factor_coder: str = "rdagent.scenarios.qlib.developer.factor_coder.QlibFactorCoSTEER"
"""Coder class"""
factor_runner: str = "rdagent.scenarios.qlib.developer.factor_runner.QlibFactorRunner"
"""Runner class"""
factor_summarizer: str = "rdagent.scenarios.qlib.developer.feedback.QlibFactorExperiment2Feedback"
"""Summarizer class"""
evolving_n: int = 10
"""Number of evolutions"""
action_selection: str = "bandit"
"""Action selection strategy: 'bandit' for bandit-based selection, 'llm' for LLM-based selection, 'random' for random selection"""
train_start: str = "2008-01-01"
"""Start date of the training segment"""
train_end: str = "2014-12-31"
"""End date of the training segment"""
valid_start: str = "2015-01-01"
"""Start date of the validation segment"""
valid_end: str = "2016-12-31"
"""End date of the validation segment"""
test_start: str = "2017-01-01"
"""Start date of the test / backtest segment"""
test_end: Optional[str] = "2020-08-01"
"""End date of the test / backtest segment"""
FACTOR_PROP_SETTING = FactorBasePropSetting()
FACTOR_FROM_REPORT_PROP_SETTING = FactorFromReportPropSetting()
MODEL_PROP_SETTING = ModelBasePropSetting()
QUANT_PROP_SETTING = QuantBasePropSetting()
+32 -15
View File
@@ -2,32 +2,41 @@
Factor workflow with session control
"""
from typing import Any
import asyncio
from pathlib import Path
from typing import Any, Optional
import fire
from rdagent.app.qlib_rd_loop.conf import FACTOR_PROP_SETTING
from rdagent.components.workflow.rd_loop import RDLoop
from rdagent.core.exception import FactorEmptyError
from rdagent.core.exception import CoderError, FactorEmptyError
from rdagent.log import rdagent_logger as logger
from rdagent.log.time import measure_time
class FactorRDLoop(RDLoop):
skip_loop_error = (FactorEmptyError,)
skip_loop_error = (FactorEmptyError, CoderError)
skip_loop_error_stepname = "feedback"
@measure_time
def running(self, prev_out: dict[str, Any]):
with logger.tag("ef"): # evaluate and feedback
exp = self.runner.develop(prev_out["coding"])
if exp is None:
logger.error(f"Factor extraction failed.")
raise FactorEmptyError("Factor extraction failed.")
logger.log_object(exp, tag="runner result")
exp = self.runner.develop(prev_out["coding"])
if exp is None:
logger.error(f"Factor extraction failed.")
raise FactorEmptyError("Factor extraction failed.")
logger.log_object(exp, tag="runner result")
return exp
def main(path=None, step_n=None):
def main(
path: Optional[str] = None,
step_n: Optional[int] = None,
loop_n: Optional[int] = None,
all_duration: str | None = None,
checkout: bool = True,
checkout_path: Optional[str] = None,
base_features_path: Optional[str] = None,
**kwargs,
):
"""
Auto R&D Evolving loop for fintech factors.
@@ -38,11 +47,19 @@ def main(path=None, step_n=None):
dotenv run -- python rdagent/app/qlib_rd_loop/factor.py $LOG_PATH/__session__/1/0_propose --step_n 1 # `step_n` is a optional paramter
"""
if not checkout_path is None:
checkout = Path(checkout_path)
if path is None:
model_loop = FactorRDLoop(FACTOR_PROP_SETTING)
factor_loop = FactorRDLoop(FACTOR_PROP_SETTING)
else:
model_loop = FactorRDLoop.load(path)
model_loop.run(step_n=step_n)
factor_loop = FactorRDLoop.load(path, checkout=checkout)
factor_loop._init_base_features(base_features_path)
if "user_interaction_queues" in kwargs and kwargs["user_interaction_queues"] is not None:
factor_loop._set_interactor(*kwargs["user_interaction_queues"])
factor_loop._interact_init_params()
asyncio.run(factor_loop.run(step_n=step_n, loop_n=loop_n, all_duration=all_duration))
if __name__ == "__main__":
+49 -58
View File
@@ -1,9 +1,9 @@
import asyncio
import json
from pathlib import Path
from typing import Any, Tuple
from typing import Any, Dict, Tuple
import fire
from jinja2 import Environment, StrictUndefined
from rdagent.app.qlib_rd_loop.conf import FACTOR_FROM_REPORT_PROP_SETTING
from rdagent.app.qlib_rd_loop.factor import FactorRDLoop
@@ -11,20 +11,17 @@ from rdagent.components.document_reader.document_reader import (
extract_first_page_screenshot_from_pdf,
load_and_process_pdfs_by_langchain,
)
from rdagent.core.prompts import Prompts
from rdagent.core.proposal import Hypothesis
from rdagent.core.conf import RD_AGENT_SETTINGS
from rdagent.core.proposal import Hypothesis, HypothesisFeedback
from rdagent.log import rdagent_logger as logger
from rdagent.log.time import measure_time
from rdagent.oai.llm_utils import APIBackend
from rdagent.scenarios.qlib.experiment.factor_experiment import QlibFactorExperiment
from rdagent.scenarios.qlib.factor_experiment_loader.pdf_loader import (
FactorExperimentLoaderFromPDFfiles,
)
from rdagent.utils.agent.tpl import T
from rdagent.utils.workflow import LoopMeta
prompts_path = Path(__file__).parent / "prompts.yaml"
prompts = Prompts(file_path=prompts_path)
def generate_hypothesis(factor_result: dict, report_content: str) -> str:
"""
@@ -37,19 +34,16 @@ def generate_hypothesis(factor_result: dict, report_content: str) -> str:
Returns:
str: The generated hypothesis.
"""
system_prompt = (
Environment(undefined=StrictUndefined).from_string(prompts["hypothesis_generation"]["system"]).render()
)
user_prompt = (
Environment(undefined=StrictUndefined)
.from_string(prompts["hypothesis_generation"]["user"])
.render(factor_descriptions=json.dumps(factor_result), report_content=report_content)
system_prompt = T(".prompts:hypothesis_generation.system").r()
user_prompt = T(".prompts:hypothesis_generation.user").r(
factor_descriptions=json.dumps(factor_result), report_content=report_content
)
response = APIBackend().build_messages_and_create_chat_completion(
user_prompt=user_prompt,
system_prompt=system_prompt,
json_mode=True,
json_target_type=Dict[str, str],
)
response_json = json.loads(response)
@@ -64,7 +58,7 @@ def generate_hypothesis(factor_result: dict, report_content: str) -> str:
)
def extract_hypothesis_and_exp_from_reports(report_file_path: str) -> Tuple[QlibFactorExperiment, Hypothesis]:
def extract_hypothesis_and_exp_from_reports(report_file_path: str) -> QlibFactorExperiment | None:
"""
Extract hypothesis and experiment details from report files.
@@ -72,17 +66,15 @@ def extract_hypothesis_and_exp_from_reports(report_file_path: str) -> Tuple[Qlib
report_file_path (str): Path to the report file.
Returns:
Tuple[QlibFactorExperiment, Hypothesis]: The extracted experiment and generated hypothesis.
QlibFactorExperiment: An instance of QlibFactorExperiment containing the extracted details.
None: If no valid experiment is found in the report.
"""
with logger.tag("extract_factors_and_implement"):
with logger.tag("load_factor_tasks"):
exp = FactorExperimentLoaderFromPDFfiles().load(report_file_path)
if exp is None or exp.sub_tasks == []:
return None, None
exp = FactorExperimentLoaderFromPDFfiles().load(report_file_path)
if exp is None or exp.sub_tasks == []:
return None
with logger.tag("load_pdf_screenshot"):
pdf_screenshot = extract_first_page_screenshot_from_pdf(report_file_path)
logger.log_object(pdf_screenshot)
pdf_screenshot = extract_first_page_screenshot_from_pdf(report_file_path)
logger.log_object(pdf_screenshot, tag="load_pdf_screenshot")
docs_dict = load_and_process_pdfs_by_langchain(report_file_path)
@@ -98,11 +90,11 @@ def extract_hypothesis_and_exp_from_reports(report_file_path: str) -> Tuple[Qlib
report_content = "\n".join(docs_dict.values())
hypothesis = generate_hypothesis(factor_result, report_content)
return exp, hypothesis
exp.hypothesis = hypothesis
return exp
class FactorReportLoop(FactorRDLoop, metaclass=LoopMeta):
@measure_time
def __init__(self, report_folder: str = None):
super().__init__(PROP_SETTING=FACTOR_FROM_REPORT_PROP_SETTING)
if report_folder is None:
@@ -112,44 +104,43 @@ class FactorReportLoop(FactorRDLoop, metaclass=LoopMeta):
else:
self.judge_pdf_data_items = [i for i in Path(report_folder).rglob("*.pdf")]
self.pdf_file_index = 0
self.valid_pdf_file_count = 0
self.current_loop_hypothesis = None
self.current_loop_exp = None
self.steps = ["propose_hypo_exp", "propose", "exp_gen", "coding", "running", "feedback"]
self.loop_n = min(len(self.judge_pdf_data_items), FACTOR_FROM_REPORT_PROP_SETTING.report_limit)
self.shift_report = (
0 # some reports does not contain viable factor, so we ship some of them to avoid infinite loop
)
@measure_time
def propose_hypo_exp(self, prev_out: dict[str, Any]):
with logger.tag("r"):
while True:
if self.valid_pdf_file_count > 15:
break
report_file_path = self.judge_pdf_data_items[self.pdf_file_index]
logger.info(f"Processing number {self.pdf_file_index} report: {report_file_path}")
self.pdf_file_index += 1
exp, hypothesis = extract_hypothesis_and_exp_from_reports(str(report_file_path))
async def direct_exp_gen(self, prev_out: dict[str, Any]):
while True:
if self.get_unfinished_loop_cnt(self.loop_idx) < RD_AGENT_SETTINGS.get_max_parallel():
report_file_path = self.judge_pdf_data_items[self.loop_idx + self.shift_report]
logger.info(f"Processing number {self.loop_idx} report: {report_file_path}")
exp = extract_hypothesis_and_exp_from_reports(str(report_file_path))
if exp is None:
self.shift_report += 1
self.loop_n -= 1
if self.loop_n < 0: # NOTE: on every step, we self.loop_n -= 1 at first.
raise self.LoopTerminationError("Reach stop criterion and stop loop")
continue
self.valid_pdf_file_count += 1
exp.based_experiments = [QlibFactorExperiment(sub_tasks=[])] + [t[1] for t in self.trace.hist if t[2]]
exp.based_experiments = [QlibFactorExperiment(sub_tasks=[], hypothesis=exp.hypothesis)] + [
t[0] for t in self.trace.hist if t[1]
]
exp.sub_workspace_list = exp.sub_workspace_list[: FACTOR_FROM_REPORT_PROP_SETTING.max_factors_per_exp]
exp.sub_tasks = exp.sub_tasks[: FACTOR_FROM_REPORT_PROP_SETTING.max_factors_per_exp]
logger.log_object(hypothesis, tag="hypothesis generation")
exp.base_features = self.plan["features"]
if exp.based_experiments:
exp.based_experiments[-1].base_features = self.plan["features"]
logger.log_object(exp.hypothesis, tag="hypothesis generation")
logger.log_object(exp.sub_tasks, tag="experiment generation")
self.current_loop_hypothesis = hypothesis
self.current_loop_exp = exp
return None
return exp
await asyncio.sleep(1)
@measure_time
def propose(self, prev_out: dict[str, Any]):
return self.current_loop_hypothesis
@measure_time
def exp_gen(self, prev_out: dict[str, Any]):
return self.current_loop_exp
def coding(self, prev_out: dict[str, Any]):
exp = self.coder.develop(prev_out["direct_exp_gen"])
logger.log_object(exp.sub_workspace_list, tag="coder result")
return exp
def main(report_folder=None, path=None, step_n=None):
def main(report_folder=None, path=None, all_duration=None, checkout=True):
"""
Auto R&D Evolving loop for fintech factors (the factors are extracted from finance reports).
@@ -161,11 +152,11 @@ def main(report_folder=None, path=None, step_n=None):
if path is None and report_folder is None:
model_loop = FactorReportLoop()
elif path is not None:
model_loop = FactorReportLoop.load(path)
model_loop = FactorReportLoop.load(path, checkout=checkout)
else:
model_loop = FactorReportLoop(report_folder=report_folder)
model_loop.run(step_n=step_n)
asyncio.run(model_loop.run(all_duration=all_duration))
if __name__ == "__main__":
+17 -3
View File
@@ -2,6 +2,8 @@
Model workflow with session control
"""
import asyncio
import fire
from rdagent.app.qlib_rd_loop.conf import MODEL_PROP_SETTING
@@ -13,7 +15,15 @@ class ModelRDLoop(RDLoop):
skip_loop_error = (ModelEmptyError,)
def main(path=None, step_n=None):
def main(
path=None,
step_n: int | None = None,
loop_n: int | None = None,
all_duration: str | None = None,
checkout: bool = True,
base_features_path: str | None = None,
**kwargs,
):
"""
Auto R&D Evolving loop for fintech models
@@ -27,8 +37,12 @@ def main(path=None, step_n=None):
if path is None:
model_loop = ModelRDLoop(MODEL_PROP_SETTING)
else:
model_loop = ModelRDLoop.load(path)
model_loop.run(step_n=step_n)
model_loop = ModelRDLoop.load(path, checkout=checkout)
model_loop._init_base_features(base_features_path)
if "user_interaction_queues" in kwargs and kwargs["user_interaction_queues"] is not None:
model_loop._set_interactor(*kwargs["user_interaction_queues"])
model_loop._interact_init_params()
asyncio.run(model_loop.run(step_n=step_n, loop_n=loop_n, all_duration=all_duration))
if __name__ == "__main__":
+47 -11
View File
@@ -1,19 +1,55 @@
hypothesis_generation:
system: |-
You are an expert in financial analysis. Your task is to generate a well-reasoned hypothesis based on the provided financial factors and report content.
Please ensure your response is in JSON format as shown below:
You are an expert quantitative researcher specialized in FX (foreign exchange) trading,
specifically EURUSD intraday strategies on 15-minute bars.
EURUSD domain knowledge you must apply:
- London session (08:00-12:00 UTC): highest volatility, trending behavior — favor momentum strategies
- NY session (13:00-17:00 UTC): second volatility peak, also trending
- Asian session (00:00-07:00 UTC): low volatility, mean-reverting behavior
- London/NY overlap (13:00-17:00 UTC): strongest directional moves of the day
- Weekend gap risk: avoid holding positions after Friday 20:00 UTC
- Spread cost: ~1.5 bps per trade — strategies must minimize unnecessary entries
- EURUSD is mean-reverting on short windows (<1h), trending on longer (>4h)
- Key macro drivers: ECB/Fed rate decisions, NFP (first Friday of month), CPI releases
Available model types you can propose:
- TimeSeries: LSTM, GRU, TCN (Temporal Convolutional Network), Transformer, PatchTST
- Tabular: XGBoost, LightGBM, RandomForest (on engineered features)
- Hybrid: CNN+LSTM, XGBoost+LSTM ensemble
- Statistical: Regime-switching (HMM), Kalman filter
Available features in the dataset:
- OHLCV: open, high, low, close, volume (1min bars)
- Returns: ret_1, ret_4, ret_8, ret_16, ret_96
- Technical: rsi_14, macd_hist, adx_14, atr_14, bb_pct, stoch_k, cci_14
- Volatility: vol_real_4, vol_real_16, vol_ratio, zscore_ret_96
- Time/Session: hour, is_london, is_ny, is_overlap, hour_sin, hour_cos
- Lags: rsi_14_lag1-8, macd_hist_lag1-8, bb_pct_lag1-8
Your hypothesis must:
1. Specify which session(s) the strategy targets
2. Name which model type to use and why it fits EURUSD
3. Include a session filter (is_london / is_ny)
4. Include a spread filter (only trade when expected |return| > 0.0003)
5. Specify target: classification (fwd_sign_4) or regression (fwd_ret_4)
Please ensure your response is in JSON format:
{
"hypothesis": "A clear and concise hypothesis based on the provided information.",
"reason": "A detailed explanation supporting the generated hypothesis.",
"concise_reason": "One line summary that focuses on the justification for the change that leads to the hypothesis (like a part of a knowledge that we are building)",
"concise_observation": "One line summary. It focuses on the observation of the given scenario, data characteristics, or previous experiences (failures & succeses).",
"concise_justification": "One line summary. It focuses on the justification for the change in new hypothesis and the route of exploration supporting the growth of the hypothesis, based on the observation. ",
"concise_knowledge": "One line summary. It focuses on a transferable knowledege that comes with the new hypothesis. Use conditional grammar. eg. "If...., ..; When..., .; and etc"
"hypothesis": "A clear and concise trading hypothesis for EURUSD 1min.",
"reason": "Detailed explanation including session, model choice, and expected edge.",
"model_type": "One of: TimeSeries / Tabular / XGBoost",
"target_session": "london / ny / asian / all",
"expected_arr_range": "e.g. 8-12%"
}
user: |-
The following are the financial factors and their descriptions:
Previously tried approaches and their results:
{{ factor_descriptions }}
The report content is as follows:
{{ report_content }}
Additional context:
{{ report_content }}
Generate a NEW hypothesis that is meaningfully different from what has been tried.
Focus on approaches that have NOT been tested yet.
Target: beat current best ARR of 9.62%.

Some files were not shown because too many files have changed in this diff Show More