+110









Yeuoly
GitHub
takatost
kurokobo
Novice Lee
zxhlyh
AkaraChen
Yi
Joel
JzoNg
twwu
Hiroshi Fujita
AkaraChen
NFish
Wu Tianwei
非法操作
Novice
Hiroki Nagai
Gen Sato
eux
huangzhuo1949
huangzhuo
lotsik
crazywoola
nite-knite
Jyong
github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
gakkiyomi
CN-P5
CN-P5
Chuehnone
yihong
Kevin9703
-LAN-
Boris Feld
mbo
mabo
Warren Chen
JzoNgKVO
jiandanfeng
zhu-an
zhaoqingyu.1075
海狸大師
Xu Song
rayshaw001
Ding Jiatong
Bowen Liang
JasonVV
le0zh
zhuxinliang
k-zaku
luckylhb90
hobo.l
jiangbo721
刘江波
Shun Miyazawa
EricPan
crazywoola
sino
Jhvcc
lowell
Boris Polonsky
Ademílson Tonato
Ademílson Tonato
IWAI, Masaharu <iwaim.sub@gmail.com>
Yueh-Po Peng
Jason
Xin Zhang
yjc980121
heyszt
Abdullah AlOsaimi
Abdullah AlOsaimi
Yingchun Lai
Hash Brown
zuodongxu
Masashi Tomooka
aplio
Obada Khalili
Nam Vu
Kei YAMAZAKI
TechnoHouse
Riddhimaan-Senapati
MaFee921
te-chan
HQidea
Joshbly
xhe
weiwenyan-dev
ex_wenyan.wei
engchina
engchina
dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
呆萌闷油瓶
Kemal
Lazy_Frog
Yi Xiao
Steven sun
steven
Kalo Chin
Katy Tao
depy
胡春东
Junjie.M
MuYu
Naoki Takashima
Summer-Gu
Fei He
ybalbert001
Yuanbo Li
douxc
liuzhenghua
Wu Jiayang
Your Name
kimjion
AugNSo
llinvokerl
liusurong.lsr
Vasu Negi
Hundredwz
Xiyuan Chen
403e2d58b9
Signed-off-by: yihong0618 <zouzou0208@gmail.com> Signed-off-by: -LAN- <laipz8200@outlook.com> Signed-off-by: xhe <xw897002528@gmail.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: takatost <takatost@gmail.com> Co-authored-by: kurokobo <kuro664@gmail.com> Co-authored-by: Novice Lee <novicelee@NoviPro.local> Co-authored-by: zxhlyh <jasonapring2015@outlook.com> Co-authored-by: AkaraChen <akarachen@outlook.com> Co-authored-by: Yi <yxiaoisme@gmail.com> Co-authored-by: Joel <iamjoel007@gmail.com> Co-authored-by: JzoNg <jzongcode@gmail.com> Co-authored-by: twwu <twwu@dify.ai> Co-authored-by: Hiroshi Fujita <fujita-h@users.noreply.github.com> Co-authored-by: AkaraChen <85140972+AkaraChen@users.noreply.github.com> Co-authored-by: NFish <douxc512@gmail.com> Co-authored-by: Wu Tianwei <30284043+WTW0313@users.noreply.github.com> Co-authored-by: 非法操作 <hjlarry@163.com> Co-authored-by: Novice <857526207@qq.com> Co-authored-by: Hiroki Nagai <82458324+nagaihiroki-git@users.noreply.github.com> Co-authored-by: Gen Sato <52241300+halogen22@users.noreply.github.com> Co-authored-by: eux <euxuuu@gmail.com> Co-authored-by: huangzhuo1949 <167434202+huangzhuo1949@users.noreply.github.com> Co-authored-by: huangzhuo <huangzhuo1@xiaomi.com> Co-authored-by: lotsik <lotsik@mail.ru> Co-authored-by: crazywoola <100913391+crazywoola@users.noreply.github.com> Co-authored-by: nite-knite <nkCoding@gmail.com> Co-authored-by: Jyong <76649700+JohnJyong@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: gakkiyomi <gakkiyomi@aliyun.com> Co-authored-by: CN-P5 <heibai2006@gmail.com> Co-authored-by: CN-P5 <heibai2006@qq.com> Co-authored-by: Chuehnone <1897025+chuehnone@users.noreply.github.com> Co-authored-by: yihong <zouzou0208@gmail.com> Co-authored-by: Kevin9703 <51311316+Kevin9703@users.noreply.github.com> Co-authored-by: -LAN- <laipz8200@outlook.com> Co-authored-by: Boris Feld <lothiraldan@gmail.com> Co-authored-by: mbo <himabo@gmail.com> Co-authored-by: mabo <mabo@aeyes.ai> Co-authored-by: Warren Chen <warren.chen830@gmail.com> Co-authored-by: JzoNgKVO <27049666+JzoNgKVO@users.noreply.github.com> Co-authored-by: jiandanfeng <chenjh3@wangsu.com> Co-authored-by: zhu-an <70234959+xhdd123321@users.noreply.github.com> Co-authored-by: zhaoqingyu.1075 <zhaoqingyu.1075@bytedance.com> Co-authored-by: 海狸大師 <86974027+yenslife@users.noreply.github.com> Co-authored-by: Xu Song <xusong.vip@gmail.com> Co-authored-by: rayshaw001 <396301947@163.com> Co-authored-by: Ding Jiatong <dingjiatong@gmail.com> Co-authored-by: Bowen Liang <liangbowen@gf.com.cn> Co-authored-by: JasonVV <jasonwangiii@outlook.com> Co-authored-by: le0zh <newlight@qq.com> Co-authored-by: zhuxinliang <zhuxinliang@didiglobal.com> Co-authored-by: k-zaku <zaku99@outlook.jp> Co-authored-by: luckylhb90 <luckylhb90@gmail.com> Co-authored-by: hobo.l <hobo.l@binance.com> Co-authored-by: jiangbo721 <365065261@qq.com> Co-authored-by: 刘江波 <jiangbo721@163.com> Co-authored-by: Shun Miyazawa <34241526+miya@users.noreply.github.com> Co-authored-by: EricPan <30651140+Egfly@users.noreply.github.com> Co-authored-by: crazywoola <427733928@qq.com> Co-authored-by: sino <sino2322@gmail.com> Co-authored-by: Jhvcc <37662342+Jhvcc@users.noreply.github.com> Co-authored-by: lowell <lowell.hu@zkteco.in> Co-authored-by: Boris Polonsky <BorisPolonsky@users.noreply.github.com> Co-authored-by: Ademílson Tonato <ademilsonft@outlook.com> Co-authored-by: Ademílson Tonato <ademilson.tonato@refurbed.com> Co-authored-by: IWAI, Masaharu <iwaim.sub@gmail.com> Co-authored-by: Yueh-Po Peng (Yabi) <94939112+y10ab1@users.noreply.github.com> Co-authored-by: Jason <ggbbddjm@gmail.com> Co-authored-by: Xin Zhang <sjhpzx@gmail.com> Co-authored-by: yjc980121 <3898524+yjc980121@users.noreply.github.com> Co-authored-by: heyszt <36215648+hieheihei@users.noreply.github.com> Co-authored-by: Abdullah AlOsaimi <osaimiacc@gmail.com> Co-authored-by: Abdullah AlOsaimi <189027247+osaimi@users.noreply.github.com> Co-authored-by: Yingchun Lai <laiyingchun@apache.org> Co-authored-by: Hash Brown <hi@xzd.me> Co-authored-by: zuodongxu <192560071+zuodongxu@users.noreply.github.com> Co-authored-by: Masashi Tomooka <tmokmss@users.noreply.github.com> Co-authored-by: aplio <ryo.091219@gmail.com> Co-authored-by: Obada Khalili <54270856+obadakhalili@users.noreply.github.com> Co-authored-by: Nam Vu <zuzoovn@gmail.com> Co-authored-by: Kei YAMAZAKI <1715090+kei-yamazaki@users.noreply.github.com> Co-authored-by: TechnoHouse <13776377+deephbz@users.noreply.github.com> Co-authored-by: Riddhimaan-Senapati <114703025+Riddhimaan-Senapati@users.noreply.github.com> Co-authored-by: MaFee921 <31881301+2284730142@users.noreply.github.com> Co-authored-by: te-chan <t-nakanome@sakura-is.co.jp> Co-authored-by: HQidea <HQidea@users.noreply.github.com> Co-authored-by: Joshbly <36315710+Joshbly@users.noreply.github.com> Co-authored-by: xhe <xw897002528@gmail.com> Co-authored-by: weiwenyan-dev <154779315+weiwenyan-dev@users.noreply.github.com> Co-authored-by: ex_wenyan.wei <ex_wenyan.wei@tcl.com> Co-authored-by: engchina <12236799+engchina@users.noreply.github.com> Co-authored-by: engchina <atjapan2015@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: 呆萌闷油瓶 <253605712@qq.com> Co-authored-by: Kemal <kemalmeler@outlook.com> Co-authored-by: Lazy_Frog <4590648+lazyFrogLOL@users.noreply.github.com> Co-authored-by: Yi Xiao <54782454+YIXIAO0@users.noreply.github.com> Co-authored-by: Steven sun <98230804+Tuyohai@users.noreply.github.com> Co-authored-by: steven <sunzwj@digitalchina.com> Co-authored-by: Kalo Chin <91766386+fdb02983rhy@users.noreply.github.com> Co-authored-by: Katy Tao <34019945+KatyTao@users.noreply.github.com> Co-authored-by: depy <42985524+h4ckdepy@users.noreply.github.com> Co-authored-by: 胡春东 <gycm520@gmail.com> Co-authored-by: Junjie.M <118170653@qq.com> Co-authored-by: MuYu <mr.muzea@gmail.com> Co-authored-by: Naoki Takashima <39912547+takatea@users.noreply.github.com> Co-authored-by: Summer-Gu <37869445+gubinjie@users.noreply.github.com> Co-authored-by: Fei He <droxer.he@gmail.com> Co-authored-by: ybalbert001 <120714773+ybalbert001@users.noreply.github.com> Co-authored-by: Yuanbo Li <ybalbert@amazon.com> Co-authored-by: douxc <7553076+douxc@users.noreply.github.com> Co-authored-by: liuzhenghua <1090179900@qq.com> Co-authored-by: Wu Jiayang <62842862+Wu-Jiayang@users.noreply.github.com> Co-authored-by: Your Name <you@example.com> Co-authored-by: kimjion <45935338+kimjion@users.noreply.github.com> Co-authored-by: AugNSo <song.tiankai@icloud.com> Co-authored-by: llinvokerl <38915183+llinvokerl@users.noreply.github.com> Co-authored-by: liusurong.lsr <liusurong.lsr@alibaba-inc.com> Co-authored-by: Vasu Negi <vasu-negi@users.noreply.github.com> Co-authored-by: Hundredwz <1808096180@qq.com> Co-authored-by: Xiyuan Chen <52963600+GareArc@users.noreply.github.com>
532 lines
16 KiB
Python
532 lines
16 KiB
Python
import binascii
|
|
from collections.abc import Generator, Sequence
|
|
from typing import IO, Optional
|
|
|
|
from core.model_runtime.entities.llm_entities import LLMResultChunk
|
|
from core.model_runtime.entities.message_entities import PromptMessage, PromptMessageTool
|
|
from core.model_runtime.entities.model_entities import AIModelEntity
|
|
from core.model_runtime.entities.rerank_entities import RerankResult
|
|
from core.model_runtime.entities.text_embedding_entities import TextEmbeddingResult
|
|
from core.model_runtime.utils.encoders import jsonable_encoder
|
|
from core.plugin.entities.plugin_daemon import (
|
|
PluginBasicBooleanResponse,
|
|
PluginDaemonInnerError,
|
|
PluginLLMNumTokensResponse,
|
|
PluginModelProviderEntity,
|
|
PluginModelSchemaEntity,
|
|
PluginStringResultResponse,
|
|
PluginTextEmbeddingNumTokensResponse,
|
|
PluginVoicesResponse,
|
|
)
|
|
from core.plugin.manager.base import BasePluginManager
|
|
|
|
|
|
class PluginModelManager(BasePluginManager):
|
|
def fetch_model_providers(self, tenant_id: str) -> Sequence[PluginModelProviderEntity]:
|
|
"""
|
|
Fetch model providers for the given tenant.
|
|
"""
|
|
response = self._request_with_plugin_daemon_response(
|
|
"GET",
|
|
f"plugin/{tenant_id}/management/models",
|
|
list[PluginModelProviderEntity],
|
|
params={"page": 1, "page_size": 256},
|
|
)
|
|
return response
|
|
|
|
def get_model_schema(
|
|
self,
|
|
tenant_id: str,
|
|
user_id: str,
|
|
plugin_id: str,
|
|
provider: str,
|
|
model_type: str,
|
|
model: str,
|
|
credentials: dict,
|
|
) -> AIModelEntity | None:
|
|
"""
|
|
Get model schema
|
|
"""
|
|
response = self._request_with_plugin_daemon_response_stream(
|
|
"POST",
|
|
f"plugin/{tenant_id}/dispatch/model/schema",
|
|
PluginModelSchemaEntity,
|
|
data={
|
|
"user_id": user_id,
|
|
"data": {
|
|
"provider": provider,
|
|
"model_type": model_type,
|
|
"model": model,
|
|
"credentials": credentials,
|
|
},
|
|
},
|
|
headers={
|
|
"X-Plugin-ID": plugin_id,
|
|
"Content-Type": "application/json",
|
|
},
|
|
)
|
|
|
|
for resp in response:
|
|
return resp.model_schema
|
|
|
|
return None
|
|
|
|
def validate_provider_credentials(
|
|
self, tenant_id: str, user_id: str, plugin_id: str, provider: str, credentials: dict
|
|
) -> bool:
|
|
"""
|
|
validate the credentials of the provider
|
|
"""
|
|
response = self._request_with_plugin_daemon_response_stream(
|
|
"POST",
|
|
f"plugin/{tenant_id}/dispatch/model/validate_provider_credentials",
|
|
PluginBasicBooleanResponse,
|
|
data={
|
|
"user_id": user_id,
|
|
"data": {
|
|
"provider": provider,
|
|
"credentials": credentials,
|
|
},
|
|
},
|
|
headers={
|
|
"X-Plugin-ID": plugin_id,
|
|
"Content-Type": "application/json",
|
|
},
|
|
)
|
|
|
|
for resp in response:
|
|
if resp.credentials and isinstance(resp.credentials, dict):
|
|
credentials.update(resp.credentials)
|
|
|
|
return resp.result
|
|
|
|
return False
|
|
|
|
def validate_model_credentials(
|
|
self,
|
|
tenant_id: str,
|
|
user_id: str,
|
|
plugin_id: str,
|
|
provider: str,
|
|
model_type: str,
|
|
model: str,
|
|
credentials: dict,
|
|
) -> bool:
|
|
"""
|
|
validate the credentials of the provider
|
|
"""
|
|
response = self._request_with_plugin_daemon_response_stream(
|
|
"POST",
|
|
f"plugin/{tenant_id}/dispatch/model/validate_model_credentials",
|
|
PluginBasicBooleanResponse,
|
|
data={
|
|
"user_id": user_id,
|
|
"data": {
|
|
"provider": provider,
|
|
"model_type": model_type,
|
|
"model": model,
|
|
"credentials": credentials,
|
|
},
|
|
},
|
|
headers={
|
|
"X-Plugin-ID": plugin_id,
|
|
"Content-Type": "application/json",
|
|
},
|
|
)
|
|
|
|
for resp in response:
|
|
if resp.credentials and isinstance(resp.credentials, dict):
|
|
credentials.update(resp.credentials)
|
|
|
|
return resp.result
|
|
|
|
return False
|
|
|
|
def invoke_llm(
|
|
self,
|
|
tenant_id: str,
|
|
user_id: str,
|
|
plugin_id: str,
|
|
provider: str,
|
|
model: str,
|
|
credentials: dict,
|
|
prompt_messages: list[PromptMessage],
|
|
model_parameters: Optional[dict] = None,
|
|
tools: Optional[list[PromptMessageTool]] = None,
|
|
stop: Optional[list[str]] = None,
|
|
stream: bool = True,
|
|
) -> Generator[LLMResultChunk, None, None]:
|
|
"""
|
|
Invoke llm
|
|
"""
|
|
response = self._request_with_plugin_daemon_response_stream(
|
|
method="POST",
|
|
path=f"plugin/{tenant_id}/dispatch/llm/invoke",
|
|
type=LLMResultChunk,
|
|
data=jsonable_encoder(
|
|
{
|
|
"user_id": user_id,
|
|
"data": {
|
|
"provider": provider,
|
|
"model_type": "llm",
|
|
"model": model,
|
|
"credentials": credentials,
|
|
"prompt_messages": prompt_messages,
|
|
"model_parameters": model_parameters,
|
|
"tools": tools,
|
|
"stop": stop,
|
|
"stream": stream,
|
|
},
|
|
}
|
|
),
|
|
headers={
|
|
"X-Plugin-ID": plugin_id,
|
|
"Content-Type": "application/json",
|
|
},
|
|
)
|
|
|
|
try:
|
|
yield from response
|
|
except PluginDaemonInnerError as e:
|
|
raise ValueError(e.message + str(e.code))
|
|
|
|
def get_llm_num_tokens(
|
|
self,
|
|
tenant_id: str,
|
|
user_id: str,
|
|
plugin_id: str,
|
|
provider: str,
|
|
model_type: str,
|
|
model: str,
|
|
credentials: dict,
|
|
prompt_messages: list[PromptMessage],
|
|
tools: Optional[list[PromptMessageTool]] = None,
|
|
) -> int:
|
|
"""
|
|
Get number of tokens for llm
|
|
"""
|
|
response = self._request_with_plugin_daemon_response_stream(
|
|
method="POST",
|
|
path=f"plugin/{tenant_id}/dispatch/llm/num_tokens",
|
|
type=PluginLLMNumTokensResponse,
|
|
data=jsonable_encoder(
|
|
{
|
|
"user_id": user_id,
|
|
"data": {
|
|
"provider": provider,
|
|
"model_type": model_type,
|
|
"model": model,
|
|
"credentials": credentials,
|
|
"prompt_messages": prompt_messages,
|
|
"tools": tools,
|
|
},
|
|
}
|
|
),
|
|
headers={
|
|
"X-Plugin-ID": plugin_id,
|
|
"Content-Type": "application/json",
|
|
},
|
|
)
|
|
|
|
for resp in response:
|
|
return resp.num_tokens
|
|
|
|
return 0
|
|
|
|
def invoke_text_embedding(
|
|
self,
|
|
tenant_id: str,
|
|
user_id: str,
|
|
plugin_id: str,
|
|
provider: str,
|
|
model: str,
|
|
credentials: dict,
|
|
texts: list[str],
|
|
input_type: str,
|
|
) -> TextEmbeddingResult:
|
|
"""
|
|
Invoke text embedding
|
|
"""
|
|
response = self._request_with_plugin_daemon_response_stream(
|
|
method="POST",
|
|
path=f"plugin/{tenant_id}/dispatch/text_embedding/invoke",
|
|
type=TextEmbeddingResult,
|
|
data=jsonable_encoder(
|
|
{
|
|
"user_id": user_id,
|
|
"data": {
|
|
"provider": provider,
|
|
"model_type": "text-embedding",
|
|
"model": model,
|
|
"credentials": credentials,
|
|
"texts": texts,
|
|
"input_type": input_type,
|
|
},
|
|
}
|
|
),
|
|
headers={
|
|
"X-Plugin-ID": plugin_id,
|
|
"Content-Type": "application/json",
|
|
},
|
|
)
|
|
|
|
for resp in response:
|
|
return resp
|
|
|
|
raise ValueError("Failed to invoke text embedding")
|
|
|
|
def get_text_embedding_num_tokens(
|
|
self,
|
|
tenant_id: str,
|
|
user_id: str,
|
|
plugin_id: str,
|
|
provider: str,
|
|
model: str,
|
|
credentials: dict,
|
|
texts: list[str],
|
|
) -> list[int]:
|
|
"""
|
|
Get number of tokens for text embedding
|
|
"""
|
|
response = self._request_with_plugin_daemon_response_stream(
|
|
method="POST",
|
|
path=f"plugin/{tenant_id}/dispatch/text_embedding/num_tokens",
|
|
type=PluginTextEmbeddingNumTokensResponse,
|
|
data=jsonable_encoder(
|
|
{
|
|
"user_id": user_id,
|
|
"data": {
|
|
"provider": provider,
|
|
"model_type": "text-embedding",
|
|
"model": model,
|
|
"credentials": credentials,
|
|
"texts": texts,
|
|
},
|
|
}
|
|
),
|
|
headers={
|
|
"X-Plugin-ID": plugin_id,
|
|
"Content-Type": "application/json",
|
|
},
|
|
)
|
|
|
|
for resp in response:
|
|
return resp.num_tokens
|
|
|
|
return []
|
|
|
|
def invoke_rerank(
|
|
self,
|
|
tenant_id: str,
|
|
user_id: str,
|
|
plugin_id: str,
|
|
provider: str,
|
|
model: str,
|
|
credentials: dict,
|
|
query: str,
|
|
docs: list[str],
|
|
score_threshold: Optional[float] = None,
|
|
top_n: Optional[int] = None,
|
|
) -> RerankResult:
|
|
"""
|
|
Invoke rerank
|
|
"""
|
|
response = self._request_with_plugin_daemon_response_stream(
|
|
method="POST",
|
|
path=f"plugin/{tenant_id}/dispatch/rerank/invoke",
|
|
type=RerankResult,
|
|
data=jsonable_encoder(
|
|
{
|
|
"user_id": user_id,
|
|
"data": {
|
|
"provider": provider,
|
|
"model_type": "rerank",
|
|
"model": model,
|
|
"credentials": credentials,
|
|
"query": query,
|
|
"docs": docs,
|
|
"score_threshold": score_threshold,
|
|
"top_n": top_n,
|
|
},
|
|
}
|
|
),
|
|
headers={
|
|
"X-Plugin-ID": plugin_id,
|
|
"Content-Type": "application/json",
|
|
},
|
|
)
|
|
|
|
for resp in response:
|
|
return resp
|
|
|
|
raise ValueError("Failed to invoke rerank")
|
|
|
|
def invoke_tts(
|
|
self,
|
|
tenant_id: str,
|
|
user_id: str,
|
|
plugin_id: str,
|
|
provider: str,
|
|
model: str,
|
|
credentials: dict,
|
|
content_text: str,
|
|
voice: str,
|
|
) -> Generator[bytes, None, None]:
|
|
"""
|
|
Invoke tts
|
|
"""
|
|
response = self._request_with_plugin_daemon_response_stream(
|
|
method="POST",
|
|
path=f"plugin/{tenant_id}/dispatch/tts/invoke",
|
|
type=PluginStringResultResponse,
|
|
data=jsonable_encoder(
|
|
{
|
|
"user_id": user_id,
|
|
"data": {
|
|
"provider": provider,
|
|
"model_type": "tts",
|
|
"model": model,
|
|
"credentials": credentials,
|
|
"tenant_id": tenant_id,
|
|
"content_text": content_text,
|
|
"voice": voice,
|
|
},
|
|
}
|
|
),
|
|
headers={
|
|
"X-Plugin-ID": plugin_id,
|
|
"Content-Type": "application/json",
|
|
},
|
|
)
|
|
|
|
try:
|
|
for result in response:
|
|
hex_str = result.result
|
|
yield binascii.unhexlify(hex_str)
|
|
except PluginDaemonInnerError as e:
|
|
raise ValueError(e.message + str(e.code))
|
|
|
|
def get_tts_model_voices(
|
|
self,
|
|
tenant_id: str,
|
|
user_id: str,
|
|
plugin_id: str,
|
|
provider: str,
|
|
model: str,
|
|
credentials: dict,
|
|
language: Optional[str] = None,
|
|
) -> list[dict]:
|
|
"""
|
|
Get tts model voices
|
|
"""
|
|
response = self._request_with_plugin_daemon_response_stream(
|
|
method="POST",
|
|
path=f"plugin/{tenant_id}/dispatch/tts/model/voices",
|
|
type=PluginVoicesResponse,
|
|
data=jsonable_encoder(
|
|
{
|
|
"user_id": user_id,
|
|
"data": {
|
|
"provider": provider,
|
|
"model_type": "tts",
|
|
"model": model,
|
|
"credentials": credentials,
|
|
"language": language,
|
|
},
|
|
}
|
|
),
|
|
headers={
|
|
"X-Plugin-ID": plugin_id,
|
|
"Content-Type": "application/json",
|
|
},
|
|
)
|
|
|
|
for resp in response:
|
|
voices = []
|
|
for voice in resp.voices:
|
|
voices.append({"name": voice.name, "value": voice.value})
|
|
|
|
return voices
|
|
|
|
return []
|
|
|
|
def invoke_speech_to_text(
|
|
self,
|
|
tenant_id: str,
|
|
user_id: str,
|
|
plugin_id: str,
|
|
provider: str,
|
|
model: str,
|
|
credentials: dict,
|
|
file: IO[bytes],
|
|
) -> str:
|
|
"""
|
|
Invoke speech to text
|
|
"""
|
|
response = self._request_with_plugin_daemon_response_stream(
|
|
method="POST",
|
|
path=f"plugin/{tenant_id}/dispatch/speech2text/invoke",
|
|
type=PluginStringResultResponse,
|
|
data=jsonable_encoder(
|
|
{
|
|
"user_id": user_id,
|
|
"data": {
|
|
"provider": provider,
|
|
"model_type": "speech2text",
|
|
"model": model,
|
|
"credentials": credentials,
|
|
"file": binascii.hexlify(file.read()).decode(),
|
|
},
|
|
}
|
|
),
|
|
headers={
|
|
"X-Plugin-ID": plugin_id,
|
|
"Content-Type": "application/json",
|
|
},
|
|
)
|
|
|
|
for resp in response:
|
|
return resp.result
|
|
|
|
raise ValueError("Failed to invoke speech to text")
|
|
|
|
def invoke_moderation(
|
|
self,
|
|
tenant_id: str,
|
|
user_id: str,
|
|
plugin_id: str,
|
|
provider: str,
|
|
model: str,
|
|
credentials: dict,
|
|
text: str,
|
|
) -> bool:
|
|
"""
|
|
Invoke moderation
|
|
"""
|
|
response = self._request_with_plugin_daemon_response_stream(
|
|
method="POST",
|
|
path=f"plugin/{tenant_id}/dispatch/moderation/invoke",
|
|
type=PluginBasicBooleanResponse,
|
|
data=jsonable_encoder(
|
|
{
|
|
"user_id": user_id,
|
|
"data": {
|
|
"provider": provider,
|
|
"model_type": "moderation",
|
|
"model": model,
|
|
"credentials": credentials,
|
|
"text": text,
|
|
},
|
|
}
|
|
),
|
|
headers={
|
|
"X-Plugin-ID": plugin_id,
|
|
"Content-Type": "application/json",
|
|
},
|
|
)
|
|
|
|
for resp in response:
|
|
return resp.result
|
|
|
|
raise ValueError("Failed to invoke moderation")
|