Qui suis-je, à propos de l'auteur

administrateur mcse microsoft logomcsa microsoft logomcdba logoMicrosoft certified azure fundamentals

depuis 2001, Insider depuis 2014.

 

Thanks to Microsoft EMEA GBS to let me participate in the year 2014 to the Insider project during my work. Then, This Windows test project, here in version 11, is based on the cycle of the insider Preview Builds, now in the Dev Channel: it is fun to test the new features. I can learn new features, validate them and share them with you :-)
This tutorial is made in a test environment, for pleasure and not to earn money. It is a non-profit project (Association loi 1901 à but non lucratif). It shows that the concept is possible, for a demontration, artistic, or educational purposes, school learning course. Don't test in a real environment in production.
Consulting, services, computer engineering. Implementation of technology solutions and support for businesses.

Besoin d'aide ? Remplissez ce formulaire ou envoyez un email sur loic @consultingit.fr ou loicbemeagbs @hotmail.fr

Ou sur les réseaux sociaux :

Linkedin  Facebook  Twitter X  github  gitlabcaptchatel Discord logomeetupbluesky logo

 

User Rating: 5 / 5

Star ActiveStar ActiveStar ActiveStar ActiveStar Active
 

 

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!

 

Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model Paris big Data and AI event

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

 

Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model installling python

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

 

Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model choose the 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 create model project

 

Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 deploy model project 

 

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 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 first version local ok

 

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 github

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

Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model github actions deployment

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>

      with:

        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

      uses: azure/login@v1>

      with:

        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 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

Ghibli Style Generator

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 upload the original 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 : 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 ghibli style applied

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! ;)

Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model ghibli style applied with modifications

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 new styles pixar

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 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

 

Azure AI Foundry Web App Python Github Actions Streamlit Ghibli Style Generator FLUX1 Kontext pro model new styles van gogh

 

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 new styles pixar UI

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.

Azure AI Foundry Web App Python Github Actions Streamlit public test

Yes! :)))))) Big big big... Big data! :)  Thank you for the test :)

image editee Ghibli 6

Lovely blondie :)  Thank you for the test :)

image editee Ghibli 4

So sunny in your garden :)  Thank you for the test :)

image editee Ghibli 5

kawai tiny kawai :)  Thank you for the test :)

image editee Ghibli 3

Nice smile on the beach, thank you for the test :)

image editee Ghibli 2 

Lol! You look so big! thank you for the test :)

image editee Ghibli 1

 

Artificial intelligence added you a moustache! Interesting! Thank you for the test :)

 

caniche image editee Ghibli

 

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