diff --git a/README.md b/README.md index e2f7c31..1604180 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,8 @@ English | [简体中文](docs/README_zh-CN.md) ## Latest Progress 🎉 - +- \[January 2024\] refactor the config-template.yaml to control the backend and the frontend settings at the same time, [click](https://github.com/InternLM/OpenAOE/blob/main/docs/tech-report/config-template.md) to find more introduction about the `config-template.yaml` +- \[January 2024\] Add internlm2-chat-7b model - \[January 2024\] Released version v0.0.1, officially open source! ______________________________________________________________________ diff --git a/docs/tech-report/config-template.md b/docs/tech-report/config-template.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/todo/TODO.md b/docs/todo/TODO.md index 27fbda2..7dcec53 100644 --- a/docs/todo/TODO.md +++ b/docs/todo/TODO.md @@ -1,6 +1,8 @@ ### TODO - [x] set the workers to 3 -- [ ] add Gemini model -- [x] refacotor the config.yaml to make the model setting looks more logical +- [x] add internlm2-chat-7b model as default +- [ ] add Gemini model as default +- [x] refactor the config.yaml to make the model setting looks more logical - [ ] dynamic add new model by editing external python files and the config.yaml +- [ ] build frontend project when OpenAOE start up diff --git a/openaoe/backend/config/biz_config.py b/openaoe/backend/config/biz_config.py index f6f8ba7..bac3d83 100644 --- a/openaoe/backend/config/biz_config.py +++ b/openaoe/backend/config/biz_config.py @@ -1,6 +1,7 @@ import argparse import os import sys +from copy import deepcopy import yaml @@ -12,23 +13,53 @@ class BizConfig: def __init__(self, **args): + # raw dict self.__dict__.update(args) - def get(self, field): - if field in self.__dict__: - return self.__dict__[field] - return None - - -def init_config(): - parser = argparse.ArgumentParser(description="Example app using a YAML config file.") + # provider -> model_name -> ModelConfig + @property + def models_map(self): + if "models" not in self.__dict__: + return {} + + models_dict = self.__dict__["models"] + ret = {} + for model_name, model_config in models_dict.items(): + if model_config["provider"] not in ret: + ret[model_config["provider"]] = {} + ret[model_config["provider"]][model_name] = ModelConfig(model_config["webui"], model_config["api"]) + return ret + + @models_map.getter + def __get_models_map(self): + return self.models_map + + @property + def json(self): + ret = deepcopy(self.__dict__) + if "models" in ret: + models_config = ret["models"] + for model_name, config in models_config.items(): + config.pop("api") + ret["models"][model_name] = config + return ret + + +class ModelConfig: + def __init__(self, webui_config, api_config): + self.webui_config = webui_config + self.api_config = api_config + + +def init_config() -> BizConfig: + parser = argparse.ArgumentParser(description="LLM group chat framework") parser.add_argument('-f', '--file', type=str, required=True, help='Path to the YAML config file.') config_path = parser.parse_args() logger.info(f"your config file is: {config_path.file}") - load_config(config_path.file) + return load_config(config_path.file) -def load_config(config_path): +def load_config(config_path) -> BizConfig: logger.info(f"start to init configuration from {config_path}.") if not os.path.isfile(config_path): logger.error(f"invalid path: {config_path}, not exist or not file") @@ -43,32 +74,46 @@ def load_config(config_path): global biz_config biz_config = BizConfig(**m) logger.info("init configuration successfully.") + return biz_config -def get_configuration(field): - return biz_config.get(field) - - -def get_model_configuration(vendor: str, field): - models = get_configuration("models") +def get_model_configuration(provider: str, field, model_name: str = None): + models = biz_config.models_map if not models: logger.error(f"invalid configuration file") sys.exit(-1) - if models.get(vendor) and models.get(vendor).get(field): - conf = models.get(vendor).get(field) - return conf - - logger.error(f"vendor: {vendor} has no field: {field} configuration") + provider_config = models.get(provider) + if provider_config: + if model_name: + try: + return provider_config.get(model_name).api_config.get(field) + except: + for config_model_name, config in provider_config.items(): + if config_model_name.startswith(model_name): + return config.api_config.get(field) + logger.error(f"{provider} get field: {field} for model: {model_name} failed") + return "" + elif not model_name: + # default the first provider ModelConfig + provider_models_config_list = list(provider_config.values()) + try: + logger.info(f"{provider} get field: {field} for anonymous model, use the first one as default.") + return provider_models_config_list[0].api_config.get(field) + except: + logger.error(f"{provider} get field: {field} for anonymous model failed") + return "" + + logger.error(f"provider: {provider} has no field: {field} configuration for model: {model_name}") return "" -def get_base_url(vendor: str) -> str: - return get_model_configuration(vendor, "api_base") +def get_base_url(provider: str, model_name: str = None) -> str: + return get_model_configuration(provider, "api_base", model_name) -def get_api_key(vendor: str) -> str: - return get_model_configuration(vendor, "api_key") +def get_api_key(provider: str, model_name: str = None) -> str: + return get_model_configuration(provider, "api_key", model_name) def app_abs_path(): diff --git a/openaoe/backend/config/config-template.yaml b/openaoe/backend/config/config-template.yaml index 99059d4..5fde96c 100644 --- a/openaoe/backend/config/config-template.yaml +++ b/openaoe/backend/config/config-template.yaml @@ -1,29 +1,71 @@ --- models: - gpt: - api_base: https://api.openai.com/v1 - api_key: - - claude: - api_key: - - bard: - api_base: https://bard.google.com - api_key: - - minimax: - api_base: https://api.minimax.chat - group_id: - jwt: - + internlm-chat-7b: + provider: internlm + webui: + avatar: 'https://oss.openmmlab.com/frontend/OpenAOE/internlm.svg' + background: 'linear-gradient(rgb(3 26 108 / 85%) 0%, rgb(29 60 161 / 85%) 100%)' + api: + api_base: http://localhost:23333 + gpt-3.5-turbo: + provider: openai + webui: + avatar: 'https://oss.openmmlab.com/frontend/OpenAOE/openai.svg' + background: 'linear-gradient(180deg, rgba(156, 206, 116, 0.15) 0%, #1a8d15 100%)' + api: + api_base: https://api.openai.com/v1 + api_key: + gpt-4: + provider: openai + webui: + avatar: 'https://oss.openmmlab.com/frontend/OpenAOE/openai.svg' + background: 'linear-gradient(180deg, rgba(156, 206, 116, 0.15) 0%, #08be00 100%)' + api: + api_base: https://api.openai.com/v1 + api_key: + claude-1: + provider: claude + webui: + avatar: 'https://oss.openmmlab.com/frontend/OpenAOE/claude.svg' + background: 'linear-gradient(180deg, rgba(141, 90, 181, 0.15) 0%, rgba(106, 39, 123, 0.7) 53.12%, #663E9A 100%)' + api: + api_base: https://api.anthropic.com + api_key: + claude-1-100k: + provider: claude + webui: + avatar: 'https://oss.openmmlab.com/frontend/OpenAOE/claude.svg' + background: 'linear-gradient(180deg, rgba(141, 90, 181, 0.15) 0%, rgba(106, 39, 123, 0.7) 53.12%, #663E9A 100%)' + api: + api_base: https://api.anthropic.com + api_key: + chat-bison-001: + provider: google + webui: + avatar: 'https://oss.openmmlab.com/frontend/OpenAOE/google-palm.webp' + isStream: false + background: 'linear-gradient(180deg, rgba(181, 90, 90, 0.15) 0%, #fa5ab1 100%)' + api: + api_base: https://generativelanguage.googleapis.com + api_key: + abab5-chat: + provider: minimax + webui: + avatar: 'https://oss.openmmlab.com/frontend/OpenAOE/minimax.png' + background: 'linear-gradient(180deg, rgba(207, 72, 72, 0.15) 0%, rgba(151, 43, 43, 0.7) 53.12%, #742828 100%)' + api: + api_base: https://api.minimax.chat + group_id: + jwt: spark: - api_base: wss://spark-api.xf-yun.com - app_id: - ak: - sk: - - internlm: - api_base: + provider: spark + webui: + avatar: 'https://oss.openmmlab.com/frontend/OpenAOE/spark.svg' + isStream: false + background: 'linear-gradient(180deg, rgba(72, 72, 207, 0.15) 0%, #7498be 100%)' + api: + api_base: wss://spark-api.xf-yun.com/v2.1/chat + app_id: + ak: + sk: ... - - diff --git a/openaoe/backend/config/constant.py b/openaoe/backend/config/constant.py index 328bab7..d8c93c1 100644 --- a/openaoe/backend/config/constant.py +++ b/openaoe/backend/config/constant.py @@ -5,12 +5,12 @@ DATE_PATTERN = "%Y%m%d" TIMEOUT_SECONDS = 30 -VENDOR_OPENAI = "gpt" -VENDOR_MINIMAX = "minimax" -VENDOR_GOOGLE = "bard" -VENDOR_XUNFEI = "spark" -VENDOR_CLAUDE = "claude" -VENDOR_INTERNLM = "internlm" +PROVIDER_OPENAI = "openai" +PROVIDER_MINIMAX = "minimax" +PROVIDER_GOOGLE = "google" +PROVIDER_XUNFEI = "spark" +PROVIDER_CLAUDE = "claude" +PROVIDER_INTERNLM = "internlm" DEFAULT_TIMEOUT_SECONDS = 600 diff --git a/openaoe/backend/service/service_claude.py b/openaoe/backend/service/service_claude.py index daf6b13..ec72542 100644 --- a/openaoe/backend/service/service_claude.py +++ b/openaoe/backend/service/service_claude.py @@ -4,9 +4,9 @@ from anthropic import Anthropic, HUMAN_PROMPT, AI_PROMPT from sse_starlette.sse import EventSourceResponse -from openaoe.backend.config.biz_config import get_api_key +from openaoe.backend.config.biz_config import get_api_key, get_base_url from openaoe.backend.config.constant import TYPE_BOT, TYPE_USER, TYPE_SYSTEM -from openaoe.backend.config.constant import VENDOR_CLAUDE +from openaoe.backend.config.constant import PROVIDER_CLAUDE from openaoe.backend.model.aoe_response import AOEResponse from openaoe.backend.model.claude import ClaudeChatBody, ClaudeMessage @@ -16,7 +16,8 @@ def claude_chat_stream_svc(request, body: ClaudeChatBody): stream api logic for Claude model use anthropic SDK: https://github.com/anthropics/anthropic-sdk-python """ - api_key = get_api_key(VENDOR_CLAUDE) + api_key = get_api_key(PROVIDER_CLAUDE, body.model) + api_base = get_base_url(PROVIDER_CLAUDE, body.model) prompt = _gen_prompt(body.messages) if not prompt or len(prompt) == 0: return AOEResponse( @@ -25,7 +26,7 @@ def claude_chat_stream_svc(request, body: ClaudeChatBody): data="prompt or messages must be set" ) - anthropic = Anthropic(api_key=api_key) + anthropic = Anthropic(api_key=api_key, base_url=api_base) async def stream(): try: diff --git a/openaoe/backend/service/service_google.py b/openaoe/backend/service/service_google.py index 85f8710..40da4ca 100644 --- a/openaoe/backend/service/service_google.py +++ b/openaoe/backend/service/service_google.py @@ -15,8 +15,8 @@ def palm_chat_svc(body: GooglePalmChatBody): """ chat logic for google PaLM model """ - api_key = get_api_key(VENDOR_GOOGLE) - url = get_base_url(VENDOR_GOOGLE) + api_key = get_api_key(PROVIDER_GOOGLE, body.model) + url = get_base_url(PROVIDER_GOOGLE, body.model) url = f"{url}/google/v1beta2/models/{body.model}:generateMessage?key={api_key}" messages = [ {"content": msg.content, "author": msg.author} diff --git a/openaoe/backend/service/service_internlm.py b/openaoe/backend/service/service_internlm.py index b755510..fae3a80 100644 --- a/openaoe/backend/service/service_internlm.py +++ b/openaoe/backend/service/service_internlm.py @@ -30,7 +30,7 @@ def chat_completion_v1(request, body: InternlmChatCompletionBody): } msgs.append(msg_item) # restful api - url = get_base_url(VENDOR_INTERNLM) + "/v1/chat/completions" + url = get_base_url(PROVIDER_INTERNLM, body.model) + "/v1/chat/completions" headers = { 'accept': 'application/json', 'Content-Type': 'application/json' @@ -42,7 +42,7 @@ def chat_completion_v1(request, body: InternlmChatCompletionBody): "top_p": body.top_p, "n": body.n, "max_tokens": body.max_tokens, - "stop": False, + "stop": "false", "stream": body.stream, "presence_penalty": body.presence_penalty, "frequency_penalty": body.frequency_penalty, diff --git a/openaoe/backend/service/service_minimax.py b/openaoe/backend/service/service_minimax.py index 58eb9ae..c10f75b 100644 --- a/openaoe/backend/service/service_minimax.py +++ b/openaoe/backend/service/service_minimax.py @@ -12,9 +12,9 @@ def _get_req_param(body): - group_id = get_model_configuration(VENDOR_MINIMAX, "group_id") - jwt = get_model_configuration(VENDOR_MINIMAX, "jwt") - api_base = get_base_url(VENDOR_MINIMAX) + group_id = get_model_configuration(PROVIDER_MINIMAX, "group_id", body.model) + jwt = get_model_configuration(PROVIDER_MINIMAX, "jwt", body.model) + api_base = get_base_url(PROVIDER_MINIMAX, body.model) headers = { "Authorization": jwt, "Content-Type": "application/json" diff --git a/openaoe/backend/service/service_openai.py b/openaoe/backend/service/service_openai.py index d789136..92709d5 100644 --- a/openaoe/backend/service/service_openai.py +++ b/openaoe/backend/service/service_openai.py @@ -43,9 +43,9 @@ def chat_completion_stream(request, body): async def event_generator(): while True: client = OpenAI( - api_key=get_api_key(VENDOR_OPENAI), + api_key=get_api_key(PROVIDER_OPENAI, body.model), timeout=body.timeout, - base_url=get_base_url(VENDOR_OPENAI) + base_url=get_base_url(PROVIDER_OPENAI, body.model) ) stop_flag = False @@ -80,9 +80,9 @@ async def event_generator(): async def event_generator_json(): while True: client = OpenAI( - api_key=get_api_key(VENDOR_OPENAI), + api_key=get_api_key(PROVIDER_OPENAI, body.model), timeout=body.timeout, - base_url=get_base_url(VENDOR_OPENAI) + base_url=get_base_url(PROVIDER_OPENAI, body.model) ) stop_flag = False response = "" diff --git a/openaoe/backend/service/service_xunfei.py b/openaoe/backend/service/service_xunfei.py index 744378b..531a790 100644 --- a/openaoe/backend/service/service_xunfei.py +++ b/openaoe/backend/service/service_xunfei.py @@ -8,7 +8,7 @@ from websocket import create_connection from openaoe.backend.config.biz_config import get_model_configuration, get_base_url -from openaoe.backend.config.constant import VENDOR_XUNFEI +from openaoe.backend.config.constant import PROVIDER_XUNFEI from openaoe.backend.model.aoe_response import AOEResponse from openaoe.backend.model.xunfei import XunfeiSparkChatBody from openaoe.backend.util.log import log @@ -59,10 +59,10 @@ def spark_chat_svc(body: XunfeiSparkChatBody): """ chat logic for spark model """ - api_base = get_base_url(VENDOR_XUNFEI) - app_id = get_model_configuration(VENDOR_XUNFEI, "app_id") - ak = get_model_configuration(VENDOR_XUNFEI, "ak") - sk = get_model_configuration(VENDOR_XUNFEI, "sk") + api_base = get_base_url(PROVIDER_XUNFEI) + app_id = get_model_configuration(PROVIDER_XUNFEI, "app_id") + ak = get_model_configuration(PROVIDER_XUNFEI, "ak") + sk = get_model_configuration(PROVIDER_XUNFEI, "sk") url_parse = urllib.parse.urlparse(api_base) host = url_parse.hostname diff --git a/openaoe/frontend/dist/assets/claude-bd5f04f1.svg b/openaoe/frontend/dist/assets/claude-bd5f04f1.svg deleted file mode 100644 index 2952673..0000000 --- a/openaoe/frontend/dist/assets/claude-bd5f04f1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/openaoe/frontend/dist/assets/index-cf574748.js b/openaoe/frontend/dist/assets/index-cf574748.js new file mode 100644 index 0000000..3d67278 --- /dev/null +++ b/openaoe/frontend/dist/assets/index-cf574748.js @@ -0,0 +1,8 @@ +import{c as ce,p as ie,S as l,a as We,b as Ke,d as Ve,e as pe,f as _e,j as Je,g as fe,v as xe,h as ve,t as Ye,i as Fe,l as Ge,s as Xe,k as Qe,m as Ze,r as et,o as Ae,n as tt,q as st,u as ot,w as at,x as nt,y as rt,z as ct,A as it,B as ye,C as lt,D as mt,E as dt,F as we,G as ut,H as n,I as gt,J as ht,K as pt,L as oe,M as I,N as _t,O as ft,P as xt,T as G,Q as ae,R as vt,U as At,V as yt,W as wt,X as bt,Y as kt,Z as Ct,_ as St,$ as Lt,a0 as jt,a1 as Rt}from"./vendor-0b33134f.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))a(o);new MutationObserver(o=>{for(const r of o)if(r.type==="childList")for(const c of r.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&a(c)}).observe(document,{childList:!0,subtree:!0});function s(o){const r={};return o.integrity&&(r.integrity=o.integrity),o.referrerPolicy&&(r.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?r.credentials="include":o.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function a(o){if(o.ep)return;o.ep=!0;const r=s(o);fetch(o.href,r)}})();const ne="clear_context",z="serial",V="parallel",$="serial_session",It=3,R="gpt-3.5-turbo",je="openai",Et="https://oss.openmmlab.com/alles-bot/",Mt=["openai","minimax","claude","gpt-4","internlm"],E=ce()(ie((e,t)=>({token:"",theme:"light",username:"user",mode:z,updateTheme:s=>{e({theme:s})},updateMode:s=>{e({mode:s})}}),{name:"config",version:2,migrate(e,t){const a=JSON.parse(JSON.stringify(e));return t<2&&(a.token={}.VITE_ALLES_APIN_TOKEN,a.theme="light",a.username="user",a.mode=z),a}})),Bt=({children:e,inline:t,className:s,...a})=>{const o=/language-(\w+)/.exec(s||"")||[],r=E();return l.registerLanguage("assembly",We),l.registerLanguage("python",Ke),l.registerLanguage("c",Ve),l.registerLanguage("c/c++",pe),l.registerLanguage("clike",pe),l.registerLanguage("c++",_e),l.registerLanguage("cpp",_e),l.registerLanguage("java",Je),l.registerLanguage("csharp",fe),l.registerLanguage("c#",fe),l.registerLanguage("vb",xe),l.registerLanguage("visual basic",xe),l.registerLanguage("javascript",ve),l.registerLanguage("typescript",Ye),l.registerLanguage("css",Fe),l.registerLanguage("less",Ge),l.registerLanguage("js",ve),l.registerLanguage("sql",Xe),l.registerLanguage("php",Qe),l.registerLanguage("go",Ze),l.registerLanguage("r",et),l.registerLanguage("objective-c",Ae),l.registerLanguage("objc",Ae),l.registerLanguage("matlab",tt),l.registerLanguage("swift",st),l.registerLanguage("ruby",ot),l.registerLanguage("lua",at),l.registerLanguage("json",nt),l.registerLanguage("yaml",rt),l.registerLanguage("xml",ct),l.registerLanguage("dDockerfile",it),l.registerLanguage("markdown",ye),l.registerLanguage("md",ye),l.registerLanguage("makefile",lt),l.registerLanguage("latex",mt),l.registerLanguage("llvm",dt),l.registerLanguage("shell",we),l.registerLanguage("sh",we),l.registerLanguage("bash",ut),!t&&o?n.jsx(l,{language:(o[1]||"Python").toLowerCase(),style:r.theme==="light"?gt:ht,customStyle:{borderRadius:"10px"},PreTag:"div",...a,children:e}):n.jsx("code",{className:s,...a,children:e})},Nt=React.memo(Bt),le=(...e)=>{const t=e.map(s=>typeof s=="function"?s:()=>s);return(...s)=>{let a=0,o;for(o=t.length===0?s:t[a++](...s);a{const e=window.localStorage.getItem(re);return e?e==="en-US"?"en-US":"zh-CN":(localStorage.setItem(re,"en-US"),"en-US")};let Re=Tt();const Ot=e=>(window.localStorage.setItem(re,e),e),J=()=>Re,Pt=e=>{Re=Ot(e)},be=e=>{const t=document.cookie.split(";");for(let s=0;s"/login";function Ht(e,t=50){let s=null;return(...a)=>{s?clearTimeout(s):e.apply(this,a),s=setTimeout(()=>{e.apply(this,a)},t)}}const Ee=e=>{const t=document.getElementById(e);t&&t.scrollTo({top:999999,behavior:"smooth"})},W=Ht(e=>Ee(e),50),B=(e,t=null)=>oe?{onTouchEnd:t||e}:{onClick:e||t},zt=e=>{if(e===null)return 0;const t=window.getSelection();if(t.rangeCount>0){const s=t.getRangeAt(0),a=s.cloneRange();return a.selectNodeContents(e),a.setEnd(s.startContainer,s.startOffset),a.toString().length}return 0};function $t(e,t){let s=0;const a=document.createRange();a.setStart(e,0);function o(c){for(let u=0;u=t)return a.setStart(f,t-s),a.collapse(!0),!0;s+=f.length}else if(o(f))return!0}}o(e);const r=window.getSelection();r.removeAllRanges(),r.addRange(a)}const Dt=""+new URL("A-017dd65e.svg",import.meta.url).href,ke={provider:"user",model:"user",avatar:"user.png",border:"#71e875",background:"#71e875"},qt={provider:"admin",model:"admin",avatar:Dt,border:"#4e6ef2",background:"linear-gradient(rgb(255 255 255 / 80%) 0%, rgb(168 245 179) 100%)"},Wt={"internlm-chat-7b":{provider:"internlm",webui:{avatar:"https://oss.openmmlab.com/frontend/OpenAOE/internlm.svg",background:"linear-gradient(rgb(3 26 108 / 85%) 0%, rgb(29 60 161 / 85%) 100%)"}},"gpt-3.5-turbo":{provider:"openai",webui:{avatar:"https://oss.openmmlab.com/frontend/OpenAOE/openai.svg",background:"linear-gradient(180deg, rgba(156, 206, 116, 0.15) 0%, #1a8d15 100%)"}},"gpt-4":{provider:"openai",webui:{avatar:"https://oss.openmmlab.com/frontend/OpenAOE/openai.svg",background:"linear-gradient(180deg, rgba(156, 206, 116, 0.15) 0%, #08be00 100%)"}},"claude-1":{provider:"claude",webui:{avatar:"https://oss.openmmlab.com/frontend/OpenAOE/claude.svg",background:"linear-gradient(180deg, rgba(141, 90, 181, 0.15) 0%, rgba(106, 39, 123, 0.7) 53.12%, #663E9A 100%)"}},"claude-1-100k":{provider:"claude",webui:{avatar:"https://oss.openmmlab.com/frontend/OpenAOE/claude.svg",background:"linear-gradient(180deg, rgba(141, 90, 181, 0.15) 0%, rgba(106, 39, 123, 0.7) 53.12%, #663E9A 100%)"}},"chat-bison-001":{provider:"google",webui:{avatar:"https://oss.openmmlab.com/frontend/OpenAOE/google-palm.webp",isStream:!1,background:"linear-gradient(180deg, rgba(181, 90, 90, 0.15) 0%, #fa5ab1 100%)"}},"abab5-chat":{provider:"minimax",webui:{avatar:"https://oss.openmmlab.com/frontend/OpenAOE/minimax.png",background:"linear-gradient(180deg, rgba(207, 72, 72, 0.15) 0%, rgba(151, 43, 43, 0.7) 53.12%, #742828 100%)"}},spark:{provider:"spark",webui:{avatar:"https://oss.openmmlab.com/frontend/OpenAOE/spark.svg",isStream:!1,background:"linear-gradient(180deg, rgba(72, 72, 207, 0.15) 0%, #7498be 100%)"}}},Kt={models:null},D=React.createContext(Kt),Vt="_home-operation_16zek_1",Jt="_op-btn_16zek_14",Yt="_op-img_16zek_25",P={"home-operation":"_home-operation_16zek_1",homeOperation:Vt,"op-btn":"_op-btn_16zek_14",opBtn:Jt,"op-img":"_op-img_16zek_25",opImg:Yt},Ft={model:"abab5-chat",prompt:"",messages:[],role_meta:{user_name:"USER",bot_name:"BOT"},stream:!0,type:"json"},Gt={model:"gpt-3.5-turbo",prompt:"",messages:[],role_meta:{user_name:"user",bot_name:"assistant"},type:"json"},Xt={model:"chat-bison-001",prompt:{messages:[]},temperature:.1,candidate_count:1},Qt={prompt:"",model:"claude-1",max_tokens:5e3},Zt={parameter:{chat:{temperature:.5,max_tokens:1024,chat_id:"user1"}},payload:{message:{text:[]}}},es={model:"internlm-chat-7b",prompt:"",messages:[],role_meta:{user_name:"user",bot_name:"assistant"},stream:!0},q="",k=new Map;k.set("minimax",{url:`${q}/v1/minimax/v1/text/chat-stream`,...Ft});k.set("openai",{url:`${q}/v1/openai/v1/text/chat-stream`,...Gt});k.set("google",{url:`${q}/v1/google/v1/palm/chat`,...Xt});k.set("claude",{url:`${q}/v1/claude/v1/text/chat-stream`,...Qt});k.set("spark",{url:`${q}/v1/xunfei/v1/spark/chat`,...Zt});k.set("internlm",{url:`${q}/v1/internlm/v1/chat/completions`,...es});const Me=()=>({"Content-Type":"application/json"}),ts=e=>{var t;return((t=k.get(e))==null?void 0:t.url)||k.get(je).url},Ce=(e,t,s,a)=>{const o={...k.get(e)||k.get(je)};if(delete o.url,o.model=t,["openai","internlm","gpt-4"].includes(e)&&(o.prompt=s,o.messages=a),e==="minimax"&&(o.prompt=s,o.messages=a.map(r=>({text:r.text,sender_type:r.sender_type==="user"?"USER":"BOT"})),o.messages.push({text:s,sender_type:"USER"})),e==="google"){const r={content:"Hi! How can I help you today?",author:"1"},c=a.map(u=>({content:u.text,author:u.sender_type==="user"?"0":"1"}));c.push({content:s,author:"0"}),c.unshift(r),o.prompt.messages=c}if(e==="baidu"||e==="claude"){const r=a.map(c=>({role:c.sender_type,content:c.text}));r.push({role:"user",content:s}),o.messages=r}if(e==="spark"){const r=a.map(c=>({role:c.sender_type,content:c.text}));r.push({role:"user",content:s}),delete o.model,o.payload.message.text=r}return o},ss={development:"",staging:"",production:""},os={mock:"",development:"",staging:"",production:""},Be="production",as=ss[Be],ns=os[Be],rs=[],cs=e=>{const t={};return rs.find(a=>e.url.endsWith(a))||Ie.get(),{...e,headers:{lang:J(),...e.headers,...t}}},is=e=>({...e,headers:{...e.headers,"Client-Type":"app",type:0}}),ls=[cs,is],Ne=()=>{Ie.removeAll()},ms=e=>{const t=e.data;return e.__meta.isAllResponseBody?t:t.data},ds=e=>{const t=e.data,a=!e.__meta.isIgnoreError;return t.success===!1&&a&&I.error(t.msg),e},us=e=>{const t=e.data;return t&&t.msgCode==="A0202"&&Ne(),e},gs=e=>{const t=e.data;return t&&t.msgCode==="C1600"&&(window.location.href=Ut()),e},ee=(e,t=!1)=>{t||I.error(e)},hs=e=>{if(e.response){const s=e.__meta.isIgnoreGatewayError,a=e.response.status;switch(console.log(e.code,"error....."),a){case 401:case 403:Ne();break;case 500:ee(J()==="zh-CN"?"服务器没有响应,请稍后再试":"Sever error, please try again later.",s);break;default:e.code==="ERR_NETWORK"?ee(J()==="zh-CN"?"网络出错了,请稍后再试":"Network error, please try again later.",s):ee(`${a}: ${e.message||"unknown error"}`,s)}}return Promise.reject(e)},Te=[us,gs,ds,ms],Oe=[hs],H=_t.create({method:"get",timeout:6e4,responseType:"json",paramsSerializer:e=>ft.stringify(e,{indices:!1})}),N=new Map,ps=e=>{let t={};return N.has(e.config.url)&&(t=N.get(e.config.url),N.delete(e.config.url)),{...e,__meta:t}},_s=e=>{let t={};return N.has(e.config.url)&&(t=N.get(e.config.url),N.delete(e.config.url)),{...e,__meta:t}};Te.unshift(ps);Oe.unshift(_s);const fs=le(...ls),xs=le(...Te),vs=le(...Oe);H.interceptors.request.use(fs,e=>Promise.reject(e));H.interceptors.response.use(xs,vs);const As=(e,{method:t="GET",params:s={},data:a={},...o})=>{const r=`${as}${e}`;switch(t.toLowerCase()){case"get":return H.get(r,{params:s,...o});case"delete":return H.delete(r,{params:s,data:a,...o});case"post":return H.post(r,a,{params:s,...o});case"put":return H.put(r,a,{params:s,...o});default:return Promise.resolve({then:c=>c({msgCode:"300",msg:"Method Not Allowed",traceId:"-1",total:0,status:405,data:{}})})}},ys=(e,t={},s=ns)=>{const o=`${s}/${e}`.replace(/\/\//g,"/");return t.meta&&(N.set(o,t.meta),delete t.meta),As(o,t)};async function ws(e,t,s){const a=Me();return ys(e,{method:"POST",headers:{...a},data:t,signal:s,meta:{isAllResponseBody:!0}})}function j(e){return{id:Date.now(),provider:"openai",date:new Date().toLocaleString(),sender_type:"user",text:"",...e}}function U(e){return{id:Date.now()+Math.random(),name:R,bot:"",messages:[],isShow:!0,clearContextIndex:0,...e}}const X=ce()(ie((e,t)=>({hasStreaming:!1,sessions:[U({name:$}),U({name:R})],currentSessionIndex:0,globalId:0,controller:{},newSession(s){const a=t().sessions,o=a.findIndex(c=>c.name===s);if(o>0){t().updateSession(o,{isShow:!0});return}const r=U({name:s,isShow:!0});e(()=>({globalId:t().globalId+1})),r.id=t().globalId,a.push(r),e(()=>({sessions:a}))},removeSession(s){const o=t().sessions.findIndex(r=>r.name===s);o&&t().updateSession(o,{isShow:!1})},getSession(s){const a=t().sessions,o=a.findIndex(r=>r.name===s);return o<0?U({name:s}):a[o]},onNewMessage(s,a=0){t().sessions[a].messages.push(s),console.log("[BOT] onNewMessage: ",s,a),e(()=>({sessions:t().sessions}))},deleteMessage(s,a){const o=t().sessions.find(r=>r.name===s);o&&(o.messages.splice(a,1),e(()=>({sessions:t().sessions})))},retry(s,a,o){const r=t().lastUserMessage(s).text;t().lastMessage(s).id===t().lastBotMessage(s).id&&t().getSession(s).clearContextIndex!==t().getSession(s).messages.length&&(t().deleteMessage(s,t().getSession(s).messages.length-1),t().deleteMessage(s,t().getSession(s).messages.length-1)),t().onUserInput(r,a,o,s)},async onUserInput(s,a,o,r){var Y;const c=t().sessions.findIndex(m=>m.name===r),u=t().sessions[c];if(!u)return;const f=u.clearContextIndex||0,y=u.messages.slice(f).filter(m=>m.isError!==!0).map(m=>({text:m.text,sender_type:m.sender_type})),g=u.messages.length+1,_=j({text:s,provider:"user",sender_type:"user"}),i=j({provider:a,model:o,text:"...",sender_type:"bot",id:_.id+1,stream:!0});t().onNewMessage(_,c),t().onNewMessage(i,c),W(`chat-wrapper-${u.id}`);const v=new AbortController,A=t().controller;A[r]=v,e(()=>({controller:{...A}}));const M={method:"POST",headers:Me(),body:JSON.stringify({...Ce(a,o,s,y)})},C=ts(a);let T=!0;if(Mt.includes(a))xt(C,{...M,signal:v.signal,async onopen(m){const d=m.headers.get("content-type");if(d!=null&&d.includes("text/event-stream")||(T=!1),!m.ok)throw new Error(m.status+m.statusText)},onmessage:m=>{if(T&&typeof m.data=="string"&&m.data.charAt(0)==="{"){const d=JSON.parse(m.data);if(d&&d.success==="true"){if(d.stop_reason==="max_token"){i.stream=!1,t().updateMessage(c,g,w=>{w.stream=!1,w.text=i.text.concat(` + > ${d.stop_reason}`)});return}i.stream=!0,i.text=i.text.startsWith("...")?i.text.slice(3).concat(d.msg):i.text.concat(d.msg),W(`chat-wrapper-${u.id}`),t().updateMessage(c,g,w=>{w.text=i.text,w.stream=i.stream})}if(d&&d.success==="false")throw new Error(d.msg)}},onerror(m){console.log(`[BOT] request error from ${o}: +`,m),i.stream=!1,t().updateMessage(c,g,w=>{w.stream=i.stream,w.text=m.message.includes("Please reduce the length of the messages.")?m.message:`${i.text} + > Oops... Something went wrong (°⌓°)`,w.isError=!0});const d=t().controller;throw delete d[r],e(()=>({controller:{...d}})),m},onclose(){i.stream=!1,t().updateMessage(c,g,d=>{d.stream=i.stream});const m=t().controller;delete m[r],e(()=>({controller:{...m}})),console.log("[BOT] answering closed. ")}});else try{const m=await ws(C,Ce(a,o,s,y),v.signal);if(m.msgCode==="10000"&&m.data){if(a==="google"){if(!m.data.candidates&&m.data.filters){i.stream=!1,t().updateMessage(c,g,d=>{d.stream=i.stream,d.text=`${i.text} + > Oops... Something went wrong (°⌓°)`,d.isError=!0});return}i.text=(Y=m.data.candidates[0])==null?void 0:Y.content}else a==="claude"?i.text=m.data.completion:i.text=m.data;i.stream=!1,t().updateMessage(c,g,d=>{d.text=i.text,d.stream=i.stream}),W(`chat-wrapper-${u.id}`)}else i.stream=!1,t().updateMessage(c,g,d=>{d.stream=i.stream,d.text=`${i.text} + > Oops... Something went wrong (°⌓°)`,d.isError=!0})}catch{t().updateMessage(c,g,d=>{d.stream=!1,d.text=`${i.text} + > Oops... Something went wrong (°⌓°)`,d.isError=!0})}finally{const m=t().controller;delete m[r],e(()=>({controller:{...m}}))}},updateMessage(s,a,o){const c=t().sessions[s].messages[a];c.date=new Date().toLocaleString(),o(c),e(()=>({sessions:t().sessions}))},lastMessage(s){const a=t().sessions.find(r=>r.name===s);if(!a)return j({text:""});const o=a==null?void 0:a.messages;return Array.isArray(o)&&o.length>0?o.slice(-1)[0]:j({text:""})},lastUserMessage(s){const a=t().sessions.find(r=>r.name===s);if(!a)return j({text:""});const o=[...a.messages];return Array.isArray(o)&&o.length>0?o.reverse().find(r=>r.sender_type==="user"):j({text:""})},lastBotMessage(s){const a=t().sessions.find(r=>r.name===s);if(!a)return j({text:""});const o=[...a.messages];return Array.isArray(o)&&o.length>0?o.reverse().find(r=>r.sender_type==="bot"&&r.model!=="admin"):j({text:""})},updateSession(s,a){const o=t().sessions;let r=o[s];r={...r,...a},o[s]=r,e(()=>({sessions:o}))},closeController(s){const a=t().controller,o=a==null?void 0:a[s];if(o){o.abort&&o.abort(),delete a[s],e(()=>({controller:{...a}}));const r=t().sessions.findIndex(u=>u.name===s),c=t().sessions[r];t().updateMessage(r,c.messages.length-1,u=>{u.stream=!1,u.text=u.text.concat(` + > Request canceled。`)}),W(`chat-wrapper-${c.id}`)}},clearAllData(){localStorage.removeItem("chat"),e(()=>({sessions:[U({name:R})]})),window.location.reload()}}),{name:"chat",version:2,migrate(e,t){const s=e,a=JSON.parse(JSON.stringify(s));if(t<2){a.globalId=0,a.sessions=[];const o=s.sessions;for(const r of o){const c=U({name:$});c.id=r.id,c.name=r.name,c.clearContextIndex=r.clearContextIndex,c.messages=[...r.messages],a.sessions.push(c)}}return a}})),me=ce()(ie((e,t)=>({chosenBotNames:[R],currentBot:R,updateCurrentBot:s=>{e({currentBot:s})},addBot:s=>{const{chosenBotNames:a}=t();a.includes(s)||e({chosenBotNames:[...a,s]})},removeBot:s=>{const{chosenBotNames:a}=t();e({chosenBotNames:a.filter(o=>o!==s)})},getCurrentBot:()=>t().currentBot||R,clearBots:()=>{localStorage.removeItem("bot"),e({chosenBotNames:[R]})}}),{name:"bot",version:2,migrate(e,t){const a=JSON.parse(e);return t<2&&(a.chosenBotNames=[R],a.currentBot=R),a}})),bs=()=>{const e=E();return n.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[n.jsxs("g",{clipPath:"url(#clip0_50_304)",children:[n.jsx("mask",{id:"mask0_50_304",maskUnits:"userSpaceOnUse",x:"0",y:"0",width:"20",height:"20",children:n.jsx("path",{d:"M20 0H0V20H20V0Z",fill:"white"})}),n.jsxs("g",{mask:"url(#mask0_50_304)",children:[n.jsx("path",{d:"M18.659 10.0709L13.2991 2.95807L5.8894 8.54167L11.4582 15.4167L12.8564 14.4435L18.659 10.0709Z",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinejoin:"round"}),n.jsx("path",{d:"M11.4582 15.4167L9.85879 16.6978L5.45733 16.6975L4.37379 15.2596L1.69385 11.7032L6.0415 8.427",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinejoin:"round"}),n.jsx("path",{d:"M5.50244 16.6967H18.569",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinecap:"round"})]})]}),n.jsx("defs",{children:n.jsx("clipPath",{id:"clip0_50_304",children:n.jsx("rect",{width:"20",height:"20",fill:"white"})})})]})},ks=()=>{const e=E();return n.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[n.jsx("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M8.33301 2.46417H11.6663V5.79752H17.9163V9.13086H2.08301V5.79752H8.33301V2.46417Z",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinecap:"round",strokeLinejoin:"round"}),n.jsx("path",{d:"M3.33301 16.6667H16.6663V9.16669H3.33301V16.6667Z",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinejoin:"round"}),n.jsx("path",{d:"M6.66699 16.624V14.1309",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinecap:"round",strokeLinejoin:"round"}),n.jsx("path",{d:"M10 16.624V14.124",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinecap:"round",strokeLinejoin:"round"}),n.jsx("path",{d:"M13.333 16.624V14.1309",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinecap:"round",strokeLinejoin:"round"}),n.jsx("path",{d:"M5 16.6667H15",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinecap:"round",strokeLinejoin:"round"})]})},Cs=()=>{const e=E();return n.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[n.jsx("path",{d:"M15.3033 15.3033C13.9461 16.6605 12.0711 17.5 10 17.5C5.85787 17.5 2.5 14.1421 2.5 10C2.5 5.85787 5.85787 2.5 10 2.5C12.0711 2.5 13.9461 3.33947 15.3033 4.69671C15.9941 5.38754 17.5 7.08333 17.5 7.08333",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinecap:"round",strokeLinejoin:"round"}),n.jsx("path",{d:"M17.5 3.33331V7.08331H13.75",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinecap:"round",strokeLinejoin:"round"})]})},Ss=e=>{var _;const{models:t}=React.useContext(D),{modelName:s}=e,a=X(),{sessions:o}=a,r=o.find(i=>i.name===s),c=me(),u=()=>{const i=a.sessions.findIndex(A=>A.name===s),v=a.sessions[i];a.lastMessage(v.name).sender_type!==ne&&(v.clearContextIndex=v.messages.length||0,a.updateSession(i,v),a.onNewMessage(j({model:"admin",text:"",sender_type:ne,id:Date.now(),stream:!1,isError:!0}),i),W(`chat-wrapper-${v.id}`))},f=()=>{const i=o.findIndex(v=>v.name===s);a.updateSession(i,{messages:[],clearContextIndex:0})},y=()=>{a.closeController(s)},g=()=>{var A;const i=r.name===$?c.currentBot:a.lastBotMessage(r.name).model,v=((A=t[i])==null?void 0:A.provider)||"";a.retry(r.name,v,i)};return React.useEffect(()=>()=>{y()},[]),n.jsxs("div",{className:P.homeOperation,children:[a.lastMessage(s).stream&&n.jsx(G,{title:"Stop generating",className:P.opBtn,children:n.jsx("div",{...B(y),children:n.jsx("img",{src:`${Et}stop.png`,className:P.opImg,alt:"stop"},"stop_generate")})}),!!((_=r.messages)!=null&&_.length)&&!a.lastMessage(s).stream&&n.jsxs(n.Fragment,{children:[n.jsx(G,{title:"Clear context",className:P.opBtn,children:n.jsx("div",{...B(u),children:n.jsx(bs,{})})}),n.jsx(G,{title:"Clear message history",className:P.opBtn,children:n.jsx("div",{...B(f),children:n.jsx(ks,{})})}),n.jsx(G,{title:"Regenerate",className:P.opBtn,children:n.jsx("div",{...B(g),children:n.jsx(Cs,{})})})]})]})},Ls="_hidden-scrollbar_61gam_1",js="_styled-scrollbar_61gam_11",Rs="_sessions_61gam_30",Is="_preview-sessions_61gam_39",Es="_session-wrapper_61gam_51",Ms="_chat_61gam_56",Bs="_empty-chat_61gam_74",Ns="_empty-chat-text_61gam_81",Ts="_message_61gam_96",Os="_message-wrapper_61gam_102",Ps="_chat-user-title_61gam_162",Us="_chat-bot-title_61gam_170",Hs="_message-item_61gam_178",zs="_stream-wrapper_61gam_183",$s="_glow_61gam_1",Ds="_chat-user_61gam_162",qs="_chat-bot_61gam_170",Ws="_chat-operations_61gam_196",Ks="_chat-date_61gam_207",Vs="_chat-checkbox_61gam_214",Js="_model-avatar_61gam_257",Ys="_model-avatar-img_61gam_270",Fs="_model-name_61gam_273",Gs="_copy-code-btn_61gam_279",Xs="_clear-line_61gam_292",Qs="_markdown-block_61gam_314",Zs="_mario_61gam_1",eo="_running-mario_61gam_1",x={"hidden-scrollbar":"_hidden-scrollbar_61gam_1",hiddenScrollbar:Ls,"styled-scrollbar":"_styled-scrollbar_61gam_11",styledScrollbar:js,sessions:Rs,"preview-sessions":"_preview-sessions_61gam_39",previewSessions:Is,"session-wrapper":"_session-wrapper_61gam_51",sessionWrapper:Es,chat:Ms,"empty-chat":"_empty-chat_61gam_74",emptyChat:Bs,"empty-chat-text":"_empty-chat-text_61gam_81",emptyChatText:Ns,message:Ts,"message-wrapper":"_message-wrapper_61gam_102",messageWrapper:Os,"chat-user-title":"_chat-user-title_61gam_162",chatUserTitle:Ps,"chat-bot-title":"_chat-bot-title_61gam_170",chatBotTitle:Us,"message-item":"_message-item_61gam_178",messageItem:Hs,"stream-wrapper":"_stream-wrapper_61gam_183",streamWrapper:zs,glow:$s,"chat-user":"_chat-user_61gam_162",chatUser:Ds,"chat-bot":"_chat-bot_61gam_170",chatBot:qs,"chat-operations":"_chat-operations_61gam_196",chatOperations:Ws,"chat-date":"_chat-date_61gam_207",chatDate:Ks,"chat-checkbox":"_chat-checkbox_61gam_214",chatCheckbox:Vs,"model-avatar":"_model-avatar_61gam_257",modelAvatar:Js,"model-avatar-img":"_model-avatar-img_61gam_270",modelAvatarImg:Ys,"model-name":"_model-name_61gam_273",modelName:Fs,"copy-code-btn":"_copy-code-btn_61gam_279",copyCodeBtn:Gs,"clear-line":"_clear-line_61gam_292",clearLine:Xs,"markdown-block":"_markdown-block_61gam_314",markdownBlock:Qs,mario:Zs,"running-mario":"_running-mario_61gam_1",runningMario:eo};async function to(e){try{await navigator.clipboard.writeText(e),I.success("copied!")}catch{const s=document.createElement("textarea");s.value=e,document.body.appendChild(s),s.focus(),s.select();try{document.execCommand("copy"),I.success("copied!")}catch{I.error("copy failed")}document.body.removeChild(s)}}function so(e){const t=React.useRef(null),[s,a]=React.useState(!1),o=()=>{if(t.current){const r=t.current.innerText;to(r)}};return n.jsx("pre",{ref:t,children:n.jsxs("div",{onMouseOver:()=>a(!0),onFocus:()=>a(!0),onMouseLeave:()=>a(!1),children:[s&&n.jsx("span",{className:x.copyCodeBtn,...B(o)}),e.children]})})}const oo=()=>n.jsx("div",{id:x.mario});function ao(e){const{models:t}=React.useContext(D),[s,a]=React.useState(!1),{message:o}=e,r=o.sender_type==="user"||o.provider==="user",c=o.sender_type==="admin"||o.provider==="admin",u=o.sender_type===ne,f=ae(x.messageWrapper,r?x.chatUser:x.chatBot),y=E(),_=(()=>r?ke:c?qt:t[o.model])();return!u&&!_?null:n.jsx("div",{className:x.message,style:{justifyContent:r?"flex-end":"flex-start"},onMouseEnter:()=>a(!0),onMouseLeave:()=>a(!1),children:u?n.jsx("div",{className:x.clearLine,children:"Context cleared"}):n.jsxs(n.Fragment,{children:[!oe&&!r&&n.jsx("div",{style:{background:_.webui.background},className:x.modelAvatar,children:n.jsx("img",{src:_.webui.avatar,className:x.modelAvatarImg,alt:_.model})}),n.jsxs("div",{title:o.model||y.username,className:f,style:{borderRadius:r?"10px 1px 10px 10px":"1px 10px 10px 10px"},children:[o.stream&&n.jsx(oo,{}),!r&&n.jsx("div",{className:x.chatOperations,children:`${_.provider} - ${o.model}`}),n.jsx(vt,{className:x.markdownBlock,remarkPlugins:[At,yt,wt],rehypePlugins:[bt],components:{code:Nt,pre:so},children:o.text}),s&&n.jsx("div",{className:x.chatDate,style:{right:r?"0":"auto",left:r?"auto":"0"},children:o.date})]}),!oe&&r&&n.jsx("div",{style:{color:ke.background,marginRight:2},className:x.modelAvatar,children:"ME"})]})})}function no(e){const{session:t}=e;return React.useEffect(()=>{Ee(`chat-wrapper-${t.id}`)},[t.messages.length]),n.jsxs("div",{className:x.sessionWrapper,children:[n.jsxs("div",{className:x.chat,id:`chat-wrapper-${t.id}`,children:[Array.isArray(t.messages)&&t.messages.length===0&&n.jsx("div",{className:x.emptyChat,children:n.jsxs("div",{className:x.emptyChatText,children:[n.jsx("span",{children:"Shortcuts"}),n.jsx("br",{}),n.jsx("br",{}),n.jsx("code",{children:"#"})," - Change chat mode"]})}),Array.isArray(t.messages)&&t.messages.map((s,a)=>n.jsx("div",{className:x.messageItem,children:n.jsx(ao,{message:s,sessionInfo:{id:t.id,name:t.name,bot:t.bot}},s.id)},s.id))]}),n.jsx(Ss,{modelName:t.name})]})}const ro=()=>{const{models:e}=React.useContext(D),t=X(),s=E(),{sessions:a}=t;return n.jsx("div",{className:x.sessions,children:Array.isArray(a)&&a.map(o=>s.mode===z&&o.name!==$||s.mode===V&&o.name===$||!o.isShow?null:s.mode===V&&!e[o.name]?(t.removeSession(o.name),null):n.jsx(no,{session:o},o.id))})},co="_home-models_1vuuq_1",io="_model-avatar_1vuuq_10",lo="_model-avatar-img_1vuuq_24",mo="_model-chosen_1vuuq_29",uo="_model-name_1vuuq_35",go="_model-avatar-chosen_1vuuq_43",K={"home-models":"_home-models_1vuuq_1",homeModels:co,"model-avatar":"_model-avatar_1vuuq_10",modelAvatar:io,"model-avatar-img":"_model-avatar-img_1vuuq_24",modelAvatarImg:lo,"model-chosen":"_model-chosen_1vuuq_29",modelChosen:mo,"model-name":"_model-name_1vuuq_35",modelName:uo,"model-avatar-chosen":"_model-avatar-chosen_1vuuq_43",modelAvatarChosen:go},Pe=()=>{document.querySelectorAll(".scale-avatar").forEach(e=>{e.style.setProperty("--scale","1")})};function ho(e){const t=React.useRef(null),s=E(),a=X(),o=me(),[r,c]=React.useState(!1),u=s.mode===V&&o.chosenBotNames.includes(e.model.model)||s.mode===z&&o.currentBot===e.model.model;function f(g){if(s.mode===V)if(o.chosenBotNames.includes(g)){if(o.chosenBotNames.length===1){I.warning("At least one model should be selected");return}o.removeBot(g),a.removeSession(g)}else o.chosenBotNames.length===It?I.warning("No more models can be selected"):(o.addBot(g),a.newSession(g));else o.updateCurrentBot(g)}const y=g=>{let _=g.target;g.target!==t.current&&(_=g.target.parentNode);const i=_.getBoundingClientRect(),v=Math.abs(g.clientX-i.left)/i.width,A=_.previousElementSibling||null,M=_.nextElementSibling||null,C=.4;Pe(),A&&A.style.setProperty("--scale",`${1+C*Math.abs(v-1)}`),_.style.setProperty("--scale",`${1+C}`),M&&M.style.setProperty("--scale",`${1+C*v}`),g.stopPropagation()};return n.jsxs("div",{ref:t,className:`${K.modelAvatar} ${u&&K.modelAvatarChosen} scale-avatar`,onMouseMove:y,onMouseOver:()=>c(!0),onMouseLeave:()=>c(!1),...B(()=>f(e.model.model)),onFocus:()=>c(!0),children:[n.jsx("img",{src:e.model.webui.avatar,className:K.modelAvatarImg,alt:e.model.provider}),(r||u)&&n.jsxs("div",{className:K.modelName,children:["@",e.model.model||e.model.provider]})]})}const po=()=>{const{models:e}=React.useContext(D);return n.jsx("div",{className:K.homeModels,onMouseLeave:Pe,children:e&&Object.keys(e).map(t=>n.jsx(ho,{model:{model:t,...e[t]}},t))})},te=[{name:"Serial Mode",title:"Toggle between serial and parallel mode",description:"Serial mode will send your message to one bot each time."},{name:"Parallel Mode",title:"Toggle between serial and parallel mode",description:"Parallel mode will send your message to all bots at once."}],_o=""+new URL("send-5bb2204f.png",import.meta.url).href,fo="_home-prompt-wrapper_1o1fz_1",xo="_prompt_1o1fz_29",vo="_prompt-trash_1o1fz_36",Ao="_prompt-operation_1o1fz_40",yo="_chosen-prompt_1o1fz_45",wo="_model-item_1o1fz_49",bo="_model-avatar_1o1fz_54",ko="_home-input-wrapper_1o1fz_60",Co="_prompt-editor_1o1fz_78",So="_model-name-list_1o1fz_85",Lo="_model-name_1o1fz_85",jo="_empty-editor_1o1fz_97",Ro="_backup-textarea_1o1fz_144",Io="_submit-btn_1o1fz_150",Eo="_prompt-clip_1o1fz_154",S={"home-prompt-wrapper":"_home-prompt-wrapper_1o1fz_1",homePromptWrapper:fo,prompt:xo,"prompt-trash":"_prompt-trash_1o1fz_36",promptTrash:vo,"prompt-operation":"_prompt-operation_1o1fz_40",promptOperation:Ao,"chosen-prompt":"_chosen-prompt_1o1fz_45",chosenPrompt:yo,"model-item":"_model-item_1o1fz_49",modelItem:wo,"model-avatar":"_model-avatar_1o1fz_54",modelAvatar:bo,"home-input-wrapper":"_home-input-wrapper_1o1fz_60",homeInputWrapper:ko,"prompt-editor":"_prompt-editor_1o1fz_78",promptEditor:Co,"model-name-list":"_model-name-list_1o1fz_85",modelNameList:So,"model-name":"_model-name_1o1fz_85",modelName:Lo,"empty-editor":"_empty-editor_1o1fz_97",emptyEditor:jo,"backup-textarea":"_backup-textarea_1o1fz_144",backupTextarea:Ro,"submit-btn":"_submit-btn_1o1fz_150",submitBtn:Io,"prompt-clip":"_prompt-clip_1o1fz_154",promptClip:Eo},se={default:"Press # to toggle chat mode, and ENTER to send",google:"Google does not support Chinese"},Mo=()=>{const{models:e}=React.useContext(D),t=X(),s=me(),a=E(),o=React.useRef(null),r=React.useRef(null),[c,u]=React.useState(te),[f,y]=React.useState(!1),[g,_]=React.useState(""),[i,v]=React.useState(null),[A,M]=React.useState(0),[C,T]=React.useState(""),[Y,m]=React.useState(se.default),[d,w]=React.useState(""),[Ue,He]=React.useState(0),[Q,de]=React.useState(!1),[ze,ue]=React.useState(!0),Z=h=>(h=h.replace(/.*?<\/span>/g,""),r.current.innerHTML=h,r.current.innerText||""),O=(h,p=!0)=>{if(h===d)return;const b={allowedTags:["b","i","a","p","text","br","div","span","img"],allowedAttributes:{a:["href"],span:["class","id"],img:["src"],div:["class","id"]}};if(p){const F=zt(o.current);He(F)}w(kt(h,b))},ge=h=>{h.name==="Serial Mode"?(a.updateMode(z),I.success("Change to serial mode!"),O("")):h.name==="Parallel Mode"?(a.updateMode(V),I.success("Change to parallel mode!"),O("")):(v(h),O("")),_(""),y(!1),T("")},he=()=>{var h;if(g.trim())if(_(""),O(""),a.mode===z){const p=(h=e[s.currentBot])==null?void 0:h.provider;t.onUserInput(g,p,s.currentBot,$)}else s.chosenBotNames.forEach(p=>{var F;const b=(F=e[p])==null?void 0:F.provider;t.onUserInput(g,b,p,p)})},$e=h=>{const p=h.key;if(!Q){if(p==="Enter"&&!h.shiftKey){if(h.preventDefault(),g.trim()){if(f){ge(c[A]);return}he()}ue(!0)}if(p==="#"&&!f&&y(!0),f){const b=c.length-1;p==="ArrowUp"?(M(A===0?b:A-1),h.preventDefault()):p==="ArrowDown"?(M(A===b?0:A+1),h.preventDefault()):p==="Backspace"&&g.slice(-1)==="#"&&(y(!1),T(""))}f&&p==="Escape"&&y(!1)}},De=h=>{if(Q)return;const p=h.target;console.log(Z(p.innerHTML),p.innerHTML),_(Z(p.innerHTML));const b=p.innerHTML;O(b)},qe=h=>{if(ue(!h.target.textContent.length),Q)return;const p=h.target;_(Z(p.innerHTML));const b=p.innerHTML;O(b)};return React.useEffect(()=>{const h=te.filter(p=>p.name.toLowerCase().includes(C.toLowerCase()));M(0),h.length===0?(y(!1),u(te)):u(h)},[C]),React.useEffect(()=>{f&&T(g.split("#").slice(-1)[0])},[g]),React.useEffect(()=>{m(i?i.description:se[s.currentBot]||se.default)},[i,s.currentBot]),React.useLayoutEffect(()=>{o.current&&$t(o.current,Ue)},[d]),n.jsxs(n.Fragment,{children:[n.jsxs("div",{className:S.homeInputWrapper,children:[f&&n.jsx("div",{className:S.homePromptWrapper,children:c.map((h,p)=>n.jsx("div",{className:ae(S.prompt,{[S.chosenPrompt]:p===A}),...B(()=>ge(h)),children:n.jsx("div",{className:S.modelItem,children:h.name})},h.name))}),i&&n.jsxs("div",{className:S.modelName,children:["#",i.name]}),n.jsx("div",{contentEditable:!0,spellCheck:!0,ref:o,id:"prompt-textarea",className:ae(S.promptEditor,{[S.emptyEditor]:ze}),"data-text":Y,onKeyDown:$e,onKeyUp:De,onCompositionStart:()=>de(!0),onInput:qe,onCompositionEnd:()=>de(!1),dangerouslySetInnerHTML:{__html:d}}),n.jsx("img",{className:S.promptClip,src:_o,alt:"send-message",...B(he)})]}),n.jsx("div",{ref:r,style:{opacity:0,display:"hidden",position:"fixed",fontSize:0}})]})},Bo="_loading-icon_1yjma_1",No="_aoe_1yjma_1",To="_home-loading_1yjma_6",Se={"loading-icon":"_loading-icon_1yjma_1",loadingIcon:Bo,aoe:No,"home-loading":"_home-loading_1yjma_6",homeLoading:To},Oo=()=>n.jsx("div",{className:Se.homeLoading,children:n.jsx("div",{className:Se.loadingIcon})}),Po="_home_1tmut_1",Uo="_home-chats_1tmut_5",Ho="_homeModal_1tmut_10",Le={home:Po,"home-chats":"_home-chats_1tmut_5",homeChats:Uo,homeModal:Ho},zo=()=>{const[e,t]=React.useState(!1);return React.useEffect(()=>{setTimeout(()=>{t(!0)},1500)},[]),e},$o=()=>zo()?n.jsxs("div",{className:Le.home,children:[n.jsx("div",{className:Le.homeChats,children:n.jsx(ro,{})}),n.jsx(Mo,{}),n.jsx(po,{})]}):n.jsx(Oo,{}),Do=()=>n.jsx(Ct,{children:n.jsx(St,{children:n.jsx(Lt,{path:"/",element:n.jsx($o,{})})})}),qo=({children:e})=>{const[t,s]=React.useState(Wt),[a,o]=React.useState(!0);React.useEffect(()=>{o(!0),fetch("/config/json").then(c=>c.json()).then(c=>{c&&c.models&&s(c.models)}).catch(c=>{console.log(c)}).finally(()=>{o(!1)})},[]);const r=React.useMemo(()=>({models:t}),[t]);return n.jsx(D.Provider,{value:r,children:!a&&e})},Wo={welcome:"欢迎,感恩",hello:"嗨",hi:"你好",loading:"Loading"},Ko={...Wo},Vo={welcome:"Welcome, grateful",hello:"Hi",hi:"Hello",loading:"Loading"},Jo={...Vo},Yo={"zh-CN":Ko,"en-US":Jo};function Fo(e){}const Go={locale:J(),setLocale:Fo},Xo=React.createContext(Go),Qo=({children:e})=>{const[t,s]=React.useState(J()),a=React.useCallback(r=>{s(r),Pt(r)},[]),o=React.useMemo(()=>({locale:t,setLocale:a}),[t,a]);return n.jsx(jt,{locale:t,messages:Yo[t],children:n.jsx(Xo.Provider,{value:o,children:e})})},Zo=""+new URL("AOE-b98456c3.svg",import.meta.url).href,ea="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAEKSURBVHgBtVWLDYIwEH1RB2CEbuAKbqAbgBOoE+AGjIAboRPABrIBcnLE2vRqD9OXvJCUd196xxo6FCO3Ix9IhIEZjRUSww2QYWqDEfQd0weyPfBTBAmoBW0giA+Gbcg2DwkzS1hbZ1frnNjwe8OaSpOYYYMdpnY9Lccu6d2ZtTV0Vb8Nh0jmUML8yNxXSaYJUCuczyyhQLMgQCs5KzyiYSGB79uWJ59kCXYWsWx8jqQKbtDjrhHTldNeUwMlCkWAk+TE1yKDaQ66kZeRPWT0nAj9gCpE7qH5A1dOQHs2SFPiM721dR6c6AL/r+t9SJixQMqihTyxBtPSU+0kF/bERiH5JG+gwxHKCl5qY6X0Tnl2NgAAAABJRU5ErkJggg==",ta="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAFkSURBVHgB7VTLcYNADNViF+CL+dxIB6QDXEHSQZxK7HSQDhJ34A4gHdAB3PgMBxfAJ08Tx7NZWDA4R7+ZndFqJT2BPkR3jECMGaRp6huG8dK2rY+rixNCfnUcJ6ErIAYCu0KID4j+xViIvWVZbzQBvQRFUXjIMsBZ3RKcsVQVnLkaHPIJ50Az0CFApn+Cn3WhbdsJzYAhX/I8f6afQqqkEc2EodyfNHYu/ROBp7HT6TvgGmoJ8O97A7Ge54GuAGZmpyUYAs+Emp0KvO+RzHaIING7Ew9eUJZlp05xHK+yLHvH+05tiKWSZahmoJJUVXVEsIgD8XyciX2ptfUETdMcYLylcXhyvSBfHhaLxVE27KwKZBeQtH8mIsFAPsiKTpF5U+IrTjQR7APfjarvEPAahvFmCgnbsk/fCu9tU9M0I9TjkYa76hch27JPL/mYN7dlXde8o+TC8leGGKrP9Xr9RXfcgm+bjqOGex62UQAAAABJRU5ErkJggg==",sa="_header_1iqh2_1",oa="_header-title_1iqh2_11",aa="_header-operation_1iqh2_22",na="_light-theme_1iqh2_25",ra="_dark-theme_1iqh2_36",ca="_animate-light_1iqh2_47",ia="_animate-dark_1iqh2_51",L={header:sa,"header-title":"_header-title_1iqh2_11",headerTitle:oa,"header-operation":"_header-operation_1iqh2_22",headerOperation:aa,"light-theme":"_light-theme_1iqh2_25",lightTheme:na,"dark-theme":"_dark-theme_1iqh2_36",darkTheme:ra,"animate-light":"_animate-light_1iqh2_47",animateLight:ca,"animate-dark":"_animate-dark_1iqh2_51",animateDark:ia},la=()=>{const e=React.useRef(null),t=React.useRef(null),[s,a]=React.useState(!1),o=E(),r=()=>{window.location.href="/"},c=(u="")=>{setTimeout(()=>{o.updateTheme(u||o.theme==="light"?"dark":"light")},200)};return React.useEffect(()=>{},[o.theme]),React.useEffect(()=>{document.body.setAttribute("data-theme",o.theme),e.current&&t.current&&(o.theme==="light"?(e.current.classList.remove(L.animateLight),t.current.classList.remove(L.animateDark)):o.theme==="dark"&&(e.current.classList.add(L.animateLight),t.current.classList.add(L.animateDark)))},[o.theme,s]),n.jsxs("div",{className:L.header,children:[n.jsx("div",{className:L.headerTitle,onClick:r,children:n.jsx("img",{src:Zo,alt:"AOE_LOGO"})}),n.jsxs("div",{className:L.headerOperation,onClick:()=>c(),children:[n.jsx("span",{ref:e,className:L.lightTheme,children:n.jsx("img",{src:ea,alt:"sun",onLoad:()=>a(!s)})}),n.jsx("span",{ref:t,className:L.darkTheme,children:n.jsx("img",{src:ta,alt:"moon",onLoad:()=>a(!s)})})]})]})};const ma=()=>n.jsx(qo,{children:n.jsxs(Qo,{children:[n.jsx(la,{}),n.jsx(Do,{})]})});Rt.createRoot(document.getElementById("root")).render(n.jsx(ma,{})); diff --git a/openaoe/frontend/dist/assets/index-d0401642.js b/openaoe/frontend/dist/assets/index-d0401642.js deleted file mode 100644 index 63e579d..0000000 --- a/openaoe/frontend/dist/assets/index-d0401642.js +++ /dev/null @@ -1,7 +0,0 @@ -import{c as re,p as ie,S as l,a as Ve,b as Fe,d as Qe,e as he,f as pe,j as Ke,g as fe,v as _e,h as xe,t as Ge,i as We,l as Ze,s as Xe,k as Je,m as Ye,r as $e,o as Ae,n as et,q as tt,u as st,w as ot,x as at,y as nt,z as rt,A as it,B as ve,C as ct,D as lt,E as dt,F as be,G as mt,H as n,I as gt,J as ut,K as ht,L as oe,M,N as pt,O as ft,P as _t,T as W,Q as ae,R as xt,U as At,V as vt,W as bt,X as yt,Y as wt,Z as kt,_ as Lt,$ as Ct,a0 as St,a1 as jt}from"./vendor-0b33134f.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))o(a);new MutationObserver(a=>{for(const r of a)if(r.type==="childList")for(const i of r.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&o(i)}).observe(document,{childList:!0,subtree:!0});function s(a){const r={};return a.integrity&&(r.integrity=a.integrity),a.referrerPolicy&&(r.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?r.credentials="include":a.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function o(a){if(a.ep)return;a.ep=!0;const r=s(a);fetch(a.href,r)}})();const Z="clear_context",Rt=["user","admin",Z],q="serial",X="parallel",U="serial_session",Mt=3,y="gpt-3.5-turbo",Bt="https://oss.openmmlab.com/alles-bot/",Et=["openai","minimax","claude","gpt-4","internlm"],B=re()(ie((e,t)=>({token:"",theme:"light",username:"user",mode:q,updateTheme:s=>{e({theme:s})},updateMode:s=>{e({mode:s})}}),{name:"config",version:2,migrate(e,t){const o=JSON.parse(JSON.stringify(e));return t<2&&(o.token={}.VITE_ALLES_APIN_TOKEN,o.theme="light",o.username="user",o.mode=q),o}})),Nt=({children:e,inline:t,className:s,...o})=>{const a=/language-(\w+)/.exec(s||"")||[],r=B();return l.registerLanguage("assembly",Ve),l.registerLanguage("python",Fe),l.registerLanguage("c",Qe),l.registerLanguage("c/c++",he),l.registerLanguage("clike",he),l.registerLanguage("c++",pe),l.registerLanguage("cpp",pe),l.registerLanguage("java",Ke),l.registerLanguage("csharp",fe),l.registerLanguage("c#",fe),l.registerLanguage("vb",_e),l.registerLanguage("visual basic",_e),l.registerLanguage("javascript",xe),l.registerLanguage("typescript",Ge),l.registerLanguage("css",We),l.registerLanguage("less",Ze),l.registerLanguage("js",xe),l.registerLanguage("sql",Xe),l.registerLanguage("php",Je),l.registerLanguage("go",Ye),l.registerLanguage("r",$e),l.registerLanguage("objective-c",Ae),l.registerLanguage("objc",Ae),l.registerLanguage("matlab",et),l.registerLanguage("swift",tt),l.registerLanguage("ruby",st),l.registerLanguage("lua",ot),l.registerLanguage("json",at),l.registerLanguage("yaml",nt),l.registerLanguage("xml",rt),l.registerLanguage("dDockerfile",it),l.registerLanguage("markdown",ve),l.registerLanguage("md",ve),l.registerLanguage("makefile",ct),l.registerLanguage("latex",lt),l.registerLanguage("llvm",dt),l.registerLanguage("shell",be),l.registerLanguage("sh",be),l.registerLanguage("bash",mt),!t&&a?n.jsx(l,{language:(a[1]||"Python").toLowerCase(),style:r.theme==="light"?gt:ut,customStyle:{borderRadius:"10px"},PreTag:"div",...o,children:e}):n.jsx("code",{className:s,...o,children:e})},It=React.memo(Nt),ce=(...e)=>{const t=e.map(s=>typeof s=="function"?s:()=>s);return(...s)=>{let o=0,a;for(a=t.length===0?s:t[o++](...s);o{const e=window.localStorage.getItem(ne);return e?e==="en-US"?"en-US":"zh-CN":(localStorage.setItem(ne,"en-US"),"en-US")};let je=Tt();const Ot=e=>(window.localStorage.setItem(ne,e),e),Q=()=>je,Pt=e=>{je=Ot(e)},ye=e=>{const t=document.cookie.split(";");for(let s=0;s"/login";function qt(e,t=50){let s=null;return(...o)=>{s?clearTimeout(s):e.apply(this,o),s=setTimeout(()=>{e.apply(this,o)},t)}}const Me=e=>{const t=document.getElementById(e);t&&t.scrollTo({top:999999,behavior:"smooth"})},V=qt(e=>Me(e),50),E=(e,t=null)=>oe?{onTouchEnd:t||e}:{onClick:e||t},Ut=e=>{if(e===null)return 0;const t=window.getSelection();if(t.rangeCount>0){const s=t.getRangeAt(0),o=s.cloneRange();return o.selectNodeContents(e),o.setEnd(s.startContainer,s.startOffset),o.toString().length}return 0};function Dt(e,t){let s=0;const o=document.createRange();o.setStart(e,0);function a(i){for(let c=0;c=t)return o.setStart(_,t-s),o.collapse(!0),!0;s+=_.length}else if(a(_))return!0}}a(e);const r=window.getSelection();r.removeAllRanges(),r.addRange(o)}const Ht=""+new URL("internlm-7cc58d2e.svg",import.meta.url).href,we=""+new URL("openai-6f4a287b.svg",import.meta.url).href,ke=""+new URL("claude-bd5f04f1.svg",import.meta.url).href,Vt="data:image/webp;base64,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",Ft=""+new URL("minimax-6a0e4e4d.png",import.meta.url).href,Qt=""+new URL("spark-7fb32fd7.svg",import.meta.url).href,Kt=""+new URL("A-017dd65e.svg",import.meta.url).href,K=[{provider:"internlm",model:"internlm-chat-7b",avatar:Ht,border:"rgba(1,52,220,0.85)",background:"linear-gradient(180deg, rgba(34,76,220,0.85) 0%, #0134DCD8 100%)"},{provider:"openai",model:"gpt-3.5-turbo",avatar:we,border:"#1a8d15",background:"linear-gradient(180deg, rgba(156, 206, 116, 0.15) 0%, #1a8d15 100%)"},{provider:"openai",model:"gpt-4",avatar:we,border:"#4dd547",background:"linear-gradient(180deg, rgba(156, 206, 116, 0.15) 0%, #08be00 100%)"},{provider:"claude",model:"claude-1",avatar:ke,border:"#8550ca",background:"linear-gradient(180deg, rgba(141, 90, 181, 0.15) 0%, rgba(106, 39, 123, 0.7) 53.12%, #663E9A 100%)"},{provider:"claude",model:"claude-1-100k",avatar:ke,border:"#8550ca",background:"linear-gradient(180deg, rgba(141, 90, 181, 0.15) 0%, rgba(106, 39, 123, 0.7) 53.12%, #663E9A 100%)"},{provider:"google",model:"chat-bison-001",avatar:Vt,border:"#ff85c7",background:"linear-gradient(180deg, rgba(181, 90, 90, 0.15) 0%, #fa5ab1 100%)"},{provider:"minimax",model:"abab5-chat",avatar:Ft,border:"#be1313",background:"linear-gradient(180deg, rgba(207, 72, 72, 0.15) 0%, rgba(151, 43, 43, 0.7) 53.12%, #742828 100%)"},{provider:"spark",model:"spark",avatar:Qt,border:"#6fa2db",background:"linear-gradient(180deg, rgba(72, 72, 207, 0.15) 0%, #7498be 100%)"},{provider:"admin",model:"admin",avatar:Kt,border:"#4e6ef2",background:"linear-gradient(rgb(255 255 255 / 80%) 0%, rgb(168 245 179) 100%)"},{provider:"user",model:"user",avatar:"user.png",border:"#71e875",background:"#71e875"}],Gt="_home-operation_16zek_1",Wt="_op-btn_16zek_14",Zt="_op-img_16zek_25",O={"home-operation":"_home-operation_16zek_1",homeOperation:Gt,"op-btn":"_op-btn_16zek_14",opBtn:Wt,"op-img":"_op-img_16zek_25",opImg:Zt},Xt={model:"abab5-chat",prompt:"",messages:[],role_meta:{user_name:"USER",bot_name:"BOT"},stream:!0,type:"json"},Jt={model:"gpt-3.5-turbo",prompt:"",messages:[],role_meta:{user_name:"user",bot_name:"assistant"},type:"json"},Yt={model:"chat-bison-001",prompt:{messages:[]},temperature:.1,candidate_count:1},$t={prompt:"",model:"claude-1",max_tokens:5e3},es={parameter:{chat:{temperature:.5,max_tokens:1024,chat_id:"user1"}},payload:{message:{text:[]}}},ts={model:"internlm-chat-7b",prompt:"",messages:[],role_meta:{user_name:"user",bot_name:"assistant"},stream:!0},D="",L=new Map;L.set("minimax",{url:`${D}/v1/minimax/v1/text/chat-stream`,...Xt});L.set("openai",{url:`${D}/v1/openai/v1/text/chat-stream`,...Jt});L.set("google",{url:`${D}/v1/google/v1/palm/chat`,...Yt});L.set("claude",{url:`${D}/v1/claude/v1/text/chat-stream`,...$t});L.set("spark",{url:`${D}/v1/xunfei/v1/spark/chat`,...es});L.set("internlm",{url:`${D}/v1/internlm/v1/chat/completions`,...ts});const Be=()=>({"Content-Type":"application/json"}),ss=e=>{var t;return((t=L.get(e))==null?void 0:t.url)||L.get(y).url},Le=(e,t,s,o)=>{const a={...L.get(e)||L.get(y)};if(delete a.url,a.model=t,["openai","internlm","gpt-4"].includes(e)&&(a.prompt=s,a.messages=o),e==="minimax"&&(a.prompt=s,a.messages=o.map(r=>({text:r.text,sender_type:r.sender_type==="user"?"USER":"BOT"})),a.messages.push({text:s,sender_type:"USER"})),e==="google"){const r={content:"Hi! How can I help you today?",author:"1"},i=o.map(c=>({content:c.text,author:c.sender_type==="user"?"0":"1"}));i.push({content:s,author:"0"}),i.unshift(r),a.prompt.messages=i}if(e==="baidu"||e==="claude"){const r=o.map(i=>({role:i.sender_type,content:i.text}));r.push({role:"user",content:s}),a.messages=r}if(e==="spark"){const r=o.map(i=>({role:i.sender_type,content:i.text}));r.push({role:"user",content:s}),delete a.model,a.payload.message.text=r}return a},os={development:"",staging:"",production:""},as={mock:"",development:"",staging:"",production:""},Ee="production",ns=os[Ee],rs=as[Ee],is=[],cs=e=>{const t={};return is.find(o=>e.url.endsWith(o))||Re.get(),{...e,headers:{lang:Q(),...e.headers,...t}}},ls=e=>({...e,headers:{...e.headers,"Client-Type":"app",type:0}}),ds=[cs,ls],Ne=()=>{Re.removeAll()},ms=e=>{const t=e.data;return e.__meta.isAllResponseBody?t:t.data},gs=e=>{const t=e.data,o=!e.__meta.isIgnoreError;return t.success===!1&&o&&M.error(t.msg),e},us=e=>{const t=e.data;return t&&t.msgCode==="A0202"&&Ne(),e},hs=e=>{const t=e.data;return t&&t.msgCode==="C1600"&&(window.location.href=zt()),e},ee=(e,t=!1)=>{t||M.error(e)},ps=e=>{if(e.response){const s=e.__meta.isIgnoreGatewayError,o=e.response.status;switch(console.log(e.code,"error....."),o){case 401:case 403:Ne();break;case 500:ee(Q()==="zh-CN"?"服务器没有响应,请稍后再试":"Sever error, please try again later.",s);break;default:e.code==="ERR_NETWORK"?ee(Q()==="zh-CN"?"网络出错了,请稍后再试":"Network error, please try again later.",s):ee(`${o}: ${e.message||"unknown error"}`,s)}}return Promise.reject(e)},Ie=[us,hs,gs,ms],Te=[ps],z=pt.create({method:"get",timeout:6e4,responseType:"json",paramsSerializer:e=>ft.stringify(e,{indices:!1})}),I=new Map,fs=e=>{let t={};return I.has(e.config.url)&&(t=I.get(e.config.url),I.delete(e.config.url)),{...e,__meta:t}},_s=e=>{let t={};return I.has(e.config.url)&&(t=I.get(e.config.url),I.delete(e.config.url)),{...e,__meta:t}};Ie.unshift(fs);Te.unshift(_s);const xs=ce(...ds),As=ce(...Ie),vs=ce(...Te);z.interceptors.request.use(xs,e=>Promise.reject(e));z.interceptors.response.use(As,vs);const bs=(e,{method:t="GET",params:s={},data:o={},...a})=>{const r=`${ns}${e}`;switch(t.toLowerCase()){case"get":return z.get(r,{params:s,...a});case"delete":return z.delete(r,{params:s,data:o,...a});case"post":return z.post(r,o,{params:s,...a});case"put":return z.put(r,o,{params:s,...a});default:return Promise.resolve({then:i=>i({msgCode:"300",msg:"Method Not Allowed",traceId:"-1",total:0,status:405,data:{}})})}},ys=(e,t={},s=rs)=>{const a=`${s}/${e}`.replace(/\/\//g,"/");return t.meta&&(I.set(a,t.meta),delete t.meta),bs(a,t)};async function ws(e,t,s){const o=Be();return ys(e,{method:"POST",headers:{...o},data:t,signal:s,meta:{isAllResponseBody:!0}})}function R(e){return{id:Date.now(),provider:"openai",date:new Date().toLocaleString(),sender_type:"user",text:"",...e}}function P(e){return{id:Date.now()+Math.random(),name:y,bot:"",messages:[],isShow:!0,clearContextIndex:0,...e}}const J=re()(ie((e,t)=>({hasStreaming:!1,sessions:[P({name:U}),P({name:y})],currentSessionIndex:0,globalId:0,controller:{},newSession(s){const o=t().sessions,a=o.findIndex(i=>i.name===s);if(a>0){t().updateSession(a,{isShow:!0});return}const r=P({name:s,isShow:!0});e(()=>({globalId:t().globalId+1})),r.id=t().globalId,o.push(r),e(()=>({sessions:o}))},removeSession(s){const a=t().sessions.findIndex(r=>r.name===s);a&&t().updateSession(a,{isShow:!1})},getSession(s){const o=t().sessions,a=o.findIndex(r=>r.name===s);return a<0?P({name:s}):o[a]},onNewMessage(s,o=0){t().sessions[o].messages.push(s),console.log("[BOT] onNewMessage: ",s,o),e(()=>({sessions:t().sessions}))},deleteMessage(s,o){const a=t().sessions.find(r=>r.name===s);a&&(a.messages.splice(o,1),e(()=>({sessions:t().sessions})))},retry(s,o){const a=o||t().lastBotMessage(s).model||"",r=K.find(c=>c.model===a).provider,i=t().lastUserMessage(s).text;t().lastMessage(s).id===t().lastBotMessage(s).id&&t().getSession(s).clearContextIndex!==t().getSession(s).messages.length&&(t().deleteMessage(s,t().getSession(s).messages.length-1),t().deleteMessage(s,t().getSession(s).messages.length-1)),t().onUserInput(i,r,a,s)},async onUserInput(s,o,a,r){var H;const i=t().sessions.findIndex(d=>d.name===r),c=t().sessions[i];if(!c)return;const _=c.clearContextIndex||0,A=c.messages.slice(_).filter(d=>d.isError!==!0).map(d=>({text:d.text,sender_type:d.sender_type})),u=c.messages.length+1,f=R({text:s,provider:"user",sender_type:"user"}),m=R({provider:o,model:a,text:"...",sender_type:"bot",id:f.id+1,stream:!0});t().onNewMessage(f,i),t().onNewMessage(m,i),V(`chat-wrapper-${c.id}`);const v=new AbortController,C=t().controller;C[r]=v,e(()=>({controller:{...C}}));const N={method:"POST",headers:Be(),body:JSON.stringify({...Le(o,a,s,A)})},w=ss(o);let G=!0;if(Et.includes(o))_t(w,{...N,signal:v.signal,async onopen(d){const g=d.headers.get("content-type");if(g!=null&&g.includes("text/event-stream")||(G=!1),!d.ok)throw new Error(d.status+d.statusText)},onmessage:d=>{if(G&&typeof d.data=="string"&&d.data.charAt(0)==="{"){const g=JSON.parse(d.data);if(g&&g.success==="true"){if(g.stop_reason==="max_token"){m.stream=!1,t().updateMessage(i,u,b=>{b.stream=!1,b.text=m.text.concat(` - > ${g.stop_reason}`)});return}m.stream=!0,m.text=m.text.startsWith("...")?m.text.slice(3).concat(g.msg):m.text.concat(g.msg),V(`chat-wrapper-${c.id}`),t().updateMessage(i,u,b=>{b.text=m.text,b.stream=m.stream})}if(g&&g.success==="false")throw new Error(g.msg)}},onerror(d){console.log("[BOT] request error: ",d),m.stream=!1,t().updateMessage(i,u,b=>{b.stream=m.stream,b.text=d.message.includes("Please reduce the length of the messages.")?d.message:`${m.text} - > Oops... Something went wrong (°⌓°)`,b.isError=!0});const g=t().controller;throw delete g[r],e(()=>({controller:{...g}})),d},onclose(){m.stream=!1,t().updateMessage(i,u,g=>{g.stream=m.stream});const d=t().controller;delete d[r],e(()=>({controller:{...d}})),console.log("[BOT] answering closed. ")}});else try{const d=await ws(w,Le(o,a,s,A),v.signal);if(d.msgCode==="10000"&&d.data){if(o==="google"){if(!d.data.candidates&&d.data.filters){m.stream=!1,t().updateMessage(i,u,g=>{g.stream=m.stream,g.text=`${m.text} - > Oops... Something went wrong (°⌓°)`,g.isError=!0});return}m.text=(H=d.data.candidates[0])==null?void 0:H.content}else o==="claude"?m.text=d.data.completion:m.text=d.data;m.stream=!1,t().updateMessage(i,u,g=>{g.text=m.text,g.stream=m.stream}),V(`chat-wrapper-${c.id}`)}else m.stream=!1,t().updateMessage(i,u,g=>{g.stream=m.stream,g.text=`${m.text} - > Oops... Something went wrong (°⌓°)`,g.isError=!0})}catch{t().updateMessage(i,u,g=>{g.stream=!1,g.text=`${m.text} - > Oops... Something went wrong (°⌓°)`,g.isError=!0})}finally{const d=t().controller;delete d[r],e(()=>({controller:{...d}}))}},updateMessage(s,o,a){const i=t().sessions[s].messages[o];i.date=new Date().toLocaleString(),a(i),e(()=>({sessions:t().sessions}))},lastMessage(s){const o=t().sessions.find(r=>r.name===s);if(!o)return R({text:""});const a=o==null?void 0:o.messages;return Array.isArray(a)&&a.length>0?a.slice(-1)[0]:R({text:""})},lastUserMessage(s){const o=t().sessions.find(r=>r.name===s);if(!o)return R({text:""});const a=[...o.messages];return Array.isArray(a)&&a.length>0?a.reverse().find(r=>r.sender_type==="user"):R({text:""})},lastBotMessage(s){const o=t().sessions.find(r=>r.name===s);if(!o)return R({text:""});const a=[...o.messages];return Array.isArray(a)&&a.length>0?a.reverse().find(r=>r.sender_type==="bot"&&r.model!=="admin"):R({text:""})},updateSession(s,o){const a=t().sessions;let r=a[s];r={...r,...o},a[s]=r,e(()=>({sessions:a}))},closeController(s){const o=t().controller,a=o==null?void 0:o[s];if(a){a.abort&&a.abort(),delete o[s],e(()=>({controller:{...o}}));const r=t().sessions.findIndex(c=>c.name===s),i=t().sessions[r];t().updateMessage(r,i.messages.length-1,c=>{c.stream=!1,c.text=c.text.concat(` - > Request canceled。`)}),V(`chat-wrapper-${i.id}`)}},clearAllData(){localStorage.removeItem("chat"),e(()=>({sessions:[P({name:y})]})),window.location.reload()}}),{name:"chat",version:2,migrate(e,t){const s=e,o=JSON.parse(JSON.stringify(s));if(t<2){o.globalId=0,o.sessions=[];const a=s.sessions;for(const r of a){const i=P({name:U});i.id=r.id,i.name=r.name,i.clearContextIndex=r.clearContextIndex,i.messages=[...r.messages],o.sessions.push(i)}}return o}})),le=re()(ie((e,t)=>({chosenBotNames:[y],currentBot:y,updateCurrentBot:s=>{e({currentBot:s})},addBot:s=>{const{chosenBotNames:o}=t();o.includes(s)||e({chosenBotNames:[...o,s]})},removeBot:s=>{const{chosenBotNames:o}=t();e({chosenBotNames:o.filter(a=>a!==s)})},getCurrentBot:()=>t().currentBot||y,clearBots:()=>{localStorage.removeItem("bot"),e({chosenBotNames:[y]})}}),{name:"bot",version:2,migrate(e,t){const o=JSON.parse(e);return t<2&&(o.chosenBotNames=[y],o.currentBot=y),o}})),ks=()=>{const e=B();return n.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[n.jsxs("g",{clipPath:"url(#clip0_50_304)",children:[n.jsx("mask",{id:"mask0_50_304",maskUnits:"userSpaceOnUse",x:"0",y:"0",width:"20",height:"20",children:n.jsx("path",{d:"M20 0H0V20H20V0Z",fill:"white"})}),n.jsxs("g",{mask:"url(#mask0_50_304)",children:[n.jsx("path",{d:"M18.659 10.0709L13.2991 2.95807L5.8894 8.54167L11.4582 15.4167L12.8564 14.4435L18.659 10.0709Z",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinejoin:"round"}),n.jsx("path",{d:"M11.4582 15.4167L9.85879 16.6978L5.45733 16.6975L4.37379 15.2596L1.69385 11.7032L6.0415 8.427",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinejoin:"round"}),n.jsx("path",{d:"M5.50244 16.6967H18.569",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinecap:"round"})]})]}),n.jsx("defs",{children:n.jsx("clipPath",{id:"clip0_50_304",children:n.jsx("rect",{width:"20",height:"20",fill:"white"})})})]})},Ls=()=>{const e=B();return n.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[n.jsx("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M8.33301 2.46417H11.6663V5.79752H17.9163V9.13086H2.08301V5.79752H8.33301V2.46417Z",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinecap:"round",strokeLinejoin:"round"}),n.jsx("path",{d:"M3.33301 16.6667H16.6663V9.16669H3.33301V16.6667Z",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinejoin:"round"}),n.jsx("path",{d:"M6.66699 16.624V14.1309",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinecap:"round",strokeLinejoin:"round"}),n.jsx("path",{d:"M10 16.624V14.124",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinecap:"round",strokeLinejoin:"round"}),n.jsx("path",{d:"M13.333 16.624V14.1309",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinecap:"round",strokeLinejoin:"round"}),n.jsx("path",{d:"M5 16.6667H15",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinecap:"round",strokeLinejoin:"round"})]})},Cs=()=>{const e=B();return n.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[n.jsx("path",{d:"M15.3033 15.3033C13.9461 16.6605 12.0711 17.5 10 17.5C5.85787 17.5 2.5 14.1421 2.5 10C2.5 5.85787 5.85787 2.5 10 2.5C12.0711 2.5 13.9461 3.33947 15.3033 4.69671C15.9941 5.38754 17.5 7.08333 17.5 7.08333",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinecap:"round",strokeLinejoin:"round"}),n.jsx("path",{d:"M17.5 3.33331V7.08331H13.75",stroke:e.theme==="light"?"black":"white",strokeWidth:"1.66667",strokeLinecap:"round",strokeLinejoin:"round"})]})},Ss=e=>{var A;const{modelName:t}=e,s=J(),{sessions:o}=s,a=o.find(u=>u.name===t),r=le(),i=()=>{const u=s.sessions.findIndex(m=>m.name===t),f=s.sessions[u];s.lastMessage(f.name).sender_type!==Z&&(f.clearContextIndex=f.messages.length||0,s.updateSession(u,f),s.onNewMessage(R({model:"admin",text:"",sender_type:Z,id:Date.now(),stream:!1,isError:!0}),u),V(`chat-wrapper-${f.id}`))},c=()=>{const u=o.findIndex(f=>f.name===t);s.updateSession(u,{messages:[],clearContextIndex:0})},_=()=>{s.closeController(t)};return React.useEffect(()=>()=>{_()},[]),n.jsxs("div",{className:O.homeOperation,children:[s.lastMessage(t).stream&&n.jsx(W,{title:"Stop generating",className:O.opBtn,children:n.jsx("div",{...E(_),children:n.jsx("img",{src:`${Bt}stop.png`,className:O.opImg,alt:"stop"},"stop_generate")})}),!!((A=a.messages)!=null&&A.length)&&!s.lastMessage(t).stream&&n.jsxs(n.Fragment,{children:[n.jsx(W,{title:"Clear context",className:O.opBtn,children:n.jsx("div",{...E(i),children:n.jsx(ks,{})})}),n.jsx(W,{title:"Clear message history",className:O.opBtn,children:n.jsx("div",{...E(c),children:n.jsx(Ls,{})})}),n.jsx(W,{title:"Regenerate",className:O.opBtn,children:n.jsx("div",{...E(()=>s.retry(a.name,a.name===U&&r.currentBot)),children:n.jsx(Cs,{})})})]})]})},js="_hidden-scrollbar_61gam_1",Rs="_styled-scrollbar_61gam_11",Ms="_sessions_61gam_30",Bs="_preview-sessions_61gam_39",Es="_session-wrapper_61gam_51",Ns="_chat_61gam_56",Is="_empty-chat_61gam_74",Ts="_empty-chat-text_61gam_81",Os="_message_61gam_96",Ps="_message-wrapper_61gam_102",zs="_chat-user-title_61gam_162",qs="_chat-bot-title_61gam_170",Us="_message-item_61gam_178",Ds="_stream-wrapper_61gam_183",Hs="_glow_61gam_1",Vs="_chat-user_61gam_162",Fs="_chat-bot_61gam_170",Qs="_chat-operations_61gam_196",Ks="_chat-date_61gam_207",Gs="_chat-checkbox_61gam_214",Ws="_model-avatar_61gam_257",Zs="_model-avatar-img_61gam_270",Xs="_model-name_61gam_273",Js="_copy-code-btn_61gam_279",Ys="_clear-line_61gam_292",$s="_markdown-block_61gam_314",eo="_mario_61gam_1",to="_running-mario_61gam_1",x={"hidden-scrollbar":"_hidden-scrollbar_61gam_1",hiddenScrollbar:js,"styled-scrollbar":"_styled-scrollbar_61gam_11",styledScrollbar:Rs,sessions:Ms,"preview-sessions":"_preview-sessions_61gam_39",previewSessions:Bs,"session-wrapper":"_session-wrapper_61gam_51",sessionWrapper:Es,chat:Ns,"empty-chat":"_empty-chat_61gam_74",emptyChat:Is,"empty-chat-text":"_empty-chat-text_61gam_81",emptyChatText:Ts,message:Os,"message-wrapper":"_message-wrapper_61gam_102",messageWrapper:Ps,"chat-user-title":"_chat-user-title_61gam_162",chatUserTitle:zs,"chat-bot-title":"_chat-bot-title_61gam_170",chatBotTitle:qs,"message-item":"_message-item_61gam_178",messageItem:Us,"stream-wrapper":"_stream-wrapper_61gam_183",streamWrapper:Ds,glow:Hs,"chat-user":"_chat-user_61gam_162",chatUser:Vs,"chat-bot":"_chat-bot_61gam_170",chatBot:Fs,"chat-operations":"_chat-operations_61gam_196",chatOperations:Qs,"chat-date":"_chat-date_61gam_207",chatDate:Ks,"chat-checkbox":"_chat-checkbox_61gam_214",chatCheckbox:Gs,"model-avatar":"_model-avatar_61gam_257",modelAvatar:Ws,"model-avatar-img":"_model-avatar-img_61gam_270",modelAvatarImg:Zs,"model-name":"_model-name_61gam_273",modelName:Xs,"copy-code-btn":"_copy-code-btn_61gam_279",copyCodeBtn:Js,"clear-line":"_clear-line_61gam_292",clearLine:Ys,"markdown-block":"_markdown-block_61gam_314",markdownBlock:$s,mario:eo,"running-mario":"_running-mario_61gam_1",runningMario:to};async function so(e){try{await navigator.clipboard.writeText(e),M.success("copied!")}catch{const s=document.createElement("textarea");s.value=e,document.body.appendChild(s),s.focus(),s.select();try{document.execCommand("copy"),M.success("copied!")}catch{M.error("copy failed")}document.body.removeChild(s)}}function oo(e){const t=React.useRef(null),[s,o]=React.useState(!1),a=()=>{if(t.current){const r=t.current.innerText;so(r)}};return n.jsx("pre",{ref:t,children:n.jsxs("div",{onMouseOver:()=>o(!0),onFocus:()=>o(!0),onMouseLeave:()=>o(!1),children:[s&&n.jsx("span",{className:x.copyCodeBtn,...E(a)}),e.children]})})}const ao=()=>n.jsx("div",{id:x.mario});function no(e){const[t,s]=React.useState(!1),{message:o}=e,a=o.sender_type==="user"||o.provider==="user",r=ae(x.messageWrapper,a?x.chatUser:x.chatBot),i=B(),c=K.find(_=>_.model===(o.model||"user"));return c?n.jsx("div",{className:x.message,style:{justifyContent:a?"flex-end":"flex-start"},onMouseEnter:()=>s(!0),onMouseLeave:()=>s(!1),children:o.sender_type===Z?n.jsx("div",{className:x.clearLine,children:"Context cleared"}):n.jsxs(n.Fragment,{children:[!oe&&!a&&n.jsx("div",{style:{background:c.background},className:x.modelAvatar,children:n.jsx("img",{src:c.avatar,className:x.modelAvatarImg,alt:c.model})}),n.jsxs("div",{title:o.model||i.username,className:r,style:{borderRadius:a?"10px 1px 10px 10px":"1px 10px 10px 10px"},children:[o.stream&&n.jsx(ao,{}),!a&&n.jsx("div",{className:x.chatOperations,children:`${c.provider} - ${c.model}`}),n.jsx(xt,{className:x.markdownBlock,remarkPlugins:[At,vt,bt],rehypePlugins:[yt],components:{code:It,pre:oo},children:o.text}),t&&n.jsx("div",{className:x.chatDate,style:{right:a?"0":"auto",left:a?"auto":"0"},children:o.date})]}),!oe&&a&&n.jsx("div",{style:{color:c.background,marginRight:2},className:x.modelAvatar,children:"ME"})]})}):null}function ro(e){const{session:t}=e;return React.useEffect(()=>{Me(`chat-wrapper-${t.id}`)},[t.messages.length]),n.jsxs("div",{className:x.sessionWrapper,children:[n.jsxs("div",{className:x.chat,id:`chat-wrapper-${t.id}`,children:[Array.isArray(t.messages)&&t.messages.length===0&&n.jsx("div",{className:x.emptyChat,children:n.jsxs("div",{className:x.emptyChatText,children:[n.jsx("span",{children:"Shortcuts"}),n.jsx("br",{}),n.jsx("br",{}),n.jsx("code",{children:"#"})," - Change chat mode"]})}),Array.isArray(t.messages)&&t.messages.map((s,o)=>n.jsx("div",{className:x.messageItem,children:n.jsx(no,{message:s,sessionInfo:{id:t.id,name:t.name,bot:t.bot}},s.id)},s.id))]}),n.jsx(Ss,{modelName:t.name})]})}const io=()=>{const e=J(),t=B(),{sessions:s}=e;return n.jsx("div",{className:x.sessions,children:Array.isArray(s)&&s.map(o=>t.mode===q&&o.name!==U||t.mode===X&&o.name===U||!o.isShow?null:n.jsx(ro,{session:o},o.id))})},co="_home-models_1vuuq_1",lo="_model-avatar_1vuuq_10",mo="_model-avatar-img_1vuuq_24",go="_model-chosen_1vuuq_29",uo="_model-name_1vuuq_35",ho="_model-avatar-chosen_1vuuq_43",F={"home-models":"_home-models_1vuuq_1",homeModels:co,"model-avatar":"_model-avatar_1vuuq_10",modelAvatar:lo,"model-avatar-img":"_model-avatar-img_1vuuq_24",modelAvatarImg:mo,"model-chosen":"_model-chosen_1vuuq_29",modelChosen:go,"model-name":"_model-name_1vuuq_35",modelName:uo,"model-avatar-chosen":"_model-avatar-chosen_1vuuq_43",modelAvatarChosen:ho},Oe=()=>{document.querySelectorAll(".scale-avatar").forEach(e=>{e.style.setProperty("--scale","1")})};function po(e){const t=React.useRef(null),s=B(),o=J(),a=le(),[r,i]=React.useState(!1),c=s.mode===X&&a.chosenBotNames.includes(e.model.model)||s.mode===q&&a.currentBot===e.model.model;function _(u){if(s.mode===X)if(a.chosenBotNames.includes(u)){if(a.chosenBotNames.length===1){M.warning("At least one model should be selected");return}a.removeBot(u),o.removeSession(u)}else a.chosenBotNames.length===Mt?M.warning("No more models can be selected"):(a.addBot(u),o.newSession(u));else a.updateCurrentBot(u)}const A=u=>{let f=u.target;u.target!==t.current&&(f=u.target.parentNode);const m=f.getBoundingClientRect(),v=Math.abs(u.clientX-m.left)/m.width,C=f.previousElementSibling||null,N=f.nextElementSibling||null,w=.4;Oe(),C&&C.style.setProperty("--scale",`${1+w*Math.abs(v-1)}`),f.style.setProperty("--scale",`${1+w}`),N&&N.style.setProperty("--scale",`${1+w*v}`),u.stopPropagation()};return n.jsxs("div",{ref:t,className:`${F.modelAvatar} ${c&&F.modelAvatarChosen} scale-avatar`,onMouseMove:A,onMouseOver:()=>i(!0),onMouseLeave:()=>i(!1),...E(()=>_(e.model.model)),onFocus:()=>i(!0),children:[n.jsx("img",{src:e.model.avatar,className:F.modelAvatarImg,alt:e.model.provider}),(r||c)&&n.jsxs("div",{className:F.modelName,children:["@",e.model.model||e.model.provider]})]})}const fo=()=>n.jsx("div",{className:F.homeModels,onMouseLeave:Oe,children:K.filter(e=>!Rt.includes(e.provider)).map(e=>n.jsx(po,{model:e},e.model))}),te=[{name:"Serial Mode",title:"Toggle between serial and parallel mode",description:"Serial mode will send your message to one bot each time."},{name:"Parallel Mode",title:"Toggle between serial and parallel mode",description:"Parallel mode will send your message to all bots at once."}],_o=""+new URL("send-5bb2204f.png",import.meta.url).href,xo="_home-prompt-wrapper_1o1fz_1",Ao="_prompt_1o1fz_29",vo="_prompt-trash_1o1fz_36",bo="_prompt-operation_1o1fz_40",yo="_chosen-prompt_1o1fz_45",wo="_model-item_1o1fz_49",ko="_model-avatar_1o1fz_54",Lo="_home-input-wrapper_1o1fz_60",Co="_prompt-editor_1o1fz_78",So="_model-name-list_1o1fz_85",jo="_model-name_1o1fz_85",Ro="_empty-editor_1o1fz_97",Mo="_backup-textarea_1o1fz_144",Bo="_submit-btn_1o1fz_150",Eo="_prompt-clip_1o1fz_154",S={"home-prompt-wrapper":"_home-prompt-wrapper_1o1fz_1",homePromptWrapper:xo,prompt:Ao,"prompt-trash":"_prompt-trash_1o1fz_36",promptTrash:vo,"prompt-operation":"_prompt-operation_1o1fz_40",promptOperation:bo,"chosen-prompt":"_chosen-prompt_1o1fz_45",chosenPrompt:yo,"model-item":"_model-item_1o1fz_49",modelItem:wo,"model-avatar":"_model-avatar_1o1fz_54",modelAvatar:ko,"home-input-wrapper":"_home-input-wrapper_1o1fz_60",homeInputWrapper:Lo,"prompt-editor":"_prompt-editor_1o1fz_78",promptEditor:Co,"model-name-list":"_model-name-list_1o1fz_85",modelNameList:So,"model-name":"_model-name_1o1fz_85",modelName:jo,"empty-editor":"_empty-editor_1o1fz_97",emptyEditor:Ro,"backup-textarea":"_backup-textarea_1o1fz_144",backupTextarea:Mo,"submit-btn":"_submit-btn_1o1fz_150",submitBtn:Bo,"prompt-clip":"_prompt-clip_1o1fz_154",promptClip:Eo},se={default:"Press # to toggle chat mode, and ENTER to send",google:"Google does not support Chinese"},No=()=>{const e=J(),t=le(),s=B(),o=React.useRef(null),a=React.useRef(null),[r,i]=React.useState(te),[c,_]=React.useState(!1),[A,u]=React.useState(""),[f,m]=React.useState(null),[v,C]=React.useState(0),[N,w]=React.useState(""),[G,H]=React.useState(se.default),[d,g]=React.useState(""),[b,Pe]=React.useState(0),[Y,de]=React.useState(!1),[ze,me]=React.useState(!0),$=h=>(h=h.replace(/.*?<\/span>/g,""),a.current.innerHTML=h,a.current.innerText||""),T=(h,p=!0)=>{if(h===d)return;const k={allowedTags:["b","i","a","p","text","br","div","span","img"],allowedAttributes:{a:["href"],span:["class","id"],img:["src"],div:["class","id"]}};if(p){const He=Ut(o.current);Pe(He)}g(wt(h,k))},ge=h=>{h.name==="Serial Mode"?(s.updateMode(q),M.success("Change to serial mode!"),T("")):h.name==="Parallel Mode"?(s.updateMode(X),M.success("Change to parallel mode!"),T("")):(m(h),T("")),u(""),_(!1),w("")},ue=()=>{if(A.trim())if(u(""),T(""),s.mode===q){const h=K.find(p=>p.model===t.currentBot).provider;e.onUserInput(A,h,t.currentBot,U)}else t.chosenBotNames.forEach(h=>{const p=K.find(k=>k.model===h).provider;e.onUserInput(A,p,h,h)})},qe=h=>{const p=h.key;if(!Y){if(p==="Enter"&&!h.shiftKey){if(h.preventDefault(),A.trim()){if(c){ge(r[v]);return}ue()}me(!0)}if(p==="#"&&!c&&_(!0),c){const k=r.length-1;p==="ArrowUp"?(C(v===0?k:v-1),h.preventDefault()):p==="ArrowDown"?(C(v===k?0:v+1),h.preventDefault()):p==="Backspace"&&A.slice(-1)==="#"&&(_(!1),w(""))}c&&p==="Escape"&&_(!1)}},Ue=h=>{if(Y)return;const p=h.target;console.log($(p.innerHTML),p.innerHTML),u($(p.innerHTML));const k=p.innerHTML;T(k)},De=h=>{if(me(!h.target.textContent.length),Y)return;const p=h.target;u($(p.innerHTML));const k=p.innerHTML;T(k)};return React.useEffect(()=>{const h=te.filter(p=>p.name.toLowerCase().includes(N.toLowerCase()));C(0),h.length===0?(_(!1),i(te)):i(h)},[N]),React.useEffect(()=>{c&&w(A.split("#").slice(-1)[0])},[A]),React.useEffect(()=>{H(f?f.description:se[t.currentBot]||se.default)},[f,t.currentBot]),React.useLayoutEffect(()=>{o.current&&Dt(o.current,b)},[d]),n.jsxs(n.Fragment,{children:[n.jsxs("div",{className:S.homeInputWrapper,children:[c&&n.jsx("div",{className:S.homePromptWrapper,children:r.map((h,p)=>n.jsx("div",{className:ae(S.prompt,{[S.chosenPrompt]:p===v}),...E(()=>ge(h)),children:n.jsx("div",{className:S.modelItem,children:h.name})},h.name))}),f&&n.jsxs("div",{className:S.modelName,children:["#",f.name]}),n.jsx("div",{contentEditable:!0,spellCheck:!0,ref:o,id:"prompt-textarea",className:ae(S.promptEditor,{[S.emptyEditor]:ze}),"data-text":G,onKeyDown:qe,onKeyUp:Ue,onCompositionStart:()=>de(!0),onInput:De,onCompositionEnd:()=>de(!1),dangerouslySetInnerHTML:{__html:d}}),n.jsx("img",{className:S.promptClip,src:_o,alt:"send-message",...E(ue)})]}),n.jsx("div",{ref:a,style:{opacity:0,display:"hidden",position:"fixed",fontSize:0}})]})},Io="_loading-icon_1yjma_1",To="_aoe_1yjma_1",Oo="_home-loading_1yjma_6",Ce={"loading-icon":"_loading-icon_1yjma_1",loadingIcon:Io,aoe:To,"home-loading":"_home-loading_1yjma_6",homeLoading:Oo},Po=()=>n.jsx("div",{className:Ce.homeLoading,children:n.jsx("div",{className:Ce.loadingIcon})}),zo="_home_1tmut_1",qo="_home-chats_1tmut_5",Uo="_homeModal_1tmut_10",Se={home:zo,"home-chats":"_home-chats_1tmut_5",homeChats:qo,homeModal:Uo},Do=()=>{const[e,t]=React.useState(!1);return React.useEffect(()=>{setTimeout(()=>{t(!0)},1500)},[]),e},Ho=()=>Do()?n.jsxs("div",{className:Se.home,children:[n.jsx("div",{className:Se.homeChats,children:n.jsx(io,{})}),n.jsx(No,{}),n.jsx(fo,{})]}):n.jsx(Po,{}),Vo=()=>n.jsx(kt,{children:n.jsx(Lt,{children:n.jsx(Ct,{path:"/",element:n.jsx(Ho,{})})})}),Fo={welcome:"欢迎,感恩",hello:"嗨",hi:"你好",loading:"Loading"},Qo={...Fo},Ko={welcome:"Welcome, grateful",hello:"Hi",hi:"Hello",loading:"Loading"},Go={...Ko},Wo={"zh-CN":Qo,"en-US":Go};function Zo(e){}const Xo={locale:Q(),setLocale:Zo},Jo=React.createContext(Xo),Yo=({children:e})=>{const[t,s]=React.useState(Q()),o=React.useCallback(r=>{s(r),Pt(r)},[]),a=React.useMemo(()=>({locale:t,setLocale:o}),[t,o]);return n.jsx(St,{locale:t,messages:Wo[t],children:n.jsx(Jo.Provider,{value:a,children:e})})},$o=""+new URL("AOE-b98456c3.svg",import.meta.url).href,ea="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAEKSURBVHgBtVWLDYIwEH1RB2CEbuAKbqAbgBOoE+AGjIAboRPABrIBcnLE2vRqD9OXvJCUd196xxo6FCO3Ix9IhIEZjRUSww2QYWqDEfQd0weyPfBTBAmoBW0giA+Gbcg2DwkzS1hbZ1frnNjwe8OaSpOYYYMdpnY9Lccu6d2ZtTV0Vb8Nh0jmUML8yNxXSaYJUCuczyyhQLMgQCs5KzyiYSGB79uWJ59kCXYWsWx8jqQKbtDjrhHTldNeUwMlCkWAk+TE1yKDaQ66kZeRPWT0nAj9gCpE7qH5A1dOQHs2SFPiM721dR6c6AL/r+t9SJixQMqihTyxBtPSU+0kF/bERiH5JG+gwxHKCl5qY6X0Tnl2NgAAAABJRU5ErkJggg==",ta="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAFkSURBVHgB7VTLcYNADNViF+CL+dxIB6QDXEHSQZxK7HSQDhJ34A4gHdAB3PgMBxfAJ08Tx7NZWDA4R7+ZndFqJT2BPkR3jECMGaRp6huG8dK2rY+rixNCfnUcJ6ErIAYCu0KID4j+xViIvWVZbzQBvQRFUXjIMsBZ3RKcsVQVnLkaHPIJ50Az0CFApn+Cn3WhbdsJzYAhX/I8f6afQqqkEc2EodyfNHYu/ROBp7HT6TvgGmoJ8O97A7Ge54GuAGZmpyUYAs+Emp0KvO+RzHaIING7Ew9eUJZlp05xHK+yLHvH+05tiKWSZahmoJJUVXVEsIgD8XyciX2ptfUETdMcYLylcXhyvSBfHhaLxVE27KwKZBeQtH8mIsFAPsiKTpF5U+IrTjQR7APfjarvEPAahvFmCgnbsk/fCu9tU9M0I9TjkYa76hch27JPL/mYN7dlXde8o+TC8leGGKrP9Xr9RXfcgm+bjqOGex62UQAAAABJRU5ErkJggg==",sa="_header_1iqh2_1",oa="_header-title_1iqh2_11",aa="_header-operation_1iqh2_22",na="_light-theme_1iqh2_25",ra="_dark-theme_1iqh2_36",ia="_animate-light_1iqh2_47",ca="_animate-dark_1iqh2_51",j={header:sa,"header-title":"_header-title_1iqh2_11",headerTitle:oa,"header-operation":"_header-operation_1iqh2_22",headerOperation:aa,"light-theme":"_light-theme_1iqh2_25",lightTheme:na,"dark-theme":"_dark-theme_1iqh2_36",darkTheme:ra,"animate-light":"_animate-light_1iqh2_47",animateLight:ia,"animate-dark":"_animate-dark_1iqh2_51",animateDark:ca},la=()=>{const e=React.useRef(null),t=React.useRef(null),[s,o]=React.useState(!1),a=B(),r=()=>{window.location.href="/"},i=(c="")=>{setTimeout(()=>{a.updateTheme(c||a.theme==="light"?"dark":"light")},200)};return React.useEffect(()=>{},[a.theme]),React.useEffect(()=>{document.body.setAttribute("data-theme",a.theme),e.current&&t.current&&(a.theme==="light"?(e.current.classList.remove(j.animateLight),t.current.classList.remove(j.animateDark)):a.theme==="dark"&&(e.current.classList.add(j.animateLight),t.current.classList.add(j.animateDark)))},[a.theme,s]),n.jsxs("div",{className:j.header,children:[n.jsx("div",{className:j.headerTitle,onClick:r,children:n.jsx("img",{src:$o,alt:"AOE_LOGO"})}),n.jsxs("div",{className:j.headerOperation,onClick:()=>i(),children:[n.jsx("span",{ref:e,className:j.lightTheme,children:n.jsx("img",{src:ea,alt:"sun",onLoad:()=>o(!s)})}),n.jsx("span",{ref:t,className:j.darkTheme,children:n.jsx("img",{src:ta,alt:"moon",onLoad:()=>o(!s)})})]})]})};const da=()=>n.jsxs(Yo,{children:[n.jsx(la,{}),n.jsx(Vo,{})]});jt.createRoot(document.getElementById("root")).render(n.jsx(da,{})); diff --git a/openaoe/frontend/dist/assets/internlm-7cc58d2e.svg b/openaoe/frontend/dist/assets/internlm-7cc58d2e.svg deleted file mode 100644 index 1d507a5..0000000 --- a/openaoe/frontend/dist/assets/internlm-7cc58d2e.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openaoe/frontend/dist/assets/minimax-6a0e4e4d.png b/openaoe/frontend/dist/assets/minimax-6a0e4e4d.png deleted file mode 100644 index 4e47b0b..0000000 Binary files a/openaoe/frontend/dist/assets/minimax-6a0e4e4d.png and /dev/null differ diff --git a/openaoe/frontend/dist/assets/openai-6f4a287b.svg b/openaoe/frontend/dist/assets/openai-6f4a287b.svg deleted file mode 100644 index 6342d54..0000000 --- a/openaoe/frontend/dist/assets/openai-6f4a287b.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/openaoe/frontend/dist/assets/spark-7fb32fd7.svg b/openaoe/frontend/dist/assets/spark-7fb32fd7.svg deleted file mode 100644 index 45275b1..0000000 --- a/openaoe/frontend/dist/assets/spark-7fb32fd7.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/openaoe/frontend/dist/index.html b/openaoe/frontend/dist/index.html index cece62e..c05a1d4 100644 --- a/openaoe/frontend/dist/index.html +++ b/openaoe/frontend/dist/index.html @@ -32,7 +32,7 @@ } } - + diff --git a/openaoe/frontend/src/app.tsx b/openaoe/frontend/src/app.tsx index 53786db..e2dddd2 100644 --- a/openaoe/frontend/src/app.tsx +++ b/openaoe/frontend/src/app.tsx @@ -1,4 +1,5 @@ import RootRouter from '@routes/root.tsx'; +import GlobalConfig from '@components/global-config'; import { GlobalLang } from '@/components/global-lang'; import Header from '@/layout/header/header.tsx'; import './styles/index.less'; @@ -6,10 +7,12 @@ import 'sea-lion-ui/dist/index.css'; const App = () => { return ( - -
- - + + +
+ + + ); }; diff --git a/openaoe/frontend/src/components/global-config/global-config-context.tsx b/openaoe/frontend/src/components/global-config/global-config-context.tsx new file mode 100644 index 0000000..700d382 --- /dev/null +++ b/openaoe/frontend/src/components/global-config/global-config-context.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +export const DefaultConfigInfo = { + models: null, +}; + +export const GlobalConfigContext = React.createContext(DefaultConfigInfo); diff --git a/openaoe/frontend/src/components/global-config/global-config.tsx b/openaoe/frontend/src/components/global-config/global-config.tsx new file mode 100644 index 0000000..86685a3 --- /dev/null +++ b/openaoe/frontend/src/components/global-config/global-config.tsx @@ -0,0 +1,43 @@ +import { + FC, ReactNode, useEffect, useMemo, useState +} from 'react'; +import { GlobalConfigContext } from '@components/global-config/global-config-context.tsx'; +import { models as defaultModels } from '@config/model-config.ts'; + +export interface GlobalInfoProps { + children?: ReactNode; +} + +const GlobalConfig: FC = ({ children }) => { + const [models, setModels] = useState(defaultModels); + const [loading, setLoading] = useState(true); + + useEffect(() => { + setLoading(true); + fetch('/config/json') + .then(res => res.json()) + .then(res => { + if (res && res.models) { + setModels(res.models); + } + }) + .catch(err => { + console.log(err); + }) + .finally(() => { + setLoading(false); + }); + }, []); + + const values = useMemo(() => ({ + models + }), [models]); + + return ( + + {!loading && children} + + ); +}; + +export default GlobalConfig; diff --git a/openaoe/frontend/src/components/global-config/index.tsx b/openaoe/frontend/src/components/global-config/index.tsx new file mode 100644 index 0000000..3ca5321 --- /dev/null +++ b/openaoe/frontend/src/components/global-config/index.tsx @@ -0,0 +1,3 @@ +import GlobalConfig from './global-config.tsx'; + +export default GlobalConfig; diff --git a/openaoe/frontend/src/config/model-config.ts b/openaoe/frontend/src/config/model-config.ts index 816fa84..3e5fd00 100644 --- a/openaoe/frontend/src/config/model-config.ts +++ b/openaoe/frontend/src/config/model-config.ts @@ -1,87 +1,78 @@ -import internlm from '@assets/imgs/internlm.svg'; -import openai from '@assets/imgs/openai.svg'; -import claude from '@assets/imgs/claude.svg'; -import google from '@assets/imgs/google-palm.webp'; -import minimax from '@assets/imgs/minimax.png'; -import spark from '@assets/imgs/spark.svg'; import admin from '@assets/imgs/A.svg'; -import { BotState } from '@/store/bot.ts'; -/** - * You can add more models here. - * Models used to be showed in the model selection part. - * provider is required - * model is required and must be unique - * */ -export const ALL_MODELS: BotState[] = [ - { +export const USER_INFO = { + provider: 'user', + model: 'user', + avatar: 'user.png', + border: '#71e875', + background: '#71e875', +}; + +export const ADMIN_INFO = { + provider: 'admin', + model: 'admin', + avatar: admin, + border: '#4e6ef2', + background: 'linear-gradient(rgb(255 255 255 / 80%) 0%, rgb(168 245 179) 100%)', +}; + +export const models = { + 'internlm-chat-7b': { provider: 'internlm', - model: 'internlm-chat-7b', - avatar: internlm, - border: 'rgba(1,52,220,0.85)', - background: 'linear-gradient(rgb(3 26 108 / 85%) 0%, rgb(29 60 161 / 85%) 100%)', + webui: { + avatar: 'https://oss.openmmlab.com/frontend/OpenAOE/internlm.svg', + background: 'linear-gradient(rgb(3 26 108 / 85%) 0%, rgb(29 60 161 / 85%) 100%)', + }, }, - { + 'gpt-3.5-turbo': { provider: 'openai', - model: 'gpt-3.5-turbo', - avatar: openai, - border: '#1a8d15', - background: 'linear-gradient(180deg, rgba(156, 206, 116, 0.15) 0%, #1a8d15 100%)', + webui: { + avatar: 'https://oss.openmmlab.com/frontend/OpenAOE/openai.svg', + background: 'linear-gradient(180deg, rgba(156, 206, 116, 0.15) 0%, #1a8d15 100%)', + } }, - { + 'gpt-4': { provider: 'openai', - model: 'gpt-4', - avatar: openai, - border: '#4dd547', - background: 'linear-gradient(180deg, rgba(156, 206, 116, 0.15) 0%, #08be00 100%)', + webui: { + avatar: 'https://oss.openmmlab.com/frontend/OpenAOE/openai.svg', + background: 'linear-gradient(180deg, rgba(156, 206, 116, 0.15) 0%, #08be00 100%)', + } }, - { + 'claude-1': { provider: 'claude', - model: 'claude-1', - avatar: claude, - border: '#8550ca', - background: 'linear-gradient(180deg, rgba(141, 90, 181, 0.15) 0%, rgba(106, 39, 123, 0.7) 53.12%, #663E9A 100%)', + webui: { + avatar: 'https://oss.openmmlab.com/frontend/OpenAOE/claude.svg', + background: 'linear-gradient(180deg, rgba(141, 90, 181, 0.15) 0%, rgba(106, 39, 123, 0.7) 53.12%, #663E9A 100%)', + } }, - { + 'claude-1-100k': { provider: 'claude', - model: 'claude-1-100k', - avatar: claude, - border: '#8550ca', - background: 'linear-gradient(180deg, rgba(141, 90, 181, 0.15) 0%, rgba(106, 39, 123, 0.7) 53.12%, #663E9A 100%)', + webui: { + avatar: 'https://oss.openmmlab.com/frontend/OpenAOE/claude.svg', + background: 'linear-gradient(180deg, rgba(141, 90, 181, 0.15) 0%, rgba(106, 39, 123, 0.7) 53.12%, #663E9A 100%)', + } }, - { + 'chat-bison-001': { provider: 'google', - model: 'chat-bison-001', - avatar: google, - border: '#ff85c7', - background: 'linear-gradient(180deg, rgba(181, 90, 90, 0.15) 0%, #fa5ab1 100%)', + webui: { + avatar: 'https://oss.openmmlab.com/frontend/OpenAOE/google-palm.webp', + isStream: false, + background: 'linear-gradient(180deg, rgba(181, 90, 90, 0.15) 0%, #fa5ab1 100%)', + } }, - { + 'abab5-chat': { provider: 'minimax', - model: 'abab5-chat', - avatar: minimax, - border: '#be1313', - background: 'linear-gradient(180deg, rgba(207, 72, 72, 0.15) 0%, rgba(151, 43, 43, 0.7) 53.12%, #742828 100%)', + webui: { + avatar: 'https://oss.openmmlab.com/frontend/OpenAOE/minimax.png', + background: 'linear-gradient(180deg, rgba(207, 72, 72, 0.15) 0%, rgba(151, 43, 43, 0.7) 53.12%, #742828 100%)', + } }, - { + spark: { provider: 'spark', - model: 'spark', - avatar: spark, - border: '#6fa2db', - background: 'linear-gradient(180deg, rgba(72, 72, 207, 0.15) 0%, #7498be 100%)', - }, - { - provider: 'admin', - model: 'admin', - avatar: admin, - border: '#4e6ef2', - background: 'linear-gradient(rgb(255 255 255 / 80%) 0%, rgb(168 245 179) 100%)', - }, - { - provider: 'user', - model: 'user', - avatar: 'user.png', - border: '#71e875', - background: '#71e875', + webui: { + avatar: 'https://oss.openmmlab.com/frontend/OpenAOE/spark.svg', + isStream: false, + background: 'linear-gradient(180deg, rgba(72, 72, 207, 0.15) 0%, #7498be 100%)', + } }, -]; +}; diff --git a/openaoe/frontend/src/constants/models.ts b/openaoe/frontend/src/constants/models.ts index 4c1f96c..edff56d 100644 --- a/openaoe/frontend/src/constants/models.ts +++ b/openaoe/frontend/src/constants/models.ts @@ -5,5 +5,6 @@ export const PARALLEL_MODE = 'parallel'; export const SERIAL_SESSION = 'serial_session'; export const PARALLEL_MODEL_MAX = 3; export const DEFAULT_BOT = 'gpt-3.5-turbo'; +export const DEFAULT_PROVIDER = 'openai'; export const BASE_IMG_URL = 'https://oss.openmmlab.com/alles-bot/'; export const STREAM_BOT = ['openai', 'minimax', 'claude', 'gpt-4', 'internlm']; diff --git a/openaoe/frontend/src/pages/chat/components/chat-operations/chat-operation.tsx b/openaoe/frontend/src/pages/chat/components/chat-operations/chat-operation.tsx index 35cce61..290e779 100644 --- a/openaoe/frontend/src/pages/chat/components/chat-operations/chat-operation.tsx +++ b/openaoe/frontend/src/pages/chat/components/chat-operations/chat-operation.tsx @@ -1,7 +1,8 @@ import { Tooltip } from 'sea-lion-ui'; import { getNeedEventCallback, scrollToBottom } from '@utils/utils.ts'; import { BASE_IMG_URL, CLEAR_CONTEXT, SERIAL_SESSION } from '@constants/models.ts'; -import React, { useEffect } from 'react'; +import React, { useContext, useEffect } from 'react'; +import { GlobalConfigContext } from '@components/global-config/global-config-context.tsx'; import styles from './chat-operation.module.less'; import { useConfigStore } from '@/store/config.ts'; import { createMessage, useChatStore } from '@/store/chat.ts'; @@ -120,6 +121,7 @@ const RetryIcon = () => { ); }; const ChatOperation = (props: ChatOperationProps) => { + const { models } = useContext(GlobalConfigContext); const { modelName } = props; const chatStore = useChatStore(); const { sessions } = chatStore; @@ -160,6 +162,12 @@ const ChatOperation = (props: ChatOperationProps) => { chatStore.closeController(modelName); }; + const handleRetry = () => { + const model = currSession.name === SERIAL_SESSION ? botStore.currentBot : chatStore.lastBotMessage(currSession.name).model; + const provider = models[model]?.provider || ''; + chatStore.retry(currSession.name, provider, model); + }; + useEffect(() => { return () => { // when component unmount, stop non-stop stream request @@ -196,7 +204,7 @@ const ChatOperation = (props: ChatOperationProps) => {
chatStore.retry(currSession.name, currSession.name === SERIAL_SESSION && botStore.currentBot))} + {...getNeedEventCallback(handleRetry)} >
diff --git a/openaoe/frontend/src/pages/chat/components/chat/chat.tsx b/openaoe/frontend/src/pages/chat/components/chat/chat.tsx index bcbbe21..eed93ed 100644 --- a/openaoe/frontend/src/pages/chat/components/chat/chat.tsx +++ b/openaoe/frontend/src/pages/chat/components/chat/chat.tsx @@ -1,4 +1,6 @@ -import React, { useEffect, useRef, useState } from 'react'; +import React, { + useContext, useEffect, useRef, useState +} from 'react'; import classNames from 'classnames'; import ReactMarkdown from 'react-markdown'; import 'katex/dist/katex.min.css'; @@ -14,8 +16,9 @@ import { autoScroll, getNeedEventCallback } from '@utils/utils.ts'; import { CLEAR_CONTEXT, PARALLEL_MODE, SERIAL_MODE, SERIAL_SESSION } from '@constants/models.ts'; -import { ALL_MODELS } from '@config/model-config.ts'; +import { ADMIN_INFO, USER_INFO } from '@config/model-config.ts'; import ChatOperation from '@pages/chat/components/chat-operations/chat-operation.tsx'; +import { GlobalConfigContext } from '@components/global-config/global-config-context.tsx'; import { useChatStore, ChatMessage as ChatMessageProps, ChatSession as ChatSessionProps } from '@/store/chat.ts'; import styles from './chat.module.less'; import { useConfigStore } from '@/store/config.ts'; @@ -74,18 +77,31 @@ const RunningMario = () => { return
; }; function ChatMessage(props: { message: ChatMessageProps, sessionInfo: {id: number, name: string, bot: string} }) { + const { models } = useContext(GlobalConfigContext); const [showDate, setShowDate] = useState(false); const { message } = props; const isUser = message.sender_type === 'user' || message.provider === 'user'; + const isAdmin = message.sender_type === 'admin' || message.provider === 'admin'; + const isClear = message.sender_type === CLEAR_CONTEXT; const className = classNames( styles.messageWrapper, isUser ? styles.chatUser : styles.chatBot, ); const configStore = useConfigStore(); - const model = ALL_MODELS.find((m) => m.model === (message.model || 'user')); + const getModel = () => { + if (isUser) { + return USER_INFO; + } + if (isAdmin) { + return ADMIN_INFO; + } + return models[message.model]; + }; + + const model = getModel(); - if (!model) { + if (!isClear && !model) { return null; } @@ -96,16 +112,16 @@ function ChatMessage(props: { message: ChatMessageProps, sessionInfo: {id: numbe onMouseEnter={() => setShowDate(true)} onMouseLeave={() => setShowDate(false)} > - {(message.sender_type === CLEAR_CONTEXT) ? ( + {(isClear) ? (
Context cleared
) : ( <> {!isMobile && !isUser && ( -
+
{model.model} @@ -119,7 +135,7 @@ function ChatMessage(props: { message: ChatMessageProps, sessionInfo: {id: numbe {message.stream && } {!isUser && (
- {`${model.provider} - ${model.model}`} + {`${model.provider} - ${message.model}`}
)} {!isMobile && isUser && ( -
+
ME
)} @@ -196,6 +212,7 @@ function ChatSession(props: { session: ChatSessionProps }) { } const ChatPage: React.FC = () => { + const { models } = useContext(GlobalConfigContext); const chatStore = useChatStore(); const configStore = useConfigStore(); const { sessions } = chatStore; @@ -210,7 +227,7 @@ const ChatPage: React.FC = () => { return null; } // If this session belongs to a non-exist model, remove this session - if (configStore.mode === PARALLEL_MODE && !ALL_MODELS.find((model) => model.model === session.name)) { + if (configStore.mode === PARALLEL_MODE && !models[session.name]) { chatStore.removeSession(session.name); return null; } diff --git a/openaoe/frontend/src/pages/chat/components/model-list/model-list.tsx b/openaoe/frontend/src/pages/chat/components/model-list/model-list.tsx index 09a69ec..3fea9c8 100644 --- a/openaoe/frontend/src/pages/chat/components/model-list/model-list.tsx +++ b/openaoe/frontend/src/pages/chat/components/model-list/model-list.tsx @@ -1,10 +1,10 @@ import { - NON_BOT, PARALLEL_MODE, PARALLEL_MODEL_MAX, SERIAL_MODE + PARALLEL_MODE, PARALLEL_MODEL_MAX, SERIAL_MODE } from '@constants/models.ts'; -import { ALL_MODELS } from '@config/model-config.ts'; -import { useRef, useState } from 'react'; +import { useContext, useRef, useState } from 'react'; import { getNeedEventCallback } from '@utils/utils.ts'; import { message } from 'sea-lion-ui'; +import { GlobalConfigContext } from '@components/global-config/global-config-context.tsx'; import styles from './model-list.module.less'; import { BotState, useBotStore } from '@/store/bot.ts'; import { useChatStore } from '@/store/chat.ts'; @@ -90,7 +90,7 @@ function ModelAvatar(props: { onFocus={() => setShowName(true)} > {props.model.provider} @@ -105,15 +105,17 @@ function ModelAvatar(props: { } const ModelList = () => { + const { models } = useContext(GlobalConfigContext); return (
- {ALL_MODELS - .filter((model) => (!NON_BOT.includes(model.provider))) - .map((model) => { - return ( - - ); - })} + {models && Object.keys(models).map((modelName) => { + return ( + + ); + })}
); }; diff --git a/openaoe/frontend/src/pages/chat/components/prompt-input/prompt-input.tsx b/openaoe/frontend/src/pages/chat/components/prompt-input/prompt-input.tsx index 31d390c..48fcf54 100644 --- a/openaoe/frontend/src/pages/chat/components/prompt-input/prompt-input.tsx +++ b/openaoe/frontend/src/pages/chat/components/prompt-input/prompt-input.tsx @@ -1,9 +1,9 @@ import { PARALLEL_MODE, SERIAL_MODE, SERIAL_SESSION } from '@constants/models.ts'; -import { ALL_MODELS } from '@config/model-config.ts'; import { message } from 'sea-lion-ui'; import React, { + useContext, useEffect, useLayoutEffect, useState } from 'react'; import { @@ -13,6 +13,7 @@ import { Configs, ConfigState } from '@constants/configs.ts'; import classNames from 'classnames'; import send from '@assets/imgs/send.png'; import sanitizeHtml from 'sanitize-html'; +import { GlobalConfigContext } from '@components/global-config/global-config-context.tsx'; import { useChatStore } from '@/store/chat.ts'; import { useBotStore } from '@/store/bot.ts'; import { useConfigStore } from '@/store/config.ts'; @@ -24,6 +25,7 @@ const BOT_PLACEHOLDER = { }; const PromptInput = () => { + const { models } = useContext(GlobalConfigContext); const chatStore = useChatStore(); const botStore = useBotStore(); const configStore = useConfigStore(); @@ -105,11 +107,11 @@ const PromptInput = () => { setCurrPrompt(''); handleContentChange(''); if (configStore.mode === SERIAL_MODE) { - const provider = ALL_MODELS.find((model) => model.model === botStore.currentBot).provider; + const provider = models[botStore.currentBot]?.provider; chatStore.onUserInput(currPrompt, provider, botStore.currentBot, SERIAL_SESSION); } else { botStore.chosenBotNames.forEach((botName) => { - const provider = ALL_MODELS.find((model) => model.model === botName).provider; + const provider = models[botName]?.provider; chatStore.onUserInput(currPrompt, provider, botName, botName); }); } diff --git a/openaoe/frontend/src/services/fetch.ts b/openaoe/frontend/src/services/fetch.ts index 6b51d2b..0a52245 100644 --- a/openaoe/frontend/src/services/fetch.ts +++ b/openaoe/frontend/src/services/fetch.ts @@ -1,5 +1,5 @@ import API from '@config/api-config'; -import { DEFAULT_BOT } from '@constants/models'; +import { DEFAULT_PROVIDER } from '@constants/models'; export const getHeaders = () => { return { @@ -7,7 +7,7 @@ export const getHeaders = () => { }; }; export const getUrl = (provider) => { - return API.get(provider)?.url || API.get(DEFAULT_BOT).url; + return API.get(provider)?.url || API.get(DEFAULT_PROVIDER).url; }; /** Build your own api payload here * @param provider service provider, each provider has its own payload format and may have more than one model @@ -16,7 +16,7 @@ export const getUrl = (provider) => { * @param messages */ export const getPayload = (provider: string, model: string, prompt: string, messages: { text: string; sender_type: string; }[]) => { - const payload = { ...API.get(provider) || API.get(DEFAULT_BOT) }; + const payload = { ...API.get(provider) || API.get(DEFAULT_PROVIDER) }; delete payload.url; payload.model = model; if (['openai', 'internlm', 'gpt-4'].includes(provider)) { diff --git a/openaoe/frontend/src/store/bot.ts b/openaoe/frontend/src/store/bot.ts index 52c442b..adc0d15 100644 --- a/openaoe/frontend/src/store/bot.ts +++ b/openaoe/frontend/src/store/bot.ts @@ -4,10 +4,12 @@ import { DEFAULT_BOT } from '@constants/models.ts'; export interface BotState { provider: string; - avatar: string; model: string; - background: string; - border?: string; + webui: { + avatar: string; + background: string; + border?: string; + }, description?: string; url?: string; } diff --git a/openaoe/frontend/src/store/chat.ts b/openaoe/frontend/src/store/chat.ts index 9e6510d..3322644 100644 --- a/openaoe/frontend/src/store/chat.ts +++ b/openaoe/frontend/src/store/chat.ts @@ -5,7 +5,6 @@ import { scrollToBottom } from '@utils/utils.ts'; import { getHeaders, getPayload, getUrl } from '@services/fetch.ts'; import { fetchBotAnswer } from '@services/home.ts'; import { DEFAULT_BOT, SERIAL_SESSION, STREAM_BOT } from '@constants/models.ts'; -import { ALL_MODELS } from '@config/model-config.ts'; export interface ChatMessage { text: string; @@ -69,7 +68,7 @@ interface ChatStore { lastBotMessage: (sessionName: string) => ChatMessage; lastUserMessage: (sessionName: string) => ChatMessage; closeController: (sessionName: string) => void; - retry: (sessionName: string, model?: string) => void; + retry: (sessionName: string, provider: string, model: string,) => void; clearAllData: () => void; } @@ -127,9 +126,7 @@ export const useChatStore = create()( set(() => ({ sessions: get().sessions })); } }, - retry(bot: '', model: '') { - const modelName = model || get().lastBotMessage(bot).model || ''; - const provider = ALL_MODELS.find((bot) => bot.model === modelName).provider; + retry(bot: '', provider: '', model: '') { const text = get().lastUserMessage(bot).text; if ((get().lastMessage(bot).id === get().lastBotMessage(bot).id) && get().getSession(bot).clearContextIndex !== get().getSession(bot).messages.length) { // If the last message is a reply from the bot and the context is not cleared yet, replace the last two messages, @@ -137,7 +134,7 @@ export const useChatStore = create()( get().deleteMessage(bot, get().getSession(bot).messages.length - 1); get().deleteMessage(bot, get().getSession(bot).messages.length - 1); } - get().onUserInput(text, provider, modelName, bot); + get().onUserInput(text, provider, model, bot); }, async onUserInput(text, provider, model, sessionName) { const sessionIndex = get().sessions.findIndex((session) => session.name === sessionName); @@ -279,7 +276,7 @@ export const useChatStore = create()( } }, onerror(e) { - console.log('[BOT] request error: ', e); + console.log(`[BOT] request error from ${model}: \n`, e); botMessage.stream = false; get().updateMessage(sessionIndex, messageIndex, (message) => { message.stream = botMessage.stream; diff --git a/openaoe/main.py b/openaoe/main.py index 71d2b10..59f4319 100644 --- a/openaoe/main.py +++ b/openaoe/main.py @@ -16,6 +16,7 @@ from openaoe.backend.util.log import log from openaoe.backend.util.str_util import safe_join + logger = log(__name__) # define global variable API_VER = 'v1' @@ -26,11 +27,16 @@ path = img_out_path() # init configuration content -init_config() +biz_config = init_config() app = FastAPI() +@app.get("/config/json") +async def get_config_json(): + return biz_config.json + + @app.get("/", response_class=HTMLResponse) @app.get("/home", response_class=HTMLResponse) async def server():