Tech stack
Overview
Interface → Orchestration → LLM → Memory/Tools → Infrastructure
Orchestration
When the problem naturally splits into distinct roles: Researcher, Writer, Validator. Higher abstraction than LangGraph, less code for cases without complex cycles.
vs. LangGraph: CrewAI for sequential role-based pipelines. LangGraph when you need cycles or precise state machines.
Memory & search
PostgreSQL extension for vector search: no separate infrastructure. The same database handles application state, embeddings, and Row Level Security for tenant isolation.
vs. Pinecone: pgvector for < 10M vectors when transactional consistency matters. Pinecone for extreme volumes (> 100M vectors).
Search API built for LLMs: pre-cleaned snippets, domain filtering. Used in competitive intelligence and document research agents.
vs. SerpAPI: Tavily returns content directly usable by an LLM. Cost per request ~3x lower at equivalent snippet quality.
Open source, self-hostable, GDPR-native. Every LLM call is traced: input, output, duration, token cost per model. Cost dashboard per agent, per tenant, per feature.
vs. LangSmith: Langfuse for data sovereignty (self-host on Scaleway). LangSmith if you want to stay 100% cloud Langchain.
Infrastructure
Docker-native, fr-par hosting, GDPR and HDS available, per-second billing. Preferred for clients with sovereignty constraints (health, finance, public sector).
vs. AWS/GCP: Scaleway for European sovereignty and cost. AWS for extreme scaling workloads or existing AWS ecosystem.
Frontend & APIs
App Router + Server Components: zero client JS on SEO pages. RSC streaming for interfaces with LLM latency.
Server Components make streaming LLM responses natural without useState or useEffect. The Route Handler manages incoming webhooks.
Model strategy
How we reason about models, not which one wins this month. Decision guides on choosing, deploying and sizing models, plus a living catalogue.
Choosing a model is a process, not a pick: five steps that end in a routing strategy, not a single winner.
Lab API, managed open-weight, or self-hosted: where your model runs, and who pays for what.
Frontier, workhorse, small, edge: a capability ladder, and matching the rung to the task is the lever.
For an EU buyer, which jurisdiction governs the data is a first-class axis, not an afterthought.
Adjacent landscape
Tools we map but do not run in our production core. We cover where they fit and when to graduate to something more robust.
Architecture principles
Stateful by default. Each agent maintains its state via LangGraph checkpointing. On timeout or network error, the pipeline resumes from the last stable node, without restarting from scratch. Critical for long pipelines (> 2 min of processing).
Explicit fallbacks. Every LLM call has a timeout (defined), a retry count (defined), and a fallback path (defined). If Sonnet times out, we retry on Haiku. If Haiku times out, we escalate to a human. Nothing is implicit.
Model != provider. The LangChain/LangGraph abstraction lets us swap Claude for GPT-4o or Mistral without touching business logic. We code against interfaces (system_message, invoke, stream), not proprietary SDKs.
Controlled cost. Model routing is an architecture decision, not a detail. Each graph node specifies its model. Langfuse calculates the real cost per run. Target: Haiku on 60-70% of calls, Sonnet on the 30-40% that need it.