Skip to main content

Tourist Framework

Project description

Tourist🤳

PyPI version

An open-source, low-cost, serverless application for SERP extraction and web scraping.

Work on LLM projects without worrying about credits, subscriptions, or rate-limits. Tourist is a free alternative to many mainstream SERP API services. Run Tourist on your machine or deploy it into your own AWS account.

[!IMPORTANT]
Tourist is in early development. Features and API's may change unexpectedly.

Overview

tourist-architecture

Tourist has both Service and Client components. The Service (HTTP API) handles requests from the Client (your app, agent, or scraper scripts). You're in control of both components! None of your data is ever processed or stored by third parties.

Service

Local deployment (for testing...)

[!TIP]
Docker is recommended for running Tourist locally to handle dependencies for headless browsing.

  1. docker run -e X_API_KEY="whatever" -p 8000:8000 ghcr.io/pogzyb/tourist:latest app

If the service came up correctly, you should see:

INFO:     Started server process [1]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

Check the docs at http://localhost:8000/docs

🆕 MCP mode available with Azure deployment

  1. docker run -e X_API_KEY="whatever" -p 8000:8000 ghcr.io/pogzyb/tourist:latest mcp

AWS deployment

Prerequisites:

  1. AWS Account and Credentials
  2. S3 Bucket for managing an OpenTofu statefile
  3. Docker

Read about the deployment container in the deploy/ folder.

Example deployment command:

docker run \
    -v /var/run/docker.sock:/var/run/docker.sock \
    --env-file .env \
    ghcr.io/pogzyb/tourist-deploy:latest aws deploy \
    --state-bucket llmabda-statefile \
    --region us-east-1 \
    --mode app \
    --x-api-key SeCretTK3y

Use your endpoint: https://xxxxxxxx.lambda-url.us-east-1.on.aws (available the deployment outputs)

🆕 Azure deployment

Prerequisites:

  1. Azure Account and Credentials (ARM_CLIENT_ID, ARM_CLIENT_SECRET, ARM_TENANT_ID, and ARM_SUBSCRIPTION_ID)
  2. A resource group, storage account, and storage container for managing an OpenTofu statefile
  3. Docker
docker run \
    -v /var/run/docker.sock:/var/run/docker.sock \
    --env-file .env \
    ghcr.io/pogzyb/tourist-deploy:latest azure deploy \
    --tofu-resource-group "tofu-resource-group" \
    --tofu-storage-account-name "tofustatemanagment" \
    --tofu-container-name "statefiles" \
    --x-api-key "MyS3creTkeey" \
    --mode mcp

Use your endpoint: https://tourist.xxxxxxxx.eastus.azurecontainerapps.io (available the deployment outputs)

[!WARNING]
Tourist uses serverless infrastructure to keep costs extremely low; however these costs will not be $0.00 depending on how heavily you use your API.

[!IMPORTANT]
Tourist uses the X-API-KEY authorization header to protect your API, you should set this value when deploying.

Client

Build your own LLM tools, web scraping apps, or automated testing workflows with the Tourist client.

Python

You can use the python client to interact with your Tourist service. Check out the examples folder for the complete code.

pip install tourist
LLM Tools
import asyncio

from llama_index.llms.ollama import Ollama
from llama_index.core.agent.workflow import FunctionAgent
from tourist.client import TouristScraper

# Assumes you're running locally,
# change this to your lambda endpoint if you've deployed to your aws account.
tourist_scraper = TouristScraper(
    func_urls="http://localhost:8000",
    x_api_key="whatever",
)


async def search_web(query: str):
    """Search places, items, people, or current events online."""
    serp_result = await tourist_scraper.aget_serp(
        query, search_engine="duckduckgo", max_results=3
    )
    return serp_result


async def main():
    llm = Ollama(model="ministral-3:3b", request_timeout=120.0)

    agent = FunctionAgent(
        tools=[search_web],
        llm=llm,
        system_prompt="You are a helpful assistant that can search the web for information.",
        verbose=True,
    )

    response = await agent.run(
        user_msg="Which country has the most medals in the 2026 winter olympics?"
    )
    print(str(response))


if __name__ == "__main__":
    asyncio.run(main())

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tourist-0.5.3.tar.gz (369.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tourist-0.5.3-py3-none-any.whl (17.4 kB view details)

Uploaded Python 3

File details

Details for the file tourist-0.5.3.tar.gz.

File metadata

  • Download URL: tourist-0.5.3.tar.gz
  • Upload date:
  • Size: 369.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for tourist-0.5.3.tar.gz
Algorithm Hash digest
SHA256 cdf139257db38ce71b7d489a70af72113e71347e879b2385e425cc7ba6137bda
MD5 d83d5d3e17e6409d3d67b003df74c825
BLAKE2b-256 ff60756e7a8ae2ea53cd80039d1a784d988b9abea65225d889bacd6c9cc17c85

See more details on using hashes here.

File details

Details for the file tourist-0.5.3-py3-none-any.whl.

File metadata

  • Download URL: tourist-0.5.3-py3-none-any.whl
  • Upload date:
  • Size: 17.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for tourist-0.5.3-py3-none-any.whl
Algorithm Hash digest
SHA256 14e1551dea2112a7c3f140698e64d7cddd9143b2a29e62fc24b3a9879b602f11
MD5 f50f10ce2f43469c94e16e170d7530e8
BLAKE2b-256 996f15ca1a12a4c25aba80cfad8cae3e73c7d17be63dde029e717f5d859661fd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page