使用 claude api遇到的问题
## 背景
在使用 new-api 的转发服务时,报错:
total_tokens = oai_token_usage.get("total_tokens", input_tokens + output_tokens)
~~~~~~~~~~~~~^~~~~~~~~~~~~~~
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
对应的代码位置在此处
问题过程中的分析与经验
是因为 get获取到的值为 none导致。而正常情况下不会为 None
在使用非官方接口(比如:破解类)的非常容易出现该问题,个人猜测:是因为破解的api少一些字段
破解的接口一般不支持函数调用
解决方法
可将以下内容导入到调用模型的位置前即可
import langchain_core.messages.ai as ai_messages
def safe_add_usage(lhs, rhs):
def get_token(d, key):
return d.get(key, 0) if d and isinstance(d.get(key), int) else 0
# 提取各字段
lhs_input = get_token(lhs, "input_tokens")
lhs_output = get_token(lhs, "output_tokens")
lhs_total = get_token(lhs, "total_tokens")
rhs_input = get_token(rhs, "input_tokens")
rhs_output = get_token(rhs, "output_tokens")
rhs_total = get_token(rhs, "total_tokens")
return {
"input_tokens": lhs_input + rhs_input,
"output_tokens": lhs_output + rhs_output,
"total_tokens": lhs_total + rhs_total,
}
# 打补丁
ai_messages.add_usage = safe_add_usage
# 替换原函数
def safe_create_usage_metadata(oai_token_usage):
input_tokens = oai_token_usage.get("prompt_tokens") or 0
output_tokens = oai_token_usage.get("completion_tokens") or 0
total_tokens = oai_token_usage.get("total_tokens", input_tokens + output_tokens)
return {
"completion_tokens": output_tokens,
"prompt_tokens": input_tokens,
"total_tokens": total_tokens,
}
import langchain_openai.chat_models.base as base
base._create_usage_metadata = safe_create_usage_metadata
License:
CC BY 4.0