litellm 钩子机制完整指南:4 步搭好请求预处理与响应后处理管道
2026/8/30 8:25:48 网站建设 项目流程

litellm 钩子机制完整指南:4 步搭好请求预处理与响应后处理管道

【免费下载链接】litellmThe fastest, litest AI Gateway. Rust core with Python SDK. Call 100+ LLM APIs in OpenAI (or native) format with cost tracking, guardrails, load balancing, and logging [Bedrock, Azure, OpenAI, Anthropic, OpenAI, VertexAI, vLLM, Nvidia NIM]项目地址: https://gitcode.com/GitHub_Trending/li/litellm

litellm 是一个让所有 LLM API 都用 OpenAI 格式调用的轻量网关,覆盖 100 多家模型提供商。它内置的钩子(hook)机制让你能在请求发出前和响应返回后插入自定义逻辑,完成敏感信息拦截、内容过滤、成本追踪这类横切需求,而不用改业务代码。

直接裸调 LLM 的三种风险

把用户输入原样丢给模型,听起来省事,但生产环境里三个问题很快会冒出来。

安全上,请求里可能夹带 API 密钥、内网 IP 这类敏感数据,一旦原样发给远端模型就是泄露。成本上,高峰期的突发流量没有削峰手段,要么打爆下游,要么超支。审计上,谁在什么时候用了什么模型、花了多少钱、说了什么话,事后无法追溯。

这三类压力分别对应请求发出前、响应回来后、全程记录三个时间点——正好是钩子机制的三个挂载位置。

钩子机制是怎么工作的

litellm 的钩子本质上继承自CustomLogger,注册后会在请求生命周期的固定节点被自动回调。请求进入时调用async_pre_call_hook,拿到用户鉴权信息、缓存句柄和完整请求体,这里抛异常就能直接拒绝请求。非流式响应成功后触发async_post_call_success_hook,流式响应则每个分片触发async_post_call_streaming_hook。也就是说,拦截逻辑和业务逻辑完全解耦:你只管实现方法,调用时机由框架托管。enterprise/enterprise_hooks/ 目录下的几个现成实现就是最好的参照样例。

钩子能解决的四类业务问题

🔐 防密钥泄露的拦截点

最危险的泄露往往发生在请求侧:用户误把密钥贴进了对话。enterprise/litellm_enterprise/enterprise_callbacks/secret_detection.py 里的async_pre_call_hook会在请求真正发往模型之前扫描内容,命中 API 密钥等敏感模式时直接阻断,把泄露挡在出口之外。

内容合规过滤

对外服务通常有内容红线,输入和输出都要管。enterprise/enterprise_hooks/banned_keywords.py 是一个双保险示例:async_pre_call_hook检查输入文本,async_post_call_success_hook检查完整回复,命中违禁词统一返回 400。它还会检查发起调用的user_id是否在 blocked_user_list 中,把"禁止特定用户调用"也收在同一个钩子里。

流量削峰与授权把关

限流和授权检查放在async_pre_call_hook里做最合适——此时请求尚未消耗任何下游资源。结合 tests/local_testing/test_tpm_rpm_routing_v2.py 里的 TP/RPM 路由用例,可以在超限时提前拒绝或排队,而不是等模型侧报错。配合用户级阻止列表,钩子同时承担了"谁能调"和"能调多少"两个把关动作。

成本与性能追踪

响应侧钩子天然是记账点:拿到最终ModelResponse后,token 数、耗时、模型、花费都在手上。想接入外部追踪时,litellm/integrations/langfuse/ 目录提供了现成的 Langfuse 回调,把每次调用连同输入输出、耗时、token 用量一起上报,排查"这次为什么慢/贵"时直接看 trace 就行。

四步写出你自己的钩子

① 新建钩子文件。在业务代码里建一个custom_hooks.py,定义一个继承CustomLogger的类。这一步的作用是把你的拦截逻辑独立成一个可注册模块。

② 实现钩子方法。按需覆写方法:只在发请求前拦截就只写async_pre_call_hook;要检查回复就加async_post_call_success_hook;流式场景必须写async_post_call_streaming_hook。每个方法只描述"在什么条件下手、命中后做什么(抛异常拒绝或静默放行)"。

③ 配置注册。在 litellm 的配置里声明你的回调,相关参数(如违禁词列表、阻止名单)通过litellm.xxx全局变量注入。这一步决定钩子何时被框架加载。

④ 重启验证。重启代理后用一条必然触发规则的请求测试:该拒的返回 400,不该拒的正常出结果。验证点就两个——命中路径和放行路径。

选型建议与常见疑问

流式响应该挂哪个钩子?async_post_call_success_hook无效,流式调用不会走它。必须用async_post_call_streaming_hook,但要清楚它的入参是单个分片文本,适合做逐段检测,不适合需要完整上下文的判断——此时可以攒齐分片后再校验。

敏感词过滤什么时候开?面向公众的入口建议双向都开(输入 + 输出);内部工具通常只开输入侧即可。注意过滤词表支持直接传列表或指向文件路径两种方式,改词表不必发版。

要不要接 Langfuse 这类工具?只要你需要回答"这次调用谁发起的、哪个模型、花了多少",就值得接。它是回调(callback)而非钩子,与拦截类钩子互不干扰,可以同时启用。

收尾

钩子机制让 litellm 从"统一的调用层"变成"统一的管控层":拦什么、记什么,都由你在几个方法里说了算。

git clone https://gitcode.com/GitHub_Trending/li/litellm

配置细节参考仓库内 docs/ 官方文档,动手前建议先通读 enterprise/enterprise_hooks/ 里的四个现成实现。

【免费下载链接】litellmThe fastest, litest AI Gateway. Rust core with Python SDK. Call 100+ LLM APIs in OpenAI (or native) format with cost tracking, guardrails, load balancing, and logging [Bedrock, Azure, OpenAI, Anthropic, OpenAI, VertexAI, vLLM, Nvidia NIM]项目地址: https://gitcode.com/GitHub_Trending/li/litellm

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询