| Pure LLM / text / transform / branching pipeline | ✅ Always | Author a workflow (aevatar-workflow-authoring). No external anything. |
| Call a third-party API (read/post): GitHub, Slack, Google, X/Twitter, Reddit, a custom HTTP API… | ✅ If the connector is in the catalog | User connects the api-* connector in NyxID (OAuth for user mode, or supplies a token for admin mode — per the catalog entry). Then the workflow calls it via nyxid_proxy. |
| A connector that is NOT in the catalog | ⚠️ Only if it's a plain HTTP API | If it speaks HTTP + a supported auth_method, NyxID can add it (platform/admin work — not self-serve). If not HTTP, ❌. |
| Inbound bot that replies in-platform: Lark / Telegram | ✅ Yes | Connect the bot connector (api-lark-bot / api-telegram-bot) and register the channel (channel-admin / channel_registrations); NyxID provisions the webhook to Aevatar's relay. |
| Inbound bot on a platform with a connector but no channel module (Discord, Slack, X, …) | ❌ Not self-serve | Outbound calls work, but inbound-reply needs a new Aevatar channel module + relay wiring = Aevatar platform work. Offer the outbound-only version as the alternative. |
| Publish a workflow/team as an invocable service in-scope | ✅ Yes | Just bind it (aevatar-service-publisher). Usable within the user's scope immediately. |
| An external automation triggers an existing Aevatar workflow (e.g. Lark Base row status changed → HTTP request → run member workflow) | ✅ Usually, without service externalExposure | Use the external system's HTTP action to call the NyxID proxy for the existing aevatar service with a NyxID API key (proxy scope), targeting an explicit /api/scopes/{scopeId}/members/{memberId}/invoke/... or /teams/{teamId}/invoke/... path. This is an external trigger, not a NyxID connector registration. See aevatar-service-publisher. |
| Have that service registered as a NyxID-brokered connector (callable by others/externally) | ⚠️ Host-gated | The host must enable external exposure (GAgentService:ExternalExposure: Enabled=true + RegisterAllPublishedServices or an opt-in policy). You cannot turn this on as a client — verify externalExposure on the service and, if empty, tell the user to ask the host. |
| Schedule a recurring run (cron) | ⚠️ Yes, with a binding | The scope owner needs a durable NyxID broker binding — i.e. an interactive console NyxID login, not just a CLI token. Without it, schedule creation 400s ("Authenticated NyxID owner binding is required"). |
| A service backed by an arbitrary custom agent / actor type | ⚠️ Constrained | Member implementations are workflow, script, or registered gagent kinds (GET /api/scopes/gagent-types). You can't point a service at an arbitrary actor; wrap custom logic in a workflow or script, or use a registered gagent kind. |
| A genuinely new service shape (e.g. streaming/WebSocket/gRPC endpoint, a runtime kind beyond workflow/script/gagent) | ❌ Not currently | Service endpoints are unary HTTP over the fixed implementation kinds. A new shape needs Aevatar platform work. |
| Exactly-once external side effects (e.g. "charge exactly once") | ❌ Not guaranteed | The workflow saga is at-least-once with idempotency keys. Require an idempotent connector endpoint, or do the exactly-once elsewhere. |