arcade-mcp/toolkits/search/arcade_search/tools/google_jobs.py
Eric Gustin 6af49ef068
Common changes in all toolkits (#345)
Addresses general improvements to all toolkits including changing ruff
from python 3.9 to python 3.10 which is the reason for the removal of
Optional[] among others.

Also, turns out that our `make install` for toolkits wasn't correctly
checking for whether poetry was installed (&> /dev/null syntax isn't
supported by our check-toolkits GitHub action, so we were installing
poetry twice. I replaced with the more portable >/dev/null 2>&1)

Question: Should we also change ruff to py310 for the `arcade/` package
in a later PR?

-------------------

CU-86b4gzyp6
2025-04-04 09:32:37 -07:00

65 lines
2 KiB
Python

from typing import Annotated
from arcade.sdk import ToolContext, tool
from arcade_search.constants import DEFAULT_GOOGLE_JOBS_LANGUAGE
from arcade_search.exceptions import LanguageNotFoundError
from arcade_search.google_data import LANGUAGE_CODES
from arcade_search.utils import call_serpapi, prepare_params
@tool(requires_secrets=["SERP_API_KEY"])
async def search_jobs(
context: ToolContext,
query: Annotated[
str,
"Search query. Provide a job title, company name, and/or any keywords in general "
"representing what kind of jobs the user is looking for. E.g. 'software engineer' "
"or 'data analyst at Apple'.",
],
location: Annotated[
str | None,
"Location to search for jobs. E.g. 'United States' or 'New York, NY'. Defaults to None.",
] = None,
language: Annotated[
str,
"2-character language code to use in the Google Jobs search. "
f"E.g. 'en' for English. Defaults to '{DEFAULT_GOOGLE_JOBS_LANGUAGE}'.",
] = DEFAULT_GOOGLE_JOBS_LANGUAGE,
limit: Annotated[
int,
"Maximum number of results to retrieve. Defaults to 10 (max supported by the API).",
] = 10,
next_page_token: Annotated[
str | None,
"Next page token to paginate results. Defaults to None (start from the first page).",
] = None,
) -> Annotated[dict, "Google Jobs results"]:
"""Search Google Jobs using SerpAPI."""
if language not in LANGUAGE_CODES:
raise LanguageNotFoundError(language)
params = prepare_params(
engine="google_jobs",
q=query,
hl=language,
)
if location:
params["location"] = location
if next_page_token:
params["next_page_token"] = next_page_token
results = call_serpapi(context, params)
jobs_results = results.get("jobs_results", [])
try:
next_page_token = results["serpapi_pagination"]["next_page_token"]
except KeyError:
next_page_token = None
return {
"jobs": jobs_results[:limit],
"next_page_token": next_page_token,
}