Agently-Daily-News-Collector
An open-source LLM based automatically daily news collecting workflow showcase powered by Agently AI application development framework.
Links
README
From the repo.
Agently Daily News Collector v4
Agently Daily News Collector has been rewritten on top of Agently v4 and now uses:
TriggerFlowfor the end-to-end pipeline- Agently v4 built-in
SearchandBrowsetools - 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 flowto 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
./promptsfor easy editing - Keep an independent
./toolslayer so search/browse can be replaced without touching the main workflow - Keep flow construction in
./workflowso orchestration can evolve independently from collector logic
Quick Start
- Install dependencies:
pip install -r requirements.txt
If you install Agently manually, make sure you use at least:
pip install "agently>=4.0.8.3"
- Edit
SETTINGS.yaml:
- Keep the model block as environment placeholders
- Export the required environment variables:
export AGENTLY_NEWS_BASE_URL="https://api.openai.com/v1"
export AGENTLY_NEWS_MODEL="gpt-4.1-mini"
export AGENTLY_NEWS_API_KEY="your_api_key"
- Or put them in a local
.envfile:
AGENTLY_NEWS_BASE_URL=https://api.openai.com/v1
AGENTLY_NEWS_MODEL=gpt-4.1-mini
AGENTLY_NEWS_API_KEY=your_api_key
- Adjust language / search / concurrency settings if needed
- If your OpenAI-compatible endpoint does not require authentication, you can leave
AGENTLY_NEWS_API_KEYunset and the project will skipauth.
- Run:
python app.py
Or pass a topic directly:
python app.py "AI agents"
Project Structure
.
├── app.py
├── news_collector/
├── tools/
├── workflow/
├── prompts/
├── outputs/
├── logs/
└── v3/
Important v3 -> v4 Changes
The business chain is still roughly:
outline -> search -> pick -> browse + summarize -> write column -> render markdown
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 customsearch.py/browse.pyhelpers and storage-style state passing. - The v4 project separates responsibilities more clearly:
news_collector/: app/integration layerworkflow/: parent flow, column sub flow, and concrete chunk logictools/: search/browse adapter layerprompts/: structured prompt contracts
- Model configuration is no longer hardcoded in Python. It now uses
${ENV.xxx}placeholders fromSETTINGS.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:
- parent flow:
prepare_request -> generate_outline -> for_each(column) -> render_report - column sub flow:
search -> pick -> summarize -> write_column - the
summarizestage inside the column flow is further pushed down into a summary sub flow, where TriggerFlow handles fan-out and collection directly instead of leavingasyncio.gatherin business code - this keeps the parent focused on report orchestration and the child focused on one column lifecycle
- the immediate value of
sub flowhere is that the column pipeline becomes a reusable, independently evolvable workflow unit instead of staying buried inside one oversized parent chunk
- parent flow:
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.
- Replaces the old v3 workflow style with a more explicit flow graph (
- 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_backmakes the boundary between parent and child explicit for input, state, and resources
- 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
- 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
./toolswithout 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.
- Agently v4
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.10is required because Agently v4 requires it. - This project requires Agently
>=4.0.8.3. - Model settings now use Agently v4
auto_load_env=Truewith${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.yamlenablesBROWSE.enable_playwright: trueby default because many news pages need a real browser to return usable content. - If you do not want to install Playwright, set
BROWSE.enable_playwrighttofalsemanually, 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, andUSE_CUSTOMIZE_OUTLINE.
Collected info
- ★ 627 stars
- ⎇ 106 forks
- Language: Python
- Source updated: 6/27/2026