LLM-Red-Team / kimi-free-api

🚀 KIMI AI 长文本大模型逆向API白嫖测试【特长:长文本解读整理】,支持高速流式输出、智能体对话、联网搜索、长文档解读、图像OCR、多轮对话,零配置部署,多路token支持,自动清理会话痕迹。
https://udify.app/chat/Po0F6BMJ15q5vu2P
GNU General Public License v3.0
3.78k stars 614 forks source link

an example may be helpful for you #55

Closed Komorebi-yaodong closed 6 months ago

Komorebi-yaodong commented 6 months ago

I wrote an example in Python with streamlit, may be help for you

import streamlit as st
import requests
import base64
import json
import os

api_key = ""
base_url = "http://localhost:8000/v1/chat/completions"
model = "assistant"
plain_text = ["txt","c","cpp","py","js","java"]

show_chat = st.container()

if "message_history" not in st.session_state:
    st.session_state.message_history = []
    st.session_state.message_history_init = []
if "use_search" not in st.session_state:
    st.session_state.use_search = True
if "file_upload" not in st.session_state:
    st.session_state.file_upload = None

def process_files(files:list):
    # Processing images exclusively
    files = [(f.name,f.name.split(".")[-1],f.getvalue()) for f in files]

    # we need base64 encoded files:pdf、doc、xlsx、ppt、txt
    files_base64 = []
    f_file = []
    for fb in files:
        isimage = False
        fb_base64 = base64.b64encode(fb[2]).decode('utf-8')
        # fb_base64 = fb[2]
        if fb[1] == "png":
            url = f"data:image/png;base64,{fb_base64}"
            isimage = True
        elif fb[1] == "jpg" or fb[1] == "jpeg":
            url = f"data:image/jpeg;base64,{fb_base64}"
            isimage = True
        elif fb[1] == "gif":
            url = f"data:image/gif;base64,{fb_base64}"
            isimage = True
        elif fb[1] == "webp":
            url = f"data:image/webp;base64,{fb_base64}"
            isimage = True
        elif fb[1] == "bmp ":
            url = f"data:image/bmp;base64,{fb_base64}"
            isimage = True
        elif fb[1] == "pdf":
            url = f"data:application/pdf;base64,{fb_base64}"
        elif fb[1] == "doc":
            url = f"data:application/msword;base64,{fb_base64}"
        elif fb[1] == "docx":
            url = f"data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,{fb_base64}"
        elif fb[1] == "xls":
            url = f"data:application/vnd.ms-excel;base64,{fb_base64}"
        elif fb[1] == "xlsx":
            url = f"data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,{fb_base64}"
        elif fb[1] == "ppt":
            url = f"data:application/vnd.ms-powerpoint;base64,{fb_base64}"
        elif fb[1] == "pptx":
            url = f"data:application/vnd.openxmlformats-officedocument.presentationml.presentation;base64,{fb_base64}"
        elif fb[1] == "html":
            url = f"data:text/html;base64,{fb_base64}"
        elif fb[1] == "js":
            url = f"data:text/javascript;base64,{fb_base64}"
        elif fb[1] == "css":
            url = f"data:text/css;base64,{fb_base64}"
        elif fb[1] in plain_text:
            url = f"data:text/plain;base64,{fb_base64}"
        else:
            st.error("不支持这种格式")
            return [],[]
        if isimage:
            files_base64.append({
                "type": "image_url",
                "image_url": {
                    "url": url,
                }
            })
            f_file.append({
                "type": "image_url",
                "image_url": {
                    "url": fb[2],
                }
            })
        else:
            files_base64.append({
                "type": "file",
                "file_url": {
                    "url": url,
                }
            })
            f_file.append({
                "type": "file",
                "file_url": {
                    "url": fb[0],
                }
            })
    return files_base64,f_file

def generate_response(message_history,use_search):
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {api_key}"
    }
    payload = {
        "model":model,
        "messages": message_history,
        "use_search":use_search,
        "stream":False
    }
    with requests.post(base_url, json=payload, headers=headers) as response:
        data = json.loads(response.content)["choices"][0]["message"]["content"]
    return data

def show_chat_history(message_history):
    for message in message_history:
        if message["role"] == "user":
            with show_chat.chat_message("user"):
                if isinstance( message["content"],list):
                    for content in message["content"]:
                        if content["type"] == "text":
                            st.write(content["text"])
                        if content["type"] == "image_url":
                            st.image(content["image_url"]["url"])
                        if content["type"] == "file":
                            with st.container(border=True):
                                st.write(content["file_url"]["url"])
                else:
                    st.write(message["content"])

        else:
            with show_chat.chat_message(model):
                st.write(message["content"])

def change_use_search():
    st.session_state.use_search = not st.session_state.use_search

with st.sidebar:
    st.session_state.use_search = st.toggle("**Offine || Online**",value=st.session_state.use_search,on_change=change_use_search)
    st.session_state.file_upload = st.file_uploader("**Upload Files**",accept_multiple_files=True,label_visibility="visible")
    st.button("**Clear Chat**",key="ClearChat",use_container_width=True)
    st.button("**ShowChat**",key="ShowChat",use_container_width=True,type="primary")
    if st.session_state.get("ClearChat"):
        st.session_state.message_history = []
        st.session_state.message_history_init = []
    if st.session_state.get("ShowChat"):
        show_chat_history(st.session_state.message_history_init)

prompt = st.chat_input("Send your message")
if prompt:
    message = {
            "role": "user",
            "content": [
                {
                    "type":"text",
                    "text":prompt
                },
            ]
        }
    message_init = {
            "role": "user",
            "content": [
                {
                    "type":"text",
                    "text":prompt
                },
            ]
        }
    if st.session_state.file_upload:
        fb_base64,fb = process_files(st.session_state.file_upload)
        message["content"] += fb_base64
        message_init["content"] += fb
        st.session_state.use_search = False
    st.session_state.message_history.append(message)
    st.session_state.message_history_init.append(message_init)
    print(st.session_state.message_history)
    show_chat_history(st.session_state.message_history_init)

    response = generate_response(st.session_state.message_history,st.session_state.use_search)
    st.session_state.message_history.append({"role": model,"content":response})
    st.session_state.message_history_init.append({"role": model,"content":response})
    with show_chat:
        with st.chat_message(model):
            st.write(response)