clase MemoryStoreTool(Herramienta): nombre = “memory_store” descripción = “Guardar un hecho o información importante en la memoria a largo plazo”. def __init__(self, memoria: MemoryBackend): self._mem = memoria def run(self, text: str, categoría: str = “general”) -> str: chunk_id = self._mem.store(text, {“category”: categoría}) return f”Almacenado como {chunk_id}.” def esquema(self) -> Dict: return { “type”: “function”, “function”: { “name”: self.name, “description”: self.description, “parameters”: { “type”: “object”, “properties”: { “text”: {“type”: “string”, “description”: “El hecho a recordar.”}, “category”: {“type”: “string”, “description”: “Etiqueta de categoría, por ejemplo, ‘user_pref’, ‘task’, ‘hecho’.”}, }, “obligatorio”: [“text”]}, }, } clase MemorySearchTool(Herramienta): nombre = “memory_search” descripción = “Buscar en la memoria a largo plazo información relevante para una consulta”. def __init__(self, memoria: MemoryBackend): self._mem = memoria def run(self, query: str, top_k: int = 3) -> str: results = self._mem.search(query, top_k=top_k) si no hay resultados: devuelve “No se encontraron recuerdos relevantes”. lineas = [f”[{r[‘id’]}](puntuación={r[‘rrf_score’]}) {r[‘text’]}” para r en resultados]return “Recuerdos relevantes:\n” + “\n”.join(lines) def esquema(self) -> Dict: return { “type”: “function”, “function”: { “name”: self.name, “description”: self.description, “parameters”: { “type”: “object”, “properties”: { “query”: {“type”: “string”, “description”: “Qué buscar.”}, “top_k”: {“type”: “integer”, “description”: “Resultados máximos (predeterminado 3).”}, }, “obligatorio”: [“query”]}, }, } clase CalculatorTool(Tool): nombre = “calculadora” descripción = “Evaluar una expresión matemática segura, por ejemplo, ‘2 ** 10 + sqrt(144)'”. def run(self, expresión: str) -> str: permitido = {k: getattr(math, k) for k in dir(math) if not k.startswith(“_”)} permitido.update({“abs”: abs, “round”: round}) try: resultado = eval(expresión, {“__builtins__”: {}}, permitido) return str(resultado) excepto Excepción como exc: return f”Error: {exc}” def esquema(self) -> Dict: return { “type”: “function”, “function”: { “name”: self.name, “description”: self.description, “parameters”: { “type”: “object”, “properties”: { “expression”: {“type”: “string”, “description”: “Expresión matemática a evaluar.”}, }, “obligatorio”: [“expression”]}, }, } clase WebSnippetTool(Herramienta): nombre = “web_search” descripción = “Buscar en la web información actual sobre un tema (simulado)”. _KB = { “openai”: “OpenAI es una empresa de seguridad de IA que desarrolla la familia de modelos GPT.”, “rag”: “Retrieval-Augmented Generation (RAG) combina un sistema de recuperación con un LLM para fundamentar respuestas en documentos externos.”, “bm25”: “BM25 (Best Match 25) es una función de clasificación probabilística de palabras clave utilizada en motores de búsqueda.”, } def run(self, query: str) -> str: q = query.lower() para kw, fragmento en self._KB.items(): si kw en q: return f”Fragmento web para ‘{query}’: {snippet}” return f”No se encontró ningún fragmento para ‘{query}’. (Herramienta simulada: integre una API de búsqueda real aquí.)” def esquema(self) -> Dict: return { “type”: “function”, “function”: { “name”: self.name, “descripción”: self.description, “parámetros”: { “tipo”: “objeto”, “propiedades”: { “consulta”: {“tipo”: “cadena”, “descripción”: “Consulta de búsqueda.”}, }, “obligatorio”: [“query”]}, }, } @dataclass clase AgentPersona: nombre: str rol: str rasgos: Lista[str]
frases_prohibidas: Lista[str] = campo(default_factory=lista) objetivos: Lista[str] = campo(default_factory=lista) def compile_system_prompt(self, extra_context: str = “”) -> str: líneas = [
f”You are {self.name}, {self.role}.”,
“”,
“## Core Traits”,
*[f”- {t}” for t in self.traits]]si auto.metas: líneas += [“”, “## Goals”, *[f”- {g}” for g in self.goals]]si self.forbidden_phrases: líneas += [“”, “## Forbidden Phrases (never say these)”, *[f”- \”{p}\”” for p in self.forbidden_phrases]]si contexto_extra: líneas += [“”, “## Live Context”, extra_context]
lineas += [
“”,
“## Behaviour”,
“- Always reason step-by-step before answering.”,
“- Use available tools proactively; never guess when you can look up.”,
“- After using memory_search, quote the retrieved ID in your answer.”,
“- Keep answers concise unless depth is explicitly requested.”,
]
return “\n”.join(lines) ARIA = AgentPersona( name=”Aria”, role=”una asistente de investigación precisa y útil con un sistema de memoria híbrido”, rasgos=[“Methodical”, “Curious”, “Transparent about uncertainty”, “Concise”]goles =[
“Remember and connect information across conversations”,
“Use tools whenever they can improve accuracy”,
]frases_prohibidas=[“I cannot”, “As an AI language model”]) print(“✅ Herramientas y AgentPersona listos.”)
frases_prohibidas: Lista[str] = campo(default_factory=lista) objetivos: Lista[str] = campo(default_factory=lista) def compile_system_prompt(self, extra_context: str = “”) -> str: líneas = [
f”You are {self.name}, {self.role}.”,
“”,
“## Core Traits”,
*[f”- {t}” for t in self.traits]]si auto.metas: líneas += [“”, “## Goals”, *[f”- {g}” for g in self.goals]]si self.forbidden_phrases: líneas += [“”, “## Forbidden Phrases (never say these)”, *[f”- \”{p}\”” for p in self.forbidden_phrases]]si contexto_extra: líneas += [“”, “## Live Context”, extra_context]
lineas += [
“”,
“## Behaviour”,
“- Always reason step-by-step before answering.”,
“- Use available tools proactively; never guess when you can look up.”,
“- After using memory_search, quote the retrieved ID in your answer.”,
“- Keep answers concise unless depth is explicitly requested.”,
]
return “\n”.join(lines) ARIA = AgentPersona( name=”Aria”, role=”una asistente de investigación precisa y útil con un sistema de memoria híbrido”, rasgos=[“Methodical”, “Curious”, “Transparent about uncertainty”, “Concise”]goles =[
“Remember and connect information across conversations”,
“Use tools whenever they can improve accuracy”,
]frases_prohibidas=[“I cannot”, “As an AI language model”]) print(“✅ Herramientas y AgentPersona listos.”)