forked from phoenix/litellm-mirror
fix error tracking
This commit is contained in:
parent
9a43b23876
commit
61afceece1
4 changed files with 50 additions and 71 deletions
|
@ -4,15 +4,16 @@
|
||||||
|
|
||||||
## Use LLMonitor to log requests across all LLM Providers (OpenAI, Azure, Anthropic, Cohere, Replicate, PaLM)
|
## Use LLMonitor to log requests across all LLM Providers (OpenAI, Azure, Anthropic, Cohere, Replicate, PaLM)
|
||||||
|
|
||||||
liteLLM provides `success_callbacks` and `failure_callbacks`, making it easy for you to send data to a particular provider depending on the status of your responses.
|
liteLLM provides `callbacks`, making it easy for you to log data depending on the status of your responses.
|
||||||
|
|
||||||
### Using Callbacks
|
### Using Callbacks
|
||||||
|
|
||||||
Use just 2 lines of code, to instantly log your responses **across all providers** with llmonitor:
|
Use just 2 lines of code, to instantly log your responses **across all providers** with llmonitor:
|
||||||
|
|
||||||
```
|
```
|
||||||
litellm.success_callback=["llmonitor"]
|
litellm.success_callback = ["llmonitor"]
|
||||||
litellm.error_callback=["llmonitor"]
|
litellm.failure_callback = ["llmonitor"]
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Complete code
|
Complete code
|
||||||
|
@ -27,8 +28,8 @@ os.environ["LLMONITOR_APP_ID"] = "your-llmonitor-app-id"
|
||||||
os.environ["OPENAI_API_KEY"], os.environ["COHERE_API_KEY"] = "", ""
|
os.environ["OPENAI_API_KEY"], os.environ["COHERE_API_KEY"] = "", ""
|
||||||
|
|
||||||
# set callbacks
|
# set callbacks
|
||||||
litellm.success_callback=["llmonitor"]
|
litellm.success_callback = ["llmonitor"]
|
||||||
litellm.error_callback=["llmonitor"]
|
litellm.failure_callback = ["llmonitor"]
|
||||||
|
|
||||||
#openai call
|
#openai call
|
||||||
response = completion(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "Hi 👋 - i'm openai"}])
|
response = completion(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "Hi 👋 - i'm openai"}])
|
||||||
|
|
|
@ -57,14 +57,14 @@ class LLMonitorLogger:
|
||||||
messages=None,
|
messages=None,
|
||||||
user_id=None,
|
user_id=None,
|
||||||
response_obj=None,
|
response_obj=None,
|
||||||
time=datetime.datetime.now(),
|
start_time=datetime.datetime.now(),
|
||||||
|
end_time=datetime.datetime.now(),
|
||||||
error=None,
|
error=None,
|
||||||
):
|
):
|
||||||
# Method definition
|
# Method definition
|
||||||
try:
|
try:
|
||||||
print_verbose(
|
print_verbose(
|
||||||
f"LLMonitor Logging - Enters logging function for model {model}"
|
f"LLMonitor Logging - Logging request for model {model}")
|
||||||
)
|
|
||||||
|
|
||||||
if response_obj:
|
if response_obj:
|
||||||
usage = parse_usage(response_obj['usage'])
|
usage = parse_usage(response_obj['usage'])
|
||||||
|
@ -73,27 +73,41 @@ class LLMonitorLogger:
|
||||||
usage = None
|
usage = None
|
||||||
output = None
|
output = None
|
||||||
|
|
||||||
print(type, run_id, model, messages, usage, output, time, user_id,
|
if error:
|
||||||
error)
|
error_obj = {'stack': error}
|
||||||
|
|
||||||
headers = {'Content-Type': 'application/json'}
|
else:
|
||||||
|
error_obj = None
|
||||||
|
|
||||||
data = {
|
data = [{
|
||||||
"type": "llm",
|
"type": "llm",
|
||||||
"name": model,
|
"name": model,
|
||||||
"runId": run_id,
|
"runId": run_id,
|
||||||
"app": self.app_id,
|
"app": self.app_id,
|
||||||
"error": error,
|
'event': 'start',
|
||||||
"event": type,
|
"timestamp": start_time.isoformat(),
|
||||||
"timestamp": time.isoformat(),
|
|
||||||
"userId": user_id,
|
"userId": user_id,
|
||||||
"input": parse_messages(messages),
|
"input": parse_messages(messages),
|
||||||
"usage": usage,
|
}, {
|
||||||
|
"type": "llm",
|
||||||
|
"runId": run_id,
|
||||||
|
"app": self.app_id,
|
||||||
|
"event": type,
|
||||||
|
"error": error_obj,
|
||||||
|
"timestamp": end_time.isoformat(),
|
||||||
|
"userId": user_id,
|
||||||
"output": parse_messages(output),
|
"output": parse_messages(output),
|
||||||
}
|
"tokensUsage": usage,
|
||||||
|
}]
|
||||||
|
|
||||||
print_verbose(f"LLMonitor Logging - final data object: {data}")
|
# print_verbose(f"LLMonitor Logging - final data object: {data}")
|
||||||
# response = requests.post(url, headers=headers, json=data)
|
|
||||||
|
response = requests.post(
|
||||||
|
self.api_url + '/api/report',
|
||||||
|
headers={'Content-Type': 'application/json'},
|
||||||
|
json={'events': data})
|
||||||
|
|
||||||
|
print_verbose(f"LLMonitor Logging - response: {response}")
|
||||||
except:
|
except:
|
||||||
# traceback.print_exc()
|
# traceback.print_exc()
|
||||||
print_verbose(
|
print_verbose(
|
||||||
|
|
|
@ -9,37 +9,16 @@ sys.path.insert(0, os.path.abspath('../..'))
|
||||||
from litellm import completion
|
from litellm import completion
|
||||||
import litellm
|
import litellm
|
||||||
|
|
||||||
litellm.input_callback = ["llmonitor"]
|
|
||||||
litellm.success_callback = ["llmonitor"]
|
litellm.success_callback = ["llmonitor"]
|
||||||
litellm.error_callback = ["llmonitor"]
|
litellm.failure_callback = ["llmonitor"]
|
||||||
|
|
||||||
litellm.set_verbose = True
|
litellm.set_verbose = True
|
||||||
|
|
||||||
os.environ[
|
# openai call
|
||||||
"OPENAI_API_KEY"] = "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"
|
first_success_test = completion(model="gpt-3.5-turbo",
|
||||||
|
|
||||||
print(os.environ["OPENAI_API_KEY"])
|
|
||||||
|
|
||||||
# def my_custom_logging_fn(model_call_dict):
|
|
||||||
# print(f"model call details: {model_call_dict}")
|
|
||||||
|
|
||||||
# # openai call
|
|
||||||
# response = completion(model="gpt-3.5-turbo",
|
|
||||||
# messages=[{
|
|
||||||
# "role": "user",
|
|
||||||
# "content": "Hi 👋 - i'm openai"
|
|
||||||
# }],
|
|
||||||
# logger_fn=my_custom_logging_fn)
|
|
||||||
|
|
||||||
# print(response)
|
|
||||||
|
|
||||||
# #bad request call
|
|
||||||
# response = completion(model="chatgpt-test", messages=[{"role": "user", "content": "Hi 👋 - i'm a bad request"}])
|
|
||||||
|
|
||||||
# cohere call
|
|
||||||
response = completion(model="command-nightly",
|
|
||||||
messages=[{
|
messages=[{
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": "Hi 👋 - i'm cohere"
|
"content": "Hi 👋 - i'm openai"
|
||||||
}])
|
}])
|
||||||
print(response)
|
|
||||||
|
print(first_success_test)
|
||||||
|
|
|
@ -209,19 +209,7 @@ class Logging:
|
||||||
litellm_params["litellm_call_id"],
|
litellm_params["litellm_call_id"],
|
||||||
print_verbose=print_verbose,
|
print_verbose=print_verbose,
|
||||||
)
|
)
|
||||||
elif callback == "llmonitor":
|
|
||||||
print_verbose("reaches llmonitor for logging!")
|
|
||||||
model = self.model
|
|
||||||
messages = self.messages
|
|
||||||
print(f"liteDebuggerClient: {liteDebuggerClient}")
|
|
||||||
llmonitorLogger.log_event(
|
|
||||||
type="start",
|
|
||||||
model=model,
|
|
||||||
messages=messages,
|
|
||||||
user_id=litellm._thread_context.user,
|
|
||||||
run_id=self.litellm_params["litellm_call_id"],
|
|
||||||
print_verbose=print_verbose,
|
|
||||||
)
|
|
||||||
elif callback == "lite_debugger":
|
elif callback == "lite_debugger":
|
||||||
print_verbose("reaches litedebugger for logging!")
|
print_verbose("reaches litedebugger for logging!")
|
||||||
model = self.model
|
model = self.model
|
||||||
|
@ -426,6 +414,7 @@ def client(original_function):
|
||||||
add_cache(result, *args, **kwargs)
|
add_cache(result, *args, **kwargs)
|
||||||
# LOG SUCCESS
|
# LOG SUCCESS
|
||||||
crash_reporting(*args, **kwargs)
|
crash_reporting(*args, **kwargs)
|
||||||
|
|
||||||
my_thread = threading.Thread(
|
my_thread = threading.Thread(
|
||||||
target=handle_success,
|
target=handle_success,
|
||||||
args=(args, kwargs, result, start_time,
|
args=(args, kwargs, result, start_time,
|
||||||
|
@ -433,6 +422,7 @@ def client(original_function):
|
||||||
my_thread.start()
|
my_thread.start()
|
||||||
return result
|
return result
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|
||||||
traceback_exception = traceback.format_exc()
|
traceback_exception = traceback.format_exc()
|
||||||
crash_reporting(*args, **kwargs, exception=traceback_exception)
|
crash_reporting(*args, **kwargs, exception=traceback_exception)
|
||||||
end_time = datetime.datetime.now()
|
end_time = datetime.datetime.now()
|
||||||
|
@ -855,21 +845,15 @@ def handle_failure(exception, traceback_exception, start_time, end_time, args,
|
||||||
print_verbose("reaches llmonitor for logging!")
|
print_verbose("reaches llmonitor for logging!")
|
||||||
model = args[0] if len(args) > 0 else kwargs["model"]
|
model = args[0] if len(args) > 0 else kwargs["model"]
|
||||||
messages = args[1] if len(args) > 1 else kwargs["messages"]
|
messages = args[1] if len(args) > 1 else kwargs["messages"]
|
||||||
usage = {
|
|
||||||
"prompt_tokens":
|
|
||||||
prompt_token_calculator(model, messages=messages),
|
|
||||||
"completion_tokens":
|
|
||||||
0,
|
|
||||||
}
|
|
||||||
llmonitorLogger.log_event(
|
llmonitorLogger.log_event(
|
||||||
type="error",
|
type="error",
|
||||||
user_id=litellm._thread_context.user,
|
user_id=litellm._thread_context.user,
|
||||||
model=model,
|
model=model,
|
||||||
error=traceback_exception,
|
error=traceback_exception,
|
||||||
response_obj=result,
|
|
||||||
run_id=kwargs["litellm_call_id"],
|
run_id=kwargs["litellm_call_id"],
|
||||||
timestamp=end_time,
|
start_time=start_time,
|
||||||
usage=usage,
|
end_time=end_time,
|
||||||
print_verbose=print_verbose,
|
print_verbose=print_verbose,
|
||||||
)
|
)
|
||||||
elif callback == "supabase":
|
elif callback == "supabase":
|
||||||
|
@ -992,7 +976,8 @@ def handle_success(args, kwargs, result, start_time, end_time):
|
||||||
messages=messages,
|
messages=messages,
|
||||||
user_id=litellm._thread_context.user,
|
user_id=litellm._thread_context.user,
|
||||||
response_obj=result,
|
response_obj=result,
|
||||||
time=end_time,
|
start_time=start_time,
|
||||||
|
end_time=end_time,
|
||||||
run_id=kwargs["litellm_call_id"],
|
run_id=kwargs["litellm_call_id"],
|
||||||
print_verbose=print_verbose,
|
print_verbose=print_verbose,
|
||||||
)
|
)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue