From ee20e6a1e63441b51363b03100dfe0fa95b3398c Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 18 Aug 2023 05:13:30 -0700 Subject: [PATCH] have response type inherit from openaiobject --- litellm/__pycache__/main.cpython-311.pyc | Bin 25997 -> 26030 bytes litellm/__pycache__/utils.cpython-311.pyc | Bin 50302 -> 48799 bytes .../test_model_response_typing/server.py | 23 ++++++ .../tests/test_model_response_typing/test.py | 14 ++++ litellm/utils.py | 76 +++++------------- pyproject.toml | 2 +- 6 files changed, 60 insertions(+), 55 deletions(-) create mode 100644 litellm/tests/test_model_response_typing/server.py create mode 100644 litellm/tests/test_model_response_typing/test.py diff --git a/litellm/__pycache__/main.cpython-311.pyc b/litellm/__pycache__/main.cpython-311.pyc index f8e81abe6cd2480679f49438dbf6c3e611174ce3..7c1a53cf54f7ee32629a70f6d6e9af20942e5b9c 100644 GIT binary patch delta 1754 zcmah}eP~-%6n{4#uhF(_UDu=^X;)I+`j#%UYn!Cm(6+9cPzUyF9cgKs-t>Ck&#vP?zDBl&SY ze&^hK&pqcJze+A#CFN(!%kLNX7YyE%J6|oYA&yJC&Jqi4nli}NbO~G|J0x3L2s-H& zgFv^*)n|wxoag`CH!a8&a?BG{{5&_C@eZ1O@v|-jH*c`p;F15i|plY=0bQ3!HF=8(9eOVWHh8vIcrX- zp=nrh#_dm{a{ytGgNkc4HZlhq4#S1^rme4|ID+s1!V&PdI7lzdw!Dx(T4ufF5mGb{ zC@%B1LK?}G-!3e;4mf8pvBW{L_s?=FpCgFh{Lb0FN>}vItb^Ez~u^!3IG;Pf$$eu*ximK$?P;4U8Z4g9E%a9#6yrAUEZpADG9KQT6{Cq{N>f<` zi_ncW!cM|wdtetT?0H|$&ag;~B76wfI=i-LD1MB7LquVp!VX_`=@qm+hY)}spQAL5V*V(K z&$@jP>19t-#;1QGuE;dTmf$sC138uX$X8io!a;!-+pO^8;C?4gu|)6xbMKdF4%(v{V{qY$I@MIqFllB6wAmcL(mKUHuR6y zY(0ZIPJh;@YK*PGGouY-r_p#F;d2BFhr92FzAt^P-RRO6{1zqsc7NiMiuA_(r$2MN zCF5Z#%hAL%yOX&+ddomo;KumFBCgA3GxmvRiA681nQvfuvW{GbPbNJ?gxiy2;(JKy zgTtZDIzqTui~3~_SyMzw9%E+ISKwUe9Pj7hu)Asl4R;Xq{2~Soz;d{{vWkoRC#c^U g1Yylc2)O}YhwI^HSj_wuHX1~$V5wTO!4LB4-?62vNdN!< delta 1629 zcmai!ZA@EL7{_}q?F9>D11F`>;Rbu*w!BQBEv-cF6kJ84Fj|@cvn#z76S~S}da`X|v+h>K1KdK7E5^ z(`z-?yUb?$K>Ul(lufJATpD}auGN!A+FIilx$RnmV28#=Y)WJP5$Q@8A6PH?rhok2Fy`l8xW__wr18( z3vJI_TXcTC?Os;0j_dDR>L~W&9{TCEjy~TMVv2xLQIz*U=mgThH1GtFp?^Bgmzu1V zjgoWM_Er@mtS(h?{mD7qFcaoNPFL8qHWuvDMs`-TIlk*$shTaWz2g1eXoP5T##$9+ z?iwjMSk733$=($!oqM>Ld$MbyWUh;DS=4*iyE@c8UvjW~syI<~50%WN%RP=A*H6Lk zn%KHhR*=)PxjEC|ljwvBjq#Vs>3?u19R5E?uW*|_pVD(?Iye^-df4~$W3-jMMC(x>`-6P3es(pV zi*-9ZyODDra6j;>fT&_^^Z`0I*6139{1EW)O)-`J9P8>+AzQiauzbJ?0Z~DP{U+=h zZk0F%p$f2C`!*%U-5cM5kE>oNGfd8x>F9V<_$0)Oz*j(pz<(c!8*_OPvL^fimh~Qg zqbuWE*;-zj_(fvN^y_2y$f(Vy^WMZER$=wZAtqTp(8w;*`2#`bASpQ^e~6?((vqP@ z8xv*&{Jem8BiY;ncfen!&yw$p1Dcu)+;J7c8er9TV9+qFPS!g&2~+%R#y9!zCOajn H)ld8jXY_#v diff --git a/litellm/__pycache__/utils.cpython-311.pyc b/litellm/__pycache__/utils.cpython-311.pyc index 3f33c9e65d6e10fa8e826b0f29cf073fce73a068..c4e28b05a5c266aa65dc92d1dc5bfcf64aa7d6f7 100644 GIT binary patch delta 8483 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 UFF^h(&6}J!@y>@fM>QGwf3WEZc>n+a delta 9733 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 diff --git a/litellm/tests/test_model_response_typing/server.py b/litellm/tests/test_model_response_typing/server.py new file mode 100644 index 000000000..0399f0d91 --- /dev/null +++ b/litellm/tests/test_model_response_typing/server.py @@ -0,0 +1,23 @@ +# #### What this tests #### +# # This tests if the litellm model response type is returnable in a flask app + +# import sys, os +# import traceback +# from flask import Flask, request, jsonify, abort, Response +# sys.path.insert(0, os.path.abspath('../../..')) # Adds the parent directory to the system path + +# import litellm +# from litellm import completion + +# litellm.set_verbose = False + +# app = Flask(__name__) + +# @app.route('/') +# def hello(): +# data = request.json +# return completion(**data) + +# if __name__ == '__main__': +# from waitress import serve +# serve(app, host='localhost', port=8080, threads=10) \ No newline at end of file diff --git a/litellm/tests/test_model_response_typing/test.py b/litellm/tests/test_model_response_typing/test.py new file mode 100644 index 000000000..c1620e941 --- /dev/null +++ b/litellm/tests/test_model_response_typing/test.py @@ -0,0 +1,14 @@ +# import requests, json + +# BASE_URL = 'http://localhost:8080' + +# def test_hello_route(): +# data = {"model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": "hey, how's it going?"}]} +# headers = {'Content-Type': 'application/json'} +# response = requests.get(BASE_URL, headers=headers, data=json.dumps(data)) +# print(response.text) +# assert response.status_code == 200 +# print("Hello route test passed!") + +# if __name__ == '__main__': +# test_hello_route() \ No newline at end of file diff --git a/litellm/utils.py b/litellm/utils.py index e5886c8e6..864603768 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -51,67 +51,35 @@ local_cache = {} # 'usage': {'prompt_tokens': 18, 'completion_tokens': 23, 'total_tokens': 41} # } -class Message: - def __init__(self): - self.content: str = "default" - self.role: str = "assistant" +class Message(OpenAIObject): + def __init__(self, content="default", role="assistant", **params): + super(Message, self).__init__(**params) + self.content = content + self.role = role - def __getitem__(self, key): - return getattr(self, key) +class Choices(OpenAIObject): + def __init__(self, finish_reason="stop", index=0, message=Message(), **params): + super(Choices, self).__init__(**params) + self.finish_reason = finish_reason + self.index = index + self.message = message - def __setitem__(self, key, value): - setattr(self, key, value) - - def __iter__(self): - return iter(vars(self)) - - def __str__(self): - result = f"{{\n 'role': '{self.role}',\n 'content': \"{self.content}\"\n}}" - return result - -class Choices: - def __init__(self): - self.finish_reason: str = "stop" - self.index: int = 0 - self.message: Message = Message() - - def __getitem__(self, key): - return getattr(self, key) - - def __setitem__(self, key, value): - setattr(self, key, value) - - def __iter__(self): - return iter(vars(self)) - - def __str__(self): - result = f"{{\n 'finish_reason': '{self.finish_reason}',\n 'index': {self.index},\n 'message': {self.message}\n}}" - return result - -class ModelResponse(dict): - def __init__(self): - self.choices: List[Choices] = [Choices()] - self.created: str = None - self.model: str = None - self.usage: Dict[str, Union[int, None]] = { +class ModelResponse(OpenAIObject): + def __init__(self, choices=None, created=None, model=None, usage=None, **params): + super(ModelResponse, self).__init__(**params) + self.choices = choices if choices else [Choices()] + self.created = created + self.model = model + self.usage = usage if usage else { "prompt_tokens": None, "completion_tokens": None, "total_tokens": None } - def __getitem__(self, key): - return getattr(self, key) - - def __setitem__(self, key, value): - setattr(self, key, value) - - def __iter__(self): - return iter(vars(self)) - - def __str__(self): - choices_str = ",\n".join(str(choice) for choice in self.choices) - result = f"{{\n 'choices': [\n{choices_str}\n ],\n 'created': {self.created},\n 'model': '{self.model}',\n 'usage': {self.usage}\n}}" - return result + def to_dict_recursive(self): + d = super().to_dict_recursive() + d['choices'] = [choice.to_dict_recursive() for choice in self.choices] + return d ############################################################ def print_verbose(print_statement): if litellm.set_verbose: diff --git a/pyproject.toml b/pyproject.toml index 1d143a7b1..4c1b088a6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "0.1.422" +version = "0.1.424" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT License"