Documentación de StrataSynth
Todo lo que necesitas para generar, evaluar e integrar datasets de conversación sintética.
Inicio rápido: tu primer dataset en 5 minutos
Necesitas una clave de API (ss_live_...). Solicítala desde el dashboard. Todos los ejemplos usan directamente la API REST, sin necesidad de SDK.
curl -X POST https://api.stratasynth.com/auth/token \
-H "Content-Type: application/json" \
-d '{"api_key": "ss_live_..."}'
# Response:
# { "data": { "token": "eyJ...", "expires_in": 86400 } }
export TOKEN="eyJ..."curl -X POST https://api.stratasynth.com/jobs/dataset \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"scenario_id": "FAM-01",
"conversation_count": 5,
"complexity": 3,
"language": "en",
"adapter": "flat_jsonl"
}'
# Response:
# { "data": { "jobId": "job_abc123", "status": "QUEUED", "estimated_time": 60 } }
export JOB_ID="job_abc123"curl -H "Authorization: Bearer $TOKEN" \
https://api.stratasynth.com/jobs/$JOB_ID
# Repeat every 10s until status = "COMPLETED"
# { "data": { "status": "COMPLETED", "download_url": "https://..." } }curl -H "Authorization: Bearer $TOKEN" \
https://api.stratasynth.com/jobs/$JOB_ID/preview
# Returns up to 2 full conversations with per-turn ground truth:
# intent · communication_act · emotional_state · belief_state · relationship_state# The download_url from step 3 is a presigned S3 URL (valid 24h)
curl "$DOWNLOAD_URL" -o dataset.jsonl
# Each line is a full conversation object:
# { "conversation_id": "...", "turns": [...], "ground_truth": {...}, "metadata": {...} }Qué es StrataSynth
StrataSynth genera conversaciones sintéticas entre dos personas con una referencia psicológica completa. No son transcripciones reales: se construyen a partir de perfiles psicológicos y siguen las emociones, las creencias y las relaciones turno a turno.
La diferencia clave con otros generadores de datos sintéticos: StrataSynth separa la cognición del lenguaje. Cada turno parte de una decisión cognitiva (intención, objetivo y el acto comunicativo al que apuntar) calculada antes de que el LLM genere ningún texto. El LLM escribe las palabras y declara el acto comunicativo que ha usado de verdad; ese acto declarado es el que se exporta como communication_act.
Cada conversación incluye:
- El texto de la conversación (turnos)
- Etiquetas por turno: intención y objetivo del motor, estado emocional y el acto comunicativo que declara el generador
- Evolución de la relación: confianza, tensión, conexión, equilibrio de poder
- Evolución de las creencias: 12 creencias × (valor, confianza) por persona
- Ruido deliberado etiquetado (mentiras, exageraciones, retractaciones)
La mayoría de los datasets de conversación son solo texto. Los datasets de StrataSynth incluyen los motivos detrás de cada turno, lo que te permite entrenar modelos que entienden la intención, el cambio de creencias y la dinámica social, en lugar de limitarse a reconocer patrones en las palabras. La intención, el objetivo, el estado de creencias y el estado de la relación se calculan sin un LLM, así que no heredan los mismos sesgos que el texto.
Cómo funciona: el pipeline cognitivo
Cada turno pasa por un pipeline cognitivo determinista antes de que se genere nada de lenguaje. Esto es lo que separa a StrataSynth de los envoltorios de LLM que piden al modelo que "genere una conversación realista".
Como el Decision Engine es determinista, usar la misma seed + el mismo escenario + la misma versión del motor produce siempre las mismas decisiones cognitivas, aunque el LLM genere un texto ligeramente distinto. Lo que puede variar con el texto es lo que el generador declara junto a él, como communication_act.
Formato del dataset: cómo es un turno
Esto es lo que recibes de verdad en tu dataset. Cada turno de cada conversación contiene el texto más la estructura cognitiva que lo produjo.
{
"speaker": "A",
"text": "I'm not upset about the meeting. Really, it's fine.",
"intent": "deflect",
"goal": "protect_self",
"communication_act": "minimization",
"emotional_state": {
"tension": 0.71,
"connection": 0.28,
"vulnerability": 0.54
},
"relationship_state": {
"trust": 0.52,
"tension": 0.68,
"connection": 0.31,
"dominance_balance": -0.12
},
"belief_state": {
"trust_in_other": { "value": 0.48, "confidence": 0.76 },
"self_worth": { "value": 0.61, "confidence": 0.82 },
"conflict_is_solvable": { "value": 0.35, "confidence": 0.63 },
"partner_supportive": { "value": 0.29, "confidence": 0.71 }
},
"belief_delta": {
"trust_in_other": -0.04,
"conflict_is_solvable": -0.07
},
"noise_flags": ["social_lie"]
}| Campo | Tipo | Descripción |
|---|---|---|
text | string | Texto del turno generado por el LLM |
speaker | A | B | Qué persona está hablando |
intent | string | Intención cognitiva: deflect, reveal, confront, comfort, manipulate… |
goal | string | Lo que quiere el hablante: protect_self, seek_validation, repair_bond… |
communication_act | string | Acto pragmático tal como lo declara el generador junto con el texto: accusation, disclosure, sarcasm, minimization… (10 tipos) |
emotional_state | object | Emoción del turno: tension, connection, vulnerability (0-1) |
relationship_state | object | Estado relacional en 4 dimensiones: trust, tension, connection, dominance_balance |
belief_state | object | 12 creencias × {value, confidence}: el modelo interno del mundo del hablante |
belief_delta | object | Cambio en cada creencia causado por este turno |
noise_flags | array | Ruido deliberado introducido: social_lie, exaggeration_emotional, retraction… |
intent, goal, belief_state y belief_delta los calcula el Decision Engine antes de que se ejecute el LLM. No se infieren del texto: el texto se genera a partir de ellos.{
"conversation_id": "conv_abc123",
"scenario_id": "FAM-01",
"language": "en",
"seed": 42,
"engine_version": "1.2.0",
"schema_version": "1.1.0",
"personas": {
"A": { "persona_id": "psyg_xyz", "archetype": "caregiver", "attachment_style": "anxious_preoccupied" },
"B": { "persona_id": "psyg_abc", "archetype": "burned_out_exec", "attachment_style": "dismissive_avoidant" }
},
"relationship_trajectory": [
{ "turn": 0, "trust": 0.65, "tension": 0.40 },
{ "turn": 5, "trust": 0.52, "tension": 0.68 }
],
"turns": [ ... ],
"ground_truth": {
"noise_rejection_rate": 1.0,
"behavioral_entropy": 0.83,
"belief_consistency": 0.71
}
}Casos de uso
Lo que están construyendo los equipos con StrataSynth.
Genera 500 conversaciones en las que la persona A es un cliente frustrado, despectivo y con poca confianza. Pon tu chatbot como uno de los dos lados del diálogo. Usa noise_rejection_rate y belief_consistency para medir lo bien que gestiona a los usuarios difíciles.
Genera un dataset con etiquetas de intención y objetivo en cada turno. Ajusta un modelo para que prediga la intención a partir del texto: tendrás detección de intención por turno sin anotación manual.
noise_flags etiqueta cada turno con el tipo de mentira o distorsión (social_lie, exaggeration_emotional, narrative_silence…). Úsalas como etiquetas de entrenamiento para un modelo que detecte engaños o narradores poco fiables.
Genera personas con /personas/generate y guarda sus ID. Reutiliza al mismo directivo quemado o a la misma cuidadora ansiosa en varios trabajos, escenarios y evaluaciones, en lugar de empezar de cero cada vez.
Usa los 12 escenarios (conflicto familiar, acompañamiento en el duelo, cambio de carrera, ruptura de pareja…) para hacer benchmarks estructurados. La referencia es reproducible: la misma semilla da siempre el mismo benchmark.
Los campos belief_state y belief_delta siguen cómo evolucionan 12 creencias centrales a lo largo de la conversación. Útil para investigación en NLP sobre seguimiento de creencias, modelado de la persuasión y teoría de la mente en IA.
Para quién es
| Tipo | Acceso | Cuándo usarlo |
|---|---|---|
Dashboard | app.stratasynth.com | Sin pipeline. Solo necesitas el fichero. |
CLI | terminal stratasynth | Automatizas, programas scripts o necesitas vigilar trabajos. |
Python SDK | pip stratasynth-client | Lo integras con pipelines de ML, HF o pandas. |
API | HTTP + clave de API | Tu propio backend, cualquier lenguaje, control total. |
PsycheGraph Schema | JSON / paquete npm | Trabajas directamente con perfiles de personas. |
Dashboard: app.stratasynth.com
El camino más rápido para obtener valor. No hace falta código. Configura escenarios, revisa los trabajos, previsualiza datasets, genera personas y solicita evaluaciones desde el navegador.
| Parámetro | Controla | Recomendación |
|---|---|---|
scenario | Tipo de relación y de conflicto | FAM-01 familia, ROM-01 pareja, PRO-01 trabajo, VIT-01 crisis vital |
count | Número de conversaciones | 5-10 para probar, 100-500 para fine-tuning |
complexity | Riqueza del perfil psicológico | 3 es equilibrado. 5 = muy rico, más lento. 1 = básico, rápido |
language | Idioma del texto generado | en, es, de, fr |
adapter | Formato del fichero de salida | flat_jsonl general, openai_finetuning para OpenAI, huggingface_dataset para HF |
noise | % de ruido deliberado (mentiras, retractaciones) | 0,1-0,2 es realista |
seed | Reproducibilidad exacta | Misma semilla = mismos datos (mismo escenario, complejidad e idioma) |
CLI: stratasynth
pip install stratasynth-cli
stratasynth auth login --api-key ss_live_...
# List available scenarios
stratasynth scenarios list
# Generate a dataset
stratasynth generate \
--scenario FAM-01 \
--count 100 \
--complexity 3 \
--adapter huggingface_dataset \
--language en
# Watch job status
stratasynth jobs list
stratasynth jobs status job_abc123
# Download completed dataset
stratasynth jobs download --job-id job_abc123 --output ./dataset.jsonl
# Generate a PsycheGraph persona
stratasynth personas generate --archetype working_mother --complexity 4
# Evaluate a completed job
stratasynth evaluate start --job-id job_abc123
stratasynth evaluate results --eval-id eval_abc123SDK de Python: stratasynth-client
pip install stratasynth-client
from stratasynth_client import StrataSynthClient
client = StrataSynthClient(api_key="ss_live_...")
# Generate and wait
result = client.jobs.create(
scenario_id="FAM-01",
conversation_count=50,
complexity=3,
language="en",
adapter="flat_jsonl",
)
result.wait()
# Download and work with data
dataset = result.download()
df = dataset.to_dataframe() # pandas
hf = dataset.to_huggingface() # Hugging Face Dataset
hf.push_to_hub("my-org/my-dataset")
# Reuse a persona across multiple jobs
persona = client.personas.generate(archetype="burnt_out_professional", complexity=4)
job1 = client.jobs.create(scenario_id="PRO-01", persona_a_id=persona.persona_id, ...)
job2 = client.jobs.create(scenario_id="ROM-02", persona_a_id=persona.persona_id, ...)API: HTTP
Todos los endpoints requieren un JWT que se obtiene a cambio de tu clave de API. Los tokens son válidos durante 24 horas.
# 1. Authenticate
curl -X POST https://api.stratasynth.com/auth/token \
-H "Content-Type: application/json" \
-d '{"api_key": "ss_live_..."}'
# → { "data": { "token": "eyJ...", "expires_in": 86400 } }
TOKEN="eyJ..."
# 2. List scenarios
curl -H "Authorization: Bearer $TOKEN" https://api.stratasynth.com/scenarios
# 3. Create a generation job
curl -X POST https://api.stratasynth.com/jobs/dataset \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"scenario_id": "FAM-01",
"conversation_count": 20,
"complexity": 3,
"language": "en",
"adapter": "flat_jsonl"
}'
# 4. Poll status
curl -H "Authorization: Bearer $TOKEN" https://api.stratasynth.com/jobs/{jobId}
# 5. Download (presigned S3 URL in response)
curl "$DOWNLOAD_URL" -o dataset.jsonl| Método | Endpoint | Descripción |
|---|---|---|
POST | /auth/token | Clave de API → JWT (24 h) |
GET | /scenarios | Lista los 12 escenarios |
POST | /jobs/dataset | Crea un trabajo de generación (asíncrono) |
GET | /jobs/{jobId} | Estado del trabajo + progreso + download_url |
GET | /jobs | Lista los trabajos (paginación por cursor) |
GET | /jobs/{jobId}/preview | Las 2 primeras conversaciones sin descarga completa |
POST | /personas/generate | Genera un perfil PsycheGraph (asíncrono) |
GET | /personas/{personaId} | Recupera un perfil en caché (TTL de 7 días) |
POST | /evaluate | Lanza una evaluación |
GET | /evaluate/{evalId} | Estado de la evaluación + 10 métricas |
Notebooks: ejemplos descargables
Cuatro notebooks de Jupyter completos (en inglés), listos para ejecutar contra la API. Descárgalos y ábrelos en Jupyter o en Google Colab.
Genera un dataset → explora los campos de intención y creencias → exporta a fine-tuning de OpenAI o a Hugging Face Hub.
Descargar .ipynbCalcula las 10 métricas deterministas. Visualiza belief_consistency, identity_stability y behavioral_entropy.
Descargar .ipynbGenera un cliente enfadado, un usuario confundido y un negociador manipulador. Reutiliza los ID de persona entre escenarios.
Descargar .ipynbPon a prueba TU LLM frente a StrataSynth con tus propias claves de API. Detección determinista de la deriva de rol, sin un LLM como juez, con tasas sobre N ejecuciones.
Descargar .ipynbpip install requests pandas matplotlib datasets transformersEscenarios (12 disponibles)
| ID | Nombre | Descripción |
|---|---|---|
FAM-01 | Cuidadora familiar | Hija adulta que cuida a su padre con demencia. Deuda emocional, agotamiento, culpa. |
FAM-02 | Conflicto por una herencia | Hermanos que negocian la herencia tras la muerte del padre. Dinero frente a lealtad. |
FAM-03 | Intento de distanciamiento | Un hijo adulto intenta poner límites a una madre controladora. |
ROM-01 | Reencuentro a distancia | Pareja a distancia que vuelve a estar junta. Intimidad frente a rutinas separadas. |
ROM-02 | Negociación de una ruptura | Ruptura por deseos distintos sobre tener hijos. Mucha carga emocional. |
PRO-01 | Evaluación de desempeño | Un responsable da una valoración difícil a un empleado. |
PRO-02 | Conflicto laboral | Dos compañeros con estilos opuestos negocian responsabilidades. |
PRO-03 | Cambio de carrera | Un empleado anuncia a su responsable un cambio radical de carrera. |
VIT-01 | Acompañamiento en el duelo | Un amigo acompaña a alguien que acaba de perder a un ser querido. |
VIT-02 | Diagnóstico médico | Un paciente recibe un diagnóstico crónico y lo procesa con su familia. |
VIT-03 | Recuperación de una adicción | Una persona en recuperación renegocia la relación con su hermano. |
VIT-04 | Crisis de la mediana edad | Una pareja de mediana edad replantea su proyecto de vida en común. |
Formatos de salida (adaptadores)
| Adaptador | Fichero | Cuándo usarlo |
|---|---|---|
flat_jsonl | .jsonl | Uso general. Una línea = una conversación completa en JSON. |
openai_finetuning | .jsonl | Fine-tuning directo con la API de OpenAI (formato messages). |
huggingface_dataset | .jsonl | Subir a Hugging Face Hub con datasets.Dataset.from_json(). |
llamaindex_nodes | .jsonl | Pipeline RAG de LlamaIndex. Cada turno = un TextNode con metadatos. |
anthropic_hh | .jsonl | Formato Anthropic HH (helpful/harmless). |
langchain_docs | .jsonl | Documentos de LangChain. Cada turno = un Document. |
csv | .csv | Análisis en Excel o pandas. Un turno por fila. |
custom | .json | Esquema nativo de StrataSynth. La máxima información. |
Métricas de evaluación (10, todas deterministas)
Todas las métricas se calculan sin LLM, solo con numpy, scikit-learn y sentence-transformers. Así se evita la validación circular (datos generados por un LLM evaluados por otro LLM).
| Métrica | Qué mide | Rango saludable |
|---|---|---|
noise_rejection_rate | ¿El sistema gestiona los turnos con ruido deliberado? | > 0,70 |
identity_stability | ¿Los perfiles de las personas se mantienen coherentes entre turnos? | > 0,60 |
behavioral_entropy | ¿Hay variedad en los actos comunicativos? | 0,40 - 0,85 |
belief_consistency | ¿Las creencias y los actos se corresponden bien? | > 0,50 |
belief_volatility | ¿Las creencias cambian a un ritmo realista? | 0,05 - 0,30 |
fact_f1 | ¿El sistema extrae los hechos correctos? (necesita la salida del sistema) | > 0,60 |
reembedding_drift | ¿Los embeddings derivan semánticamente con los turnos? | 0,10 - 0,50 |
affinity_smoothness | ¿La afinidad evoluciona de forma suave? | > 0,60 |
cross_model_consistency | ¿Ejecuciones distintas dan resultados parecidos? | > 0,70 |
episodic_segmentation_recall | ¿El sistema segmenta bien los episodios? | > 0,60 |
Esquema PsycheGraph: paquete npm
El esquema abierto que define cómo es una persona PsycheGraph. Instálalo para tener enums e interfaces tipadas en proyectos de TypeScript o JavaScript, sin necesidad de clave de API.
npm install @stratasynth/psychegraph-schema
# or: pnpm add @stratasynth/psychegraph-schemaimport {
AttachmentStyle,
Archetype,
ConflictStyle,
NoiseType,
ArcType,
PrimaryDefense,
} from "@stratasynth/psychegraph-schema";
// Enums give you all valid values — IDE autocompletes, TypeScript validates
const filter = {
attachment: AttachmentStyle.ANXIOUS_PREOCCUPIED, // "anxious_preoccupied"
archetype: Archetype.BURNED_OUT_EXEC, // "burned_out_exec"
conflict: ConflictStyle.STONEWALLING, // "stonewalling"
};
// Filter conversations from a downloaded dataset
const relevant = conversations.filter(conv =>
conv.persona_a.attachment_style === AttachmentStyle.DISMISSIVE_AVOIDANT
);
// List all valid values at runtime
console.log(Object.values(AttachmentStyle));| Export | Tipo | Ejemplos |
|---|---|---|
AttachmentStyle | enum | secure · dismissive_avoidant · … |
Archetype | enum | working_mother · burned_out_exec · … (24 en total) |
ConflictStyle | enum | negotiating · stonewalling · … |
NoiseType | enum | social_lie · explicit_retraction · … |
ArcType | enum | escalation_partial_resolution · pure_conflict · … |
PrimaryDefense | enum | projection · denial · … |
PsycheGraph | interface | Forma completa del perfil de una persona (solo tipo de TypeScript) |
ConversationTurn | interface | Un turno con los campos de referencia (solo tipo de TypeScript) |
PsycheGraph, ConversationTurn) son solo de TypeScript: desaparecen en tiempo de ejecución y se usan con import type { PsycheGraph }. Los enums son valores de tiempo de ejecución disponibles en JS y en TS.Preguntas frecuentes
En S3 (AWS). Accedes a ellos mediante una URL prefirmada (válida 24 h) con el botón Download del dashboard, con la CLI (jobs download) o con el SDK (result.download()). Los usuarios no tienen acceso directo a S3.
Unos 5-12 minutos para 5-10 conversaciones, según la complejidad del escenario y la profundidad de las personas. Las conversaciones se ejecutan en paralelo, así que el tiempo total lo marca la más lenta, no la suma.
Sí. GET /jobs/{jobId}/preview devuelve las 2 primeras conversaciones. En el dashboard, el botón Preview está disponible cuando el trabajo está en COMPLETED.
Genera una persona con /personas/generate, guarda su personaId y úsalo como persona_a_id o persona_b_id en varios trabajos. Misma persona = misma base psicológica en todos los datasets.
Sí: el texto de los turnos está en el idioma elegido, pero las etiquetas de referencia (intent, communication_act, etc.) están siempre en inglés (etiquetas fijas del esquema).
Sí. POST /evaluate con el parámetro system_output (una clave de S3 con la salida de tu sistema). Eso habilita fact_f1, reembedding_drift, affinity_smoothness y otras métricas que comparan tu sistema con la referencia.
Casi toda no, y esta es la línea exacta. intent, goal, belief_state, belief_delta y relationship_state los calcula el Decision Engine antes de que se ejecute el LLM. communication_act lo declara el generador junto con el texto, así que trátalo como la etiqueta del propio generador y no como una independiente. Las métricas de evaluación (noise_rejection_rate, behavioral_entropy, etc.) se calculan con numpy/scikit-learn: en la evaluación no interviene ningún LLM.