Great news! This post is now available in an audio version. Press play below to listen, or simply keep reading to enjoy the article in its classic text format.
Introduction
Ever stared at a blank screen, knowing you need to create content but not knowing where to start? We’ve all been there. The research, the writing, the editing… it can be a real grind.
But what if you had a dedicated team working for you? A super-fast researcher, a creative writer, and a sharp-eyed editor, all ready to turn your vaguest idea into a finished script?
Well, I decided to build exactly that.
Today, we’re going to pull back the curtain on the Concept to Creation Content Assistant — a project that builds an autonomous team of AI agents to do the heavy lifting for you. Let’s dive in!
What’s the Goal of This Project?
The main job of this project is simple, but powerful:
To create a collaborative team of AI agents that can take a single topic and turn it into a fully researched, written, and polished piece of content.
As the project grows I will be adding more features and refining it along the way, my goal is to have a tiny, automated creative agency living in my computer. I give it a topic, and it handles the rest, learning my personal style over time to get better with every project!
In this blog, I have divided the project in 3 blocks to help you understand the project better. Lets Deep-dive into the project in the following sections
Block #1: The AI Team
Just like a real creative studio, this project isn’t about one single AI doing everything. It’s about teamwork! We have a few specialized agents, each with a very specific job.
- The Researcher : Think of this agent as a digital librarian on hyperdrive. It takes your topic, intelligently breaks it down, and scours the internet for the most relevant and up-to-date information. Its only job is to gather facts and notes.
The below code highlights how I defined the research prompt, Here the Human input is taken from the Streamlit frontend application and passed on to the LangGraphs State
research_prompt = ChatPromptTemplate.from_messages([
("system", "You are a world-class researcher. Your goal is to find diverse and interesting information on a given topic. You are not a writer. Your sole job is to research. Break the topic down into 3-5 sub-queries and use your search tool for each. Synthesize the results into a list of key points and facts. Do not write paragraphs or a narrative."),
("human", "Research the topic: {topic}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
])
The Writer : This is the creative wordsmith. It takes the researcher’s notes and its main goal is to weave them into an engaging, well-structured script.
The Critic : The tough but fair editor. The Critic reviews the writer’s draft, checking it for clarity, structure, and—most importantly—accuracy against the original research notes. If it’s not good enough, it sends it back with feedback.
The Finalizer : Once a script is approved, the creative director steps in. This agent generates catchy titles, cool visual ideas, and even sound effect suggestions to bring the content to life.
Block #2: The Automated Workflow (LangGraph)
So, how do we get these agents to work together without getting in each other’s way? This is where a super-cool tool called LangGraph comes in.
Think of LangGraph as the project manager or an automated assembly line for our AI team. It defines the exact workflow, telling each agent when it’s their turn to act.
The most magical part is the self-correction loop.
- The
Writer
creates a draft. - The
Critic
reviews it. - The “Graph” then makes a decision.
- If the
Critic
gives feedback, the draft is sent back to theWriter
for a revision. - If the
Critic
approves (by saying “NO NOTES”), the draft moves on to theFinalizer
.
- If the
This loop ensures the content gets better and better before you ever see it!
Here’s a little peek at what that logic looks like in the code (content_graph.py
):
# The "Critic" node makes a decision...
builder.add_conditional_edges(
"critic",
decide_to_revise, # This function checks the critic's feedback
{
"revise": "writer", # If feedback exists, go back to the writer
"finalize": "finalizer" # If approved, move on to the finalizer
}
)
Block#3: The AI’s “Memory” (Vector DB)
A team is only as good as what it can remember. Our project has a clever “dual-memory” system powered by a ChromaDB vector database.
1. The Short-Term “Research Desk”
For each project, all the notes from the Researcher
are stored in a temporary collection. This acts like a shared notepad that the Writer
and Critic
can refer to, ensuring everyone is working from the same set of facts.
2. The Long-Term “Style Guide”
This is where you, the user, come in! When you get a final script that you love, you can save it to the “Style Guide.”
This special, permanent memory stores your approved content. The next time the Writer
agent starts a new project, it peeks into this style guide to learn your preferred tone, structure, and voice. The more you save, the more the AI sounds like you!
Here’s how we set up these memory banks in utils.py
:
# --- Initialize Vector Stores and Retrievers ---
try:
# This creates a persistent database on your disk
chroma_client = chromadb.PersistentClient(path="./chroma_db")
except Exception as e:
print(f"Error initializing ChromaDB client: {e}")
chroma_client = None
if chroma_client:
# A temporary desk for current research
research_collection = chroma_client.get_or_create_collection(name="research_cache")
research_vector_store = Chroma(
client=chroma_client,
collection_name="research_cache",
embedding_function=embedding_function,
)
# A permanent library for your approved style
style_guide_collection = chroma_client.get_or_create_collection(name="style_guide")
style_guide_vector_store = Chroma(
client=chroma_client,
collection_name="style_guide",
embedding_function=embedding_function,
)
But Wait, You’re Still the Boss!
The best part about a team is being able to give feedback, right? The project includes a crucial feature: the user rejection loop.
After the AI team presents its “final” script, you get the final say.
- If you love it, you can approve it and save it to your Style Guide.
- If it’s not quite right, you can now write your own feedback and send the script back for a revision!
This is handled by a clever routing function at the start of the graph:
# This function decides where the process should start
def route_start(state: ContentCreationState):
# If the state contains user_feedback...
if state.get("user_feedback"):
# Go directly to the writer!
return "writer"
else:
# Otherwise, start from the beginning.
return "researcher"
A Quick Tour: See the App in Action
Let’s take a quick visual tour of the app, from entering a simple topic to getting a polished script and even requesting revisions from the AI team.












This slideshow demonstrates the full user journey, showing how you can collaborate with your new AI creative team.
My Little Secret: I Used AI to Build This AI
Now for a little meta-magic. It would be crazy if I built a tool to boost productivity and didn’t use AI to help me build it, right?
Full disclosure: AI was my co-pilot for this entire project.
I didn’t just ask it “build me an app.” I used it as a Socratic partner and an always-on senior developer to 10x my learning and building speed. Here’s how:
- Brainstorming & Architecture: I started by describing the “AI team” concept to an LLM and asked for suggestions on how to structure the project. It helped me land on using LangGraph for the workflow and ChromaDB for the memory.
- Debugging Buddy: When I ran into a cryptic error message, I’d paste the code and the error and ask, “What are the likely causes for this?” It was like having a rubber duck that could actually talk back and point me in the right direction.
- Boilerplate Code: “Can you write me a Python function that takes a list and removes duplicates?” Done. “Give me a basic Streamlit template with a title and a text input.” Easy. This saved me from the tedious parts and let me focus on the core logic.
- Writing This Blog Post: That’s right! I fed my project files to an LLM, provided the “How LLMs Work” blog as a style guide, and asked it to generate a draft for this very post. I then edited and refined it, but the AI did the first 70% of the work.
This is the new superpower for creators and developers. By using AI as a collaborative tool, you can punch way above your weight. You can learn complex topics faster because you have an interactive tutor, and you can build amazing things because you can bypass the roadblocks that would normally slow you down.
Final Thoughts & Try It Yourself!
This project shows that AI doesn’t have to be a mysterious black box. By breaking down a complex task and assigning it to a team of specialized agents, we can build powerful tools that are both creative and controllable.
It’s not about replacing human creativity, but augmenting it—like having a super-powered assistant to handle the grunt work so you can focus on the big ideas.
Run it Yourself!
Curious to see the AI team in action? The entire project is open-source! You can download it, run it on your own machine, and start generating content in minutes.
You can find all the code on GitHub: ContentCreationAgent
Just follow these simple steps (A more detailed guide is present in the readme section in GitHub):
- Clone the repository from GitHub.
- Install the requirements (
pip install -r requirements.txt
). - Add your API keys to the
.env
file. - Run the app (
streamlit run app.py
).
Go ahead, give it a spin, and let your new AI team build something amazing for you