← Platform
Technical architecture

"Just ChatGPT with a UI?" Here's the actual stack.

An overview of the system behind Yesper: an orchestrated agent loop with dual-model routing, a multi-tenant Cosmos DB, event-driven async pipelines via Azure Service Bus, Cosmos change-feed + SignalR for real-time, and a fleet of specialist agents exposed as tool calls.

RuntimeNode.js · TypeScript BuildBazel monorepo CloudAzure (EU) ModelsClaude + Azure OpenAI
01Clients
Web app
React SPA · SSE streaming
Tender LM
Bid production (separate UI)
MCP clients
Claude Desktop, Cursor, IDE
API consumers
Bearer token · enterprise
02Edge & API
HTTP API gateway
services/yesper · services/backend
Each module registers its endpoints (ApiModule pattern, snake_case paths).
  • /orchestrator_agent
  • /project
  • /project_file
  • /artifact
  • /checklist
  • /workflow
  • /memory
  • /prompt_library
  • + 16 more
Auth & authz
modules/yesper/auth0 · workspace_authorization
Auth0 SSO · scope_types (workspace / project / org) · org-routing.
MCP server
modules/yesper/mcp_server
Exposes Yesper tools to external LLM clients via the Model Context Protocol.
03Orchestrator
orchestrator_agent — tool-calling loop with dual-model routing
modules/yesper/orchestrator_agent/internals/{claude-orchestrator-agent.ts · orchestrator-chat-completion-agent.ts}
Routing
  • skill-router
  • source-router
  • agent-exclusions
  • capabilities-tool
Loop control
  • subtask-tool
  • todo-tool
  • todo-reminder
  • retry-utils
Streaming
  • anthropic-stream-adapter
  • smooth-text-emitter
  • answer-formatter
  • SSE → client
Model backends
Claude
modules/yesper/anthropic_model
Azure OpenAI
modules/yesper/azure_model
04Agent fleet

Project intelligence

  • project_agent — cross-file reasoning
  • project_explorer_agent
  • project_file_researcher
  • project_file_indexer — RAG
  • blueprint_analyzer
  • bill_of_quantities
  • document_type_assessor
  • image_analyzer
  • file_comparator_agent

Swedish authority data

  • allabolag_agent
  • trafikverket_agent
  • sgu_agent
  • nvv_agent
  • ama_agent
  • mapbox_agent · geo_agent
  • weather_agent

Document pipeline

  • xlsx_agent · excel_converter
  • msoffice_agent
  • file_converter
  • file_chunker
  • sharepoint_sync
  • project_file_storage — Azure Blob

Workflow & structure

  • workflow_agent
  • checklist_agent
  • composer_agent
  • template_agent
  • plan_agent
  • memory_agent

Research & execution

  • research_agent
  • web_agent — headless browsing
  • code_execution_agent
  • reference_library
  • prompt_library

Artifacts & delivery

  • artifact · artifact_editor_agent
  • web_artifact_creator_agent
  • editor_agent
  • content_generation
  • content_export — Word/Excel/PDF
  • bessy — enrichment pipeline
05Data & events

Data plane

multi-tenant · org-isolated
Cosmos DB — default
modules/yesper/cosmos_db
Shared multi-tenant containers. Partition keys per org.
Cosmos DB — per-org
CosmosDbClientFactory(org_id)
Dedicated databases for enterprise customers. Same code, different routing.
Azure Blob
project_file_storage
Raw files · revisions · large binaries.
Cosmos change feed + SignalR
modules/yesper/realtime
generic-change-feed-processor → signalr-hub → SSE to client.
Redis streams
modules/yesper/redis_stream
Low-latency fan-out for real-time text streaming.
Vector index
project_file_indexer
Chunked, embedded, semantically searchable via RAG tools.

Event plane

Azure Service Bus · InMemoryPubSub in tests
orchestrator-run-executed agent-task-scheduled agent-task-execution-started agent-task-run-completed agent-task-blocked checklist-run-executed workflow-run-executed project-file-vectorized project-file-revision-indexed immediate-project-file-indexing-requested project-file-indexing-failed thread-summarization-requested thread-summary-upserted project-exploration-triggered workspace-exploration-triggered bessy-record-created bessy-enrichment-completed generated-file-created project-deleted project-file-deleted agent-thread-deleted

Each module owns its events under pub_sub/. Subscribers are named after the Bazel package. Retry + DLQ are handled by Service Bus.

06External providers
LLM providers
  • Anthropic Claude (Opus / Sonnet / Haiku)
  • Azure OpenAI (EU deployment)
  • Per-agent model routing
Swedish authorities & open data
  • Allabolag
  • Trafikverket
  • SGU
  • Naturvårdsverket
  • AMA
  • Mapbox
  • Weather API
Enterprise
  • Auth0
  • SharePoint Graph API
  • Gmail / outbound email
  • Braintrust (evals)
07Cross-cutting
Observability
Structured logging (static message, variables in details), traces, LLM evals.
loggertracerbraintrust
Test discipline
BDD mocha · NoOp implementations · mock factories · Cosmos tests against a real DB.
bazel testTestLoggerNoOp*Store
DI & modularity
ApiModule interface · Client/Store separation · never import from internals/.
ApiModuleLocalClientStoreFactory
Secrets & config
Google KMS-encrypted config files · no env-var secrets · encrypt-prod pipeline.
secret_managerEncryptedString
The "ChatGPT with a web page" take
One model. One textbox. No memory.

A chat wrapper makes one API call per question. Yesper runs an orchestrated loop of dozens of specialist agents, two model providers, a multi-tenant data model, an event plane with 20+ topics, and an index pipeline that keeps every project file semantically searchable — all behind the same text field. The difference isn't the UI. It's everything behind it.