|
import gradio as gr |
|
import time |
|
import pandas as pd |
|
|
|
|
|
def create_wa_sui_theme(): |
|
return gr.Theme( |
|
primary_hue="blue", |
|
secondary_hue="cyan", |
|
neutral_hue="slate", |
|
text_size="md", |
|
spacing_size="lg", |
|
radius_size="sm", |
|
font=[ |
|
"Hiragino Sans", |
|
"Noto Sans JP", |
|
"Yu Gothic", |
|
"system-ui", |
|
"sans-serif" |
|
], |
|
font_mono=[ |
|
"SF Mono", |
|
"Monaco", |
|
"monospace" |
|
] |
|
).set( |
|
|
|
body_background_fill="#ffffff", |
|
body_text_color="#025159", |
|
button_primary_background_fill="#03658C", |
|
button_primary_background_fill_hover="#025159", |
|
button_primary_text_color="#ffffff", |
|
button_secondary_background_fill="#03A6A6", |
|
button_secondary_background_fill_hover="#037F8C", |
|
button_secondary_text_color="#ffffff", |
|
input_background_fill="#ffffff", |
|
input_border_color="#03A6A6", |
|
input_border_color_focus="#03658C", |
|
block_background_fill="#ffffff", |
|
block_border_color="#037F8C", |
|
panel_background_fill="#ffffff", |
|
panel_border_color="#037F8C", |
|
slider_color="#03658C", |
|
checkbox_label_text_color="#ffffff", |
|
) |
|
|
|
|
|
def create_comprehensive_demo(): |
|
theme = create_wa_sui_theme() |
|
|
|
|
|
sample_data = pd.DataFrame({ |
|
"商品名": ["碧海ラテ", "水面煎茶", "深海玄米茶", "潮風ほうじ茶"], |
|
"価格": [450, 300, 280, 320], |
|
"在庫": [15, 25, 8, 12], |
|
"評価": [4.8, 4.5, 4.2, 4.6] |
|
}) |
|
|
|
|
|
def greet(name, mood, age, subscribe, hobbies_selected, prefecture_selected, satisfaction_level): |
|
if not name: |
|
return "名前を入力してください。" |
|
|
|
age_msg = f"({age}歳)" if age else "" |
|
subscribe_msg = "ニュースレターの購読ありがとうございます!" if subscribe else "" |
|
hobbies_msg = f"趣味: {', '.join(hobbies_selected)}" if hobbies_selected else "趣味: 未選択" |
|
prefecture_msg = f"出身: {prefecture_selected}" |
|
|
|
|
|
if satisfaction_level is None: |
|
satisfaction_msg = "満足度: 未設定" |
|
else: |
|
satisfaction_msg = f"満足度: {int(satisfaction_level)}/10" |
|
|
|
greetings = { |
|
"🌊 爽やか": f"{name}さん{age_msg}、今日は海のように爽やかですね!🌊", |
|
"💧 静寂": f"こんにちは、{name}さん{age_msg}。水のように静かな一日ですね。", |
|
"🏖️ 穏やか": f"{name}さん{age_msg}、穏やかな波のような心地よい日ですね。🏖️" |
|
} |
|
result = greetings.get(mood, f"こんにちは、{name}さん{age_msg}。") |
|
result += f"\n{hobbies_msg}" |
|
result += f"\n{prefecture_msg}" |
|
result += f"\n{satisfaction_msg}" |
|
if subscribe_msg: |
|
result += f"\n{subscribe_msg}" |
|
return result |
|
|
|
def generate_haiku(season, style): |
|
haikus = { |
|
("🌊 海", "古典"): "青い海\n波音響きて\n心澄む", |
|
("🌊 海", "現代"): "海見つめ\nインスタ映えする\n青い空", |
|
("💧 雨", "古典"): "雨滴りて\n水面に広がる\n静寂かな", |
|
("💧 雨", "現代"): "雨の日は\nカフェで海を\n眺めつつ", |
|
("🌙 月", "古典"): "月影が\n水面に映りて\n揺らめけり", |
|
("🌙 月", "現代"): "月夜には\n海カフェでまったり\nティータイム", |
|
("❄️ 雪", "古典"): "雪降りて\n海も静寂に\n包まれん", |
|
("❄️ 雪", "現代"): "雪景色\n海と空とが\n一つなり" |
|
} |
|
return haikus.get((season, style), "季語なし\n心に響きて\n句となりぬ") |
|
|
|
def process_data(data, filter_price): |
|
if data is None: |
|
return sample_data |
|
|
|
df = pd.DataFrame(data) |
|
if filter_price: |
|
df = df[df['価格'] >= filter_price] |
|
return df |
|
|
|
def add_chat_message(message, history): |
|
if message: |
|
responses = [ |
|
"海のように深いご質問ですね!", |
|
"波のようにゆったりと考えてみましょう。", |
|
"なるほど、潮の満ち引きのように理解できます。", |
|
"水面に映る月のように美しい発想ですね!", |
|
"一緒に海風を感じながら考えてみましょう。" |
|
] |
|
import random |
|
response = random.choice(responses) |
|
history.append([message, response]) |
|
return history, "" |
|
|
|
|
|
def clear_all_inputs(): |
|
return [ |
|
"", |
|
25, |
|
"💧 静寂", |
|
False, |
|
[], |
|
"神奈川県", |
|
8, |
|
"", |
|
"神奈川県, 満足度: 8", |
|
"8 (type: int)", |
|
"" |
|
] |
|
|
|
|
|
def update_hobbies_debug(selected_hobbies): |
|
if selected_hobbies: |
|
return ", ".join(selected_hobbies) |
|
else: |
|
return "未選択" |
|
|
|
|
|
def update_status_debug(prefecture_val, satisfaction_val): |
|
if satisfaction_val is None: |
|
return f"{prefecture_val}, 満足度: 未設定" |
|
else: |
|
return f"{prefecture_val}, 満足度: {int(satisfaction_val)}" |
|
|
|
|
|
def update_satisfaction_debug(satisfaction_val): |
|
if satisfaction_val is None: |
|
return "None (未設定)" |
|
else: |
|
return f"{satisfaction_val} (type: {type(satisfaction_val).__name__})" |
|
|
|
with gr.Blocks(theme=theme, title="WA-SUI 和水") as demo: |
|
|
|
|
|
gr.HTML(""" |
|
<div style='text-align: center; margin-bottom: 2rem; padding: 2rem; background: linear-gradient(135deg, #03658C 0%, #AED3F2 100%); color: white; border-radius: 12px; box-shadow: 0 8px 32px rgba(3, 101, 140, 0.3);'> |
|
<h1 style='font-size: 3rem; margin-bottom: 0.5rem; text-shadow: 2px 2px 4px rgba(2, 81, 89, 0.5); color: white;'>WA-SUI 和水</h1> |
|
<p style='font-size: 1.2rem; margin: 0; opacity: 0.9; color: white;'>〜 水の流れのような調和とデザイン 〜</p> |
|
</div> |
|
""") |
|
|
|
with gr.Tabs(): |
|
|
|
|
|
with gr.Tab("🌊 基本入力"): |
|
gr.Markdown("### 様々な入力コンポーネント") |
|
|
|
with gr.Row(): |
|
with gr.Column(): |
|
name_input = gr.Textbox( |
|
label="🌊 お名前", |
|
placeholder="海野太郎", |
|
info="フルネームを入力してください" |
|
) |
|
|
|
age_input = gr.Number( |
|
label="🎂 年齢", |
|
minimum=0, |
|
maximum=120, |
|
value=25 |
|
) |
|
|
|
mood_selector = gr.Radio( |
|
choices=["🌊 爽やか", "💧 静寂", "🏖️ 穏やか"], |
|
label="🎭 今日の気分", |
|
value="💧 静寂" |
|
) |
|
|
|
subscribe_check = gr.Checkbox( |
|
label="📧 海のお便りを購読する", |
|
value=False |
|
) |
|
|
|
with gr.Column(): |
|
hobbies = gr.CheckboxGroup( |
|
choices=["🏄♂️ サーフィン", "🐠 釣り", "🌊 海水浴", "🏃♂️ ジョギング", "🍵 茶道", "🎨 水彩画"], |
|
label="趣味(複数選択可)", |
|
value=["🐠 釣り"], |
|
interactive=True |
|
) |
|
|
|
prefecture = gr.Dropdown( |
|
choices=["北海道", "神奈川県", "静岡県", "愛知県", "三重県", "沖縄県"], |
|
label="🗾 都道府県(海に近い県)", |
|
value="神奈川県", |
|
interactive=True |
|
) |
|
|
|
satisfaction = gr.Slider( |
|
minimum=1, |
|
maximum=10, |
|
value=8, |
|
step=1, |
|
label="🌊 満足度(波の高さで表現:1-10)", |
|
interactive=True, |
|
show_label=True |
|
) |
|
|
|
|
|
hobbies_debug = gr.Textbox( |
|
label="🔍 選択中の趣味(デバッグ用)", |
|
interactive=False, |
|
value="🐠 釣り" |
|
) |
|
|
|
|
|
status_debug = gr.Textbox( |
|
label="🔍 都道府県・満足度(デバッグ用)", |
|
interactive=False, |
|
value="神奈川県, 満足度: 8" |
|
) |
|
|
|
|
|
satisfaction_debug = gr.Textbox( |
|
label="🔍 満足度の生の値(デバッグ用)", |
|
interactive=False, |
|
value="8" |
|
) |
|
|
|
with gr.Row(): |
|
submit_btn = gr.Button("🌊 情報を送信", variant="primary", size="lg") |
|
clear_btn = gr.Button("🗑️ クリア", variant="secondary") |
|
|
|
result_output = gr.Textbox( |
|
label="💌 結果", |
|
interactive=False, |
|
lines=4 |
|
) |
|
|
|
|
|
submit_btn.click( |
|
fn=greet, |
|
inputs=[name_input, mood_selector, age_input, subscribe_check, hobbies, prefecture, satisfaction], |
|
outputs=result_output |
|
) |
|
|
|
|
|
clear_btn.click( |
|
fn=clear_all_inputs, |
|
inputs=None, |
|
outputs=[name_input, age_input, mood_selector, subscribe_check, |
|
hobbies, prefecture, satisfaction, hobbies_debug, status_debug, satisfaction_debug, result_output] |
|
) |
|
|
|
|
|
hobbies.change( |
|
fn=update_hobbies_debug, |
|
inputs=[hobbies], |
|
outputs=[hobbies_debug] |
|
) |
|
|
|
|
|
prefecture.change( |
|
fn=update_status_debug, |
|
inputs=[prefecture, satisfaction], |
|
outputs=[status_debug] |
|
) |
|
|
|
satisfaction.change( |
|
fn=update_status_debug, |
|
inputs=[prefecture, satisfaction], |
|
outputs=[status_debug] |
|
) |
|
|
|
|
|
satisfaction.change( |
|
fn=update_satisfaction_debug, |
|
inputs=[satisfaction], |
|
outputs=[satisfaction_debug] |
|
) |
|
|
|
|
|
with gr.Tab("🎋 海の俳句工房"): |
|
gr.Markdown("### AI海洋俳句生成システム") |
|
|
|
with gr.Row(): |
|
with gr.Column(): |
|
season_selector = gr.Radio( |
|
choices=["🌊 海", "💧 雨", "🌙 月", "❄️ 雪"], |
|
label="🌊 季語を選択", |
|
value="🌊 海" |
|
) |
|
|
|
style_selector = gr.Radio( |
|
choices=["古典", "現代"], |
|
label="🎨 スタイル", |
|
value="古典" |
|
) |
|
|
|
haiku_btn = gr.Button("🌊 俳句を作る", variant="primary", size="lg") |
|
|
|
with gr.Column(scale=2): |
|
haiku_result = gr.Textbox( |
|
label="📜 生成された俳句", |
|
interactive=False, |
|
lines=5, |
|
placeholder="ここに美しい海の俳句が表示されます...", |
|
) |
|
|
|
gr.Markdown(""" |
|
**俳句の説明:** |
|
- **古典**: 伝統的な海の表現スタイル |
|
- **現代**: 現代的な海の言葉遣い |
|
""") |
|
|
|
haiku_btn.click( |
|
fn=generate_haiku, |
|
inputs=[season_selector, style_selector], |
|
outputs=haiku_result |
|
) |
|
|
|
|
|
with gr.Tab("📊 海のデータ"): |
|
gr.Markdown("### データ表示コンポーネント") |
|
|
|
with gr.Row(): |
|
with gr.Column(): |
|
price_filter = gr.Slider( |
|
minimum=200, |
|
maximum=500, |
|
value=300, |
|
step=50, |
|
label="💰 最低価格フィルター" |
|
) |
|
|
|
refresh_btn = gr.Button("🔄 データ更新", variant="secondary") |
|
|
|
|
|
json_data = gr.JSON( |
|
value={ |
|
"店舗名": "海風カフェ 碧", |
|
"営業時間": "9:00-21:00", |
|
"定休日": "火曜日", |
|
"メニュー数": 15, |
|
"人気商品": ["碧海ラテ", "海風スイーツセット"] |
|
}, |
|
label="📋 店舗情報(JSON)" |
|
) |
|
|
|
with gr.Column(scale=2): |
|
|
|
data_display = gr.DataFrame( |
|
value=sample_data, |
|
label="🌊 海のメニューデータ", |
|
interactive=True, |
|
wrap=True |
|
) |
|
|
|
|
|
label_display = gr.Label( |
|
value={ |
|
"海の見える店": 0.95, |
|
"潮風感じる": 0.88, |
|
"青い空気": 0.75, |
|
"波音聞こえる": 0.62 |
|
}, |
|
label="🏆 海のカフェ評価スコア" |
|
) |
|
|
|
refresh_btn.click( |
|
fn=process_data, |
|
inputs=[data_display, price_filter], |
|
outputs=data_display |
|
) |
|
|
|
|
|
with gr.Tab("💬 海のチャットボット"): |
|
gr.Markdown("### 海風AIアシスタントと会話") |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=2): |
|
chatbot = gr.Chatbot( |
|
value=[["こんにちは!", "こんにちは!海風カフェ碧のAIアシスタントです。海のようにゆったりとお手伝いさせていただきます🌊"]], |
|
label="🤖 海風AIアシスタント", |
|
height=400 |
|
) |
|
|
|
with gr.Row(): |
|
chat_input = gr.Textbox( |
|
placeholder="波のようにメッセージを入力してください...", |
|
label="", |
|
scale=4 |
|
) |
|
send_btn = gr.Button("🌊 送信", variant="primary", scale=1) |
|
|
|
|
|
with gr.Row(): |
|
quick1 = gr.Button("☕ 海のメニューは?", size="sm") |
|
quick2 = gr.Button("🕐 営業時間は?", size="sm") |
|
quick3 = gr.Button("📍 海までの道は?", size="sm") |
|
|
|
with gr.Column(): |
|
gr.Markdown("### 💡 海の便利機能") |
|
|
|
gr.Markdown(""" |
|
**質問例:** |
|
- 海を眺められるメニュー |
|
- 潮風を感じる営業時間 |
|
- 海辺へのアクセス方法 |
|
- 海の見える席の予約 |
|
- 海風イベント情報 |
|
""") |
|
|
|
|
|
with gr.Accordion("🔧 詳細設定", open=False): |
|
temperature = gr.Slider( |
|
minimum=0.1, |
|
maximum=2.0, |
|
value=0.7, |
|
step=0.1, |
|
label="🌡️ 応答の流動性(波の動き)" |
|
) |
|
|
|
max_tokens = gr.Slider( |
|
minimum=50, |
|
maximum=500, |
|
value=150, |
|
step=25, |
|
label="📏 最大応答長(潮の満ち引き)" |
|
) |
|
|
|
|
|
send_btn.click( |
|
fn=add_chat_message, |
|
inputs=[chat_input, chatbot], |
|
outputs=[chatbot, chat_input] |
|
) |
|
|
|
chat_input.submit( |
|
fn=add_chat_message, |
|
inputs=[chat_input, chatbot], |
|
outputs=[chatbot, chat_input] |
|
) |
|
|
|
|
|
def quick_reply_1(history): |
|
new_history = history + [["海のメニューは?", "碧海ラテと海風スイーツセットが人気です!季節限定の潮風もちもおすすめです。🌊"]] |
|
return new_history |
|
|
|
def quick_reply_2(history): |
|
new_history = history + [["営業時間は?", "海の見える時間、9:00-21:00で営業しています。定休日は火曜日です。🌅🌅"]] |
|
return new_history |
|
|
|
def quick_reply_3(history): |
|
new_history = history + [["海までの道は?", "JR東海道線「大磯駅」から徒歩5分です。海岸線沿いの青い建物が目印です。🏖️"]] |
|
return new_history |
|
|
|
quick1.click( |
|
fn=quick_reply_1, |
|
inputs=[chatbot], |
|
outputs=[chatbot] |
|
) |
|
|
|
quick2.click( |
|
fn=quick_reply_2, |
|
inputs=[chatbot], |
|
outputs=[chatbot] |
|
) |
|
|
|
quick3.click( |
|
fn=quick_reply_3, |
|
inputs=[chatbot], |
|
outputs=[chatbot] |
|
) |
|
|
|
|
|
with gr.Tab("🌊 WA-SUI設定"): |
|
gr.Markdown("### WA-SUI(和水)テーマの哲学") |
|
|
|
|
|
gr.HTML(""" |
|
<div style='display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 1rem; margin: 2rem 0;'> |
|
<div style='padding: 1.5rem; background: #ffffff; border: 2px solid #037F8C; border-radius: 12px; text-align: center; transition: transform 0.2s; box-shadow: 0 4px 12px rgba(174, 211, 242, 0.3);'> |
|
<h4 style='color: #025159; margin-top: 0;'>🤍 純白の背景</h4> |
|
<div style='width: 100%; height: 60px; background: #ffffff; border: 2px solid #AED3F2; border-radius: 8px; margin: 1rem 0; box-shadow: 0 4px 8px rgba(0,0,0,0.1);'></div> |
|
<p style='font-size: 0.9rem; color: #025159; margin: 0;'>#ffffff - メイン背景</p> |
|
</div> |
|
<div style='padding: 1.5rem; background: #ffffff; border: 2px solid #037F8C; border-radius: 12px; text-align: center; transition: transform 0.2s; box-shadow: 0 4px 12px rgba(174, 211, 242, 0.3);'> |
|
<h4 style='color: #025159; margin-top: 0;'>🌊 水面の輝き</h4> |
|
<div style='width: 100%; height: 60px; background: #AED3F2; border-radius: 8px; margin: 1rem 0; box-shadow: 0 4px 8px rgba(0,0,0,0.1);'></div> |
|
<p style='font-size: 0.9rem; color: #025159; margin: 0;'>#AED3F2 - アクセント</p> |
|
</div> |
|
<div style='padding: 1.5rem; background: #ffffff; border: 2px solid #037F8C; border-radius: 12px; text-align: center; transition: transform 0.2s; box-shadow: 0 4px 12px rgba(3, 101, 140, 0.3);'> |
|
<h4 style='color: #025159; margin-top: 0;'>🌀 深い海</h4> |
|
<div style='width: 100%; height: 60px; background: #03658C; border-radius: 8px; margin: 1rem 0; box-shadow: 0 4px 8px rgba(0,0,0,0.1);'></div> |
|
<p style='font-size: 0.9rem; color: #025159; margin: 0;'>#03658C - プライマリ</p> |
|
</div> |
|
<div style='padding: 1.5rem; background: #ffffff; border: 2px solid #037F8C; border-radius: 12px; text-align: center; transition: transform 0.2s; box-shadow: 0 4px 12px rgba(3, 127, 140, 0.3);'> |
|
<h4 style='color: #025159; margin-top: 0;'>🌊 中間の深さ</h4> |
|
<div style='width: 100%; height: 60px; background: #037F8C; border-radius: 8px; margin: 1rem 0; box-shadow: 0 4px 8px rgba(0,0,0,0.1);'></div> |
|
<p style='font-size: 0.9rem; color: #025159; margin: 0;'>#037F8C - ボーダー</p> |
|
</div> |
|
<div style='padding: 1.5rem; background: #ffffff; border: 2px solid #037F8C; border-radius: 12px; text-align: center; transition: transform 0.2s; box-shadow: 0 4px 12px rgba(1, 80, 89, 0.3);'> |
|
<h4 style='color: #025159; margin-top: 0;'>🕳️ 深海の静寂</h4> |
|
<div style='width: 100%; height: 60px; background: #025159; border-radius: 8px; margin: 1rem 0; box-shadow: 0 4px 8px rgba(0,0,0,0.1);'></div> |
|
<p style='font-size: 0.9rem; color: #025159; margin: 0;'>#025159 - テキスト</p> |
|
</div> |
|
<div style='padding: 1.5rem; background: #ffffff; border: 2px solid #037F8C; border-radius: 12px; text-align: center; transition: transform 0.2s; box-shadow: 0 4px 12px rgba(3, 165, 165, 0.3);'> |
|
<h4 style='color: #025159; margin-top: 0;'>💎 ティールの調和</h4> |
|
<div style='width: 100%; height: 60px; background: #03A6A6; border-radius: 8px; margin: 1rem 0; box-shadow: 0 4px 8px rgba(0,0,0,0.1);'></div> |
|
<p style='font-size: 0.9rem; color: #025159; margin: 0;'>#03A6A6 - セカンダリ</p> |
|
</div> |
|
</div> |
|
""") |
|
|
|
gr.Markdown(""" |
|
### 🌊 WA-SUI(和水)デザイン哲学 |
|
|
|
**流(りゅう)- Flow** |
|
- 水の自然な流れを表現 |
|
- 要素間の滑らかな遷移 |
|
- ユーザーの操作における流動性 |
|
|
|
**調(ちょう)- Harmony** |
|
- 純白の背景: 清潔で読みやすい基盤 |
|
- 水面の輝き: 美しいアクセントカラー |
|
- 深い海: 信頼感のある主要アクション |
|
- 中間の深さ: バランスの取れた境界 |
|
- 深海の静寂: 読みやすいテキスト |
|
- ティールの調和: 優美なセカンダリアクション |
|
|
|
**透(とう)- Transparency** |
|
- 直感的で透明な操作性 |
|
- 水のような清らかさ |
|
- 心地よいユーザー体験 |
|
- 海の広がりのような開放感 |
|
|
|
**和(わ)- Japanese Harmony** |
|
- 日本の美意識との融合 |
|
- 水と技術の調和 |
|
- 現代と伝統の共存 |
|
- 心の安らぎを与える設計 |
|
""") |
|
|
|
|
|
gr.Markdown("### 🛠️ WA-SUI コンポーネント実装") |
|
|
|
with gr.Row(): |
|
demo_slider = gr.Slider(0, 100, 50, label="🌊 波の高さ") |
|
demo_checkbox = gr.Checkbox(True, label="☑️ 海風を感じる") |
|
demo_radio = gr.Radio(["凪", "波", "嵐"], label="📻 海の状態", value="波") |
|
|
|
with gr.Row(): |
|
demo_dropdown = gr.Dropdown(["深海", "浅瀬", "潮だまり"], label="📋 海の深さ") |
|
demo_number = gr.Number(label="🔢 波の数", value=108) |
|
demo_textbox = gr.Textbox(label="📝 海への想い", placeholder="海のように広い心で...") |
|
|
|
|
|
gr.Markdown("### 🔘 WA-SUI アクション") |
|
with gr.Row(): |
|
gr.Button("🌊 波を起こす", variant="primary") |
|
gr.Button("💧 静寂にする", variant="secondary") |
|
gr.Button("⛔ 嵐を止める", variant="stop") |
|
|
|
|
|
gr.Markdown("### 🎵 海の音効果") |
|
with gr.Row(): |
|
wave_sound = gr.Audio(label="🌊 波の音", interactive=False) |
|
rain_sound = gr.Audio(label="☔ 雨の音", interactive=False) |
|
|
|
gr.Markdown(""" |
|
### 📚 WA-SUI 使用ガイド |
|
|
|
**適用シーン:** |
|
- 🏖️ 海辺のカフェ・レストラン |
|
- 🏊♂️ フィットネス・スパアプリ |
|
- 🧘♀️ 瞑想・リラクゼーションアプリ |
|
- 🌊 海洋関連の教育アプリ |
|
- 💧 水質管理システム |
|
|
|
**デザイン原則:** |
|
- 流れるような操作感 |
|
- 海の深さを表現した階層 |
|
- 水の透明感を活かしたレイアウト |
|
- 日本的な美意識の組み込み |
|
""") |
|
|
|
return demo |
|
|
|
|
|
if __name__ == "__main__": |
|
print("WA-SUI(和水)- 海と水のテーマ UIコンポーネント集") |
|
print("=" * 60) |
|
|
|
app = create_comprehensive_demo() |
|
app.launch( |
|
share=True, |
|
server_name="0.0.0.0", |
|
server_port=7860, |
|
show_error=True |
|
) |