Ashed00's picture
Upload main.py
63cba8e verified
import os
from groq import Groq
import re
from duckduckgo_search import DDGS
SYSPROMPT = """You are a Time-Travel Consultant who helps travelers blend into different historical periods.
You must think step by step and use available tools when needed.
## Thought Process:
1. Consider the user’s travel destination and time period. If the user does not specify a time, assume one based on historical relevance.
2. Identify key survival aspects: **clothing, language, customs, and behavior**—these must always be included in your response.
3. If additional knowledge is required, use the appropriate tool.
4. Incorporate the tool’s response into your reasoning.
5. Conclude with a complete recommendation. Do **not** ask follow-up questions or request more details from the user—your response should be final and self-contained.
## Tool Usage Format:
If you need to use a tool, respond with:
[ACTION: tool_name("query")]
After receiving a tool response, continue reasoning with the new information.
## Important Guidelines:
- If the user input **does not make sense** (e.g., gibberish or an impossible request), you are **free to say no** instead of proceeding.
- If no tool can provide useful information, explain why and suggest an alternative.
- Do **not** invent tools that are not listed.
- Do **not** ask the user questions or seek clarification—**always give a complete response based on the available information.**
## Available Tools:
- **search(query)**: Finds historical facts (e.g., "Ancient Rome clothing", "Currency", etc.).
"""
FIN_PROMPT = """
You are a charismatic and witty Time-Travel Consultant.
Take the following assistant response, which may contain tool references, and rewrite it in a fun and engaging way.
- Remove any mentions of tools, actions, or system processes.
- Rewrite the information in a way that makes it sound **natural, humorous, and engaging.**
- If the answer is obvious or ridiculous, feel free to be sarcastic or dramatic.
- Ensure it is still **historically accurate** but entertaining.
## Example:
**Input:**
_"To blend into Ancient Rome, you should wear a tunic, as it was the common attire. Wealthier individuals would wear togas."_
**Output:**
_"Ah, Ancient Rome! If you want to blend in, ditch the jeans and grab a tunic—basically, the ancient version of comfy pajamas. If you’re feeling fancy (and don’t mind tripping over fabric), throw on a toga and strut around like a senator with too much power!"_
"""
class TimeAdvisor:
def __init__(self):
self.client = Groq(
api_key=os.environ.get("GROQ_API_KEY"),
)
self.sys_prompt = SYSPROMPT
self.history = [{
"role": "system",
"content": self.sys_prompt,
}]
def llm_call(self, query):
self.history.append({
"role": "user",
"content": query,
})
chat_completion = self.client.chat.completions.create(
messages=self.history,
model="llama-3.3-70b-versatile",
)
self.history.append({
"role": "assistant",
"content": chat_completion.choices[0].message.content,
})
self.latest = chat_completion.choices[0].message.content
def extract_actions(self, llm_response:str):
"""Extracts tool calls and queries from LLM response"""
pattern = r"\[ACTION:\s*(\w+)\(\"(.*?)\"\)\]"
matches = re.findall(pattern, llm_response)
# Convert list of tuples to a structured dictionary format
actions = [{"tool": tool, "query": query} for tool, query in matches]
return actions
def web_search(self, query):
web_str = f"for search results of query: {query}, Results:"
with DDGS() as ddgs:
results = list(ddgs.text(query, max_results=1))
return web_str + results[0]["body"] if results else "No relevant data found."
def get_tool_results(self,actions):
tool_results = ""
for action in actions:
if action['tool']=="search":
#print(action["query"])
tool_results+=self.web_search(action["query"])
return tool_results
def agent_loop(self, query):
self.llm_call(query)
#print(self.latest)
actions = self.extract_actions(self.latest)
iters = 0
while len(actions)>0 and iters<5:
tool_results = self.get_tool_results(actions)
self.llm_call(tool_results)
#print(self.latest)
actions = self.extract_actions(self.latest)
iters+=1
self.history = [{
"role": "system",
"content": FIN_PROMPT,
}]
self.llm_call(self.latest)
return self.latest
if __name__=="__main__":
advisor = TimeAdvisor()
output = advisor.agent_loop("Ancient Mesopotamia")
print(output)