Skip to content

Releases: syrin-labs/syrin-harness

v0.12.0 - Looping Sandbox

Choose a tag to compare

@divshekhar divshekhar released this 04 May 15:56

[0.12.0] - 2026-05-04

Added

  • syrin.Resource — per-agent resource limits: Resource(timeout, warn_at, max_steps, max_tools, max_context, on_exceed, thresholds). ResourceThreshold callbacks fire after every LLM iteration. DegradePolicy(tool_to_disable) removes the named tool when max_tools is hit in DEGRADE mode. New enums: OnExceed, ResourceDimension, DegradeReason, RestoreWhen. New hooks: RESOURCE_THRESHOLD, RESOURCE_EXCEEDED, RESOURCE_DEGRADED, RESOURCE_RESTORED. New exceptions: ResourceExceededError, ResourceTimeoutError, ResourceStepError, ResourceToolError, ResourceContextError.
  • syrin.ResourcePool — swarm-level rate and concurrency pool alongside BudgetPool. Overflow StrEnum: QUEUE, REJECT, BACKPRESSURE (AIMD). pool= on Swarm. New hooks: POOL_RATE_LOW, POOL_REBALANCED, POOL_REJECTED.
  • syrin.Sandbox — isolated code execution. ProcessSandbox default (zero deps, 5–50 ms overhead). SandboxBackendType: PROCESS, DOCKER, E2B, NSJAIL. sandbox= on CodeActionLoop. New hooks: SANDBOX_EXEC_*. New exceptions: SandboxError, SandboxTimeoutError, SandboxMemoryError.
    • Sandbox.exec_bash() — run shell scripts via bash (or sh fallback) in a fresh isolated subprocess. Enable with bash=True. SANDBOX_WORKSPACE env var injected so scripts can locate the workspace directory.
    • Sandbox.packages= — packages listed at construction are auto-installed before the first exec_python call. Thread-safe double-checked locking ensures exactly-once installation.
    • Sandbox.cleanup() — explicit workspace teardown. Safe to call multiple times; only removes auto-created workspaces.
    • Sandbox async context managerasync with Sandbox(...) as sb: calls cleanup() on exit.
    • Sandbox._emit_fn — lifecycle hooks (SANDBOX_EXEC_START/END, SANDBOX_TIMEOUT, SANDBOX_SESSION_CREATED/DESTROYED) fire automatically when the sandbox is wired into an agent loop.
  • syrin.RLMLoop — recursive multi-agent decomposition with depth tracking, allowed_agents whitelist, and budget propagation. Hard ceiling of 6. New exception: RLMDepthError.
    • Hook.RLM_BUDGET_SPLIT — emitted after compute_child_budget(). Fields: split, parent_budget, child_budget, agent.
    • Sandbox propagationsandbox= on the orchestrator is deep-copied into every child's loop via copy.copy(child_loop), so children get an isolated loop reference without mutating the class-level loop.
  • HITL session persistenceSQLiteApprovalSession, ApprovalSessionProtocol, ApprovalState, HITLTimeout. HumanInTheLoop gains session= and on_timeout=. New hooks: HITL_REQUESTED, HITL_TIMEOUT.
  • CircuitBreaker.check_and_record() — atomic check-and-record eliminating TOCTOU race.
  • tests/contract/ — new contract test suite verifying config → behavior for injection strategy, compaction budget, consolidation budget, guardrail mode, and age-based compression.

Fixed

  • Memory(injection_strategy=...) now controls injection order; previously all strategies were silently ignored
  • Summarizer.summarize() now goes through budget preflight and cost-recording; previously invisible to the budget system
  • Memory(consolidation_budget=...) now enforced; raises BudgetExceededError when ceiling reached
  • consolidation_compress_after="Nd" now implemented; entries older than threshold are compressed
  • GuardrailMode.SYSTEM_PROMPT now enforced; previously fell through to PRE_CALL behavior
  • Summarizer(compaction_model=None) falls back to the agent's own model
  • Hook.MEMORY_CONSOLIDATE now emitted at start and end of MemoryStore.consolidate()
  • TOCTOU temp-file races in PDF extraction, Deepgram TTS, and Google Drive loader
  • Silent exception swallowing in FilesystemCheckpointBackend.list() and hook emission paths
  • print() in library startup code replaced with structured logging
  • Unimplemented config fields now emit UserWarning instead of silently doing nothing: auto_sync, map_update_every_turns, auto_extract, consolidation_resolve_contradictions

Changed

  • HumanInTheLoop gains session and on_timeout parameters
  • Swarm gains pool: ResourcePool | None parameter
  • CodeActionLoop gains sandbox: Sandbox | None parameter
  • DegradePolicy fields: tool_to_disable, restore_when, include_resource_status only — fallback_model and compaction_method removed (were never enforced)
  • Memory.recall() accepts limit= only — count= and top_k= aliases removed
  • CostStats.avg_cost removed — use mean
  • SandboxBackend alias removed — use SandboxBackendType
  • @tool(depends_on=[...]) requires ToolSpec objects — string names no longer accepted

v0.11.0 - Multi-Agent Swarms

Choose a tag to compare

@divshekhar divshekhar released this 06 Apr 09:54

[0.11.0] - 2026-04-06

First-class multi-agent orchestration with shared budget control, cross-agent memory, agent-to-agent communication, and enterprise security hardening.

Added

Multi-Agent Swarm System

  • Swarm with 5 topologies: ORCHESTRATOR, PARALLEL, CONSENSUS, REFLECTION, WORKFLOW
  • Shared BudgetPool — hard per-agent caps enforced; no agent can exceed its allocation even if pool has funds
  • MemoryBus — selective cross-agent memory sharing with type filters and custom backends
  • A2ARouter — typed agent-to-agent messaging (direct, broadcast, topic pub/sub) with ack support and audit log
  • SwarmController.topup_budget() / reallocate_budget() — runtime budget reallocation without restarting agents; backed by asyncio.Lock
  • BroadcastBus — pub/sub with wildcard topic patterns ("research.*")
  • MonitorLoop — async supervisor loop: heartbeat polling, quality assessment, bounded interventions with MaxInterventionsExceeded escalation
  • SwarmAuthorityGuard — role-based permission model (ORCHESTRATOR > SUPERVISOR > WORKER); every control action permission-checked and audit-logged
  • AgentRouter — LLM-driven agent selection from a pool (replaces removed DynamicPipeline)
  • Workflow — sequential, parallel, branch, and dynamic fan-out steps with HandoffContext; full play()/pause()/resume()/cancel() lifecycle
  • SwarmResult — unified result: content, cost_breakdown, agent_results, partial_results, budget_report

Budget Intelligence

  • Pre-flight estimation: Budget.estimate() with EstimationPolicy
  • Budget forecasting from run history with Hook.BUDGET_FORECAST
  • Anomaly detection: Budget(anomaly_detection=True) triggers Hook.BUDGET_ANOMALY on p95 breach
  • Cross-run daily/weekly limits with Hook.DAILY_LIMIT_APPROACHING
  • FileBudgetStore for persistent cross-run history

Workflow & Swarm Visualization

  • Workflow.visualize() — Rich ASCII tree
  • Workflow.to_mermaid() — Mermaid graph TD for GitHub/docs
  • Workflow.run(show_graph=True) — live Rich overlay with per-step status and cost
  • GET /graph HTTP endpoint on Swarm.serve() and Workflow.serve()

AgentRegistry

  • AgentRegistry with @registry.register(tags=[...]) — discover and control agents by name or capability tag

Security Hardening

  • PIIGuardrail — detect and redact PII (email, phone, SSN, credit card) in inputs, outputs, and memory writes
  • ToolOutputValidator — schema validation on tool results before the LLM sees them
  • AgentIdentity — Ed25519 cryptographic identity; every A2A message signed and verified
  • Decision provenance: DECISION_MADE hook with DecisionRecord (model, timestamp, hash) for audit trails

Remote Config Control Plane

  • RemoteConfig — live push of any agent field without restart; schema export for dashboard rendering
  • Config versioning and rollback(), per-field allow/deny lists, RemoteConfigValidator
  • Remote lifecycle commands: PAUSE, RESUME, KILL over the wire

Multi-Agent Pry Debugger (TUI)

  • SwarmPryTUI — Rich Live compositor: GraphPanel (per-agent status + cost), BudgetPanel (pool tree), MessagePanel (A2A/MemoryBus timeline), SwarmNav (keyboard navigation)

Changed

  • rich>=13.0 promoted to core dependency
  • requests>=2.33.0 minimum enforced (CVE-2026-25645)
  • ExceedPolicy is now the canonical budget policy enum; on_exceeded= callback pattern deprecated
  • MockResponseMode enum replaces raw strings "lorem"/"custom" in Model.mock()
  • Class-based agent definition is now the canonical pattern in all docs and examples

Fixed

  • @structured decorator now applies @dataclass internally — no manual decoration needed
  • _has_default() helper: fixed broken is not type(None) comparison
  • Swarm context injection: _AgentMeta metaclass compatibility fixed via plain setattr fallback
  • @tool without a description now emits UserWarning at decoration time

Removed

  • DynamicPipeline — removed; use AgentRouter. Importing raises ImportError with migration message.
  • AgentTeam — removed; use Swarm(topology=SwarmTopology.ORCHESTRATOR). Importing raises ImportError.

v0.10.0 - Debug Watch Triggers

Choose a tag to compare

@divshekhar divshekhar released this 30 Mar 19:46

[0.10.0] - 2026-03-31

Added

Syrin Debug — Live Terminal Debugging

  • Rich-based live terminal UI activated via debug=True
  • Color-coded events: LLM (blue), tools (yellow), errors (red), memory (purple), guardrails (red)
  • Multi-agent aware — nested panels for spawned agents
  • Keyboard filtering: e errors, t tools, m memory, f full trace, q quit, p pause

Event-Driven Triggers (agent.watch())

  • Watchable mixin with swappable protocols
  • CronProtocol — cron-scheduled triggers using croniter
  • WebhookProtocol — HTTP webhook trigger with HMAC signature validation
  • QueueProtocol — message queue trigger with pluggable backend (Redis, in-memory)
  • Agents that react to the world, not just API calls

Production Knowledge Pool

  • GitHubSource — ingest entire GitHub repos (public and private)
  • DocsSource — crawl documentation sites with depth limits and pattern matching
  • Multi-language code chunking (Python, Go, Rust, TypeScript, Java, etc.)
  • Progress events: KNOWLEDGE_CHUNK_START, KNOWLEDGE_CHUNK_PROGRESS, KNOWLEDGE_EMBED_PROGRESS, KNOWLEDGE_CHUNK_END
  • Semantic chunking strategy for better retrieval
  • Rate limiting for embedding APIs

Prompt Injection Defense

  • InputNormalization — normalize inputs through defense pipeline
  • SpotlightDefense — clearly label untrusted content
  • CanaryTokens — hidden tokens that trigger alerts
  • Secure memory writes — scan before storing

Structured Output Enforcement

  • result.output always returns the typed object (never dict/str)
  • Automatic retry on validation failure (configurable validation_retries)
  • Validation hooks: Hook.OUTPUT_VALIDATION_RETRY, Hook.OUTPUT_VALIDATION_ERROR
  • Clear error messages with raw response and validation details

Runtime Model Switching

  • agent.switch_model() — switch model at runtime without recreating agent
  • Context, memory, and hooks remain intact

Syrin v0.9.0 - Smart Budget

Choose a tag to compare

@divshekhar divshekhar released this 25 Mar 12:45

[0.9.0] - 2026-03-25

Breaking

  • Budget(run=) renamed to Budget(max_cost=)
  • agent.response() renamed to agent.run() — old method removed
  • per= in rate limits replaced by RateLimit(hour=, day=, month=)

Added

  • ExceedPolicy enumSTOP | WARN | IGNORE | SWITCH replaces string policies
  • result.cost_estimated — pre-call budget estimate alongside result.cost
  • result.cache_savings — cache discount reported per call
  • agent.budget_summary() — dashboard dict: run cost, tokens, hourly/daily totals, percent used
  • agent.export_costs(format="json") — structured cost history per call
  • BudgetStore ABC — plug in any persistence backend (PostgreSQL, Redis, DynamoDB)
  • Budget(shared=True) — thread-safe shared pool across parallel agents (SQLite WAL)
  • ModelPricing override — pass pricing=ModelPricing(...) to any Model() to override built-in rates
  • Docs — full rewrite with correct APIs, custom observability guide, 375+ fixed internal links

Fixed

  • SQLite budget store thread safety under parallel spawns
  • Threshold callbacks no longer re-fire on the same percentage within a run
  • PIIScanner redaction applied before content reaches the LLM
  • Memory.import_from() logging noise removed

v0.8.1 - Grounded Intelligence

Choose a tag to compare

@divshekhar divshekhar released this 13 Mar 10:16

[0.8.1] - 2026-03-13

Added

  • Batch fact verification — Ground facts in batches of 10 for efficiency
  • GroundingConfig.model — Dedicated model for grounding/verification
  • YAML frontmatterTemplate.from_file() parses YAML frontmatter

Changed

  • PDF extraction — Consolidated to single docling dependency
  • Grounding — Improved claim-to-fact matching with index-based pairing

Fixed

  • IPO DRHP example — Working example with Budget, FactVerificationGuardrail
  • Test mocks — Fixed output validation failure tests

v0.8.0 - Knowledge Pool

Choose a tag to compare

@divshekhar divshekhar released this 11 Mar 11:43

[0.8.0] - 2026-03-11

Added

  • Intelligent model routing: Automatic LLM selection based on cost, performance, and context requirements.
  • Multi-modality support: Native support for images, video, and audio generation/processing.
  • Knowledge integration: RAG (Retrieval-Augmented Generation) with vector stores, document loaders, and semantic search.

Changed

  • Simplified installation: pip install syrin now includes OpenAI and serving dependencies by default.
  • Removed CLI: syrin trace, syrin run, and syrin doctor commands removed; use python my_agent.py --trace for observability.

Breaking

  • CLI removal: Command-line interface deprecated; use direct Python execution with --trace flag.

v0.7.0 - Context Management

Choose a tag to compare

@divshekhar divshekhar released this 07 Mar 16:09

[0.7.0] - 2026-03-07

Breaking

  • Context: Context.budget removed. Use Context.token_limits (TokenLimits). ContextWindowBudgetContextWindowCapacity. Context.get_budget(model)Context.get_capacity(model). ContextManager.prepare() takes capacity instead of budget.

Added

  • Context management — Snapshot (provenance, why_included, context_rot_risk), breakdown, custom compaction prompt, auto_compact_at, runtime injection, context_mode (full/focused), formation_mode (push/pull), stored output chunks, persistent context map, pluggable RelevanceScorer.
  • Memory–context — Memory on by default; memory=None turns off. No extra field.
  • Handoff/spawn — Context visibility in events (handoff_context, context_inherited, initial_context_tokens).

Fixed

  • Examples: Output(type=...)Output(MyModel); Agent(dependencies=...)Agent(config=AgentConfig(dependencies=...)).

v0.6.0 — CC

Choose a tag to compare

@divshekhar divshekhar released this 05 Mar 20:05

[0.6.0] - 2026-03-05

Added

  • Remote configsyrin.init(api_key=...) or SYRIN_API_KEY enables real-time config overrides from Syrin Cloud or self-hosted backend. Overrides (budget, memory, temperature, etc.) via SSE; zero overhead when not enabled.
  • Config routesGET /config, PATCH /config, GET /config/stream added to agent.serve(). Baseline + overrides + revert; works with or without syrin.init().
  • syrin.remote — Types: AgentSchema, ConfigOverride, OverridePayload, SyncRequest/SyncResponse. ConfigRegistry, ConfigResolver, extract_schema(). Transports: SSETransport, ServeTransport, PollingTransport.
  • HooksHook.REMOTE_CONFIG_UPDATE, Hook.REMOTE_CONFIG_ERROR.

Changed

  • Agent registers with remote config on init when syrin.init() was called.

v0.5.0 - Remember Smarter

Choose a tag to compare

@divshekhar divshekhar released this 04 Mar 04:53

[0.5.0] - 2026-03-04

Added

  • C5 fix — Memory.remember/recall/forget use configured backend (SQLite, Qdrant, Chroma) instead of in-memory dict when backend != MEMORY.
  • QdrantConfigMemory(qdrant=QdrantConfig(url=..., api_key=..., collection=..., namespace=...)) for Qdrant Cloud or local.
  • ChromaConfigMemory(chroma=ChromaConfig(path=..., collection=...)) for Chroma vector backend.
  • Namespace isolationQdrantConfig.namespace scopes all operations; payload filter on search/list.
  • WriteModeWriteMode.SYNC (block until complete) vs WriteMode.ASYNC (fire-and-forget, default).
  • Memory export/importMemory.export() returns MemorySnapshot; Memory.import_from(snapshot) appends memories. JSON-serializable for GDPR export.
  • Examplesexamples/04_memory/qdrant_memory.py, chroma_memory.py, async_memory.py, export_import_memory.py.

Changed

  • Agent and Memory handoff now use memory._backend_kwargs() for backend config.
  • syrin[qdrant] and syrin[chroma] optional dependencies added to pyproject.toml.

v0.4.1

Choose a tag to compare

@divshekhar divshekhar released this 01 Mar 18:26

[0.4.1] - 2026-03-01

Added

  • API additions: Response.raw_response, GuardrailCheckResult.guardrail_name, CircuitBreaker.state, EventBus.on, GlobalConfig.debug, TokenLimits.per_hour, RateLimit.window, agent.checkpointer.

Fixed

  • Model fallback and response transformer now use model.acomplete() when model has fallbacks/transformers.
  • Model.with_middleware() preserves provider.
  • Provider availability checks use importlib.util.find_spec() instead of import.

Changed

  • Strict typing: TypedDict + Unpack for memory kwargs, ServeConfig, agent specs. Pyright config added.
  • Replaced Any with object / TypedDict across core modules.
  • Docs: docs/TYPING.md for typing standards; updated API references.