Spaces:
Running
Running
""" | |
Blog Editor agent implemented with LLMs and crewai framework for handling autogen agents. | |
It uses streamlit, crewai and openai functions to execute the task of interest. | |
It is based on the crewai gemini demo: https://huggingface.co/spaces/eaglelandsonce/crewaiongemini | |
Role and backstory was created using prompt generator role from awesome gpt prompts with few shot prompting with gpt 3.5 turbo | |
""" | |
import os | |
import streamlit as st | |
from crewai import Agent, Task, Crew, Process | |
from langchain.tools import DuckDuckGoSearchRun | |
from langchain_openai import ChatOpenAI | |
# set page title | |
st.title("Blog Editor") | |
st.markdown( | |
"This is a demo of the [CrewAI](https://www.crewai.com/) framework for handling autogen agents. It is based on the [CrewAI Gemini Demo](https://huggingface.co/spaces/eaglelandsonce/crewaiongemini)." | |
) | |
st.markdown( | |
"The goal of this demo is to show how you can use the [CrewAI](https://crewai.co/) framework to create a blog editor agent that can help you edit your blog posts. The agent is composed of two agents: a researcher and an editor. The researcher is responsible for conducting research and fact-checking the information provided in the blog post. The editor is responsible for editing the blog post and making sure it is clear, coherent, and impactful." | |
) | |
st.write("") | |
st.markdown("Click on the icon 🖱️ Logs to see how the agents are making the decisions.") | |
# Retrieve API Key from Environment Variable | |
# setup sidebar: models to choose from and API key input | |
with st.sidebar: | |
st.header("OpenAI Configuration") | |
st.markdown( | |
"For more information about the models, see [here](https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo)." | |
) | |
OPENAI_API_KEY = st.text_input("API Key", type="password") | |
# Instantiate your tools: Search engine tool duckduckgo-search | |
search_tool = DuckDuckGoSearchRun() | |
# enter blogpost article | |
blogpost = st.text_area("Enter blogpost article here", height=200) | |
# check if blogpost is empty | |
if blogpost == "": | |
st.warning("Please enter a blogpost article.") | |
st.stop() | |
else: | |
# Define your agents with roles and goals | |
editor = Agent( | |
role="Senior Article Editor", | |
goal=f"Your goal is to elevate the {blogpost} to its highest potential, ensuring that the writer's message is communicated clearly and powerfully", | |
backstory="""You are a seasoned article editor with extensive experience in refining written content for clarity and coherence. | |
Your expertise lies in enhancing the impact of blog posts while preserving the original tone and voice of the writer. | |
You possess a keen understanding of audience engagement and know how to structure arguments effectively to resonate with readers. | |
With a sharp eye for detail, you can identify areas where the flow of ideas may be improved, ensuring that each paragraph | |
transitions smoothly to the next. You are adept at suggesting precise word choices and rephrasing sentences to enhance readability | |
without altering the author's unique style. Your background in various writing genres equips you with the versatility to adapt to | |
different topics and tones, making you an invaluable asset in the editing process.""", | |
verbose=True, | |
allow_delegation=False, | |
tools=[search_tool], | |
llm=ChatOpenAI(model_name="gpt-4-1106-preview", api_key=OPENAI_API_KEY), | |
) | |
researcher = Agent( | |
role="Article Researcher", | |
goal='''how can I simplify the process of reviewing the editor's content to ensure its accuracy and relevance? | |
I will identify key areas to focus on, such as fact-checking, source credibility, and the article's overall tone, | |
to streamline my evaluation. For each question present the reasoning followed by the correct answer.''', | |
backstory="""You are a seasoned researcher with a strong background in information literacy and critical analysis. | |
Your expertise lies in conducting thorough research across various disciplines, ensuring that the information you | |
gather is accurate, relevant, and credible. You possess a keen ability to evaluate sources, distinguishing between | |
reliable and unreliable information, and you are skilled in fact-checking claims made in articles. | |
Your methodical approach includes cross-referencing multiple sources, utilizing academic databases, | |
and applying rigorous standards to verify the authenticity of the information. You are adept at synthesizing | |
complex data and presenting it in a clear and concise manner, making you an invaluable resource for anyone seeking | |
to ensure the integrity of the information they use. Your commitment to accuracy and credibility in research is | |
paramount, and you are dedicated to upholding the highest standards in information dissemination""", | |
verbose=True, | |
allow_delegation=True, | |
tools=[search_tool], | |
llm=ChatOpenAI(model_name="gpt-4-1106-preview", api_key=OPENAI_API_KEY), | |
) | |
# Create tasks for your agents | |
task1 = Task( | |
description=f"""Conduct a comprehensive analysis of the provided {blogpost}. | |
Your analysis should include the following: | |
- Give a brief overview of the article | |
- Identify the main points of the article | |
- Find grammatical errors and suggest corrections | |
- Identify any outdated or irrelevant details and suggest corrections | |
You can use the search tool to find additional information. But if there is no text do not continue to the next task. | |
But if there is no text do not continue to the next task. | |
""", | |
agent=editor, | |
) | |
task2 = Task( | |
description=f"""Review the credibility of the sources cited in the {blogpost} and trustworthiness of the information provided. | |
do not hesitate to use the search tool to find additional information. But if there is no text do not continue to the next task.""", | |
agent=researcher, | |
) | |
# Instantiate your crew with a sequential process | |
crew = Crew( | |
agents=[researcher, editor], | |
tasks=[task2, task1], | |
verbose=2, # You can set it to 1 or 2 to different logging levels | |
# process=Process.sequential, | |
) | |
# Get your crew to work! | |
result = crew.kickoff() | |
st.write("######################") | |
st.markdown(result) | |