Spaces:
Sleeping
Sleeping
import json | |
import sys | |
import os | |
import io, asyncio | |
import logging | |
logging.basicConfig(level=logging.DEBUG) | |
sys.path.insert(0, os.path.abspath("../..")) | |
from litellm import completion | |
import litellm | |
litellm.num_retries = 3 | |
litellm.success_callback = ["langfuse"] | |
os.environ["LANGFUSE_DEBUG"] = "True" | |
import time | |
import pytest | |
def search_logs(log_file_path, num_good_logs=1): | |
""" | |
Searches the given log file for logs containing the "/api/public" string. | |
Parameters: | |
- log_file_path (str): The path to the log file to be searched. | |
Returns: | |
- None | |
Raises: | |
- Exception: If there are any bad logs found in the log file. | |
""" | |
import re | |
print("\n searching logs") | |
bad_logs = [] | |
good_logs = [] | |
all_logs = [] | |
try: | |
with open(log_file_path, "r") as log_file: | |
lines = log_file.readlines() | |
print(f"searching logslines: {lines}") | |
for line in lines: | |
all_logs.append(line.strip()) | |
if "/api/public" in line: | |
print("Found log with /api/public:") | |
print(line.strip()) | |
print("\n\n") | |
match = re.search( | |
r'"POST /api/public/ingestion HTTP/1.1" (\d+) (\d+)', | |
line, | |
) | |
if match: | |
status_code = int(match.group(1)) | |
print("STATUS CODE", status_code) | |
if ( | |
status_code != 200 | |
and status_code != 201 | |
and status_code != 207 | |
): | |
print("got a BAD log") | |
bad_logs.append(line.strip()) | |
else: | |
good_logs.append(line.strip()) | |
print("\nBad Logs") | |
print(bad_logs) | |
if len(bad_logs) > 0: | |
raise Exception(f"bad logs, Bad logs = {bad_logs}") | |
assert ( | |
len(good_logs) == num_good_logs | |
), f"Did not get expected number of good logs, expected {num_good_logs}, got {len(good_logs)}. All logs \n {all_logs}" | |
print("\nGood Logs") | |
print(good_logs) | |
if len(good_logs) <= 0: | |
raise Exception( | |
f"There were no Good Logs from Langfuse. No logs with /api/public status 200. \nAll logs:{all_logs}" | |
) | |
except Exception as e: | |
raise e | |
def pre_langfuse_setup(): | |
""" | |
Set up the logging for the 'pre_langfuse_setup' function. | |
""" | |
# sends logs to langfuse.log | |
import logging | |
# Configure the logging to write to a file | |
logging.basicConfig(filename="langfuse.log", level=logging.DEBUG) | |
logger = logging.getLogger() | |
# Add a FileHandler to the logger | |
file_handler = logging.FileHandler("langfuse.log", mode="w") | |
file_handler.setLevel(logging.DEBUG) | |
logger.addHandler(file_handler) | |
return | |
def test_langfuse_logging_async(): | |
try: | |
pre_langfuse_setup() | |
litellm.set_verbose = True | |
litellm.success_callback = ["langfuse"] | |
async def _test_langfuse(): | |
response = await litellm.acompletion( | |
model="azure/chatgpt-v-2", | |
messages=[{"role": "user", "content": "This is a test"}], | |
max_tokens=100, | |
temperature=0.7, | |
timeout=5, | |
user="test_user", | |
) | |
await asyncio.sleep(1) | |
return response | |
response = asyncio.run(_test_langfuse()) | |
print(f"response: {response}") | |
# # check langfuse.log to see if there was a failed response | |
search_logs("langfuse.log") | |
except litellm.Timeout as e: | |
pass | |
except Exception as e: | |
pytest.fail(f"An exception occurred - {e}") | |
# def test_langfuse_logging_async_text_completion(): | |
# try: | |
# pre_langfuse_setup() | |
# litellm.set_verbose = False | |
# litellm.success_callback = ["langfuse"] | |
# async def _test_langfuse(): | |
# response = await litellm.atext_completion( | |
# model="gpt-3.5-turbo-instruct", | |
# prompt="this is a test", | |
# max_tokens=5, | |
# temperature=0.7, | |
# timeout=5, | |
# user="test_user", | |
# stream=True | |
# ) | |
# async for chunk in response: | |
# print() | |
# print(chunk) | |
# await asyncio.sleep(1) | |
# return response | |
# response = asyncio.run(_test_langfuse()) | |
# print(f"response: {response}") | |
# # # check langfuse.log to see if there was a failed response | |
# search_logs("langfuse.log") | |
# except litellm.Timeout as e: | |
# pass | |
# except Exception as e: | |
# pytest.fail(f"An exception occurred - {e}") | |
# test_langfuse_logging_async_text_completion() | |
def test_langfuse_logging(): | |
try: | |
pre_langfuse_setup() | |
litellm.set_verbose = True | |
response = completion( | |
model="claude-instant-1.2", | |
messages=[{"role": "user", "content": "Hi 👋 - i'm claude"}], | |
max_tokens=10, | |
temperature=0.2, | |
) | |
print(response) | |
# time.sleep(5) | |
# # check langfuse.log to see if there was a failed response | |
# search_logs("langfuse.log") | |
except litellm.Timeout as e: | |
pass | |
except Exception as e: | |
pytest.fail(f"An exception occurred - {e}") | |
# test_langfuse_logging() | |
def test_langfuse_logging_stream(): | |
try: | |
litellm.set_verbose = True | |
response = completion( | |
model="gpt-3.5-turbo", | |
messages=[ | |
{ | |
"role": "user", | |
"content": "this is a streaming test for llama2 + langfuse", | |
} | |
], | |
max_tokens=20, | |
temperature=0.2, | |
stream=True, | |
) | |
print(response) | |
for chunk in response: | |
pass | |
# print(chunk) | |
except litellm.Timeout as e: | |
pass | |
except Exception as e: | |
print(e) | |
# test_langfuse_logging_stream() | |
def test_langfuse_logging_custom_generation_name(): | |
try: | |
litellm.set_verbose = True | |
response = completion( | |
model="gpt-3.5-turbo", | |
messages=[{"role": "user", "content": "Hi 👋 - i'm claude"}], | |
max_tokens=10, | |
metadata={ | |
"langfuse/foo": "bar", | |
"langsmith/fizz": "buzz", | |
"prompt_hash": "asdf98u0j9131123", | |
"generation_name": "ishaan-test-generation", | |
"generation_id": "gen-id22", | |
"trace_id": "trace-id22", | |
"trace_user_id": "user-id2", | |
}, | |
) | |
print(response) | |
except litellm.Timeout as e: | |
pass | |
except Exception as e: | |
pytest.fail(f"An exception occurred - {e}") | |
print(e) | |
test_langfuse_logging_custom_generation_name() | |
def test_langfuse_logging_function_calling(): | |
litellm.set_verbose = True | |
function1 = [ | |
{ | |
"name": "get_current_weather", | |
"description": "Get the current weather in a given location", | |
"parameters": { | |
"type": "object", | |
"properties": { | |
"location": { | |
"type": "string", | |
"description": "The city and state, e.g. San Francisco, CA", | |
}, | |
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}, | |
}, | |
"required": ["location"], | |
}, | |
} | |
] | |
try: | |
response = completion( | |
model="gpt-3.5-turbo", | |
messages=[{"role": "user", "content": "what's the weather in boston"}], | |
temperature=0.1, | |
functions=function1, | |
) | |
print(response) | |
except litellm.Timeout as e: | |
pass | |
except Exception as e: | |
print(e) | |
# test_langfuse_logging_function_calling() | |
def test_langfuse_logging_tool_calling(): | |
litellm.set_verbose = True | |
def get_current_weather(location, unit="fahrenheit"): | |
"""Get the current weather in a given location""" | |
if "tokyo" in location.lower(): | |
return json.dumps( | |
{"location": "Tokyo", "temperature": "10", "unit": "celsius"} | |
) | |
elif "san francisco" in location.lower(): | |
return json.dumps( | |
{"location": "San Francisco", "temperature": "72", "unit": "fahrenheit"} | |
) | |
elif "paris" in location.lower(): | |
return json.dumps( | |
{"location": "Paris", "temperature": "22", "unit": "celsius"} | |
) | |
else: | |
return json.dumps({"location": location, "temperature": "unknown"}) | |
messages = [ | |
{ | |
"role": "user", | |
"content": "What's the weather like in San Francisco, Tokyo, and Paris?", | |
} | |
] | |
tools = [ | |
{ | |
"type": "function", | |
"function": { | |
"name": "get_current_weather", | |
"description": "Get the current weather in a given location", | |
"parameters": { | |
"type": "object", | |
"properties": { | |
"location": { | |
"type": "string", | |
"description": "The city and state, e.g. San Francisco, CA", | |
}, | |
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}, | |
}, | |
"required": ["location"], | |
}, | |
}, | |
} | |
] | |
response = litellm.completion( | |
model="gpt-3.5-turbo-1106", | |
messages=messages, | |
tools=tools, | |
tool_choice="auto", # auto is default, but we'll be explicit | |
) | |
print("\nLLM Response1:\n", response) | |
response_message = response.choices[0].message | |
tool_calls = response.choices[0].message.tool_calls | |
# test_langfuse_logging_tool_calling() | |