Refactor market toolkit to remove unused methods and streamline API calls
This commit is contained in:
@@ -6,6 +6,7 @@ from agno.models.base import Model
|
|||||||
from agno.models.google import Gemini
|
from agno.models.google import Gemini
|
||||||
from agno.models.ollama import Ollama
|
from agno.models.ollama import Ollama
|
||||||
from agno.utils.log import log_warning
|
from agno.utils.log import log_warning
|
||||||
|
from agno.tools import Toolkit
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
|
||||||
@@ -20,6 +21,7 @@ class AppModels(Enum):
|
|||||||
GEMINI_PRO = "gemini-2.0-pro" # API online, più costoso ma migliore
|
GEMINI_PRO = "gemini-2.0-pro" # API online, più costoso ma migliore
|
||||||
OLLAMA_GPT = "gpt-oss:latest" # + good - slow (13b)
|
OLLAMA_GPT = "gpt-oss:latest" # + good - slow (13b)
|
||||||
OLLAMA_QWEN = "qwen3:latest" # + good + fast (8b)
|
OLLAMA_QWEN = "qwen3:latest" # + good + fast (8b)
|
||||||
|
OLLAMA_QWEN_4B = "qwen3:4b" # + fast - decent (4b)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def availables_local() -> list['AppModels']:
|
def availables_local() -> list['AppModels']:
|
||||||
@@ -35,10 +37,9 @@ class AppModels(Enum):
|
|||||||
|
|
||||||
availables = []
|
availables = []
|
||||||
result = result.text
|
result = result.text
|
||||||
if AppModels.OLLAMA_GPT.value in result:
|
for model in [model for model in AppModels if model.name.startswith("OLLAMA")]:
|
||||||
availables.append(AppModels.OLLAMA_GPT)
|
if model.value in result:
|
||||||
if AppModels.OLLAMA_QWEN.value in result:
|
availables.append(model)
|
||||||
availables.append(AppModels.OLLAMA_QWEN)
|
|
||||||
return availables
|
return availables
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@@ -70,63 +71,31 @@ class AppModels(Enum):
|
|||||||
assert availables, "No valid model API keys set in environment variables."
|
assert availables, "No valid model API keys set in environment variables."
|
||||||
return availables
|
return availables
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def extract_json_str_from_response(response: str) -> str:
|
|
||||||
"""
|
|
||||||
Estrae il JSON dalla risposta del modello.
|
|
||||||
Args:
|
|
||||||
response: risposta del modello (stringa).
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
La parte JSON della risposta come stringa.
|
|
||||||
Se non viene trovato nessun JSON, ritorna una stringa vuota.
|
|
||||||
|
|
||||||
ATTENZIONE: questa funzione è molto semplice e potrebbe non funzionare
|
|
||||||
in tutti i casi. Si assume che il JSON sia ben formato e che inizi con
|
|
||||||
'{' e finisca con '}'. Quindi anche solo un json array farà fallire questa funzione.
|
|
||||||
"""
|
|
||||||
think = response.rfind("</think>")
|
|
||||||
if think != -1:
|
|
||||||
response = response[think:]
|
|
||||||
|
|
||||||
start = response.find("{")
|
|
||||||
assert start != -1, "No JSON found in the response."
|
|
||||||
|
|
||||||
end = response.rfind("}")
|
|
||||||
assert end != -1, "No JSON found in the response."
|
|
||||||
|
|
||||||
return response[start:end + 1].strip()
|
|
||||||
|
|
||||||
|
|
||||||
def get_model(self, instructions:str) -> Model:
|
def get_model(self, instructions:str) -> Model:
|
||||||
"""
|
"""
|
||||||
Restituisce un'istanza del modello specificato.
|
Restituisce un'istanza del modello specificato.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
instructions: istruzioni da passare al modello (system prompt).
|
instructions: istruzioni da passare al modello (system prompt).
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Un'istanza di BaseModel o una sua sottoclasse.
|
Un'istanza di BaseModel o una sua sottoclasse.
|
||||||
|
|
||||||
Raise:
|
Raise:
|
||||||
ValueError se il modello non è supportato.
|
ValueError se il modello non è supportato.
|
||||||
"""
|
"""
|
||||||
name = self.value
|
name = self.value
|
||||||
if self in {AppModels.GEMINI, AppModels.GEMINI_PRO}:
|
if self in {model for model in AppModels if model.name.startswith("GEMINI")}:
|
||||||
return Gemini(name, instructions=[instructions])
|
return Gemini(name, instructions=[instructions])
|
||||||
elif self in {AppModels.OLLAMA_GPT, AppModels.OLLAMA_QWEN}:
|
elif self in {model for model in AppModels if model.name.startswith("OLLAMA")}:
|
||||||
return Ollama(name, instructions=[instructions])
|
return Ollama(name, instructions=[instructions])
|
||||||
|
|
||||||
raise ValueError(f"Modello non supportato: {self}")
|
raise ValueError(f"Modello non supportato: {self}")
|
||||||
|
|
||||||
def get_agent(self, instructions: str, name: str = "", output: BaseModel | None = None) -> Agent:
|
def get_agent(self, instructions: str, name: str = "", output: BaseModel | None = None, tools: list[Toolkit] = []) -> Agent:
|
||||||
"""
|
"""
|
||||||
Costruisce un agente con il modello e le istruzioni specificate.
|
Costruisce un agente con il modello e le istruzioni specificate.
|
||||||
Args:
|
Args:
|
||||||
instructions: istruzioni da passare al modello (system prompt)
|
instructions: istruzioni da passare al modello (system prompt)
|
||||||
name: nome dell'agente (opzionale)
|
name: nome dell'agente (opzionale)
|
||||||
output: schema di output opzionale (Pydantic BaseModel)
|
output: schema di output opzionale (Pydantic BaseModel)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Un'istanza di Agent.
|
Un'istanza di Agent.
|
||||||
"""
|
"""
|
||||||
@@ -134,6 +103,7 @@ class AppModels(Enum):
|
|||||||
model=self.get_model(instructions),
|
model=self.get_model(instructions),
|
||||||
name=name,
|
name=name,
|
||||||
retries=2,
|
retries=2,
|
||||||
|
tools=tools,
|
||||||
delay_between_retries=5, # seconds
|
delay_between_retries=5, # seconds
|
||||||
output_schema=output # se si usa uno schema di output, lo si passa qui
|
output_schema=output # se si usa uno schema di output, lo si passa qui
|
||||||
# TODO Eventuali altri parametri da mettere all'agente anche se si possono comunque assegnare dopo la creazione
|
# TODO Eventuali altri parametri da mettere all'agente anche se si possono comunque assegnare dopo la creazione
|
||||||
|
|||||||
@@ -9,32 +9,21 @@ from app.markets import MarketAPIs
|
|||||||
# in base alle sue proprie chiamate API
|
# in base alle sue proprie chiamate API
|
||||||
class MarketToolkit(Toolkit):
|
class MarketToolkit(Toolkit):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.market_api = MarketAPIs("USD") # change currency if needed
|
self.market_api = MarketAPIs()
|
||||||
|
|
||||||
super().__init__(
|
super().__init__(
|
||||||
name="Market Toolkit",
|
name="Market Toolkit",
|
||||||
tools=[
|
tools=[
|
||||||
self.get_historical_data,
|
self.market_api.get_historical_prices,
|
||||||
self.get_current_prices,
|
self.market_api.get_product,
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
def get_historical_data(self, symbol: str):
|
|
||||||
return self.market_api.get_historical_prices(symbol)
|
|
||||||
|
|
||||||
def get_current_prices(self, symbol: list):
|
|
||||||
return self.market_api.get_products(symbol)
|
|
||||||
|
|
||||||
def prepare_inputs():
|
|
||||||
pass
|
|
||||||
|
|
||||||
def instructions():
|
def instructions():
|
||||||
return """
|
return """
|
||||||
Utilizza questo strumento per ottenere dati di mercato storici e attuali per criptovalute specifiche.
|
Utilizza questo strumento per ottenere dati di mercato storici e attuali per criptovalute specifiche.
|
||||||
Puoi richiedere i prezzi storici o il prezzo attuale di una criptovaluta specifica.
|
Puoi richiedere i prezzi storici o il prezzo attuale di una criptovaluta specifica.
|
||||||
Esempio di utilizzo:
|
Esempio di utilizzo:
|
||||||
- get_historical_data("BTC")
|
- get_historical_prices("BTC", limit=10) # ottieni gli ultimi 10 prezzi storici di Bitcoin
|
||||||
- get_current_price("ETH")
|
- get_product("ETH")
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user