from typing import Annotated, Optional 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[ Optional[str], "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[ Optional[str], "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, }