aboutsummaryrefslogtreecommitdiff
path: root/benchmark/agbenchmark/utils/get_data_from_helicone.py
diff options
context:
space:
mode:
Diffstat (limited to 'benchmark/agbenchmark/utils/get_data_from_helicone.py')
-rw-r--r--benchmark/agbenchmark/utils/get_data_from_helicone.py83
1 files changed, 83 insertions, 0 deletions
diff --git a/benchmark/agbenchmark/utils/get_data_from_helicone.py b/benchmark/agbenchmark/utils/get_data_from_helicone.py
new file mode 100644
index 000000000..dabb2c8b0
--- /dev/null
+++ b/benchmark/agbenchmark/utils/get_data_from_helicone.py
@@ -0,0 +1,83 @@
+import json
+import logging
+import os
+from typing import Optional
+
+import requests
+
+from agbenchmark.__main__ import BENCHMARK_START_TIME
+from agbenchmark.agent_interface import HELICONE_GRAPHQL_LOGS
+
+logger = logging.getLogger(__name__)
+
+
+def get_data_from_helicone(challenge: str) -> Optional[float]:
+ # Define the endpoint of your GraphQL server
+ url = "https://www.helicone.ai/api/graphql"
+
+ # Set the headers, usually you'd need to set the content type and possibly an authorization token
+ headers = {"authorization": f"Bearer {os.environ.get('HELICONE_API_KEY')}"}
+
+ # Define the query, variables, and operation name
+ query = """
+query ExampleQuery($properties: [PropertyFilter!]){
+ aggregatedHeliconeRequest(properties: $properties) {
+ costUSD
+ }
+}
+"""
+
+ variables = {
+ "properties": [
+ {
+ "value": {"equals": os.environ.get("AGENT_NAME")},
+ "name": "agent",
+ },
+ {
+ "value": {"equals": BENCHMARK_START_TIME},
+ "name": "benchmark_start_time",
+ },
+ {"value": {"equals": challenge}, "name": "challenge"},
+ ]
+ }
+ if HELICONE_GRAPHQL_LOGS:
+ logger.debug(f"Executing Helicone query:\n{query.strip()}")
+ logger.debug(f"Query variables:\n{json.dumps(variables, indent=4)}")
+
+ operation_name = "ExampleQuery"
+
+ data = {}
+ response = None
+
+ try:
+ response = requests.post(
+ url,
+ headers=headers,
+ json={
+ "query": query,
+ "variables": variables,
+ "operationName": operation_name,
+ },
+ )
+
+ data = response.json()
+ except requests.HTTPError as http_err:
+ logger.error(f"Helicone returned an HTTP error: {http_err}")
+ return None
+ except json.JSONDecodeError:
+ raw_response = response.text # type: ignore
+ logger.error(
+ f"Helicone returned an invalid JSON response: '''{raw_response}'''"
+ )
+ return None
+ except Exception as err:
+ logger.error(f"Error while trying to get data from Helicone: {err}")
+ return None
+
+ if data is None or data.get("data") is None:
+ logger.error("Invalid response received from Helicone: no data")
+ logger.error(f"Offending response: {response}")
+ return None
+ return (
+ data.get("data", {}).get("aggregatedHeliconeRequest", {}).get("costUSD", None)
+ )