AI Engineer Summit 2025
Building enterprise LLM agents that work
Read the talk
Building enterprise LLM agents that work
Reliable enterprise agents require clear tool contracts, constrained orchestration, explicit human review, and evaluations that expose where a tool-using workflow fails.
From a talk by Shaan Desai
Before you start: Familiarity with LLM tool calling and retrieval-augmented generation will help; no particular agent framework is required.
How do the pieces become a reliable agent?
How do you turn a model, a collection of tools, and an orchestration framework into an agent that operates safely at enterprise scale? Customer support assistants, personal assistants, retrieval-augmented generation (RAG) agents, and financial analysis agents all face this integration problem. Each component may work individually while the complete workflow remains difficult to scale, secure, and operate smoothly.
The difficulty starts with the number of choices: frameworks, tools, models, orchestration strategies, and evaluation criteria must fit together in one pipeline. Shaan Desai’s experience at Cohere suggests a practical decision sequence: choose a framework you can debug, decide how much agent coordination the task needs, and establish how you will evaluate the resulting behavior.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Choose a framework you can debug
Frameworks such as AutoGen, CrewAI, and LangChain offer different tradeoffs. Three criteria make those tradeoffs concrete:
| Criterion | Practical question |
|---|---|
| Observability | Can you inspect, debug, and fix failures? |
| Setup cost | How quickly can you assemble the agent and iterate? |
| Support | Are the documentation, models, tools, and required features available? |
These criteria matter together: a quick initial setup is less valuable if resolving the first difficult failure becomes expensive.
For large enterprise agents with demanding observability requirements, Desai recommends a native implementation or LangGraph. For quick tests and proofs of concept, he recommends CrewAI and AutoGen because they reduce setup work and make it easy to combine prebuilt agents and tools. These are recommendations from the talk’s period, not a permanent ranking; AutoGen’s repository now carries a maintenance-mode notice.
Cohere’s approach is to keep improving integrations across frameworks as their capabilities evolve. The useful outcome is a spectrum of options suited to different applications, rather than one framework winning every use case. Once the framework is selected, the next decision is how to organize the agent itself.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Start with one agent and a clear tool contract
Single-agent execution, multi-agent coordination, and human feedback are explicit design choices. Start with a single LLM and a handful of tools. Before adding more agents, make the tools easier for that model to use. Desai identifies careful tool specifications as a substantial source of improvement.
One Cohere client had a long list of APIs whose specifications accepted up to 10–15 parameters. The request was to get a model to call those APIs successfully. The response was to simplify the interface presented to the model: write clear descriptions, provide precise examples of valid calls, and replace complex nested dictionaries with simpler inputs such as list, str, or float where appropriate. The parameter count describes that client’s problem; it is not a universal limit on reliable tool use.
Apply the same discipline to instructions. A short, direct list makes the required behavior easier to identify. Desai reports that long instruction sets can instead confuse the model and induce hallucinations. Adding more instructions is therefore not automatically a better specification.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Retrieve the history that matters
Conversation history creates a related problem. Desai reports hallucinations in long conversations across multiple models and frameworks, using conversations over 20 turns as an example rather than a universal cutoff. His recommendation is to cache the history and retrieve relevant portions when a new query needs them. The history remains available, but the model does not need every previous exchange in every request. Whether that improves a particular agent must be assessed through the evaluation process that follows.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Constrain routing before expanding autonomy
When the application does need multiple agents, the architecture becomes a collection of simpler agents coordinated by a router. AutoGen is one framework Desai cites for this orchestration. Robustness depends on three things working together: a capable routing model, good reasoning, and sub-agents with constrained responsibilities. Adding agents does not remove the need to specify their behavior.
The router needs clear tool descriptions and explicit routing instructions, including edge cases. Specify what happens when work moves from the router to a sub-agent and then onward to another agent. Those handoff instructions help the model choose the next stage instead of repeatedly attempting actions that do not advance the task.
Each sub-agent should own a specific, independent task and have a small set of tools with which to complete it. This preserves the simplicity of the single-agent design inside the larger system: coordination grows, but each participant’s responsibility remains narrow.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Make human review an execution rule
An agent’s ability to act autonomously creates a safety boundary. Consider a Gmail agent: before sending an email, it should ask the user to approve the proposed message. At that point, the email is still pending; proposing a send is not permission to execute it. Similar review requirements arise in HR support and financial analysis.
Human review can be triggered by codified rules. Rather than leaving intervention to chance, define the conditions under which the workflow must stop for a person.
Those rules can operate on either side of a tool call:
- Before execution: request permission for a proposed action, such as sending an email.
- After execution: review returned information before allowing the agent to process it further.
The second checkpoint serves a different purpose: it governs the use of a result, rather than authorizing an action that has already happened.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Evaluate the path to the answer
A successful agent must choose the right tool at the right time, pass accurate parameters, reason over executed results, and recover when something goes wrong. The user primarily cares about the final answer. The developer also needs to see the intermediate decisions that produced it, because a plausible answer alone does not reveal whether those decisions were correct.
The weather example makes those stages concrete. A user asks for the weather in New York City on February fifth. The intended workflow is:
- Select the appropriate weather tool.
- Pass the location and date as the required parameters.
- Receive the tool’s executed result.
- Interpret that result and produce the final response.
The example response says New York City will be mostly sunny; it illustrates the workflow, not a verified forecast. Each stage gives the developer a separate place to inspect a failure.
Cohere builds golden evaluation sets that record expectations across this entire path:
| Evaluation item | What it establishes |
|---|---|
| User query | The task presented to the agent |
| Expected function call | Which tool should be selected |
| Expected parameters | What inputs the tool should receive |
| Expected tool output | What result the agent should reason over |
| Expected final response | What the user should receive |
Running this corpus through the agent framework helps locate the stage where behavior diverges from expectations. A tool-selection failure calls for a different investigation from incorrect parameters or a final answer that misinterprets a correct tool result. This is why observability belongs in framework selection, not just in the debugging work added afterward.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Match mitigation to the observed failure
Autonomous agents do fail, so evaluation must lead to a repair strategy. For failures with low severity or low frequency, Desai recommends starting with prompt engineering: improve the tool API specifications and clarify the inputs. These changes can address remaining performance gaps without immediately changing the model.
For task-specific tool failures or hallucinations in the 10–20% range, Desai recommends building a targeted annotation dataset. This is a practical heuristic from Cohere’s experience, not a universal decision boundary. The talk does not specify how that dataset is subsequently used, so this step should not automatically be equated with fine-tuning.
For high failure rates, Cohere moves to a larger corpus built with synthetic data and fine-tunes the model. Desai particularly associates this approach with APIs that are difficult to call or have similar names that the model must disambiguate. The escalation runs from clarifying the existing contract to supplying more task-specific training material when the underlying difficulty persists.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Improve the model’s tool-calling ability
Framework design, orchestration, and failure mitigation sit alongside another line of work: improving the base model’s ability to call tools. Desai points to BFCL V3 as a benchmark for tool calling and describes Cohere’s performance there favorably. The claim remains qualitative here; it does not establish a numerical score or ranking.
Desai highlights a 7-billion-parameter model as part of the demand for lightweight tool-calling models. The model is unnamed in his spoken explanation. Its role in the architecture is clear, however: stronger tool calling at the model level complements the constraints and evaluations built around it.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
North brings the workflow into one product
North packages the preceding lessons from frameworks, agent design, and enterprise deployment. Desai describes the version presented in the talk as a single-container deployment with RAG, access to vector databases and search, and connections to applications including Gmail, Outlook, Drive, and Slack. The package is intended for both using and building agentic applications.
The closing demo connects North to Gmail, Slack, Salesforce, and Google Drive. A question about Salesforce opportunities initiates retrieval of a relevant document. The interface exposes what Desai calls a reasoning chain, along with the tools called and their outputs. The visible activity details sit above a tabular result, making the work behind the response available for inspection.
The next lookup concerns recent conversations. Desai describes Salesforce calls using SQL-like queries, then shows how a user can correct the tool choice. The correction leads the system to revise its approach and use Gmail to retrieve the relevant information. The substantive end of the demo is this repair loop: inspect the agent’s activity, identify an unsuitable tool selection, and redirect it toward the source the task actually requires.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Resources
From the talk
Explains multi-turn and multi-step tool-calling tasks and how execution states and required calls are evaluated.
Cohere's announcement of a workspace combining language models, search, and automation.
Stateful agent orchestration with persistence, human oversight, and debugging integrations.
Multi-agent application framework with examples and documentation; the repository now carries a maintenance-mode notice.
Python framework for collaborating agents and explicitly controlled workflows, with installation and example projects.
Official source repository and entry point to LangChain's agent development ecosystem.
Further reading
Model specifications, usage examples, tool-use capabilities, and access and licensing conditions for Cohere's 7B model.
Walkthrough of tool calls, application execution, returned results, and response generation using Cohere.
Read the complete timestamped transcript
- 0:02
Hello. My name is Shaan and I am a machine learning engineer here at Cohere. And today I'll be talking to you about building enterprise LLM agents that work.
- 0:16
So quick overview is that, uh, you know, we'll have an introduction. We'll discuss some of the frameworks and approaches that we're really excited about, and we'll also address some of the critical components around evaluation and failure mitigation for LLM agents.
- 0:31
And then ideally, hopefully bring all of these things together into a nice product overview.
- 0:38
So, you know, agents continue to be the most exciting application of generative AI today, with growing demand across a host of sectors, including customer support assistants, personal assistants, RAG agents, uh, as well as financial analyst agents.
- 0:57
However, any developer who's spent time building LLM agents knows that doing so in a scalable, safe and seamless way is actually a very difficult and challenging task.
- 1:12
You might ask, why is th- why is that so? Well, turns out there's a panacea of frameworks, tools, models, approaches, evaluation criteria to choose from and to effectively put together into one end-to-end pipeline.
- 1:30
So we really hope in this talk we can go through the critical decision-making process in setting up enterprise agents, really touching on the insights and key learnings we've had in building these agents.
- 1:43
From addressing the frameworks we love to discussing single versus multi-agent strategies, as well as addressing some of the critical components that are less discussed around evaluating LLM agents.
- 1:59
So let's start with frameworks. Now, over the past few years, there have been an increasing number of frameworks that have come into the market
- 2:11
from, uh, components such as AutoGen, CrewAI, as well as LangChain. Now, they all have, uh, their own, uh, benefits and disadvantages depending on a given use case.
- 2:26
But our core learning in the past year has really been to focus on three critical components, and those are observability, right? Is it easy to debug and fix? The second is the setup cost.
- 2:42
You know, how quickly can you iterate, uh, and resolve an issue, as well as build and piece together the entire, uh, agent you're interested in building? And then of course, lastly is support.
- 2:55
You know, is the framework well documented? Does it support various models and tools and functionalities? So we've often viewed these frameworks under these three criteria,
- 3:10
and generally, we tie these three criteria to a given use case. And more concretely, what this might look like is building large scale enterprise agents often requires high levels of ob-observability for which we would really recommend going native or building with LangGraph.
- 3:32
Now, of course, the space of frameworks is a continuously evolving, uh, landscape, and so this is a recommendation at this point in time. But we obviously expect this to change, uh, as frameworks continue their support to improve observability and ease of use.
- 3:52
And you know, in the same vein, what we recommend for quick tests and proof of concepts is frameworks like CrewAI and AutoGen. Uh, the reason for this is that there's generally a low setup uplift, uh, with low code, um, to get things working out of the box.
- 4:09
And of course they're easy to leverage, um, pre-existing or pre-built agents and tools and orchestrate them all together in a multi-agent setting. So these are our immediate recommendations. Of course, here at Cohere, we are continuously improving our integration support for these various frameworks and we hope to s-- and, you know, continue doing this support and watching this
- 4:32
space evolve. Um, and in part, what we're particularly excited about is seeing a sliding scale spectrum
- 4:43
across these various frameworks for different use cases. Um, okay. Now once you decide on which framework you want to use, of course you need to decide on the approach or the strategy that you plan to use this framework in, right?
- 5:00
Do you plan to use single agent? Do you plan to use multi-agent? Will you have human-in-the-loop feedback? Our core recommendation, and this is insights that have come from a number of use cases, is always start simple.
- 5:15
A single LLM with a handful of tools can often go a long way. But more importantly, being very, um, diligent about the tool specifications really helps uplift performance.
- 5:32
So what we found is, uh, you know, we worked with one of-- one client and one of their asks was, "Hey, we've got a long list of APIs, and these API specifications could take in up to ten to fifteen different parameters.
- 5:51
And could you get a model to successfully, uh, run tool calls, uh, for these tasks?" And what we have really found is to achieve the performance gains that they were trying to achieve We needed to really simplify the entire approach.
- 6:10
We need clear descriptions with very sharp examples on how to call the tool, as well as providing and simplifying the input type. So converting complex nested dictionaries into list, str, or fold types.
- 6:27
Now, in addition to these learnings, we've also found that providing a clear instruction list, ah, which is short, pithy, and to the point, goes a much longer way than providing a long set of instructions that can actually provide confusion to the model and induce potential, uh, hallucinations.
- 6:49
Um, furthermore, we found that long streams of chat history, in other words, back and forth conversations between the user and chatbot that go over twenty turns, for example, can induce certain hallucinations.
- 7:07
And this is true across a whole host of models and frameworks. Uh, to handle that particular problem, we really recommend caching. Essentially, caching that history and retrieving it whenever it is particularly relevant to a new user query can actually help your LLM agent, uh, achieve better performance through time.
- 7:29
And we'll get to what we mean by performance in some later slides. Now,
- 7:36
indeed, there are frameworks such as AutoGen that support multi-agent style orchestration. And so, you know, in, in multi-agent-- obviously in the multi-agent setting, it's a collection of simple agents tied together, and they have a routing model that decides which sub-agent to go to and retrieve information from.
- 7:58
There's been a growing interest in the industry to build multi-agents that are very robust and versatile. Of course, this requires a good routing model, good reasoning model, and of course, sub-agents that are well constrained.
- 8:14
And so what we've learned for the router is that it should really contain a list of tools with clear descriptions. That always holds. But it should also contain a sharp set of routing instructions that can encompass potential edge cases, right?
- 8:30
So if you're trying to route information from the router to a sub-agent and then back to another agent, providing that type of clarity and, and instruction to the model can really help it decide what it should do at each stage, rather than it autonomously and continuously trying to attempt things that may not be, uh, the most optimal
- 8:53
path to getting to the final answer. Of course, we also recommend that for sub-agents, they should be constrained to performing independent tasks with a small set of tools to return the final answer, right?
- 9:07
Each sub-agent should be decomposed into a specific task that it should handle. Um, so those are key insights we've had from building both simple and multi-agents in, uh, the enterprise setting.
- 9:21
And now the most important bit, right? Uh, we've glossed over the fact that agents can act quite autonomously to achieve final results. But we do think safety is paramount to any scalable real-world application, right?
- 9:38
Uh, and so-- and here are some examples. If we decide to use, um, if we decide to use a, um, Gmail agent, for example, we may want to request permission prior to sending emails, right?
- 9:53
We might want the user to get a, a pop-up that says, "Hey, are you okay with me sending this email?" Right? We don't want random emails to be sent, and this might be true in the HR support bot setting, as well as in the financial analysis agent setting.
- 10:10
What we've learned essentially is that incorporating human-in-the-loop is thus, like, really critical for business applications. And what's really nice about it is that you can codify a set of rules under which human-in-the-loop is triggered, right?
- 10:24
So under various criteria, we can force human-in-the-loop to be triggered, and typically this can happen before or right pri-- like right before a tool is called. But it could also happen right after a tool call is made, uh, especially if the execution output, for example, may contain various parts of information that you may not want to process
- 10:47
completely. Okay, great. So we've addressed frameworks, we've addressed various approaches we've explored and the insights we've gained. Now, importantly, we need to discuss evaluation.
- 11:02
How are we going to assess the performance of the agent, uh, that we've built? So, you know, what really makes a successful agent is a lot of things, right?
- 11:16
It's a lot of moving pieces that need to come together for it to be successful. Essentially, the model needs to make, uh, the, the right tool call at the right time.
- 11:26
Uh, the model needs to be able to essentially receive executed tool results and reason on top of it, and it needs to make tool calls very succinctly and accurately, passing the right input parameters, and it needs to have the ability to course correct even when things are going wrong, right?
- 11:43
So what's quite interesting here is for the final product or the end user, the only thing that particularly matters to them is the final product or the final answer they get from the agent.
- 11:55
But what does-- what matters most to, I think, developers as they're debugging and understanding how the LLM is making decisions, is not just the final output, but all the intermediate stages that go into getting to the final answer.
- 12:11
And so we have an example here where, for example, a user may ask a model to, uh, you know, uh, provide information about weather in New York City on February fifth.
- 12:24
Ideally, the model should decide to, you know, use a specific tool, pass in the right parameters, um, get a returned, uh, set of results from those tools and reason over the returned response to provide a final output, which is, you know, New York City will be mostly sunny, et cetera.
- 12:45
Now, as you can see, there are a number of intermediate stages that take place to get to the final response. And typically, what we do here at Cohere is we build a golden set of ground truth, uh, user queries, expected function calls, expected parameter inputs, expected outputs, as well as expected final
- 13:09
response. The nice thing about doing this and building this evaluation set is that we can run this large corpus of evaluations through our agentic framework and assess any critical points of failure or where we think the model may be going wrong.
- 13:26
And this makes debugging particularly easy from an evaluation standpoint.
- 13:32
Now, you might be asking why I've mentioned debugging and observability as very important. Well, it turns out that autonomous LLM agents do indeed have a tendency to fail, as most developers know.
- 13:47
And so we, we at Cohere are continuously exploring various failure mitigation strategies, right? And what we've really come and-- come down to is this, this table of insights. It's really short and simple, but it's essentially that if you're dealing with failures, uh, um, at, at a low severity or a low failure rate, what we found is actually
- 14:10
prompt engineering can go a really long way to im-- essentially just improving the quality of the tool API specs or the tool inputs can really help uplift the final, uh, mile, uh, on performance gaps.
- 14:25
However, if you do see a tool type failure or model hallucinating on specific, uh, task, uh, in the tw-- ten to twenty percent range, what we've really found is actually building a targeted annotation data set is really useful, uh, for closing the gap.
- 14:43
And lastly, and you know, perhaps most critically is if you are seeing a high failure rate, particularly if an API is very difficult to call or API names are very similar and you need to disambiguate between them, actually building a larger corpus using synthetic data and fine-tuning is the strategy that we employ here at Cohere.
- 15:07
So I've talked to you about frameworks, approaches, uh, value-- v-various, uh, evaluation criteria, and failure mitigation strategies. Uh, and what's quite nice here is that at Cohere, we're constantly working on developing and improving these various criteria.
- 15:26
And one way in which we do this is we are continuously improving the base model performance at tool calling. And as you can see here, we're particularly performant on, uh, BFCL V3, which is a standard evaluation criteria for single and multi-hop tool calling.
- 15:44
Um, and it's a really highly performant seven B model as there is a continued interest for really lightweight tool calling models. In addition to this, we're also codifying the whole host of insights.
- 15:58
So in essence, we're bringing together the learnings from the frameworks, approaches, and deployment-- deploying these models in the wild for agentic applications into a single product, a product we've termed North.
- 16:13
And essentially, it's a single container deployment that has access to RAG, has access to various vector DBs and search capacities, but also has connectivity to various applications of interest, including Gmail, Outlook, Drive, and Slack, to name a few.
- 16:33
So you can think of North as a one-stop shop for using and b- and building, uh, agentic applications as a single package.
- 16:46
So I even have a demo for you here from, uh, North, uh, and this is it in motion. Essentially, it's connected to Gmail, Slack, Salesforce, uh, and G Drive.
- 17:03
Question is asked about, uh, opportunities at Salesforce. The model invokes reasoning, uh, chains of thought. Essentially, uh, is able to pull the relevant document of interest, um, and essentially provide a, a breakdown of both the reasoning chain, the tools that were called, and the tool outputs, which is pretty nice
- 17:28
if you're hoping to debug and assess, uh, what the model is doing under the hood. Um, you can also then retrieve information from recent convers-conversations. Um, and ins-- essentially this would pull, again, both from Salesforce, uh, calls using a SQL-like style query, um, and you can also update, um, specific, uh, tool calling
- 17:53
capacities. For example, you could ask the model to correct which tool call was used, and [clears throat] ideally, what the model does is it updates its reasoning, and the package decides to then eventually use Gmail and return the relevant information.
- 18:11
So I hope this is an insightful, uh, talk, and hopefully, you've taken away some learnings about deploying enterprise LLM agents, uh, that we found particularly useful and have packaged into North.
- 18:27
Thank you.