File size: 2,104 Bytes
00ab1fc
 
5bf3ded
00ab1fc
f164b34
00ab1fc
5bf3ded
 
 
00ab1fc
 
 
5bf3ded
761c493
00ab1fc
 
 
 
 
 
761c493
 
 
5bf3ded
 
761c493
5bf3ded
 
00ab1fc
 
5bf3ded
00ab1fc
5bf3ded
 
 
00ab1fc
 
 
 
5bf3ded
00ab1fc
761c493
00ab1fc
5bf3ded
00ab1fc
5bf3ded
 
 
 
 
00ab1fc
 
5bf3ded
00ab1fc
761c493
 
 
 
5bf3ded
761c493
 
00ab1fc
 
 
 
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
import gradio as gr
from huggingface_hub import InferenceClient
import base64

client = InferenceClient("openbmb/MiniCPM-Llama3-V-2_5-int4")

def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode('utf-8')

def respond(
    message,
    image,
    history,
    system_message,
    max_tokens,
    temperature,
    top_p,
):
    messages = [{"role": "system", "content": system_message}]
    for user_msg, bot_msg in history:
        messages.append({"role": "user", "content": user_msg})
        messages.append({"role": "assistant", "content": bot_msg})
    
    if image:
        base64_image = encode_image(image)
        image_message = f"<image>{base64_image}</image>"
        message = image_message + "\n" + message

    messages.append({"role": "user", "content": message})
    
    response = ""
    for message in client.text_generation(
        prompt=f"{messages}",
        max_new_tokens=max_tokens,
        stream=True,
        temperature=temperature,
        top_p=top_p,
    ):
        token = message.token.text
        response += token
        yield response, history + [(message, response)]

demo = gr.Interface(
    respond,
    inputs=[
        gr.Textbox(label="Message"),
        gr.Image(type="filepath", label="Upload Image"),
        gr.State([]),  # for history
        gr.Textbox(value="You are a friendly AI assistant capable of understanding images and text.", label="System message"),
        gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"),
        gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
        gr.Slider(minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-p (nucleus sampling)"),
    ],
    outputs=[
        gr.Textbox(label="Response"),
        gr.State()  # for updated history
    ],
    title="MiniCPM-Llama3-V-2_5 Image and Text Chat",
    description="Upload an image and ask questions about it, or just chat without an image.",
    allow_flagging="never"
)

if __name__ == "__main__":
    demo.launch()