Source code for camel.toolkits.dappier_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 Dict, List, Literal, Optional, Union

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


[docs] class DappierToolkit(BaseToolkit): r"""A class representing a toolkit for interacting with the Dappier API. This class provides methods for searching real time data and fetching ai recommendations across key verticals like News, Finance, Stock Market, Sports, Weather and more. """ @dependencies_required("dappier") @api_keys_required( [ (None, "DAPPIER_API_KEY"), ] ) def __init__(self): r"""Initialize the DappierTookit with API clients.The API keys and credentials are retrieved from environment variables. """ from dappier import Dappier dappier_api_key = os.environ.get("DAPPIER_API_KEY") self.dappier_client = Dappier(dappier_api_key)
[docs] def search_real_time_data( self, query: str, ai_model_id: str = "am_01j06ytn18ejftedz6dyhz2b15" ) -> str: r"""Search real-time data using an AI model. This function accesses real-time information using the specified AI model based on the given query. Depending on the AI model ID, the data retrieved can vary between general web search results or financial news and stock prices. Supported AI Models: - `am_01j06ytn18ejftedz6dyhz2b15`: Access real-time Google web search results, including the latest news, weather updates, travel details, deals, and more. - `am_01j749h8pbf7ns8r1bq9s2evrh`: Access real-time financial news, stock prices, and trades from polygon.io, with AI-powered insights and up-to-the-minute updates. Args: query (str): The user-provided query. Examples include: - "How is the weather today in Austin, TX?" - "What is the latest news for Meta?" - "What is the stock price for AAPL?" ai_model_id (str, optional): The AI model ID to use for the query. The AI model ID always starts with the prefix "am_". (default: `am_01j06ytn18ejftedz6dyhz2b15`) Returns: str: The search result corresponding to the provided query and AI model ID. This may include real time search data, depending on the selected AI model. Note: Multiple AI model IDs are available, which can be found at: https://marketplace.dappier.com/marketplace """ try: response = self.dappier_client.search_real_time_data( query=query, ai_model_id=ai_model_id ) if response is None: return "An unknown error occurred" return response.message except Exception as e: return f"An unexpected error occurred: {e}"
[docs] def get_ai_recommendations( self, query: str, data_model_id: str = "dm_01j0pb465keqmatq9k83dthx34", similarity_top_k: int = 9, ref: Optional[str] = None, num_articles_ref: int = 0, search_algorithm: Literal[ "most_recent", "semantic", "most_recent_semantic", "trending" ] = "most_recent", ) -> Union[List[Dict[str, str]], Dict[str, str]]: r"""Retrieve AI-powered recommendations based on the provided query and data model. This function fetches real-time AI-generated recommendations using the specified data model and search algorithm. The results include personalized content based on the query and, optionally, relevance to a specific reference domain. Supported Data Models: - `dm_01j0pb465keqmatq9k83dthx34`: Real-time news, updates, and personalized content from top sports sources such as Sportsnaut, Forever Blueshirts, Minnesota Sports Fan, LAFB Network, Bounding Into Sports, and Ringside Intel. - `dm_01j0q82s4bfjmsqkhs3ywm3x6y`: Real-time updates, analysis, and personalized content from top sources like The Mix, Snipdaily, Nerdable, and Familyproof. Args: query (str): The user query for retrieving recommendations. data_model_id (str, optional): The data model ID to use for recommendations. Data model IDs always start with the prefix "dm_". (default: :obj: `dm_01j0pb465keqmatq9k83dthx34`) similarity_top_k (int, optional): The number of top documents to retrieve based on similarity. (default: :obj: `9`) ref (Optional[str], optional): The site domain where AI recommendations should be displayed. (default: :obj: `None`) num_articles_ref (int, optional): The minimum number of articles to return from the specified reference domain (`ref`). The remaining articles will come from other sites in the RAG model. (default: :obj: `0`) search_algorithm (Literal[ "most_recent", "semantic", "most_recent_semantic", "trending", ], optional): The search algorithm to use for retrieving articles. (default: :obj: `most_recent`) Returns: List[Dict[str, str]]: A list of recommended articles or content based on the specified parameters, query, and data model. Note: Multiple data model IDs are available and can be found at: https://marketplace.dappier.com/marketplace """ try: response = self.dappier_client.get_ai_recommendations( query=query, data_model_id=data_model_id, similarity_top_k=similarity_top_k, ref=ref, num_articles_ref=num_articles_ref, search_algorithm=search_algorithm, ) if response is None or response.status != "success": return {"error": "An unknown error occurred."} # Collect only relevant information from the response. results = [ { "author": result.author, "image_url": result.image_url, "pubdate": result.pubdate, "source_url": result.source_url, "summary": result.summary, "title": result.title, } for result in ( getattr(response.response, "results", None) or [] ) ] return results except Exception as e: return {"error": f"An unexpected error occurred: {e!s}"}
[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.search_real_time_data), FunctionTool(self.get_ai_recommendations), ]