Use setup.py post-install hook for Playwright Chromium installation

- Remove runtime subprocess install (FastMCP Cloud doesn't allow disk writes)
- Add setup.py with cmdclass hooks to install Chromium at build time
- Rename requirements.txt so FastMCP Cloud uses pyproject.toml instead
This commit is contained in:
saidsurucu
2025-12-04 13:34:10 +03:00
parent b207b16ef7
commit d51f11c7ba
3 changed files with 47 additions and 25 deletions
-25
View File
@@ -6,37 +6,12 @@ import os
import httpx
import json
import time
import subprocess
import sys
from collections import defaultdict
from pydantic import BaseModel, HttpUrl, Field
from typing import Optional, Dict, List, Literal, Any, Union
import urllib.parse
from fastmcp.server.middleware import Middleware, MiddlewareContext
# --- Install Playwright Chromium at startup (for cloud deployments) ---
def _install_playwright_chromium():
"""Install Playwright Chromium browser if not already installed."""
try:
# Check if running in a cloud environment (no display)
result = subprocess.run(
[sys.executable, "-m", "playwright", "install", "chromium"],
capture_output=True,
text=True,
timeout=300 # 5 minute timeout
)
if result.returncode == 0:
print("Playwright Chromium installed successfully")
else:
print(f"Playwright Chromium installation warning: {result.stderr}")
except subprocess.TimeoutExpired:
print("Warning: Playwright Chromium installation timed out")
except Exception as e:
print(f"Warning: Could not install Playwright Chromium: {e}")
# Run installation at module load time
_install_playwright_chromium()
# Optional tiktoken import for token counting
try:
import tiktoken
+47
View File
@@ -0,0 +1,47 @@
"""
Setup script with post-install hook for Playwright Chromium installation.
This runs during `pip install .` to ensure browser binaries are available.
"""
import subprocess
import sys
from setuptools import setup
from setuptools.command.install import install
from setuptools.command.develop import develop
def install_playwright_chromium():
"""Install Playwright Chromium browser."""
print("Installing Playwright Chromium browser...")
try:
subprocess.run(
[sys.executable, "-m", "playwright", "install", "chromium"],
check=True
)
print("Playwright Chromium installed successfully!")
except subprocess.CalledProcessError as e:
print(f"Warning: Playwright Chromium installation failed: {e}")
except Exception as e:
print(f"Warning: Could not install Playwright Chromium: {e}")
class PostInstallCommand(install):
"""Post-installation command to install Playwright browsers."""
def run(self):
install.run(self)
install_playwright_chromium()
class PostDevelopCommand(develop):
"""Post-develop command to install Playwright browsers."""
def run(self):
develop.run(self)
install_playwright_chromium()
# Minimal setup - main config is in pyproject.toml
setup(
cmdclass={
'install': PostInstallCommand,
'develop': PostDevelopCommand,
},
)