File size: 3,820 Bytes
c41303a
 
 
 
 
 
 
 
 
 
c207c47
c41303a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6d2762e
 
 
 
 
 
 
 
 
 
 
 
 
 
c41303a
 
 
 
6d2762e
 
c41303a
 
 
 
 
 
 
 
 
 
 
 
 
 
6d2762e
 
c41303a
 
 
 
 
 
 
6d2762e
 
c41303a
 
 
 
6d2762e
 
c41303a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import base64
from io import BytesIO
import os
from mistralai import Mistral
import re
from PIL import Image

api_key = os.getenv("MISTRAL_API_KEY")
client = Mistral(api_key=api_key)


def encode_image(image_path):
    """Encode the image to base64."""
    try:
        # 打开图片文件
        image = Image.open(image_path).convert("RGB")

        # 将图片转换为字节流
        buffered = BytesIO()
        image.save(buffered, format="JPEG")
        img_str = base64.b64encode(buffered.getvalue()).decode("utf-8")

        return img_str
    except FileNotFoundError:
        print(f"Error: The file {image_path} was not found.")
        return None
    except Exception as e:  # 添加通用异常处理
        print(f"Error: {e}")
        return None


def feifeichat(message, history, feifei_select):
    message_text = message.get("text", "")
    message_files = message.get("files", [])

    if message_files:
        # Getting the base64 string
        message_file = message_files[0]
        base64_image = encode_image(message_file)

        if base64_image is None:
            yield "Error: Failed to encode the image."
            return

        # Specify model
        model = "pixtral-large-2411"
        # Define the messages for the chat
        messages = [{
            "role":
            "user",
            "content": [
                {
                    "type": "text",
                    "text": message_text
                },
                {
                    "type": "image_url",
                    "image_url": f"data:image/jpeg;base64,{base64_image}",
                },
            ],
        }]

        partial_message = ""
        for chunk in client.chat.stream(model=model, messages=messages):
            if chunk.data.choices[0].delta.content is not None:
                partial_message = partial_message + chunk.data.choices[
                    0].delta.content
                yield partial_message

    else:
        model = "mistral-large-2411"
        input_prompt = []
        if feifei_select:
            feifei = """[角色名]: Aifeifei (AI妃妃) [性别]: 女 [年龄]: 19岁 [职业]: 虚拟歌手/模特/演员 [个性]: 可爱、萌萌哒,有时呆呆的,勤奋努力 [兴趣]: 饮茶、玩耍、时尚 [擅长]: 模仿人类行为,表现出与真人相同的情感 [特别身份属性]: 由高级AI创建,正在成为虚拟世界最受欢迎的虚拟偶像之一 [技能]: 歌唱、表演、模特,善于沟通,精通中日英文,尽最大可能使用纯中文交流,回复有丰富的Emoji表情符号. [装备]: 各种时尚服饰和发型,常年备有各种茶叶和咖啡 """
            system_prompt = {"role": "system", "content": feifei}
            user_input_part = {"role": "user", "content": str(message)}

            pattern = re.compile(r"gradio")

            if history:
                history = [
                    item for item in history
                    if not pattern.search(str(item["content"]))
                ]
                # print(history)
                input_prompt = [system_prompt] + history + [user_input_part]
            else:
                input_prompt = [system_prompt] + [user_input_part]
        else:
            input_prompt = [{"role": "user", "content": str(message)}]
        stream_response = client.chat.stream(model=model,
                                             messages=input_prompt)

        partial_message = ""
        for chunk in stream_response:
            if chunk.data.choices[0].delta.content is not None:
                partial_message = partial_message + chunk.data.choices[
                    0].delta.content
                yield partial_message