ET Multiple Agent is a multi-step AI content pipeline for generating blogs, reviews, social posts, images, scheduling metadata, and post-approval translations from a single web UI.
The project uses:
FastAPIfor the backend APILangGraphfor the generation workflowGroqfor LLM-powered writing, review, and translationTavilyandNewsAPIfor news-mode researchBytezas the preferred image generation providerStability AIas an image-generation fallback- a small
C++localization engine wrapper plus Groq fallback translation
- Generate content in two modes:
newsproduct
- Multi-step content pipeline:
- write
- validate
- RAG validation
- review
- image generation
- social post generation
- human approval loop
- localization
- Human-in-the-loop approval and refinement
- Translation support after approval
- Social post scheduling endpoints
- Single-page frontend with tabs for:
- blog
- review
- social posts
- images
- translations
- schedule queue
ETHACKATHON/
|-- agents/ # Pipeline agents
|-- engine/ # C++ localization engine source
|-- graph/ # LangGraph workflow
|-- prompts/ # Prompt templates
|-- rag/ # RAG helpers and vector store integration
|-- api_server.py # FastAPI backend
|-- index.html # Frontend UI
|-- config.py # Environment-backed config
|-- start.ps1 # Windows startup script
|-- run.bat # Windows launcher
`-- test_graph_state.py # Direct localization test
- Windows
- Python 3.12+ recommended
- A virtual environment at
ETHACKATHON\.venv
API keys are read from .env.
Create a .env file in the project root with:
GROQ_API_KEY=your_groq_key
GROQ_MODEL=llama-3.3-70b-versatile
TAVILY_API_KEY=your_tavily_key
STABILITY_API_KEY=your_stability_key
BYTEZ_API_KEY=your_bytez_key
BYTEZ_IMAGE_MODEL=stabilityai/stable-diffusion-xl-base-1.0
NEWSAPI_KEY=your_newsapi_key
HF_TOKEN=optional_huggingface_tokenNotes:
GROQ_API_KEYis required for blog generation, review, and translation.GROQ_MODELis optional. If omitted, the app falls back to the default fromconfig.py.TAVILY_API_KEYis used for news research.NEWSAPI_KEYsupports additional news retrieval.BYTEZ_API_KEYis the preferred key for image generation.BYTEZ_IMAGE_MODELis optional and defaults tostabilityai/stable-diffusion-xl-base-1.0.STABILITY_API_KEYis optional fallback support for image generation.HF_TOKENis optional in the current codebase.
From the project root:
python -m venv .venv
.\.venv\Scripts\activate
pip install -r requirements.txtUse the included launcher:
.\start.ps1or
run.batThis starts:
- backend at
http://127.0.0.1:8000 - frontend at
http://127.0.0.1:5500/index.html
start.ps1 now clears stale listeners on ports 8000 and 5500 before launching, which helps avoid old backend/frontend instances hanging around between restarts.
Start backend:
.\.venv\Scripts\python.exe -m uvicorn api_server:app --host 127.0.0.1 --port 8000Start frontend:
.\.venv\Scripts\python.exe -m http.server 5500Then open:
http://127.0.0.1:5500/index.html
The backend pipeline is defined in graph/blog_graph.py.
Main flow:
writevalidaterag_validatereviewgen_imagesgen_socialhuman_reviewlocalizeafter approval
Important behavior:
- Translation only runs after the user approves the content.
- The frontend sends selected target languages during generate and approval.
- Social image generation reuses already-generated platform images when available instead of regenerating them.
- Image generation runs selected formats in parallel.
- Localization first pings the C++ layer if present, then performs the actual translations through Groq in parallel.
Starts a new generation job.
Example fields:
modetopicaudiencelengthcontextproduct_detailskey_featuresuvpgenerate_imagesimage_formatssocial_platformsuser_image_b64target_languages
Returns the current job state, including:
- generation status
- parsed blog
- review details
- image outputs
- social posts
localized_content
Used for:
approverefine
When approved, localization is triggered if target_languages are present.
Schedules a generated social post.
Returns the current scheduled post queue.
Simple health endpoint.
Translation support is implemented through:
graph/blog_graph.pyagents/localization_wrapper.pyengine/localization_agent.cpp
Behavior:
- if no target languages are selected, localization is skipped
- if the content is not approved, localization is skipped
- after approval, translated content is stored under
localized_content
You can directly test the localization path with:
.\.venv\Scripts\python.exe test_graph_state.pyThis exercises run_localization(...) directly.
Check:
.envexists in the project rootGROQ_API_KEYis valid- target languages are selected in the UI
- content is approved, not just generated
Notes:
- if
engine/localization_agent.exeis missing, the app now falls back to Groq-only translation - translations are generated after approval, not during the first draft pass
Check:
TAVILY_API_KEYNEWSAPI_KEY
Check:
BYTEZ_API_KEYSTABILITY_API_KEY- image generation toggle in the UI
Notes:
- Bytez is the preferred provider
- Stability is only used as fallback
- if Instagram/LinkedIn images were already generated in the image stage, the social stage reuses them for speed
Check:
- backend is running on
8000 - frontend is running on
5500 - browser is using
http://127.0.0.1:5500/index.html
Generated runtime artifacts are intentionally ignored:
.env__pycache__- logs
- generated outputs
- local Chroma DB files
- compiled localization executable
This keeps the repository focused on source code.