{"id":51355774,"url":"https://github.com/smooai/smooth-operator","last_synced_at":"2026-07-02T20:00:41.043Z","repository":{"id":363131746,"uuid":"1262070752","full_name":"SmooAI/smooth-operator","owner":"SmooAI","description":"Polyglot AI agent service — knowledge chat, tools, durable checkpoints, human-in-the-loop, and multi-participant conversations over one schema-driven WebSocket protocol. Built on the smooth-operator-core engine (5-language parity). Deploy to Kubernetes, AWS serverless, or run locally. Hosted at lom.smoo.ai.","archived":false,"fork":false,"pushed_at":"2026-06-29T00:14:26.000Z","size":3346,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-29T02:10:01.628Z","etag":null,"topics":["agent-framework","agent-service","ai-agent","knowledge-base","kubernetes","langgraph","llm","polyglot","rag","rust","serverless","sst","websocket"],"latest_commit_sha":null,"homepage":"https://lom.smoo.ai","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SmooAI.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-07T14:33:44.000Z","updated_at":"2026-06-26T19:47:37.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/SmooAI/smooth-operator","commit_stats":null,"previous_names":["smooai/smooth-agent","smooai/smooth-operator"],"tags_count":38,"template":false,"template_full_name":null,"purl":"pkg:github/SmooAI/smooth-operator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SmooAI%2Fsmooth-operator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SmooAI%2Fsmooth-operator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SmooAI%2Fsmooth-operator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SmooAI%2Fsmooth-operator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SmooAI","download_url":"https://codeload.github.com/SmooAI/smooth-operator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SmooAI%2Fsmooth-operator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35060913,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-02T02:00:06.368Z","response_time":173,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent-framework","agent-service","ai-agent","knowledge-base","kubernetes","langgraph","llm","polyglot","rag","rust","serverless","sst","websocket"],"created_at":"2026-07-02T20:00:23.884Z","updated_at":"2026-07-02T20:00:41.037Z","avatar_url":"https://github.com/SmooAI.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://smoo.ai\"\u003e\u003cimg src=\".github/banner.png\" alt=\"smooth-operator — Polyglot AI agent service. One protocol.\" width=\"100%\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://smoo.ai\"\u003e\u003cimg src=\"https://img.shields.io/badge/Smoo_AI-platform-00A6A6?style=for-the-badge\u0026labelColor=020618\" alt=\"Smoo AI\"\u003e\u003c/a\u003e\n  \u003ca href=\"./LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-F49F0A?style=for-the-badge\u0026labelColor=020618\" alt=\"license\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://lom.smoo.ai\"\u003e\u003cimg src=\"https://img.shields.io/badge/hosted-lom.smoo.ai-FF6B6C?style=for-the-badge\u0026labelColor=020618\" alt=\"lom.smoo.ai\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/tests-passing-00A6A6?style=flat-square\" alt=\"tests passing\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Kubernetes_·_serverless_·_local-FF6B6C?style=flat-square\" alt=\"Kubernetes · serverless · local\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/5_languages_·_one_protocol-F49F0A?style=flat-square\" alt=\"5 languages · one protocol\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#what-is-this\"\u003e\u003cb\u003eWhat it is\u003c/b\u003e\u003c/a\u003e \u0026nbsp;·\u0026nbsp; \u003ca href=\"#30-second-quickstart\"\u003e\u003cb\u003eQuickstart\u003c/b\u003e\u003c/a\u003e \u0026nbsp;·\u0026nbsp; \u003ca href=\"#deployment-flavors\"\u003e\u003cb\u003eDeploy flavors\u003c/b\u003e\u003c/a\u003e \u0026nbsp;·\u0026nbsp; \u003ca href=\"#architecture\"\u003e\u003cb\u003eArchitecture\u003c/b\u003e\u003c/a\u003e \u0026nbsp;·\u0026nbsp; \u003ca href=\"#-part-of-smoo-ai\"\u003e\u003cb\u003ePlatform\u003c/b\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n\u003e **smooth-operator** gives you hybrid retrieval (dense + sparse + rerank), durable agent checkpoints, human-in-the-loop approvals, and multi-participant conversations — one operator binary that runs the same way on **Kubernetes**, **AWS serverless**, or a **single laptop process**. Built in the open, test-first.\n\n---\n\n## What is this?\n\n**smooth-operator** is a **polyglot AI agent service**. The agent orchestration is done by [`smooth-operator-core`](https://github.com/SmooAI/smooth-operator-core) — a 5-language parity engine; the **service** wraps it with conversations, knowledge ingestion + retrieval, a tool catalog, and **one schema-driven WebSocket protocol** that clients in five languages speak natively.\n\nYou get hybrid retrieval (dense + sparse + rerank), durable agent checkpoints, human-in-the-loop approvals, and multi-participant conversations (`user` · `ai-agent` · `human-agent`) — behind a stable wire protocol, with **storage, backplane, and auth selected by config**, not by a code fork.\n\nOne operator binary, **three deployment flavors** (see [below](#deployment-flavors)):\n\n- **Kubernetes** — the primary self-host target: a long-running service with Postgres + pgvector and a Redis/NATS backplane for multi-replica scale-out.\n- **AWS serverless** — API Gateway WebSocket + Lambda + DynamoDB + S3 Vectors, deployed with SST.\n- **Local** — a single in-memory process with auth off and zero external services, for laptop dev or to embed in-process.\n\nThe same binary picks its flavor from the environment (`SMOOTH_AGENT_STORAGE` · `SMOOTH_AGENT_BACKPLANE` · `AUTH_MODE`). No build flags, no second codebase.\n\n\u003e **Built in the open, test-first.** See [`docs/Planning/Roadmap.md`](docs/Planning/Roadmap.md) for what works today and what's queued.\n\n---\n\n## 30-second quickstart\n\nRun the reference server **locally** — fully in-memory, no database, no auth, no AWS — and drive a real agent turn. The server talks to the SmooAI LLM gateway (`llm.smoo.ai`); bring a gateway key.\n\n```bash\ngit clone https://github.com/SmooAI/smooth-operator \u0026\u0026 cd smooth-operator/rust\n\n# Point at the gateway and seed a distinctive \"17-day return window\" demo doc.\nexport SMOOAI_GATEWAY_KEY=sk-…           # your llm.smoo.ai key\nexport SMOOTH_AGENT_SEED_KB=1            # seeds the demo knowledge docs\n\ncargo run -p smooai-smooth-operator-server\n# → smooth-operator-server (local flavor) listening on ws://127.0.0.1:8787/ws (model claude-haiku-4-5)\n```\n\nThat's it — an agent backend on `ws://127.0.0.1:8787/ws`, with knowledge retrieval, tool-calling, and streaming. With no env set, the binary boots the **local flavor**: in-memory storage, in-memory backplane, loopback bind, admin off. Set `SMOOTH_AGENT_STORAGE=postgres` (or `dynamodb`) and a backplane to graduate the *same* binary to the k8s or serverless flavor.\n\n\u003e No key? The server still boots and answers protocol actions — only `send_message` (which needs the LLM) errors cleanly until `SMOOAI_GATEWAY_KEY` is set.\n\nYou can also embed the local flavor **in-process** from Rust — `smooth_operator_server::local::serve_local(\"127.0.0.1:8787\")`, or `LocalServer::builder().seed_kb(true).spawn()` for a handle with a graceful-shutdown switch. See [`deploy/local/README.md`](deploy/local/README.md).\n\n---\n\n## Watch it stream\n\nConnect, start a session, send a turn, and watch tokens stream in — then `await` the authoritative terminal response. Here in TypeScript ([`@smooai/smooth-operator`](typescript/README.md)); the same shape exists in [Go](go/README.md), [.NET](dotnet/README.md), [Python](python/README.md), and [Rust](rust/README.md).\n\n```ts\nimport { SmoothAgentClient } from '@smooai/smooth-operator';\n\nconst client = new SmoothAgentClient({ url: 'ws://127.0.0.1:8787/ws' });\nawait client.connect();\n\nconst session = await client.createConversationSession({ agentId, userName: 'Alice' });\n\n// One turn. Iterate the stream; `await` the same handle for the final state.\nconst turn = client.sendMessage({ sessionId: session.sessionId, message: 'How long is your return window?' });\n\nfor await (const ev of turn) {\n  if (ev.type === 'stream_chunk') console.error(`  ↳ node: ${ev.node}`); // knowledge_search, response_gen, …\n  if (ev.type === 'stream_token') process.stdout.write(ev.token ?? '');  // \"Our return window is 17 days…\"\n  if (ev.type === 'write_confirmation_required') {\n    // HITL: a tool wants to write — approve, and the resumed stream flows back into this same turn.\n    client.confirmToolAction({ sessionId: session.sessionId, requestId: turn.requestId, approved: true });\n  }\n}\n\nconst final = await turn; // EventualResponse — cost, tokens, messageId\n```\n\nThe model autonomously calls `knowledge_search`, retrieves the seeded **17-day** return window, and grounds its answer in it — verified live against `llm.smoo.ai` and across every client.\n\n\u003e Need an embeddable web UI? The TypeScript side ships a [React binding](typescript/src/react) and an [embeddable widget](typescript/src/widget) (a custom element) on top of the same client.\n\n---\n\n## Deployment flavors\n\nOne operator binary, one codebase. The `StorageAdapter` + backplane + auth seams are what let the same agent code run on any of three flavors — application code never names a backend. The flavor is selected by config, not by a build.\n\n| | **Kubernetes** (primary self-host) | **AWS serverless** (SST) | **Local** (dev / embed) |\n| --- | --- | --- | --- |\n| Compute | Long-running pods | API GW WebSocket → Lambda | One in-process server |\n| Storage | Postgres + pgvector | DynamoDB + S3 Vectors | In-memory |\n| Backplane | Redis / NATS (multi-replica) | API GW connections | In-memory (single process) |\n| Auth | `AUTH_MODE=jwt` / `smoo` | `AUTH_MODE=jwt` / `smoo` | `AUTH_MODE=none` (dev only) |\n| `SMOOTH_AGENT_STORAGE` | `postgres` | `dynamodb` | `memory` (default) |\n| Deploy | `helm install smooth-operator ./deploy/k8s` | `npx sst deploy` in `deploy/sst` | `cargo run -p smooai-smooth-operator-server` |\n\n```bash\n# Kubernetes (Helm + ArgoCD) — service + WS ingress, Postgres + pgvector, Redis/NATS backplane\nhelm install smooth-operator ./deploy/k8s --set image.tag=$(git rev-parse --short HEAD)\n\n# AWS serverless (SST) — API GW WebSocket + Lambda + DynamoDB + S3 Vectors\ncd deploy/sst \u0026\u0026 pnpm install \u0026\u0026 npx sst deploy --stage prod\n\n# Local — fully in-memory, auth off, no external services\ncargo run -p smooai-smooth-operator-server\n```\n\nWhat every flavor **keeps**: hybrid (vector + keyword) retrieval with reranking, a clean Chat · RAG · Agents · Actions decomposition, connector-style ingestion, document-level ACLs over org isolation, and the MIT, batteries-included self-host story. See [`deploy/README.md`](deploy/README.md) and [`docs/DEPLOY.md`](docs/DEPLOY.md) for the full matrix.\n\n---\n\n## Architecture\n\nOne protocol in front; a swappable engine and storage behind it. A client never names a language, a backend, or whether the engine is embedded or remote — it only ever sees the protocol.\n\n```mermaid\n%%{init: {'theme':'base','themeVariables':{\n  'background':'#020618','primaryColor':'#0b1426','primaryTextColor':'#e6edf6','primaryBorderColor':'#2b3a52',\n  'lineColor':'#7c8aa0','secondaryColor':'#0b1426','tertiaryColor':'#0b1426','fontFamily':'ui-sans-serif, system-ui, sans-serif',\n  'clusterBkg':'#0b1426','clusterBorder':'#22304a'}}}%%\nflowchart LR\n  CLIENTS[\"5 native clients\u003cbr/\u003eTS · Go · .NET · Python · Rust\"]\n  CLIENTS --\u003e|\"WebSocket protocol\"| SVC\n\n  subgraph SVC[\"smooth-operator · service\"]\n    PROTO[\"Protocol layer\"] --\u003e RT[\"KnowledgeChatRuntime\"]\n  end\n\n  RT --\u003e|\"Agent::run\"| ENGINE[\"smooth-operator-core\u003cbr/\u003e5-language engine\"]\n  ENGINE --\u003e|\"LlmProvider\"| GW[(\"llm.smoo.ai\u003cbr/\u003eor BYO gateway\")]\n  RT --\u003e|\"StorageAdapter\"| KB[(\"Knowledge + conversations\u003cbr/\u003epgvector / DynamoDB + S3 Vectors / in-memory\")]\n\n  classDef warm fill:#f49f0a,stroke:#ff6b6c,color:#1a0f00;\n  classDef teal fill:#00a6a6,stroke:#00c2c2,color:#011;\n  class ENGINE warm\n  class GW,KB teal\n```\n\n### An agent turn, end to end\n\n```mermaid\n%%{init: {'theme':'base','themeVariables':{\n  'background':'#020618','primaryColor':'#0b1426','primaryTextColor':'#e6edf6','primaryBorderColor':'#2b3a52',\n  'lineColor':'#7c8aa0','actorBkg':'#0b1426','actorBorder':'#2b3a52','actorTextColor':'#e6edf6',\n  'signalColor':'#7c8aa0','signalTextColor':'#e6edf6','noteBkgColor':'#f49f0a','noteTextColor':'#1a0f00','noteBorderColor':'#ff6b6c',\n  'fontFamily':'ui-sans-serif, system-ui, sans-serif'}}}%%\nsequenceDiagram\n  participant C as Client\n  participant S as Service\n  participant A as Agent\n  participant K as Knowledge / Tools\n  participant L as LLM gateway\n\n  C-\u003e\u003eS: send_message { sessionId, message }\n  S-\u003e\u003eA: run turn (replay prior messages)\n  S--\u003e\u003eC: immediate_response (202, ack)\n  A-\u003e\u003eK: knowledge_search(\"return window\")\n  K--\u003e\u003eA: top-K snippets (the 17-day fact)\n  A-\u003e\u003eL: chat completion (grounded prompt)\n  L--\u003e\u003eA: token deltas …\n  A--\u003e\u003eS: TokenDelta / PhaseStart / ToolCallComplete\n  S--\u003e\u003eC: stream_token \"Our\" \"return\" \"window\" …\n  S--\u003e\u003eC: stream_chunk { node: response_gen }\n  A--\u003e\u003eS: Completed { cost, tokens }\n  S--\u003e\u003eC: eventual_response (200, final)\n```\n\n### Protocol lifecycle (incl. HITL)\n\n```mermaid\n%%{init: {'theme':'base','themeVariables':{\n  'background':'#020618','primaryColor':'#0b1426','primaryTextColor':'#e6edf6','primaryBorderColor':'#2b3a52',\n  'lineColor':'#7c8aa0','secondaryColor':'#0b1426','tertiaryColor':'#0b1426','fontFamily':'ui-sans-serif, system-ui, sans-serif'}}}%%\nstateDiagram-v2\n  [*] --\u003e Connected: connect\n  Connected --\u003e SessionOpen: create_session\n  SessionOpen --\u003e Streaming: send_message\n  Streaming --\u003e Streaming: stream_token · chunk\n  Streaming --\u003e AwaitingApproval: confirm_required\n  AwaitingApproval --\u003e Streaming: approve\n  Streaming --\u003e AwaitingOtp: otp_required\n  AwaitingOtp --\u003e Streaming: verify_otp\n  Streaming --\u003e SessionOpen: eventual_response\n  SessionOpen --\u003e [*]: disconnect\n```\n\nFull action/event tables, the `AgentEvent` mapping, and connection-state keys are in [`docs/PROTOCOL.md`](docs/PROTOCOL.md).\n\n---\n\n## The polyglot story (honest status)\n\nOne protocol, defined once in [`spec/`](spec) (JSON Schema). Everything else is generated or hand-written to match it.\n\n| Surface | Status |\n| --- | --- |\n| **Engine** ([`smooth-operator-core`](https://github.com/SmooAI/smooth-operator-core)) | **5-language parity engine** — Rust · C# · Python · TypeScript · Go, each published (crates.io / NuGet / PyPI / npm / Go module). Rust is the reference; the others mirror its surface. |\n| **Protocol clients** | **All five languages** — TypeScript (`@smooai/smooth-operator`), Go, .NET (with a `Microsoft.Extensions.AI` `IChatClient` facade), Python, Rust. The TS side also ships a **React binding** and an **embeddable widget**. |\n| **Servers** | **All five languages** — Rust · C# · Python · TypeScript · Go, each consuming its own language's engine so a host can run the full service in its native stack. Rust + C# carry the full surface (ingestion, admin, ACL, storage adapters); Python/TS/Go are native servers (transport · frame dispatch · per-turn engine · sessions · auth · graceful drain). **All five run the shared scenario conformance corpus** — protocol parity, tested. |\n\n\u003e All five native servers now exist and run the same [`spec/conformance/scenarios`](spec/conformance/scenarios) corpus — driven by the engine's deterministic mock, so they must produce identical protocol output (the corpus already caught and fixed real error-handling divergences in the TS and C# servers). The Rust + C# servers carry the full surface; the Python/TS/Go servers are native and at protocol parity, growing toward the full feature surface. The five clients, five engines, and five servers are all real.\n\n---\n\n## Test-driven by default\n\n\u003e **Nothing here is vibe-coded — it's verified against a real LLM gateway.** Substring tests prove a reply *contains* the right number; an LLM-as-judge proves the agent *reasoned* its way there and didn't hallucinate. We run both.\n\n```mermaid\n%%{init: {'theme':'base','themeVariables':{\n  'background':'#020618','primaryColor':'#0b1426','primaryTextColor':'#e6edf6','primaryBorderColor':'#2b3a52',\n  'lineColor':'#7c8aa0','secondaryColor':'#0b1426','tertiaryColor':'#0b1426','fontFamily':'ui-sans-serif, system-ui, sans-serif'}}}%%\nflowchart TD\n  U[\"Unit tests\u003cbr/\u003echunker · SSRF guard · can_access\"] --\u003e C\n  C[\"Testcontainers conformance\u003cbr/\u003epgvector + DynamoDB-Local\"] --\u003e E\n  E[\"Live cross-language E2E\u003cbr/\u003eall 5 clients, real WebSocket turns\"] --\u003e J\n  J[\"LLM-as-judge quality evals\u003cbr/\u003ereal gateway, rubric-scored 1–5\"]\n\n  classDef warm fill:#f49f0a,stroke:#ff6b6c,color:#1a0f00;\n  classDef teal fill:#00a6a6,stroke:#00c2c2,color:#011;\n  class U teal\n  class J warm\n```\n\nAll five native servers run a **shared scenario conformance corpus** ([`spec/conformance/scenarios`](spec/conformance/scenarios)) — language-neutral protocol flows driven by the engine's deterministic mock, so every server must produce identical output. That's the polyglot parity oracle, on top of each server's own protocol/ingestion/ACL/rerank/embedder suites and the engine's offline suite ([337 tests](https://github.com/SmooAI/smooth-operator-core) on a deterministic `MockLlmClient`). The five protocol clients are exercised against a real WebSocket in a cross-language E2E harness.\n\n### The proof story\n\nThe headline isn't a count — it's a **real defect a substring test would have missed**. On the first live run, our LLM-as-judge scored a multi-turn answer **1/5**: the runtime built a fresh agent per turn, so turn 2 had no memory of turn 1's delivery date and couldn't compute the last return day. A `contains(\"the 22nd\")` assertion would have stayed green on a hallucinated guess. The judge caught it; the fix wired per-session memory; **it now scores 5/5**.\n\nThat's the whole bet: quality regressions that only a grader can see, caught in CI. Details — the five scenarios, the rubric, the same-model-judge knob — in [`docs/EVALS.md`](docs/EVALS.md).\n\n### Gated, never silently skipped\n\nLive tests need a gateway key. They are **gated, not deleted**: with `SMOOTH_AGENT_E2E=1` + `SMOOAI_GATEWAY_KEY` they run (and print every per-scenario score under `--nocapture`); without them they print an explicit **skip** and return — so credential-free `cargo test` and CI stay green, and the nightly job runs the full live suite. The gateway key is read from the environment and **never printed**.\n\n```bash\n# Unit + conformance — no creds, runs everywhere\ncd rust \u0026\u0026 cargo test\n\n# + live LLM-as-judge evals\nexport SMOOAI_GATEWAY_KEY=sk-… SMOOTH_AGENT_E2E=1\ncargo test -p smooai-smooth-operator-evals --test llm_judge -- --nocapture --test-threads=1\n```\n\n---\n\n## Smoo-powered or bring-your-own\n\nA recurring principle across the whole stack: **same code, two postures.**\n\n| Capability      | Smoo-powered (hosted)             | Bring-your-own (self-host)               |\n| --------------- | --------------------------------- | ---------------------------------------- |\n| LLM gateway     | `llm.smoo.ai`                     | any OpenAI-compatible endpoint           |\n| Embeddings      | gateway (`text-embedding-3-small`) | `DeterministicEmbedder` or your provider |\n| Web search      | Smoo provider                     | Brave / Bing / Tavily via `WebSearchProvider` |\n| Identity / RBAC | Smoo identity (`AUTH_MODE=smoo`)  | `AUTH_MODE=jwt` (BYO JWT/OIDC)           |\n| Connectors      | managed GitHub/Slack apps         | your tokens, same `Connector` trait      |\n\nSelf-host brings their own; hosted wires Smoo's apps. The seams are identical — see [`docs/INGESTION.md`](docs/INGESTION.md), [`docs/TOOLS.md`](docs/TOOLS.md), and [`docs/STORAGE.md`](docs/STORAGE.md).\n\n---\n\n## The two-repo split\n\n| Repo | What it is |\n| ---- | ---------- |\n| [`smooth-operator-core`](https://github.com/SmooAI/smooth-operator-core) | The **agent engine** — `Agent`, `Workflow`, `Tool`, `CheckpointStore`, `LlmProvider`, `Memory`, `KnowledgeBase`. A **5-language parity engine** (Rust · C# · Python · TypeScript · Go), each published. |\n| **`smooth-operator`** (this repo) | The **service** — conversations, knowledge ingestion + retrieval, the tool catalog, the WebSocket protocol, the five clients, the management console, and the Kubernetes / AWS / local deploy flavors. |\n\n## Repository layout\n\n```\nsmooth-operator/\n├── spec/         # The language-neutral wire protocol (JSON Schema) — source of truth for all clients\n├── rust/         # Reference server + service crate (smooai-smooth-operator) + adapters, lambda, evals, ingestion\n├── typescript/   # @smooai/smooth-operator — client + React binding + embeddable widget\n├── go/           # github.com/SmooAI/smooth-operator/go — protocol.Client\n├── dotnet/       # SmooAI.SmoothOperator — client (+ Microsoft.Extensions.AI facade) and the C# server\n├── python/       # smooth-operator (import smooth_operator) — async client\n├── console/      # Next.js management console for the auth-gated /admin/* API\n├── adapters/     # Storage adapters: postgres (pgvector) and dynamodb (S3 Vectors)\n├── deploy/\n│   ├── k8s/      # Kubernetes (Helm + ArgoCD) — Postgres + pgvector + Redis/NATS backplane\n│   ├── sst/      # AWS serverless (API GW WebSocket + Lambda + DynamoDB + S3 Vectors)\n│   └── local/    # Local / embed-in-process — in-memory, auth off, no external services\n└── docs/         # Architecture, protocol, storage, evals, ingestion, access-control, observability, deploy, roadmap\n```\n\n## Run it hosted\n\nDon't want to operate it yourself? **[lom.smoo.ai](https://lom.smoo.ai)** runs smooth-operator as a managed, multi-tenant service.\n\n## Documentation\n\n| Doc | What |\n| --- | --- |\n| [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) | System design, the agent pipeline, how it consumes the engine |\n| [`docs/PROTOCOL.md`](docs/PROTOCOL.md) | The schema-driven WebSocket protocol |\n| [`docs/STORAGE.md`](docs/STORAGE.md) | The `StorageAdapter` trait; Postgres and DynamoDB/S3 Vectors designs |\n| [`docs/EVALS.md`](docs/EVALS.md) | The LLM-as-judge quality harness (the 1/5 → 5/5 story) |\n| [`docs/INGESTION.md`](docs/INGESTION.md) | Connectors, chunking, the embedder seam |\n| [`docs/TOOLS.md`](docs/TOOLS.md) | The built-in tool catalog + authoring your own |\n| [`docs/ACCESS-CONTROL.md`](docs/ACCESS-CONTROL.md) | Document-level ACLs over org isolation |\n| [`docs/ADMIN-API.md`](docs/ADMIN-API.md) | The auth-gated `/admin/*` API the console consumes |\n| [`docs/OBSERVABILITY.md`](docs/OBSERVABILITY.md) | OpenTelemetry `gen_ai.*` tracing |\n| [`docs/DEPLOY.md`](docs/DEPLOY.md) | The three deploy flavors + the shared `SmooAI/deploy` package |\n| [`docs/Planning/Roadmap.md`](docs/Planning/Roadmap.md) | Phased build plan + current status |\n\n## 🧩 Part of Smoo AI {#part-of-smoo-ai}\n\nsmooth-operator is built and open-sourced by **[Smoo AI](https://smoo.ai)** — the AI-powered business platform with AI built into every product: CRM, customer support, campaigns, field service, observability, and developer tools.\n\n- 🚀 **smooth-operator on the platform** — [smoo.ai/th](https://smoo.ai/th)\n- 🧰 **More open source from Smoo AI** — [smoo.ai/open-source](https://smoo.ai/open-source)\n- 🧩 **Sibling packages** — [smooth-operator-core](https://github.com/SmooAI/smooth-operator-core) (the 5-language engine this wraps), [@smooai/deploy](https://github.com/SmooAI/deploy), [smooth](https://github.com/SmooAI/smooth) (the `th` CLI)\n- ☁️ **Hosted** — [lom.smoo.ai](https://lom.smoo.ai) runs smooth-operator for you, managed and multi-tenant\n\n## 🤝 Contributing\n\nBuilt in the open, test-first. Issues and PRs welcome — see the [docs vault](docs/Home.md) for architecture, protocol, and the eval harness, and [`docs/Planning/Roadmap.md`](docs/Planning/Roadmap.md) for what's queued.\n\n## 📄 License\n\nMIT © 2026 Smoo AI. See [LICENSE](LICENSE).\n\n---\n\n\u003cp align=\"center\"\u003e\n  Built by \u003ca href=\"https://smoo.ai\"\u003e\u003cstrong\u003eSmoo AI\u003c/strong\u003e\u003c/a\u003e — AI built into every product.\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmooai%2Fsmooth-operator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsmooai%2Fsmooth-operator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmooai%2Fsmooth-operator/lists"}