{
  "schemaVersion": "1.0",
  "item": {
    "slug": "local-places",
    "name": "Local Places",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/steipete/local-places",
    "canonicalUrl": "https://clawhub.ai/steipete/local-places",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/local-places",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=local-places",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "pyproject.toml",
      "SKILL.md",
      "SERVER_README.md",
      "src/local_places/__init__.py",
      "src/local_places/google_places.py",
      "src/local_places/schemas.py"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/local-places"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/local-places",
    "agentPageUrl": "https://openagent3.xyz/skills/local-places/agent",
    "manifestUrl": "https://openagent3.xyz/skills/local-places/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/local-places/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "📍 Local Places",
        "body": "Find places, Go fast\n\nSearch for nearby places using a local Google Places API proxy. Two-step flow: resolve location first, then search."
      },
      {
        "title": "Setup",
        "body": "cd {baseDir}\necho \"GOOGLE_PLACES_API_KEY=your-key\" > .env\nuv venv && uv pip install -e \".[dev]\"\nuv run --env-file .env uvicorn local_places.main:app --host 127.0.0.1 --port 8000\n\nRequires GOOGLE_PLACES_API_KEY in .env or environment."
      },
      {
        "title": "Quick Start",
        "body": "Check server: curl http://127.0.0.1:8000/ping\n\n\nResolve location:\n\ncurl -X POST http://127.0.0.1:8000/locations/resolve \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"location_text\": \"Soho, London\", \"limit\": 5}'\n\nSearch places:\n\ncurl -X POST http://127.0.0.1:8000/places/search \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"query\": \"coffee shop\",\n    \"location_bias\": {\"lat\": 51.5137, \"lng\": -0.1366, \"radius_m\": 1000},\n    \"filters\": {\"open_now\": true, \"min_rating\": 4.0},\n    \"limit\": 10\n  }'\n\nGet details:\n\ncurl http://127.0.0.1:8000/places/{place_id}"
      },
      {
        "title": "Conversation Flow",
        "body": "If user says \"near me\" or gives vague location → resolve it first\nIf multiple results → show numbered list, ask user to pick\nAsk for preferences: type, open now, rating, price level\nSearch with location_bias from chosen location\nPresent results with name, rating, address, open status\nOffer to fetch details or refine search"
      },
      {
        "title": "Filter Constraints",
        "body": "filters.types: exactly ONE type (e.g., \"restaurant\", \"cafe\", \"gym\")\nfilters.price_levels: integers 0-4 (0=free, 4=very expensive)\nfilters.min_rating: 0-5 in 0.5 increments\nfilters.open_now: boolean\nlimit: 1-20 for search, 1-10 for resolve\nlocation_bias.radius_m: must be > 0"
      },
      {
        "title": "Response Format",
        "body": "{\n  \"results\": [\n    {\n      \"place_id\": \"ChIJ...\",\n      \"name\": \"Coffee Shop\",\n      \"address\": \"123 Main St\",\n      \"location\": {\"lat\": 51.5, \"lng\": -0.1},\n      \"rating\": 4.6,\n      \"price_level\": 2,\n      \"types\": [\"cafe\", \"food\"],\n      \"open_now\": true\n    }\n  ],\n  \"next_page_token\": \"...\" \n}\n\nUse next_page_token as page_token in next request for more results."
      }
    ],
    "body": "📍 Local Places\n\nFind places, Go fast\n\nSearch for nearby places using a local Google Places API proxy. Two-step flow: resolve location first, then search.\n\nSetup\ncd {baseDir}\necho \"GOOGLE_PLACES_API_KEY=your-key\" > .env\nuv venv && uv pip install -e \".[dev]\"\nuv run --env-file .env uvicorn local_places.main:app --host 127.0.0.1 --port 8000\n\n\nRequires GOOGLE_PLACES_API_KEY in .env or environment.\n\nQuick Start\n\nCheck server: curl http://127.0.0.1:8000/ping\n\nResolve location:\n\ncurl -X POST http://127.0.0.1:8000/locations/resolve \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"location_text\": \"Soho, London\", \"limit\": 5}'\n\nSearch places:\ncurl -X POST http://127.0.0.1:8000/places/search \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"query\": \"coffee shop\",\n    \"location_bias\": {\"lat\": 51.5137, \"lng\": -0.1366, \"radius_m\": 1000},\n    \"filters\": {\"open_now\": true, \"min_rating\": 4.0},\n    \"limit\": 10\n  }'\n\nGet details:\ncurl http://127.0.0.1:8000/places/{place_id}\n\nConversation Flow\nIf user says \"near me\" or gives vague location → resolve it first\nIf multiple results → show numbered list, ask user to pick\nAsk for preferences: type, open now, rating, price level\nSearch with location_bias from chosen location\nPresent results with name, rating, address, open status\nOffer to fetch details or refine search\nFilter Constraints\nfilters.types: exactly ONE type (e.g., \"restaurant\", \"cafe\", \"gym\")\nfilters.price_levels: integers 0-4 (0=free, 4=very expensive)\nfilters.min_rating: 0-5 in 0.5 increments\nfilters.open_now: boolean\nlimit: 1-20 for search, 1-10 for resolve\nlocation_bias.radius_m: must be > 0\nResponse Format\n{\n  \"results\": [\n    {\n      \"place_id\": \"ChIJ...\",\n      \"name\": \"Coffee Shop\",\n      \"address\": \"123 Main St\",\n      \"location\": {\"lat\": 51.5, \"lng\": -0.1},\n      \"rating\": 4.6,\n      \"price_level\": 2,\n      \"types\": [\"cafe\", \"food\"],\n      \"open_now\": true\n    }\n  ],\n  \"next_page_token\": \"...\" \n}\n\n\nUse next_page_token as page_token in next request for more results."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/steipete/local-places",
    "publisherUrl": "https://clawhub.ai/steipete/local-places",
    "owner": "steipete",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/local-places",
    "downloadUrl": "https://openagent3.xyz/downloads/local-places",
    "agentUrl": "https://openagent3.xyz/skills/local-places/agent",
    "manifestUrl": "https://openagent3.xyz/skills/local-places/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/local-places/agent.md"
  }
}