惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
Blog — PlanetScale
Blog — PlanetScale
Google DeepMind News
Google DeepMind News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
F
Fortinet All Blogs
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
H
Hackread – Cybersecurity News, Data Breaches, AI and More
L
LangChain Blog
Microsoft Security Blog
Microsoft Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
Y
Y Combinator Blog
阮一峰的网络日志
阮一峰的网络日志
博客园_首页
IT之家
IT之家
V
V2EX
C
Check Point Blog
MongoDB | Blog
MongoDB | Blog
Last Week in AI
Last Week in AI
B
Blog
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
雷峰网
雷峰网

Hacker News: Show HN

PurrrrrFocus: Pomodoro Timer App - App Store Workflow Engine — Multi-Step Orchestration for Bun RapidPhoto: Pro Photo Editor App - App Store GitHub - DheerG/swarms: Achieve extraordinary results with claude code across a variety of tasks SPICE simulation → oscilloscope → verification with Claude Code — Lucas Gerads Show HN: VCoding – A 5 MB native Windows IDE with no dynamic dependencies Show HN: LLMs don't hallucinate because they're bad at math, it's the format GitHub - Agent-FM/agentfm-core: AgentFM is a peer-to-peer network that turns everyday computers into a decentralized AI supercomputer. AgentFM lets you run massive AI workloads directly across a global mesh of idle CPUs and GPUs. Show HN: Tracking Top US Science Olympiad Alumni over Last 25 Years GitHub - Potarix/agent-hub: One place to talk to all your agents Show HN: Runtime security for AI agents(injection,tool abuse, data exfiltration) GitHub - dubeyKartikay/lazyspotify: Terminal Spotify client for macOS and Linux GitHub - the-banana-tool/king-louie: Easy to use GUI Personal AI Assistant. Win/Linux/Mac. Show HN I made my vacation rental bookable by AI agents–no Airbnb, 0% commission GitHub - basteez/jsf-autoreload: maven plugin to enable hot reload on jsf projects uvm32/hosts/host-gdbstub at main · ringtailsoftware/uvm32 GitHub - labsai/EDDI: Config-driven engine that turns JSON into production-grade AI agents. Multi-agent orchestration, 12+ LLM providers, MCP/A2A protocols, RAG, persistent memory, and enterprise compliance (EU AI Act, GDPR, HIPAA). Built on Quarkus. GitHub - glitchnsec/fortyone-oss: AI Executive Assistant Platform Quickstart | Alien GitHub - muxshed/shed: One stream in, or many. Every destination, simultaneously. No cloud middleman, no per-channel fees, no limits. GitHub - ocrbase-hq/ocrbase: 📄 PDF/IMG ->.MD/JSON Document OCR API for PaddleOCR and GLMOCR. Self-hostable. GitHub - impactjo/home-memory: MCP server that lets your AI assistant remember everything about your home. GitHub - Sets88/dbcls: DbCls is a powerful terminal database client that supports various databases GitHub - neptun2000/heor-agent-mcp GitHub - SeanFDZ/macmind: Single-layer transformer in HyperTalk for the classic Macintosh RollQuation: Math Puzzles - Apps on Google Play GitHub - dropbox/witchcraft Show HN: Agent-cache – Multi-tier LLM/tool/session caching for Valkey and Redis GitHub - opentalon/opentalon: OpenTalon is an open-source platform built from the ground up in Go as a robust alternative to OpenClaw LinkedIn™ 职位抓取工具 - Chrome 应用商店
GitHub - andreisilva1/OSymandias: Multi-agent AI runtime ...
andreisilva1 · 2026-06-19 · via Hacker News: Show HN

"Look on my works, ye Mighty, and dispatch."

Multi-agent runtime for Python developers. One command to start everything.

PyPI Python License Tests Status

📖 Full documentation → DOCS.md


What is this?

OSymandias is a Python library and CLI that turns your project into a full multi-agent runtime.

pip install osymandias
osy init
osy serve

PostgreSQL, Redis, RabbitMQ, Qdrant — managed internally via Docker. Dashboard at localhost:47759. Four Celery workers ready.


Quick start

Prerequisites: Python 3.11+, Docker

pip install osymandias

# Generate OSY.compose.yml + OSY.nginx.conf + .env + sample osy_tools.py
osy init

# Start everything
osy serve

Open http://localhost:47759 — dashboard.
API directly at http://localhost:47760/api/v1.

To manage the runtime:

osy stop    # pause containers, keep data
osy down    # remove containers, keep volumes
osy delete  # remove containers + volumes (asks for confirmation)
osy --version  # print installed version

Tail events from the CLI:

osy logs                        # last 50 events across all jobs
osy logs <job-id>               # last 50 events for a specific job
osy logs <job-id> -f            # live-stream as they arrive
osy logs <job-id> -f -t TASK_PROGRESS  # filter by event type

Scale up concurrency or add worker nodes:

# More slots on this machine
osy serve --concurrency 8   # or OSY_WORKER_CONCURRENCY=8 in .env

# Additional worker nodes (point to the same broker/redis)
OSY_RABBITMQ_URL=amqp://... OSY_REDIS_URL=redis://... osy workers --queues agents,tools --concurrency 8

No Docker? Use --no-docker to connect to externally managed services instead:

# Uncomment in .env and point to your own instances:
# OSY_NO_DOCKER=1
# OSY_POSTGRES_URL=postgresql+asyncpg://user:pass@host:5432/osymandias
# OSY_REDIS_URL=redis://host:6379/0
# OSY_RABBITMQ_URL=amqp://user:pass@host:5672/
# OSY_QDRANT_URL=http://host:6333

osy serve --no-docker

Built-in tool functions (@osy.tool)

Your Python functions become agent tools with a single decorator:

from osymandias import osy

@osy.tool
def fetch_competitor_data(company: str, metrics: list[str]) -> dict:
    """Fetch competitor metrics from internal database."""
    return {"company": company, "data": [...]}

@osy.tool
def send_slack_message(channel: str, text: str) -> dict:
    """Send a message to a Slack channel."""
    return {"ok": True}

Schema inferred from type hints. osy serve scans all .py files automatically — no YAML, no config files. Tools are then assignable to agents from the dashboard (/tools).


External agents (@osy.agent)

Register any Python callable — LangChain chain, CrewAI crew, LlamaIndex query engine, or plain Python — as an OSymandias agent:

from osymandias import osy, OsyContext

@osy.agent("ResearchAgent", framework="langchain",
           description="Searches and summarises web content",
           llm_provider="ollama", llm_model="qwen2.5:7b")
def research_agent(task: str, ctx: OsyContext) -> dict:
    chain = build_langchain_chain()
    ctx.emit_event("TASK_PROGRESS", {"step": "running chain"})
    return {"summary": chain.invoke(task)}

All kwargs are optional metadata for the dashboard. The agent executes regardless of what's declared.

kwarg Purpose
framework Badge color in registry (crewai, langchain, llamaindex, smolagents, autogen)
description Shown in agent detail panel
llm_provider / llm_model Informational — displayed in dashboard
output_schema Pydantic model or JSON Schema dict
input_schema Pydantic model or JSON Schema dict
tools Tool names this agent uses (informational)

Declare which modules to scan in osymandias.toml (project root):

agent_modules = [
    "myproject.agents",
    "myproject.crews",
]

Agents in those modules are discovered and registered automatically on osy serve.


OsyContext

Every @osy.agent function optionally receives an OsyContext as its ctx parameter:

@osy.agent("OrchestratorAgent")
def orchestrate(task: str, ctx: OsyContext) -> dict:

    # shared memory — any agent in the same job can read/write
    ctx.write_memory("plan", {"step": 1, "goal": task})
    data = ctx.read_memory("previous_output")

    # live events — streamed to the dashboard event feed
    ctx.emit_event("TASK_PROGRESS", {"pct": 50, "message": "halfway"})

    # sub-tasks — spawn child tasks and wait for results
    task_ids = ctx.spawn_tasks([
        {"title": "Research", "agent_type": "ResearchAgent", "description": task},
        {"title": "Analyse",  "agent_type": "AnalystAgent",  "description": task},
    ])
    results = ctx.wait_for_tasks(task_ids)

    return {"merged": results}
Method Description
ctx.write_memory(key, value) Write to shared job memory
ctx.read_memory(key) Read from shared job memory
ctx.emit_event(type, payload) Stream event to dashboard live feed
ctx.spawn_tasks(list) Spawn sub-tasks; returns list of task IDs
ctx.wait_for_tasks(ids) Block until all sub-tasks complete; returns their outputs

Sub-tasks are visible as a tree in the job timeline dashboard.


Three ways to give agents tools

What How
Built-in web_search, read_url, http_request, write_to_job_memory, search_memory, python_eval, run_shell, read_file, write_file, send_message, spawn_agent … (20 total) Zero config — always available
@osy.tool Your Python functions Decorate + osy serve
Webhook Any HTTP endpoint Register URL in the dashboard

How it works

Job        →  A user-submitted goal ("research and write a report on X")
  └── Task ×N  →  Subtask assigned to a specific agent type
        └── AgentInstance  →  A running agent loop (LLM + tools + memory)
              ├── ToolCall  →  web_search / @osy.tool / webhook / ...
              └── Sub-task  →  ctx.spawn_tasks([...]) → child Task ×N

Jobs are decomposed into tasks by a PlannerAgent. The planner receives the full list of available agent types — builtin and every @osy.agent you registered — so natural-language jobs route to external agents automatically. Tasks execute in parallel across specialized agents. An EvaluatorAgent scores outputs and retries if confidence is below threshold.


Dashboard pages

Page Path Description
Jobs /jobs Job list with search, filter, pagination
Job detail /jobs/{id} Output, events, tasks, sub-task tree timeline
Agents /agents Agent registry — builtin and external, adaptive detail panel
Tools /tools Built-in and user tools
Memory /memory Search, filter by scope, delete entries
Events /events Live event stream with pause/resume
Metrics /metrics 7-day chart, tokens, cost, success rate

Supported LLM providers

Provider Key
OpenAI OPENAI_API_KEY
Anthropic ANTHROPIC_API_KEY
DeepSeek DEEPSEEK_API_KEY
Groq GROQ_API_KEY
Gemini GEMINI_API_KEY
Ollama (local) no key needed

Switch models per-agent from the dashboard — no restart required.


Spawning a job via API

# Natural language — PlannerAgent decomposes it automatically
curl -X POST http://localhost:47760/api/v1/jobs \
  -H "Content-Type: application/json" \
  -d '{"title":"My Job","description":"Research the EV market in Europe in 2024.","priority":"NORMAL","input_payload":{}}'

# Bypass the planner with an explicit task plan
curl -X POST http://localhost:47760/api/v1/jobs \
  -H "Content-Type: application/json" \
  -d '{"title":"My Job","description":"...","priority":"NORMAL","input_payload":{"__task_plan__":[{"title":"Research","agent_type":"ResearchAgent","description":"EV market in Europe"}]}}'

# Resubmit a completed or failed job (copies input, creates a new job)
curl -X POST http://localhost:47760/api/v1/jobs/<job-id>/resubmit

Full API reference: http://localhost:47760/api/v1/docs


Repo structure

OSymandias/
├── sdk/                  Python package — osymandias + osy CLI
│   └── osymandias/
│       ├── cli/          osy init / serve / stop / down / delete / logs / workers
│       ├── runtime/      FastAPI + Celery + agents
│       ├── decorator.py  @osy.tool + @osy.agent
│       ├── context.py    OsyContext (memory, events, sub-tasks)
│       ├── discovery.py  @osy.tool scanner
│       ├── tool_server.py  local HTTP tool server
│       ├── assets.py     GitHub asset fetcher + cache
│       └── process.py    subprocess manager
├── frontend/             Next.js 14 dashboard (built by CI, bundled into wheel)
├── backend/              Legacy standalone backend (kept for reference)
└── .github/workflows/
    └── release.yml       Tag push → build → GitHub Release + PyPI

Contributing

git clone https://github.com/andreisilva1/OSymandias
cd OSymandias

# Install the sdk in editable mode
pip install -e ./sdk

# Scaffold config files
osy init

# Start infra + API (the local frontend/out build is picked up automatically)
osy serve

# For live frontend development (separate terminal)
cd frontend
npm install
npm run dev   # http://localhost:3000 — hot reload

Built with FastAPI · Next.js · Celery · PostgreSQL · Redis · RabbitMQ · Qdrant · LiteLLM