llumo 0.2.15b1__py3-none-any.whl → 0.2.15b2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- llumo/client.py +12 -4
- llumo/execution.py +4 -5
- llumo/helpingFuntions.py +21 -2
- {llumo-0.2.15b1.dist-info → llumo-0.2.15b2.dist-info}/METADATA +1 -1
- llumo-0.2.15b2.dist-info/RECORD +13 -0
- llumo-0.2.15b1.dist-info/RECORD +0 -13
- {llumo-0.2.15b1.dist-info → llumo-0.2.15b2.dist-info}/WHEEL +0 -0
- {llumo-0.2.15b1.dist-info → llumo-0.2.15b2.dist-info}/licenses/LICENSE +0 -0
- {llumo-0.2.15b1.dist-info → llumo-0.2.15b2.dist-info}/top_level.txt +0 -0
llumo/client.py
CHANGED
@@ -10,7 +10,7 @@ import os
|
|
10
10
|
import itertools
|
11
11
|
import pandas as pd
|
12
12
|
from typing import List, Dict
|
13
|
-
from .models import AVAILABLEMODELS, getProviderFromModel
|
13
|
+
from .models import AVAILABLEMODELS, getProviderFromModel, Provider
|
14
14
|
from .execution import ModelExecutor
|
15
15
|
from .exceptions import LlumoAIError
|
16
16
|
from .helpingFuntions import *
|
@@ -50,7 +50,7 @@ class LlumoClient:
|
|
50
50
|
reqBody = {"analytics": [evalName]}
|
51
51
|
|
52
52
|
try:
|
53
|
-
|
53
|
+
|
54
54
|
response = requests.post(url=validateUrl, json=reqBody, headers=headers)
|
55
55
|
|
56
56
|
except requests.exceptions.RequestException as e:
|
@@ -1151,7 +1151,7 @@ class LlumoClient:
|
|
1151
1151
|
# Validate API and dependencies
|
1152
1152
|
self.validateApiKey(evalName=evalName)
|
1153
1153
|
metricDependencies = checkDependency(
|
1154
|
-
evalName, list(working_df.columns), tocheck=
|
1154
|
+
evalName, list(working_df.columns), tocheck=False
|
1155
1155
|
)
|
1156
1156
|
if not metricDependencies["status"]:
|
1157
1157
|
raise LlumoAIError.dependencyError(metricDependencies["message"])
|
@@ -1189,12 +1189,20 @@ class LlumoClient:
|
|
1189
1189
|
inputDict = {key: row[key] for key in inputVariables}
|
1190
1190
|
for i, model in enumerate(modelAliases, 1):
|
1191
1191
|
try:
|
1192
|
+
|
1192
1193
|
provider = getProviderFromModel(model)
|
1194
|
+
if provider == Provider.OPENAI:
|
1195
|
+
print(validateOpenaiKey(apiKey))
|
1196
|
+
elif provider == Provider.GOOGLE:
|
1197
|
+
validateGoogleKey(apiKey)
|
1198
|
+
|
1193
1199
|
filled_template = getInputPopulatedPrompt(prompt_template, inputDict)
|
1194
1200
|
response = executor.execute(provider, model.value, filled_template, apiKey)
|
1195
1201
|
df.at[indx, f"output_{i}"] = response
|
1196
1202
|
except Exception as e:
|
1197
|
-
df.at[indx, f"output_{i}"] = str(e)
|
1203
|
+
# df.at[indx, f"output_{i}"] = str(e)
|
1204
|
+
raise e
|
1205
|
+
|
1198
1206
|
return df
|
1199
1207
|
|
1200
1208
|
def _evaluateForStream(self, df, evals, modelAliases, prompt_template):
|
llumo/execution.py
CHANGED
@@ -25,15 +25,14 @@ class ModelExecutor:
|
|
25
25
|
return response.choices[0].message.content
|
26
26
|
|
27
27
|
def _executeGoogle(self, modelName: str, prompt: str,api_key) -> str:
|
28
|
-
|
28
|
+
|
29
29
|
# Configure GenAI with API Key
|
30
30
|
genai.configure(api_key=api_key)
|
31
|
-
|
31
|
+
|
32
32
|
# Select Generative Model
|
33
33
|
model = genai.GenerativeModel("gemini-2.0-flash-lite")
|
34
34
|
# Generate Response
|
35
35
|
response = model.generate_content(prompt)
|
36
36
|
return response.text
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
|
38
|
+
|
llumo/helpingFuntions.py
CHANGED
@@ -8,6 +8,8 @@ import json
|
|
8
8
|
import base64
|
9
9
|
import os
|
10
10
|
import re
|
11
|
+
import openai
|
12
|
+
import google.generativeai as genai
|
11
13
|
|
12
14
|
|
13
15
|
from .models import _MODEL_METADATA, AVAILABLEMODELS
|
@@ -378,12 +380,12 @@ def createColumn(workspaceID, dataframe, playgroundID, promptText=None,queryColN
|
|
378
380
|
row_dict = {}
|
379
381
|
|
380
382
|
# For each column, we need to map the column ID to the corresponding value in the row
|
381
|
-
|
383
|
+
|
382
384
|
for col in dataframe.columns:
|
383
385
|
columnID = columnIDMapping[col]
|
384
386
|
|
385
387
|
if any(col.startswith(eval + "_") or col == eval for eval in allEvals) and not " Reason" in col and promptText!=None:
|
386
|
-
|
388
|
+
|
387
389
|
row_dict[columnID] = {
|
388
390
|
|
389
391
|
"value": row[col],
|
@@ -632,3 +634,20 @@ def validateModels(model_aliases):
|
|
632
634
|
|
633
635
|
|
634
636
|
|
637
|
+
def validateOpenaiKey(api_key):
|
638
|
+
try:
|
639
|
+
client = openai.OpenAI(api_key=api_key)
|
640
|
+
_ = client.models.list() # Light call to list models
|
641
|
+
except openai.AuthenticationError:
|
642
|
+
raise ValueError("❌ Invalid OpenAI API key.")
|
643
|
+
except Exception as e:
|
644
|
+
raise RuntimeError(f"⚠️ Error validating OpenAI key: {e}")
|
645
|
+
|
646
|
+
def validateGoogleKey(api_key):
|
647
|
+
try:
|
648
|
+
genai.configure(api_key=api_key)
|
649
|
+
_ = genai.GenerativeModel("gemini-2.0").generate_content("test")
|
650
|
+
except Exception as e:
|
651
|
+
if "PERMISSION_DENIED" in str(e) or "API key not valid" in str(e):
|
652
|
+
raise ValueError("❌ Invalid Google API key.")
|
653
|
+
raise RuntimeError(f"⚠️ Error validating Gemini key: {e}")
|
@@ -0,0 +1,13 @@
|
|
1
|
+
llumo/__init__.py,sha256=O04b4yW1BnOvcHzxWFddAKhtdBEhBNhLdb6xgnpHH_Q,205
|
2
|
+
llumo/client.py,sha256=60RSxhk-9wzK9KgBz8dfbUd3-AaKiljxqbHI5UL8GIw,54021
|
3
|
+
llumo/exceptions.py,sha256=Vp_MnanHbnd1Yjuoi6WLrKiwwZbJL3znCox2URMmGU4,2032
|
4
|
+
llumo/execution.py,sha256=nWbJ7AvWuUPcOb6i-JzKRna_PvF-ewZTiK8skS-5n3w,1380
|
5
|
+
llumo/functionCalling.py,sha256=D5jYapu1rIvdIJNUYPYMTyhQ1H-6nkwoOLMi6eekfUE,7241
|
6
|
+
llumo/helpingFuntions.py,sha256=BZfUIgTO0PJchppHn0wDRF1wcYSuMST5ry95HBPN5SQ,23534
|
7
|
+
llumo/models.py,sha256=aVEZsOOoQx5LeNtwSyBxqvrINq0izH3QWu_YjsMPE6o,2910
|
8
|
+
llumo/sockets.py,sha256=I2JO_eNEctRo_ikgvFVp5zDd-m0VDu04IEUhhsa1Tic,5950
|
9
|
+
llumo-0.2.15b2.dist-info/licenses/LICENSE,sha256=tF9yAcfPV9xGT3ViWmC8hPvOo8BEk4ZICbUfcEo8Dlk,182
|
10
|
+
llumo-0.2.15b2.dist-info/METADATA,sha256=vbXwSwhuxnO0CSMz4uJ45AepuwVMl7irZlHmYkqRYbY,1521
|
11
|
+
llumo-0.2.15b2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
12
|
+
llumo-0.2.15b2.dist-info/top_level.txt,sha256=d5zUTMI99llPtLRB8rtSrqELm_bOqX-bNC5IcwlDk88,6
|
13
|
+
llumo-0.2.15b2.dist-info/RECORD,,
|
llumo-0.2.15b1.dist-info/RECORD
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
llumo/__init__.py,sha256=O04b4yW1BnOvcHzxWFddAKhtdBEhBNhLdb6xgnpHH_Q,205
|
2
|
-
llumo/client.py,sha256=XljwD5mZxjyrXHhu8YhN0cGsd-O_LyKbPzrhS8zbqZo,53778
|
3
|
-
llumo/exceptions.py,sha256=Vp_MnanHbnd1Yjuoi6WLrKiwwZbJL3znCox2URMmGU4,2032
|
4
|
-
llumo/execution.py,sha256=x88wQV8eL99wNN5YtjFaAMCIfN1PdfQVlAZQb4vzgQ0,1413
|
5
|
-
llumo/functionCalling.py,sha256=D5jYapu1rIvdIJNUYPYMTyhQ1H-6nkwoOLMi6eekfUE,7241
|
6
|
-
llumo/helpingFuntions.py,sha256=0-ZwG0fnbfP4DP1JTMewM8LdXzz_-p1gRqhPsX0Zmpk,22785
|
7
|
-
llumo/models.py,sha256=aVEZsOOoQx5LeNtwSyBxqvrINq0izH3QWu_YjsMPE6o,2910
|
8
|
-
llumo/sockets.py,sha256=I2JO_eNEctRo_ikgvFVp5zDd-m0VDu04IEUhhsa1Tic,5950
|
9
|
-
llumo-0.2.15b1.dist-info/licenses/LICENSE,sha256=tF9yAcfPV9xGT3ViWmC8hPvOo8BEk4ZICbUfcEo8Dlk,182
|
10
|
-
llumo-0.2.15b1.dist-info/METADATA,sha256=yDLkiD46Qq44PA3ylKK2dzsXZmnuE23yxH0RmoqizOk,1521
|
11
|
-
llumo-0.2.15b1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
12
|
-
llumo-0.2.15b1.dist-info/top_level.txt,sha256=d5zUTMI99llPtLRB8rtSrqELm_bOqX-bNC5IcwlDk88,6
|
13
|
-
llumo-0.2.15b1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|