Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: Why this article?
Because when i'm visiting a place i post modified and computer generated pictures on social media networks and people send me messages to ask me which tool i use to do that. I'm so tired of explaining every time that there is no magic, and there's no Harry Potter with me, so that I decided to create this article to explain. Anyone can do the same thing as long as they know a little bit about software development. Lets'go!
Instead of the original "ghibli" filter, I applied the "Pixar" filter to my selfie in front of the entrance to the Big Data and AI fair in Paris.
Two other articles explain the computer vision (Azure AI Vision SDK for image analysis explained with Github Copilot) and the computer generated description of the scene (AI Azure Open AI Chatbot Integration with RAG CosmosDB from fork GIT POC MVP).
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: project summary
Create a local directory with a python app. Test locally the python app with CURL. Test locally with Streamlit. Upload this directory to Github. Create an Azure web app service. Deploy this Github directory to Azure Web app using a Github Action workflow.
This guide describes how to replicate image editing (adding a "Ghibli studio" filter to a selfie) using Azure services. It covers local preparation, Python code for inpainting via the Azure OpenAI API, transformation into a Streamlit web app, and then deployment to Azure App Service with a GitHub Actions pipeline.
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: architecture and tools
Architecture and Tools
• Azure OpenAI (testing with DALL•E 3, GPT-image-1,Flux1 kontext pro models) for inpainting.
• Streamlit for the web interface.
• Azure App Service for application hosting.
• GitHub + GitHub Actions for CI/CD and automatic deployment.
• Python with libraries: requests, pillow, base64...
• Local tools: az CLI for manual deployment if necessary.
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: Preparation and Prerequisites
• Azure account with access to Azure OpenAI and a deployed resource.
• Azure OpenAI API key.
• GitHub account.
• Local Python 3.10+ environment.
• Install local dependencies: pip install streamlit requests pillow
• Environment variables to configure in production (App Service):
o API_KEY: Azure OpenAI key
o AZURE_ENDPOINT and DEPLOYMENT_NAME if necessary
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: installing python from the window store
python -m venv .venv
.\.venv\Scripts\activate
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: Inpainting python code
First version of the python code:
python
import os
import requests
import base64
from PIL import Image
from io import BytesIO
# === CONFIGURATION ===
AZURE_ENDPOINT = os.getenv("AZURE_ENDPOINT", "https://<MY-RESSOURCE>.openai.azure.com")
DEPLOYMENT_NAME = os.getenv("DEPLOYMENT_NAME", "<MY-DEPLOYMENT>")
API_KEY = os.getenv("API_KEY", "<My API KEY>")
API_VERSION = "2025-04-01-preview"
# === TOOLS ===
def load_image_as_base64(path):
with open(path, "rb") as f:
return base64.b64encode(f.read()).decode("utf-8")
def image_to_pil_from_b64(b64):
data = base64.b64decode(b64)
return Image.open(BytesIO(data))
def pil_to_base64(image, fmt="PNG"):
buf = BytesIO()
image.save(buf, format=fmt)
return base64.b64encode(buf.getvalue()).decode("utf-8")
def create_mask_image(size, box):
mask = Image.new("L", size, 0)
draw = Image.new("L", size, 0)
mask.paste(255, box)
return pil_to_base64(mask, fmt="PNG")
# === API CALL ===
def edit_image(image_b64, mask_b64, prompt):
url = f"{AZURE_ENDPOINT}/openai/deployments/{DEPLOYMENT_NAME}/images/edits?api-version={API_VERSION}"
headers = {
"Content-Type": "application/json",
"api-key": API_KEY
}
payload = {
"image": image_b64,
"mask": mask_b64,
"prompt": prompt,
"model": "gpt-image-1",
"size": "1024x1024",
"n": 1,
"quality": "high"
}
r = requests.post(url, headers=headers, json=payload)
r.raise_for_status()
data = r.json()
return data["data"][0]["image"]
# === EXEMPLE D'UTILISATION ===
if __name__ == "__main__":
image_path = "Original picture.jpg"
image_b64 = load_image_as_base64(image_path)
# Exemple de box : (x1, y1, x2, y2) sur image 1024x1024
mask_b64 = create_mask_image((1024, 1024), (100, 300, 300, 600))
prompt = "Apply a ghibli style to the picture"
result_b64 = edit_image(image_b64, mask_b64, prompt)
result_img = image_to_pil_from_b64(result_b64)
result_img.save("Ghibli_edited.png")
print("Image saved to Ghibli_edited.png")
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: installing streamlit requests pillow
pip install streamlit
(.venv) C:\Users\loicb\Documents\ghibli-style-app>pip install streamlit
Collecting streamlit
Downloading streamlit-1.50.0-py3-none-any.whl (10.1 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.1/10.1 MB 2.5 MB/s eta 0:00:00
Collecting altair!=5.4.0,!=5.4.1,<6,>=4.0
Downloading altair-5.5.0-py3-none-any.whl (731 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 731.2/731.2 kB 2.6 MB/s eta 0:00:00
Collecting blinker<2,>=1.5.0
Downloading blinker-1.9.0-py3-none-any.whl (8.5 kB)
Collecting cachetools<7,>=4.0
Downloading cachetools-6.2.0-py3-none-any.whl (11 kB)
Collecting tenacity<10,>=8.1.0
Downloading tenacity-9.1.2-py3-none-any.whl (28 kB)
Collecting click<9,>=7.0
Downloading click-8.3.0-py3-none-any.whl (107 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 107.3/107.3 kB 1.5 MB/s eta 0:00:00
Collecting pillow<12,>=7.1.0
Downloading pillow-11.3.0-cp310-cp310-win_amd64.whl (7.0 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.0/7.0 MB 2.3 MB/s eta 0:00:00
Collecting gitpython!=3.1.19,<4,>=3.0.7
Downloading gitpython-3.1.45-py3-none-any.whl (208 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 208.2/208.2 kB 2.1 MB/s eta 0:00:00
Collecting toml<2,>=0.10.1
Downloading toml-0.10.2-py2.py3-none-any.whl (16 kB)
Collecting protobuf<7,>=3.20
Downloading protobuf-6.32.1-cp310-abi3-win_amd64.whl (435 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 435.7/435.7 kB 1.8 MB/s eta 0:00:00
Collecting watchdog<7,>=2.1.5
Downloading watchdog-6.0.0-py3-none-win_amd64.whl (79 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 79.1/79.1 kB 2.2 MB/s eta 0:00:00
Collecting typing-extensions<5,>=4.4.0
Downloading typing_extensions-4.15.0-py3-none-any.whl (44 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 44.6/44.6 kB 2.3 MB/s eta 0:00:00
Collecting pandas<3,>=1.4.0
Downloading pandas-2.3.2-cp310-cp310-win_amd64.whl (11.3 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 11.3/11.3 MB 1.8 MB/s eta 0:00:00
Collecting pydeck<1,>=0.8.0b4
Downloading pydeck-0.9.1-py2.py3-none-any.whl (6.9 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.9/6.9 MB 2.5 MB/s eta 0:00:00
Collecting packaging<26,>=20
Downloading packaging-25.0-py3-none-any.whl (66 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 66.5/66.5 kB 1.8 MB/s eta 0:00:00
Collecting requests<3,>=2.27
Downloading requests-2.32.5-py3-none-any.whl (64 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 64.7/64.7 kB 3.4 MB/s eta 0:00:00
Collecting numpy<3,>=1.23
Downloading numpy-2.2.6-cp310-cp310-win_amd64.whl (12.9 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12.9/12.9 MB 2.3 MB/s eta 0:00:00
Collecting pyarrow>=7.0
Downloading pyarrow-21.0.0-cp310-cp310-win_amd64.whl (26.2 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 26.2/26.2 MB 2.3 MB/s eta 0:00:00
Collecting tornado!=6.5.0,<7,>=6.0.3
Downloading tornado-6.5.2-cp39-abi3-win_amd64.whl (445 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 445.4/445.4 kB 2.0 MB/s eta 0:00:00
Collecting narwhals>=1.14.2
Downloading narwhals-2.6.0-py3-none-any.whl (408 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 408.4/408.4 kB 2.5 MB/s eta 0:00:00
Collecting jinja2
Downloading jinja2-3.1.6-py3-none-any.whl (134 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 134.9/134.9 kB 1.6 MB/s eta 0:00:00
Collecting jsonschema>=3.0
Downloading jsonschema-4.25.1-py3-none-any.whl (90 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 90.0/90.0 kB 2.5 MB/s eta 0:00:00
Collecting colorama
Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)
Collecting gitdb<5,>=4.0.1
Downloading gitdb-4.0.12-py3-none-any.whl (62 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.8/62.8 kB 1.7 MB/s eta 0:00:00
Collecting tzdata>=2022.7
Downloading tzdata-2025.2-py2.py3-none-any.whl (347 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 347.8/347.8 kB 1.5 MB/s eta 0:00:00
Collecting pytz>=2020.1
Downloading pytz-2025.2-py2.py3-none-any.whl (509 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 509.2/509.2 kB 2.1 MB/s eta 0:00:00
Collecting python-dateutil>=2.8.2
Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl (229 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 229.9/229.9 kB 2.0 MB/s eta 0:00:00
Collecting idna<4,>=2.5
Downloading idna-3.10-py3-none-any.whl (70 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 70.4/70.4 kB 1.9 MB/s eta 0:00:00
Collecting charset_normalizer<4,>=2
Downloading charset_normalizer-3.4.3-cp310-cp310-win_amd64.whl (107 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 107.5/107.5 kB 1.6 MB/s eta 0:00:00
Collecting certifi>=2017.4.17
Downloading certifi-2025.8.3-py3-none-any.whl (161 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 161.2/161.2 kB 2.4 MB/s eta 0:00:00
Collecting urllib3<3,>=1.21.1
Downloading urllib3-2.5.0-py3-none-any.whl (129 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 129.8/129.8 kB 1.9 MB/s eta 0:00:00
Collecting smmap<6,>=3.0.1
Downloading smmap-5.0.2-py3-none-any.whl (24 kB)
Collecting MarkupSafe>=2.0
Downloading markupsafe-3.0.3-cp310-cp310-win_amd64.whl (15 kB)
Collecting referencing>=0.28.4
Downloading referencing-0.36.2-py3-none-any.whl (26 kB)
Collecting rpds-py>=0.7.1
Downloading rpds_py-0.27.1-cp310-cp310-win_amd64.whl (228 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 228.4/228.4 kB 2.3 MB/s eta 0:00:00
Collecting attrs>=22.2.0
Downloading attrs-25.3.0-py3-none-any.whl (63 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 63.8/63.8 kB 1.1 MB/s eta 0:00:00
Collecting jsonschema-specifications>=2023.03.6
Downloading jsonschema_specifications-2025.9.1-py3-none-any.whl (18 kB)
Collecting six>=1.5
Downloading six-1.17.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: pytz, watchdog, urllib3, tzdata, typing-extensions, tornado, toml, tenacity, smmap, six, rpds-py, pyarrow, protobuf, pillow, packaging, numpy, narwhals, MarkupSafe, idna, colorama, charset_normalizer, certifi, cachetools, blinker, attrs, requests, referencing, python-dateutil, jinja2, gitdb, click, pydeck, pandas, jsonschema-specifications, gitpython, jsonschema, altair, streamlit
Successfully installed MarkupSafe-3.0.3 altair-5.5.0 attrs-25.3.0 blinker-1.9.0 cachetools-6.2.0 certifi-2025.8.3 charset_normalizer-3.4.3 click-8.3.0 colorama-0.4.6 gitdb-4.0.12 gitpython-3.1.45 idna-3.10 jinja2-3.1.6 jsonschema-4.25.1 jsonschema-specifications-2025.9.1 narwhals-2.6.0 numpy-2.2.6 packaging-25.0 pandas-2.3.2 pillow-11.3.0 protobuf-6.32.1 pyarrow-21.0.0 pydeck-0.9.1 python-dateutil-2.9.0.post0 pytz-2025.2 referencing-0.36.2 requests-2.32.5 rpds-py-0.27.1 six-1.17.0 smmap-5.0.2 streamlit-1.50.0 tenacity-9.1.2 toml-0.10.2 tornado-6.5.2 typing-extensions-4.15.0 tzdata-2025.2 urllib3-2.5.0 watchdog-6.0.0
(.venv) C:\Users\loicb\Documents\ghibli-style-app>pip install requests pillow
Requirement already satisfied: requests in c:\users\loicb\documents\ghibli-style-app\.venv\lib\site-packages (2.32.5)
Requirement already satisfied: pillow in c:\users\loicb\documents\ghibli-style-app\.venv\lib\site-packages (11.3.0)
Requirement already satisfied: certifi>=2017.4.17 in c:\users\loicb\documents\ghibli-style-app\.venv\lib\site-packages (from requests) (2025.8.3)
Requirement already satisfied: urllib3<3,>=1.21.1 in c:\users\loicb\documents\ghibli-style-app\.venv\lib\site-packages (from requests) (2.5.0)
Requirement already satisfied: idna<4,>=2.5 in c:\users\loicb\documents\ghibli-style-app\.venv\lib\site-packages (from requests) (3.10)
Requirement already satisfied: charset_normalizer<4,>=2 in c:\users\loicb\documents\ghibli-style-app\.venv\lib\site-packages (from requests) (3.4.3)
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit
This second version of the code allows me to upload an picture, send the request to apply the filter and display the result.
python
import os
import streamlit as st
import base64
import requests
from PIL import Image, ImageDraw
from io import BytesIO
# === AZURE via ENV ===
AZURE_ENDPOINT = os.getenv("AZURE_ENDPOINT", "https://<RESSOURCE>.openai.azure.com")
DEPLOYMENT_NAME = os.getenv("DEPLOYMENT_NAME", "<MY_DEPLOYMENT_NAME >")
API_KEY = os.getenv("API_KEY", "")
API_VERSION = "2025-04-01-preview"
# === Tools ===
def pil_to_base64(img, fmt="PNG"):
buf = BytesIO()
img.save(buf, format=fmt)
return base64.b64encode(buf.getvalue()).decode("utf-8")
def base64_to_pil(b64):
return Image.open(BytesIO(base64.b64decode(b64)))
def create_mask(size, box):
mask = Image.new("L", size, 0)
draw = ImageDraw.Draw(mask)
draw.rectangle(box, fill=255)
return pil_to_base64(mask, fmt="PNG")
def call_edit_api(image_b64, mask_b64, prompt):
url = f"{AZURE_ENDPOINT}/openai/deployments/{DEPLOYMENT_NAME}/images/edits?api-version={API_VERSION}"
headers = {"Content-Type": "application/json", "api-key": API_KEY}
payload = {
"image": image_b64,
"mask": mask_b64,
"prompt": prompt,
"model": "gpt-image-1",
"size": "1024x1024",
"n": 1,
"quality": "high"
}
resp = requests.post(url, headers=headers, json=payload)
resp.raise_for_status()
return resp.json()["data"][0]["image"]
# === STREAMLIT UI ===
st.set_page_config(page_title="Ghibli filter", layout="wide")
st.title("🖼️ Retouche IA avec Azure OpenAI")
uploaded = st.file_uploader("Charge ton image (jpg/png)", type=["jpg","jpeg","png"])
prompt = st.text_area("Prompt", "Apply a ghibli studio style filter on the image")
col1, col2 = st.columns(2)
if uploaded:
img = Image.open(uploaded).convert("RGB")
img = img.resize((1024, 1024))
col1.image(img, caption="original picture", use_column_width=True)
x1 = st.slider("X début", 0, 1024, 100)
y1 = st.slider("Y début", 0, 1024, 300)
x2 = st.slider("X fin", 0, 1024, 300)
y2 = st.slider("Y fin", 0, 1024, 600)
if st.button("Generate modified image"):
image_b64 = pil_to_base64(img, fmt="PNG")
mask_b64 = create_mask((1024, 1024), (x1, y1, x2, y2))
with st.spinner("Generating please wait..."):
try:
result_b64 = call_edit_api(image_b64, mask_b64, prompt)
result_img = base64_to_pil(result_b64)
col2.image(result_img, caption="Image generated", use_column_width=True)
buf = BytesIO()
result_img.save(buf, format="PNG")
st.download_button("Download image", data=buf.getvalue(), file_name="Ghibli_edited.png", mime="image/png")
except Exception as e:
st.error(f"Error : {e}")
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit : testing streamlit
(.venv) C:\Users\loicb\Documents\ghibli-style-app>streamlit run app.py
Welcome to Streamlit!
If you'd like to receive helpful onboarding emails, news, offers, promotions,
and the occasional swag, please enter your email address below. Otherwise,
leave this field blank.
Email: XXXXXXXXXXXXXX
You can find our privacy policy at https://streamlit.io/privacy-policy
Summary:
- This open source library collects usage statistics.
- We cannot see and do not store information contained inside Streamlit apps,
such as text, charts, images, etc.
- Telemetry data is stored in servers in the United States.
- If you'd like to opt out, add the following to %userprofile%/.streamlit/config.toml,
creating that file if necessary:
[browser]
gatherUsageStats = false
You can now view your Streamlit app in your browser.
Local URL: http://localhost:8501
Network URL: http://192.168.0.16:8501
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit : choice of the AI model
FLUX.1-Kontext-pro
PRÉVERSION
Aide
Utiliser ce modèle
Fine-tune
Détails
Licence
Generate and edit images through both text and image prompts. Flux.1 Kontext is a multimodal flow matching model that enables both text-to-image generation and in-context image editing. Modify images while maintaining character consistency and performing local edits up to 8x faster than other leading models.
Model developer: Black Forest Labs
Supported languages: English
Model Release Date: June 30, 2025
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit : project tree
ghibli-app/
├── app.py
├── edit_image.py
├── requirements.txt
├── startup.sh
├── README.md
└── .github/
└── workflows/
└── azure-deploy.yml
- requirements.txt :
Code
streamlit
requests
pillow
- startup.sh :
bash
#!/bin/bash
streamlit run app.py --server.port=$PORT --server.address=0.0.0.0
startup.sh must be executable (chmod +x startup.sh).
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit : code in visual studio code
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit : local testing ok
The first local version of the application works like a charm, using a test image:
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit : code upload to the github
What is github ? See here (Git & Github for beginners) and here (Utiliser Git et GitHub)
Exemple of synchronysation between git local and github:
C:\Users\loicb\Documents\ghibli-style-app>git pull origin main --rebase
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)
Unpacking objects: 100% (5/5), 1.25 KiB | 26.00 KiB/s, done.
From https://github.com/cpltproject/ghibli-style-app
* branch main -> FETCH_HEAD
24cc278..d921a11 main -> origin/main
Successfully rebased and updated refs/heads/main.
C:\Users\loicb\Documents\ghibli-style-app>git push origin main
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Delta compression using up to 4 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (7/7), 1.32 KiB | 270.00 KiB/s, done.
Total 7 (delta 4), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (4/4), completed with 3 local objects.
To https://github.com/cpltproject/ghibli-style-app.git
d921a11..84b7fa8 main -> main
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit : deployment to Azure with github action
az webapp deployment list-publishing-profiles --name ghibli-style-app --resource-group ghibli-style-app_group --output tsv
az webapp deployment list-publishing-profiles --name ghibli-style-app --resource-group ghibli-style-app_group --output tsv
REDACTED https://portal.azure.com None https://ghibli-style-app-csbqbeefd3aueqgb.francecentral-01.azurewebsites.net ghibli-style-app ghibli-style-app - Web Deploy MSDeploy ghibli-style-app-csbqbeefd3aueqgb.scm.francecentral-01.azurewebsites.net:443 REDACTED REDACTED WebSites
REDACTED https://portal.azure.com None https://ghibli-style-app-csbqbeefd3aueqgb.francecentral-01.azurewebsites.net True ghibli-style-app - FTP FTP ftps://waws-prod-par-043.ftp.azurewebsites.windows.net/site/wwwroot REDACTED REDACTED WebSites
REDACTED https://portal.azure.com None https://ghibli-style-app-csbqbeefd3aueqgb.francecentral-01.azurewebsites.net ghibli-style-app - Zip Deploy ZipDeploy ghibli-style-app-csbqbeefd3aueqgb.scm.francecentral-01.azurewebsites.net:443 REDACTED REDACTED WebSites
az webapp deployment list-publishing-profiles \
--name ghibli-style-app \
--resource-group ghibli-style-app_group \
--output xml
az webapp deployment list-publishing-profiles --name ghibli-style-app --resource-group ghibli-style-app_group –output xml
az webapp deployment list-publishing-profiles \
--name ghibli-style-app \
--resource-group ghibli-style-app_group \
--output xml
az webapp deployment list-publishing-profiles --name ghibli-style-app --resource-group ghibli-style-app_group --output json
C:\Users\loicb>az webapp deployment list-publishing-profiles --name ghibli-style-app --resource-group ghibli-style-app_group --output json
[
{
"SQLServerDBConnectionString": "REDACTED",
"controlPanelLink": "https://portal.azure.com",
"databases": null,
"destinationAppUrl": "https://ghibli-style-app-csbqbeefd3aueqgb.francecentral-01.azurewebsites.net",
"hostingProviderForumLink": "",
"msdeploySite": "ghibli-style-app",
"mySQLDBConnectionString": "",
"profileName": "ghibli-style-app - Web Deploy",
"publishMethod": "MSDeploy",
"publishUrl": "ghibli-style-app-csbqbeefd3aueqgb.scm.francecentral-01.azurewebsites.net:443",
"userName": "REDACTED",
"userPWD": "REDACTED",
"webSystem": "WebSites"
},
{
"SQLServerDBConnectionString": "REDACTED",
"controlPanelLink": "https://portal.azure.com",
"databases": null,
"destinationAppUrl": "https://ghibli-style-app-csbqbeefd3aueqgb.francecentral-01.azurewebsites.net",
"ftpPassiveMode": "True",
"hostingProviderForumLink": "",
"mySQLDBConnectionString": "",
"profileName": "ghibli-style-app - FTP",
"publishMethod": "FTP",
"publishUrl": "ftps://waws-prod-par-043.ftp.azurewebsites.windows.net/site/wwwroot",
"userName": "REDACTED",
"userPWD": "REDACTED",
"webSystem": "WebSites"
},
{
"SQLServerDBConnectionString": "REDACTED",
"controlPanelLink": "https://portal.azure.com",
"databases": null,
"destinationAppUrl": "https://ghibli-style-app-csbqbeefd3aueqgb.francecentral-01.azurewebsites.net",
"hostingProviderForumLink": "",
"mySQLDBConnectionString": "",
"profileName": "ghibli-style-app - Zip Deploy",
"publishMethod": "ZipDeploy",
"publishUrl": "ghibli-style-app-csbqbeefd3aueqgb.scm.francecentral-01.azurewebsites.net:443",
"userName": "REDACTED",
"userPWD": "REDACTED",
"webSystem": "WebSites"
}
]
<publishData>
<publishProfile
profileName="ghibli-style-app - Web Deploy"
publishMethod="MSDeploy"
publishUrl="ghibli-style-app-csbqbeefd3aueqgb.scm.francecentral-01.azurewebsites.net:443"
msdeploySite="ghibli-style-app"
userName="REDACTED"
userPWD="REDACTED"
destinationAppUrl="https://ghibli-style-app-csbqbeefd3aueqgb.francecentral-01.azurewebsites.net"
webSystem="WebSites" />
</publishData>
az webapp deployment list-publishing-profiles --name ghibli-style-app --resource-group ghibli-style-app_group --query "[?publishMethod=='MSDeploy'].publishXml" --output tsv
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit : azure-deploy.yml file
.github/workflows/azure-deploy.yml file:
name: Deploy to Azure App Service
on:
push:
branches: [main]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: 📥 Checkout code!
uses: actions/checkout@v3>
- name: 🐍 Set up Python
uses: actions/setup-python@v4>
python-version: '3.10'
- name: 📦 Install dependencies
run: pip install -r requirements.txt
- name: ✅ Ensure startup.sh is executable
run: chmod +x startup.sh
- name: 📁 Create deployment package
run: zip -r app.zip . -x "*.git*" "*.github*" "app.zip"
- name: 🔑 Azure Login
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: 🚀 Deploy to Azure Web App (Linux)
run: |
az webapp deploy \
--name ghibli-style-app \
--resource-group ghibli-style-app_group \
--src-path app.zip \
--type zip
- name: 🧪 Afficher le contenu HTML retourné
run: |
sleep 30
echo "🔍 Contenu HTML retourné par l'app :"
curl -s https://ghibli-style-app-csbqbeefd3aueqgb.francecentral-01.azurewebsites.net
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit : requirements.txt
altair==5.5.0
attrs==25.3.0
azure-core==1.35.1
azure-identity==1.25.0
blinker==1.9.0
cachetools==6.2.0
certifi==2025.8.3
cffi==2.0.0
charset-normalizer==3.4.3
click==8.3.0
colorama==0.4.6
cryptography==46.0.1
gitdb==4.0.12
GitPython==3.1.45
idna==3.10
Jinja2==3.1.6
jsonschema==4.25.1
jsonschema-specifications==2025.9.1
MarkupSafe==3.0.3
msal==1.34.0
msal-extensions==1.3.1
narwhals==2.6.0
numpy==2.2.6
packaging==25.0
pandas==2.3.2
pillow==11.3.0
protobuf==6.32.1
pyarrow==21.0.0
pycparser==2.23
pydeck==0.9.1
PyJWT==2.10.1
python-dateutil==2.9.0.post0
python-dotenv==1.1.1
pytz==2025.2
referencing==0.36.2
requests==2.32.5
rpds-py==0.27.1
six==1.17.0
smmap==5.0.2
streamlit==1.50.0
tenacity==9.1.2
toml==0.10.2
tornado==6.5.2
typing_extensions==4.15.0
tzdata==2025.2
urllib3==2.5.0
watchdog==6.0.0
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit : web application
Azure Web app:
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit : testing
-
• Post-deployment test URL: https://ghibli-style-app-csbqbeefd3aueqgb.francecentral-01.azurewebsites.net/
• Manual tests:
o Upload a 1024x1024 image or let the code resize.
o Set the mask area correctly.
o Start the build and verify the rendering.
• Logs:
o On Azure Portal → App Service → Log Stream to view logs in real time.
o On GitHub → Actions for CI/CD logs.
• Automated tests (optional):
o Python script that sends a test image and validates the HTTP 200 return and the presence of a resulting file.
Minimal example of automated testing (pytest or simple script):
python
import requests
def test_health(app_url):
r = requests.get(app_url)
assert r.status_code == 200
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit : url to test the project
https://ghibli-style-app-csbqbeefd3aueqgb.francecentral-01.azurewebsites.net/
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit : Ghibli style filter applied to the selfie
Tested in a Windows 11 desktop, the application can work on a phone too:
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit : Ghibli style filter applied to the selfie
In production, when i arrive at the event, i take a selfie with my phone. I run the application on the browser of my phone. I upload the picture to Azure. The AI model apply the filter and send me back the modified image. I download the image. I put the image on the social network.
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit : modification field
Bonus: i can apply fine tuning to the filter by adding few words (field "décris la modification"), like: "apply the ghibli filter by adding 20 kg to the person to appear a little fat, big", because Big Data... Big Big Big! ;)
Oh now i'm so big ! for the big big big data & AI ! :)
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit : in addition of Ghibli style, i added other styles
I updated the code with options to add other styles:
import streamlit as st
import requests
import base64
from PIL import Image
from io import BytesIO
# hop
# === CONFIGURATION AZURE ===
API_KEY = os.getenv("API_KEY", "API_KEY")
API_VERSION = "2025-04-01-preview"
DEPLOYMENT = "deploiement-FLUX.1-Kontext-pro"
BASE_URL = "https://projet-flux1-kontext-pr-resource.services.ai.azure.com"
#
GENERATION_URL = f"{BASE_URL}/openai/deployments/{DEPLOYMENT}/images/generations?api-version={API_VERSION}"
EDIT_URL = f"{BASE_URL}/openai/deployments/{DEPLOYMENT}/images/edits?api-version={API_VERSION}"
HEADERS_JSON = {
"api-key": API_KEY,
"Content-Type": "application/json"
}
HEADERS_FORM = {
"api-key": API_KEY
}
# === STYLES PRÉDÉFINIS ===
STYLES = [
"Ghibli", "Pixar", "Van Gogh", "Cyberpunk", "Studio Ghibli aquarelle",
"Manga noir et blanc", "Renaissance italienne", "Pop Art", "Low Poly", "Synthwave"
]
# === FONCTIONS UTILITAIRES ===
def decode_image(b64_data):
return Image.open(BytesIO(base64.b64decode(b64_data)))
def generate_image(prompt):
body = {
"prompt": prompt,
"n": 1,
"size": "1024x1024",
"output_format": "png"
}
response = requests.post(GENERATION_URL, headers=HEADERS_JSON, json=body)
if response.status_code != 200:
st.error(f"❌ Erreur génération : {response.text}")
return None
return response.json()["data"][0]["b64_json"]
def edit_image(prompt, image_file):
mime_type = "image/jpeg" if image_file.name.lower().endswith((".jpg", ".jpeg")) else "image/png"
files = {
"image": (image_file.name, image_file, mime_type)
}
data = {
"prompt": prompt,
"n": 1,
"size": "1024x1024"
}
response = requests.post(EDIT_URL, headers=HEADERS_FORM, data=data, files=files)
if response.status_code != 200:
st.error(f"❌ Erreur édition : {response.text}")
return None
return response.json()["data"][0]["b64_json"]
def offer_download(image, filename):
buffer = BytesIO()
image.save(buffer, format="PNG")
st.download_button("📥 Télécharger l’image", buffer.getvalue(), file_name=filename, mime="image/png")
# === INTERFACE STREAMLIT ===
st.set_page_config(page_title="Ghibli Style Generator", page_icon="🎨")
st.title("🎨 Ghibli Style Generator")
st.markdown("Transforme ou stylise tes images avec le modèle FLUX.1-Kontext-pro déployé sur Azure AI Foundry.")
tab1, tab2 = st.tabs(["🚀 Génération sans image", "✏️ Édition d’image existante"])
with tab1:
with st.form("generation_form"):
style = st.selectbox("🎨 Choisis un style", STYLES)
prompt_text = st.text_input("📝 Décris ton image")
submitted = st.form_submit_button("🚀 Générer")
if submitted and prompt_text:
full_prompt = f"{prompt_text}, dans le style {style}"
b64_img = generate_image(full_prompt)
if b64_img:
image = decode_image(b64_img)
st.image(image, caption=f"Image générée ({style})")
offer_download(image, f"image_generee_{style}.png")
with tab2:
with st.form("edit_form"):
uploaded_file = st.file_uploader("📤 Charge une image", type=["png", "jpg", "jpeg"])
style_edit = st.selectbox("🎨 Choisis un style", STYLES, key="edit_style")
edit_prompt_text = st.text_input("📝 Décris la modification")
edit_submitted = st.form_submit_button("✏️ Modifier")
if edit_submitted and uploaded_file and edit_prompt_text:
full_edit_prompt = f"{edit_prompt_text}, dans le style {style_edit}"
b64_edited = edit_image(full_edit_prompt, uploaded_file)
if b64_edited:
image = decode_image(b64_edited)
st.image(image, caption=f"Image éditée ({style_edit})")
offer_download(image, f"image_editee_{style_edit}.png")
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit : new styles appear
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit : testing cyberpunk style
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit : testing Van Gogh style
Awesome! It's as if Van Gogh painted me as a portrait!
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model: second version of the python code with streamlit : testing pixar style
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model : Security Tips and Best Practices
• Never store the API key in clear text in the repository. Use environment variables or GitHub secrets.
• Limit access to the App Service via authentication if necessary (App Service Authentication, Azure AD).
• Monitor API usage (costs and quotas).
• Add server-side validation for uploaded files (size, type).
• Log errors without exposing keys or sensitive data.
Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model : try it!
Now it's your turn! Try the application by yourself:
-Grab your phone
-Take a selfie
-Open the browser and clic here: https://ghibli-style-app-csbqbeefd3aueqgb.francecentral-01.azurewebsites.net/
-Wait a little so that streamlit awake.
-Clic on "edition d'une image existante"
-Upload your selfie by pressing the "browse file"
-Find your selfie in the gallery of your phone and clic "open".
-choose a filter (Ghibli...)
-add an additional prompt, exemple: "make the person on the picture fat"
-Clic on "modifier"
-You'll receive your modified selfie with the filter applied.
-Send me your selfie, for exemple by email, and i'll publish it there to thank you...
À vous de jouer ! Essayez l'application par vous-même :
- Prenez votre téléphone
- Prenez un selfie
- Ouvrez votre navigateur et cliquez ici : https://ghibli-style-app-csbqbeefd3aueqgb.francecentral-01.azurewebsites.net/
- Patientez un instant, le temps que Streamlit s'active.
- Cliquez sur « Édition d'une image existante »
- Téléchargez votre selfie en cliquant sur « Parcourir les fichiers ».
- Trouvez votre selfie dans la galerie de votre téléphone et cliquez sur « Ouvrir ».
- Choisissez un filtre (Ghibli…)
- Ajoutez une invite supplémentaire, par exemple : « Grossir la personne sur la photo ».
- Cliquez sur « Modifier ».
- Vous recevrez votre selfie modifié avec le filtre appliqué.
- Envoyez-moi votre selfie, par exemple par email, et je le publierai pour vous remercier.
Yes! :)))))) Big big big... Big data! :) Thank you for the test :)
Lovely blondie :) Thank you for the test :)
So sunny in your garden :) Thank you for the test :)
kawai tiny kawai :) Thank you for the test :)
Nice smile on the beach, thank you for the test :)
Lol! You look so big! thank you for the test :)
Artificial intelligence added you a moustache! Interesting! Thank you for the test :)
Cute little dog! Thank you for the test :)
Thank you very much to all of you for the user test! Merci à tous pour ce test d'utilisation !
A question? Ask it here
Need help with Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model?
Fill this form
pip install streamlit
(.venv) C:\Users\loicb\Documents\ghibli-style-app>pip install streamlit
Collecting streamlit
Downloading streamlit-1.50.0-py3-none-any.whl (10.1 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.1/10.1 MB 2.5 MB/s eta 0:00:00
Collecting altair!=5.4.0,!=5.4.1,<6,>=4.0
Downloading altair-5.5.0-py3-none-any.whl (731 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 731.2/731.2 kB 2.6 MB/s eta 0:00:00
Collecting blinker<2,>=1.5.0
Downloading blinker-1.9.0-py3-none-any.whl (8.5 kB)
Collecting cachetools<7,>=4.0
Downloading cachetools-6.2.0-py3-none-any.whl (11 kB)
Collecting tenacity<10,>=8.1.0
Downloading tenacity-9.1.2-py3-none-any.whl (28 kB)
Collecting click<9,>=7.0
Downloading click-8.3.0-py3-none-any.whl (107 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 107.3/107.3 kB 1.5 MB/s eta 0:00:00
Collecting pillow<12,>=7.1.0
Downloading pillow-11.3.0-cp310-cp310-win_amd64.whl (7.0 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.0/7.0 MB 2.3 MB/s eta 0:00:00
Collecting gitpython!=3.1.19,<4,>=3.0.7
Downloading gitpython-3.1.45-py3-none-any.whl (208 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 208.2/208.2 kB 2.1 MB/s eta 0:00:00
Collecting toml<2,>=0.10.1
Downloading toml-0.10.2-py2.py3-none-any.whl (16 kB)
Collecting protobuf<7,>=3.20
Downloading protobuf-6.32.1-cp310-abi3-win_amd64.whl (435 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 435.7/435.7 kB 1.8 MB/s eta 0:00:00
Collecting watchdog<7,>=2.1.5
Downloading watchdog-6.0.0-py3-none-win_amd64.whl (79 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 79.1/79.1 kB 2.2 MB/s eta 0:00:00
Collecting typing-extensions<5,>=4.4.0
Downloading typing_extensions-4.15.0-py3-none-any.whl (44 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 44.6/44.6 kB 2.3 MB/s eta 0:00:00
Collecting pandas<3,>=1.4.0
Downloading pandas-2.3.2-cp310-cp310-win_amd64.whl (11.3 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 11.3/11.3 MB 1.8 MB/s eta 0:00:00
Collecting pydeck<1,>=0.8.0b4
Downloading pydeck-0.9.1-py2.py3-none-any.whl (6.9 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.9/6.9 MB 2.5 MB/s eta 0:00:00
Collecting packaging<26,>=20
Downloading packaging-25.0-py3-none-any.whl (66 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 66.5/66.5 kB 1.8 MB/s eta 0:00:00
Collecting requests<3,>=2.27
Downloading requests-2.32.5-py3-none-any.whl (64 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 64.7/64.7 kB 3.4 MB/s eta 0:00:00
Collecting numpy<3,>=1.23
Downloading numpy-2.2.6-cp310-cp310-win_amd64.whl (12.9 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12.9/12.9 MB 2.3 MB/s eta 0:00:00
Collecting pyarrow>=7.0
Downloading pyarrow-21.0.0-cp310-cp310-win_amd64.whl (26.2 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 26.2/26.2 MB 2.3 MB/s eta 0:00:00
Collecting tornado!=6.5.0,<7,>=6.0.3
Downloading tornado-6.5.2-cp39-abi3-win_amd64.whl (445 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 445.4/445.4 kB 2.0 MB/s eta 0:00:00
Collecting narwhals>=1.14.2
Downloading narwhals-2.6.0-py3-none-any.whl (408 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 408.4/408.4 kB 2.5 MB/s eta 0:00:00
Collecting jinja2
Downloading jinja2-3.1.6-py3-none-any.whl (134 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 134.9/134.9 kB 1.6 MB/s eta 0:00:00
Collecting jsonschema>=3.0
Downloading jsonschema-4.25.1-py3-none-any.whl (90 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 90.0/90.0 kB 2.5 MB/s eta 0:00:00
Collecting colorama
Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)
Collecting gitdb<5,>=4.0.1
Downloading gitdb-4.0.12-py3-none-any.whl (62 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.8/62.8 kB 1.7 MB/s eta 0:00:00
Collecting tzdata>=2022.7
Downloading tzdata-2025.2-py2.py3-none-any.whl (347 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 347.8/347.8 kB 1.5 MB/s eta 0:00:00
Collecting pytz>=2020.1
Downloading pytz-2025.2-py2.py3-none-any.whl (509 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 509.2/509.2 kB 2.1 MB/s eta 0:00:00
Collecting python-dateutil>=2.8.2
Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl (229 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 229.9/229.9 kB 2.0 MB/s eta 0:00:00
Collecting idna<4,>=2.5
Downloading idna-3.10-py3-none-any.whl (70 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 70.4/70.4 kB 1.9 MB/s eta 0:00:00
Collecting charset_normalizer<4,>=2
Downloading charset_normalizer-3.4.3-cp310-cp310-win_amd64.whl (107 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 107.5/107.5 kB 1.6 MB/s eta 0:00:00
Collecting certifi>=2017.4.17
Downloading certifi-2025.8.3-py3-none-any.whl (161 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 161.2/161.2 kB 2.4 MB/s eta 0:00:00
Collecting urllib3<3,>=1.21.1
Downloading urllib3-2.5.0-py3-none-any.whl (129 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 129.8/129.8 kB 1.9 MB/s eta 0:00:00
Collecting smmap<6,>=3.0.1
Downloading smmap-5.0.2-py3-none-any.whl (24 kB)
Collecting MarkupSafe>=2.0
Downloading markupsafe-3.0.3-cp310-cp310-win_amd64.whl (15 kB)
Collecting referencing>=0.28.4
Downloading referencing-0.36.2-py3-none-any.whl (26 kB)
Collecting rpds-py>=0.7.1
Downloading rpds_py-0.27.1-cp310-cp310-win_amd64.whl (228 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 228.4/228.4 kB 2.3 MB/s eta 0:00:00
Collecting attrs>=22.2.0
Downloading attrs-25.3.0-py3-none-any.whl (63 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 63.8/63.8 kB 1.1 MB/s eta 0:00:00
Collecting jsonschema-specifications>=2023.03.6
Downloading jsonschema_specifications-2025.9.1-py3-none-any.whl (18 kB)
Collecting six>=1.5
Downloading six-1.17.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: pytz, watchdog, urllib3, tzdata, typing-extensions, tornado, toml, tenacity, smmap, six, rpds-py, pyarrow, protobuf, pillow, packaging, numpy, narwhals, MarkupSafe, idna, colorama, charset_normalizer, certifi, cachetools, blinker, attrs, requests, referencing, python-dateutil, jinja2, gitdb, click, pydeck, pandas, jsonschema-specifications, gitpython, jsonschema, altair, streamlit
Successfully installed MarkupSafe-3.0.3 altair-5.5.0 attrs-25.3.0 blinker-1.9.0 cachetools-6.2.0 certifi-2025.8.3 charset_normalizer-3.4.3 click-8.3.0 colorama-0.4.6 gitdb-4.0.12 gitpython-3.1.45 idna-3.10 jinja2-3.1.6 jsonschema-4.25.1 jsonschema-specifications-2025.9.1 narwhals-2.6.0 numpy-2.2.6 packaging-25.0 pandas-2.3.2 pillow-11.3.0 protobuf-6.32.1 pyarrow-21.0.0 pydeck-0.9.1 python-dateutil-2.9.0.post0 pytz-2025.2 referencing-0.36.2 requests-2.32.5 rpds-py-0.27.1 six-1.17.0 smmap-5.0.2 streamlit-1.50.0 tenacity-9.1.2 toml-0.10.2 tornado-6.5.2 typing-extensions-4.15.0 tzdata-2025.2 urllib3-2.5.0 watchdog-6.0.0