robertthecreator commited on
Commit
531d852
·
verified ·
1 Parent(s): 6330089

Upload 3 files

Browse files
Files changed (3) hide show
  1. Dockerfile +25 -13
  2. app.py +93 -162
  3. requirements.txt +7 -6
Dockerfile CHANGED
@@ -1,13 +1,25 @@
1
- FROM python:3.12
2
-
3
- WORKDIR /code
4
-
5
- COPY ./requirements.txt /code/requirements.txt
6
-
7
- RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
8
-
9
- COPY . .
10
-
11
- EXPOSE 7860
12
-
13
- CMD ["shiny", "run", "app.py", "--host", "0.0.0.0", "--port", "7860"]
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use Python 3.11 slim image
2
+ FROM python:3.11-slim
3
+
4
+ # Install system dependencies
5
+ RUN apt-get update && apt-get install -y git wget && rm -rf /var/lib/apt/lists/*
6
+
7
+ # Create a non-root user
8
+ RUN useradd -m appuser
9
+ USER appuser
10
+
11
+ # Set working directory
12
+ WORKDIR /app
13
+
14
+ # Copy and install Python dependencies
15
+ COPY requirements.txt .
16
+ RUN pip install --no-cache-dir -r requirements.txt
17
+
18
+ # Copy app files
19
+ COPY . .
20
+
21
+ # Expose port 8000 for FastAPI
22
+ EXPOSE 8000
23
+
24
+ # Start FastAPI server
25
+ CMD ["python", "app.py"]
app.py CHANGED
@@ -1,162 +1,93 @@
1
- import faicons as fa
2
- import plotly.express as px
3
-
4
- # Load data and compute static values
5
- from shared import app_dir, tips
6
- from shinywidgets import render_plotly
7
-
8
- from shiny import reactive, render
9
- from shiny.express import input, ui
10
-
11
- bill_rng = (min(tips.total_bill), max(tips.total_bill))
12
-
13
- # Add page title and sidebar
14
- ui.page_opts(title="Restaurant tipping", fillable=True)
15
-
16
- with ui.sidebar(open="desktop"):
17
- ui.input_slider(
18
- "total_bill",
19
- "Bill amount",
20
- min=bill_rng[0],
21
- max=bill_rng[1],
22
- value=bill_rng,
23
- pre="$",
24
- )
25
- ui.input_checkbox_group(
26
- "time",
27
- "Food service",
28
- ["Lunch", "Dinner"],
29
- selected=["Lunch", "Dinner"],
30
- inline=True,
31
- )
32
- ui.input_action_button("reset", "Reset filter")
33
-
34
- # Add main content
35
- ICONS = {
36
- "user": fa.icon_svg("user", "regular"),
37
- "wallet": fa.icon_svg("wallet"),
38
- "currency-dollar": fa.icon_svg("dollar-sign"),
39
- "ellipsis": fa.icon_svg("ellipsis"),
40
- }
41
-
42
- with ui.layout_columns(fill=False):
43
- with ui.value_box(showcase=ICONS["user"]):
44
- "Total tippers"
45
-
46
- @render.express
47
- def total_tippers():
48
- tips_data().shape[0]
49
-
50
- with ui.value_box(showcase=ICONS["wallet"]):
51
- "Average tip"
52
-
53
- @render.express
54
- def average_tip():
55
- d = tips_data()
56
- if d.shape[0] > 0:
57
- perc = d.tip / d.total_bill
58
- f"{perc.mean():.1%}"
59
-
60
- with ui.value_box(showcase=ICONS["currency-dollar"]):
61
- "Average bill"
62
-
63
- @render.express
64
- def average_bill():
65
- d = tips_data()
66
- if d.shape[0] > 0:
67
- bill = d.total_bill.mean()
68
- f"${bill:.2f}"
69
-
70
-
71
- with ui.layout_columns(col_widths=[6, 6, 12]):
72
- with ui.card(full_screen=True):
73
- ui.card_header("Tips data")
74
-
75
- @render.data_frame
76
- def table():
77
- return render.DataGrid(tips_data())
78
-
79
- with ui.card(full_screen=True):
80
- with ui.card_header(class_="d-flex justify-content-between align-items-center"):
81
- "Total bill vs tip"
82
- with ui.popover(title="Add a color variable", placement="top"):
83
- ICONS["ellipsis"]
84
- ui.input_radio_buttons(
85
- "scatter_color",
86
- None,
87
- ["none", "sex", "smoker", "day", "time"],
88
- inline=True,
89
- )
90
-
91
- @render_plotly
92
- def scatterplot():
93
- color = input.scatter_color()
94
- return px.scatter(
95
- tips_data(),
96
- x="total_bill",
97
- y="tip",
98
- color=None if color == "none" else color,
99
- trendline="lowess",
100
- )
101
-
102
- with ui.card(full_screen=True):
103
- with ui.card_header(class_="d-flex justify-content-between align-items-center"):
104
- "Tip percentages"
105
- with ui.popover(title="Add a color variable"):
106
- ICONS["ellipsis"]
107
- ui.input_radio_buttons(
108
- "tip_perc_y",
109
- "Split by:",
110
- ["sex", "smoker", "day", "time"],
111
- selected="day",
112
- inline=True,
113
- )
114
-
115
- @render_plotly
116
- def tip_perc():
117
- from ridgeplot import ridgeplot
118
-
119
- dat = tips_data()
120
- dat["percent"] = dat.tip / dat.total_bill
121
- yvar = input.tip_perc_y()
122
- uvals = dat[yvar].unique()
123
-
124
- samples = [[dat.percent[dat[yvar] == val]] for val in uvals]
125
-
126
- plt = ridgeplot(
127
- samples=samples,
128
- labels=uvals,
129
- bandwidth=0.01,
130
- colorscale="viridis",
131
- colormode="row-index",
132
- )
133
-
134
- plt.update_layout(
135
- legend=dict(
136
- orientation="h", yanchor="bottom", y=1.02, xanchor="center", x=0.5
137
- )
138
- )
139
-
140
- return plt
141
-
142
-
143
- ui.include_css(app_dir / "styles.css")
144
-
145
- # --------------------------------------------------------
146
- # Reactive calculations and effects
147
- # --------------------------------------------------------
148
-
149
-
150
- @reactive.calc
151
- def tips_data():
152
- bill = input.total_bill()
153
- idx1 = tips.total_bill.between(bill[0], bill[1])
154
- idx2 = tips.time.isin(input.time())
155
- return tips[idx1 & idx2]
156
-
157
-
158
- @reactive.effect
159
- @reactive.event(input.reset)
160
- def _():
161
- ui.update_slider("total_bill", value=bill_rng)
162
- ui.update_checkbox_group("time", selected=["Lunch", "Dinner"])
 
1
+ from peft import AutoPeftModelForCausalLM
2
+ import asyncio
3
+ from fastapi import FastAPI
4
+ import uvicorn
5
+ import os
6
+ import nest_asyncio
7
+ import socket
8
+ import json
9
+ from transformers import pipeline, AutoTokenizer
10
+ import time
11
+ import torch
12
+ import requests
13
+ app = FastAPI()
14
+ model_ask = AutoPeftModelForCausalLM.from_pretrained(
15
+ "robertthecreator/assistant-chatbot",
16
+ device_map="auto",
17
+ torch_dtype=torch.float16
18
+ )
19
+ tokenizer_ask = AutoTokenizer.from_pretrained("robertthecreator/assistant-chatbot")
20
+ tokenizer_ask.pad_token = tokenizer_ask.eos_token
21
+ model_ask.eval()
22
+ api_key = os.getenv("TAVILY_API_KEY", "default-key")
23
+
24
+ def get_from_web(query, k=3):
25
+ context = ""
26
+ response = requests.post(
27
+ "https://api.tavily.com/search",
28
+ headers={"Content-Type": "application/json"},
29
+ json={"query": query, "api_key": api_key}
30
+ )
31
+ data = response.json()
32
+ for result in data["results"]:
33
+ print(result["content"])
34
+ context += result["content"] + "\n"
35
+ return context
36
+
37
+
38
+ @app.post("/ask")
39
+ def ask(text: str):
40
+ global context
41
+ print("starting...")
42
+ context = """You're an AI assistant designed to help me with every day task, productivity and engineering. Youre name is JARVIS. Use the context you have to answer any questions."""
43
+ context = get_from_web(text) + "\n" + context
44
+ print(context)
45
+ formatted_prompt = f"""CONTEXT: {context}\nPROMPTER: {text}\nASSISTANT:"""
46
+ inputs = tokenizer_ask(formatted_prompt, return_tensors="pt").to(model_ask.device)
47
+
48
+ with torch.no_grad():
49
+ outputs = model_ask.generate(
50
+ **inputs,
51
+ max_new_tokens=250,
52
+ temperature=0.7,
53
+ top_p=0.9,
54
+ top_k=50,
55
+ repetition_penalty=1.2,
56
+ do_sample=True,
57
+ pad_token_id=tokenizer_ask.eos_token_id,
58
+ eos_token_id=tokenizer_ask.eos_token_id,
59
+ early_stopping=True
60
+ )
61
+
62
+
63
+ response = tokenizer_ask.decode(outputs[0], skip_special_tokens=True)
64
+ print(response)
65
+
66
+ if "ASSISTANT:" in response:
67
+ response = response.split("ASSISTANT:")[-1].strip()
68
+
69
+ response = response.split('\r')[0]
70
+ response = response.split('PROMPTER')[0]
71
+ response = response.split('ROLE:')[0]
72
+ response = response.split('<|user|>')[0]
73
+ response = response.split('User:')[0]
74
+
75
+ return response
76
+
77
+ async def start():
78
+ s = socket.socket()
79
+ s.bind(('', 0))
80
+ port = s.getsockname()[1]
81
+ s.close()
82
+
83
+ config = uvicorn.Config(
84
+ app,
85
+ host="0.0.0.0",
86
+ port=port,
87
+ log_level="info"
88
+ )
89
+ server = uvicorn.Server(config)
90
+
91
+ await server.serve()
92
+
93
+ uvicorn.run(app, host="0.0.0.0", port=8000, log_level="info")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
requirements.txt CHANGED
@@ -1,6 +1,7 @@
1
- faicons
2
- shiny
3
- shinywidgets
4
- plotly
5
- pandas
6
- ridgeplot
 
 
1
+ fastapi
2
+ uvicorn[standard]
3
+ torch
4
+ transformers
5
+ peft
6
+ requests
7
+ nest_asyncio