If an agent decides how many API calls to make, your cost ceiling is whatever the agent feels like today. Most days that's fine. The day a tool errors out and the chain retries its way around it, it isn't, and nothing in your logs will look wrong while it happens.

I maintain budget-guard, a small open source circuit breaker for LLM API bills. It has a LangChain.js adapter, and the whole integration is one callback handler:

import { ChatOpenAI } from '@langchain/openai';

import { BudgetGuardHandler } from 'budget-guard/langchain';

const handler = new BudgetGuardHandler({