Agently Daily News Collector has been rewritten on top of Agently v4 and now uses:
TriggerFlow for the end-to-end pipeline
Agently v4 built-in Search and Browse tools
structured output contracts instead of the old v3 workflow API
Version constraint: this project requires Agently v4.0.8.3 or newer. The current implementation uses TriggerFlow sub flow to organize per-column pipelines, so earlier v4 releases are not compatible with the workflow structure used here.
The previous Agently v3 project has been archived under ./v3.
Features
Input a topic and generate a multi-column news briefing automatically
Search, shortlist, browse, summarize, and assemble stories in one flow
Save the final report as Markdown under ./outputs
Keep prompt templates in ./prompts for easy editing
Keep an independent ./tools layer so search/browse can be replaced without touching the main workflow
Keep flow construction in ./workflow so orchestration can evolve independently from collector logic
Quick Start
Install dependencies:
hljs language-bash
pip install -r requirements.txt
If you install Agently manually, make sure you use at least:
What changed is the engineering shape around that chain.
Project-level changes
The old v3 project used a main workflow plus a nested column workflow under ./workflows, with custom search.py / browse.py helpers and storage-style state passing.
The v4 project separates responsibilities more clearly:
news_collector/: app/integration layer
workflow/: parent flow, column sub flow, and concrete chunk logic
tools/: search/browse adapter layer
prompts/: structured prompt contracts
Model configuration is no longer hardcoded in Python. It now uses ${ENV.xxx} placeholders from SETTINGS.yaml, so deployment and local switching are simpler.
Tool wiring is no longer buried inside workflow code. Search, browse, and logger are injected as TriggerFlow runtime resources, which makes the workflow easier to replace or test.
The workflow plan is now closer to the business boundary:
column sub flow: search -> pick -> summarize -> write_column
the summarize stage inside the column flow is further pushed down into a summary sub flow, where TriggerFlow handles fan-out and collection directly instead of leaving asyncio.gather in business code
this keeps the parent focused on report orchestration and the child focused on one column lifecycle
the immediate value of sub flow here is that the column pipeline becomes a reusable, independently evolvable workflow unit instead of staying buried inside one oversized parent chunk
Agently v4 features used here
TriggerFlow orchestration
Replaces the old v3 workflow style with a more explicit flow graph (to, for_each, sub flow, branching-ready composition).
Unlike the old v3 Workflow chain, TriggerFlow here runs columns concurrently and also summarizes picked stories concurrently within each column.
Meaning for this project: the end-to-end news pipeline is easier to inspect, evolve, and split into chunks without mixing orchestration with business logic, while the parent report flow and the per-column pipeline can now be modeled directly as parent/child flows instead of one oversized chunk.
Sub flow composition
The project can now extract a naturally repeated business pipeline, “build one column”, into its own TriggerFlow and invoke it repeatedly from the parent flow inside for_each(column).
Meaning for this project:
the parent flow stays focused on report-level orchestration
the column pipeline can be tested, visualized, and exported independently
future variants such as “briefing column”, “deep-dive column”, or “regional column” can reuse or derive from the child flow instead of cloning parent-flow nodes
capture / write_back makes the boundary between parent and child explicit for input, state, and resources
Structured output contracts
YAML prompts now define output schema directly for outline generation, news picking, summarizing, and column writing.
Meaning for this project: much less handwritten parsing glue, clearer interfaces between steps, and easier prompt iteration.
Built-in Search / Browse tools
The project now defaults to Agently v4 built-in tool implementations instead of the old project-local helpers.
Meaning for this project: less custom infrastructure code, and users can still swap implementations through ./tools without rewriting the workflow.
Runtime resources and state namespaces
TriggerFlow runtime resources are used to inject logger/search/browse dependencies, while runtime state stores execution data such as request, outline, and intermediate results.
Meaning for this project: dependency wiring and execution state are separated cleanly, which keeps chunk code thinner and more maintainable.
Environment-aware settings
Agently v4 set_settings(..., auto_load_env=True) works directly with ${ENV.xxx} placeholders.
Meaning for this project: model endpoint, model name, and API key can be switched by environment instead of editing code or committing secrets.
Overall effect on this project
The core product behavior remains familiar to v3 users, but the project now has a cleaner app/workflow/tools/prompts split.
More logic is expressed in Agently-native capabilities instead of project-specific glue code.
True concurrency is now part of the default execution model. The v3 version was effectively serial, while the v4 version can process columns and per-column summaries in parallel through TriggerFlow.
Replacing tools, adjusting prompts, or evolving workflow steps is now lower-risk than in the old v3 layout, and the overall orchestration shape is again aligned with the original “main flow + column flow” mental model.
It also means workflow evolution can happen by layer: report-level changes stay in the parent flow, while column-level changes stay in the sub flow instead of forcing both to change together.
Notes
Python >=3.10 is required because Agently v4 requires it.
This project requires Agently >=4.0.8.3.
Model settings now use Agently v4 auto_load_env=True with ${ENV.xxx} placeholders.
tools/ defaults to Agently v4 built-in implementations, but you can replace the factories there with your own tools.
workflow/ is now split by business boundary into the parent flow, the column sub flow, report-level chunks, and column-level chunks.
news_collector/ acts as the app/integration layer for configuration, model wiring, and CLI entry support.
The current sample SETTINGS.yaml enables BROWSE.enable_playwright: true by default because many news pages need a real browser to return usable content.
If you do not want to install Playwright, set BROWSE.enable_playwright to false manually, but expect weaker browse quality on dynamic or protected sites.
The settings loader keeps basic compatibility with the old v3 keys such as MODEL_PROVIDER, MODEL_URL, MODEL_AUTH, MODEL_OPTIONS, MAX_COLUMN_NUM, and USE_CUSTOMIZE_OUTLINE.