1+ import functools
2+ from typing import Optional , List
3+ from deepeval .tracing .context import current_span_context
4+ from deepeval .tracing .tracing import Observer
5+ from deepeval .tracing .utils import make_json_serializable
6+ from deepeval .metrics import BaseMetric
7+ try :
8+ from portkey_ai import Portkey
9+ from portkey_ai .api_resources .apis .chat_complete import Completions
10+ is_portkey_installed = True
11+ except Exception :
12+ is_portkey_installed = False
13+
14+ def is_portkey_available ():
15+ if not is_portkey_installed :
16+ raise ImportError ("portkey-ai is not available. Please install it with `pip install portkey-ai`." )
17+ return True
18+
19+ def _patch_portkey_init ():
20+ original_init = Portkey .__init__
21+
22+ @functools .wraps (original_init )
23+ def new_init (* args , metric_collection : Optional [str ] = None , metrics : Optional [List [BaseMetric ]] = None , ** kwargs ):
24+ result = original_init (* args , ** kwargs )
25+ _patch_portkey_chat_completions (args [0 ].chat .completions , metrics , metric_collection )
26+ return result
27+
28+ Portkey .__init__ = new_init
29+
30+
31+ def _patch_portkey_chat_completions (completions : Completions , metrics = None , metric_collection = None ):
32+ if getattr (completions , "_deepeval_patched" , False ):
33+ return
34+
35+ original_create = completions .create # capture bound original
36+
37+ @functools .wraps (original_create )
38+ def new_create (* args , ** kwargs ):
39+ with Observer (
40+ span_type = "llm" ,
41+ metrics = metrics ,
42+ metric_collection = metric_collection ,
43+ observe_kwargs = {"model" : kwargs .get ("model" , "unknown" )},
44+ func_name = "LLM" ,
45+ ) as observer :
46+ result = original_create (* args , ** kwargs )
47+ observer .result = result
48+ current_span_context .get ().input = kwargs .get ("messages" )
49+ return result
50+
51+ completions .create = new_create
52+ setattr (completions , "_deepeval_patched" , True )
53+
54+ def instrument ():
55+ is_portkey_available ()
56+ _patch_portkey_init ()
0 commit comments