|
|
from magentic import FunctionCall, OpenaiChatModel, prompt_chain |
|
|
import requests |
|
|
|
|
|
from BasicAgent import BasicAgent |
|
|
|
|
|
import os |
|
|
|
|
|
|
|
|
class CustomAgent(BasicAgent): |
|
|
def __init__(self): |
|
|
super().__init__() |
|
|
self._system_prompt = """\ |
|
|
You are a general AI assistant. I will ask you a question. Provide an answer like so: YOUR FINAL ANSWER. DO NOT SAY ANYTHING EXCEPT YOUR FINAL ANSWER. |
|
|
Only use the provided tools if your own knowledge would be insufficient. If you are unable to answer the question using the provided tools, give your best guess. |
|
|
Your final answer should be a number OR as few words as possible OR a comma separated list of numbers and/or strings. |
|
|
If you are asked for a number, don't use comma to write your number neither use units such as $ or percent sign unless specified otherwise. |
|
|
If you are asked for a string, don't use articles, neither abbreviations (e.g. for cities), and write the digits in plain text unless specified otherwise. |
|
|
If you are asked for a comma separated list, apply the above rules depending of whether the element to be put in the list is a number or a string. |
|
|
Question: {question} |
|
|
""" |
|
|
self._model = OpenaiChatModel( |
|
|
model="llama-3.1-8b-instant", |
|
|
api_key=os.environ["GROQ_API_KEY"], |
|
|
base_url="https://api.groq.com/openai/v1/", |
|
|
temperature=0.7, |
|
|
max_tokens=512 |
|
|
) |
|
|
print("CustomAgent initialized.") |
|
|
|
|
|
def __call__(self, question: str) -> str: |
|
|
""" |
|
|
this is where the magic happens |
|
|
""" |
|
|
print(f"Agent received question (first 50 chars): {question[:50]}...") |
|
|
@prompt_chain( |
|
|
template=self._system_prompt, |
|
|
model=self._model, |
|
|
functions=[self.websearch], |
|
|
) |
|
|
def _magic(question: str) -> FunctionCall | str: |
|
|
""" |
|
|
An agent, using websearch to gather information and |
|
|
answer a user's query. |
|
|
""" |
|
|
... |
|
|
result = _magic(question) |
|
|
print("Agent returning actual answer:", result) |
|
|
return result |
|
|
|
|
|
@staticmethod |
|
|
def websearch(query: str) -> str: |
|
|
""" |
|
|
Performs a web search using an external web search API. Note that better results may be obtained from varying the wording of the query. |
|
|
Args: |
|
|
query (str): The search query string. |
|
|
Returns: |
|
|
str: The response from the web search API as a string. |
|
|
""" |
|
|
try: |
|
|
r = requests.post( |
|
|
f"{os.environ['WEBSEARCH_API_URL']}/tools/websearch", |
|
|
json={"query": query} |
|
|
) |
|
|
r.raise_for_status() |
|
|
response = r.text |
|
|
except Exception as e: |
|
|
print("Error:", e) |
|
|
response = "An error has occurred while using websearch, please inform the user of this" |
|
|
print(f"Agent searched for {query}. Response: {response}") |
|
|
|