Commit Graph
100 Commits
Author SHA1 Message Date
Yijia-Xiao f692949f14 docs: TradingAgents v0.5.1 release 2026-09-24 07:20:06 +00:00
Yijia-Xiao e1a5f20480 release: 0.5.1 2026-09-24 05:04:30 +00:00
Yijia-Xiao bbd4d0413a fix(yahoo): report an unreachable Yahoo on insider transactions as unavailable
- the outage raised for an empty insider table reaches the router as a vendor error, not as a symbol with no data
2026-09-24 05:00:36 +00:00
Yijia-Xiao b176c9374b fix(yahoo): clean OHLCV frames on their own copy
- dropping undated rows copies the frame before prices are coerced, so no chained-assignment write
2026-09-24 05:00:36 +00:00
Yijia-Xiao 4187716842 fix(stocktwits): decode HTML entities in message bodies
- bodies reach the prompt and the screen as plain text (S&P, wasn't) rather than escaped (S&P, wasn't)
2026-09-24 05:00:36 +00:00
Yijia-Xiao 24c38602e5 docs: document Jev post screening (#1376) 2026-09-24 05:00:36 +00:00
Yijia-Xiao c924f84114 feat(sentiment): screen social posts with TypeSafe's Jev (#1376)
- with TYPESAFE_API_KEY set, each StockTwits and Reddit post is asked whether it is about the company and its stance on the stock
- posts clearly about something else are dropped before the per-source cut, and each block opens with a stance count
- any failed request leaves the source's posts unscreened and says so; without a key nothing changes
2026-09-24 05:00:36 +00:00
Yijia-Xiao f281feb483 feat(models): add GPT-6 Sol and Luna and Claude Opus 5.5
- gpt-6-sol and gpt-6-luna are the new default deep and quick models
- claude-opus-5-5 replaces claude-opus-5 in the picker; opus-5 and gpt-5.4-mini stay known as legacy IDs
2026-09-24 05:00:36 +00:00
Yijia-Xiao 8efb702871 style: normalise blank lines between definitions
- two between top-level definitions, one between methods, none doubled inside a body
2026-09-24 05:00:36 +00:00
Yijia-Xiao 91c4319147 test: keep tests off the network
- conftest refuses socket connections outside tests marked integration
- the one test that probed Yahoo for real now stubs the reachability check
2026-09-24 05:00:36 +00:00
Yijia-Xiao 1e9ad314d8 ci: run the py3.12 tests in a non-UTC time zone
- a test that only passes in UTC now fails in CI
2026-09-24 05:00:36 +00:00
Yijia-Xiao 825e6321ae docs: drop comments that narrate the next line
- about seventy '# Create/Initialize/Add ...' lines across graph, cli and dataflows, and the file-path headers; comments that give a reason stay
2026-09-24 05:00:36 +00:00
Yijia-Xiao 4a30cb1c0a refactor(cli): split the interactive choices and the run loop out of cli/main.py
- selections.py asks what to run; run.py builds the graph, streams it to the live view and saves the report
- main.py keeps the Typer app and its two commands
2026-09-24 05:00:36 +00:00
Yijia-Xiao 56bd98f690 refactor(cli): move the live view to cli/display.py and the prompts to cli/prompts.py
- display.py holds the message buffer, layout, status tables and report panels, the analyst wall-time tracker (CLI-only, from graph/analyst_execution) and the one Console
- utils.py is renamed prompts.py, which is what it holds; its analyst list is ANALYST_CHOICES, apart from display's ANALYST_ORDER
- get_initial_analyst_node, a one-line helper with one caller, is inlined
- the wall-time tracker tests sit with the other display tests, and tests import cli.prompts as prompts
2026-09-24 05:00:36 +00:00
Yijia-Xiao 969861e8be refactor(graph): settle past decisions in graph/settlement.py
- resolve_benchmark, fetch_returns and settle_pending are module functions; the graph's settle_pending runs them under its config
- create_run_state settles through settle_pending, so the CLI path also settles under the graph's config
2026-09-24 05:00:36 +00:00
Yijia-Xiao c9695673bf refactor(llm_clients): build the client keyword arguments in llm_clients
- build_llm_kwargs(config) replaces the graph's _get_provider_kwargs, with the retry and token coercion beside it
2026-09-24 05:00:36 +00:00
Yijia-Xiao e7354d8af4 refactor: move the decision log to tradingagents/decision_log.py
- it is the run's persistent record, used by the graph, backtest and CLI, not an agent utility; agents/utils is gone
2026-09-24 05:00:36 +00:00
Yijia-Xiao dcbff5ea42 feat(backtest): summarize a backtest result, or a decision log by its path
- callers no longer construct TradingMemoryLog to score a run; README and CLI pass the result
2026-09-24 05:00:36 +00:00
Yijia-Xiao 852ffead43 refactor(agents): organise the agents package by what each module holds
- tools.py: the analysts' data tools, previously seven modules under utils
- context.py (was agent_utils, without its tool re-exports), state.py, rating.py and structured.py sit beside schemas.py
- every role package has an __init__
2026-09-24 04:37:40 +00:00
Yijia-Xiao 6097b582d9 refactor(dataflows): group the vendors under dataflows/vendors
- vendors/yahoo: ohlcv (loader and cache), market (prices, indicators), fundamentals (profile, statements, insider), news, snapshot
- vendors/alpha_vantage is a package; sec_edgar, fred, polymarket, reddit and stocktwits sit beside it
- the one-method StockstatsUtils class is a function; the duplicate Yahoo host constant is gone
- tests are named after the modules they cover: test_ohlcv_date_column, test_yahoo_snapshot, and the ohlcv and snapshot aliases
2026-09-24 04:37:40 +00:00
Yijia-Xiao c42a2f2c61 refactor(dataflows): name the shared modules by what they hold
- interface -> router; symbol_utils -> symbols, which also takes safe_ticker_component
- utils is split: get_current_date to date_window, the HTTP helpers to net
- dataflows imports are absolute; the NoMarketDataError re-export from symbols is gone
2026-09-24 04:31:05 +00:00
Yijia-Xiao a58aa613fc fix: name no date after the run in what a historical run reads
- coverage and withholding notices named where a vendor's coverage starts or today's date
- the instrument context named today's date in every analyst prompt
2026-09-24 04:31:05 +00:00
Yijia-Xiao f142e79660 refactor(dataflows): build the three yfinance statements with one helper
- balance sheet, cash flow and income statement share _statement; output unchanged
2026-09-24 04:31:05 +00:00
Yijia-Xiao 9b14233a24 chore: remove code nothing uses
- is_yahoo_safe, has_checkpoint, get_wall_times, the graph's curr_state and the project_dir config key
- the CLI's final_report and current_agent state, its duplicate get_analysis_date and the save_report_to_disk wrapper
- the dotenv import guard (a hard dependency) and a warning filter for langgraph-checkpoint 4.0.3
2026-09-24 04:31:05 +00:00
Yijia-Xiao 41fc25ac0d refactor(graph): wire each analyst from one declaration of its tools
- an analyst's TOOLS tuple is both what it is offered and what its tool node runs
- one routing function replaces four copies of should_continue_<analyst>
- the sentiment analyst has no tools, so the unreachable social tool node is gone
2026-09-24 04:31:05 +00:00
Yijia-Xiao 4e1faf6465 chore(graph): remove SignalProcessor
- process_signal reads the rating with parse_rating; the adapter ignored the model it was given
2026-09-24 04:31:05 +00:00
Yijia-Xiao a6e92a6b5e chore(agents): remove the deprecated social media analyst names
- the social_media_analyst module and the create_social_media_analyst alias; use create_sentiment_analyst
2026-09-24 04:31:04 +00:00
Yijia-Xiao 15b8276b92 fix(agents): give the fundamentals analyst the insider transactions tool
- the tool sat in the news tool node, which no analyst offered it from, so no run used insider data
- the full-graph test now requires it
2026-09-24 04:31:04 +00:00
Yijia-Xiao 2938e1c7e9 fix(graph): stop keeping every run's full state in the graph
- a graph reused across a backtest grid held each run's complete state for its whole life
- the state log is written from the run's own state; the ticker attribute it read is removed
2026-09-24 04:31:04 +00:00
Yijia-Xiao f197e09dcc refactor(dataflows): read company identity and settlement prices through the data layer
- the Yahoo vendor owns get_company_profile and get_closes; agent_utils and the graph no longer import yfinance
- a test keeps vendor libraries inside dataflows
2026-09-24 00:41:56 +00:00
Yijia-Xiao b4479b0c70 fix(dataflows): stop telling a historical run today's date
- yfinance headers no longer stamp the wall clock (Data retrieved on)
2026-09-24 00:41:56 +00:00
Yijia-Xiao 4a71dc708d fix(cli): say whether a checkpointed run resumed or started fresh
- the announcement existed but the run path never called it
- tested through run_analysis rather than by calling the helper directly
2026-09-24 00:41:56 +00:00
Yijia-Xiao 1e439352c0 test: run the whole graph end to end with scripted models
- every analyst calls its tools through the router, offline; the decision is parsed and logged
- free-text and structured-output paths, and resume from a checkpoint
- remove the unused mock_llm_client fixture
2026-09-24 00:41:56 +00:00
Yijia-Xiao 632fb51d18 ci: run on pushes to version branches
- v0.5.1 and later release branches get the test matrix before their release PR
2026-09-23 20:11:26 +00:00
Yijia-Xiao 5c2dded82c feat(config): benchmark B3 tickers against the Ibovespa (#1366)
- .SA maps to ^BVSP
2026-09-23 19:28:56 +00:00
Yijia-Xiao 1f7a2aa865 test: keep a developer's TRADINGAGENTS_* settings out of the suite (#1368)
- each such setting from the shell or .env is blanked before the package loads
2026-09-23 19:28:56 +00:00
Yijia-Xiao 25a86a8890 fix(config): keep the default path when a path variable is blank
- TRADINGAGENTS_RESULTS_DIR, _CACHE_DIR and _MEMORY_LOG_PATH left blank no longer resolve to an empty path
2026-09-23 19:28:56 +00:00
Yijia-Xiao 2340fe4396 test(ohlcv): stamp cache mtimes in local time (#1372)
- the cache reads mtimes back in local time; the tests wrote them as UTC
2026-09-23 19:28:56 +00:00
Yijia-Xiao 96daaf1152 fix(dataflows): read the vendors of the run in progress (#1369)
- propagate and settle_pending bind the graph's config for the length of the run
- a graph built later, or running concurrently, no longer changes another graph's vendors
2026-09-23 19:28:56 +00:00
Yijia-Xiao a9cc3be731 fix(sec_edgar): list only fiscal years in annual statements
- annual columns are the periods an annual report covers, so 10-Q balances and twelve-month totals no longer read as fiscal years
- a value is still the latest filing of any form, so a later recast counts from its filing date
2026-09-23 19:28:56 +00:00
Yijia-Xiao 7fe2252244 release: 0.5.0
- point-in-time integrity across every dated path, and a vendor failure reported as a vendor failure
- SEC EDGAR fundamentals served as filed
- backtesting over a ticker and date grid, and the caller's portfolio as run input
- current model lineups across every provider
2026-09-18 05:42:23 +00:00
Yijia-Xiao 76a93d615a test(cli): read the backtest help without terminal styling
- colour splits "--start" across escape sequences, so the assertion strips them
2026-09-18 05:42:23 +00:00
Yijia-Xiao c039e39056 fix(dataflows): tell an outage from an unknown symbol on every Yahoo path
- prices, indicators and insider filings now use the same check as the statements
2026-09-18 04:02:57 +00:00
Yijia-Xiao 4acdc16513 chore: drop three more dependencies nothing imports
- langchain-experimental, parsel, tqdm
2026-09-18 01:49:52 +00:00
Yijia-Xiao d5ba41bac3 fix(dataflows): report a vendor failure as a vendor failure
- yfinance returned its errors as text, which the router counted as an answer, so the chain stopped and the text reached the analyst
- an empty result is checked against the vendor being reachable, so an outage is not reported as a company with no data
- a chain where every vendor is unavailable says so instead of ending the run
2026-09-18 01:49:52 +00:00
Yijia-Xiao 10cc070fa3 feat(llm): refresh the model lists to each provider's current lineup
- xAI: Grok 4.6 and 4.5; DeepSeek: deepseek-flash (V4.1); Qwen: the 3.8 series; Mistral: the current dated snapshots
- every provider can name a model the picker does not list
- retired IDs stay valid, so existing configs run without a warning
2026-09-18 01:14:05 +00:00
Yijia-Xiao ed6eae44b6 chore: drop dependencies nothing imports
- backtrader, redis, and setuptools at runtime
2026-09-18 00:04:53 +00:00
Yijia-Xiao aef4af90e3 fix(dataflows): let the next vendor serve what Alpha Vantage cannot
- an indicator it does not carry raises instead of returning prose the router counts as an answer
- ticker news asks for the configured article limit
2026-09-18 00:04:53 +00:00
Yijia-Xiao bbcd6661af fix(graph): remove the database sidecars when clearing checkpoints
- SQLite keeps committed state in -wal and -shm beside the database
2026-09-18 00:04:53 +00:00
Yijia-Xiao f8042efdde fix(agents): keep one unreadable price from discarding the decision
- a price written as a range or a hedge is dropped like any other unusable value
- a field the model did not give is named as not provided, rather than omitted
2026-09-18 00:04:53 +00:00
Yijia-Xiao d0881f081e docs: document the path and benchmark settings 2026-09-18 00:04:52 +00:00
Yijia-Xiao 8bde10cf44 docs: correct the claims that no longer match the code
- the custom model option does not exist for every provider; name any model ID instead
- alpha is measured against the regional benchmark, not always SPY
- the environment overrides a fixed set of config keys
- list the providers the picker offers, and the macro data key
- drop the example call to a method that was removed
2026-09-17 23:44:14 +00:00
Yijia-Xiao 9683194793 fix(cli): finish the run surface
- backtest takes --run-id, so an interrupted sweep continues
- an inverted date range or an empty ticker list is an error, not a clean zero-cell run
- a setup failure in a sweep reports one line instead of a traceback
- the remembered endpoint URL is offered back
- a round count set in the environment says it overrode the chosen research depth
- the run directory validates the ticker, and the report saves under results_dir
- the run says whether it resumed a saved run or started fresh
2026-09-17 23:44:14 +00:00
Yijia-Xiao 04b691804c fix(dataflows): include the analysis day in the Alpha Vantage news window
- time_to was midnight starting the end date, dropping that day's news
2026-09-17 23:37:43 +00:00
Yijia-Xiao c3bb991974 fix(dataflows): date insider rows by the trade, and say when it became public
- rows carry the transaction date; a Form 4 is filed up to two business days later
- an indicator that could not be read is unavailable, not a blank value for the day
2026-09-17 23:37:43 +00:00
Yijia-Xiao f0a1cf6290 fix(agents): say when the resolved identity is today's, not the run date's
- the vendor profile has no historical vintage, and every agent is told to anchor to it
2026-09-17 23:37:43 +00:00
Yijia-Xiao de7e43fc4a fix(dataflows): quote the prices the vendor reported in the verification snapshot
- gap filling keeps indicators on a continuous series, but put the previous session's open, high and low under an unsettled bar's date
- load_ohlcv takes fill_gaps, and the snapshot reads the frame as reported
2026-09-17 23:37:43 +00:00
Yijia-Xiao 13b35e8aeb docs: state the behaviour without the worked examples 2026-09-17 07:31:44 +00:00
Yijia-Xiao 008ac655a9 fix(cli): send GLM traffic to the platform its key belongs to
- the provider table named the China endpoint while the key mapping and client registry named Z.AI
2026-09-17 07:31:44 +00:00
Yijia-Xiao 2ddfe4ceb5 fix(agents): give every prompt honest inputs
- the fundamentals brief reached the model as a Python tuple
- analysts no longer emit a trade call that nothing reads
- a report that was not produced says so instead of appearing as a blank section
2026-09-17 07:31:44 +00:00
Yijia-Xiao 85d9137437 feat(graph): measure an outcome over a configurable window
- holding_period_days sets it; the price request covers the calendar span those trading days occupy
- reflection states the window it judges, so a short one does not read as a failed thesis
2026-09-17 07:31:44 +00:00
Yijia-Xiao 2ca59cc795 fix(backtest): score a decision against the direction it claimed
- a Sell that fell counted as a miss and a Sell that rose as a hit
- Hold claims no direction, so it reports mean alpha and no hit rate
- the report names the window the outcomes were measured over
2026-09-17 07:31:44 +00:00
Yijia-Xiao 63989515c9 fix(cli): show what the run actually produced (#649, #784)
- a non-blank message is text, whatever it would mean as a Python literal
- the live layout renders on the alternate screen, so a tall layout does not scroll
- a run with no readable rating says so instead of looking like a normal result
- the state log keeps non-ASCII readable (#1081)
2026-09-17 05:00:08 +00:00
Yijia-Xiao 486dec1710 fix(agents): state the output shape in the decision prompts
- the field list lived only in the schema, which a provider without structured output never sees
- the trader maps the five-tier recommendation onto its three actions
2026-09-17 05:00:08 +00:00
Yijia-Xiao 8d30fee06b fix(agents): record the decision that was made, or flag it for review
- the labelled rating decides, whatever dash separates it, and a scale the model echoed is not one
- prose naming several ratings is reviewed rather than read as the first word in the text
- an unreadable decision is tagged REVIEW everywhere instead of a tradeable Hold
- unrated decisions are counted apart from the backtest figures
2026-09-17 05:00:08 +00:00
Yijia-Xiao 3244a568ed docs: document fundamentals as filed 2026-09-17 02:37:15 +00:00
Yijia-Xiao b6dad747e9 fix(dataflows): state the vintage rule on yfinance statements
- periods are cut at the fiscal period end and the vendor reports no filing date, so the newest period may not have been published yet
2026-09-17 02:37:15 +00:00
Yijia-Xiao f881c4a111 feat(dataflows): serve US statements as filed, from SEC EDGAR
- statements are limited to facts filed by the run's date, at the values filed then
- quarterly figures are picked by span, so a year to date total is not read as a quarter
- a fourth quarter is reported unavailable rather than derived
- opt in with sec_edgar in the fundamental_data chain; a non-filer falls through
2026-09-17 02:37:15 +00:00
Yijia-Xiao 8ac4371387 fix(llm): suppress object-form tool_choice for Ollama (#1062)
- Ollama takes the local-compatible client, like the generic endpoint
2026-09-17 01:10:48 +00:00
Yijia-Xiao 60dcf64723 fix(graph): keep a failed reflection from stopping the next run (#645)
- settling a past decision is per entry; a provider error leaves it pending
- an explicitly configured benchmark ticker is normalized like any other symbol (#1075)
2026-09-17 01:10:48 +00:00
Yijia-Xiao 8d64416436 fix(dataflows): trim global news to the window before the limit (#1356)
- out-of-window articles no longer spend the article budget or cut the remaining searches short
2026-09-17 01:10:48 +00:00
Yijia-Xiao c4152d6946 docs: note the backtest command and remembered selections 2026-09-16 21:45:08 +00:00
Yijia-Xiao 375af054b7 feat(cli): offer the previous run's selections as defaults (#1236, #920)
- analysts, depth, provider, models and language prefill; prompts still shown
- values no longer offered by the current catalog are dropped
- environment variables keep skipping their step
2026-09-16 21:45:08 +00:00
Yijia-Xiao d8eceb6571 feat(cli): add a backtest command (#1234)
- analysis stays the bare invocation; backtest runs a ticker and date grid
- selections name the models as the config does
- the pending note prints only when a cell is pending
2026-09-16 21:45:08 +00:00
Yijia-Xiao 63738c8f2c docs: drop the analyze subcommand from the CLI examples 2026-09-16 20:19:49 +00:00
Yijia-Xiao 7bf2117491 docs: document the portfolio input and decision evaluation 2026-09-16 20:19:49 +00:00
Yijia-Xiao 8721b92f65 feat: evaluate decisions over a grid of tickers and dates (#1234)
- run_backtest runs the pipeline per cell into its own decision log and resumes by skipping logged cells
- summarize scores settled cells by rating on realized alpha
- settle_pending settles a ticker whose last decision would otherwise stay open
2026-09-16 20:19:49 +00:00
Yijia-Xiao 9794a90734 fix(memory): keep a settled decision from being logged twice
- the duplicate guard matched only pending entries, so re-running a settled ticker and date appended a second one
2026-09-16 20:19:49 +00:00
Yijia-Xiao 6436d1ff30 feat(graph): accept the caller's portfolio as run input (#1304, #1166)
- PortfolioContext input, rendered once into state and read by the trader, risk and portfolio agents
- --portfolio JSON file on the CLI
- a run without it is never treated as a flat book
- the checkpoint signature keys on the portfolio
2026-09-16 20:19:49 +00:00
Yijia-Xiao dffff22951 fix(dataflows): use configured defaults for omitted Alpha Vantage global-news options (#1326) 2026-09-15 01:33:48 +00:00
Yijia-Xiao ef52d4452b docs: add uv install and Docker rebuild notes (#1173, #1297)
- uv alternative to conda and pip
- rebuild the Docker image after updating
2026-09-15 01:33:48 +00:00
Yijia-Xiao 2942655f70 fix(dataflows): map Shanghai .SH tickers to Yahoo's .SS (#1260)
- normalize_symbol maps 600519.SH to 600519.SS
- the alpha benchmark is resolved from the normalized symbol
2026-09-15 00:04:25 +00:00
Yijia-Xiao fadc698e20 fix(dataflows): bound insider filings and prediction markets by the trade date
- insider transactions are filtered to filings on or before the run date
- prediction-market odds are withheld from a historical run
2026-09-15 00:00:26 +00:00
Yijia-Xiao 29e331a9af fix(dataflows): keep one OHLCV cache file per symbol (#1330)
- the cache file is keyed by symbol and serves only on the day it was written
2026-09-14 23:51:48 +00:00
Yijia-Xiao 99313bfdbc fix(dataflows): zero-pad HK ticker codes to Yahoo's 4-digit form (#1342)
- normalize_symbol maps 09992.HK to 9992.HK and 700.HK to 0700.HK (#957)
2026-09-14 23:37:48 +00:00
Yijia-Xiao d04693a208 fix(agents): bound tool dates by the run's trade date
- dated tools read trade_date from graph state and clamp later or missing dates #1331
- propagate() rejects non-canonical and future trade dates #1319
2026-09-14 23:24:31 +00:00
Yijia-Xiao 4a9f196e92 fix(cli): read and write the decision log on the CLI path
- shared create_run_state and record_decision for propagate() and the CLI #1332 #1347
2026-09-14 23:12:17 +00:00
Yijia-Xiao 2c1ba388d6 chore: remove two unused scripts
- test.py
- scripts/smoke_structured_output.py
2026-09-14 23:12:17 +00:00
Yijia-Xiao b9666f6e09 docs: use a current date in the usage examples 2026-09-14 22:38:19 +00:00
Yijia-Xiao 34899bd320 fix(cli): save prompted API keys to an owner-only .env
- the key prompt created .env with the default umask, typically readable by
  other local users
- create it 0600 and tighten an existing file before writing the key; a
  read-only file is still updated
2026-09-14 22:38:19 +00:00
Yijia-Xiao b20c8e60a4 fix(dataflows): keep vendor API keys out of request errors
- FRED and Alpha Vantage authenticate with a query parameter, and requests
  quotes the full URL in HTTP, connection and timeout errors, so the key was
  written into any log or traceback that recorded one
- route both vendors through one request helper that re-raises a requests error
  as the same class with the key removed, carrying no request, response or
  exception chain, each of which still held the URL #1324
2026-09-14 22:38:19 +00:00
Yijia-Xiao 241638da68 fix(dataflows): search all subreddits in one Reddit request
- anonymous RSS allows about one request per minute per IP, so fetching each
  subreddit separately hit a 429 and a 60s back-off on nearly every run
- search the subreddits as one combined feed at Reddit's full page size and
  group posts by the subreddit each entry names; each subreddit keeps its own
  limit, and a full page is not taken as evidence of absence
- drop the unused JSON search path, still blocked with a 403, and the
  per-subreddit pacing; arguments after subreddits are keyword-only
- the sentiment prompt no longer asks for vote and comment counts, which the
  RSS feed does not carry
2026-09-14 22:07:42 +00:00
Yijia-Xiao 2e38b47dca fix(dataflows): report windows a feed cannot observe as unavailable
- Yahoo news and the Reddit and StockTwits feeds serve only recent items, so a
  historical window trimmed to nothing was reported as "no news" or "no
  posts", and the sentiment analyst scored that silence as a neutral signal
- judge each empty window in one shared rule: it is a real absence only when
  the feed's coverage reaches the window's first day and the window ends by
  today; otherwise report it unavailable with where coverage starts
- coverage comes from the returned timestamps, which are newest-first on these
  feeds, plus Reddit's one-week search lookback; merged global-news searches
  prove no continuity and are bounded by the present alone
- state in the sentiment analyst that historical sentiment inputs are not
  guaranteed to be point-in-time
2026-09-14 22:07:41 +00:00
Yijia-Xiao 673abb3c68 feat(llm): add GPT-6 Astra, Gemini 3.8 Flash and the current Claude models
- OpenAI: gpt-6-astra
- Google: gemini-3.8-flash and gemini-3.5-flash-lite
- Anthropic: claude-opus-5 and claude-fable-5-1
- models taken out of the picker stay valid through LEGACY_MODELS, so configs
  that name them run without an unknown-model warning
2026-09-14 18:09:33 +00:00
Yijia-Xiao 9b4c741d33 fix(llm): forward reasoning effort to GPT-6 and gate minimal thinking
- reasoning_effort was forwarded only to IDs matching gpt-5 or the o-series, so
  GPT-6 models silently dropped the configured effort; match GPT-5 and later,
  with a version boundary so unrelated IDs do not match
- Gemini Pro, 3.8+ and the -latest aliases reject thinking_level "minimal"
  with a 400; send it only to numbered Flash models before 3.8 and map it to
  "low" elsewhere, since aliases move between generations
2026-09-14 18:09:33 +00:00
Yijia-Xiao 62d3479217 fix(agents): stop conflict alone from defaulting the verdict to Hold
- both manager prompts and both rating fields listed "materially conflicting"
  as a Hold condition, and every bull/bear and risk debate is conflicting, so
  a modest directional edge collapsed to Hold
- state one rule at all four sites: conflict alone is not a reason to Hold,
  commit to the stronger side sized by how decisively it wins, and Hold only
  when the evidence is still balanced after weighing or too thin for a call
- a modest bull edge now resolves to Overweight; a genuinely balanced debate
  still resolves to Hold #1321
2026-09-14 18:09:33 +00:00
Yijia-Xiao 821848bb82 docs: tighten the comments on the point-in-time guards
- keep what the code cannot state itself: which session a closeless bar is,
  where the drop actually happens, and why the trim must stay unguarded
- drop the field-by-field enumeration, the account of what the previous
  behaviour got wrong, and the restatements of adjacent calls
2026-09-07 22:21:20 +00:00
Yijia-Xiao d6ca23aee5 feat(llm): add the current Kimi models to the picker
- list kimi-k3 (flagship, 1M context) and kimi-k2.6 (256K, thinking modes) on
  both tiers, replacing the custom-only entry
- keep Custom model ID for models newer than the list
- omit the k2.7-code variants: coding specialists, not analysis models
2026-09-07 21:52:29 +00:00
Yijia-Xiao ef383df8f4 fix(dataflows): don't report a symbol as unavailable over an unsettled bar
- a newest bar with no close made load_ohlcv reject the whole frame, so the
  routing layer answered with its no-data sentinel: the caller lost the entire
  price history and was told the symbol may be invalid, delisted or not
  covered, when only the latest session had not settled
- treat a closeless newest bar as an unsettled session instead. The gap fill
  already drops it, here and mid-series alike, so the frame ends at the last
  settled bar; only a range with no close anywhere is still no data
- the staleness check keeps deciding whether what remains is recent enough, so
  falling back cannot resurrect a long-dead series
- log which bars had no close and which date is being used as the latest close
2026-09-07 21:42:25 +00:00
Yijia-Xiao d58b838081 test: keep the Ollama endpoint assertions off the terminal colour
- the console highlights numbers and URLs, so with colour enabled the rendered
  output splits asserted substrings with escape codes and two tests fail
- strip the codes before asserting so the result no longer depends on where the
  suite runs
2026-09-07 21:28:52 +00:00