{"id":"b3aebe43-5f95-4ea3-ad07-2520157b5d5c","entityType":"agent","slug":"crewai-emeraldriverlanga-real-estate-scraper-crewai","name":"Real-Estate-Scraper-CrewAI","canonicalUrl":"https://www.xpersona.co/agent/crewai-emeraldriverlanga-real-estate-scraper-crewai","canonicalPath":"/agent/crewai-emeraldriverlanga-real-estate-scraper-crewai","generatedAt":"2026-10-10T07:26:04.170Z","source":"GITHUB_REPOS","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-09T19:05:27.355Z","emptyReason":null},"description":"Selenium scraper for commercial real-estate listings (saved as CSV/JSON with Pandas), plus three AI analyses of the same data — a LangChain summary, a LlamaIndex text-to-SQL Q&A, and a CrewAI two-agent crew. Stable scraping via WebDriverWait + BeautifulSoup, with unit tests. Commercial Real Estate Scraper + AI Analysis Overview A Python pipeline that scrapes commercial real-estate listings from $1 with Selenium across multiple result pages, saves them in a structured form with Pandas (CSV + JSON), and analyzes the same data **three independent ways**, each with a different AI framework: - **LangChain** — a plain-language \"Top 5 offers\" business summary. - **LlamaIndex** — natural-languag","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. Last updated 10/9/2026.","installCommand":null,"sourceUrl":"https://github.com/EmeraldRiverLanga/Real-Estate-Scraper-CrewAI","homepage":null,"primaryLinks":[{"label":"View Source","url":"https://github.com/EmeraldRiverLanga/Real-Estate-Scraper-CrewAI","kind":"source"}],"safetyScore":66,"overallRank":18.4,"popularityScore":0,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Selenium scraper for commercial real-estate listings (saved as CSV/JSON with Pandas), plus three AI analyses of the same data — a LangChain summary, a LlamaInde"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T19:05:27.355Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[{"label":"crewai","status":"self-declared"},{"label":"multi-agent","status":"self-declared"}],"verifiedCount":0,"selfDeclaredCount":3,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"},{"key":"crewai","type":"capability","support":"supported","confidenceSource":"profile","notes":"Declared in agent profile metadata"},{"key":"multi-agent","type":"capability","support":"supported","confidenceSource":"profile","notes":"Declared in agent profile metadata"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile capability:crewai|supported|profile capability:multi-agent|supported|profile"}},"adoption":{"evidence":{"source":"no-adoption-signals","verified":false,"confidence":"low","updatedAt":"2026-10-09T19:05:27.355Z","emptyReason":"No source adoption metrics were available."},"stars":0,"forks":0,"downloads":null,"packageName":null,"latestVersion":null,"tractionLabel":null},"release":{"evidence":{"source":"agent-index","verified":false,"confidence":"medium","updatedAt":"2026-10-09T19:05:27.349Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T19:05:27.355Z","lastCrawledAt":"2026-10-09T19:05:27.349Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-16T19:05:27.349Z","lastVerifiedAt":null,"highlights":[]},"execution":{"evidence":{"source":"GITHUB REPOS","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":null,"setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/crewai-emeraldriverlanga-real-estate-scraper-crewai/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/crewai-emeraldriverlanga-real-estate-scraper-crewai/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/crewai-emeraldriverlanga-real-estate-scraper-crewai/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/crewai-emeraldriverlanga-real-estate-scraper-crewai/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/crewai-emeraldriverlanga-real-estate-scraper-crewai/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/crewai-emeraldriverlanga-real-estate-scraper-crewai/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"GITHUB_REPOS","generatedAt":"2026-10-10T07:26:04.170Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/crewai-emeraldriverlanga-real-estate-scraper-crewai/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/crewai-emeraldriverlanga-real-estate-scraper-crewai/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/crewai-emeraldriverlanga-real-estate-scraper-crewai/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/crewai-emeraldriverlanga-real-estate-scraper-crewai/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"GITHUB REPOS","verified":false,"confidence":"high","updatedAt":"2026-10-09T19:05:27.355Z","emptyReason":null},"readme":"# Commercial Real Estate Scraper + AI Analysis\n\n## Overview\n\nA Python pipeline that scrapes commercial real-estate listings from\n[city24.lv](https://www.city24.lv) with Selenium across multiple result pages,\nsaves them in a structured form with Pandas (CSV + JSON), and analyzes the same\ndata **three independent ways**, each with a different AI framework:\n\n- **LangChain** — a plain-language \"Top 5 offers\" business summary.\n- **LlamaIndex** — natural-language questions about the data (text-to-SQL).\n- **CrewAI** — two collaborating agents: a Scraper Agent and an Analyst Agent.\n\nThe scraper is built for reliability on a JavaScript-rendered, bot-protected\nsite: it uses `WebDriverWait`, handles errors, paginates politely, and does not\nrely on `time.sleep` for loading. The scraping logic lives in a single module\n(`scraper.py`) reused by both `main.py` and the CrewAI agent, and its parsing\nand price-cleaning functions are covered by unit tests.\n\n![Scraper running and the scraped listings shown in structured columns](screenshots/scraper.PNG)\n\n## Technologies Used\n\n- **Python 3.11** — core language\n- **Selenium** — browser automation (also gets past the site's bot protection)\n- **BeautifulSoup4** — extracts data from a static HTML snapshot\n- **Pandas** — structuring, cleaning, and saving the data\n- **pytest** — unit tests for the parsing and price-cleaning logic\n- **LangChain** (`langchain-openai`) — analysis A (summary)\n- **LlamaIndex** (core `NLSQLTableQueryEngine` + SQLAlchemy) — analysis B (Q&A)\n- **CrewAI** — analysis C (multi-agent)\n- **OpenRouter** — LLM backend for all three analyses\n- **python-dotenv** — API key management\n- **VS Code** — development environment\n\n## Setup\n\n### Requirements\n\n- Python 3.11\n- Google Chrome installed (Selenium 4 downloads the matching driver automatically)\n- An OpenRouter API key (only needed for the three AI analyses)\n\n### Create the environment and install dependencies\n\n```powershell\npy -3.11 -m venv .venv\n.venv\\Scripts\\activate\npip install -r requirements.txt\n```\n\n### Add your API key\n\nCreate a `.env` file in the project root:\n\n```\nOPENROUTER_API_KEY=your-openrouter-api-key-here\n```\n\nThe `.env` file is in `.gitignore`, so the key never reaches the repository.\nThe scraper itself works without a key — only the AI analyses need it.\n\n## How to Run\n\n```powershell\npython main.py                 # scrape city24.lv (multiple pages) -> CSV + JSON\npython analysis_langchain.py   # analysis A: LangChain \"Top 5\" summary\npython analysis_llamaindex.py  # analysis B: LlamaIndex natural-language Q&A\npython analysis_crewai.py      # analysis C: CrewAI two-agent crew\npython list_models.py          # helper: list available OpenRouter models\npython -m pytest -v            # run the unit tests\n```\n\n`main.py` produces the data; the three analysis scripts read the saved CSV\n(analysis C re-scrapes live through its Scraper Agent).\n\n![LangChain \"Top 5 piedāvājumi\" AI summary in the terminal](screenshots/python_analysis.PNG)\n\n## Project Structure\n\n```\nCity24-Scraper/\n├── scraper.py              # all scraping logic (single source of truth)\n├── main.py                 # runs the scraper -> CSV + JSON\n├── test_scraper.py         # unit tests for parsing + price cleaning\n├── analysis_langchain.py   # Analysis A: LangChain summary\n├── analysis_llamaindex.py  # Analysis B: LlamaIndex text-to-SQL Q&A\n├── analysis_crewai.py      # Analysis C: CrewAI scraper + analyst agents\n├── list_models.py          # helper: list OpenRouter models\n├── data/                   # output CSV + JSON (the scraped dataset)\n├── screenshots/            # screenshots used in this README\n├── requirements.txt\n├── .gitignore\n├── .env                    # OpenRouter key (ignored by Git)\n└── README.md\n```\n\n## How the Scraper Works\n\ncity24.lv is a JavaScript-rendered (React) site behind bot protection, so a\nplain HTTP request is not enough. The scraper:\n\n1. Opens each results page with a real (non-headless) Chrome via Selenium,\n   which gets past the bot protection and runs the page's JavaScript.\n2. Waits with `WebDriverWait` until **real listing content** has loaded — not\n   just the skeleton placeholders the page shows first.\n3. Takes a **single static HTML snapshot** and parses it with BeautifulSoup.\n   Working on a static snapshot avoids `StaleElementReferenceException`, which\n   happens when React re-renders the list while live element references are held.\n4. **Paginates** through the result pages (path segment `/pg=N`), with a short\n   courtesy delay between pages and a page cap, to stay responsible toward the\n   server (~150 listings).\n5. Extracts each listing's address, city, category, price (raw + cleaned\n   numeric), size/features, and link, and saves everything with Pandas as CSV\n   and JSON.\n\n### Data fields\n\n| Column | Description |\n|---|---|\n| `address` | Street address / object name |\n| `city` | City or municipality |\n| `category` | Property type (e.g. retail, office, warehouse) |\n| `price_text` | Price as shown on the site |\n| `price_eur` | Price cleaned to a number (EUR) |\n| `features` | Area / rooms info |\n| `link` | Full URL to the listing |\n\n## Testing\n\nThe pure logic — HTML parsing (`parse_listings`), price cleaning\n(`clean_price`), and skeleton detection (`is_skeleton`) — is covered by unit\ntests in `test_scraper.py`, run with `pytest`. The parsing test runs on a small\nHTML sample, so the whole suite needs no browser or network and runs instantly.\n\n![All 10 unit tests passing](screenshots/pytest.PNG)\n\n## The Three Analyses\n\n### A — LangChain \"Top 5 offers\"\n\nPython computes all the statistics (count, average, min/max, the 5 cheapest),\nand the LLM is asked **only to phrase those finished numbers** in Latvian. The\nmodel never does the arithmetic, so the figures in the summary are always exact.\n\n### B — LlamaIndex natural-language Q&A (text-to-SQL)\n\nThe data is loaded into an in-memory SQLite table. LlamaIndex's\n`NLSQLTableQueryEngine` turns a Latvian question into a SQL query (e.g. \"which\nis cheapest?\" -> `... ORDER BY price_eur LIMIT 1`), runs it, and phrases the\nanswer.\n\n### C — CrewAI two collaborating agents\n\n- **Scraper Agent** — has a Selenium-based tool that scrapes the listings.\n- **Analyst Agent** — receives the scraped data and writes a Latvian summary\n  with the Top 5 cheapest offers.\n\nThe two agents run sequentially as a Crew, passing the scraped data from the\nfirst task to the second.\n\n## Key Design Decisions\n\n### 1. Selenium renders, BeautifulSoup parses a static snapshot\n\nSelenium gets past bot protection, runs the JavaScript, waits, and (in the\nagent) drives the browser. BeautifulSoup then parses a frozen snapshot of the\nresult. This split removes the `StaleElementReferenceException` that live\nelement references cause on a re-rendering React page.\n\n### 2. Wait for real content, not skeleton placeholders\n\nThe page first shows skeleton placeholders (an address renders as `mmmmm`).\nWaiting only for an element to *exist* is not enough, because the skeleton\nexists too. The scraper waits until real addresses are present and skips any\nremaining skeleton rows during extraction.\n\n### 3. robots.txt compliance\n\nThe scraper only reads plain category and page URLs and avoids every path\nparameter disallowed in `robots.txt` (price/floor/category/sort filters, account\npages, etc.). It scrapes a capped, modest volume.\n\n### 4. The AI rephrases, it does not calculate (analysis A)\n\nAll numbers come from Python; the model only turns them into sentences, which\nguarantees the figures are correct.\n\n### 5. A maintained tool over a deprecated one (analysis B)\n\nLlamaIndex's `PandasQueryEngine` lives in the deprecated\n`llama-index-experimental` package with a fragile dependency chain. The project\nuses the maintained core `NLSQLTableQueryEngine` (text-to-SQL) instead.\n\n### 6. One scraping module, with tested pure functions\n\nThe scraping logic lives only in `scraper.py` (used by `main.py` and the CrewAI\nagent), and its parsing and price-cleaning functions are covered by unit tests —\nso a change in one place is reflected everywhere and verified automatically.\n\n### 7. The API key is never in the source code\n\nThe OpenRouter key is read from `.env` via `python-dotenv`, and `.env` is in\n`.gitignore` from the start.\n\n## Challenges & Solutions\n\n| Problem | Solution |\n|---|---|\n| Listings loaded as skeleton placeholders (`mmmmm`) and were scraped empty | Wait until real addresses are present, and skip skeleton rows during parsing |\n| `StaleElementReferenceException` when React re-rendered the list | Parse a single static `page_source` snapshot with BeautifulSoup instead of holding live element references |\n| Price stored as text with `€`, spaces, and a \"Jauna cena\" badge | Cleaned to a numeric `price_eur` column with a regex (kept the raw text too) |\n| Python 3.14 had no prebuilt wheels; `pip` tried to compile pandas and failed | Recreated the virtual environment with Python 3.11 |\n| `llama-index-experimental` is deprecated and its import chain failed | Switched to the maintained core `NLSQLTableQueryEngine` |\n| OpenRouter free models returned `429` (rate-limited) | Switched to a cheap, reliable paid model (`openai/gpt-oss-120b`) |\n| LlamaIndex tried to load default OpenAI embeddings | Set a `MockEmbedding`; explicit-table text-to-SQL does not need real embeddings |\n\n## Scope and Limitations\n\nThe project is honest about its current edges:\n\n- **One listing category.** It scrapes `commercials-for-sale`; the page count is\n  capped (~150 listings across a few pages) to stay responsible — easily raised.\n- **`category` can be empty** for some listings — handled gracefully.\n- **Text-to-SQL (B) is not 100% reliable.** The same question can succeed or fail\n  depending on the SQL the model generates; a clearer question makes it more\n  reliable.\n- **The CrewAI run re-scrapes live** every time, so it is slower than the other\n  two scripts.\n- **Free/cheap LLM models** can be rate-limited or vary slightly between runs.\n","readmeExcerpt":"Commercial Real Estate Scraper + AI Analysis Overview A Python pipeline that scrapes commercial real-estate listings from $1 with Selenium across multiple result pages, saves them in a structured form with Pandas (CSV + JSON), and analyzes the same data **three independent ways**, each with a different AI framework: - **LangChain** — a plain-language \"Top 5 offers\" business summary. - **LlamaIndex** — natural-languag","codeSnippets":[],"executableExamples":[{"language":"powershell","snippet":"py -3.11 -m venv .venv\n.venv\\Scripts\\activate\npip install -r requirements.txt"},{"language":"text","snippet":"OPENROUTER_API_KEY=your-openrouter-api-key-here"},{"language":"powershell","snippet":"python main.py                 # scrape city24.lv (multiple pages) -> CSV + JSON\npython analysis_langchain.py   # analysis A: LangChain \"Top 5\" summary\npython analysis_llamaindex.py  # analysis B: LlamaIndex natural-language Q&A\npython analysis_crewai.py      # analysis C: CrewAI two-agent crew\npython list_models.py          # helper: list available OpenRouter models\npython -m pytest -v            # run the unit tests"},{"language":"text","snippet":"City24-Scraper/\n├── scraper.py              # all scraping logic (single source of truth)\n├── main.py                 # runs the scraper -> CSV + JSON\n├── test_scraper.py         # unit tests for parsing + price cleaning\n├── analysis_langchain.py   # Analysis A: LangChain summary\n├── analysis_llamaindex.py  # Analysis B: LlamaIndex text-to-SQL Q&A\n├── analysis_crewai.py      # Analysis C: CrewAI scraper + analyst agents\n├── list_models.py          # helper: list OpenRouter models\n├── data/                   # output CSV + JSON (the scraped dataset)\n├── screenshots/            # screenshots used in this README\n├── requirements.txt\n├── .gitignore\n├── .env                    # OpenRouter key (ignored by Git)\n└── README.md"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[],"languages":["python"],"docsSourceLabel":"GITHUB REPOS","editorialOverview":"Selenium scraper for commercial real-estate listings (saved as CSV/JSON with Pandas), plus three AI analyses of the same data — a LangChain summary, a LlamaIndex text-to-SQL Q&A, and a CrewAI two-agent crew. Stable scraping via WebDriverWait + BeautifulSoup, with unit tests. Commercial Real Estate Scraper + AI Analysis Overview A Python pipeline that scrapes commercial real-estate listings from $1 with Selenium across multiple result pages, saves them in a structured form with Pandas (CSV + JSON), and analyzes the same data **three independent ways**, each with a different AI framework: - **LangChain** — a plain-language \"Top 5 offers\" business summary. - **LlamaIndex** — natural-languag","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":419,"uniquenessScore":64,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T19:05:27.355Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T19:05:27.355Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T07:26:04.170Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/github_repos","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}