## chatGPT with Gradio 起手式 ## 在你的資料夾新增 .env 檔案,並在裡面寫入 API_KEY=你的API金鑰 import os import openai import gradio as gr import json from zhdate import ZhDate from datetime import datetime localrun = False # 上傳到 Hugging Space 時要設定成 False DESKTOP_KEY = False # 排紫微盤的參考變數 solar_year = 1998 solar_month = 5 solar_day = 18 time_hour = 3 time_min = 14 gender = 0 #命宮主星是 ming_table[self_palace_epos] zi_adjust = 2 ''' 排盤有以下幾個步驟 1. 定命宮等十二宮 2. 起寅首、定納音五行局 3. 定紫微星、天府星 4. 安十四主星 5. 最好也能(安生年四化星) ''' def gen_chart(solar_year, solar_month, solar_day, time_hour, time_min, gender): from datetime import timedelta, datetime # 六十甲子納音歌 fiveoldsong = [ 4, 2, 6, 4, 2, 6, 2, 6, 5, 2, 6, 5, 6, 5, 3, 6, 5, 3, 5, 3, 4, 5, 3, 4, 3, 4, 2, 3, 4, 2 ]; # 五行局 fiveway = ['水二局','木三局','金四局','土五局','火六局'] # 紫微星查表 ziwei_table = [2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,1,1,2,2,3,3,4,4,5,5,2,3,6,3,4,7,4,5,8,5,6,9,6,7,10,7,8,11,8,9,12,9,10,1,10,11,2,11,12,12,5,2,3,1,6,3,4,2,7,4,5,3,8,5,6,4,9,6,7,5,10,7,8,6,11,8,9,7,12,7,12,5,2,3,8,1,6,3,4,9,2,7,4,5,10,3,8,5,6,11,5,9,6,7,12,5,10,7,8,10,7,12,5,2,3,11,8,1,6,3,4,12,9,2,7,4,5,1,10,3,8,5,6,2,11,4,9,6,7]; # 天府星查表 tianfu_table = [5,4,3,2,1,12,11,10,9,8,7,6] # 地支表格 earth_table = ['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥'] # 命盤 ming_table = ['E','','','','','','','','','','','',''] def get_year_hepos(birthdatetime): start_year = (birthdatetime.year - 3) % 60 hs_pos = start_year % 10 if hs_pos == 0: hs_pos = 10 gb_pos = start_year % 12 if gb_pos == 0: gb_pos = 12 year_hepos = [hs_pos, gb_pos] return year_hepos def get_birth_time_epos(birthdatetime): if birthdatetime.hour in range(23, 1): return 1 elif birthdatetime.hour in range(1, 3): return 2 elif birthdatetime.hour in range(3, 5): return 3 elif birthdatetime.hour in range(5, 7): return 4 elif birthdatetime.hour in range(7, 9): return 5 elif birthdatetime.hour in range(9, 11): return 6 elif birthdatetime.hour in range(11, 13): return 7 elif birthdatetime.hour in range(13, 15): return 8 elif birthdatetime.hour in range(15, 17): return 9 elif birthdatetime.hour in range(17, 19): return 10 elif birthdatetime.hour in range(19, 21): return 11 elif birthdatetime.hour in range(21, 23): return 12 return 1 def get_self_palace_epos(birthdatetime, isleap): month_position = birthdatetime.month hour_position = get_birth_time_epos(birthdatetime) #檢查是否為閏月 if isleap == True: if Zwsetting.intercalary_month == 2: month_position += 1 elif Zwsetting.intercalary_month == 3: if birthdatetime.day > 15: month_position += 1 # 直接將月份 +3 的原因是: +2 是為了將寅起調整成子起,另外的 +1 是因為計算時間時本格也算一次,所以 +1 調整回來。 position = ( month_position + 3 - hour_position )%12 position = 12 if position == 0 else position return position def get_body_palace_epos(birthdatetime, isleap): month_position = birthdatetime.month hour_position = get_birth_time_epos(birthdatetime) #檢查是否為閏月(先不用管閏十二月,最接近的兩年 1889年,2500年) if isleap == True: if Zwsetting.intercalary_month == 2: month_position += 1 elif Zwsetting.intercalary_month == 3: if birthdatetime.day > 15: month_position += 1 # 直接將月份 +1 的原因是: +2 是為了將寅起調整成子起,另外的 -1 是因為計算時間時本格也算一次,所以 -1 調整回來。 position = ( month_position + 1 + hour_position )%12 position = 12 if position == 0 else position return position def get_yin_hpos(birthdatetime): start_year = (birthdatetime.year - 3) % 60 hs_pos = start_year % 10 if hs_pos == 0: hs_pos = 10 self_hpos = ((1+hs_pos*2) % 10) return self_hpos def get_earth(x,y): ## 地支只能在 1-12 之間整數,x是目前位置,y是順數多少宮位(y為負則是逆數) result = (x + y) % 12 # 如果結果不在 1 到 12 之間,則進行調整 while result <= 0: result += 12 #print(x,y,result) return result #chart_data = solar_year +'/'+ solar_month +'/'+ solar_day +'/'+ str(time_hour)+':'+str(time_min)+'/'+str(gender) #print(str(chart_data)) solar_birth_datetime = datetime(int(solar_year), int(solar_month), int(solar_day), time_hour, time_min) #夜子時設定檢查 if zi_adjust == 2 and time_hour >= 23 : solar_birth_datetime = solar_birth_datetime + timedelta(days=1) # 跳過 農曆轉換 #lunar = Zwbase.get_lunar_datetime(solar_birth_datetime) #lunar_birth_datetime = LunarDatetime(lunar.lunarYear, lunar.lunarMonth, lunar.lunarDay, solar_birth_datetime.hour, solar_birth_datetime.minute, lunar.isleap) # 取得生辰年干支位置 year_hepos = get_year_hepos(solar_birth_datetime) # 取得陰陽性別位置 # 性別 if gender == 2: gender_pos = 2 else: gender_pos = 3 # 陰陽 yin_yang_pos = 0 if year_hepos[0] % 2 == 1 else 1 # 取得生辰地支位置 birth_time_epos = get_birth_time_epos(solar_birth_datetime) # 取得命宮地支位置 self_palace_epos = get_self_palace_epos(solar_birth_datetime, False) ## 還沒有做 閏年 處理 lunar.isleap # 取得寅宮天干位置 yin_hpos = get_yin_hpos(solar_birth_datetime) # 取得命宮天干位置 # - 計算命宮-寅宮順向距離 self_yin_dist = 0 if self_palace_epos >= 3: self_yin_dist = self_palace_epos - 3 else: self_yin_dist = self_palace_epos + 9 # - 計算命宮天干位置 self_palace_hpos = 0 if (self_yin_dist + yin_hpos) > 10: self_palace_hpos = (self_yin_dist + yin_hpos) - 10 else: self_palace_hpos = self_yin_dist + yin_hpos # 取得身宮位置 body_palace_epos = get_body_palace_epos(solar_birth_datetime, False) # 取得五行局 fiveway_param_1 = int(( self_palace_hpos + 1) / 2 if self_palace_hpos % 2 == 1 else self_palace_hpos / 2 ) fiveway_param_2 = int(( self_palace_epos + 1) / 2 if self_palace_epos % 2 == 1 else self_palace_epos / 2 ) fiveway_pos = fiveoldsong[(fiveway_param_1 - 1) * 6 + fiveway_param_2 - 1] # 取得紫微星位置 ziwei_pos = ziwei_table[(fiveway_pos -2) * 30 + int(solar_day)-1] ## lunar.lunarDay - 1 # 取得天府星位置 tianfu_pos = tianfu_table[ziwei_pos-1] outstr=f'用戶命盤上的紫微在:{earth_table[ziwei_pos-1]}宮,用戶命宮在:{earth_table[self_palace_epos-1]}宮' # 14 主星 s_table = ['E','紫微','天機','太陽','武曲','天同','廉貞','天府','太陰','貪狼','巨門','天相','天梁','七殺','破軍'] ming_table[ziwei_pos]=s_table[1] ming_table[get_earth(ziwei_pos,-1)]=s_table[2] ming_table[get_earth(ziwei_pos,-3)]=s_table[3] ming_table[get_earth(ziwei_pos,-4)]=s_table[4] ming_table[get_earth(ziwei_pos,-5)]=s_table[5] ming_table[get_earth(ziwei_pos,-8)]=s_table[6] ming_table[tianfu_pos]=ming_table[tianfu_pos] + s_table[7] ming_table[get_earth(tianfu_pos,1)]=ming_table[get_earth(tianfu_pos,1)] + s_table[8] ming_table[get_earth(tianfu_pos,2)]=ming_table[get_earth(tianfu_pos,2)] + s_table[9] ming_table[get_earth(tianfu_pos,3)]=ming_table[get_earth(tianfu_pos,3)] + s_table[10] ming_table[get_earth(tianfu_pos,4)]=ming_table[get_earth(tianfu_pos,4)] + s_table[11] ming_table[get_earth(tianfu_pos,5)]=ming_table[get_earth(tianfu_pos,5)] + s_table[12] ming_table[get_earth(tianfu_pos,6)]=ming_table[get_earth(tianfu_pos,6)] + s_table[13] ming_table[get_earth(tianfu_pos,10)]=ming_table[get_earth(tianfu_pos,10)] + s_table[14] ming_star.value = ming_table[self_palace_epos] # 要處理命宮空宮的狀況 if len(ming_star.value) == 0: if self_palace_epos <= 6: ming_star.value = '空' + ming_table[self_palace_epos+6] outstr = outstr + f'\n命宮主星是:空宮,需要借星( {ming_table[self_palace_epos+6]} )' else: ming_star.value = '空' + ming_table[self_palace_epos-6] outstr = outstr + f'\n命宮主星:是空宮,需要借星( {ming_table[self_palace_epos-6]} )' else: # outstr = outstr + f'\n==> {ming_table}' outstr = outstr + f'\n命宮主星是:( {ming_table[self_palace_epos]} )' # 五行局為{fiveway[fiveway_pos-2]}, return outstr def get_envkey(): from dotenv import load_dotenv, find_dotenv _ = load_dotenv(find_dotenv()) # read local .env file openai.api_key = os.environ['OPENAI_API_KEY'] print(openai.api_key) if openai.api_key: DESKTOP_KEY = openai.api_key print(DESKTOP_KEY) if localrun: get_envkey() # 定義地支對應的時間區間 z_mapping = { "1": "子", "2": "丑", "3": "寅", "4": "卯", "5": "辰", "6": "巳", "7": "午", "8": "未", "9": "申", "10": "酉", "11": "戌", "12": "亥", "0": "夜子" } ## AI 建議 def get_advice(API_KEY, model="gpt-3.5-turbo"): if API_KEY: openai.api_key = API_KEY else: openai.api_key = DESKTOP_KEY print(openai.api_key) if openai.api_key == False: return '你需要有 OPENAI 的 API 金鑰,我才能提供您建議。有了建議後再請你評分,謝謝。' # 指定 JSON 檔案路徑 json_file_path = 'stars14.json' # 讀取 JSON 檔案 with open(json_file_path, 'r') as json_file: # 使用 json.load() 方法將 JSON 檔案轉換為 Python 物件 myData = json.load(json_file) # 現在,myData 變數包含了 JSON 檔案的內容 def get_data(star_name): ## msum = '' gw_main_star = '' print(star_name) for i in range(0, 13): if myData[i]['命宮星象'] == star_name: msum = msum + myData[i]['整體描述'] print(msum) #gw_main_star = gw_main_star + myData[i]['正面特質'] + myData[i]['負面特質'] gw_main_star = gw_main_star + myData[i]['正面特質'] gw_main_star = gw_main_star + myData[i]['負面特質'] #print(gw_main_star) break return msum,gw_main_star print(len(ming_star.value)) # 如果是4就有兩個主星,0就是沒有主星 if len(ming_star.value) == 2: msum,gw_main_star = get_data(ming_star.value) elif len(ming_star.value) == 4: # '你的命宮有雙主星:\n\n' first_star = ming_star.value[:2] second_star = ming_star.value[2:4] print(f'first_star = {first_star} second_star = {second_star}') msum_tmp = '' gw_main_star_tmp = '' msum_tmp,gw_main_star_tmp = get_data(first_star) msum,gw_main_star = get_data(second_star) msum = '<你的命宮有雙主星>\n\n' + msum_tmp + '\n\n' + msum gw_main_star = gw_main_star_tmp + '\n' + gw_main_star # elif len(ming_star.value) == 5: # '你的命宮沒有主星:\n\n' first_star = ming_star.value[1:3] second_star = ming_star.value[3:5] print(f'first_star = {first_star} second_star = {second_star}') msum_tmp = '' gw_main_star_tmp = '' msum_tmp,gw_main_star_tmp = get_data(first_star) msum,gw_main_star = get_data(second_star) msum = '<你的命宮沒有紫微主星(我們向遷移宮借星)>\n\n' + msum_tmp + '\n\n' + msum gw_main_star = gw_main_star_tmp + '\n' + gw_main_star # else: print("DATA ERROR!!!") # # print(ming_star.value,"===",gw_main_star,"#####") messages = [{"role": "system", "content": "你是一個心理學權威,當接收到一段關於人格特質的描述時,請以一個專業的心理諮商師的身分,約500字的長度,針對正向特質給予肯定,帶領使用者欣賞自身優點;\ 針對負向特質則以包容的態度,約1500字的長度,給予適當的建議,並鼓勵自發性地做出改變及經常自省,將負向特質轉化成自己的優勢。最後再給予約200字的總結。\ 請你用 traditional Chinese 回答"}, # {"role": "user", "content": f'我的人格特質以紫微斗數星象來推論是“{gw_main_star}”. 請替我依照這些人格特質,並根據 Myers-Briggs Type Indicator (MBTI) 人格分析學說,一條一條的幫我解析?'},] # {"role": "user", "content": f'我的人格特質以紫微斗數星象來推論是“{gw_main_star}”. 請替我依照這些人格特質,並根據 16 Personality Factors 人格分析工具,一條一條的幫我分析?'},] # {"role": "user", "content": f'我的人格特質以紫微斗數星象來推論是“{gw_main_star}”. 請替我依照這些人格特質,並根據 OCEAN 五大人格分析系統,一條一條的幫我分析?'},] {"role": "user", "content": f'用戶的人格特質以紫微斗數星象來推論是“{gw_main_star}”. 請給他一些待人處事的建議?'},] # OCEAN 五大人格特質 response = openai.chat.completions.create( model=model, max_tokens=4096, messages=messages, temperature=0.1, # this is the degree of randomness of the model's output ) returndata = '紫微斗數全書上面說:\n\n' + msum + '\n\n我給您的建議是:\n\n' + response.choices[0].message.content if API_KEY: ming_feedback.info = 'YES' ming_feedback.value = ming_star.value + '\n\n' + returndata return returndata def GWAI(year, month, day, btime, sex) -> datetime: dt_date1 = datetime(int(year), int(month), int(day)) date_lunar = ZhDate.from_datetime(dt_date1) bstr = str(date_lunar) hour = int(btime.split(":")[0]) if hour >= 23: z = 0 else: z = int((hour + 1) / 2) + 1 result=z_mapping[str(z)] output=(bstr.replace('农历','農曆') + " " + result + "時") import re match = re.search(r'(\d+)年(\d+)月(\d+)日', output) if match: my_year = match.group(1) my_month = match.group(2) my_day = match.group(3) pssex = 2 if sex == '男' or sex == '男生' or sex == 'Male' or sex == 'male' or sex == 'M' or sex == 'm' or sex == 'Boy' or sex == 'boy' or sex == '1': pssex = 1 print(output) print('<<',my_year,my_month,my_day,pssex,'>>') output2=gen_chart(int(my_year), int(my_month), int(my_day), hour, int(30), int(pssex)) return output,output2 def disp_prompt(): output = '''你是 ChatGPT, a large language model trained by OpenAI, based on the GPT-4 architecture. 我打算用傳統中文 traditional Chinese 給你一個叫“排龍珠”的任務,結果請你也用 traditional Chinese 回答。 這個任務有以下步驟,請一步一步依循這些步驟去完成 步驟1:你需要用戶給你一些數值,你必須依賴這些數值去計算最後的結果 步驟2:你需要的數值有年、月、日、時。還有性別。 步驟3:你需要的數值,年的部分,它是 1940 到 2040 間的 int 整數。 步驟4:你需要的數值,月的部分,它是 1 到 12 間的 int 整數。 步驟5:你需要的數值,日的部分,它是 1 到 30 間的 int 整數,我們會特別稱它叫排盤日。 步驟6:你需要的數值,時的部分,它是 1 到 12 間的 int 整數。 步驟7:你需要的數值,性別的部分,男性是以整數 1 表示,女性是以整數 2 表示。 步驟8:以下是三個正確的數值範例。1992/11/28/12/2。1983/4/3/9/1。1977/6/2/7/1。 步驟9:我們定義『盤箱串』是一個有12個箱子的結構體,箱子從編號1連接編號2,編號3,編號4,一直到編號12。然後編號12會接到編號1,形成一個圓圈的結構體『盤箱串』。 步驟10:『盤箱串』上的12個箱子,每個箱子外面有貼一張標籤,該標籤只可以是1到10之間的整數,而且他們是依序排列的1,2,3,...,10,10的後面接著1,2,3...。你知道如果我從編號3的箱子開始貼標籤1,那編號12的箱子的標籤數字就是10,那編號1的箱子的標籤數字就是1,那編號2的箱子的標籤數字就是2。 步驟11:接下來,我們要給某一個箱子貼上彩虹紙帶。這個貼彩虹紙帶箱子的選擇方式是,把月的數值,加上14,然後減去時的數值,再將結果加1,得到的數字再取其與12的餘數,如果餘數等於0,就加上12,以上計算的數值將落在1與12之間,就是貼彩虹紙帶箱子的編號(B)。 步驟12:接著,我們可以從用戶提供的年這個數值,去算出編號3的箱子外面的標籤的數字(K)。將年這個數值除以10得到的餘數,會是0到9之間的正整數。 這個數字是4或9的時候,(K)會是3。 這個數字是5或0的時候,(K)會是5。 這個數字是6或1的時候,(K)會是7。 這個數字是7或2的時候,(K)會是9。 這個數字是8或3的時候,(K)會是1。 步驟13:我們“排龍珠”任務要算的是有貼上彩虹紙帶那個箱子的『五行局』。你必須有貼彩虹紙帶的箱子的編號(B),還有貼彩虹紙帶的箱子的標籤數字(A),才能繼續。 步驟14:如果編號3的箱子外面的標籤數字算出來為(N)。我們要算出貼上彩虹紙帶那個箱子外面的標籤數字(A),這個數字(A)如果大於或等於3,它就等於貼彩虹紙帶的箱子編號(B) - 3 + 編號3的箱子外面的標籤數字(N)。如果這個數字如果小於3,它就等於貼彩虹紙帶的箱子編號(B) - 1 + 編號3的箱子外面的標籤數字(N)。 步驟15:我們現在要算出貼上彩虹紙帶那個箱子外面的標籤數字。我們可以根據貼彩虹紙帶的箱子編號(B)與箱子上的標籤數字(A),再去算出貼彩虹紙帶的箱子的『五行局』這個數值。 步驟16:將(((A+1)/2)-1)的結果,只取商數,然後乘以6,得到C。然後 ((B+1)/2)的結果,只取商數為D。(C+D)得出的數字(M),以這個數字(M)去查以下陣列表格(這個陣列表格不是從0而是從1開始索引排序的):[ 4, 2, 6, 4, 2, 6, 2, 6, 5, 2, 6, 5, 6, 5, 3, 6, 5, 3, 5, 3, 4, 5, 3, 4, 3, 4, 2, 3, 4, 2 ]。這樣查表格所得到的數字就是有貼上彩虹紙帶那個箱子『五行局』的數值(F)。 步驟17:接下來,我們要把一顆『龍珠』放進箱子裡,要放『龍珠』這個星星的箱子,必須滿足以下一些條件。 步驟18:先把(用戶輸入的“排盤日”數值)除以(F)。我們把這個結果分成商(z),餘數(y),來記錄。 如果y等於0時,我們取商(z)這個值。 如果y不等於0時,把(F)乘以(商(z)+1)去減掉(用戶輸入日的數值),得到ㄧ個值,我們叫它(x)。(商(z)+1),我們叫它(k) 步驟19:如果 x 是奇數,那麼(k)這個值要減掉 x 步驟20:如果 x 是偶數,那麼(k)這個值要加上 x 步驟21:依步驟19或步驟20,將(k)算出來 步驟22:如果 (k) >= 0 ,這個箱子編號(MS) =(k) + 2 步驟23:如果 (k) < 0 ,這個箱子編號(MS)=(k) + 14 步驟24:以上計算好後,我們就可以知道『龍珠』該放進去箱子是(MS) 步驟25:最後請告訴用戶“排龍珠”任務的結果,包括 貼彩虹紙帶的箱子編號(B)是多少 該箱子的標籤數字(A)是多少 貼上彩虹紙帶那個箱子『五行局』的數值(F)是多少 有『龍珠』的箱子的編號(MS)是多少 步驟26:完成。''' return output def save_feedback(x): import sqlite3 conn = sqlite3.connect('savedata.db') c = conn.cursor() if ming_feedback.info != '': output = f'謝謝您給我們 {x} / 5 分的評分,我把評分存起來了,謝謝你的評分!' ming_feedback.info = '' td = datetime.now().strftime('%Y-%m-%d, %H:%M:%S') print(td,ming_feedback.value) c.execute(f'''INSERT INTO USERFEEDBACK (FEEDBACK,SCORE,MINGSTAR,SAVEDATE) \ VALUES ( "{ming_feedback.value}", {x}, "{ming_star.value}", "{td}" )''') conn.commit() else: output = '你需要有 OPENAI 的 API 金鑰,我才能提供您建議。有了建議後再請你評分,謝謝。' conn.close() print(f'User given score = {x}') return output # 建立 components year = gr.Textbox( label="生年", info="輸入你的西元出生年份", placeholder="Input your birth year here...") month = gr.Textbox( label="生月", info="輸入你的出生月份", placeholder="Input your birthday month here...",) day = gr.Textbox( label="生日", info="輸入你的出生日子", placeholder="Input your birthday day here...",) btime = gr.Textbox( label="生時", info="輸入你的出生時間 HH:MM (幾點及約略幾分即可,請用24小時制)", placeholder="Input your birth time here...",) sex = gr.Textbox( label="性別", info="輸入你是男生或女生", placeholder="Input you are male or female here...",) output_gwai = gr.Textbox( value="", label="你的農曆生日及出生時辰", info="這是從西元換算出的農曆生日及出生時辰", placeholder="Date & Time") output2_gwai = gr.Textbox( value="", label="你的紫微斗數命宮星象", info="這是你的紫微斗數命盤上,命宮裡的主星的資訊", placeholder="Stars in your master plate.") advice = gr.Textbox( label="輸出視窗", info="根據你需求的 LLM 輸出結果", placeholder="Ouput Text here...", lines=5,) btn = gr.Button( value="計算農曆生日及八字時辰", variant="primary", scale=1) btn_advice = gr.Button( value="AI 紫微的人生建議", variant="primary", scale=2) btn_chat = gr.Button( value="教 LLM 紫微排盤的 Prompt", variant="primary", scale=1) key_box = gr.Textbox( label="輸入你的 API 金鑰", info="You have to provide your own OPENAI_API_KEY for this app to function properly", placeholder="Type OpenAI API KEY here...", type="password") btn_feedback = gr.Button( value="送出評分", variant="primary", scale=1) ming_star = gr.Textbox( label="命宮主星", info="", placeholder="", value="MINGSTAR") ming_feedback = gr.Textbox( label="回饋評分", info="", placeholder="", value="MINGFB") ft = gr.Slider( minimum=1, maximum=5, step=1, value=5, label="fbscore", info="你覺得我們的人生建議是否貼切有助益呢?請給我們評分(1 - 5 分)。") with gr.Blocks() as demo: gr.Markdown(""" # AI 紫微 有沒有可能?! - 你的農曆出生時辰,已經決定了你的基本個性與處事態度 """) with gr.Column(): with gr.Row(): year.render() # 顯示年 month.render() # 顯示月 day.render() # 顯示日 btime.render() # 顯示時 sex.render() # 顯示性別 with gr.Row(): output_gwai.render() # 顯示農曆生日欄 output2_gwai.render() btn.render() # 顯示農曆生日值結果 btn.click(fn=GWAI, inputs=[year, month, day, btime, sex], outputs=[output_gwai,output2_gwai]) advice.render() # 顯示AI建議結果的文字框 with gr.Row(): key_box.render() # 顯示API金鑰輸入框 btn_advice.render() # 顯示AI建議按鈕 btn_advice.click(fn=get_advice, inputs=[key_box], outputs=advice) btn_chat.click(fn=disp_prompt, outputs=advice) btn_chat.render() # 顯示紫微聊天室按鈕 with gr.Row(): ft.render() btn_feedback.render() btn_feedback.click(fn=save_feedback, inputs=ft, outputs=advice) demo.launch()