mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-07-01 13:18:10 +00:00
* Update crewAI CLI with various enhancements and fixes - Updated `create_json_crew.py` to require `crewai[tools]>=1.14.7`. - Enhanced `git.py` with improved repository initialization, including automatic initial commit creation and exclusion patterns for initial commits. - Modified `install_crew.py` to allow error handling during installation with an optional `raise_on_error` parameter. - Expanded `plus_api.py` to include methods for creating and updating crews from ZIP files. - Introduced a new `archive.py` for creating deployable ZIP archives of CrewAI projects, ensuring local artifacts are excluded. - Updated `run_crew.py` to manage JSON crew dependencies and run crews in the project's environment. - Enhanced deployment logic in `main.py` to handle ZIP uploads and improve user feedback during deployment processes. - Added tests for new functionalities and ensured existing tests reflect recent changes in behavior and requirements. * fix(cli): address deploy zip review feedback * fix(cli): sync missing lockfile before deploy * fix(cli): preserve remote deploy on git setup warnings * test(cli): use single deploy main import style * fix(cli): skip project install for json crew sync * fix(cli): load json runner from source checkout * fix(cli): skip json crew sync when locked * fix(cli): address deploy zip review feedback * fix(cli): pass env on zip redeploy * fix(cli): harden json run and zip fallback * fix(cli): validate before deploy lock install * fix(cli): respect poetry lock for json runs * fix(cli): align json zip wrapper detection * fix(deps): bump starlette audit floor * fix(cli): avoid auth retry for deploy exits * fix(cli): update json zip script entrypoints
82 lines
2.6 KiB
Python
82 lines
2.6 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
|
|
from crewai_core.telemetry import Telemetry
|
|
import httpx
|
|
from rich.console import Console
|
|
|
|
from crewai_cli.authentication.token import get_auth_token
|
|
from crewai_cli.plus_api import PlusAPI
|
|
|
|
|
|
console = Console()
|
|
|
|
|
|
class AuthenticationRequiredError(SystemExit):
|
|
"""Raised when a Plus API command needs the user to log in first."""
|
|
|
|
|
|
class BaseCommand:
|
|
def __init__(self) -> None:
|
|
self._telemetry = Telemetry()
|
|
self._telemetry.set_tracer()
|
|
|
|
|
|
class PlusAPIMixin:
|
|
def __init__(self, telemetry: Telemetry) -> None:
|
|
try:
|
|
telemetry.set_tracer()
|
|
self.plus_api_client = PlusAPI(api_key=get_auth_token())
|
|
except Exception:
|
|
telemetry.deploy_signup_error_span()
|
|
console.print(
|
|
"Please sign up/login to CrewAI+ before using the CLI.",
|
|
style="bold red",
|
|
)
|
|
console.print("Run 'crewai login' to sign up/login.", style="bold green")
|
|
raise AuthenticationRequiredError from None
|
|
|
|
def _validate_response(self, response: httpx.Response) -> None:
|
|
"""Handle and display error messages from API responses.
|
|
|
|
Args:
|
|
response: The response from the Plus API.
|
|
"""
|
|
try:
|
|
json_response = response.json()
|
|
except (json.JSONDecodeError, ValueError):
|
|
console.print(
|
|
"Failed to parse response from Enterprise API failed. Details:",
|
|
style="bold red",
|
|
)
|
|
console.print(f"Status Code: {response.status_code}")
|
|
console.print(
|
|
f"Response:\n{response.content.decode('utf-8', errors='replace')}"
|
|
)
|
|
raise SystemExit from None
|
|
|
|
if response.status_code == 422:
|
|
console.print(
|
|
"Failed to complete operation. Please fix the following errors:",
|
|
style="bold red",
|
|
)
|
|
for field, messages in json_response.items():
|
|
for message in messages:
|
|
console.print(
|
|
f"* [bold red]{field.capitalize()}[/bold red] {message}"
|
|
)
|
|
raise SystemExit
|
|
|
|
if not response.is_success:
|
|
console.print(
|
|
"Request to Enterprise API failed. Details:", style="bold red"
|
|
)
|
|
details = (
|
|
json_response.get("error")
|
|
or json_response.get("message")
|
|
or response.content.decode("utf-8", errors="replace")
|
|
)
|
|
console.print(f"{details}")
|
|
raise SystemExit
|