Synsema docsENES

Multi-agente

Los agentes corren concurrentemente en threads reales, cada uno en su propio intérprete aislado. Se coordinan por un blackboard compartido y señales — no por llamadas directas. (Esta es la capa de concurrencia; para un modelo que elige tools, ver Tool calling.)

agents.syn
-- Doc example: the blackboard (share / observe) — thread-safe shared state.
-- spawn / signal / wait_for run real threads (non-deterministic), shown in the prose.
intent: "doc example: blackboard"

share 42 as "demo_key"
observe "demo_key" as demo_v
print("blackboard: demo_key → " + text(demo_v))

test "the blackboard is shared, synchronous state (share publishes, observe reads)"
    share 42 as "answer"
    observe "answer" as a
    assert_eq(a, 42)
    share "hi" as "result_1"
    observe "result_1" as g
    assert_eq(g, "hi")

Definir y spawnear

Definir un agente lo registra; el cuerpo corre solo al spawnearlo (en un thread nuevo). El padre sigue de inmediato.

agent Researcher
    require net("*.wikipedia.org")
    let data be fetch("https://en.wikipedia.org/api/...")
    share data as "research"
    signal "done"

spawn Researcher with query = "AI safety"

Las tasks/valores top-level se snapshotean (una copia) dentro del agente. Un agente que falla queda contenido (estado ERROR); synsema run espera a los agentes antes de salir y sale con código ≠0 si alguno terminó en ERROR.

Blackboard — share / observe

share value as "key" publica; observe "key" as var lee. Thread-safe y versionado; la key es una expresión ("result_" + text(id)).

Señales — signal / wait_for

signal "done"                       -- emitir (una cola consumible, no un latch)
signal "done" with data             -- emitir con payload
wait_for "done" as result           -- bloquea hasta que llega una señal (default 30s), la CONSUME
wait_for "done" timeout 2 as r      -- acotar la espera; devuelve nothing al timeout

Acotá wait_for con timeout dentro de un handler de ruta para que un request no se cuelgue. El canal es una expresión — usá "cancel:" + text(job_id) para un canal push por job.

Inspeccionar una corrida

synsema conform --swarm program.syn    -- dump JSON: blackboard + estados por agente