Documentación de StrataSynth

Todo lo que necesitas para generar, evaluar e integrar datasets de conversación sintética.

API:https://api.stratasynth.com·Dashboard:app.stratasynth.com

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.

1Autentícate: cambia tu clave de API por un JWT (válido 24 h)
2Crea un trabajo de generación
3Consulta el estado hasta que sea COMPLETED
4Previsualiza el dataset (sin descargarlo)
5Usa los datos
Paso 1: autenticarse
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..."
Paso 2: crear un trabajo
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"
Paso 3: consultar el estado
curl -H "Authorization: Bearer $TOKEN" \
  https://api.stratasynth.com/jobs/$JOB_ID

# Repeat every 10s until status = "COMPLETED"
# { "data": { "status": "COMPLETED", "download_url": "https://..." } }
Paso 4: previsualizar (las 2 primeras conversaciones, sin descarga)
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
Paso 5: descargar el dataset completo
# 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": {...} }
Tiempos habituales: 5 conversaciones ≈ 2-4 min · 100 conversaciones ≈ 8-12 min · El arranque en frío (primera llamada del día) añade unos 90 s.

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)
Por qué importa

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".

PsycheGraph
Identidad: arquetipo, estilo de apego, rasgos, sesgos cognitivos, huella de voz, línea de vida
↓
Trait Effects
Las dimensiones de personalidad se traducen en probabilidades de comportamiento para este turno
↓
Belief Engine
12 creencias dinámicas × (valor + confianza). Las creencias con mucha confianza se resisten a cambiar (resistencia cognitiva).
↓
Decision Engine
Calcula intent, goal y el acto comunicativo al que apuntar, sin intervención de un LLM. Determinista y reproducible.
↓
LLM render
El LLM recibe la decisión como contexto, escribe el texto y declara el acto comunicativo que ha usado. Ese acto declarado es el que el dataset exporta como communication_act.
↓
Relationship update
trust, tension, connection y dominance_balance se actualizan según el acto comunicativo
↓
Belief update
Las creencias cambian según lo que ocurrió en el turno. La resistencia reduce el cambio en las creencias arraigadas.
↓
Ground truth labeling
Los hechos, los episodios y la afinidad se etiquetan sin LLM, con numpy / scikit-learn / sentence-transformers.
Qué significa aquí la reproducibilidad

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.

Un turno: ejemplo completo
{
  "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"]
}
Qué significa cada campo
CampoTipoDescripción
textstringTexto del turno generado por el LLM
speakerA | BQué persona está hablando
intentstringIntención cognitiva: deflect, reveal, confront, comfort, manipulate…
goalstringLo que quiere el hablante: protect_self, seek_validation, repair_bond…
communication_actstringActo pragmático tal como lo declara el generador junto con el texto: accusation, disclosure, sarcasm, minimization… (10 tipos)
emotional_stateobjectEmoción del turno: tension, connection, vulnerability (0-1)
relationship_stateobjectEstado relacional en 4 dimensiones: trust, tension, connection, dominance_balance
belief_stateobject12 creencias × {value, confidence}: el modelo interno del mundo del hablante
belief_deltaobjectCambio en cada creencia causado por este turno
noise_flagsarrayRuido deliberado introducido: social_lie, exaggeration_emotional, retraction…
Nota sobre la referencia: 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.
Metadatos de la conversación
{
  "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.

Evaluar un chatbot de atención al cliente

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.

evaluaciónpruebas de estrésatención al cliente
Ajustar un modelo que entienda la intención

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.

fine-tuningdetección de intenciónNLU
Entrenar la detección de engaños

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.

NLPclasificaciónruido
Crear una biblioteca de usuarios sintéticos

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.

personasreutilizacióncoherencia
Comparar sistemas de diálogo en escenarios complejos

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.

benchmarksreproducibilidadreferencia
Investigar la dinámica de creencias y la teoría de la mente

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.

investigaciónseguimiento de creenciasToM

Para quién es

TipoAccesoCuándo usarlo
Dashboardapp.stratasynth.comSin pipeline. Solo necesitas el fichero.
CLIterminal stratasynthAutomatizas, programas scripts o necesitas vigilar trabajos.
Python SDKpip stratasynth-clientLo integras con pipelines de ML, HF o pandas.
APIHTTP + clave de APITu propio backend, cualquier lenguaje, control total.
PsycheGraph SchemaJSON / paquete npmTrabajas 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.

Flujo básico
LoginGenerateConfigure paramsGenerate DatasetJobs → clic en el trabajoEsperar a COMPLETEDDownload Dataset
Los parámetros, explicados
ParámetroControlaRecomendación
scenarioTipo de relación y de conflictoFAM-01 familia, ROM-01 pareja, PRO-01 trabajo, VIT-01 crisis vital
countNúmero de conversaciones5-10 para probar, 100-500 para fine-tuning
complexityRiqueza del perfil psicológico3 es equilibrado. 5 = muy rico, más lento. 1 = básico, rápido
languageIdioma del texto generadoen, es, de, fr
adapterFormato del fichero de salidaflat_jsonl general, openai_finetuning para OpenAI, huggingface_dataset para HF
noise% de ruido deliberado (mentiras, retractaciones)0,1-0,2 es realista
seedReproducibilidad exactaMisma 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_abc123

SDK 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
Endpoints disponibles
MétodoEndpointDescripción
POST/auth/tokenClave de API → JWT (24 h)
GET/scenariosLista los 12 escenarios
POST/jobs/datasetCrea un trabajo de generación (asíncrono)
GET/jobs/{jobId}Estado del trabajo + progreso + download_url
GET/jobsLista los trabajos (paginación por cursor)
GET/jobs/{jobId}/previewLas 2 primeras conversaciones sin descarga completa
POST/personas/generateGenera un perfil PsycheGraph (asíncrono)
GET/personas/{personaId}Recupera un perfil en caché (TTL de 7 días)
POST/evaluateLanza 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.

01
Entrenar un modelo de diálogo

Genera un dataset → explora los campos de intención y creencias → exporta a fine-tuning de OpenAI o a Hugging Face Hub.

Descargar .ipynb
02
Evaluar agentes conversacionales

Calcula las 10 métricas deterministas. Visualiza belief_consistency, identity_stability y behavioral_entropy.

Descargar .ipynb
03
Crear usuarios sintéticos

Genera un cliente enfadado, un usuario confundido y un negociador manipulador. Reutiliza los ID de persona entre escenarios.

Descargar .ipynb
04
Identidad bajo presión (A/B auditable)

Pon 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 .ipynb
Requisitos: pip install requests pandas matplotlib datasets transformers

Escenarios (12 disponibles)

IDNombreDescripción
FAM-01Cuidadora familiarHija adulta que cuida a su padre con demencia. Deuda emocional, agotamiento, culpa.
FAM-02Conflicto por una herenciaHermanos que negocian la herencia tras la muerte del padre. Dinero frente a lealtad.
FAM-03Intento de distanciamientoUn hijo adulto intenta poner límites a una madre controladora.
ROM-01Reencuentro a distanciaPareja a distancia que vuelve a estar junta. Intimidad frente a rutinas separadas.
ROM-02Negociación de una rupturaRuptura por deseos distintos sobre tener hijos. Mucha carga emocional.
PRO-01Evaluación de desempeñoUn responsable da una valoración difícil a un empleado.
PRO-02Conflicto laboralDos compañeros con estilos opuestos negocian responsabilidades.
PRO-03Cambio de carreraUn empleado anuncia a su responsable un cambio radical de carrera.
VIT-01Acompañamiento en el dueloUn amigo acompaña a alguien que acaba de perder a un ser querido.
VIT-02Diagnóstico médicoUn paciente recibe un diagnóstico crónico y lo procesa con su familia.
VIT-03Recuperación de una adicciónUna persona en recuperación renegocia la relación con su hermano.
VIT-04Crisis de la mediana edadUna pareja de mediana edad replantea su proyecto de vida en común.

Formatos de salida (adaptadores)

AdaptadorFicheroCuándo usarlo
flat_jsonl.jsonlUso general. Una línea = una conversación completa en JSON.
openai_finetuning.jsonlFine-tuning directo con la API de OpenAI (formato messages).
huggingface_dataset.jsonlSubir a Hugging Face Hub con datasets.Dataset.from_json().
llamaindex_nodes.jsonlPipeline RAG de LlamaIndex. Cada turno = un TextNode con metadatos.
anthropic_hh.jsonlFormato Anthropic HH (helpful/harmless).
langchain_docs.jsonlDocumentos de LangChain. Cada turno = un Document.
csv.csvAnálisis en Excel o pandas. Un turno por fila.
custom.jsonEsquema 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étricaQué mideRango 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-schema
Usa los enums para trabajar con los datos de StrataSynth
import {
  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));
ExportTipoEjemplos
AttachmentStyleenumsecure · dismissive_avoidant · …
Archetypeenumworking_mother · burned_out_exec · … (24 en total)
ConflictStyleenumnegotiating · stonewalling · …
NoiseTypeenumsocial_lie · explicit_retraction · …
ArcTypeenumescalation_partial_resolution · pure_conflict · …
PrimaryDefenseenumprojection · denial · …
PsycheGraphinterfaceForma completa del perfil de una persona (solo tipo de TypeScript)
ConversationTurninterfaceUn turno con los campos de referencia (solo tipo de TypeScript)
Nota: Las interfaces (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.
El esquema es abierto. El motor, no. Estos tipos describen cómo es una persona de StrataSynth: la taxonomía es un estándar abierto sobre el que puedes construir. Cómo se comporta una persona (la dinámica de actualización de creencias, el motor de decisión determinista que fija la intención, el objetivo y el acto comunicativo al que apunta cada turno antes de generar ningún texto, la calibración psicométrica y el condicionamiento cultural) es propietario y se ejecuta exclusivamente en el servidor. Reproducir la taxonomía en un prompt no reproduce el comportamiento: el Notebook 04 lo demuestra de forma auditable.

Preguntas frecuentes

¿Dónde están mis ficheros generados?

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.

¿Cuánto tarda un trabajo?

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.

¿Puedo previsualizar el dataset antes de descargarlo entero?

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.

¿Cómo garantizo la coherencia entre datasets?

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.

¿El idioma afecta solo al texto?

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).

¿Puedo evaluar mi propio sistema?

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.

¿La referencia la genera un LLM?

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.