Skip to content

Commit 3d5cd1c

Browse files
.
1 parent 32a1f48 commit 3d5cd1c

3 files changed

Lines changed: 83 additions & 0 deletions

File tree

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from .patcher import instrument
2+
3+
__all__ = ["instrument"]
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
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()
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import os
2+
from dotenv import load_dotenv
3+
from portkey_ai import Portkey
4+
5+
load_dotenv()
6+
7+
from deepeval.integrations.portkey import instrument
8+
instrument()
9+
10+
config = {
11+
"provider": 'openai',
12+
"api_key": os.getenv("PORTKEY_API_KEY")
13+
}
14+
15+
client = Portkey(config = config, metric_collection="test_collection_1")
16+
print(client)
17+
18+
# Example: Send a chat completion request
19+
response = client.chat.completions.create(
20+
messages=[{"role": "user", "content": "Hello, how are you?"}],
21+
model="gpt-4o"
22+
)
23+
24+
print(response.choices[0].message.content)

0 commit comments

Comments
 (0)