LiteLLM proxy

If your services call models through a LiteLLM proxy, add one line to its config. Every model and every service behind the proxy is recorded, with no change to the services.

Add the callback

Install the Python recorder where the proxy runs, set the four AP_* settings in its environment, and add:

litellm_settings:
  callbacks: agentpulse.litellm_proxy.handler

AP_SERVICE sets the name the proxy records as; it is litellm-proxy if unset.

Say who each call is for

The proxy cannot see your services' context, so pass it on each request: LiteLLM's own user field, and these keys in its metadata:

Key What it is
agentpulse_request Your identifier for the end-user request.
agentpulse_workspace Your customer.
agentpulse_project A unit of work inside the customer.
agentpulse_user The user's identifier, if not in user.
agentpulse_user_name, agentpulse_user_email The user's name and email, stored once. Read only when agentpulse_user is set.
agentpulse_session, agentpulse_component, agentpulse_skill Session and the part of your product.

Budgets

The proxy checks your budgets before forwarding each call. A stopped call is answered with a 403, marked not to be retried. A budget set to downgrade sends the call to its cheaper model instead, when that model has the same provider. A warn-only budget past its limit lets the call through and alerts you. If Agent Pulse cannot answer, the proxy forwards the call.

The LiteLLM SDK

A service using the LiteLLM SDK instead registers the callback once:

litellm.callbacks = [reporter.litellm_callback()]

The SDK has no hook that can stop a call. To have a budget stop one, ask before the call, and name the provider unless the model runs on Vertex AI:

verdict = reporter.decide("gpt-4o", provider="OPENAI")
if verdict.proceed:
    response = litellm.completion(model="gpt-4o", messages=messages)