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.
Files changed (45) hide show
  1. prism_decide-0.1.0/LICENSE +21 -0
  2. prism_decide-0.1.0/PKG-INFO +180 -0
  3. prism_decide-0.1.0/README.md +159 -0
  4. prism_decide-0.1.0/prism_decide/__init__.py +21 -0
  5. prism_decide-0.1.0/prism_decide/__main__.py +6 -0
  6. prism_decide-0.1.0/prism_decide/agents/__init__.py +66 -0
  7. prism_decide-0.1.0/prism_decide/agents/base.py +69 -0
  8. prism_decide-0.1.0/prism_decide/agents/emotional.py +49 -0
  9. prism_decide-0.1.0/prism_decide/agents/ethical.py +50 -0
  10. prism_decide-0.1.0/prism_decide/agents/financial.py +49 -0
  11. prism_decide-0.1.0/prism_decide/agents/foresight.py +50 -0
  12. prism_decide-0.1.0/prism_decide/agents/growth.py +49 -0
  13. prism_decide-0.1.0/prism_decide/agents/health.py +50 -0
  14. prism_decide-0.1.0/prism_decide/agents/lifestyle.py +49 -0
  15. prism_decide-0.1.0/prism_decide/agents/market.py +50 -0
  16. prism_decide-0.1.0/prism_decide/agents/operational.py +50 -0
  17. prism_decide-0.1.0/prism_decide/agents/rational.py +51 -0
  18. prism_decide-0.1.0/prism_decide/agents/risk.py +49 -0
  19. prism_decide-0.1.0/prism_decide/agents/social.py +50 -0
  20. prism_decide-0.1.0/prism_decide/categories/__init__.py +3 -0
  21. prism_decide-0.1.0/prism_decide/categories/registry.py +56 -0
  22. prism_decide-0.1.0/prism_decide/cli.py +667 -0
  23. prism_decide-0.1.0/prism_decide/config.py +69 -0
  24. prism_decide-0.1.0/prism_decide/core/__init__.py +21 -0
  25. prism_decide-0.1.0/prism_decide/core/classifier.py +106 -0
  26. prism_decide-0.1.0/prism_decide/core/council.py +97 -0
  27. prism_decide-0.1.0/prism_decide/core/synthesizer.py +140 -0
  28. prism_decide-0.1.0/prism_decide/core/types.py +100 -0
  29. prism_decide-0.1.0/prism_decide/dynamic/__init__.py +0 -0
  30. prism_decide-0.1.0/prism_decide/providers/__init__.py +0 -0
  31. prism_decide-0.1.0/prism_decide/providers/anthropic.py +77 -0
  32. prism_decide-0.1.0/prism_decide/providers/base.py +37 -0
  33. prism_decide-0.1.0/prism_decide/providers/openai.py +144 -0
  34. prism_decide-0.1.0/prism_decide.egg-info/PKG-INFO +180 -0
  35. prism_decide-0.1.0/prism_decide.egg-info/SOURCES.txt +43 -0
  36. prism_decide-0.1.0/prism_decide.egg-info/dependency_links.txt +1 -0
  37. prism_decide-0.1.0/prism_decide.egg-info/entry_points.txt +2 -0
  38. prism_decide-0.1.0/prism_decide.egg-info/requires.txt +12 -0
  39. prism_decide-0.1.0/prism_decide.egg-info/top_level.txt +1 -0
  40. prism_decide-0.1.0/pyproject.toml +42 -0
  41. prism_decide-0.1.0/setup.cfg +4 -0
  42. prism_decide-0.1.0/tests/test_agents.py +83 -0
  43. prism_decide-0.1.0/tests/test_classifier.py +67 -0
  44. prism_decide-0.1.0/tests/test_synthesizer.py +61 -0
  45. 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,6 @@
1
+ """Prism-Decide entry point for `python -m prism_decide`."""
2
+
3
+ from .cli import main
4
+
5
+ if __name__ == "__main__":
6
+ main()
@@ -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
+ }}"""