Transcendental-Programmer
commited on
Commit
·
f9f55e2
1
Parent(s):
c9ea389
fix: base url error
Browse files- Dockerfile +1 -0
- README.md +24 -12
- app.py +6 -0
- faceforge_ui/app.py +10 -7
Dockerfile
CHANGED
|
@@ -21,6 +21,7 @@ ENV PYTHONPATH="/app"
|
|
| 21 |
ENV PYTHONUNBUFFERED=1
|
| 22 |
ENV API_URL="/api"
|
| 23 |
ENV MOCK_API="true"
|
|
|
|
| 24 |
|
| 25 |
# Start app (with the patch applied)
|
| 26 |
CMD ["python", "app.py"]
|
|
|
|
| 21 |
ENV PYTHONUNBUFFERED=1
|
| 22 |
ENV API_URL="/api"
|
| 23 |
ENV MOCK_API="true"
|
| 24 |
+
ENV BASE_URL=""
|
| 25 |
|
| 26 |
# Start app (with the patch applied)
|
| 27 |
CMD ["python", "app.py"]
|
README.md
CHANGED
|
@@ -24,16 +24,19 @@ FaceForge is ready to run as a Gradio app on [Hugging Face Spaces](https://huggi
|
|
| 24 |
|
| 25 |
### Example Dockerfile (already included):
|
| 26 |
```Dockerfile
|
| 27 |
-
FROM
|
| 28 |
-
RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/*
|
| 29 |
WORKDIR /app
|
| 30 |
COPY requirements.txt ./
|
| 31 |
RUN pip install --no-cache-dir -r requirements.txt
|
|
|
|
| 32 |
COPY . .
|
| 33 |
EXPOSE 7860
|
| 34 |
ENV PYTHONPATH="/app"
|
| 35 |
ENV PYTHONUNBUFFERED=1
|
| 36 |
-
|
|
|
|
|
|
|
|
|
|
| 37 |
```
|
| 38 |
|
| 39 |
## Local Development (Optional)
|
|
@@ -95,24 +98,33 @@ The application includes a patch that should fix the issue automatically. This p
|
|
| 95 |
|
| 96 |
If you see errors like:
|
| 97 |
```
|
| 98 |
-
|
| 99 |
```
|
| 100 |
|
| 101 |
-
This
|
| 102 |
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 109 |
|
| 110 |
#### Environment Variables
|
| 111 |
|
| 112 |
-
- `MOCK_API`: Set to "true" to use mock API responses (for testing without
|
| 113 |
- `API_URL`: Override the API endpoint URL
|
|
|
|
| 114 |
- `PORT`: Set the port for the server (default: 7860)
|
| 115 |
|
| 116 |
## Notes
|
| 117 |
- The backend and frontend are fully integrated for Spaces deployment.
|
|
|
|
| 118 |
- For custom model integration, edit the core and backend modules as needed.
|
|
|
|
| 24 |
|
| 25 |
### Example Dockerfile (already included):
|
| 26 |
```Dockerfile
|
| 27 |
+
FROM huggingface/transformers:latest
|
|
|
|
| 28 |
WORKDIR /app
|
| 29 |
COPY requirements.txt ./
|
| 30 |
RUN pip install --no-cache-dir -r requirements.txt
|
| 31 |
+
RUN pip install --no-cache-dir transformers
|
| 32 |
COPY . .
|
| 33 |
EXPOSE 7860
|
| 34 |
ENV PYTHONPATH="/app"
|
| 35 |
ENV PYTHONUNBUFFERED=1
|
| 36 |
+
ENV API_URL="/api"
|
| 37 |
+
ENV MOCK_API="true"
|
| 38 |
+
ENV BASE_URL=""
|
| 39 |
+
CMD ["python", "app.py"]
|
| 40 |
```
|
| 41 |
|
| 42 |
## Local Development (Optional)
|
|
|
|
| 98 |
|
| 99 |
If you see errors like:
|
| 100 |
```
|
| 101 |
+
Invalid URL '/api/generate': No scheme supplied. Perhaps you meant https:///api/generate?
|
| 102 |
```
|
| 103 |
|
| 104 |
+
This indicates an issue with URL formatting. The application should handle this automatically with the following settings:
|
| 105 |
|
| 106 |
+
1. For the integrated app, set `BASE_URL=""` in the environment
|
| 107 |
+
2. For separate UI/API components, set `BASE_URL="http://localhost:7860"` (or your server URL)
|
| 108 |
+
3. Using relative URLs within the same server requires the correct base URL configuration
|
| 109 |
+
|
| 110 |
+
The updated app uses proper URL formatting that works in both integrated and separated modes.
|
| 111 |
+
|
| 112 |
+
#### Missing Dependencies
|
| 113 |
+
|
| 114 |
+
If you see errors about missing Python packages like `transformers`, you have options:
|
| 115 |
+
|
| 116 |
+
1. Install the missing package: `pip install transformers`
|
| 117 |
+
2. Use mock mode: Set `MOCK_API="true"` in environment variables
|
| 118 |
+
3. Use the Docker image which includes all dependencies: `docker build -t faceforge .`
|
| 119 |
|
| 120 |
#### Environment Variables
|
| 121 |
|
| 122 |
+
- `MOCK_API`: Set to "true" to use mock API responses (for testing without ML dependencies)
|
| 123 |
- `API_URL`: Override the API endpoint URL
|
| 124 |
+
- `BASE_URL`: Base URL for relative API paths (leave empty for integrated deployment)
|
| 125 |
- `PORT`: Set the port for the server (default: 7860)
|
| 126 |
|
| 127 |
## Notes
|
| 128 |
- The backend and frontend are fully integrated for Spaces deployment.
|
| 129 |
+
- The application will use the actual ML framework when dependencies are available, and fall back to mock implementations when they're missing.
|
| 130 |
- For custom model integration, edit the core and backend modules as needed.
|
app.py
CHANGED
|
@@ -58,6 +58,12 @@ def create_app():
|
|
| 58 |
logger.info("Mounting API at /api")
|
| 59 |
app.mount("/api", api_app)
|
| 60 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 61 |
# Create Gradio UI
|
| 62 |
logger.info("Creating Gradio UI")
|
| 63 |
demo = create_demo()
|
|
|
|
| 58 |
logger.info("Mounting API at /api")
|
| 59 |
app.mount("/api", api_app)
|
| 60 |
|
| 61 |
+
# Set BASE_URL to empty string for HF Spaces deployment
|
| 62 |
+
# This ensures the UI makes relative API requests
|
| 63 |
+
if "BASE_URL" not in os.environ:
|
| 64 |
+
os.environ["BASE_URL"] = ""
|
| 65 |
+
logger.info("Setting BASE_URL to empty string for integrated app")
|
| 66 |
+
|
| 67 |
# Create Gradio UI
|
| 68 |
logger.info("Creating Gradio UI")
|
| 69 |
demo = create_demo()
|
faceforge_ui/app.py
CHANGED
|
@@ -26,7 +26,9 @@ logging.getLogger("gradio_client").setLevel(logging.DEBUG)
|
|
| 26 |
# In HF Spaces, we need to use a relative path since both UI and API run on the same server
|
| 27 |
# For local development with separate servers, the env var can be set to http://localhost:8000
|
| 28 |
API_URL = os.environ.get("API_URL", "/api")
|
|
|
|
| 29 |
logger.info(f"Using API URL: {API_URL}")
|
|
|
|
| 30 |
|
| 31 |
def generate_image(prompts, mode, player_x, player_y):
|
| 32 |
"""Generate an image based on prompts and player position."""
|
|
@@ -59,15 +61,16 @@ def generate_image(prompts, mode, player_x, player_y):
|
|
| 59 |
|
| 60 |
# Determine the base URL for the API
|
| 61 |
if API_URL.startswith("/"):
|
| 62 |
-
# Relative URL, construct the full URL
|
| 63 |
-
#
|
| 64 |
-
|
|
|
|
| 65 |
else:
|
| 66 |
# Absolute URL, use as is
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
logger.debug(f"Making request to: {
|
| 70 |
-
resp = requests.post(
|
| 71 |
logger.debug(f"API response status: {resp.status_code}")
|
| 72 |
|
| 73 |
if resp.ok:
|
|
|
|
| 26 |
# In HF Spaces, we need to use a relative path since both UI and API run on the same server
|
| 27 |
# For local development with separate servers, the env var can be set to http://localhost:8000
|
| 28 |
API_URL = os.environ.get("API_URL", "/api")
|
| 29 |
+
BASE_URL = os.environ.get("BASE_URL", "http://localhost:7860")
|
| 30 |
logger.info(f"Using API URL: {API_URL}")
|
| 31 |
+
logger.info(f"Using BASE URL: {BASE_URL}")
|
| 32 |
|
| 33 |
def generate_image(prompts, mode, player_x, player_y):
|
| 34 |
"""Generate an image based on prompts and player position."""
|
|
|
|
| 61 |
|
| 62 |
# Determine the base URL for the API
|
| 63 |
if API_URL.startswith("/"):
|
| 64 |
+
# Relative URL, construct the full URL with the base URL
|
| 65 |
+
# Note: BASE_URL should NOT have a trailing slash
|
| 66 |
+
full_url = f"{BASE_URL}{API_URL}/generate"
|
| 67 |
+
logger.debug(f"Constructed full URL: {full_url}")
|
| 68 |
else:
|
| 69 |
# Absolute URL, use as is
|
| 70 |
+
full_url = f"{API_URL}/generate"
|
| 71 |
+
|
| 72 |
+
logger.debug(f"Making request to: {full_url}")
|
| 73 |
+
resp = requests.post(full_url, json=req, timeout=30)
|
| 74 |
logger.debug(f"API response status: {resp.status_code}")
|
| 75 |
|
| 76 |
if resp.ok:
|