pip install transformers torch transformers serve transformers chat localhost:8000 --model-name-or-path openai/gpt-oss-20b

#1
Files changed (1) hide show
  1. app.py +161 -51
app.py CHANGED
@@ -1,52 +1,162 @@
1
- from shiny import App, ui, render, reactive
2
- import subprocess
3
-
4
- app_ui = ui.page_sidebar(
5
- ui.sidebar(
6
- ui.input_action_button("install_ollama", "Install Ollama"),
7
- ui.input_action_button("run_ollama", "Run GPT-OSS:20B"),
8
- ),
9
- ui.panel_main(
10
- ui.input_text_area("user_message", "Type your message here...", height="100px"),
11
- ui.input_action_button("send", "Send"),
12
- ui.output_text_verbatim("chat_history"),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  )
14
- )
15
-
16
- def server(input, output, session):
17
- chat_history = reactive.Value("")
18
-
19
- @output
20
- @render.text
21
- def chat_history():
22
- return chat_history()
23
-
24
- @reactive.Effect
25
- @reactive.event(input.install_ollama)
26
- def install_ollama():
27
- try:
28
- subprocess.run(["curl", "-fsSL", "https://ollama.com/install.sh", "|", "sh"], check=True, shell=True)
29
- chat_history.set(chat_history() + "\nOllama installed successfully.")
30
- except subprocess.CalledProcessError as e:
31
- chat_history.set(chat_history() + f"\nError installing Ollama: {e}")
32
-
33
- @reactive.Effect
34
- @reactive.event(input.run_ollama)
35
- def run_ollama_model():
36
- try:
37
- subprocess.Popen(["ollama", "run", "gpt-oss:20b"])
38
- chat_history.set(chat_history() + "\nRunning GPT-OSS:20B model.")
39
- except Exception as e:
40
- chat_history.set(chat_history() + f"\nError running model: {e}")
41
-
42
- @reactive.Effect
43
- @reactive.event(input.send)
44
- def send_message():
45
- user_message = input.user_message()
46
- if user_message:
47
- chat_history.set(chat_history() + f"\nYou: {user_message}")
48
- # Here you would typically send the message to the chat server and get a response
49
- # For now, we'll just echo the message
50
- chat_history.set(chat_history() + f"\nBot: {user_message}")
51
-
52
- app = App(app_ui, server)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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"])