Add integration with DataForSEO SERP API
Labels: name: area: agent, name: auto:enhancement, name: auto:documentation

This Pull Request proposes the integration of the DataForSEO API Wrapper into the Langchain project, a direct response to the growing demand from our customers. Our API is significantly more cost-effective compared to SerpApi (similar product already integrated with Langchain), while also providing a wider range of functionalities and opportunities for software developers.
We've aimed to maintain a simple programmatic interface, while also providing features that could be useful for specific tasks such as searching Google Maps, summarizing product ratings, or fetching online results for a specific location.

**Features:**
- Support for Google, Bing, Yahoo, and more.
- Advanced functionality for fetching results from Organic Search, News, Maps, Events, Images, among others.
- Search queries can be specified in different languages and set for a variety of locations.
- Capability to filter and fetch only necessary data fields from SERP, like prices from shopping results or rating from organic elements.
- Ability to limit the number of search results returned.

Usage example:
```python
import os
from langchain.llms.openai import OpenAI
from langchain.agents.initialize import initialize_agent
from langchain.tools.base import Tool
from langchain.utilities.dataforseo_api_search import DataForSeoAPIWrapper
from langchain.agents import load_tools
#The API credentials could be found in client's panel
os.environ["DATAFORSEO_LOGIN"] = ""
os.environ["DATAFORSEO_PASSWORD"] = ""
os.environ["OPENAI_API_KEY"] = ""
search = DataForSeoAPIWrapper()
llm = OpenAI(temperature=0)

#search for first result description
output = search.run("pi value")
#prints "In decimal form, the value of pi is approximately 3.14..."
print(output)

#json results, output is dict
json_output = search.results("pi value")

#takes only top-3 results and only title, snippet, description fields from JSON, restrict output to 4 SERP elements: organic, featured_snippet,answer_box, knowlege_graph
configured_search = DataForSeoAPIWrapper(
    json_result_fields=["title", "snippet","description"],
    json_result_types=["organic", "featured_snippet","answer_box", "knowlege_graph"],
    top_count=3)
configured_result = configured_search.results("Who is Bill Gates?")

#Google Maps search
maps_search = DataForSeoAPIWrapper(
    top_count=10,
    json_result_fields=["title", "value", "address", "rating", "type"],
    params={"location_coordinate": "52.512,13.36,12z", "language_code": "en", "se_type": "maps"})
maps_search.results("coffee near me")

#integration with agents
tools = load_tools(["dataforseo-api-search"])
agent = initialize_agent(tools,
                         llm,
                         agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
                         verbose=True)
result = agent.run("What is the weather in New York?")
#prints current NY weather
print(result)

#custom tool
search = DataForSeoAPIWrapper(
    top_count=3,
    json_result_types=["organic"],
    json_result_fields=["title", "description", "type"])
tool = Tool(
    name="google-search-answer",
    description="My new answer tool",
    func=search.run,
)
json_tool = Tool(
    name="google-search-json",
    description="My new json tool",
    func=search.results,
)
```