mirror of
https://github.com/Significant-Gravitas/AutoGPT.git
synced 2026-01-09 15:17:59 -05:00
- **FIX ALL LINT/TYPE ERRORS IN AUTOGPT, FORGE, AND BENCHMARK** ### Linting - Clean up linter configs for `autogpt`, `forge`, and `benchmark` - Add type checking with Pyright - Create unified pre-commit config - Create unified linting and type checking CI workflow ### Testing - Synchronize CI test setups for `autogpt`, `forge`, and `benchmark` - Add missing pytest-cov to benchmark dependencies - Mark GCS tests as slow to speed up pre-commit test runs - Repair `forge` test suite - Add `AgentDB.close()` method for test DB teardown in db_test.py - Use actual temporary dir instead of forge/test_workspace/ - Move left-behind dependencies for moved `forge`-code to from autogpt to forge ### Notable type changes - Replace uses of `ChatModelProvider` by `MultiProvider` - Removed unnecessary exports from various __init__.py - Simplify `FileStorage.open_file` signature by removing `IOBase` from return type union - Implement `S3BinaryIOWrapper(BinaryIO)` type interposer for `S3FileStorage` - Expand overloads of `GCSFileStorage.open_file` for improved typing of read and write modes Had to silence type checking for the extra overloads, because (I think) Pyright is reporting a false-positive: https://github.com/microsoft/pyright/issues/8007 - Change `count_tokens`, `get_tokenizer`, `count_message_tokens` methods on `ModelProvider`s from class methods to instance methods - Move `CompletionModelFunction.schema` method -> helper function `format_function_def_for_openai` in `forge.llm.providers.openai` - Rename `ModelProvider` -> `BaseModelProvider` - Rename `ChatModelProvider` -> `BaseChatModelProvider` - Add type `ChatModelProvider` which is a union of all subclasses of `BaseChatModelProvider` ### Removed rather than fixed - Remove deprecated and broken autogpt/agbenchmark_config/benchmarks.py - Various base classes and properties on base classes in `forge.llm.providers.schema` and `forge.models.providers` ### Fixes for other issues that came to light - Clean up `forge.agent_protocol.api_router`, `forge.agent_protocol.database`, and `forge.agent.agent` - Add fallback behavior to `ImageGeneratorComponent` - Remove test for deprecated failure behavior - Fix `agbenchmark.challenges.builtin` challenge exclusion mechanism on Windows - Fix `_tool_calls_compat_extract_calls` in `forge.llm.providers.openai` - Add support for `any` (= no type specified) in `JSONSchema.typescript_type`
85 lines
2.4 KiB
Python
85 lines
2.4 KiB
Python
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)
|
|
)
|