日志记录
使用以下工具记录代理的输入、输出和异常:
- Langfuse
- OpenTelemetry
- 自定义回调
- Langsmith
- DataDog
- DynamoDB
- 等等
获取 LiteLLM 调用 ID
LiteLLM 为每个请求生成一个唯一的 call_id。这个 call_id 可以用来在整个系统中跟踪请求。这对于在日志系统中查找特定请求的信息非常有用,例如本页中提到的系统之一。
curl -i -sSL --location 'http://0.0.0.0:4000/chat/completions' \
--header 'Authorization: Bearer sk-1234' \
--header 'Content-Type: application/json' \
--data '{
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": "what llm are you"}]
}' | grep 'x-litellm'
输出结果为:
x-litellm-call-id: b980db26-9512-45cc-b1da-c511a363b83f
x-litellm-model-id: cb41bc03f4c33d310019bae8c5afdb1af0a8f97b36a234405a9807614988457c
x-litellm-model-api-base: https://x-example-1234.openai.azure.com
x-litellm-version: 1.40.21
x-litellm-response-cost: 2.85e-05
x-litellm-key-tpm-limit: None
x-litellm-key-rpm-limit: None
这些头信息中有许多对故障排除有用,但 x-litellm-call-id 是用于在整个系统的各个组件中跟踪请求的最有用的信息,包括在日志工具中。
用户API密钥信息的脱敏
从日志中脱敏用户API密钥信息(哈希令牌、用户ID、团队ID等)。
目前支持 Langfuse、OpenTelemetry、Logfire、ArizeAI 日志记录。
litellm_settings:
callbacks: ["langfuse"]
redact_user_api_key_info: true
从元数据中移除任何带有 user_api_key_* 的字段。
日志记录的内容是什么?标准日志记录负载
在 kwargs["standard_logging_object"] 下找到。这是一个标准负载,记录每个响应。
class StandardLoggingPayload(TypedDict):
id: str
call_type: str
response_cost: float
total_tokens: int
prompt_tokens: int
completion_tokens: int
startTime: float
endTime: float
completionStartTime: float
model_map_information: StandardLoggingModelInformation
model: str
model_id: Optional[str]
model_group: Optional[str]
api_base: str
metadata: StandardLoggingMetadata
cache_hit: Optional[bool]
cache_key: Optional[str]
saved_cache_cost: Optional[float]
request_tags: list
end_user: Optional[str]
requester_ip_address: Optional[str] # 请求者的IP地址
requester_metadata: Optional[dict] # 在请求的“metadata”字段中传递的元数据
messages: Optional[Union[str, list, dict]]
response: Optional[Union[str, list, dict]]
model_parameters: dict
hidden_params: StandardLoggingHiddenParams
class StandardLoggingHiddenParams(TypedDict):
model_id: Optional[str]
cache_key: Optional[str]
api_base: Optional[str]
response_cost: Optional[str]
additional_headers: Optional[dict]
class StandardLoggingModelInformation(TypedDict):
model_map_key: str
model_map_value: Optional[ModelInfo]
日志记录代理输入/输出 - Langfuse
我们将使用 --config 来设置 litellm.success_callback = ["langfuse"],这将把所有成功的 LLM 调用记录到 Langfuse。确保在环境中设置 LANGFUSE_PUBLIC_KEY 和 LANGFUSE_SECRET_KEY。
步骤1 安装 Langfuse
pip install langfuse>=2.0.0
步骤2:创建一个 config.yaml 文件并设置 litellm_settings:success_callback
model_list:
- model_name: gpt-3.5-turbo
litellm_params:
model: gpt-3.5-turbo
litellm_settings:
success_callback: ["langfuse"]
步骤3:设置将日志记录到 Langfuse 所需的环境变量
export LANGFUSE_PUBLIC_KEY="pk_kk"
export LANGFUSE_SECRET_KEY="sk_ss"
# 可选,默认为 https://cloud.langfuse.com
export LANGFUSE_HOST="https://xxx.langfuse.com"
步骤4:启动代理,进行测试请求
启动代理
litellm --config config.yaml --debug
测试请求
litellm --test
Langfuse 上的预期输出
将元数据记录到 Langfuse
- Curl 请求
- OpenAI v1.0.0+
在请求体中传递 metadata
curl --location 'http://0.0.0.0:4000/chat/completions' \
--header 'Content-Type: application/json' \
--data '{
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "what llm are you"
}
],
"metadata": {
"generation_name": "ishaan-test-generation",
"generation_id": "gen-id22",
"trace_id": "trace-id22",
"trace_user_id": "user-id2"
}
}'
设置 extra_body={"metadata": { }} 为你想要传递的 metadata
openai.Completion.create(
model="gpt-3.5-turbo",
prompt="what llm are you",
extra_body={"metadata": {
"generation_name": "ishaan-test-generation",
"generation_id": "gen-id22",
"trace_id": "trace-id22",
"trace_user_id": "user-id2"
}}
)
请求发送到由 litellm 代理设置的模型,litellm --model
response = client.chat.completions.create( model="gpt-3.5-turbo", messages = [ { "role": "user", "content": "这是一个测试请求,写一首短诗" } ], extra_body={ "metadata": { "generation_name": "ishaan-generation-openai-client", "generation_id": "openai-client-gen-id22", "trace_id": "openai-client-trace-id22", "trace_user_id": "openai-client-user-id2" } } )
print(response)
### 基于团队的日志记录到Langfuse
[👉 教程 - 允许每个团队使用自己的Langfuse项目/自定义回调](team_logging)
### 从Langfuse日志记录中屏蔽消息和响应内容
设置 `litellm.turn_off_message_logging=True` 这将阻止消息和响应被记录到Langfuse,但请求元数据仍将被记录。
```yaml
model_list:
- model_name: gpt-3.5-turbo
litellm_params:
model: gpt-3.5-turbo
litellm_settings:
success_callback: ["langfuse"]
turn_off_message_logging: True
如果启用了此功能,您可以通过设置请求头 LiteLLM-Disable-Message-Redaction: true 来覆盖特定请求。
curl --location 'http://0.0.0.0:4000/chat/completions' \
--header 'Content-Type: application/json' \
--header 'LiteLLM-Disable-Message-Redaction: true' \
--data '{
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "what llm are you"
}
]
}'
特定于LiteLLM的Langfuse标签 - cache_hit, cache_key
如果您想控制哪些LiteLLM特定的字段被LiteLLM代理记录为标签,请使用此功能。默认情况下,LiteLLM代理不记录任何LiteLLM特定的字段。
| LiteLLM特定字段 | 描述 | 示例值 |
|---|---|---|
cache_hit | 指示是否发生了缓存命中(True)或未命中(False) | true, false |
cache_key | 用于此请求的缓存键 | d2b758c**** |
proxy_base_url | 代理服务器的基URL,服务器上PROXY_BASE_URL环境变量的值 | https://proxy.example.com |
user_api_key_alias | LiteLLM虚拟键的别名。 | prod-app1 |
user_api_key_user_id | 与用户API密钥关联的唯一ID。 | user_123, user_456 |
user_api_key_user_email | 与用户API密钥关联的电子邮件。 | user@example.com, admin@example.com |
user_api_key_team_alias | 与API密钥关联的团队的别名。 | team_alpha, dev_team |
用法
指定 langfuse_default_tags 以控制哪些litellm字段被记录在Langfuse上。
示例 config.yaml
model_list:
- model_name: gpt-4
litellm_params:
model: openai/fake
api_key: fake-key
api_base: https://exampleopenaiendpoint-production.up.railway.app/
litellm_settings:
success_callback: ["langfuse"]
# 👇 关键变化
langfuse_default_tags: ["cache_hit", "cache_key", "proxy_base_url", "user_api_key_alias", "user_api_key_user_id", "user_api_key_user_email", "user_api_key_team_alias", "semantic-similarity", "proxy_base_url"]
🔧 调试 - 查看从LiteLLM发送给提供者的RAW CURL请求
当你想要查看从LiteLLM发送给LLM API的RAW curl请求时,使用此功能。
- Curl请求
- OpenAI v1.0.0+
- Langchain
在请求体中传递metadata
curl --location 'http://0.0.0.0:4000/chat/completions' \
--header 'Content-Type: application/json' \
--data '{
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "what llm are you"
}
],
"metadata": {
"log_raw_request": true
}
}'
设置extra_body={"metadata": {"log_raw_request": True }}为你要传递的metadata
import openai
client = openai.OpenAI(
api_key="anything",
base_url="http://0.0.0.0:4000"
)
# 请求发送到litellm代理上设置的模型,`litellm --model`
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages = [
{
"role": "user",
"content": "this is a test request, write a short poem"
}
],
extra_body={
"metadata": {
"log_raw_request": True
}
}
)
print(response)
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
ChatPromptTemplate,
HumanMessagePromptTemplate,
SystemMessagePromptTemplate,
)
from langchain.schema import HumanMessage, SystemMessage
chat = ChatOpenAI(
openai_api_base="http://0.0.0.0:4000",
model = "gpt-3.5-turbo",
temperature=0.1,
extra_body={
"metadata": {
"log_raw_request": True
}
}
)
messages = [
SystemMessage(
content="You are a helpful assistant that im using to make a test request to."
),
HumanMessage(
content="test from litellm. tell me why it's amazing in 1 sentence"
),
]
response = chat(messages)
print(response)
预期输出在Langfuse中
你将在Langfuse元数据中看到raw_request。这是从LiteLLM发送到你的LLM API提供者的RAW CURL命令
以OpenTelemetry格式记录代理的输入/输出
[可选] 通过在你的环境中设置以下变量来自定义OTEL服务名称和OTEL跟踪器名称
OTEL_TRACER_NAME=<your-trace-name> # 默认="litellm"
OTEL_SERVICE_NAME=<your-service-name>` # 默认="litellm"
- 记录到控制台
- 记录到Honeycomb
- 记录到Traceloop云
- 记录到 OTEL HTTP 收集器
- 记录到 OTEL GRPC 收集器
步骤1: 设置回调和环境变量
将以下内容添加到你的环境变量中
OTEL_EXPORTER="console"
在litellm_config.yaml中添加otel作为回调
litellm_settings:
callbacks: ["otel"]
步骤2: 启动代理,进行测试请求
启动代理
litellm --config config.yaml --detailed_debug
测试请求
curl --location 'http://0.0.0.0:4000/chat/completions' \
--header 'Content-Type: application/json' \
--data ' {
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "what llm are you"
}
]
}'
步骤3: 预期在你的服务器日志/控制台中看到以下内容
这是OTEL日志中的Span
{
"name": "litellm-acompletion",
"context": {
"trace_id": "0x8d354e2346060032703637a0843b20a3",
"span_id": "0xd8d3476a2eb12724",
"trace_state": "[]"
},
"kind": "SpanKind.INTERNAL",
"parent_id": null,
"start_time": "2024-06-04T19:46:56.415888Z",
"end_time": "2024-06-04T19:46:56.790278Z",
"status": {
"status_code": "OK"
},
"attributes": {
"model": "llama3-8b-8192"
},
"events": [],
"links": [],
"resource": {
"attributes": {
"service.name": "litellm"
},
"schema_url": ""
}
}
快速开始 - 记录到Honeycomb
步骤1: 设置回调和环境变量
将以下内容添加到你的环境变量中
OTEL_EXPORTER="otlp_http"
OTEL_ENDPOINT="https://api.honeycomb.io/v1/traces"
OTEL_HEADERS="x-honeycomb-team=<your-api-key>"
在litellm_config.yaml中添加otel作为回调
litellm_settings:
callbacks: ["otel"]
步骤2: 启动代理,进行测试请求
启动代理
litellm --config config.yaml --detailed_debug
测试请求
curl --location 'http://0.0.0.0:4000/chat/completions' \
--header 'Content-Type: application/json' \
--data ' {
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "what llm are you"
}
]
}'
快速开始 - 记录到Traceloop
步骤1: 将以下内容添加到你的环境变量中
OTEL_EXPORTER="otlp_http"
OTEL_ENDPOINT="https://api.traceloop.com"
OTEL_HEADERS="Authorization=Bearer%20<your-api-key>"
第二步: 添加 otel 作为回调
litellm_settings:
callbacks: ["otel"]
第三步: 启动代理,进行测试请求
启动代理
litellm --config config.yaml --detailed_debug
测试请求
curl --location 'http://0.0.0.0:4000/chat/completions' \
--header 'Content-Type: application/json' \
--data ' {
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "what llm are you"
}
]
}'
快速开始 - 记录到 OTEL 收集器
第一步: 设置回调和环境变量
将以下内容添加到你的环境中
OTEL_EXPORTER="otlp_http"
OTEL_ENDPOINT="http:/0.0.0.0:4317"
OTEL_HEADERS="x-honeycomb-team=<your-api-key>" # 可选
在你的 litellm_config.yaml 中添加 otel 作为回调
litellm_settings:
callbacks: ["otel"]
第二步: 启动代理,进行测试请求
启动代理
litellm --config config.yaml --detailed_debug
测试请求
curl --location 'http://0.0.0.0:4000/chat/completions' \
--header 'Content-Type: application/json' \
--data ' {
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "what llm are you"
}
]
}'
快速开始 - 记录到 OTEL GRPC 收集器
第一步: 设置回调和环境变量
将以下内容添加到你的环境中
OTEL_EXPORTER="otlp_grpc"
OTEL_ENDPOINT="http:/0.0.0.0:4317"
OTEL_HEADERS="x-honeycomb-team=<your-api-key>" # 可选
在你的 litellm_config.yaml 中添加 otel 作为回调
litellm_settings:
callbacks: ["otel"]
第二步: 启动代理,进行测试请求
启动代理
litellm --config config.yaml --detailed_debug
测试请求
curl --location 'http://0.0.0.0:4000/chat/completions' \
--header 'Content-Type: application/json' \
--data ' {
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "what llm are you"
}
]
}'
🎉 期待在你的 OTEL 收集器中看到这条记录的踪迹
从 OTEL 日志中屏蔽消息和响应内容
将 message_logging 设置为 False 以禁用 otel 的消息和响应日志记录
litellm_settings:
callbacks: ["otel"]
## 👇 关键更改
callback_settings:
otel:
message_logging: False
跨服务的上下文传播 Traceparent HTTP Header
❓ 当你想要在分布式追踪系统中传递有关传入请求的信息时使用此功能
✅ 关键更改:在请求中传递 traceparent 头。在这里阅读更多关于 traceparent 头的信息
traceparent: 00-80e1afed08e019fc1110464cfa66635c-7a085853722dc6d2-01
示例用法
- 使用
traceparent头向 LiteLLM 代理发出请求
import openai
import uuid
client = openai.OpenAI(api_key="sk-1234", base_url="http://0.0.0.0:4000")
example_traceparent = f"00-80e1afed08e019fc1110464cfa66635c-02e80198930058d4-01"
extra_headers = {
"traceparent": example_traceparent
}
_trace_id = example_traceparent.split("-")[1]
print("EXTRA HEADERS: ", extra_headers)
print("Trace ID: ", _trace_id)
response = client.chat.completions.create(
model="llama3",
messages=[
{"role": "user", "content": "this is a test request, write a short poem"}
],
extra_headers=extra_headers,
)
print(response)
# EXTRA HEADERS: {'traceparent': '00-80e1afed08e019fc1110464cfa66635c-02e80198930058d4-01'}
# Trace ID: 80e1afed08e019fc1110464cfa66635c
- 在 OTEL 记录器上查找 Trace ID
在你的 OTEL 收集器上搜索 Trace=80e1afed08e019fc1110464cfa66635c
将 Traceparent HTTP Header 转发到 LLM API
如果你想要将 traceparent 头转发到自托管的 LLM(如 vLLM),请使用此功能
在你的 config.yaml 中设置 forward_traceparent_to_llm_provider: True。这将把 traceparent 头转发到你的 LLM API
:::警告
仅对自托管的 LLM 使用此功能,这可能导致 Bedrock、VertexAI 调用失败
:::
litellm_settings:
forward_traceparent_to_llm_provider: True
自定义回调类 [异步]
当你想要在 python 中运行自定义回调时使用此功能
第一步 - 创建你的自定义 litellm 回调类
我们为此使用 litellm.integrations.custom_logger,更多关于 litellm 自定义回调的详细信息 在这里
在 python 文件中定义你的自定义回调类。
以下是一个自定义日志记录器的示例,用于跟踪 key, user, model, prompt, response, tokens, cost。我们创建了一个名为 custom_callbacks.py 的文件,并初始化了 proxy_handler_instance。
from litellm.integrations.custom_logger import CustomLogger
import litellm
# 该文件包含了 LiteLLM Proxy 的自定义回调
# 一旦定义,这些回调可以在 proxy_config.yaml 中传递
class MyCustomHandler(CustomLogger):
def log_pre_api_call(self, model, messages, kwargs):
print(f"Pre-API Call")
def log_post_api_call(self, kwargs, response_obj, start_time, end_time):
print(f"Post-API Call")
def log_stream_event(self, kwargs, response_obj, start_time, end_time):
print(f"On Stream")
def log_success_event(self, kwargs, response_obj, start_time, end_time):
print("On Success")
def log_failure_event(self, kwargs, response_obj, start_time, end_time):
print(f"On Failure")
async def async_log_success_event(self, kwargs, response_obj, start_time, end_time):
print(f"On Async Success!")
# 日志记录: key, user, model, prompt, response, tokens, cost
# 访问传递给 litellm.completion() 的 kwargs
model = kwargs.get("model", None)
messages = kwargs.get("messages", None)
user = kwargs.get("user", None)
# 访问传递给 litellm.completion() 的 litellm_params,例如访问 `metadata`
litellm_params = kwargs.get("litellm_params", {})
metadata = litellm_params.get("metadata", {}) # 传递给 LiteLLM proxy 的 headers,可以在这里找到
# 使用 litellm.completion_cost() 计算成本
cost = litellm.completion_cost(completion_response=response_obj)
response = response_obj
# 响应中使用的 tokens
usage = response_obj["usage"]
print(
f"""
Model: {model},
Messages: {messages},
User: {user},
Usage: {usage},
Cost: {cost},
Response: {response}
Proxy Metadata: {metadata}
"""
)
return
async def async_log_failure_event(self, kwargs, response_obj, start_time, end_time):
try:
print(f"On Async Failure !")
print("\nkwargs", kwargs)
# 访问传递给 litellm.completion() 的 kwargs
model = kwargs.get("model", None)
messages = kwargs.get("messages", None)
user = kwargs.get("user", None)
# 访问传递给 litellm.completion() 的 litellm_params,例如访问 `metadata`
litellm_params = kwargs.get("litellm_params", {})
metadata = litellm_params.get("metadata", {}) # 传递给 LiteLLM proxy 的 headers,可以在这里找到
# 访问异常和回溯
exception_event = kwargs.get("exception", None)
traceback_event = kwargs.get("traceback_exception", None)
# 使用 litellm.completion_cost() 计算成本
cost = litellm.completion_cost(completion_response=response_obj)
print("now checking response obj")
print(
f"""
Model: {model},
Messages: {messages},
User: {user},
Cost: {cost},
Response: {response_obj}
Proxy Metadata: {metadata}
Exception: {exception_event}
Traceback: {traceback_event}
"""
)
except Exception as e:
print(f"Exception: {e}")
proxy_handler_instance = MyCustomHandler()
# 在代理上设置 litellm.callbacks = [proxy_handler_instance]
# 需要设置 litellm.callbacks = [proxy_handler_instance] # 在代理上
第二步 - 在 config.yaml 中传递自定义回调类
我们将 第一步 中定义的自定义回调类传递给 config.yaml。
设置 callbacks 为 python_filename.logger_instance_name
在下面的配置中,我们传递
- python_filename:
custom_callbacks.py - logger_instance_name:
proxy_handler_instance。这在第一步中定义
callbacks: custom_callbacks.proxy_handler_instance
model_list:
- model_name: gpt-3.5-turbo
litellm_params:
model: gpt-3.5-turbo
litellm_settings:
callbacks: custom_callbacks.proxy_handler_instance # 设置 litellm.callbacks = [proxy_handler_instance]
第三步 - 启动代理 + 测试请求
litellm --config proxy_config.yaml
curl --location 'http://0.0.0.0:4000/chat/completions' \
--header 'Authorization: Bearer sk-1234' \
--data ' {
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "good morning good sir"
}
],
"user": "ishaan-app",
"temperature": 0.2
}'
代理上的最终日志
Model: gpt-3.5-turbo,
Messages: [{"role": "user", "content": "good morning good sir"}],
User: ishaan-app,
Usage: {"prompt_tokens": 10, "completion_tokens": 5, "total_tokens": 15},
Cost: 0.0001,
Response: {"id": "chatcmpl-123", "object": "chat.completion", "created": 1677652288, "model": "gpt-3.5-turbo", "usage": {"prompt_tokens": 10, "completion_tokens": 5, "total_tokens": 15}, "choices": [{"message": {"role": "assistant", "content": "Good morning!"}, "finish_reason": "stop", "index": 0}]},
Proxy Metadata: {"x-request-id": "12345", "x-api-key": "sk-1234"}
成功
模型: gpt-3.5-turbo,
消息: [{'角色': '用户', '内容': '早上好,先生'}],
用户: ishaan-app,
使用情况: {'完成令牌': 10, '提示令牌': 11, '总令牌': 21},
成本: 3.65e-05,
响应: {'id': 'chatcmpl-8S8avKJ1aVBg941y5xzGMSKrYCMvN', '选择': [{'完成原因': '停止', '索引': 0, '消息': {'内容': '早上好!今天我能为您提供什么帮助?', '角色': '助手'}}], '创建': 1701716913, '模型': 'gpt-3.5-turbo-0613', '对象': '聊天.完成', '系统指纹': None, '使用情况': {'完成令牌': 10, '提示令牌': 11, '总令牌': 21}}
代理元数据: {'用户API密钥': None, '头': 头({'主机': '0.0.0.0:4000', '用户代理': 'curl/7.88.1', '接受': '*/*', '授权': '承载者 sk-1234', '内容长度': '199', '内容类型': 'application/x-www-form-urlencoded'}), '模型组': 'gpt-3.5-turbo', '部署': 'gpt-3.5-turbo-模型ID-gpt-3.5-turbo'}
记录代理请求的对象、标头、URL
以下是如何访问每次请求发送到代理的url、headers、请求体的方法
class MyCustomHandler(CustomLogger):
async def async_log_success_event(self, kwargs, response_obj, start_time, end_time):
print(f"On Async Success!")
litellm_params = kwargs.get("litellm_params", None)
proxy_server_request = litellm_params.get("proxy_server_request")
print(proxy_server_request)
预期输出
{
"url": "http://testserver/chat/completions",
"method": "POST",
"headers": {
"host": "testserver",
"accept": "*/*",
"accept-encoding": "gzip, deflate",
"connection": "keep-alive",
"user-agent": "testclient",
"authorization": "Bearer None",
"content-length": "105",
"content-type": "application/json"
},
"body": {
"model": "Azure OpenAI GPT-4 Canada",
"messages": [
{
"role": "user",
"content": "hi"
}
],
"max_tokens": 10
}
}
记录在config.yaml中设置的model_info
以下是如何记录在代理config.yaml中设置的model_info的方法。有关在config.yaml中设置model_info的信息
class MyCustomHandler(CustomLogger):
async def async_log_success_event(self, kwargs, response_obj, start_time, end_time):
print(f"On Async Success!")
litellm_params = kwargs.get("litellm_params", None)
model_info = litellm_params.get("model_info")
print(model_info)
预期输出
{'mode': 'embedding', 'input_cost_per_token': 0.002}
记录来自代理的响应
/chat/completions和/embeddings的响应都作为response_obj可用
注意:对于/chat/completions,stream=True和non stream的响应都作为response_obj可用
class MyCustomHandler(CustomLogger):
async def async_log_success_event(self, kwargs, response_obj, start_time, end_time):
print(f"On Async Success!")
print(response_obj)
预期输出 /chat/completion [适用于stream和non-stream响应]
ModelResponse(
id='chatcmpl-8Tfu8GoMElwOZuj2JlHBhNHG01PPo',
choices=[
Choices(
finish_reason='stop',
index=0,
message=Message(
content='作为AI语言模型,我没有物理身体,因此没有任何学位或教育资格。我的知识和能力来自于我的创造者开发的编程和算法。',
role='assistant'
)
)
],
created=1702083284,
model='chatgpt-v-2',
object='chat.completion',
system_fingerprint=None,
usage=Usage(
completion_tokens=42,
prompt_tokens=5,
total_tokens=47
)
)
预期输出 /embeddings
{
'model': 'ada',
'data': [
{
'embedding': [
-0.035126980394124985, -0.020624293014407158, -0.015343423001468182,
-0.03980357199907303, -0.02750781551003456, 0.02111034281551838,
-0.022069307044148445, -0.019442008808255196, -0.00955679826438427,
-0.013143060728907585, 0.029583381488919258, -0.004725852981209755,
-0.015198921784758568, -0.014069183729588985, 0.00897879246622324,
0.01521205808967352,
# ... (为简洁起见,省略部分内容)
]
}
]
}
自定义回调API [异步]
这是一项仅限企业的功能 在此处开始使用企业版
如果你想:
- 使用非Python编程语言编写的自定义回调
- 希望你的回调在不同的微服务上运行
第一步:创建你的通用日志记录API端点
设置一个可以接收JSON格式数据的通用API端点。数据将包含在一个"data"字段中。
你的服务器应支持以下请求格式:
curl --location https://your-domain.com/log-event \
--request POST \
--header "Content-Type: application/json" \
--data '{
"data": {
"id": "chatcmpl-8sgE89cEQ4q9biRtxMvDfQU1O82PT",
"call_type": "acompletion",
"cache_hit": "None",
"startTime": "2024-02-15 16:18:44.336280",
"endTime": "2024-02-15 16:18:45.045539",
"model": "gpt-3.5-turbo",
"user": "ishaan-2",
"modelParameters": "{'temperature': 0.7, 'max_tokens': 10, 'user': 'ishaan-2', 'extra_body': {}}",
"messages": "[{'role': 'user', 'content': 'This is a test'}]",
"response": "ModelResponse(id='chatcmpl-8sgE89cEQ4q9biRtxMvDfQU1O82PT', choices=[Choices(finish_reason='length', index=0, message=Message(content='Great! How can I assist you with this test', role='assistant'))], created=1708042724, model='gpt-3.5-turbo-0613', object='chat.completion', system_fingerprint=None, usage=Usage(completion_tokens=10, prompt_tokens=11, total_tokens=21))",
"usage": "Usage(completion_tokens=10, prompt_tokens=11, total_tokens=21)",
"metadata": "{}",
"cost": "3.65e-05"
}
}'
参考 FastAPI Python 服务器
以下是一个与 LiteLLM 代理兼容的参考 FastAPI 服务器:
# 这是一个示例端点,用于接收来自 litellm 的数据
from fastapi import FastAPI, HTTPException, Request
app = FastAPI()
@app.post("/log-event")
async def log_event(request: Request):
try:
print("Received /log-event request")
# 假设传入的请求包含 JSON 数据
data = await request.json()
print("Received request data:")
print(data)
# 你可以在这里添加额外的逻辑
# 目前只是打印接收到的数据
return {"message": "Request received successfully"}
except Exception as e:
print(f"Error processing request: {str(e)}")
import traceback
traceback.print_exc()
raise HTTPException(status_code=500, detail="Internal Server Error")
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="127.0.0.1", port=4000)
第二步:将 GENERIC_LOGGER_ENDPOINT 设置为我们应该发送回调日志的端点 + 路由
os.environ["GENERIC_LOGGER_ENDPOINT"] = "http://localhost:4000/log-event"
第三步:创建一个 config.yaml 文件并设置 litellm_settings:success_callback = ["generic"]
示例 litellm 代理 config.yaml
model_list:
- model_name: gpt-3.5-turbo
litellm_params:
model: gpt-3.5-turbo
litellm_settings:
success_callback: ["generic"]
启动 LiteLLM 代理并进行测试请求,以验证日志是否已到达你的回调 API
将 LLM IO 记录到 Langsmith
- 在 litellm config.yaml 中设置
success_callback: ["langsmith"]
如果你使用的是自定义的 LangSmith 实例,可以将 LANGSMITH_BASE_URL 环境变量设置为指向你的实例。
litellm_settings:
success_callback: ["langsmith"]
environment_variables:
LANGSMITH_API_KEY: "lsv2_pt_xxxxxxxx"
LANGSMITH_PROJECT: "litellm-proxy"
LANGSMITH_BASE_URL: "https://api.smith.langchain.com" # (可选 - 仅当你有自定义的 Langsmith 实例时需要)
- 启动代理
litellm --config /path/to/config.yaml
- 测试它!
curl --location 'http://0.0.0.0:4000/chat/completions' \
--header 'Content-Type: application/json' \
--data ' {
"model": "fake-openai-endpoint",
"messages": [
{
"role": "user",
"content": "Hello, Claude gm!"
}
],
}
'
期望在 Langfuse 上看到你的日志
将 LLM IO 记录到 Arize AI
- 在 litellm config.yaml 中设置
success_callback: ["arize"]
model_list:
- model_name: gpt-4
litellm_params:
model: openai/fake
api_key: fake-key
api_base: https://exampleopenaiendpoint-production.up.railway.app/
litellm_settings:
callbacks: ["arize"]
environment_variables:
ARIZE_SPACE_KEY: "d0*****"
ARIZE_API_KEY: "141a****"
ARIZE_ENDPOINT: "https://otlp.arize.com/v1" # 可选 - 你的自定义 arize api 端点
- 启动代理
litellm --config /path/to/config.yaml
- 测试它!
curl --location 'http://0.0.0.0:4000/chat/completions' \
--header 'Content-Type: application/json' \
--data ' {
"model": "fake-openai-endpoint",
"messages": [
{
"role": "user",
"content": "Hello, Claude gm!"
}
],
}
'
期望在 Langfuse 上看到你的日志
将 LLM IO 记录到 Langtrace
- 在 litellm config.yaml 中设置
success_callback: ["langtrace"]
model_list:
- model_name: gpt-4
litellm_params:
model: openai/fake
api_key: fake-key
api_base: https://exampleopenaiendpoint-production.up.railway.app/
litellm_settings:
callbacks: ["langtrace"]
environment_variables:
LANGTRACE_API_KEY: "141a****"
- 启动代理
litellm --config /path/to/config.yaml
- 测试它!
curl --location 'http://0.0.0.0:4000/chat/completions' \
--header 'Content-Type: application/json' \
--data ' {
"model": "fake-openai-endpoint",
"messages": [
{
"role": "user",
"content": "Hello, Claude gm!"
}
],
}
'
将 LLM IO 记录到 Galileo
[测试版]
在 www.rungalileo.io 上记录 LLM I/O
测试版集成
必需的环境变量
export GALILEO_BASE_URL="" # 对于大多数用户,这与他们的控制台 URL 相同,只是将单词 'console' 替换为 'api'(例如:http://www.console.galileo.myenterprise.com -> http://www.api.galileo.myenterprise.com)
export GALILEO_PROJECT_ID=""
export GALILEO_USERNAME=""
export GALILEO_PASSWORD=""
快速开始
- 添加到 Config.yaml
model_list:
- litellm_params:
api_base: https://exampleopenaiendpoint-production.up.railway.app/
api_key: my-fake-key
model: openai/my-fake-model
model_name: fake-openai-endpoint
litellm_settings:
success_callback: ["galileo"] # 👈 关键变更
- 启动代理
litellm --config /path/to/config.yaml
- 测试它!
curl --location 'http://0.0.0.0:4000/chat/completions' \
--header 'Content-Type: application/json' \
--data ' {
"model": "fake-openai-endpoint",
"messages": [
{
"role": "user",
"content": "你是哪个llm"
}
],
}
'
🎉 就是这样 - 期望在Galileo仪表板上看到你的日志
记录代理成本 + 使用情况 - OpenMeter
根据客户的LLM API使用情况进行计费 OpenMeter
必需的环境变量
# 来自 https://openmeter.cloud
export OPENMETER_API_ENDPOINT="" # 默认为 https://openmeter.cloud
export OPENMETER_API_KEY=""
快速开始
- 添加到Config.yaml
model_list:
- litellm_params:
api_base: https://openai-function-calling-workers.tasslexyz.workers.dev/
api_key: my-fake-key
model: openai/my-fake-model
model_name: fake-openai-endpoint
litellm_settings:
success_callback: ["openmeter"] # 👈 关键变化
- 启动代理
litellm --config /path/to/config.yaml
- 测试它!
curl --location 'http://0.0.0.0:4000/chat/completions' \
--header 'Content-Type: application/json' \
--data ' {
"model": "fake-openai-endpoint",
"messages": [
{
"role": "user",
"content": "你是哪个llm"
}
],
}
'
记录代理输入/输出 - DataDog
我们将使用 --config 设置 litellm.success_callback = ["datadog"],这将把所有成功的LLM调用日志记录到DataDog
步骤1:创建一个 config.yaml 文件并设置 litellm_settings: success_callback
model_list:
- model_name: gpt-3.5-turbo
litellm_params:
model: gpt-3.5-turbo
litellm_settings:
success_callback: ["datadog"] # 记录datadog上的llm成功日志
service_callback: ["datadog"] # 记录datadog上的redis, postgres失败日志
步骤2:为datadog设置必需的环境变量
DD_API_KEY="5f2d0f310***********" # 你的datadog API Key
DD_SITE="us5.datadoghq.com" # 你的datadog base url
DD_SOURCE="litellm_dev" # [可选] 你的datadog源。用于区分开发和生产部署
步骤3:启动代理,发起测试请求
启动代理
litellm --config config.yaml --debug
测试请求
curl --location 'http://0.0.0.0:4000/chat/completions' \
--header 'Content-Type: application/json' \
--data '{
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "你是哪个llm"
}
],
"metadata": {
"your-custom-metadata": "custom-field",
}
}'
预期在DataDog上的输出
记录代理输入/输出 - DynamoDB
我们将使用 --config 设置
litellm.success_callback = ["dynamodb"]litellm.dynamodb_table_name = "your-table-name"
这将把所有成功的LLM调用日志记录到DynamoDB
步骤1 在.env中设置AWS凭证
AWS_ACCESS_KEY_ID = ""
AWS_SECRET_ACCESS_KEY = ""
AWS_REGION_NAME = ""
步骤2:创建一个 config.yaml 文件并设置 litellm_settings: success_callback
model_list:
- model_name: gpt-3.5-turbo
litellm_params:
model: gpt-3.5-turbo
litellm_settings:
success_callback: ["dynamodb"]
dynamodb_table_name: your-table-name
步骤3:启动代理,发起测试请求
启动代理
litellm --config config.yaml --debug
测试请求
curl --location 'http://0.0.0.0:4000/chat/completions' \
--header 'Content-Type: application/json' \
--data ' {
"model": "Azure OpenAI GPT-4 East",
"messages": [
{
"role": "user",
"content": "你是哪个llm"
}
]
}'
你的日志应该可以在DynamoDB上查看
记录到DynamoDB的数据 /chat/completions
{
"id": {
"S": "chatcmpl-8W15J4480a3fAQ1yQaMgtsKJAicen"
},
"call_type": {
"S": "acompletion"
},
"endTime": {
"S": "2023-12-15 17:25:58.424118"
},
"messages": {
"S": "[{'role': 'user', 'content': 'This is a test'}]"
},
"metadata": {
"S": "{}"
},
"model": {
"S": "gpt-3.5-turbo"
},
"modelParameters": {
"S": "{'temperature': 0.7, 'max_tokens': 100, 'user': 'ishaan-2'}"
},
"response": {
"S": "ModelResponse(id='chatcmpl-8W15J4480a3fAQ1yQaMgtsKJAicen', choices=[Choices(finish_reason='stop', index=0, message=Message(content='Great! What can I assist you with?', role='assistant'))], created=1702641357, model='gpt-3.5-turbo-0613', object='chat.completion', system_fingerprint=None, usage=Usage(completion_tokens=9, prompt_tokens=11, total_tokens=20))"
},
"startTime": {
"S": "2023-12-15 17:25:56.047035"
},
"usage": {
"S": "Usage(completion_tokens=9, prompt_tokens=11, total_tokens=20)"
},
"user": {
"S": "ishaan-2"
}
}
记录到DynamoDB的数据 /embeddings
{
"id": {
"S": "4dec8d4d-4817-472d-9fc6-c7a6153eb2ca"
},
"call_type": {
"S": "aembedding"
},
"endTime": {
"S": "2023-12-15 17:25:59.890261"
},
"messages": {
"S": "['hi']"
},
"metadata": {
"S": "{}"
},
"model": {
"S": "text-embedding-ada-002"
},
"modelParameters": {
"S": "{'user': 'ishaan-2'}"
},
"response": {
"S": "EmbeddingResponse(model='text-embedding-ada-002-v2', data=[{'embedding': [-0.03503197431564331, -0.020601635798811913, -0.015375726856291294,
}
}
记录代理输入/输出 - Sentry
如果API调用失败(LLM/数据库),您可以将这些日志记录到Sentry:
第一步 安装Sentry
pip install --upgrade sentry-sdk
第二步:保存您的Sentry_DSN并添加litellm_settings:failure_callback
export SENTRY_DSN="your-sentry-dsn"
model_list:
- model_name: gpt-3.5-turbo
litellm_params:
model: gpt-3.5-turbo
litellm_settings:
# 其他设置
failure_callback: ["sentry"]
general_settings:
database_url: "my-bad-url" # 设置一个假的URL以触发Sentry异常
第三步:启动代理,进行测试请求
启动代理
litellm --config config.yaml --debug
测试请求
litellm --test
记录代理输入/输出 - Athina
Athina 允许您记录LLM的输入/输出,用于监控、分析和可观察性。
我们将使用--config来设置litellm.success_callback = ["athina"],这将把所有成功的LLM调用记录到Athina。
第一步 设置Athina API密钥
ATHINA_API_KEY = "your-athina-api-key"
第二步:创建一个config.yaml文件并设置litellm_settings:success_callback
model_list:
- model_name: gpt-3.5-turbo
litellm_params:
model: gpt-3.5-turbo
litellm_settings:
success_callback: ["athina"]
第三步:启动代理,进行测试请求
启动代理
litellm --config config.yaml --debug
测试请求
curl --location 'http://0.0.0.0:4000/chat/completions' \
--header 'Content-Type: application/json' \
--data ' {
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "which llm are you"
}
]
}'
(BETA) 使用Azure内容安全进行审核
Azure内容安全 是微软Azure提供的一项服务,它提供内容审核API来检测文本中潜在的冒犯性、有害或危险内容。
我们将使用--config来设置litellm.success_callback = ["azure_content_safety"],这将使用Azure内容安全对所有LLM调用进行审核。
步骤0 部署Azure内容安全
从Azure门户部署Azure内容安全实例并获取endpoint和key。
第一步 设置Athina API密钥
AZURE_CONTENT_SAFETY_KEY = "<your-azure-content-safety-key>"
第二步:创建一个config.yaml文件并设置litellm_settings:success_callback
model_list:
- model_name: gpt-3.5-turbo
litellm_params:
model: gpt-3.5-turbo
litellm_settings:
callbacks: ["azure_content_safety"]
azure_content_safety_params:
endpoint: "<your-azure-content-safety-endpoint>"
key: "os.environ/AZURE_CONTENT_SAFETY_KEY"
第三步:启动代理,进行测试请求
启动代理
litellm --config config.yaml --debug
测试请求
curl --location 'http://0.0.0.0:4000/chat/completions' \
--header 'Content-Type: application/json' \
--data ' {
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "Hi, how are you?"
}
]
}'
如果内容检测到的值大于config.yaml中设置的阈值,将返回HTTP 400错误。响应的详细信息将描述:
source:输入文本或LLM生成的文本category:触发审核的内容类别severity:严重性,从0到10
第四步:自定义Azure内容安全阈值
您可以通过在config.yaml中设置thresholds来自定义每个类别的阈值
model_list:
- model_name: gpt-3.5-turbo
litellm_params:
model: gpt-3.5-turbo
litellm_settings:
callbacks: ["azure_content_safety"]
azure_content_safety_params:
endpoint: "<your-azure-content-safety-endpoint>"
key: "os.environ/AZURE_CONTENT_SAFETY_KEY"
thresholds:
Hate: 6
SelfHarm: 8
Sexual: 6
Violence: 4
thresholds默认情况下不是必需的,但您可以根据需要调整这些值。
所有类别的默认值为4