diff --git a/plugins/browser/firecrawl/provider.py b/plugins/browser/firecrawl/provider.py index 2c605134a01..a2bfee60ba8 100644 --- a/plugins/browser/firecrawl/provider.py +++ b/plugins/browser/firecrawl/provider.py @@ -39,6 +39,12 @@ logger = logging.getLogger(__name__) _BASE_URL = "https://api.firecrawl.dev" +# Integration tag sent on every browser-session create so Firecrawl can +# attribute Hermes usage. Mirrors FIRECRAWL_INTEGRATION_TAG in the web +# plugin; kept here rather than imported to keep the two firecrawl +# plugins import-independent. +FIRECRAWL_INTEGRATION_TAG = "hermes" + class FirecrawlBrowserProvider(BrowserProvider): """Firecrawl (https://firecrawl.dev) cloud browser backend. @@ -80,7 +86,10 @@ class FirecrawlBrowserProvider(BrowserProvider): def create_session(self, task_id: str) -> Dict[str, object]: ttl = int(os.environ.get("FIRECRAWL_BROWSER_TTL", "300")) - body: Dict[str, object] = {"ttl": ttl} + body: Dict[str, object] = { + "ttl": ttl, + "integration": FIRECRAWL_INTEGRATION_TAG, + } try: response = requests.post( diff --git a/plugins/web/firecrawl/provider.py b/plugins/web/firecrawl/provider.py index bcc574ffca3..f57a6113185 100644 --- a/plugins/web/firecrawl/provider.py +++ b/plugins/web/firecrawl/provider.py @@ -56,6 +56,11 @@ from tools.website_policy import check_website_access logger = logging.getLogger(__name__) +# Integration tag passed to Firecrawl on every call so they can attribute +# usage back to Hermes. +FIRECRAWL_INTEGRATION_TAG = "hermes" + + # --------------------------------------------------------------------------- # Lazy Firecrawl SDK proxy # --------------------------------------------------------------------------- @@ -408,7 +413,11 @@ class FirecrawlWebSearchProvider(WebSearchProvider): # let it propagate so the dispatcher emits the legacy envelope shape. client = _get_firecrawl_client() try: - response = client.search(query=query, limit=limit) + response = client.search( + query=query, + limit=limit, + integration=FIRECRAWL_INTEGRATION_TAG, + ) web_results = _extract_web_search_results(response) logger.info("Firecrawl: found %d search results", len(web_results)) return {"success": True, "data": {"web": web_results}} @@ -487,6 +496,7 @@ class FirecrawlWebSearchProvider(WebSearchProvider): _get_firecrawl_client().scrape, url=url, formats=formats, + integration=FIRECRAWL_INTEGRATION_TAG, ), timeout=60, ) @@ -623,6 +633,7 @@ class FirecrawlWebSearchProvider(WebSearchProvider): crawl_params = { "limit": limit, "scrape_options": {"formats": ["markdown"]}, + "integration": FIRECRAWL_INTEGRATION_TAG, } # The SDK call is sync; run in a thread so we don't block the