import gradio as gr
import hashlib
moldP_list = [
"温和内敛",
"热情奔放",
"率真耿直",
"沉着稳重",
"古灵精怪"
]
moldN_list = [
"暴躁易怒",
"情感淡漠",
"优柔寡断",
"沉默寡言",
"胆小怯懦",
"敏感脆弱"
]
traitsP_list = [
"富有想象力,擅长战略性规划",
"富有创造力,且充满好奇心",
"富有个人魅力,善于鼓舞、领导他人",
"意志力强大,擅长解决问题",
"聪明好奇,热衷于发现和挑战",
"善于观察总结,能提出有效的建议",
"生性浪漫,善良且乐于助人",
"风趣幽默,乐于社交且自由自在",
"重情重义,喜欢和家人、朋友在一起",
"言出必行,十分可靠",
"善于倾听,有化解冲突的能力",
"直觉敏锐,且善于实践",
"有独到的审美造诣,擅于用创作表达"
]
traitsN_list = [
"无法独立生活,十分依赖于他人",
"缺乏同理心,有较高犯罪天赋",
"偏执任性、顽固不化",
"意志力薄弱、难以保持原则",
"生性多疑、难以信任他人",
"不善于表达、时常会无意间伤害他人",
"过分追求理念、时常苛责他人",
"斤斤计较、患得患失,让人难以接近",
"习惯性逃避,会把问题堆积到无可挽回的地步",
"有很强的控制欲,时常会伤害到周围的人"
]
def get_mold_and_trait(name):
# 计算name的sha256哈希值
sha256_hash = hashlib.sha256(name.encode()).hexdigest()
# 根据sha256第1个字符ascii的奇偶性选择mold列表
mold_list = moldP_list if int(sha256_hash[0], 16) % 2 == 0 else moldN_list
mold_polarity = 'P' if mold_list == moldP_list else 'N'
# 根据sha256第2、3字符代表的hex转成十进制选择mold
mold_index = int(sha256_hash[1:3], 16) % len(mold_list)
mold = mold_list[mold_index]
# 根据sha256第4个字符ascii的奇偶性选择traits列表
traits_list = traitsP_list if int(sha256_hash[3], 16) % 2 == 0 else traitsN_list
traits_polarity = 'P' if traits_list == traitsP_list else 'N'
# 根据sha256第5、6字符代表的hex转成十进制选择traits
traits_index = int(sha256_hash[4:6], 16) % len(traits_list)
traits = traits_list[traits_index]
# 根据mold和traits的极性拼接字符串
if mold_polarity == traits_polarity:
connector = ",且"
else:
connector = ",但"
result = f"{mold}{connector}{traits}"
return result
def select_story_type(name_A, name_B):
# 拼接两个字符串
concatenated_name = name_A + name_B
# 计算SHA-256哈希值
sha256_hash = hashlib.sha256(concatenated_name.encode()).hexdigest()
# 将哈希值转换为十进制
decimal_hash = int(sha256_hash, 16)
# 定义故事类型列表
story_types = [
"相爱相杀冤家型",
"青梅竹马养成型",
"平平淡淡温情型",
"一见倾心梦幻型",
"轰轰烈烈激情型",
"青涩懵懂青春型",
"互相讨厌培养型",
"互相折磨病娇型",
"又甜又真日常型",
"催人泪下悲情型"
]
# 使用mod操作符选择故事类型
selected_story_type = story_types[decimal_hash % len(story_types)]
return selected_story_type
def calculate_cp_point(name_A,name_B):
B = 1.7
A = 3 * B
hash1 = hashlib.sha256(name_A.encode()).hexdigest()
hash2 = hashlib.sha256(name_B.encode()).hexdigest()
hamming_distance = sum(bit1 != bit2 for bit1, bit2 in zip(hash1, hash2))
hamming_point = 64 - hamming_distance
distance_list = [abs(ord(bit1) - ord(bit2)) if bit1.isalpha() and bit2.isalpha() else 0
for bit1, bit2 in zip(hash1, hash2)]
distance_sum = sum(distance_list)
cp_point = A * hamming_point + B * distance_sum
return [hash1,hash2,cp_point]
def calculate_story(name_A,name_B):
resultA = get_mold_and_trait(name_A)
resultB = get_mold_and_trait(name_B)
story = select_story_type(name_A, name_B)
output_string = f"{name_A}:{resultA}\n{name_B}:{resultB}\n请根据他们的性格特点,写一个关于{story}的故事。"
return output_string
with gr.Blocks() as demo:
with gr.Row():
gr.Markdown("# Cyber CP Demo")
with gr.Row():
with gr.Column(scale=1):
name_A = gr.Textbox(label="A的名字")
hash_A = gr.Textbox(label="Hash_A")
with gr.Column(scale=1):
name_B = gr.Textbox(label="B的名字")
hash_B = gr.Textbox(label="Hash_B")
with gr.Row():
with gr.Column(scale=1):
cp_button = gr.Button("计算cp值")
story_button = gr.Button("生成故事Prompt")
with gr.Row():
with gr.Column(scale=1):
cp_point = gr.Number(label="cp值")
story_output = gr.Textbox(label="故事Prompt",show_label=True,show_copy_button=True)
cp_button.click(calculate_cp_point, [name_A,name_B], [hash_A,hash_B,cp_point])
story_button.click(calculate_story, [name_A,name_B], story_output)
gr.Markdown("请将上述Prompt复制后交给Kimi生成故事:[Kimi.ai - 帮你看更大的世界](https://kimi.moonshot.cn/chat/)\nhttps://kimi.moonshot.cn/chat/")
demo.queue()
demo.launch(inbrowser=True)