Create client for Tools API (#1348)

This commit creates a class for the new Tools API. It extracts common
methods from crewai.cli.deploy.api.CrewAPI to a parent class.
This commit is contained in:
Vini Brasil
2024-09-25 12:37:54 -03:00
committed by GitHub
parent a5f3dd290b
commit d4d1882e72
7 changed files with 180 additions and 53 deletions

View File

@@ -1,66 +1,56 @@
from os import getenv
import requests
from crewai.cli.deploy.utils import get_crewai_version
from crewai.cli.plus_api import PlusAPI
class CrewAPI:
class CrewAPI(PlusAPI):
"""
CrewAPI class to interact with the crewAI+ API.
CrewAPI class to interact with the Crew resource in CrewAI+ API.
"""
def __init__(self, api_key: str) -> None:
self.api_key = api_key
self.headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
"User-Agent": f"CrewAI-CLI/{get_crewai_version()}",
}
self.base_url = getenv(
"CREWAI_BASE_URL", "https://app.crewai.com/crewai_plus/api/v1/crews"
)
def _make_request(self, method: str, endpoint: str, **kwargs) -> requests.Response:
url = f"{self.base_url}/{endpoint}"
return requests.request(method, url, headers=self.headers, **kwargs)
RESOURCE = "/crewai_plus/api/v1/crews"
# Deploy
def deploy_by_name(self, project_name: str) -> requests.Response:
return self._make_request("POST", f"by-name/{project_name}/deploy")
return self._make_request(
"POST", f"{self.RESOURCE}/by-name/{project_name}/deploy"
)
def deploy_by_uuid(self, uuid: str) -> requests.Response:
return self._make_request("POST", f"{uuid}/deploy")
return self._make_request("POST", f"{self.RESOURCE}/{uuid}/deploy")
# Status
def status_by_name(self, project_name: str) -> requests.Response:
return self._make_request("GET", f"by-name/{project_name}/status")
return self._make_request(
"GET", f"{self.RESOURCE}/by-name/{project_name}/status"
)
def status_by_uuid(self, uuid: str) -> requests.Response:
return self._make_request("GET", f"{uuid}/status")
return self._make_request("GET", f"{self.RESOURCE}/{uuid}/status")
# Logs
def logs_by_name(
self, project_name: str, log_type: str = "deployment"
) -> requests.Response:
return self._make_request("GET", f"by-name/{project_name}/logs/{log_type}")
return self._make_request(
"GET", f"{self.RESOURCE}/by-name/{project_name}/logs/{log_type}"
)
def logs_by_uuid(
self, uuid: str, log_type: str = "deployment"
) -> requests.Response:
return self._make_request("GET", f"{uuid}/logs/{log_type}")
return self._make_request("GET", f"{self.RESOURCE}/{uuid}/logs/{log_type}")
# Delete
def delete_by_name(self, project_name: str) -> requests.Response:
return self._make_request("DELETE", f"by-name/{project_name}")
return self._make_request("DELETE", f"{self.RESOURCE}/by-name/{project_name}")
def delete_by_uuid(self, uuid: str) -> requests.Response:
return self._make_request("DELETE", f"{uuid}")
return self._make_request("DELETE", f"{self.RESOURCE}/{uuid}")
# List
def list_crews(self) -> requests.Response:
return self._make_request("GET", "")
return self._make_request("GET", self.RESOURCE)
# Create
def create_crew(self, payload) -> requests.Response:
return self._make_request("POST", "", json=payload)
return self._make_request("POST", self.RESOURCE, json=payload)

View File

@@ -0,0 +1,23 @@
import requests
from os import getenv
from crewai.cli.deploy.utils import get_crewai_version
class PlusAPI:
"""
This class exposes methods for working with the CrewAI+ API.
"""
def __init__(self, api_key: str) -> None:
self.api_key = api_key
self.headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
"User-Agent": f"CrewAI-CLI/{get_crewai_version()}",
"X-Crewai-Version": get_crewai_version(),
}
self.base_url = getenv("CREWAI_BASE_URL", "https://app.crewai.com")
def _make_request(self, method: str, endpoint: str, **kwargs) -> requests.Response:
url = f"{self.base_url}/{endpoint}"
return requests.request(method, url, headers=self.headers, **kwargs)

View File

View File

@@ -0,0 +1,26 @@
from typing import Optional
from crewai.cli.plus_api import PlusAPI
class ToolsAPI(PlusAPI):
RESOURCE = "/crewai_plus/api/v1/tools"
def get(self, handle: str):
return self._make_request("GET", f"{self.RESOURCE}/{handle}")
def publish(
self,
handle: str,
public: bool,
version: str,
description: Optional[str],
encoded_file: str,
):
params = {
"handle": handle,
"public": public,
"version": version,
"file": encoded_file,
"description": description,
}
return self._make_request("POST", f"{self.RESOURCE}", json=params)