在LiteLLM中接入AnalyticDB Supabase记录LLM调用
LiteLLM可统一调用多家大语言模型API,并通过回调将每次调用的元数据写入外部存储。云原生数据仓库AnalyticDB PostgreSQL版Supabase(以下简称AnalyticDB Supabase)可作为LLM调用日志与费用台账的落库目标:成功与失败请求均可记录,便于在SQL Editor或Table Editor中查询、统计与故障排查。本文介绍如何在AnalyticDB Supabase上建表、获取Project URL与service_role密钥、配置IP白名单,以及在应用中启用LiteLLM的Supabase回调。
AnalyticDB Supabase产品能力请参见Supabase,LiteLLM集成细节以LiteLLM官方文档为准。
适用场景
使用LiteLLM(Python SDK或LiteLLM Proxy)调用OpenAI、Azure、Anthropic等模型,需要将模型名、消息、响应、耗时、费用、错误信息等统一写入Postgres。
希望在Supabase Dashboard内用SQL做成本分析、按用户聚合用量、失败率分析。
LiteLLM应用或代理部署在公网或AnalyticDB Supabase相同VPC的环境。
前提条件
- 重要
免费测试项目仅适用于开发测试,不建议用于生产。生产环境请选用付费规格并做好容量与备份规划。
已明确发起LiteLLM请求的Runtime环境的IP,用于配置白名单。
运行环境可访问Supabase项目提供的Project URL(HTTPS)。若部署在阿里云VPC内,则使用VPC内的连接串地址。
操作步骤
步骤一:创建日志表
登录Supabase Dashboard,在侧边栏单击 SQL Editor ,执行以下DDL。您也可以选择使用MCP Server或CLI完成DDL操作。
列名需与下表一致(LiteLLM依赖固定字段写入)。
若使用非默认表名,需在应用侧配置自定义表名。
CREATE TABLE
public.request_logs (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
created_at TIMESTAMP WITH TIME ZONE NULL DEFAULT now(),
model TEXT NULL DEFAULT ''::TEXT,
messages JSON NULL DEFAULT '{}'::JSON,
response JSON NULL DEFAULT '{}'::JSON,
end_user TEXT NULL DEFAULT ''::TEXT,
status TEXT NULL DEFAULT ''::TEXT,
error JSON NULL DEFAULT '{}'::JSON,
response_time REAL NULL DEFAULT '0'::REAL,
total_cost REAL NULL,
additional_details JSON NULL DEFAULT '{}'::JSON,
litellm_call_id TEXT UNIQUE,
PRIMARY KEY (id)
) TABLESPACE pg_default;可选优化(按业务量)
对
created_at、model、end_user建立索引,加速按时间范围、模型、用户查询。数据量较大时,可结合分区、归档策略控制表规模与查询性能。
步骤二:获取Project URL与API Key
配置项 | 用途 | 获取方式(Supabase Dashboard) |
SUPABASE_URL | REST API根地址 |
|
SUPABASE_KEY(服务端) | 服务端绕过RLS写入日志表 |
|
若是VPC内使用,请登录云原生数据仓库AnalyticDB PostgreSQL版控制台,在左侧导航栏单击Supabase,然后单击目标Supabase Project进入详情页,在网络信息区域获取内网连接地址。
service_role密钥仅允许部署在服务端,禁止下发至浏览器、移动端、小程序或提交到公开代码仓库。
面向终端的客户端应使用anon key,与Row Level Security(RLS)策略配合,且不得与service_role混用。
步骤三:配置IP白名单
AnalyticDB Supabase对API访问通常配合IP白名单使用。若LiteLLM无法写入或HTTPS请求超时,应优先核对白名单。
登录云原生数据仓库AnalyticDB PostgreSQL版控制台,在左侧导航栏单击Supabase。
在目标项目所在行操作列,单击修改白名单,将LiteLLM运行环境的IP加入白名单。
多副本、多可用区或动态出口场景,需为每个实际出站地址配置白名单,或使用固定NAT或统一出口,避免遗漏。
步骤四:启用LiteLLM回调
设置环境变量。
export SUPABASE_URL="https://您的 Project URL" export SUPABASE_KEY="您的 service_role 密钥" export OPENAI_API_KEY="sk-..." # 或实际使用的模型厂商 Key配置回调。
建议同时启用success与failure回调,以便失败请求也落库,支撑错误分析与SLA统计。
方式一:Python SDK(服务端应用内直连模型)
在调用
litellm.completion(或acompletion等)的同一进程、第一次请求之前设置:import litellm from litellm import completion litellm.success_callback = ["supabase"] litellm.failure_callback = ["supabase"] response = completion( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "Hi"}], user="业务侧用户标识", # 写入表字段 end_user )方式二:LiteLLM Proxy(
litellm --config config.yaml)回调写在
config.yaml的litellm_settings中,与官方示例proxy_server_config.yaml中success_callback/failure_callback的位置一致。litellm_settings: success_callback: ["supabase"] failure_callback: ["supabase"]示例(在现有
model_list基础上增加litellm_settings)litellm_settings: success_callback: ["supabase"] failure_callback: ["supabase"] model_list: - model_name: gpt-3.5-turbo litellm_params: model: gpt-3.5-turbo api_key: os.environ/OPENAI_API_KEY启动
litellm --config config.yaml --port 8000
步骤五:验证数据写入
在Supabase Dashboard侧边栏,单击 SQL Editor ,执行以下语句:
SELECT id, created_at, model, end_user, status, total_cost, response_time
FROM public.request_logs
ORDER BY id DESC
LIMIT 20;若能查询到新产生的记录,说明LiteLLM → AnalyticDB Supabase REST API → Postgres链路正常。
自定义配置(可选)
自定义表名
默认写入表request_logs。若使用其它表名,在Python SDK中于调用前执行:
litellm.modify_integration("supabase", {"table_name": "您的表名"})使用Proxy时,若YAML未提供等价项,需查阅您所用LiteLLM版本是否支持Supabase表名配置,或通过自定义回调或启动脚本注入。无把握时建议先用默认表名request_logs。
终端用户标识(写入end_user)
接入方式 | 建议做法 |
Python SDK |
|
经Proxy的HTTP调用 | 使用与OpenAI Chat Completions兼容请求体中的 |
注意事项
合规与隐私:
messages、response等字段可能包含用户输入与模型输出,涉及个人信息或敏感内容时,应在业务层做脱敏、截断或访问控制,并遵守适用法律法规与内部数据分级要求。密钥轮换: 轮换service_role后需同步更新所有使用该密钥的服务端环境,避免写入中断。
网络与稳定性: 跨地域、跨境调用可能带来延迟与合规要求,建议LiteLLM与AnalyticDB Supabase同地域或就近部署(在满足业务与合规前提下)。
文档一致性: 请以LiteLLM官方文档中的SUPABASE_URL、SUPABASE_KEY及表结构为准。