diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b62231a5e3753ce9b9468bdd69ebce8f0cc01831..8445ba252f1b6523cb1d838ac8efe9d0e02a30aa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -11,5 +11,5 @@ docker-build-master: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY script: - cp $ENV_FILE .env - - docker build --pull -t "$CI_REGISTRY_IMAGE":testcc4 . - - docker push "$CI_REGISTRY_IMAGE":testcc4 + - docker build --pull -t "$CI_REGISTRY_IMAGE":prodcc4 . + - docker push "$CI_REGISTRY_IMAGE":prodcc4 diff --git a/Dockerfile b/Dockerfile index d9231e2e9ff23e8ffb06f066e8dd42a8b44c8e2c..ac048da423df961de7a67fc14b92e6a0808e7f12 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,19 +5,9 @@ USER root COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt && rm requirements.txt -ENV HOME_PATH=/home/jovyan/ - -# add the proxy for dash -COPY dash_proxy /tmp/dash_proxy/ -RUN pip install /tmp/dash_proxy/ - # install some utilities for GPT COPY llm_utils /llm_utils/ RUN pip install /llm_utils/ ENV CONFIG_PATH=/home/jovyan/config.txt -# copy the apps into the container -COPY app /dash/app/ -RUN chown -R jovyan /dash/app/ - USER jovyan \ No newline at end of file diff --git a/README.md b/README.md index ef4faa61b32056f2b8678950612ad916b456bf0e..7453bdf7b165561a9042ce4e78bf598d35bfc8e7 100644 --- a/README.md +++ b/README.md @@ -1,3 +1 @@ # A Jupyterlab for LLM - -In order to run Dash or use the client, AZURE_OPENAI_API_KEY, AZURE_OPENAI_ENDPOINT, OPENAI_API_VERSION need to be stored in a config.txt file in the home directory. diff --git a/app/app.py b/app/app.py deleted file mode 100644 index b43ae3ac69e2d41ac5bf45446abf5d36aa5d7996..0000000000000000000000000000000000000000 --- a/app/app.py +++ /dev/null @@ -1,65 +0,0 @@ -import sys -sys.path.append("/home/jovyan/") - -import argparse -import logging - -from urllib.parse import urlparse, urljoin - -from dash import Dash - -from jupyter_server.serverapp import list_running_servers - -from layout import layout -from callbacks import register_callbacks - -logging.basicConfig(level=logging.INFO) - -# weird trick to find base_url for the jupyterlab -def find_jupyterlab_base_url(): - servers = list_running_servers() - for server in servers: - if server["port"] == 8888: - return server['url'] - return None - - -# get the correct port from proxy -parser = argparse.ArgumentParser() -parser.add_argument("--port", type=int) -args = parser.parse_args() -port: int = args.port - -if not port: - raise ValueError(f"Port of proxy server for Dash not found in {args}.") -else: - logging.debug(f"Dash app running on port {port}.") - - -base_url = find_jupyterlab_base_url() -if base_url is None: - raise ValueError("Base URL of Jupyterlab could not be detected.") -logging.debug(f"Base URL: {base_url}") - -proxy_base_path = urlparse(urljoin(base_url + "/", f"proxy/{port}/")).path -logging.debug(f"Proxy base path: {proxy_base_path}") - -# define Dash app -app = Dash( - name=__name__, - requests_pathname_prefix=proxy_base_path -) - -# define layout -app.layout = layout - -# register all callback functions -register_callbacks(app=app) - -# Run Dash app in the notebook -app.run( - jupyter_mode="jupyterlab", - port=port, - host="0.0.0.0", - debug=True -) diff --git a/app/callbacks.py b/app/callbacks.py deleted file mode 100644 index 207419558b566b992b8f5e4972626b00273e5a0d..0000000000000000000000000000000000000000 --- a/app/callbacks.py +++ /dev/null @@ -1,65 +0,0 @@ -import os -from datetime import datetime - -from dash import ( - html, - Dash -) -from dash.dependencies import ( - Input, - Output, - State -) - -from llm_utils.client import ChatGPT, get_openai_client - - -def format_chat_messages(chat_history): - chat_messages = [] - for message in chat_history: - chat_messages.append(html.Div([ - html.P(f'{message["sender"]}: {message["message"]}'), - html.P(f'Sent at: {message["timestamp"]}') - ])) - return chat_messages - - -def register_callbacks(app: Dash): - model="gpt-4o" - client = get_openai_client( - model=model, - config_path=os.environ.get("CONFIG_PATH") - ) - chat_gpt = ChatGPT( - client=client, - model=model - ) - - @app.callback( - [Output('chat-container', 'children'), - Output('chat-history', 'data')], - [Input('send-button', 'n_clicks')], - [State('user-input', 'value'), - State('chat-history', 'data')] - ) - def update_chat(n_clicks, input_value, chat_history): - if chat_history is None: - chat_history = [] - - if n_clicks > 0 and input_value: - chat_history.append({ - 'sender': 'User', - 'message': input_value, - 'timestamp': datetime.now().strftime("%Y-%m-%d %H:%M:%S") - }) - - response = chat_gpt.chat_with_gpt(input_value) - - # Add response to chat history - chat_history.append({ - 'sender': 'Language Model', - 'message': response, - 'timestamp': datetime.now().strftime("%Y-%m-%d %H:%M:%S") - }) - - return format_chat_messages(chat_history), chat_history diff --git a/app/layout.py b/app/layout.py deleted file mode 100644 index 4d82a24710224074e9123450133daf5eefd3aac2..0000000000000000000000000000000000000000 --- a/app/layout.py +++ /dev/null @@ -1,40 +0,0 @@ -from dash import ( - html, - dcc -) - -layout = html.Div([ - dcc.Store( - id='chat-history', - data=[] - ), - html.H1( - "Simple Chat App", - style={'text-align': 'center'} - ), - html.Div( - id='chat-container', - style={'overflowY': 'scroll', 'height': '70vh', 'padding': '10px'} - ), - html.Div([ - dcc.Input( - id='user-input', - type='text', - placeholder='Type your message...', - debounce=True - ), - html.Button( - 'Send', - id='send-button', - n_clicks=0 - ) - ], style={ - 'display': 'flex', - 'alignItems': 'center', - 'justifyContent': 'center', - 'position': 'fixed', - 'bottom': 0, - 'width': '100%', - 'padding': '10px' - }) -], style={'position': 'relative'}) diff --git a/app/my_app.py b/app/my_app.py deleted file mode 100644 index db083be592f45c76bd6c05d3f2783614b84cfcb0..0000000000000000000000000000000000000000 --- a/app/my_app.py +++ /dev/null @@ -1,70 +0,0 @@ -import sys -sys.path.append("/home/jovyan/") - -import argparse -import logging - -from urllib.parse import urlparse, urljoin - -from dash import Dash - -from jupyter_server.serverapp import list_running_servers - -try: - from my_layout import layout - from my_callbacks import register_callbacks -except ModuleNotFoundError: - # do not let Dash start - exit() - - -logging.basicConfig(level=logging.INFO) - -# weird trick to find base_url for the jupyterlab -def find_jupyterlab_base_url(): - servers = list_running_servers() - for server in servers: - if server["port"] == 8888: - return server['url'] - return None - - -# get the correct port from proxy -parser = argparse.ArgumentParser() -parser.add_argument("--port", type=int) -args = parser.parse_args() -port: int = args.port - -if not port: - raise ValueError(f"Port of proxy server for Dash not found in {args}.") -else: - logging.debug(f"Dash app running on port {port}.") - - -base_url = find_jupyterlab_base_url() -if base_url is None: - raise ValueError("Base URL of Jupyterlab could not be detected.") -logging.debug(f"Base URL: {base_url}") - -proxy_base_path = urlparse(urljoin(base_url + "/", f"proxy/{port}/")).path -logging.debug(f"Proxy base path: {proxy_base_path}") - -# define Dash app -app = Dash( - name=__name__, - requests_pathname_prefix=proxy_base_path -) - -# define layout -app.layout = layout - -# register all callback functions -register_callbacks(app=app) - -# Run Dash app in the notebook -app.run( - jupyter_mode="jupyterlab", - port=port, - host="0.0.0.0", - debug=True -) diff --git a/dash_proxy/dash_proxy.py b/dash_proxy/dash_proxy.py deleted file mode 100644 index 309e977e30e4ae08b01c6f3c3734e673b94fb444..0000000000000000000000000000000000000000 --- a/dash_proxy/dash_proxy.py +++ /dev/null @@ -1,16 +0,0 @@ -def setup_dash_proxy(): - command = [ - 'python', - '/dash/app/app.py', - '--port', - '{port}' - ] - - return { - "command": command, - "new_browser_tab": False, - "launcher_entry": { - "enabled": True, - 'title': 'Dash' - } - } diff --git a/dash_proxy/my_app_proxy.py b/dash_proxy/my_app_proxy.py deleted file mode 100644 index e91a8649001749f630ee85b4e6706f99049fb634..0000000000000000000000000000000000000000 --- a/dash_proxy/my_app_proxy.py +++ /dev/null @@ -1,16 +0,0 @@ -def setup_my_app_proxy(): - command = [ - 'python', - '/dash/app/my_app.py', - '--port', - '{port}' - ] - - return { - "command": command, - "new_browser_tab": False, - "launcher_entry": { - "enabled": True, - 'title': 'MyApp' - } - } diff --git a/dash_proxy/setup.py b/dash_proxy/setup.py deleted file mode 100644 index 437a2683b6918d9fc7b3fa6cff396ace56430117..0000000000000000000000000000000000000000 --- a/dash_proxy/setup.py +++ /dev/null @@ -1,16 +0,0 @@ -import setuptools - -setuptools.setup( - author="Julian Rasch", - author_email="julian.rasch@fh-muenster.de", - description="A small module to run Dash inside a dockerized Jupyterlab.", - name="jupyter-dash-proxy", - py_modules=["dash_proxy", "my_app_proxy"], - entry_points={ - "jupyter_serverproxy_servers": [ - "Dash = dash_proxy:setup_dash_proxy", - "MyApp = my_app_proxy:setup_my_app_proxy" - ] - }, - install_requires=["jupyter-server-proxy==4.4.0"], -) diff --git a/my_callbacks.py b/my_callbacks.py deleted file mode 100644 index 6640c9dab08cbf2a5826a0511b78b6e03a6e215c..0000000000000000000000000000000000000000 --- a/my_callbacks.py +++ /dev/null @@ -1,21 +0,0 @@ -from dash.dependencies import ( - Input, - Output -) -from dash import html - - -def register_callbacks(app): - @app.callback( - Output('output-container-button', 'children'), - [Input('submit-btn', 'n_clicks')], - [Input('input-text', 'value')] - ) - def update_output(n_clicks, input_value): - if n_clicks > 0: - return html.Div([ - html.Label("You entered:"), - html.P(input_value) - ]) - else: - return '' diff --git a/my_layout.py b/my_layout.py deleted file mode 100644 index e0cf7c4a9a74950db48449451e5e594fa8df9140..0000000000000000000000000000000000000000 --- a/my_layout.py +++ /dev/null @@ -1,13 +0,0 @@ -from dash import html -from dash import dcc - - -layout = html.Div([ - html.H1("Yeay, my app!"), - html.Div([ - html.Label("Enter your text:"), - dcc.Input(id='input-text', type='text', value=''), - html.Button('Submit', id='submit-btn', n_clicks=0), - ]), - html.Div(id='output-container-button') -]) diff --git a/requirements.txt b/requirements.txt index c1570183742a586c2cc1f212c3abb57136bcaaea..ba84e22a77efc2384a5b597221872927a07ad019 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ -jupyter-server-proxy==4.4.0 +# jupyter-server-proxy==4.4.0 -dash -dash-bootstrap-components +# dash +# dash-bootstrap-components flake8 openai