mirror of
https://github.com/hwchase17/langchain.git
synced 2025-09-15 22:44:36 +00:00
community[major], core[patch], langchain[patch], experimental[patch]: Create langchain-community (#14463)
Moved the following modules to new package langchain-community in a backwards compatible fashion: ``` mv langchain/langchain/adapters community/langchain_community mv langchain/langchain/callbacks community/langchain_community/callbacks mv langchain/langchain/chat_loaders community/langchain_community mv langchain/langchain/chat_models community/langchain_community mv langchain/langchain/document_loaders community/langchain_community mv langchain/langchain/docstore community/langchain_community mv langchain/langchain/document_transformers community/langchain_community mv langchain/langchain/embeddings community/langchain_community mv langchain/langchain/graphs community/langchain_community mv langchain/langchain/llms community/langchain_community mv langchain/langchain/memory/chat_message_histories community/langchain_community mv langchain/langchain/retrievers community/langchain_community mv langchain/langchain/storage community/langchain_community mv langchain/langchain/tools community/langchain_community mv langchain/langchain/utilities community/langchain_community mv langchain/langchain/vectorstores community/langchain_community mv langchain/langchain/agents/agent_toolkits community/langchain_community mv langchain/langchain/cache.py community/langchain_community mv langchain/langchain/adapters community/langchain_community mv langchain/langchain/callbacks community/langchain_community/callbacks mv langchain/langchain/chat_loaders community/langchain_community mv langchain/langchain/chat_models community/langchain_community mv langchain/langchain/document_loaders community/langchain_community mv langchain/langchain/docstore community/langchain_community mv langchain/langchain/document_transformers community/langchain_community mv langchain/langchain/embeddings community/langchain_community mv langchain/langchain/graphs community/langchain_community mv langchain/langchain/llms community/langchain_community mv langchain/langchain/memory/chat_message_histories community/langchain_community mv langchain/langchain/retrievers community/langchain_community mv langchain/langchain/storage community/langchain_community mv langchain/langchain/tools community/langchain_community mv langchain/langchain/utilities community/langchain_community mv langchain/langchain/vectorstores community/langchain_community mv langchain/langchain/agents/agent_toolkits community/langchain_community mv langchain/langchain/cache.py community/langchain_community ``` Moved the following to core ``` mv langchain/langchain/utils/json_schema.py core/langchain_core/utils mv langchain/langchain/utils/html.py core/langchain_core/utils mv langchain/langchain/utils/strings.py core/langchain_core/utils cat langchain/langchain/utils/env.py >> core/langchain_core/utils/env.py rm langchain/langchain/utils/env.py ``` See .scripts/community_split/script_integrations.sh for all changes
This commit is contained in:
@@ -0,0 +1,152 @@
|
||||
import logging
|
||||
from datetime import datetime as dt
|
||||
from typing import Dict, Optional, Type
|
||||
|
||||
from langchain_core.callbacks import CallbackManagerForToolRun
|
||||
from langchain_core.pydantic_v1 import BaseModel, Field
|
||||
|
||||
from langchain_community.tools.amadeus.base import AmadeusBaseTool
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class FlightSearchSchema(BaseModel):
|
||||
"""Schema for the AmadeusFlightSearch tool."""
|
||||
|
||||
originLocationCode: str = Field(
|
||||
description=(
|
||||
" The three letter International Air Transport "
|
||||
" Association (IATA) Location Identifier for the "
|
||||
" search's origin airport. "
|
||||
)
|
||||
)
|
||||
destinationLocationCode: str = Field(
|
||||
description=(
|
||||
" The three letter International Air Transport "
|
||||
" Association (IATA) Location Identifier for the "
|
||||
" search's destination airport. "
|
||||
)
|
||||
)
|
||||
departureDateTimeEarliest: str = Field(
|
||||
description=(
|
||||
" The earliest departure datetime from the origin airport "
|
||||
" for the flight search in the following format: "
|
||||
' "YYYY-MM-DDTHH:MM", where "T" separates the date and time '
|
||||
' components. For example: "2023-06-09T10:30:00" represents '
|
||||
" June 9th, 2023, at 10:30 AM. "
|
||||
)
|
||||
)
|
||||
departureDateTimeLatest: str = Field(
|
||||
description=(
|
||||
" The latest departure datetime from the origin airport "
|
||||
" for the flight search in the following format: "
|
||||
' "YYYY-MM-DDTHH:MM", where "T" separates the date and time '
|
||||
' components. For example: "2023-06-09T10:30:00" represents '
|
||||
" June 9th, 2023, at 10:30 AM. "
|
||||
)
|
||||
)
|
||||
page_number: int = Field(
|
||||
default=1,
|
||||
description="The specific page number of flight results to retrieve",
|
||||
)
|
||||
|
||||
|
||||
class AmadeusFlightSearch(AmadeusBaseTool):
|
||||
"""Tool for searching for a single flight between two airports."""
|
||||
|
||||
name: str = "single_flight_search"
|
||||
description: str = (
|
||||
" Use this tool to search for a single flight between the origin and "
|
||||
" destination airports at a departure between an earliest and "
|
||||
" latest datetime. "
|
||||
)
|
||||
args_schema: Type[FlightSearchSchema] = FlightSearchSchema
|
||||
|
||||
def _run(
|
||||
self,
|
||||
originLocationCode: str,
|
||||
destinationLocationCode: str,
|
||||
departureDateTimeEarliest: str,
|
||||
departureDateTimeLatest: str,
|
||||
page_number: int = 1,
|
||||
run_manager: Optional[CallbackManagerForToolRun] = None,
|
||||
) -> list:
|
||||
try:
|
||||
from amadeus import ResponseError
|
||||
except ImportError as e:
|
||||
raise ImportError(
|
||||
"Unable to import amadeus, please install with `pip install amadeus`."
|
||||
) from e
|
||||
|
||||
RESULTS_PER_PAGE = 10
|
||||
|
||||
# Authenticate and retrieve a client
|
||||
client = self.client
|
||||
|
||||
# Check that earliest and latest dates are in the same day
|
||||
earliestDeparture = dt.strptime(departureDateTimeEarliest, "%Y-%m-%dT%H:%M:%S")
|
||||
latestDeparture = dt.strptime(departureDateTimeLatest, "%Y-%m-%dT%H:%M:%S")
|
||||
|
||||
if earliestDeparture.date() != latestDeparture.date():
|
||||
logger.error(
|
||||
" Error: Earliest and latest departure dates need to be the "
|
||||
" same date. If you're trying to search for round-trip "
|
||||
" flights, call this function for the outbound flight first, "
|
||||
" and then call again for the return flight. "
|
||||
)
|
||||
return [None]
|
||||
|
||||
# Collect all results from the Amadeus Flight Offers Search API
|
||||
try:
|
||||
response = client.shopping.flight_offers_search.get(
|
||||
originLocationCode=originLocationCode,
|
||||
destinationLocationCode=destinationLocationCode,
|
||||
departureDate=latestDeparture.strftime("%Y-%m-%d"),
|
||||
adults=1,
|
||||
)
|
||||
except ResponseError as error:
|
||||
print(error)
|
||||
|
||||
# Generate output dictionary
|
||||
output = []
|
||||
|
||||
for offer in response.data:
|
||||
itinerary: Dict = {}
|
||||
itinerary["price"] = {}
|
||||
itinerary["price"]["total"] = offer["price"]["total"]
|
||||
currency = offer["price"]["currency"]
|
||||
currency = response.result["dictionaries"]["currencies"][currency]
|
||||
itinerary["price"]["currency"] = {}
|
||||
itinerary["price"]["currency"] = currency
|
||||
|
||||
segments = []
|
||||
for segment in offer["itineraries"][0]["segments"]:
|
||||
flight = {}
|
||||
flight["departure"] = segment["departure"]
|
||||
flight["arrival"] = segment["arrival"]
|
||||
flight["flightNumber"] = segment["number"]
|
||||
carrier = segment["carrierCode"]
|
||||
carrier = response.result["dictionaries"]["carriers"][carrier]
|
||||
flight["carrier"] = carrier
|
||||
|
||||
segments.append(flight)
|
||||
|
||||
itinerary["segments"] = []
|
||||
itinerary["segments"] = segments
|
||||
|
||||
output.append(itinerary)
|
||||
|
||||
# Filter out flights after latest departure time
|
||||
for index, offer in enumerate(output):
|
||||
offerDeparture = dt.strptime(
|
||||
offer["segments"][0]["departure"]["at"], "%Y-%m-%dT%H:%M:%S"
|
||||
)
|
||||
|
||||
if offerDeparture > latestDeparture:
|
||||
output.pop(index)
|
||||
|
||||
# Return the paginated results
|
||||
startIndex = (page_number - 1) * RESULTS_PER_PAGE
|
||||
endIndex = startIndex + RESULTS_PER_PAGE
|
||||
|
||||
return output[startIndex:endIndex]
|
Reference in New Issue
Block a user