Source code for camel.toolkits.zapier_toolkit

# ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. =========

import os
from typing import Any, Dict, List

import requests

from camel.toolkits.base import BaseToolkit
from camel.toolkits.function_tool import FunctionTool
from camel.utils import api_keys_required, dependencies_required


[docs] class ZapierToolkit(BaseToolkit): r"""A class representing a toolkit for interacting with Zapier's NLA API. This class provides methods for executing Zapier actions through natural language commands, allowing integration with various web services and automation of workflows through the Zapier platform. Attributes: api_key (str): The API key for authenticating with Zapier's API. base_url (str): The base URL for Zapier's API endpoints. """ @dependencies_required("requests") @api_keys_required( [ (None, "ZAPIER_NLA_API_KEY"), ] ) def __init__(self) -> None: r"""Initialize the ZapierToolkit with API client. The API key is retrieved from environment variables. """ self.api_key = os.environ.get("ZAPIER_NLA_API_KEY") self.base_url = "https://actions.zapier.com/api/v1/"
[docs] def list_actions(self) -> Dict[str, Any]: r"""List all available Zapier actions. Returns: Dict[str, Any]: A dictionary containing the list of available actions. """ headers = { 'accept': 'application/json', 'x-api-key': self.api_key, } response = requests.get( f"{self.base_url}exposed/", params={'api_key': self.api_key}, headers=headers, ) response.raise_for_status() return response.json()
[docs] def execute_action( self, action_id: str, instructions: str, ) -> Dict[str, Any]: r"""Execute a specific Zapier action using natural language instructions. Args: action_id (str): The ID of the Zapier action to execute. instructions (str): Natural language instructions for executing the action. For example: "Send an email to john@example.com with subject 'Hello' and body 'How are you?'" Returns: Dict[str, Any]: The result of the action execution, including status and any output data. """ try: headers = { 'accept': 'application/json', 'x-api-key': self.api_key, 'Content-Type': 'application/json', } data = { "instructions": instructions, "preview_only": False, } response = requests.post( f"{self.base_url}exposed/{action_id}/execute/", params={'api_key': self.api_key}, headers=headers, json=data, ) response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: return {"error": f"Request failed: {e!s}"} except ValueError: return {"error": "Response is not valid JSON"}
[docs] def preview_action( self, action_id: str, instructions: str, ) -> Dict[str, Any]: r"""Preview a specific Zapier action using natural language instructions. Args: action_id (str): The ID of the Zapier action to preview. instructions (str): Natural language instructions for previewing the action. For example: "Send an email to john@example.com with subject 'Hello' and body 'How are you?'" Returns: Dict[str, Any]: The preview result showing what parameters would be used if the action were executed. """ try: headers = { 'accept': 'application/json', 'x-api-key': self.api_key, 'Content-Type': 'application/json', } data = { "instructions": instructions, "preview_only": True, } response = requests.post( f"{self.base_url}exposed/{action_id}/execute/", params={'api_key': self.api_key}, headers=headers, json=data, ) response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: return {"error": f"Request failed: {e!s}"} except ValueError: return {"error": "Response is not valid JSON"}
[docs] def get_execution_result(self, execution_id: str) -> Dict[str, Any]: r"""Get the execution result of a Zapier action. Args: execution_id (str): The execution ID returned from execute_action. Returns: Dict[str, Any]: The execution result containing status, logs, and any output data from the action execution. """ try: headers = { 'accept': 'application/json', 'x-api-key': self.api_key, } response = requests.get( f"{self.base_url}execution-log/{execution_id}/", params={'api_key': self.api_key}, headers=headers, ) response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: return {"error": f"Request failed: {e!s}"} except ValueError: return {"error": "Response is not valid JSON"}
[docs] def get_tools(self) -> List[FunctionTool]: r"""Returns a list of FunctionTool objects representing the functions in the toolkit. Returns: List[FunctionTool]: A list of FunctionTool objects representing the functions in the toolkit. """ return [ FunctionTool(self.list_actions), FunctionTool(self.execute_action), FunctionTool(self.preview_action), FunctionTool(self.get_execution_result), ]