* mental models * DRAFT: refactor entity observations * fix db patch * agentic * agentic * reflect agent * new style * more * fix ci * fix * fix
212 lines
7.7 KiB
Python
212 lines
7.7 KiB
Python
"""
|
|
Tool schema definitions for the reflect agent.
|
|
|
|
These are OpenAI-format tool definitions used with native tool calling.
|
|
"""
|
|
|
|
from typing import Literal
|
|
|
|
# Tool definitions in OpenAI format
|
|
TOOL_LIST_MENTAL_MODELS = {
|
|
"type": "function",
|
|
"function": {
|
|
"name": "list_mental_models",
|
|
"description": "List all available mental models - your synthesized knowledge about entities, concepts, and events. Returns an array of models with id, name, and description.",
|
|
"parameters": {
|
|
"type": "object",
|
|
"properties": {},
|
|
"required": [],
|
|
},
|
|
},
|
|
}
|
|
|
|
TOOL_GET_MENTAL_MODEL = {
|
|
"type": "function",
|
|
"function": {
|
|
"name": "get_mental_model",
|
|
"description": "Get full details of a specific mental model including all observations and memory references.",
|
|
"parameters": {
|
|
"type": "object",
|
|
"properties": {
|
|
"model_id": {
|
|
"type": "string",
|
|
"description": "ID of the mental model (from list_mental_models results)",
|
|
},
|
|
},
|
|
"required": ["model_id"],
|
|
},
|
|
},
|
|
}
|
|
|
|
TOOL_RECALL = {
|
|
"type": "function",
|
|
"function": {
|
|
"name": "recall",
|
|
"description": "Search memories using semantic + temporal retrieval. Returns relevant memories from experience and world knowledge, each with an 'id' you can reference.",
|
|
"parameters": {
|
|
"type": "object",
|
|
"properties": {
|
|
"query": {
|
|
"type": "string",
|
|
"description": "Search query string",
|
|
},
|
|
"max_tokens": {
|
|
"type": "integer",
|
|
"description": "Optional limit on result size (default 2048). Use higher values for broader searches.",
|
|
},
|
|
},
|
|
"required": ["query"],
|
|
},
|
|
},
|
|
}
|
|
|
|
TOOL_LEARN = {
|
|
"type": "function",
|
|
"function": {
|
|
"name": "learn",
|
|
"description": "Create a new mental model to track an important recurring topic. Use when you discover a person, project, concept, or pattern that appears frequently and would benefit from synthesized knowledge. The model content will be generated automatically.",
|
|
"parameters": {
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Human-readable name (e.g., 'Project Alpha', 'John Smith', 'Product Strategy')",
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "What to track and synthesize (e.g., 'Track goals, milestones, blockers, and key decisions for Project Alpha')",
|
|
},
|
|
},
|
|
"required": ["name", "description"],
|
|
},
|
|
},
|
|
}
|
|
|
|
TOOL_EXPAND = {
|
|
"type": "function",
|
|
"function": {
|
|
"name": "expand",
|
|
"description": "Get more context for one or more memories. Memory hierarchy: memory -> chunk -> document.",
|
|
"parameters": {
|
|
"type": "object",
|
|
"properties": {
|
|
"memory_ids": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"description": "Array of memory IDs from recall results (batch multiple for efficiency)",
|
|
},
|
|
"depth": {
|
|
"type": "string",
|
|
"enum": ["chunk", "document"],
|
|
"description": "chunk: surrounding text chunk, document: full source document",
|
|
},
|
|
},
|
|
"required": ["memory_ids", "depth"],
|
|
},
|
|
},
|
|
}
|
|
|
|
TOOL_DONE_ANSWER = {
|
|
"type": "function",
|
|
"function": {
|
|
"name": "done",
|
|
"description": "Signal completion with your final answer. Use this when you have gathered enough information to answer the question.",
|
|
"parameters": {
|
|
"type": "object",
|
|
"properties": {
|
|
"answer": {
|
|
"type": "string",
|
|
"description": "Your response as plain text. Do NOT use markdown formatting. NEVER include memory IDs, UUIDs, or 'Memory references' in this text - put IDs only in memory_ids array.",
|
|
},
|
|
"memory_ids": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"description": "Array of memory IDs that support your answer (put IDs here, NOT in answer text)",
|
|
},
|
|
"model_ids": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"description": "Array of mental model IDs that support your answer",
|
|
},
|
|
},
|
|
"required": ["answer"],
|
|
},
|
|
},
|
|
}
|
|
|
|
TOOL_DONE_OBSERVATIONS = {
|
|
"type": "function",
|
|
"function": {
|
|
"name": "done",
|
|
"description": "Signal completion with MULTIPLE structured observations. Each observation must be a SEPARATE item in the array covering ONE theme. Do NOT combine all content into a single observation.",
|
|
"parameters": {
|
|
"type": "object",
|
|
"properties": {
|
|
"observations": {
|
|
"type": "array",
|
|
"minItems": 3,
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"title": {
|
|
"type": "string",
|
|
"description": "Short header for this observation's theme (e.g., 'Work Style', 'Technical Skills')",
|
|
},
|
|
"text": {
|
|
"type": "string",
|
|
"description": "Observation content about ONE theme. End with 'Key evidence:' containing text citations (summaries of what memories say), NOT memory IDs.",
|
|
},
|
|
"memory_ids": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"description": "Full UUIDs of memories supporting this observation (put IDs here, not in text)",
|
|
},
|
|
},
|
|
"required": ["title", "text", "memory_ids"],
|
|
},
|
|
"description": "Array of 3-8 observations, each covering a DIFFERENT aspect/theme. Do NOT put everything in one observation.",
|
|
},
|
|
},
|
|
"required": ["observations"],
|
|
},
|
|
},
|
|
}
|
|
|
|
|
|
def get_reflect_tools(
|
|
enable_learn: bool = True, output_mode: Literal["answer", "observations"] = "answer"
|
|
) -> list[dict]:
|
|
"""
|
|
Get the list of tools for the reflect agent.
|
|
|
|
Args:
|
|
enable_learn: Whether to include the learn tool
|
|
output_mode: "answer" or "observations" - determines done tool format
|
|
In observations mode, mental model tools are excluded to avoid
|
|
using potentially outdated models during regeneration.
|
|
|
|
Returns:
|
|
List of tool definitions in OpenAI format
|
|
"""
|
|
tools = []
|
|
|
|
# In answer mode, include mental model tools for lookup
|
|
# In observations mode (mental model generation), exclude them to avoid circular references
|
|
if output_mode == "answer":
|
|
tools.append(TOOL_LIST_MENTAL_MODELS)
|
|
tools.append(TOOL_GET_MENTAL_MODEL)
|
|
|
|
tools.append(TOOL_RECALL)
|
|
|
|
if enable_learn:
|
|
tools.append(TOOL_LEARN)
|
|
|
|
tools.append(TOOL_EXPAND)
|
|
|
|
# Add appropriate done tool based on output mode
|
|
if output_mode == "observations":
|
|
tools.append(TOOL_DONE_OBSERVATIONS)
|
|
else:
|
|
tools.append(TOOL_DONE_ANSWER)
|
|
|
|
return tools
|