Mentals AI es una herramienta diseñada para crear y operar agentes que presentan loops , memory y varias tools , a través de un archivo markdown directo con una extensión .Gen. Piense en un archivo de agente como un archivo ejecutable. Te enfocas completamente en la lógica del agente, eliminando la necesidad de escribir código de andamio en Python o cualquier otro idioma. Esencialmente, ¿redefine los marcos fundamentales para futuras aplicaciones de IA?
Nota
Juego de la cadena de palabras en un descuido controlado por LLM: 
NLOP - Operación del lenguaje natural
O casos de uso más complejos:
| Cualquier interacción múltiple | ? Agente generador de invasores de espacio | ? Agente generador de plataformas 2D |
|---|---|---|
![]() | ![]() | ![]() |
O ayudar con el contenido:
Todos los ejemplos anteriores se encuentran en la carpeta de los agentes.
Nota
El soporte de LLAMA3 está disponible para proveedores que utilizan una API OpenAI compatible.
Comience asegurando una clave API de OpenAI a través de la creación de una cuenta de OpenAI. Si ya tiene una tecla API, omita este paso.
Requisitos previos
Antes de construir el proyecto, asegúrese de que se instalen las siguientes dependencias:
Dependiendo de su sistema operativo, puede instalarlos utilizando los siguientes comandos:
Linux
sudo apt-get update
sudo apt-get install libcurl4-openssl-dev libfmt-dev libpoppler-devmacosa
brew update
brew install curl fmt popplerWindows
Para Windows, se recomienda usar VCPKG o un administrador de paquetes similar:
vcpkg install curl fmt popplerInstalación de PGVector
Nota
En la rama main puedes omitir este paso
Clonar el repositorio
git clone https://github.com/turing-machines/mentals-ai
cd mentals-aiConfiguración
Coloque su tecla API en el archivo config.toml :
[llm]
# OpenAI
api_key = " "
endpoint = " https://api.openai.com/v1 "
model = " gpt-4o "Construir el proyecto
makeCorrer
./build/mentals agents/loop.gen -dLos mentales AI se distinguen de otros marcos de tres maneras significativas:
Agent Executor ? opera a través de un bucle recursivo. El LLM determina los siguientes pasos: seleccionar instrucciones (indicaciones) y administrar datos basados en bucles anteriores. Este proceso de toma de decisiones recursivo es parte integral de nuestro sistema, esbozado en mentals_system.promptMarkdown , eliminando la necesidad de lenguajes de programación tradicionales. Sin embargo, Python se puede integrar directamente en el script Markdown del agente si es necesario.Tree of Thoughts , ReAct , Self-Discovery , Auto-CoT y otros. También se puede vincular estos marcos en secuencias más complejas, incluso creando una red de varios marcos de razonamiento. El archivo del agente es una descripción textual de las instrucciones del agente con una extensión .gen .
La instrucción es el componente básico de un agente en mentales. Un agente puede consistir en una o más instrucciones, que pueden referirse entre sí.

Las instrucciones se pueden escribir en forma gratuita, pero siempre tienen un nombre que comienza con el símbolo # . El ## use: la directiva se usa para especificar una referencia a otras instrucciones. Múltiples referencias se enumeran separadas por comas.
A continuación se muestra un ejemplo con dos instrucciones root y meme_explain con una referencia:
# root
## use: meme_explain
1. Create 3 memes about AGI;
2. Then do meme explain with meme per call;
3. Output memes and their explanations in a list.
# meme_explain
Explain the gist of the meme in 20 words in medieval style.
Return explanation.
En este ejemplo, la instrucción root llama a la instrucción meme_explain . La respuesta de MEME_EXPLAIN se devuelve a la instrucción desde la cual se llamaba, a saber, la raíz.
Una instrucción puede tomar un parámetro input , que se genera automáticamente en función del contexto cuando se llama a la instrucción. Para especificar los datos de entrada con mayor precisión, puede usar un mensaje de forma libre en la ## input: Directiva, como un objeto JSON o null .
Uso de un documento para la entrada:
# some_instruction
## input: design document only
Usando un objeto JSON como entrada:
# duckduckgo
## input: { search_query: search query, search_limit: search limit }
Write a Python script to search in DuckDuckGo.
Simulate request headers correctly e.g. user-agent as Mozilla and Linux.
Nota
Las llamadas de instrucción se implementan independientemente de la función o las llamadas de herramientas en OpenAI, lo que permite la operación de agentes con modelos como LLAMA3. La implementación de llamadas de instrucción es transparente e incluida en el archivo mentals_system.prompt.
La herramienta es un tipo de instrucción. Mentals tiene un conjunto de herramientas nativas para manejar la salida de mensajes, la entrada del usuario, el manejo de archivos, el intérprete de Python, los comandos BASH y la memoria a corto plazo.
Pregunte Ejemplo del usuario:
# root
## use: user_input
Ask user name.
Then output: `Welcome, user_name!`
Ejemplo de manejo de archivos:
# root
## use: write_file, read_file
Write 'Hello world' to a file.
Then read and output file content.
La lista completa de herramientas nativas se enumera en el archivo native_tools.toml .
Cada instrucción tiene su propia memoria de trabajo: contexto. Al salir de una instrucción y volver a ingresarla, el contexto se mantiene de forma predeterminada. Para borrar el contexto al salir de una instrucción, puede usar el ## keep_context: false :
# meme_explain
## keep_context: false
Explain the gist of the meme in 20 words in medieval style.
Return explanation.
Por defecto, el tamaño del contexto de instrucción no es limitado. Para limitar el contexto, hay una directiva ## max_context: number que especifica que solo se debe almacenar el number de mensajes más recientes. Los mensajes más antiguos serán expulsados del contexto. Esta característica es útil cuando desea mantener los datos más recientes en contexto para que los datos más antiguos no afecten la cadena de razonamiento.
# python_code_generation
## input: development tasks in a list
## use: write_file
## max_context: 5
Do all development tasks in a loop: task by task.
Save the Python code you implement in the main.py file.
La memoria a corto plazo permite el almacenamiento de resultados intermedios de las actividades de un agente, que luego pueden usarse para un razonamiento adicional. Se puede acceder al contenido de esta memoria en todos los contextos de instrucciones.
La herramienta memory se utiliza para almacenar datos. Cuando se almacenan los datos, se genera una palabra clave y una descripción del contenido. En el siguiente ejemplo, la instrucción meme_recall es consciente del meme porque se almacenó previamente en la memoria.
# root
## use: memory, meme_recall
Come up with and memorize a meme.
Call meme recall.
# meme_recall
## input: nothing
What the meme was about?
El flujo de control, que incluye condiciones, llamadas de instrucción y bucles (como ReAct , Auto-CoT , etc.), se expresa completamente en un lenguaje natural. Este método permite la creación de semantic conditions que dirigen la ramificación del flujo de datos. Por ejemplo, puede solicitar a un agente que juegue de forma autónoma un juego de la cadena de palabras en un bucle o establece una condición de salida ambigua: exit the loop if you are satisfied with the result . Aquí, el modelo de idioma y su contexto determinan si continuar o detenerse. Todo esto se logra sin necesidad de definir la lógica de flujo en Python o cualquier otro lenguaje de programación.
## use: execute_bash_command, software_development, quality_assurance
...
You run in a loop of "Thought", "Action", "Observation".
At the end of the loop return with the final answer.
Use "Thought" to describe your thoughts about the task
you have been asked. Use "Action" to run one of the actions
available to you. Output action as: "Action: action name to call".
"Observation" will be the result of running those actions.
Your available actions:
- `execute_bash_command` for util purposes e.g. make directory, install packages, etc.;
- `software_development` for software development and bug fixing purposes;
- `quality_assurance` for QA testing purposes.
...
La idea detrás de Tot es generar múltiples ideas para resolver un problema y luego evaluar su valor. Se guardan y desarrollan ideas valiosas, se descartan otras ideas.
Tomemos el ejemplo del juego 24. El rompecabezas 24 es un rompecabezas aritmético en el que el objetivo es encontrar una manera de manipular cuatro enteros para que el resultado final sea 24. Primero, definimos la instrucción que crea y manipula la estructura de datos del árbol. El modelo sabe qué es un árbol y puede representarlo en cualquier formato, desde texto sin formato hasta XML/JSON o cualquier formato personalizado.
En este ejemplo, usaremos el formato de texto sin formato:
# tree
## input: e.g. "add to node `A` child nodes `B` and `C`", "remove node `D` with all branches", etc.
## use: memory
## keep_context: false
Build/update tree structure in formatted text.
Update the tree structure within the specified action;
Memorize final tree structure.
A continuación, necesitamos inicializar el árbol con los datos iniciales, comencemos con la instrucción raíz:
# root
## use: tree
Input: 4 5 8 2
Generate 8 possible next steps.
Store all steps in the tree as nodes e.g.
Node value 1: "2 + 8 = 10 (left: 8 10 14)"
Node value 2: "8 / 2 = 4 (left: 4 8 14)"
etc.
Llamar a la instrucción de la raíz sugerirá 8 posibles próximos pasos para calcular con los primeros 2 números y almacenar estos pasos como nodos de árbol. El trabajo adicional del agente da como resultado la construcción de un árbol que sea conveniente para que el modelo comprenda e infiera la respuesta final.
4 5 8 2
├── 4 + 5 = 9 (left: 9, 8, 2)
│ └── discard
├── 4 + 8 = 12 (left: 12, 5, 2)
│ └── discard
├── 4 + 2 = 6 (left: 6, 5, 8)
│ └── discard
├── 5 + 8 = 13 (left: 13, 4, 2)
│ └── discard
├── 5 + 2 = 7 (left: 7, 4, 8)
│ └── (7 - 4) * 8 = 24
├── 8 + 2 = 10 (left: 10, 4, 5)
│ └── discard
├── 4 * 5 = 20 (left: 20, 8, 2)
│ └── (20 - 8) * 2 = 24
└── 4 * 8 = 32 (left: 32, 5, 2)
└── discard
Based on the evaluations, we have found two successful paths to reach 24:
1. From the node "5 + 2 = 7 (left: 7, 4, 8)", we have the equation: (7 - 4) * 8 = 24.
2. From the node "4 * 5 = 20 (left: 20, 8, 2)", we have the equation: (20 - 8) * 2 = 24.
Thus, the final equations using all given numbers from the input are:
1. (5 + 2 - 4) * 8 = 24
2. (4 * 5 - 8) * 2 = 24
Un ejemplo completo está contenido en los agentes/tree_structure.gen
El concepto se originó a partir de estudios sobre funciones ejecutivas de psicoanálisis, explorando al ejecutivo central, Alan Baddeley, 1996. Describió un sistema que orquesta procesos cognitivos y memoria de trabajo, facilitando las recuperaciones de la memoria a largo plazo. El LLM funciona como System 1 , procesamiento de consultas y ejecutando instrucciones sin motivación inherente o establecimiento de objetivos. Entonces, ¿qué es entonces System 2 ? Sobre la información histórica, ahora reconsiderada a través de una lente científica:
El ejecutivo central, o funciones ejecutivas, es crucial para el procesamiento controlado en la memoria de trabajo. Gestiona tareas que incluyen dirigir la atención, mantener los objetivos de la tarea, la toma de decisiones y la recuperación de la memoria.
Esto provoca una posibilidad intrigante: construir agentes más sofisticados mediante la integración System 1 y System 2 . El LLM, como el System 1 , trabaja en conjunto con el System 2 , que gobierna y controla la LLM. Esta asociación forma la doble relación fundamental para los mentales ai.