prism-decide 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- prism_decide-0.1.0/LICENSE +21 -0
- prism_decide-0.1.0/PKG-INFO +180 -0
- prism_decide-0.1.0/README.md +159 -0
- prism_decide-0.1.0/prism_decide/__init__.py +21 -0
- prism_decide-0.1.0/prism_decide/__main__.py +6 -0
- prism_decide-0.1.0/prism_decide/agents/__init__.py +66 -0
- prism_decide-0.1.0/prism_decide/agents/base.py +69 -0
- prism_decide-0.1.0/prism_decide/agents/emotional.py +49 -0
- prism_decide-0.1.0/prism_decide/agents/ethical.py +50 -0
- prism_decide-0.1.0/prism_decide/agents/financial.py +49 -0
- prism_decide-0.1.0/prism_decide/agents/foresight.py +50 -0
- prism_decide-0.1.0/prism_decide/agents/growth.py +49 -0
- prism_decide-0.1.0/prism_decide/agents/health.py +50 -0
- prism_decide-0.1.0/prism_decide/agents/lifestyle.py +49 -0
- prism_decide-0.1.0/prism_decide/agents/market.py +50 -0
- prism_decide-0.1.0/prism_decide/agents/operational.py +50 -0
- prism_decide-0.1.0/prism_decide/agents/rational.py +51 -0
- prism_decide-0.1.0/prism_decide/agents/risk.py +49 -0
- prism_decide-0.1.0/prism_decide/agents/social.py +50 -0
- prism_decide-0.1.0/prism_decide/categories/__init__.py +3 -0
- prism_decide-0.1.0/prism_decide/categories/registry.py +56 -0
- prism_decide-0.1.0/prism_decide/cli.py +667 -0
- prism_decide-0.1.0/prism_decide/config.py +69 -0
- prism_decide-0.1.0/prism_decide/core/__init__.py +21 -0
- prism_decide-0.1.0/prism_decide/core/classifier.py +106 -0
- prism_decide-0.1.0/prism_decide/core/council.py +97 -0
- prism_decide-0.1.0/prism_decide/core/synthesizer.py +140 -0
- prism_decide-0.1.0/prism_decide/core/types.py +100 -0
- prism_decide-0.1.0/prism_decide/dynamic/__init__.py +0 -0
- prism_decide-0.1.0/prism_decide/providers/__init__.py +0 -0
- prism_decide-0.1.0/prism_decide/providers/anthropic.py +77 -0
- prism_decide-0.1.0/prism_decide/providers/base.py +37 -0
- prism_decide-0.1.0/prism_decide/providers/openai.py +144 -0
- prism_decide-0.1.0/prism_decide.egg-info/PKG-INFO +180 -0
- prism_decide-0.1.0/prism_decide.egg-info/SOURCES.txt +43 -0
- prism_decide-0.1.0/prism_decide.egg-info/dependency_links.txt +1 -0
- prism_decide-0.1.0/prism_decide.egg-info/entry_points.txt +2 -0
- prism_decide-0.1.0/prism_decide.egg-info/requires.txt +12 -0
- prism_decide-0.1.0/prism_decide.egg-info/top_level.txt +1 -0
- prism_decide-0.1.0/pyproject.toml +42 -0
- prism_decide-0.1.0/setup.cfg +4 -0
- prism_decide-0.1.0/tests/test_agents.py +83 -0
- prism_decide-0.1.0/tests/test_classifier.py +67 -0
- prism_decide-0.1.0/tests/test_synthesizer.py +61 -0
- prism_decide-0.1.0/tests/test_types.py +80 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Oscar Henríquez Ríos
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: prism-decide
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Multi-agent deliberation system for better decisions
|
|
5
|
+
License: MIT
|
|
6
|
+
Requires-Python: >=3.11
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Requires-Dist: rich>=13.0
|
|
10
|
+
Requires-Dist: pydantic>=2.0
|
|
11
|
+
Requires-Dist: pyyaml>=6.0
|
|
12
|
+
Requires-Dist: httpx>=0.27
|
|
13
|
+
Requires-Dist: click>=8.0
|
|
14
|
+
Requires-Dist: questionary>=2.0
|
|
15
|
+
Provides-Extra: dev
|
|
16
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
17
|
+
Requires-Dist: pytest-asyncio>=0.24; extra == "dev"
|
|
18
|
+
Requires-Dist: black>=24.0; extra == "dev"
|
|
19
|
+
Requires-Dist: ruff>=0.5; extra == "dev"
|
|
20
|
+
Dynamic: license-file
|
|
21
|
+
|
|
22
|
+
<div align="center">
|
|
23
|
+
<h1>🏛️ Prism-Decide</h1>
|
|
24
|
+
<p><strong>Multi-agent deliberation system for better decisions.</strong></p>
|
|
25
|
+
<p><em>Refracta una decisión en múltiples perspectivas, como un prisma refracta la luz.</em></p>
|
|
26
|
+
|
|
27
|
+
<p>
|
|
28
|
+
<img src="https://img.shields.io/badge/python-3.11%2B-blue" alt="Python 3.11+">
|
|
29
|
+
<img src="https://img.shields.io/badge/license-MIT-green" alt="MIT License">
|
|
30
|
+
<img src="https://img.shields.io/badge/agents-12-brightgreen" alt="12 Agents">
|
|
31
|
+
</p>
|
|
32
|
+
|
|
33
|
+
<pre>pip install prism-decide</pre>
|
|
34
|
+
|
|
35
|
+
<pre>prism-decide decide "¿Debería cambiar de trabajo?"</pre>
|
|
36
|
+
|
|
37
|
+
<p><em>O simplemente:</em></p>
|
|
38
|
+
|
|
39
|
+
<pre>prism-decide</pre>
|
|
40
|
+
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## ✨ Features
|
|
46
|
+
|
|
47
|
+
- **12 Expert Agents** — cada decisión analizada por múltiples especialistas desde distintas perspectivas
|
|
48
|
+
- **Interactive TUI** — pantalla completa con menús, sin argumentos (solo `prism-decide`)
|
|
49
|
+
- **Setup Wizard** — configuración guiada con flechas del teclado
|
|
50
|
+
- **Multi-provider** — DeepSeek, OpenAI, OpenRouter, Anthropic, Ollama
|
|
51
|
+
- **Rich Visual Output** — tablas coloreadas, paneles, razonamiento completo
|
|
52
|
+
- **CLI + TUI** — modo rápido (`decide "..."`) o modo interactivo (sin argumentos)
|
|
53
|
+
|
|
54
|
+
## 🤖 Agentes
|
|
55
|
+
|
|
56
|
+
| Icon | Agente | Área |
|
|
57
|
+
|------|--------|------|
|
|
58
|
+
| 💰 | Financiero | Ingresos, costos, ROI y salud financiera |
|
|
59
|
+
| 📈 | Crecimiento | Aprendizaje, desarrollo profesional, proyección |
|
|
60
|
+
| ⚠️ | Riesgo | Contingencias, downsides, planes B |
|
|
61
|
+
| 🧘 | Estilo de Vida | Equilibrio, estrés, flexibilidad |
|
|
62
|
+
| ❤️ | Emocional | Sentimientos, valores, felicidad |
|
|
63
|
+
| 📊 | Mercado | Dinámicas de mercado, competencia, demanda |
|
|
64
|
+
| ⚙️ | Operativo | Factibilidad, logística, recursos |
|
|
65
|
+
| 👥 | Social | Relaciones, reputación, comunidad |
|
|
66
|
+
| 🔭 | Prospectivo | Escenarios futuros, tendencias, disrupción |
|
|
67
|
+
| 💚 | Salud | Impacto físico, mental y bienestar |
|
|
68
|
+
| ⚖️ | Ético | Implicaciones morales, principios, valores |
|
|
69
|
+
| 🧠 | Racional | Lógica pura, datos objetivos, trade-offs |
|
|
70
|
+
|
|
71
|
+
## 🧠 Cómo funciona
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
Tú: "¿Me cambio de trabajo?"
|
|
75
|
+
│
|
|
76
|
+
▼ Clasificador automático → CARRERA (94%)
|
|
77
|
+
│
|
|
78
|
+
▼ Consejo de 8 agentes (en paralelo)
|
|
79
|
+
│ 💰 Financiero 📈 Crecimiento ⚠️ Riesgo 🧘 Estilo Vida
|
|
80
|
+
│ 📊 Mercado 🔭 Prospectivo 👥 Social 🧠 Racional
|
|
81
|
+
│
|
|
82
|
+
▼ Síntesis: Matriz de decisión + recomendación
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Cada agente delibera **sin ver a los otros** (evita sesgo grupal). El sistema sintetiza todo en una matriz de puntuación con colores y recomendación final.
|
|
86
|
+
|
|
87
|
+
## 🚀 Quick Start
|
|
88
|
+
|
|
89
|
+
### 1. Instalar
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
git clone https://github.com/oscarhenriquezrios/prism-decide.git
|
|
93
|
+
cd prism-decide
|
|
94
|
+
pip install -e .
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 2. Configurar (opcional)
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
prism-decide setup
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Te guía paso a paso: proveedor, modelo, API key, preferencias.
|
|
104
|
+
|
|
105
|
+
### 3. Usar
|
|
106
|
+
|
|
107
|
+
**Modo interactivo (recomendado):**
|
|
108
|
+
```bash
|
|
109
|
+
prism-decide
|
|
110
|
+
```
|
|
111
|
+
Abre la interfaz completa: header, agentes por categoría, cuadro de diálogo para escribir tu pregunta.
|
|
112
|
+
|
|
113
|
+
**Modo rápido (CLI):**
|
|
114
|
+
```bash
|
|
115
|
+
prism-decide decide "¿Debería aceptar la nueva oferta laboral?"
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Con opciones personalizadas:**
|
|
119
|
+
```bash
|
|
120
|
+
prism-decide decide "¿Me cambio de trabajo?" \
|
|
121
|
+
--options "Quedarme en mi empleo actual" \
|
|
122
|
+
--options "Irme a la nueva empresa"
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**Seleccionar agentes específicos:**
|
|
126
|
+
```bash
|
|
127
|
+
prism-decide decide "¿Debería mudarme a otra ciudad?" \
|
|
128
|
+
--agents lifestyle --agents financial --agents social
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**Output como JSON:**
|
|
132
|
+
```bash
|
|
133
|
+
prism-decide decide "¿Debería?" --json
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## 📡 Proveedores Soportados
|
|
137
|
+
|
|
138
|
+
| Proveedor | Modelo por defecto | Variable de entorno |
|
|
139
|
+
|-----------|-------------------|-------------------|
|
|
140
|
+
| 🧊 DeepSeek | `deepseek-v4-flash` | `DEEPSEEK_API_KEY` |
|
|
141
|
+
| 🟢 OpenAI | `gpt-4o-mini` | `OPENAI_API_KEY` |
|
|
142
|
+
| 🟣 OpenRouter | `deepseek/deepseek-v4-flash` | `OPENROUTER_API_KEY` |
|
|
143
|
+
| 🔴 Anthropic | `claude-sonnet-4` | `ANTHROPIC_API_KEY` |
|
|
144
|
+
| 🟠 Ollama (local) | `llama3` | — |
|
|
145
|
+
|
|
146
|
+
Forzar proveedor:
|
|
147
|
+
```bash
|
|
148
|
+
prism-decide --provider deepseek decide "¿Debería?"
|
|
149
|
+
prism-decide -v decide "¿Debería?" # verbose: muestra modelo + API key status
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## 📂 Categorías de Decisión
|
|
153
|
+
|
|
154
|
+
| Categoría | Agentes asignados |
|
|
155
|
+
|-----------|------------------|
|
|
156
|
+
| 💼 Carrera | Financiero, Riesgo, Crecimiento, Estilo Vida, Mercado, Prospectivo, Social, Racional |
|
|
157
|
+
| 🏢 Negocio | Financiero, Riesgo, Crecimiento, Emocional, Mercado, Operativo, Ético, Prospectivo |
|
|
158
|
+
| ❤️ Personal | Emocional, Riesgo, Estilo Vida, Financiero, Social, Salud, Ético, Racional |
|
|
159
|
+
| 🏥 Salud | Estilo Vida, Emocional, Riesgo, Crecimiento, Salud, Social, Racional, Prospectivo |
|
|
160
|
+
| 🎓 Educación | Crecimiento, Financiero, Riesgo, Estilo Vida, Prospectivo, Mercado, Racional, Social |
|
|
161
|
+
| 💰 Finanzas | Financiero, Riesgo, Crecimiento, Emocional, Mercado, Operativo, Racional, Prospectivo |
|
|
162
|
+
| 📌 General | Todos los 12 agentes |
|
|
163
|
+
|
|
164
|
+
## 🏗️ Arquitectura
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
prism-decide/
|
|
168
|
+
├── prism_decide/
|
|
169
|
+
│ ├── agents/ # 12 agentes especializados
|
|
170
|
+
│ ├── categories/ # Mapeo decisión → agentes
|
|
171
|
+
│ ├── core/ # Classifier, Council, Synthesizer
|
|
172
|
+
│ ├── providers/ # OpenAI, Anthropic (interfaz común)
|
|
173
|
+
│ ├── cli.py # CLI + TUI con Rich + Questionary
|
|
174
|
+
│ └── config.py # Config YAML + env vars
|
|
175
|
+
└── tests/
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## 📜 License
|
|
179
|
+
|
|
180
|
+
MIT — haz lo que quieras, pero si haces algo interesante, cuéntanos.
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<h1>🏛️ Prism-Decide</h1>
|
|
3
|
+
<p><strong>Multi-agent deliberation system for better decisions.</strong></p>
|
|
4
|
+
<p><em>Refracta una decisión en múltiples perspectivas, como un prisma refracta la luz.</em></p>
|
|
5
|
+
|
|
6
|
+
<p>
|
|
7
|
+
<img src="https://img.shields.io/badge/python-3.11%2B-blue" alt="Python 3.11+">
|
|
8
|
+
<img src="https://img.shields.io/badge/license-MIT-green" alt="MIT License">
|
|
9
|
+
<img src="https://img.shields.io/badge/agents-12-brightgreen" alt="12 Agents">
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
<pre>pip install prism-decide</pre>
|
|
13
|
+
|
|
14
|
+
<pre>prism-decide decide "¿Debería cambiar de trabajo?"</pre>
|
|
15
|
+
|
|
16
|
+
<p><em>O simplemente:</em></p>
|
|
17
|
+
|
|
18
|
+
<pre>prism-decide</pre>
|
|
19
|
+
|
|
20
|
+
</div>
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## ✨ Features
|
|
25
|
+
|
|
26
|
+
- **12 Expert Agents** — cada decisión analizada por múltiples especialistas desde distintas perspectivas
|
|
27
|
+
- **Interactive TUI** — pantalla completa con menús, sin argumentos (solo `prism-decide`)
|
|
28
|
+
- **Setup Wizard** — configuración guiada con flechas del teclado
|
|
29
|
+
- **Multi-provider** — DeepSeek, OpenAI, OpenRouter, Anthropic, Ollama
|
|
30
|
+
- **Rich Visual Output** — tablas coloreadas, paneles, razonamiento completo
|
|
31
|
+
- **CLI + TUI** — modo rápido (`decide "..."`) o modo interactivo (sin argumentos)
|
|
32
|
+
|
|
33
|
+
## 🤖 Agentes
|
|
34
|
+
|
|
35
|
+
| Icon | Agente | Área |
|
|
36
|
+
|------|--------|------|
|
|
37
|
+
| 💰 | Financiero | Ingresos, costos, ROI y salud financiera |
|
|
38
|
+
| 📈 | Crecimiento | Aprendizaje, desarrollo profesional, proyección |
|
|
39
|
+
| ⚠️ | Riesgo | Contingencias, downsides, planes B |
|
|
40
|
+
| 🧘 | Estilo de Vida | Equilibrio, estrés, flexibilidad |
|
|
41
|
+
| ❤️ | Emocional | Sentimientos, valores, felicidad |
|
|
42
|
+
| 📊 | Mercado | Dinámicas de mercado, competencia, demanda |
|
|
43
|
+
| ⚙️ | Operativo | Factibilidad, logística, recursos |
|
|
44
|
+
| 👥 | Social | Relaciones, reputación, comunidad |
|
|
45
|
+
| 🔭 | Prospectivo | Escenarios futuros, tendencias, disrupción |
|
|
46
|
+
| 💚 | Salud | Impacto físico, mental y bienestar |
|
|
47
|
+
| ⚖️ | Ético | Implicaciones morales, principios, valores |
|
|
48
|
+
| 🧠 | Racional | Lógica pura, datos objetivos, trade-offs |
|
|
49
|
+
|
|
50
|
+
## 🧠 Cómo funciona
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
Tú: "¿Me cambio de trabajo?"
|
|
54
|
+
│
|
|
55
|
+
▼ Clasificador automático → CARRERA (94%)
|
|
56
|
+
│
|
|
57
|
+
▼ Consejo de 8 agentes (en paralelo)
|
|
58
|
+
│ 💰 Financiero 📈 Crecimiento ⚠️ Riesgo 🧘 Estilo Vida
|
|
59
|
+
│ 📊 Mercado 🔭 Prospectivo 👥 Social 🧠 Racional
|
|
60
|
+
│
|
|
61
|
+
▼ Síntesis: Matriz de decisión + recomendación
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Cada agente delibera **sin ver a los otros** (evita sesgo grupal). El sistema sintetiza todo en una matriz de puntuación con colores y recomendación final.
|
|
65
|
+
|
|
66
|
+
## 🚀 Quick Start
|
|
67
|
+
|
|
68
|
+
### 1. Instalar
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
git clone https://github.com/oscarhenriquezrios/prism-decide.git
|
|
72
|
+
cd prism-decide
|
|
73
|
+
pip install -e .
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 2. Configurar (opcional)
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
prism-decide setup
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Te guía paso a paso: proveedor, modelo, API key, preferencias.
|
|
83
|
+
|
|
84
|
+
### 3. Usar
|
|
85
|
+
|
|
86
|
+
**Modo interactivo (recomendado):**
|
|
87
|
+
```bash
|
|
88
|
+
prism-decide
|
|
89
|
+
```
|
|
90
|
+
Abre la interfaz completa: header, agentes por categoría, cuadro de diálogo para escribir tu pregunta.
|
|
91
|
+
|
|
92
|
+
**Modo rápido (CLI):**
|
|
93
|
+
```bash
|
|
94
|
+
prism-decide decide "¿Debería aceptar la nueva oferta laboral?"
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**Con opciones personalizadas:**
|
|
98
|
+
```bash
|
|
99
|
+
prism-decide decide "¿Me cambio de trabajo?" \
|
|
100
|
+
--options "Quedarme en mi empleo actual" \
|
|
101
|
+
--options "Irme a la nueva empresa"
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**Seleccionar agentes específicos:**
|
|
105
|
+
```bash
|
|
106
|
+
prism-decide decide "¿Debería mudarme a otra ciudad?" \
|
|
107
|
+
--agents lifestyle --agents financial --agents social
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Output como JSON:**
|
|
111
|
+
```bash
|
|
112
|
+
prism-decide decide "¿Debería?" --json
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## 📡 Proveedores Soportados
|
|
116
|
+
|
|
117
|
+
| Proveedor | Modelo por defecto | Variable de entorno |
|
|
118
|
+
|-----------|-------------------|-------------------|
|
|
119
|
+
| 🧊 DeepSeek | `deepseek-v4-flash` | `DEEPSEEK_API_KEY` |
|
|
120
|
+
| 🟢 OpenAI | `gpt-4o-mini` | `OPENAI_API_KEY` |
|
|
121
|
+
| 🟣 OpenRouter | `deepseek/deepseek-v4-flash` | `OPENROUTER_API_KEY` |
|
|
122
|
+
| 🔴 Anthropic | `claude-sonnet-4` | `ANTHROPIC_API_KEY` |
|
|
123
|
+
| 🟠 Ollama (local) | `llama3` | — |
|
|
124
|
+
|
|
125
|
+
Forzar proveedor:
|
|
126
|
+
```bash
|
|
127
|
+
prism-decide --provider deepseek decide "¿Debería?"
|
|
128
|
+
prism-decide -v decide "¿Debería?" # verbose: muestra modelo + API key status
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## 📂 Categorías de Decisión
|
|
132
|
+
|
|
133
|
+
| Categoría | Agentes asignados |
|
|
134
|
+
|-----------|------------------|
|
|
135
|
+
| 💼 Carrera | Financiero, Riesgo, Crecimiento, Estilo Vida, Mercado, Prospectivo, Social, Racional |
|
|
136
|
+
| 🏢 Negocio | Financiero, Riesgo, Crecimiento, Emocional, Mercado, Operativo, Ético, Prospectivo |
|
|
137
|
+
| ❤️ Personal | Emocional, Riesgo, Estilo Vida, Financiero, Social, Salud, Ético, Racional |
|
|
138
|
+
| 🏥 Salud | Estilo Vida, Emocional, Riesgo, Crecimiento, Salud, Social, Racional, Prospectivo |
|
|
139
|
+
| 🎓 Educación | Crecimiento, Financiero, Riesgo, Estilo Vida, Prospectivo, Mercado, Racional, Social |
|
|
140
|
+
| 💰 Finanzas | Financiero, Riesgo, Crecimiento, Emocional, Mercado, Operativo, Racional, Prospectivo |
|
|
141
|
+
| 📌 General | Todos los 12 agentes |
|
|
142
|
+
|
|
143
|
+
## 🏗️ Arquitectura
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
prism-decide/
|
|
147
|
+
├── prism_decide/
|
|
148
|
+
│ ├── agents/ # 12 agentes especializados
|
|
149
|
+
│ ├── categories/ # Mapeo decisión → agentes
|
|
150
|
+
│ ├── core/ # Classifier, Council, Synthesizer
|
|
151
|
+
│ ├── providers/ # OpenAI, Anthropic (interfaz común)
|
|
152
|
+
│ ├── cli.py # CLI + TUI con Rich + Questionary
|
|
153
|
+
│ └── config.py # Config YAML + env vars
|
|
154
|
+
└── tests/
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## 📜 License
|
|
158
|
+
|
|
159
|
+
MIT — haz lo que quieras, pero si haces algo interesante, cuéntanos.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""Prism-Decide package."""
|
|
2
|
+
|
|
3
|
+
from .core import (
|
|
4
|
+
CATEGORY_LABELS,
|
|
5
|
+
AgentVerdict,
|
|
6
|
+
Classifier,
|
|
7
|
+
Council,
|
|
8
|
+
DecisionCategory,
|
|
9
|
+
DecisionMatrix,
|
|
10
|
+
Synthesizer,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"Classifier",
|
|
15
|
+
"Council",
|
|
16
|
+
"Synthesizer",
|
|
17
|
+
"DecisionCategory",
|
|
18
|
+
"DecisionMatrix",
|
|
19
|
+
"AgentVerdict",
|
|
20
|
+
"CATEGORY_LABELS",
|
|
21
|
+
]
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""All agents registry — importable from a single module."""
|
|
2
|
+
|
|
3
|
+
from ..providers.base import BaseProvider
|
|
4
|
+
from .base import BaseAgent
|
|
5
|
+
from .emotional import EmotionalAgent
|
|
6
|
+
from .ethical import EthicalAgent
|
|
7
|
+
from .financial import FinancialAgent
|
|
8
|
+
from .foresight import ForesightAgent
|
|
9
|
+
from .growth import GrowthAgent
|
|
10
|
+
from .health import HealthAgent
|
|
11
|
+
from .lifestyle import LifestyleAgent
|
|
12
|
+
from .market import MarketAgent
|
|
13
|
+
from .operational import OperationalAgent
|
|
14
|
+
from .rational import RationalAgent
|
|
15
|
+
from .risk import RiskAgent
|
|
16
|
+
from .social import SocialAgent
|
|
17
|
+
|
|
18
|
+
AGENT_CLASSES: list[type[BaseAgent]] = [
|
|
19
|
+
FinancialAgent,
|
|
20
|
+
RiskAgent,
|
|
21
|
+
GrowthAgent,
|
|
22
|
+
LifestyleAgent,
|
|
23
|
+
EmotionalAgent,
|
|
24
|
+
MarketAgent,
|
|
25
|
+
OperationalAgent,
|
|
26
|
+
SocialAgent,
|
|
27
|
+
ForesightAgent,
|
|
28
|
+
HealthAgent,
|
|
29
|
+
EthicalAgent,
|
|
30
|
+
RationalAgent,
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
AGENT_MAP: dict[str, type[BaseAgent]] = {
|
|
34
|
+
cls.agent_id: cls for cls in AGENT_CLASSES
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def get_agent(agent_id: str, provider: BaseProvider) -> BaseAgent | None:
|
|
39
|
+
"""Get an agent instance by ID."""
|
|
40
|
+
cls = AGENT_MAP.get(agent_id)
|
|
41
|
+
if cls:
|
|
42
|
+
return cls(provider=provider)
|
|
43
|
+
return None
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def get_agents(agent_ids: list[str], provider: BaseProvider) -> list[BaseAgent]:
|
|
47
|
+
"""Get multiple agent instances by IDs."""
|
|
48
|
+
agents = []
|
|
49
|
+
for aid in agent_ids:
|
|
50
|
+
agent = get_agent(aid, provider)
|
|
51
|
+
if agent:
|
|
52
|
+
agents.append(agent)
|
|
53
|
+
return agents
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def list_available_agents() -> list[dict]:
|
|
57
|
+
"""List all available agents with their metadata."""
|
|
58
|
+
return [
|
|
59
|
+
{
|
|
60
|
+
"id": cls.agent_id,
|
|
61
|
+
"label": cls.agent_label,
|
|
62
|
+
"icon": cls.agent_icon,
|
|
63
|
+
"description": cls.description,
|
|
64
|
+
}
|
|
65
|
+
for cls in AGENT_CLASSES
|
|
66
|
+
]
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""Base agent class for Prism-Decide."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from abc import ABC, abstractmethod
|
|
6
|
+
|
|
7
|
+
from ..core.types import AgentVerdict
|
|
8
|
+
from ..providers.base import BaseProvider
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class BaseAgent(ABC):
|
|
12
|
+
"""Abstract base class for all decision agents."""
|
|
13
|
+
|
|
14
|
+
agent_id: str = ""
|
|
15
|
+
agent_label: str = ""
|
|
16
|
+
agent_icon: str = "🤖"
|
|
17
|
+
description: str = ""
|
|
18
|
+
|
|
19
|
+
def __init__(self, provider: BaseProvider):
|
|
20
|
+
self.provider = provider
|
|
21
|
+
|
|
22
|
+
@abstractmethod
|
|
23
|
+
def get_system_prompt(self) -> str:
|
|
24
|
+
"""Return the system prompt defining this agent's persona."""
|
|
25
|
+
...
|
|
26
|
+
|
|
27
|
+
@abstractmethod
|
|
28
|
+
def get_user_prompt(self, decision: str, options: list[str]) -> str:
|
|
29
|
+
"""Return the user prompt with the decision context."""
|
|
30
|
+
...
|
|
31
|
+
|
|
32
|
+
def evaluate(self, decision: str, options: list[str]) -> AgentVerdict:
|
|
33
|
+
"""Run the agent and return a structured verdict."""
|
|
34
|
+
system = self.get_system_prompt()
|
|
35
|
+
prompt = self.get_user_prompt(decision, options)
|
|
36
|
+
|
|
37
|
+
try:
|
|
38
|
+
raw = self.provider.complete_json(prompt, system=system, temperature=0.5)
|
|
39
|
+
|
|
40
|
+
scores = {}
|
|
41
|
+
for entry in raw.get("scores", []):
|
|
42
|
+
option = entry.get("option", "")
|
|
43
|
+
score = int(entry.get("score", 5))
|
|
44
|
+
scores[option] = max(1, min(10, score))
|
|
45
|
+
|
|
46
|
+
# Map by index if keys don't match
|
|
47
|
+
if not scores or set(scores.keys()) != set(options):
|
|
48
|
+
for i, opt in enumerate(options):
|
|
49
|
+
if i < len(raw.get("scores", [])):
|
|
50
|
+
scores[opt] = max(1, min(10, raw["scores"][i].get("score", 5)))
|
|
51
|
+
else:
|
|
52
|
+
scores[opt] = 5
|
|
53
|
+
except Exception as e:
|
|
54
|
+
scores = {opt: 5 for opt in options}
|
|
55
|
+
raw = {
|
|
56
|
+
"reasoning": f"Error al obtener respuesta del LLM: {e}",
|
|
57
|
+
"key_factors": ["Error en conexión con proveedor"],
|
|
58
|
+
"recommendation": "No se pudo evaluar.",
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return AgentVerdict(
|
|
62
|
+
agent_id=self.agent_id,
|
|
63
|
+
agent_label=self.agent_label,
|
|
64
|
+
agent_icon=self.agent_icon,
|
|
65
|
+
scores=scores,
|
|
66
|
+
reasoning=raw.get("reasoning", ""),
|
|
67
|
+
key_factors=raw.get("key_factors", []),
|
|
68
|
+
recommendation=raw.get("recommendation", ""),
|
|
69
|
+
)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""Emotional agent — evaluates feelings, values, and personal fulfillment."""
|
|
2
|
+
|
|
3
|
+
from .base import BaseAgent
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class EmotionalAgent(BaseAgent):
|
|
7
|
+
agent_id = "emotional"
|
|
8
|
+
agent_label = "Emocional"
|
|
9
|
+
agent_icon = "❤️"
|
|
10
|
+
description = "Evalúa sentimientos, valores, felicidad y realización personal"
|
|
11
|
+
|
|
12
|
+
def get_system_prompt(self) -> str:
|
|
13
|
+
return """Eres UN CONSEJERO EMOCIONAL. Evalúas decisiones según su impacto en la felicidad, los valores personales y la realización.
|
|
14
|
+
|
|
15
|
+
Eres empático, intuitivo y sensible a lo que realmente importa para la persona. No eres racional frío — conectas con las emociones auténticas.
|
|
16
|
+
|
|
17
|
+
Debes considerar:
|
|
18
|
+
- Felicidad y satisfacción genuina
|
|
19
|
+
- Alineación con valores personales
|
|
20
|
+
- Paz interior y tranquilidad
|
|
21
|
+
- Orgullo y autoestima
|
|
22
|
+
- Conexión con el propósito de vida
|
|
23
|
+
- Arrepentimiento potencial (¿qué opción te haría decir "ojalá hubiera..."?)
|
|
24
|
+
- Lo que el corazón realmente quiere
|
|
25
|
+
|
|
26
|
+
IMPORTANTE: Responde ÚNICAMENTE con JSON válido."""
|
|
27
|
+
|
|
28
|
+
def get_user_prompt(self, decision: str, options: list[str]) -> str:
|
|
29
|
+
opts = "\n".join(f"- {o}" for o in options)
|
|
30
|
+
return f"""Evalúa esta decisión desde una perspectiva EMOCIONAL:
|
|
31
|
+
|
|
32
|
+
DECISIÓN: "{decision}"
|
|
33
|
+
|
|
34
|
+
OPCIONES:
|
|
35
|
+
{opts}
|
|
36
|
+
|
|
37
|
+
Para cada opción, asigna un puntaje del 1 al 10 donde:
|
|
38
|
+
- 10 = te hace más feliz y realizada/o (alineado con quien eres)
|
|
39
|
+
- 1 = te hace infeliz y desconectada/o de ti misma/o
|
|
40
|
+
|
|
41
|
+
Responde en este JSON:
|
|
42
|
+
{{
|
|
43
|
+
"scores": [
|
|
44
|
+
{{"option": "opción exacta", "score": <1-10>, "rationale": "por qué este puntaje"}}
|
|
45
|
+
],
|
|
46
|
+
"reasoning": "análisis emocional completo",
|
|
47
|
+
"key_factors": ["factor 1", "factor 2", "factor 3"],
|
|
48
|
+
"recommendation": "recomendación emocional"
|
|
49
|
+
}}"""
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"""Ethical agent — evaluates moral implications and values alignment."""
|
|
2
|
+
|
|
3
|
+
from .base import BaseAgent
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class EthicalAgent(BaseAgent):
|
|
7
|
+
agent_id = "ethical"
|
|
8
|
+
agent_label = "Ético"
|
|
9
|
+
agent_icon = "⚖️"
|
|
10
|
+
description = "Evalúa implicaciones morales, principios y alineación con valores"
|
|
11
|
+
|
|
12
|
+
def get_system_prompt(self) -> str:
|
|
13
|
+
return """Eres UN FILÓSOFO ÉTICO. Evalúas decisiones según principios morales, justicia, integridad y alineación con valores fundamentales.
|
|
14
|
+
|
|
15
|
+
Eres reflexivo, imparcial y basado en marcos éticos sólidos. No impones tu moral — exploras las dimensiones éticas para que la persona decida con conciencia.
|
|
16
|
+
|
|
17
|
+
Debes considerar:
|
|
18
|
+
- Principios éticos fundamentales (honestidad, justicia, responsabilidad)
|
|
19
|
+
- Consecuencias para otros afectados (stakeholders)
|
|
20
|
+
- Derechos y deberes involucrados
|
|
21
|
+
- Transparencia e integridad
|
|
22
|
+
- Conflicto de valores entre opciones
|
|
23
|
+
- Marco ético aplicable (deontológico, consecuencialista, virtud)
|
|
24
|
+
- Legalidad vs. moralidad
|
|
25
|
+
- Legado ético: ¿estaría orgulloso de esta decisión?
|
|
26
|
+
|
|
27
|
+
IMPORTANTE: Responde ÚNICAMENTE con JSON válido."""
|
|
28
|
+
|
|
29
|
+
def get_user_prompt(self, decision: str, options: list[str]) -> str:
|
|
30
|
+
opts = "\n".join(f"- {o}" for o in options)
|
|
31
|
+
return f"""Evalúa esta decisión desde una perspectiva ÉTICA:
|
|
32
|
+
|
|
33
|
+
DECISIÓN: "{decision}"
|
|
34
|
+
|
|
35
|
+
OPCIONES:
|
|
36
|
+
{opts}
|
|
37
|
+
|
|
38
|
+
Para cada opción, asigna un puntaje del 1 al 10 donde:
|
|
39
|
+
- 10 = éticamente sólida (íntegra, justa, transparente, responsable)
|
|
40
|
+
- 1 = éticamente problemática (deshonesta, injusta, irresponsable)
|
|
41
|
+
|
|
42
|
+
Responde en este JSON:
|
|
43
|
+
{{
|
|
44
|
+
"scores": [
|
|
45
|
+
{{"option": "opción exacta", "score": <1-10>, "rationale": "por qué este puntaje"}}
|
|
46
|
+
],
|
|
47
|
+
"reasoning": "análisis ético completo",
|
|
48
|
+
"key_factors": ["factor 1", "factor 2", "factor 3"],
|
|
49
|
+
"recommendation": "recomendación ética"
|
|
50
|
+
}}"""
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""Financial agent — evaluates economic impact."""
|
|
2
|
+
|
|
3
|
+
from .base import BaseAgent
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class FinancialAgent(BaseAgent):
|
|
7
|
+
agent_id = "financial"
|
|
8
|
+
agent_label = "Financiero"
|
|
9
|
+
agent_icon = "💰"
|
|
10
|
+
description = "Evalúa ingresos, costos, ROI y salud financiera"
|
|
11
|
+
|
|
12
|
+
def get_system_prompt(self) -> str:
|
|
13
|
+
return """Eres un ANALISTA FINANCIERO experto en evaluar decisiones desde una perspectiva económica y financiera.
|
|
14
|
+
|
|
15
|
+
Eres objetivo, basado en datos y pragmático. Tu trabajo es analizar cómo cada opción impacta la salud financiera a corto, mediano y largo plazo.
|
|
16
|
+
|
|
17
|
+
Debes considerar:
|
|
18
|
+
- Impacto en ingresos (corto, mediano y largo plazo)
|
|
19
|
+
- Costos directos e indirectos
|
|
20
|
+
- Riesgo financiero y estabilidad
|
|
21
|
+
- ROI proyectado
|
|
22
|
+
- Impacto en ahorros, inversiones y patrimonio
|
|
23
|
+
- Costo de oportunidad
|
|
24
|
+
- Sostenibilidad financiera en el tiempo
|
|
25
|
+
|
|
26
|
+
IMPORTANTE: Responde ÚNICAMENTE con JSON válido. NO incluyas markdown ni texto adicional."""
|
|
27
|
+
|
|
28
|
+
def get_user_prompt(self, decision: str, options: list[str]) -> str:
|
|
29
|
+
opts = "\n".join(f"- {o}" for o in options)
|
|
30
|
+
return f"""Evalúa esta decisión desde una perspectiva FINANCIERA:
|
|
31
|
+
|
|
32
|
+
DECISIÓN: "{decision}"
|
|
33
|
+
|
|
34
|
+
OPCIONES:
|
|
35
|
+
{opts}
|
|
36
|
+
|
|
37
|
+
Para cada opción, asigna un puntaje del 1 al 10 donde:
|
|
38
|
+
- 10 = excelente financieramente (altos ingresos, bajo riesgo, buen ROI)
|
|
39
|
+
- 1 = pésimo financieramente (pérdidas, alto riesgo, mal ROI)
|
|
40
|
+
|
|
41
|
+
Responde en este JSON:
|
|
42
|
+
{{
|
|
43
|
+
"scores": [
|
|
44
|
+
{{"option": "opción exacta", "score": <1-10>, "rationale": "por qué este puntaje"}}
|
|
45
|
+
],
|
|
46
|
+
"reasoning": "análisis financiero completo (2-3 párrafos)",
|
|
47
|
+
"key_factors": ["factor clave 1", "factor clave 2", "factor clave 3"],
|
|
48
|
+
"recommendation": "recomendación financiera final"
|
|
49
|
+
}}"""
|