Release 0.5.0 - #1364
Merged
Merged
Release 0.5.0#1364
Conversation
- 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
- 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
…odels - 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
- 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
- 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
- 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
- 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
- test.py - scripts/smoke_structured_output.py
- normalize_symbol maps 09992.HK to 9992.HK and 700.HK to 0700.HK (#957)
- the cache file is keyed by symbol and serves only on the day it was written
…rade date - insider transactions are filtered to filings on or before the run date - prediction-market odds are withheld from a historical run
- normalize_symbol maps 600519.SH to 600519.SS - the alpha benchmark is resolved from the normalized symbol
…bal-news options (#1326)
- 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
- the duplicate guard matched only pending entries, so re-running a settled ticker and date appended a second one
- 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
- 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
- out-of-window articles no longer spend the article budget or cut the remaining searches short
- 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)
- Ollama takes the local-compatible client, like the generic endpoint
- 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
- 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
- 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
- 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
- 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)
- 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
- 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
- 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
- the provider table named the China endpoint while the key mapping and client registry named Z.AI
…ion 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
…ate's - the vendor profile has no historical vintage, and every agent is told to anchor to it
…e 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
…ndow - time_to was midnight starting the end date, dropping that day's news
- 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
- 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
- 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
- SQLite keeps committed state in -wal and -shm beside the database
- 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
- backtrader, redis, and setuptools at runtime
- 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
- 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
- langchain-experimental, parsel, tqdm
…path - prices, indicators and insider filings now use the same check as the statements
- colour splits "--start" across escape sequences, so the assertion strips them
- 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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Point-in-time integrity across every dated path, decisions recorded as they were
made, backtesting over a grid of tickers and dates, the caller's portfolio as run
input, and SEC EDGAR fundamentals served as filed.
Highlights
run_backtestruns the pipeline over a ticker and date grid into its own decision log and scores the settled cells;tradingagents backtestdoes the same from the CLI.propagate(..., portfolio=...)and--portfoliolet the trader, risk and portfolio agents size against real holdings; a run without one is never treated as a flat book.Models
Current lineups for every provider: GPT-6 Astra and the GPT-5.6 family, Gemini 3.8 Flash, Claude Opus 5 and Fable 5.1, Grok 4.6, DeepSeek Flash, Qwen 3.8, GLM-5.3, MiniMax M3, Kimi K3 and the current Mistral snapshots. Every provider also accepts a model ID the picker does not list.
Also in this release
CHANGELOG.mdcarries the full entry, including the contributors credited in this release.