Generated from the build.
Interfaces
- Microsoft Teams / Azure Bot Service: inbound staff messages arrive as Bot Framework activities at the n8n webhook; answers are sent back to
{serviceUrl}/v3/conversations/{id}/activities.
- n8n: two workflows,
ops-assistant.query.json (router, specialists, reply) and ops-assistant.ingest.json (per-domain ingestion).
- Anthropic Claude API: reasoning model for the router and specialists, via the Anthropic Chat Model node.
- OpenAI API: embeddings (text-embedding-3-small) for ingestion and query.
Authentication
- Teams: an Azure Bot registration; outbound replies use a Bot Framework bearer token (Azure AD client credentials). Least-privilege Microsoft Graph scopes.
- Claude and OpenAI: API keys held in n8n credentials, never in the workflow JSON.
Retrieval contract
router: classify message, delegate to exactly one specialist
specialists: answer only from their own vector store; decline if not documented
ingestion: SOP files -> recursive split (512 / 50 overlap) -> embed -> per-domain store
query: specialist retrieves from its store as a tool (retrieve-as-tool, topK 4)
model: one shared Claude model + one shared embeddings node across all agents
Resilience
- The webhook returns 200 immediately so Teams never hits its activity-response timeout; the answer follows asynchronously.
- Knowledge isolation per domain prevents cross-domain answers.
- Undocumented questions are declined rather than guessed.
- Documents are retrieved at query time and never used to train or fine-tune a model.
Setup and reconfiguration
- Run n8n; add Anthropic and OpenAI credentials.
- Import both workflows.
- Place the SOP files where the ingestion Read nodes point, then run ingestion once.