Coverage for mindsdb / integrations / handlers / portkey_handler / portkey_handler.py: 0%
29 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-21 00:36 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-21 00:36 +0000
1from typing import Dict, Optional
3import pandas as pd
4from portkey_ai import Portkey
6from mindsdb.integrations.libs.base import BaseMLEngine
7from mindsdb.utilities import log
9from mindsdb.integrations.utilities.handler_utils import get_api_key
11logger = log.getLogger(__name__)
13DEFAULT_METADATA = {
14 "_source": "portkey-mindsdb-integration",
15}
18class PortkeyHandler(BaseMLEngine):
19 """
20 Integration with the Portkey LLM Python Library
21 """
23 name = "portkey"
25 def __init__(self, *args, **kwargs):
26 super().__init__(*args, **kwargs)
27 self.generative = True
29 def create(
30 self,
31 target: str,
32 df: Optional[pd.DataFrame] = None,
33 args: Optional[Dict] = None,
34 ) -> None:
36 if "using" not in args:
37 raise Exception(
38 "Portkey engine requires a USING clause! Refer to its documentation for more details."
39 )
41 self.model_storage.json_set("args", args)
43 def predict(
44 self, df: Optional[pd.DataFrame] = None, args: Optional[Dict] = None
45 ) -> None:
47 args = self.model_storage.json_get("args")
48 api_key = get_api_key('portkey', args["using"], self.engine_storage, strict=False)
50 self.client = Portkey(
51 **self.engine_storage.get_connection_args(),
52 api_key=api_key,
53 metadata=DEFAULT_METADATA
54 )
56 result_df = pd.DataFrame()
58 result_df["predictions"] = df["question"].apply(self._predict_answer)
60 result_df = result_df.rename(columns={"predictions": args["target"]})
62 return result_df
64 def _predict_answer(self, text):
65 """
66 connects with portkey messages api to predict the answer for the particular question
68 """
70 model_args = self.model_storage.json_get("args")
72 message = self.client.chat.completions.create(
73 **model_args,
74 messages=[
75 {"role": "user", "content": text}
76 ]
77 )
79 return message.choices[0].message.content