diff --git a/.github/banner.png b/.github/banner.png new file mode 100644 index 0000000..8b56b05 Binary files /dev/null and b/.github/banner.png differ diff --git a/.github/banner.svg b/.github/banner.svg new file mode 100644 index 0000000..a06e3ae --- /dev/null +++ b/.github/banner.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + @smooai/deploy + + One agent. AWS serverless or Kubernetes. + SMOO AI · AI BUILT INTO EVERY PRODUCT + \ No newline at end of file diff --git a/README.md b/README.md index 76802c0..a0101d3 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,21 @@

- Smoo AI + @smooai/deploy — One agent. AWS serverless or Kubernetes.

-

@smooai/deploy

-

- Deploy a smooth-operator agent two ways from one package — SST v4 constructs for AWS serverless, and a Helm chart + ArgoCD for Kubernetes. + Smoo AI + license + lom.smoo.ai

- Smoo AI - license TypeScript / SST v4 Helm + ArgoCD - lom.smoo.ai + verify: tsc + helm lint

- Features · - Install · - Usage · - Platform + Features  ·  Install  ·  Usage  ·  Platform

--- @@ -118,37 +113,34 @@ Defaults are sensible: the WebSocket route table covers `$connect`, `$disconnect ## 📖 Architecture — one agent, two deploy paths ```mermaid -flowchart TB - SRC["smooth-operator (Rust agent)"] - - subgraph aws["AWS serverless · SmoothAgentApi (SST v4)"] - WSAPI[API Gateway WebSocket] - LAM["Rust Lambda
provided.al2023 / arm64"] - DDB[(DynamoDB single table)] - S3[(S3 blob bucket)] - VEC[(S3 Vectors index)] - SEC[gateway-key Secret] - WSAPI --> LAM - LAM --> DDB - LAM --> S3 - LAM --> VEC - LAM --> SEC - end - - subgraph k8s["Kubernetes / self-host · smooth-operator Helm chart"] - ING[WebSocket Ingress] - DEP[axum /ws Deployment] - PG[("pgvector Postgres
external")] - ARGO[ArgoCD Application] - ING --> DEP - DEP --> PG - ARGO -.->|syncs| DEP - end - - SRC -->|cargo lambda artifact| LAM - SRC -->|container image| DEP - LAM -.->|OpenAI-compatible| GW[(LLM gateway)] - DEP -.->|OpenAI-compatible| GW +%%{init: {'theme':'base','themeVariables':{ + 'background':'#020618','primaryColor':'#0b1426','primaryTextColor':'#e6edf6','primaryBorderColor':'#2b3a52', + 'lineColor':'#7c8aa0','secondaryColor':'#0b1426','tertiaryColor':'#0b1426','fontFamily':'ui-sans-serif, system-ui, sans-serif', + 'clusterBkg':'#0b1426','clusterBorder':'#22304a'}}}%% +flowchart LR + SRC["smooth-operator
Rust agent"] + + subgraph aws["AWS serverless · SmoothAgentApi"] + LAM["Rust Lambda"] + STORE[("Dynamo · S3 · Vectors")] + LAM --> STORE + end + + subgraph k8s["Kubernetes · Helm + ArgoCD"] + DEP["axum /ws"] + PG[("pgvector Postgres")] + DEP --> PG + end + + SRC -->|lambda artifact| LAM + SRC -->|container image| DEP + LAM -.->|OpenAI-compatible| GW[("LLM gateway")] + DEP -.->|OpenAI-compatible| GW + + classDef warm fill:#f49f0a,stroke:#ff6b6c,color:#1a0f00; + classDef teal fill:#00a6a6,stroke:#00c2c2,color:#011; + class SRC warm + class STORE,PG,GW teal ``` The same agent ships as a Lambda artifact (serverless) or a container image (k8s). Both speak the same WebSocket protocol and call the same OpenAI-compatible LLM gateway — you pick the runtime, not the agent. @@ -163,18 +155,19 @@ Infra you can't `cargo test` still has to be verified. This package proves corre - **Deployed via CI, never locally** — local deploys can ship unintended changes; the pipeline owns `sst deploy` / `argocd sync`. ```mermaid +%%{init: {'theme':'base','themeVariables':{ + 'background':'#020618','primaryColor':'#0b1426','primaryTextColor':'#e6edf6','primaryBorderColor':'#2b3a52', + 'lineColor':'#7c8aa0','secondaryColor':'#0b1426','tertiaryColor':'#0b1426','fontFamily':'ui-sans-serif, system-ui, sans-serif', + 'clusterBkg':'#0b1426','clusterBorder':'#22304a'}}}%% flowchart TD - J["LLM-as-judge evals (engine)
multi-turn quality, scored 0–5"] - E["kind-cluster smoke (CI)
render → apply → schedules"] - C["Conformance
helm lint + helm template + ArgoCD app"] - U["Construct typecheck
sst install → tsc --noEmit"] - - J --> E --> C --> U - - style U fill:#1f7a3d,stroke:#0d3,color:#fff - style C fill:#2563eb,stroke:#08f,color:#fff - style E fill:#7c3aed,stroke:#a0f,color:#fff - style J fill:#b45309,stroke:#f90,color:#fff + U["Construct typecheck
sst install → tsc"] --> C["Conformance
helm lint + template"] + C --> E["kind-cluster smoke
render → apply"] + E --> J["LLM-as-judge evals
multi-turn, scored 0–5"] + + classDef warm fill:#f49f0a,stroke:#ff6b6c,color:#1a0f00; + classDef teal fill:#00a6a6,stroke:#00c2c2,color:#011; + class U teal + class J warm ``` Verify locally (no AWS creds, no deploy): @@ -233,13 +226,12 @@ See [`helm/smooth-operator/README.md`](helm/smooth-operator/README.md) for the p ## 🧩 Part of Smoo AI {#part-of-smoo-ai} -`@smooai/deploy` is part of the [Smoo AI](https://smoo.ai) platform — an AI-powered business platform with AI built into every product. It packages the deploy primitives behind the rest of the stack: +`@smooai/deploy` 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. -- [smooth-operator](https://github.com/SmooAI/smooth-operator) — the agent service this deploys -- [smooth-operator-core](https://github.com/SmooAI/smooth-operator-core) — the Rust engine -- [smooth](https://github.com/SmooAI/smooth) — the Smoo AI CLI (`th`) and orchestration platform -- [chat-widget](https://github.com/SmooAI/chat-widget) — the embeddable widget -- [**lom.smoo.ai**](https://lom.smoo.ai) — hosted agent service +- 🧰 **More open source from Smoo AI** — [smoo.ai/open-source](https://smoo.ai/open-source) +- 🤖 **The agent this deploys** — [smooth-operator](https://github.com/SmooAI/smooth-operator) · [smooth-operator-core](https://github.com/SmooAI/smooth-operator-core) (Rust engine) +- 🧩 **Sibling packages** — [smooth](https://github.com/SmooAI/smooth) (the `th` CLI), [chat-widget](https://github.com/SmooAI/chat-widget) +- ☁️ **Hosted** — [lom.smoo.ai](https://lom.smoo.ai) runs the smooth-operator service for you ## 🤝 Contributing