Procházet zdrojové kódy

feat: update model_provider jina to support custom url and model (#4110)

Co-authored-by: Gimling <huangjl@ruyi.ai>
Co-authored-by: takatost <takatost@gmail.com>
tags/0.6.7
VoidIsVoid před 1 rokem
rodič
revize
543a00e597
Žádný účet není propojen s e-mailovou adresou tvůrce revize

+ 38
- 0
api/core/model_runtime/model_providers/jina/jina.yaml Zobrazit soubor

- rerank - rerank
configurate_methods: configurate_methods:
- predefined-model - predefined-model
- customizable-model
provider_credential_schema: provider_credential_schema:
credential_form_schemas: credential_form_schemas:
- variable: api_key - variable: api_key
placeholder: placeholder:
zh_Hans: 在此输入您的 API Key zh_Hans: 在此输入您的 API Key
en_US: Enter your API Key en_US: Enter your API Key
model_credential_schema:
model:
label:
en_US: Model Name
zh_Hans: 模型名称
placeholder:
en_US: Enter your model name
zh_Hans: 输入模型名称
credential_form_schemas:
- variable: api_key
label:
en_US: API Key
type: secret-input
required: true
placeholder:
zh_Hans: 在此输入您的 API Key
en_US: Enter your API Key
- variable: base_url
label:
zh_Hans: 服务器 URL
en_US: Base URL
type: text-input
required: true
placeholder:
zh_Hans: Base URL, e.g. https://api.jina.ai/v1
en_US: Base URL, e.g. https://api.jina.ai/v1
default: 'https://api.jina.ai/v1'
- variable: context_size
label:
zh_Hans: 上下文大小
en_US: Context size
placeholder:
zh_Hans: 输入上下文大小
en_US: Enter context size
required: false
type: text-input
default: '8192'

+ 23
- 1
api/core/model_runtime/model_providers/jina/rerank/rerank.py Zobrazit soubor



import httpx import httpx


from core.model_runtime.entities.common_entities import I18nObject
from core.model_runtime.entities.model_entities import AIModelEntity, FetchFrom, ModelPropertyKey, ModelType
from core.model_runtime.entities.rerank_entities import RerankDocument, RerankResult from core.model_runtime.entities.rerank_entities import RerankDocument, RerankResult
from core.model_runtime.errors.invoke import ( from core.model_runtime.errors.invoke import (
InvokeAuthorizationError, InvokeAuthorizationError,
if len(docs) == 0: if len(docs) == 0:
return RerankResult(model=model, docs=[]) return RerankResult(model=model, docs=[])


base_url = credentials.get('base_url', 'https://api.jina.ai/v1')
if base_url.endswith('/'):
base_url = base_url[:-1]

try: try:
response = httpx.post( response = httpx.post(
"https://api.jina.ai/v1/rerank",
base_url + '/rerank',
json={ json={
"model": model, "model": model,
"query": query, "query": query,
InvokeAuthorizationError: [httpx.HTTPStatusError], InvokeAuthorizationError: [httpx.HTTPStatusError],
InvokeBadRequestError: [httpx.RequestError] InvokeBadRequestError: [httpx.RequestError]
} }

def get_customizable_model_schema(self, model: str, credentials: dict) -> AIModelEntity:
"""
generate custom model entities from credentials
"""
entity = AIModelEntity(
model=model,
label=I18nObject(en_US=model),
model_type=ModelType.RERANK,
fetch_from=FetchFrom.CUSTOMIZABLE_MODEL,
model_properties={
ModelPropertyKey.CONTEXT_SIZE: int(credentials.get('context_size'))
}
)

return entity

+ 30
- 10
api/core/model_runtime/model_providers/jina/text_embedding/text_embedding.py Zobrazit soubor



from requests import post from requests import post


from core.model_runtime.entities.model_entities import PriceType
from core.model_runtime.entities.common_entities import I18nObject
from core.model_runtime.entities.model_entities import AIModelEntity, FetchFrom, ModelPropertyKey, ModelType, PriceType
from core.model_runtime.entities.text_embedding_entities import EmbeddingUsage, TextEmbeddingResult from core.model_runtime.entities.text_embedding_entities import EmbeddingUsage, TextEmbeddingResult
from core.model_runtime.errors.invoke import ( from core.model_runtime.errors.invoke import (
InvokeAuthorizationError, InvokeAuthorizationError,
""" """
Model class for Jina text embedding model. Model class for Jina text embedding model.
""" """
api_base: str = 'https://api.jina.ai/v1/embeddings'
models: list[str] = ['jina-embeddings-v2-base-en', 'jina-embeddings-v2-small-en', 'jina-embeddings-v2-base-zh', 'jina-embeddings-v2-base-de']
api_base: str = 'https://api.jina.ai/v1'


def _invoke(self, model: str, credentials: dict, def _invoke(self, model: str, credentials: dict,
texts: list[str], user: Optional[str] = None) \ texts: list[str], user: Optional[str] = None) \
:return: embeddings result :return: embeddings result
""" """
api_key = credentials['api_key'] api_key = credentials['api_key']
if model not in self.models:
raise InvokeBadRequestError('Invalid model name')
if not api_key: if not api_key:
raise CredentialsValidateFailedError('api_key is required') raise CredentialsValidateFailedError('api_key is required')
url = self.api_base

base_url = credentials.get('base_url', self.api_base)
if base_url.endswith('/'):
base_url = base_url[:-1]

url = base_url + '/embeddings'
headers = { headers = {
'Authorization': 'Bearer ' + api_key, 'Authorization': 'Bearer ' + api_key,
'Content-Type': 'application/json' 'Content-Type': 'application/json'
elif response.status_code == 500: elif response.status_code == 500:
raise InvokeServerUnavailableError(msg) raise InvokeServerUnavailableError(msg)
else: else:
raise InvokeError(msg)
raise InvokeBadRequestError(msg)
except JSONDecodeError as e: except JSONDecodeError as e:
raise InvokeServerUnavailableError(f"Failed to convert response to json: {e} with text: {response.text}") raise InvokeServerUnavailableError(f"Failed to convert response to json: {e} with text: {response.text}")


""" """
try: try:
self._invoke(model=model, credentials=credentials, texts=['ping']) self._invoke(model=model, credentials=credentials, texts=['ping'])
except InvokeAuthorizationError:
raise CredentialsValidateFailedError('Invalid api key')
except Exception as e:
raise CredentialsValidateFailedError(f'Credentials validation failed: {e}')


@property @property
def _invoke_error_mapping(self) -> dict[type[InvokeError], list[type[Exception]]]: def _invoke_error_mapping(self) -> dict[type[InvokeError], list[type[Exception]]]:
InvokeAuthorizationError InvokeAuthorizationError
], ],
InvokeBadRequestError: [ InvokeBadRequestError: [
KeyError
KeyError,
InvokeBadRequestError
] ]
} }
) )


return usage return usage

def get_customizable_model_schema(self, model: str, credentials: dict) -> AIModelEntity:
"""
generate custom model entities from credentials
"""
entity = AIModelEntity(
model=model,
label=I18nObject(en_US=model),
model_type=ModelType.TEXT_EMBEDDING,
fetch_from=FetchFrom.CUSTOMIZABLE_MODEL,
model_properties={
ModelPropertyKey.CONTEXT_SIZE: int(credentials.get('context_size'))
}
)

return entity

Načítá se…
Zrušit
Uložit