Production Agent Platform Architecture for Multi-Agent Systems
linkedin · Tech · year n/a · source Agentic: yes · promotional bias: low · source-backed · extracted with prompt 0.5.6 (schema v2)
Generated from extraction.json — do not edit by hand. Every claim cites verbatim source evidence; stated means the quote directly asserts the claim, implied means it supports it indirectly.
Problem
Domain: Enterprise production agent platform architecture
LinkedIn needed to scale production-grade agentic AI across many teams while supporting long-running recruiter workflows, multi-agent coordination, Python-first GenAI development, reusable skills, memory, and observability.
Constraints:
- LinkedIn's historical Java stack created friction with the Python-dominated GenAI ecosystem.
- Agents such as Hiring Assistant needed to run asynchronously in the background and notify recruiters when work completed.
- Multiple agents could execute in parallel with ordering dependencies between outputs.
- Teams needed standard production utilities for inference, tool calling, memory, checkpointing, streaming, and cross-language service integration.
- Production agent execution required custom observability because ordinary service observability did not capture agentic behavior.
Architecture
LinkedIn built an agent platform around Python business logic, gRPC services, LangChain and LangGraph application modeling, supervisor/sub-agent coordination, messaging for long-running ambient flows, layered agent memory, a centralized skills registry, and custom observability. Hiring Assistant demonstrates the platform: a recruiter describes a role, the agent generates qualifications from the prompt and documents, works asynchronously, and later returns sourced candidates for review.
Diagram confidence: explicit (topology described by the source).
flowchart LR recruiter-experience["Recruiter experience"] --> hiring-assistant-supervisor["Hiring Assistant supervisor"] hiring-assistant-supervisor["Hiring Assistant supervisor"] --> recruiter-experience["Recruiter experience"] hiring-assistant-supervisor["Hiring Assistant supervisor"] --> specialized-sub-agents["Specialized sub-agents"] specialized-sub-agents["Specialized sub-agents"] --> hiring-assistant-supervisor["Hiring Assistant supervisor"] hiring-assistant-supervisor["Hiring Assistant supervisor"] --> agent-messaging-service["Agent messaging service"] agent-messaging-service["Agent messaging service"] --> hiring-assistant-supervisor["Hiring Assistant supervisor"] hiring-assistant-supervisor["Hiring Assistant supervisor"] --> skills-registry["Skills registry"] skills-registry["Skills registry"] --> hiring-assistant-supervisor["Hiring Assistant supervisor"] hiring-assistant-supervisor["Hiring Assistant supervisor"] --> agent-memory["Agent memory"] agent-memory["Agent memory"] --> hiring-assistant-supervisor["Hiring Assistant supervisor"] python-grpc-application-framework["Python gRPC application framework"] --> hiring-assistant-supervisor["Hiring Assistant supervisor"] hiring-assistant-supervisor["Hiring Assistant supervisor"] --> python-grpc-application-framework["Python gRPC application framework"] python-grpc-application-framework["Python gRPC application framework"] --> internal-inferencing-stack["Internal inferencing stack"] internal-inferencing-stack["Internal inferencing stack"] --> python-grpc-application-framework["Python gRPC application framework"] agent-messaging-service["Agent messaging service"] --> specialized-sub-agents["Specialized sub-agents"] specialized-sub-agents["Specialized sub-agents"] --> agent-messaging-service["Agent messaging service"] specialized-sub-agents["Specialized sub-agents"] --> skills-registry["Skills registry"] skills-registry["Skills registry"] --> specialized-sub-agents["Specialized sub-agents"] specialized-sub-agents["Specialized sub-agents"] --> linkedin-services["LinkedIn services"] linkedin-services["LinkedIn services"] --> specialized-sub-agents["Specialized sub-agents"] agent-memory["Agent memory"] --> specialized-sub-agents["Specialized sub-agents"] specialized-sub-agents["Specialized sub-agents"] --> agent-memory["Agent memory"] skills-registry["Skills registry"] --> linkedin-services["LinkedIn services"] linkedin-services["LinkedIn services"] --> skills-registry["Skills registry"] custom-observability["Custom observability"] --> hiring-assistant-supervisor["Hiring Assistant supervisor"] hiring-assistant-supervisor["Hiring Assistant supervisor"] --> custom-observability["Custom observability"] custom-observability["Custom observability"] --> python-grpc-application-framework["Python gRPC application framework"] python-grpc-application-framework["Python gRPC application framework"] --> custom-observability["Custom observability"]
Components
| Component | Role | Interacts with |
|---|---|---|
Recruiter experience |
User-facing workflow where recruiters describe roles, attach documents, and review sourced candidates. | Hiring Assistant supervisor |
Hiring Assistant supervisor |
Supervisor agent coordinating sub-agents for role intake, qualification generation, sourcing, and candidate review workflow. | Recruiter experience, Specialized sub-agents, Agent messaging service, Skills registry, Agent memory |
Specialized sub-agents |
Agents that perform pieces of the hiring workflow and interact with LinkedIn services through skills. | Hiring Assistant supervisor, Skills registry, LinkedIn services |
Python gRPC application framework |
Production service framework using Python, gRPC, LangChain, and LangGraph for GenAI business logic. | Hiring Assistant supervisor, Internal inferencing stack |
Internal inferencing stack |
LinkedIn's model interface supporting Azure OpenAI and on-premises large language models. | Python gRPC application framework |
Agent messaging service |
Extension of LinkedIn messaging infrastructure for long-running user-agent and agent-agent communication with retry. | Hiring Assistant supervisor, Specialized sub-agents |
Agent memory |
Scoped and layered working, long-term, and collective memory used by agents across interactions. | Hiring Assistant supervisor, Specialized sub-agents |
Skills registry |
Central registry where services expose discoverable skills including RPC calls, database queries, prompts, and other agents. | Hiring Assistant supervisor, Specialized sub-agents, LinkedIn services |
LinkedIn services |
Existing internal systems accessed by sub-agents through skills. | Specialized sub-agents, Skills registry |
Custom observability |
Agent-specific observability layer for production debugging and reliability. | Hiring Assistant supervisor, Python gRPC application framework |
Data flow
A recruiter describes a job and attaches supporting documents. Hiring Assistant generates qualifications, informs the recruiter that it will work in the background, then a supervisor agent coordinates sub-agents that use LinkedIn services through skills. Long-running work is modeled as agent-to-agent and user-to-agent messages with queue-based retry. Agents read and write scoped memory, discover skills from the registry, invoke them synchronously or asynchronously, and produce outputs that are surfaced back to the recruiter.
3 supporting quotes
Why this architecture
LinkedIn chose a Python-first framework because Java blocked rapid GenAI iteration with open-source tooling. It chose messaging, layered memory, and skills because production agents need asynchronous communication, ordered dependencies, and reusable access to internal services beyond local function calls.
3 supporting quotes
Models used: Azure OpenAI models · on-premises large language models · LangChain · LangGraph
Scale
- The platform is used by more than 20 teams.“we over 20 teams use this framework and I think this honestly probably a lower estimate at this point.”transcript, stated
- More than 30 services were created to support generative product experiences on LinkedIn.“over 30 services have been created to support Generi product experiences on LinkedIn.”transcript, stated
- LinkedIn uses many languages, making gRPC cross-language support important.“the just the native cross language features, which if you recall a couple slides earlier, um, we use uh a ton of languages.”transcript, stated
- LangGraph/LangChain enabled non-trivial applications in days instead of weeks.“we're able to build non-trivial apps in days down from weeks”transcript, stated
Alternatives considered (roads not taken)
Continue building GenAI applications primarily in Java
Rejected because: Teams wanted Python for prompt engineering, evaluations, libraries, and fast-changing GenAI techniques.
Let every team invent its own GenAI production patterns
Rejected because: LinkedIn wanted a default framework that removed guesswork and standardized production utilities.
Model long-running agent flows only as synchronous calls
Rejected because: Ambient agents take time, can fail, and need retryable user-agent and agent-agent communication.
Treat skills as only local function calls
Rejected because: LinkedIn needed skills to cover RPC calls, database queries, prompts, and other agents, including asynchronous invocation.
Patterns
multi-agent-orchestration (agent-architecture)
Hiring Assistant uses a supervisor agent to coordinate specialized sub-agents that interact with LinkedIn services.
async-message-orchestration (agent-architecture)
LinkedIn models ambient, long-running agent work as messaging, including user-to-agent and agent-to-agent messages with retry.
agent-memory (context-management)
The platform provides scoped/layered working, long-term, and collective memory for agents.
tool-use-orchestration (agent-architecture)
LinkedIn extends tool calling into centralized skills that can represent RPC calls, database queries, prompts, and other agents.
model-routing (model-operations)
The chat model interface lets teams switch between Azure OpenAI and on-prem LLMs with a few lines of code.
observability-tracing (operations)
LinkedIn built custom observability because agentic execution requires observability beyond ordinary service metrics.
durable-execution (reliability)
The messaging layer includes retry behavior for failed messages through a queue, supporting long-running ambient flows.
Tradeoffs
Adopt Python as the GenAI production language.
Chose Python for business logic, engineering, evaluation, and production GenAI apps over Continuing Java-first GenAI production services.
Rationale: Python aligned LinkedIn teams with the fast-moving GenAI ecosystem and reduced friction between experimentation and production.
Build a default framework instead of one-off team stacks.
Chose Standard Python/gRPC/LangChain/LangGraph framework over Each team deciding independently how to build production GenAI services.
Rationale: A default framework saved team time, removed guesswork, and standardized production utilities.
Use gRPC for the production framework.
Chose Python services with gRPC over A framework without built-in streaming, binary serialization, or cross-language support.
Rationale: Streaming, performance, and cross-language support mattered for LLM applications inside a polyglot LinkedIn environment.
Treat skills as synchronous and asynchronous enterprise capabilities.
Chose Central skills registry with sync/async invocation over Local synchronous function calls only.
Rationale: Ambient agents need to call services, prompts, databases, and other agents across team boundaries and over long-running flows.
Gotchas (what bit them)
Java production defaults slowed GenAI iteration.
Root cause: The open-source GenAI ecosystem, prompt engineering, and evaluations were Python-centered while LinkedIn's production business logic was Java-centered.
Resolution: LinkedIn adopted Python for GenAI business logic, engineering, evaluations, and production application development.
Long-running ambient agents cannot be modeled as simple request/response calls.
Root cause: Agents take time to process data and need to communicate with users and other agents asynchronously.
Resolution: LinkedIn extended its messaging infrastructure for user-agent and agent-agent communication, including queue-based retry.
Parallel agents need ordered coordination.
Root cause: Outputs from one agent may depend on outputs from another.
Resolution: LinkedIn built agent memory and messaging infrastructure to coordinate dependencies across agents.
Local-only function calling was too narrow for enterprise agents.
Root cause: Production agents needed access to existing services, database queries, prompts, and other agents across teams.
Resolution: LinkedIn centralized the skills concept in a registry so services can expose discoverable reusable skills.
Evaluation
LinkedIn evaluates the platform by organizational adoption, service creation, time-to-build improvements, production readiness concerns such as availability/reliability/observability, and the ability to support Hiring Assistant's ambient multi-agent workflow.
Metrics: More than 20 teams using the framework · Over 30 GenAI services created · Non-trivial apps built in days instead of weeks · Production concerns: availability, reliability, observability, and nondeterministic workload handling
4 supporting quotes
Outcomes
- LinkedIn shipped its first production agent, Hiring Assistant, for recruiter workflow automation.
- The Python GenAI framework was adopted by more than 20 teams and used to create more than 30 services.
- Teams could build non-trivial GenAI applications in days rather than weeks.
- The platform established reusable infrastructure for messaging, memory, skills, model abstraction, and custom observability.
The case reports more than 20 teams, over 30 GenAI services, a messaging system derived from infrastructure serving countless members daily, and a company-wide shift from Java-first to Python-first GenAI production development.