bugfix
This commit is contained in:
parent
7008c9c88e
commit
b807c1efba
0
app/README.md
Normal file
0
app/README.md
Normal file
BIN
app/__pycache__/asyncproxy.cpython-310.pyc
Normal file
BIN
app/__pycache__/asyncproxy.cpython-310.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/const.cpython-310.pyc
Normal file
BIN
app/__pycache__/const.cpython-310.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/ext.cpython-310.pyc
Normal file
BIN
app/__pycache__/ext.cpython-310.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/llm_client.cpython-310.pyc
Normal file
BIN
app/__pycache__/llm_client.cpython-310.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/rf.cpython-310.pyc
Normal file
BIN
app/__pycache__/rf.cpython-310.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/streamproxy.cpython-310.pyc
Normal file
BIN
app/__pycache__/streamproxy.cpython-310.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/syncproxy.cpython-310.pyc
Normal file
BIN
app/__pycache__/syncproxy.cpython-310.pyc
Normal file
Binary file not shown.
34
app/asr.py
Normal file
34
app/asr.py
Normal file
@ -0,0 +1,34 @@
|
||||
import os, sys
|
||||
import argparse
|
||||
from appPublic.log import MyLogger, info, debug, warning
|
||||
from appPublic.folderUtils import ProgramPath
|
||||
from appPublic.jsonConfig import getConfig
|
||||
from ahserver.configuredServer import ConfiguredServer
|
||||
import asr_engine
|
||||
|
||||
__version__ = '0.0.1'
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser(prog="Sage")
|
||||
parser.add_argument('-w', '--workdir')
|
||||
parser.add_argument('-p', '--port')
|
||||
args = parser.parse_args()
|
||||
workdir = args.workdir or os.getcwd()
|
||||
p = ProgramPath()
|
||||
config = getConfig(workdir, NS={'workdir':workdir, 'ProgramPath':p})
|
||||
if config.logger:
|
||||
logger = MyLogger(config.logger.name or 'sage',
|
||||
levelname=config.logger.levelname or 'debug',
|
||||
logfile=config.logger.logfile or None)
|
||||
else:
|
||||
logger = MyLogger('sage', levelname='debug')
|
||||
|
||||
info(f'========sage version={__version__}========')
|
||||
# server = ConfiguredServer(auth_klass=MyAuthAPI, workdir=workdir)
|
||||
server = ConfiguredServer(workdir=workdir)
|
||||
g = ServerEnv()
|
||||
g.whisper_model = WhisperBase64()
|
||||
port = args.port or config.website.port or 8080
|
||||
port = int(port)
|
||||
server.run(port=port)
|
||||
|
31
app/asr_engine.py
Normal file
31
app/asr_engine.py
Normal file
@ -0,0 +1,31 @@
|
||||
from ahserver.serverenv import ServerEnv
|
||||
from aiohttp.web import StreamResponse
|
||||
|
||||
from whisper.load_model import WhisperBase64
|
||||
|
||||
async def generate(request, **kw):
|
||||
model = kw.get('model', 'whisper')
|
||||
engine = None
|
||||
g = ServerEnv()
|
||||
if model=='whisper':
|
||||
engine = g.whisper_engine
|
||||
if engine is None:
|
||||
engine = WhisperBase64
|
||||
g.whisper_engine = engine
|
||||
|
||||
await resp.prepare(request)
|
||||
line = await request.content.readline()
|
||||
content = ''
|
||||
while line:
|
||||
txt = await engine.stt(line)
|
||||
content += txt
|
||||
d = json.dumps({'content':content})
|
||||
btxt = d.encode('utf8')
|
||||
await resp.write(btxt)
|
||||
await resp.drain()
|
||||
line = await request.content.readline()
|
||||
return resp
|
||||
|
||||
rf = RegisterFunction()
|
||||
rf.register('generate', generate)
|
||||
|
0
app/sensevoice/__init__.py
Normal file
0
app/sensevoice/__init__.py
Normal file
22
app/sensevoice/load_model.py
Normal file
22
app/sensevoice/load_model.py
Normal file
@ -0,0 +1,22 @@
|
||||
from ahserver.serverenv import ServerEnv
|
||||
from appPublic.worker import awaitify
|
||||
from appPublic.jsonConfig import getConfig, get_definition
|
||||
from funasr import AutoModel
|
||||
from funasr.utils.postprocess_utils import rich_transcription_postprocess
|
||||
|
||||
class SenseVoiceBase:
|
||||
def __init__(self):
|
||||
model_dir = get_definition('sensevoice_path')
|
||||
self.model = AutoModel(model=model_dir)
|
||||
|
||||
def _stt(self, x):
|
||||
pass
|
||||
stt = awaitify(_stt)
|
||||
|
||||
class SenseVoiceFile(SenseVoiceBase):
|
||||
def _stt(self, filepath):
|
||||
res = this.model.generate(input=filepath,language="auto",
|
||||
use_itn=True,
|
||||
batch_size_s=60
|
||||
)
|
||||
return rich_transcription_postprocess(res[0]["text"])
|
0
app/whisper/__init__.py
Normal file
0
app/whisper/__init__.py
Normal file
4
app/whisper/generate.dspy
Normal file
4
app/whisper/generate.dspy
Normal file
@ -0,0 +1,4 @@
|
||||
path = params_kw.get('audiofile')
|
||||
print(f'whisper.generate.dspy, {params_kw=}, {file_realpath=}, {stt_engine=}' )
|
||||
x = await stt_engine.stt(file_realpath(path))
|
||||
return x
|
45
app/whisper/load_model.py
Normal file
45
app/whisper/load_model.py
Normal file
@ -0,0 +1,45 @@
|
||||
from ahserver.serverenv import ServerEnv
|
||||
from appPublic.worker import awaitify
|
||||
from appPublic.jsonConfig import getConfig, get_definition
|
||||
import numpy as np
|
||||
import base64
|
||||
import whisper
|
||||
|
||||
# 编码
|
||||
def base64_encode(text):
|
||||
text_bytes = text.encode('utf-8')
|
||||
encoded_bytes = base64.b64encode(text_bytes)
|
||||
encoded_text = encoded_bytes.decode('utf-8')
|
||||
return encoded_text
|
||||
|
||||
# 解码
|
||||
def base64_decode(encoded_text):
|
||||
encoded_bytes = encoded_text.encode('utf-8')
|
||||
decoded_bytes = base64.b64decode(encoded_bytes)
|
||||
decoded_text = decoded_bytes.decode('utf-8')
|
||||
return decoded_text
|
||||
|
||||
class WhisperBase:
|
||||
def __init__(self):
|
||||
model_name = get_definition('whisper_model')
|
||||
self.model = whisper.load_model(model_name)
|
||||
|
||||
def _stt(self, filepath):
|
||||
pass
|
||||
|
||||
stt = awaitify(_stt)
|
||||
|
||||
class WhisperFile(WhisperBase):
|
||||
def _stt(self, filepath):
|
||||
return self.model.transcribe(filepath)
|
||||
|
||||
|
||||
class WhisperBase64(WhisperBase):
|
||||
def _stt(self, audio_base64):
|
||||
raw = base64.decode(audio_base64)
|
||||
ndarr = np.frombuffer(raw, dtype=np.float32)
|
||||
return self.model.transcribe(raw)
|
||||
|
||||
g = ServerEnv()
|
||||
g.whisper_engine = WhisperBase64()
|
||||
|
2
app/whisper/requirements.txt
Normal file
2
app/whisper/requirements.txt
Normal file
@ -0,0 +1,2 @@
|
||||
openai-whisper
|
||||
|
86
conf/config.json
Executable file
86
conf/config.json
Executable file
@ -0,0 +1,86 @@
|
||||
{
|
||||
"logger":{
|
||||
"name":"sage",
|
||||
"levelname":"info",
|
||||
"logfile":"$[workdir]$/logs/sage.log"
|
||||
},
|
||||
"definitions":{
|
||||
"whisper_model":"/d/ymq/osc/models/whisper/large-v3.pt"
|
||||
},
|
||||
"filesroot":"$[workdir]$/files",
|
||||
"databases":{
|
||||
"sage":{
|
||||
"driver":"aiomysql",
|
||||
"async_mode":true,
|
||||
"coding":"utf8",
|
||||
"maxconn":100,
|
||||
"dbname":"sage",
|
||||
"kwargs":{
|
||||
"user":"test",
|
||||
"db":"sage",
|
||||
"password":"QUZVcXg5V1p1STMybG5Ia6mX9D0v7+g=",
|
||||
"host":"localhost"
|
||||
}
|
||||
}
|
||||
},
|
||||
"website":{
|
||||
"paths":[
|
||||
["$[workdir]$/wwwroot",""]
|
||||
],
|
||||
"client_max_size":10000,
|
||||
"host":"0.0.0.0",
|
||||
"port":9091,
|
||||
"coding":"utf-8",
|
||||
"ssl_gg":{
|
||||
"crtfile":"$[workdir]$/conf/www.bsppo.com.pem",
|
||||
"keyfile":"$[workdir]$/conf/www.bsppo.com.key"
|
||||
},
|
||||
"indexes":[
|
||||
"index.html",
|
||||
"index.tmpl",
|
||||
"index.ui",
|
||||
"index.dspy",
|
||||
"index.md"
|
||||
],
|
||||
"startswiths":[
|
||||
{
|
||||
"leading":"/generate",
|
||||
"registerfunction":"generate"
|
||||
}
|
||||
],
|
||||
"processors":[
|
||||
[".ws","ws"],
|
||||
[".xterm","xterm"],
|
||||
[".proxy","proxy"],
|
||||
[".llm", "llm"],
|
||||
[".llms", "llms"],
|
||||
[".llma", "llma"],
|
||||
[".xlsxds","xlsxds"],
|
||||
[".sqlds","sqlds"],
|
||||
[".tmpl.js","tmpl"],
|
||||
[".tmpl.css","tmpl"],
|
||||
[".html.tmpl","tmpl"],
|
||||
[".bcrud", "bricks_crud"],
|
||||
[".tmpl","tmpl"],
|
||||
[".bui","bui"],
|
||||
[".ui","bui"],
|
||||
[".dspy","dspy"],
|
||||
[".md","md"]
|
||||
],
|
||||
"rsakey":{
|
||||
"privatekey":"$[workdir]$/conf/rsa_private_key.pem",
|
||||
"publickey":"$[workdir]$/conf/rsa_public_key.pem"
|
||||
},
|
||||
"session_max_time":3000,
|
||||
"session_issue_time":2500,
|
||||
"session_redis":{
|
||||
"url":"redis://127.0.0.1:6379"
|
||||
}
|
||||
},
|
||||
"langMapping":{
|
||||
"zh-Hans-CN":"zh-cn",
|
||||
"zh-CN":"zh-cn",
|
||||
"en-us":"en",
|
||||
"en-US":"en"
|
||||
}
|
||||
}
|
15
plugins/README.md
Normal file
15
plugins/README.md
Normal file
@ -0,0 +1,15 @@
|
||||
# 大模型公司账号信息
|
||||
|
||||
## 商汤
|
||||
### 开元云账号
|
||||
用户名:kyycloud
|
||||
密码:Kyy123456@
|
||||
_VaV5trl8faujgr7xaE3D
|
||||
调试用Bearer令牌 apikey=
|
||||
eyJhbGciOiJSUzI1NiIsImtpZCI6InB1YmxpYzpoeWRyYS5qd3QuYWNjZXNzLXRva2VuIiwidHlwIjoiSldUIn0.eyJhdWQiOltdLCJjbGllbnRfaWQiOiI0ZTQxNDg1NC03MjAwLTUwOWYtYjk2MC1mOGIwZGJiYmYzMzEiLCJleHAiOjE3MjE3Mzc5MTYsImV4dCI6eyJhbGxfYXoiOmZhbHNlLCJhel9saXN0IjpbImNuLXNoLTAxeiJdLCJpc19kZWRpY2F0ZWRfdGVuYW50IjpmYWxzZSwicHJwX2xpc3QiOltdLCJ0ZW5hbnRfY2VydGlmeV9zdGF0dXMiOmZhbHNlLCJ0ZW5hbnRfY2VydGlmeV90eXBlIjoibm9uZSIsInRlbmFudF9jb2RlIjoia3l5Y2xvdWQiLCJ0ZW5hbnRfaWQiOiIwOTVjOGRhZS1lYjAzLTQ0YmEtYjdkOS00M2QxOWYxNzJhMWIiLCJ1c2VyX2lkIjoiNTM1ZmNlNjYtM2VlOC00ZDdhLTk3OWEtNjVlNDQzMGFmNTRiIiwidXNlcl90eXBlIjoiYWRtaW4iLCJ1c2VybmFtZSI6Imt5eWNsb3VkIn0sImlhdCI6MTcyMTcyNzExNiwiaXNzIjoiaHR0cHM6Ly9zaWduaW4uc2Vuc2Vjb3JlLmNuLyIsImp0aSI6ImNhOWU2YjgyLWY1ZjktNGYyOC05OGJkLTc4ZjNiZGRmOTIxNyIsIm5iZiI6MTcyMTcyNzExNiwic2NwIjpbIm9wZW5pZCIsIm9mZmxpbmUiLCJvZmZsaW5lX2FjY2VzcyJdLCJzdWIiOiJreXljbG91ZDowOTVjOGRhZS1lYjAzLTQ0YmEtYjdkOS00M2QxOWYxNzJhMWI6NTM1ZmNlNjYtM2VlOC00ZDdhLTk3OWEtNjVlNDQzMGFmNTRiIn0.rdsmjM2kqendUdycvmSc11xJ2t8rMy2H6QrMpOOInvIWj56WJxnpj3-4aGw7SE7MQm4hw9OxAOP3JVwQKfqCz16PUmjtc8ue61vHKJw2aXtOjuv5Hb1u3HLPhN7gsflDj80KV7Ga0QD4V6XYKN9cb-MRwsLrmJLYay2oyqpX3iNyZR3z5O07CEbCVE0MDDIjxt7EyhpkfpSPKTWbnbJaOW73pdJZq6Q5xzxRvKOdywVq1-5Ifem8NyvMPqFnjc1kGVJbmD13hktC6d-R3EfoqzBz-QutGKQdhZoTj1Bo6g6imIXzAcCNbRFNU7fU5Vn8-AkdqtpY0Nhd-CCnQNIvX2ngvA08WxKV4nt9VGouuSCrbvZ8LrtiyPx3Ays3F8fUdefH91WD28YRytzfA1SrAogMfZz7zX-pKulB0erHfoveRqbY4wjDiY8lYRARVmd0d_RVNE7q6ArilvgSOo-oiJI-VQYeFse16xuUcYnvhQjNR6fSW1vARiEvztMOhF1lwPhikcXggqY7-XEklsgot3Qi402kXPu8r9WEfjdlrcY3I8eaGfRew2i4PrwKEZulgwuU7LC1VQufdQDGKxS8X_vQntHMwe1b-3s0RZ8qpMcWB6mNXSB8T6ghT2N0taCkKTc6Oe_O322Y9lLWqLXAYC96cU9eoaIyC0jXNPp9tbE
|
||||
|
||||
eyJhbGciOiJSUzI1NiIsImtpZCI6InB1YmxpYzpoeWRyYS5qd3QuYWNjZXNzLXRva2VuIiwidHlwIjoiSldUIn0.eyJhdWQiOltdLCJjbGllbnRfaWQiOiI0ZTQxNDg1NC03MjAwLTUwOWYtYjk2MC1mOGIwZGJiYmYzMzEiLCJleHAiOjE3MjE3Mzc5MTYsImV4dCI6eyJhbGxfYXoiOmZhbHNlLCJhel9saXN0IjpbImNuLXNoLTAxeiJdLCJpc19kZWRpY2F0ZWRfdGVuYW50IjpmYWxzZSwicHJwX2xpc3QiOltdLCJ0ZW5hbnRfY2VydGlmeV9zdGF0dXMiOmZhbHNlLCJ0ZW5hbnRfY2VydGlmeV90eXBlIjoibm9uZSIsInRlbmFudF9jb2RlIjoia3l5Y2xvdWQiLCJ0ZW5hbnRfaWQiOiIwOTVjOGRhZS1lYjAzLTQ0YmEtYjdkOS00M2QxOWYxNzJhMWIiLCJ1c2VyX2lkIjoiNTM1ZmNlNjYtM2VlOC00ZDdhLTk3OWEtNjVlNDQzMGFmNTRiIiwidXNlcl90eXBlIjoiYWRtaW4iLCJ1c2VybmFtZSI6Imt5eWNsb3VkIn0sImlhdCI6MTcyMTcyNzExNiwiaXNzIjoiaHR0cHM6Ly9zaWduaW4uc2Vuc2Vjb3JlLmNuLyIsImp0aSI6ImNhOWU2YjgyLWY1ZjktNGYyOC05OGJkLTc4ZjNiZGRmOTIxNyIsIm5iZiI6MTcyMTcyNzExNiwic2NwIjpbIm9wZW5pZCIsIm9mZmxpbmUiLCJvZmZsaW5lX2FjY2VzcyJdLCJzdWIiOiJreXljbG91ZDowOTVjOGRhZS1lYjAzLTQ0YmEtYjdkOS00M2QxOWYxNzJhMWI6NTM1ZmNlNjYtM2VlOC00ZDdhLTk3OWEtNjVlNDQzMGFmNTRiIn0.rdsmjM2kqendUdycvmSc11xJ2t8rMy2H6QrMpOOInvIWj56WJxnpj3-4aGw7SE7MQm4hw9OxAOP3JVwQKfqCz16PUmjtc8ue61vHKJw2aXtOjuv5Hb1u3HLPhN7gsflDj80KV7Ga0QD4V6XYKN9cb-MRwsLrmJLYay2oyqpX3iNyZR3z5O07CEbCVE0MDDIjxt7EyhpkfpSPKTWbnbJaOW73pdJZq6Q5xzxRvKOdywVq1-5Ifem8NyvMPqFnjc1kGVJbmD13hktC6d-R3EfoqzBz-QutGKQdhZoTj1Bo6g6imIXzAcCNbRFNU7fU5Vn8-AkdqtpY0Nhd-CCnQNIvX2ngvA08WxKV4nt9VGouuSCrbvZ8LrtiyPx3Ays3F8fUdefH91WD28YRytzfA1SrAogMfZz7zX-pKulB0erHfoveRqbY4wjDiY8lYRARVmd0d_RVNE7q6ArilvgSOo-oiJI-VQYeFse16xuUcYnvhQjNR6fSW1vARiEvztMOhF1lwPhikcXggqY7-XEklsgot3Qi402kXPu8r9WEfjdlrcY3I8eaGfRew2i4PrwKEZulgwuU7LC1VQufdQDGKxS8X_vQntHMwe1b-3s0RZ8qpMcWB6mNXSB8T6ghT2N0taCkKTc6Oe_O322Y9lLWqLXAYC96cU9eoaIyC0jXNPp9tbE
|
||||
|
||||
AccessKey ID: A13ECA33C26F4B20AB283ADB11159792 AccessKey Secret:D3843572206F4701BB779949C89F7576
|
||||
以下是个人注册的
|
||||
AccessKey ID: 69DDB0B8B4D443A589F8E0AEF70CE29C AccessKey Secret:C7699DC1E8904B3189959942EFB8918B
|
BIN
plugins/__pycache__/auth.cpython-310.pyc
Normal file
BIN
plugins/__pycache__/auth.cpython-310.pyc
Normal file
Binary file not shown.
BIN
plugins/__pycache__/plugin.cpython-310.pyc
Normal file
BIN
plugins/__pycache__/plugin.cpython-310.pyc
Normal file
Binary file not shown.
BIN
plugins/__pycache__/wechat_agent.cpython-310.pyc
Normal file
BIN
plugins/__pycache__/wechat_agent.cpython-310.pyc
Normal file
Binary file not shown.
9
plugins/auth.py
Normal file
9
plugins/auth.py
Normal file
@ -0,0 +1,9 @@
|
||||
from appPublic.log import info
|
||||
from ahserver.auth_api import AuthAPI
|
||||
from sqlor.dbpools import DBPools
|
||||
|
||||
async def checkUserPermission(self, user, path):
|
||||
info(f'checkUserPermission():{user} access to {path} ..')
|
||||
return True
|
||||
|
||||
AuthAPI.checkUserPermission = checkUserPermission
|
56
plugins/plugin.py
Normal file
56
plugins/plugin.py
Normal file
@ -0,0 +1,56 @@
|
||||
import sys
|
||||
from ahserver.serverenv import ServerEnv
|
||||
from appPublic.dictObject import DictObject
|
||||
import time
|
||||
import jwt
|
||||
|
||||
def generate_zhipuai_token(apikey: str, exp_seconds: int=86400):
|
||||
try:
|
||||
id, secret = apikey.split(".")
|
||||
except Exception as e:
|
||||
raise Exception("invalid apikey", e)
|
||||
|
||||
payload = {
|
||||
"api_key": id,
|
||||
"exp": int(round(time.time() * 1000)) + exp_seconds * 1000,
|
||||
"timestamp": int(round(time.time() * 1000)),
|
||||
}
|
||||
|
||||
return jwt.encode(
|
||||
payload,
|
||||
secret,
|
||||
algorithm="HS256",
|
||||
headers={"alg": "HS256", "sign_type": "SIGN"},
|
||||
)
|
||||
|
||||
async def get_llm_user_apikey(apiname, user):
|
||||
if apiname == 'qianwen':
|
||||
return DictObject(apikey='sk-ca5dfeb58d494f32a9cf1e9f064370c8')
|
||||
|
||||
if apiname=='baiduqianfan':
|
||||
return DictObject(apikey='SjAN4GHU07LuB8ZYOIstB31G',
|
||||
secretkey='QbakADoGJsM2qjUzIogTkBZruToxYAve')
|
||||
if apiname=='baichuanai':
|
||||
return DictObject(apikey='sk-f1fca6335df32d13c096e5f2e72821db')
|
||||
if apiname=='deepseek':
|
||||
return DictObject(apikey='sk-a6a2d5eca1b7419b95f2c263c362be1e')
|
||||
|
||||
if apiname == 'minimax':
|
||||
return DictObject(apikey='eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJHcm91cE5hbWUiOiJtb3FpbmcgeXUiLCJVc2VyTmFtZSI6Im1vcWluZyB5dSIsIkFjY291bnQiOiIiLCJTdWJqZWN0SUQiOiIxNzY4NTM3NjQ1ODMyNDg3NjAyIiwiUGhvbmUiOiIxMzgwMTAxNTI5MiIsIkdyb3VwSUQiOiIxNzY4NTM3NjQ1ODI4MjkyOTMwIiwiUGFnZU5hbWUiOiIiLCJNYWlsIjoiIiwiQ3JlYXRlVGltZSI6IjIwMjQtMDQtMTAgMTg6MDA6NTMiLCJpc3MiOiJtaW5pbWF4In0.VaRRHr9XMUSYhZOKVS2PRZv6Y9VCaW4JX2ks4QZX3aFr_emjnDbGv5HfNskf54piflEAeTMW4Qw1nG7bqhYea7N5LKHGf0YpesPGSoqxwyZUR4oaJNNVUsSe6eiLbdYSDO2wMb_hV5xyawh-lYe1reBKWaPVuOjfTrDhxzA0IBmzl-jAQhL8-kIZet2uX-p3NjxElpo_zjmVV_hA1BJEvTwuAk8ka-1SBZmXciMhBi1fJG4jcqoHCCN_JHJ7pgjKr5bk2Zw5qCqiU2Ecsc-kPIEK1SI5EYoLszT43UpJ8_wV4Pm07UBCn3vktAa0fjKDSUArPkBoYWSkgKDMWlmxig', groupid='1768537645828292930')
|
||||
if apiname == 'zhipuai':
|
||||
return DictObject(token=generate_zhipuai_token('ffd0affcb6b5f9368f517c09c75a6817.jp9DdpcgwdxXvDiT'))
|
||||
if apiname == 'moonshot':
|
||||
return DictObject(apikey='sk-fHOyIKC2mlIDfGwUQV6SwjwVJkjBJgkNWYv82yt3OdpYh592')
|
||||
if apiname == 'openai':
|
||||
return DictObject(apikey='sk-proj-gFbYlxVnhmfqf8MXhX42T3BlbkFJprO7jXabkwtjmrNeH77Z')
|
||||
if apiname == 'doubao':
|
||||
return DictObject(apikey='a2fddeaa-c31c-4cbe-aacb-732318408dac')
|
||||
|
||||
if apiname == 'tianqi':
|
||||
return DictObject(apikey='94b72c37e62e49f796502d29955447ab', secretkey='afcac498e0a74302bec06d22dcdff213')
|
||||
|
||||
print(f'{user=} not have apikey for {apiname=}')
|
||||
return DictObject()
|
||||
|
||||
g = ServerEnv()
|
||||
g.get_llm_user_apikey = get_llm_user_apikey
|
11
plugins/wechat_agent.py
Normal file
11
plugins/wechat_agent.py
Normal file
@ -0,0 +1,11 @@
|
||||
import itchat
|
||||
from appPublic.worker import awaitify
|
||||
from appPublic.dictObject import DictObject
|
||||
from appPublic.background import Background
|
||||
from ahserver.globalEnv import GlobalEnv
|
||||
|
||||
def wechat_login(login_callback, qr_callback):
|
||||
Background(itchat.login, login_callback=login_callback,
|
||||
qr_callback=qr_callback)
|
||||
g = GlobalEnv()
|
||||
g.wechat_login = wechat_login
|
2
requirements.txt
Normal file
2
requirements.txt
Normal file
@ -0,0 +1,2 @@
|
||||
openai-whisper
|
||||
|
Loading…
Reference in New Issue
Block a user