HackBuddyAI / matching_agent.py
Mahdiyar
Improvement
c47b1e1
import os
import pandas as pd
from tinyagent import TinyCodeAgent
from textwrap import dedent
organizer_prompt = dedent("""
You are a brilliant hackathon team-matching AI.
Your task is to form teams from a list of participants provided in a pandas DataFrame.
You will be given the DataFrame in a variable named `participants_df`.
You will also be given the organizer's criteria in a variable named `organizer_criteria`.
Your goal is to write and execute Python code using the `run_python` tool to group these participants into balanced teams.
Follow these steps:
1. **Analyze the Data**: Inspect the `participants_df` DataFrame to understand the skills, backgrounds, and goals of the participants.
2. **Plan Your Logic**: Based on the `organizer_criteria`, decide on a strategy for forming teams. Consider things like team size, skill diversity (e.g., frontend, backend, data science), and aligning participants' goals.
3. **Implement the Matching**: Write Python code to create the teams. You can iterate through the DataFrame, use clustering algorithms, or any other method you see fit. Your code should produce a list of teams, where each team is a list of participant dictionaries.
4. **Format the Output**: Once you have the teams, your final step is to generate a user-friendly report in Markdown format. For each team, list the members and write a brief, one-sentence justification for why they are a good match, based on their combined skills and goals.
Example of final output format:
```markdown
## Team 1
* **Alice Wonderland** (Frontend, React)
* **Bob Builder** (Backend, Python)
* **Charlie Chocolate** (Data Science)
**Justification**: This team has a strong, well-rounded skill set covering frontend, backend, and data science, making them capable of building a full-stack application.
```
Do not ask for feedback. Execute the plan and provide the final Markdown report using the `final_answer` tool.
I can only see the final answer, not what happens in tool calls, so provide the full report in the final answer. Do not truncate team information
""")
def create_matching_agent(log_manager=None) -> TinyCodeAgent:
"""
Initializes and configures a TinyCodeAgent for matching hackathon participants.
Args:
log_manager: An optional logging manager instance.
Returns:
A configured TinyCodeAgent instance.
"""
# Create the agent without the system_prompt parameter
agent = TinyCodeAgent(
model="gpt-4.1-mini",
api_key=os.environ.get("OPENAI_API_KEY"),
log_manager=log_manager,
pip_packages=["pandas", "numpy", "scikit-learn"],
authorized_imports=["pandas", "numpy", "collections","itertools","requests"],
local_execution=False, # Use remote Modal for security by default
)
# Set the system prompt separately
return agent
async def run_matching(
agent: TinyCodeAgent,
participants_df: pd.DataFrame,
organizer_criteria: str
) -> str:
"""
Runs the matching process using the configured agent.
Args:
agent: The TinyCodeAgent instance.
participants_df: A DataFrame with participant data.
organizer_criteria: A string containing the organizer's preferences.
Returns:
The final markdown report of the matched teams.
"""
# Set the participant data and criteria as variables for the agent's environment
print(participants_df.head())
agent.set_user_variables({
"participants_df": participants_df,
"organizer_criteria": organizer_criteria
})
# The user prompt is simple, as the main instructions are in the system prompt
task = dedent("""
You are a brilliant hackathon team-matching AI.
Your task is to form teams from a list of participants provided in a pandas DataFrame.
You will be given the DataFrame in a variable named `participants_df`.
Your goal is to write and execute Python code using the `run_python` tool to group these participants into balanced teams.""")
task = organizer_prompt+'\n\n'
task += ("Form the teams based on the provided data and criteria."
"\n Please go through all of them and give me details of all groups. "
f"\n<Organizer Criteria>\n{organizer_criteria}\n</Organizer Criteria>")
final_report = await agent.run(task, max_turns=15)
print(agent.messages)
return final_report