chore: apply ruff's pyupgrade linter rules to modernize Python code with targeted version (#2419)

This commit is contained in:
Bowen Liang
2024-02-09 15:21:33 +08:00
committed by GitHub
parent 589099a005
commit 063191889d
246 changed files with 912 additions and 937 deletions

View File

@@ -1,5 +1,5 @@
from abc import ABC
from typing import List, Optional
from typing import Optional
from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk
from core.model_runtime.entities.message_entities import PromptMessage, PromptMessageTool
@@ -23,7 +23,7 @@ class Callback(ABC):
def on_before_invoke(self, llm_instance: AIModel, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) -> None:
"""
Before invoke callback
@@ -42,7 +42,7 @@ class Callback(ABC):
def on_new_chunk(self, llm_instance: AIModel, chunk: LLMResultChunk, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None):
"""
On new chunk callback
@@ -62,7 +62,7 @@ class Callback(ABC):
def on_after_invoke(self, llm_instance: AIModel, result: LLMResult, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) -> None:
"""
After invoke callback
@@ -82,7 +82,7 @@ class Callback(ABC):
def on_invoke_error(self, llm_instance: AIModel, ex: Exception, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) -> None:
"""
Invoke error callback

View File

@@ -1,7 +1,7 @@
import json
import logging
import sys
from typing import List, Optional
from typing import Optional
from core.model_runtime.callbacks.base_callback import Callback
from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk
@@ -13,7 +13,7 @@ logger = logging.getLogger(__name__)
class LoggingCallback(Callback):
def on_before_invoke(self, llm_instance: AIModel, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) -> None:
"""
Before invoke callback
@@ -60,7 +60,7 @@ class LoggingCallback(Callback):
def on_new_chunk(self, llm_instance: AIModel, chunk: LLMResultChunk, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None):
"""
On new chunk callback
@@ -81,7 +81,7 @@ class LoggingCallback(Callback):
def on_after_invoke(self, llm_instance: AIModel, result: LLMResult, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) -> None:
"""
After invoke callback
@@ -113,7 +113,7 @@ class LoggingCallback(Callback):
def on_invoke_error(self, llm_instance: AIModel, ex: Exception, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) -> None:
"""
Invoke error callback

View File

@@ -1,8 +1,7 @@
from typing import Dict
from core.model_runtime.entities.model_entities import DefaultParameterName
PARAMETER_RULE_TEMPLATE: Dict[DefaultParameterName, dict] = {
PARAMETER_RULE_TEMPLATE: dict[DefaultParameterName, dict] = {
DefaultParameterName.TEMPERATURE: {
'label': {
'en_US': 'Temperature',

View File

@@ -153,7 +153,7 @@ class AIModel(ABC):
# read _position.yaml file
position_map = {}
if os.path.exists(position_file_path):
with open(position_file_path, 'r', encoding='utf-8') as f:
with open(position_file_path, encoding='utf-8') as f:
positions = yaml.safe_load(f)
# convert list to dict with key as model provider name, value as index
position_map = {position: index for index, position in enumerate(positions)}
@@ -161,7 +161,7 @@ class AIModel(ABC):
# traverse all model_schema_yaml_paths
for model_schema_yaml_path in model_schema_yaml_paths:
# read yaml data from yaml file
with open(model_schema_yaml_path, 'r', encoding='utf-8') as f:
with open(model_schema_yaml_path, encoding='utf-8') as f:
yaml_data = yaml.safe_load(f)
new_parameter_rules = []

View File

@@ -3,7 +3,8 @@ import os
import re
import time
from abc import abstractmethod
from typing import Generator, List, Optional, Union
from collections.abc import Generator
from typing import Optional, Union
from core.model_runtime.callbacks.base_callback import Callback
from core.model_runtime.callbacks.logging_callback import LoggingCallback
@@ -29,7 +30,7 @@ class LargeLanguageModel(AIModel):
def invoke(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: Optional[dict] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None, callbacks: list[Callback] = None) \
-> Union[LLMResult, Generator]:
"""
@@ -122,7 +123,7 @@ class LargeLanguageModel(AIModel):
def _invoke_result_generator(self, model: str, result: Generator, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None,
stop: Optional[List[str]] = None, stream: bool = True,
stop: Optional[list[str]] = None, stream: bool = True,
user: Optional[str] = None, callbacks: list[Callback] = None) -> Generator:
"""
Invoke result generator
@@ -186,7 +187,7 @@ class LargeLanguageModel(AIModel):
@abstractmethod
def _invoke(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) \
-> Union[LLMResult, Generator]:
"""
@@ -218,7 +219,7 @@ class LargeLanguageModel(AIModel):
"""
raise NotImplementedError
def enforce_stop_tokens(self, text: str, stop: List[str]) -> str:
def enforce_stop_tokens(self, text: str, stop: list[str]) -> str:
"""Cut off the text as soon as any stop words occur."""
return re.split("|".join(stop), text, maxsplit=1)[0]
@@ -329,7 +330,7 @@ class LargeLanguageModel(AIModel):
def _trigger_before_invoke_callbacks(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None,
stop: Optional[List[str]] = None, stream: bool = True,
stop: Optional[list[str]] = None, stream: bool = True,
user: Optional[str] = None, callbacks: list[Callback] = None) -> None:
"""
Trigger before invoke callbacks
@@ -367,7 +368,7 @@ class LargeLanguageModel(AIModel):
def _trigger_new_chunk_callbacks(self, chunk: LLMResultChunk, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None,
stop: Optional[List[str]] = None, stream: bool = True,
stop: Optional[list[str]] = None, stream: bool = True,
user: Optional[str] = None, callbacks: list[Callback] = None) -> None:
"""
Trigger new chunk callbacks
@@ -406,7 +407,7 @@ class LargeLanguageModel(AIModel):
def _trigger_after_invoke_callbacks(self, model: str, result: LLMResult, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None,
stop: Optional[List[str]] = None, stream: bool = True,
stop: Optional[list[str]] = None, stream: bool = True,
user: Optional[str] = None, callbacks: list[Callback] = None) -> None:
"""
Trigger after invoke callbacks
@@ -446,7 +447,7 @@ class LargeLanguageModel(AIModel):
def _trigger_invoke_error_callbacks(self, model: str, ex: Exception, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None,
stop: Optional[List[str]] = None, stream: bool = True,
stop: Optional[list[str]] = None, stream: bool = True,
user: Optional[str] = None, callbacks: list[Callback] = None) -> None:
"""
Trigger invoke error callbacks
@@ -527,7 +528,7 @@ class LargeLanguageModel(AIModel):
raise ValueError(
f"Model Parameter {parameter_name} should be less than or equal to {parameter_rule.max}.")
elif parameter_rule.type == ParameterType.FLOAT:
if not isinstance(parameter_value, (float, int)):
if not isinstance(parameter_value, float | int):
raise ValueError(f"Model Parameter {parameter_name} should be float.")
# validate parameter value precision

View File

@@ -1,7 +1,6 @@
import importlib
import os
from abc import ABC, abstractmethod
from typing import Dict
import yaml
@@ -12,7 +11,7 @@ from core.model_runtime.model_providers.__base.ai_model import AIModel
class ModelProvider(ABC):
provider_schema: ProviderEntity = None
model_instance_map: Dict[str, AIModel] = {}
model_instance_map: dict[str, AIModel] = {}
@abstractmethod
def validate_provider_credentials(self, credentials: dict) -> None:
@@ -47,7 +46,7 @@ class ModelProvider(ABC):
yaml_path = os.path.join(current_path, f'{provider_name}.yaml')
yaml_data = {}
if os.path.exists(yaml_path):
with open(yaml_path, 'r', encoding='utf-8') as f:
with open(yaml_path, encoding='utf-8') as f:
yaml_data = yaml.safe_load(f)
try:

View File

@@ -1,4 +1,5 @@
from typing import Generator, List, Optional, Union
from collections.abc import Generator
from typing import Optional, Union
import anthropic
from anthropic import Anthropic, Stream
@@ -29,7 +30,7 @@ class AnthropicLargeLanguageModel(LargeLanguageModel):
def _invoke(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) \
-> Union[LLMResult, Generator]:
"""
@@ -90,7 +91,7 @@ class AnthropicLargeLanguageModel(LargeLanguageModel):
def _generate(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
stop: Optional[List[str]] = None, stream: bool = True,
stop: Optional[list[str]] = None, stream: bool = True,
user: Optional[str] = None) -> Union[LLMResult, Generator]:
"""
Invoke large language model
@@ -255,7 +256,7 @@ class AnthropicLargeLanguageModel(LargeLanguageModel):
return message_text
def _convert_messages_to_prompt_anthropic(self, messages: List[PromptMessage]) -> str:
def _convert_messages_to_prompt_anthropic(self, messages: list[PromptMessage]) -> str:
"""
Format a list of messages into a full prompt for the Anthropic model

View File

@@ -1,6 +1,7 @@
import copy
import logging
from typing import Generator, List, Optional, Union, cast
from collections.abc import Generator
from typing import Optional, Union, cast
import tiktoken
from openai import AzureOpenAI, Stream
@@ -34,7 +35,7 @@ class AzureOpenAILargeLanguageModel(_CommonAzureOpenAI, LargeLanguageModel):
def _invoke(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) \
-> Union[LLMResult, Generator]:
@@ -121,7 +122,7 @@ class AzureOpenAILargeLanguageModel(_CommonAzureOpenAI, LargeLanguageModel):
return ai_model_entity.entity if ai_model_entity else None
def _generate(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict, stop: Optional[List[str]] = None,
prompt_messages: list[PromptMessage], model_parameters: dict, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) -> Union[LLMResult, Generator]:
client = AzureOpenAI(**self._to_credential_kwargs(credentials))
@@ -239,7 +240,7 @@ class AzureOpenAILargeLanguageModel(_CommonAzureOpenAI, LargeLanguageModel):
def _chat_generate(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) -> Union[LLMResult, Generator]:
client = AzureOpenAI(**self._to_credential_kwargs(credentials))
@@ -537,7 +538,7 @@ class AzureOpenAILargeLanguageModel(_CommonAzureOpenAI, LargeLanguageModel):
return num_tokens
def _num_tokens_from_messages(self, credentials: dict, messages: List[PromptMessage],
def _num_tokens_from_messages(self, credentials: dict, messages: list[PromptMessage],
tools: Optional[list[PromptMessageTool]] = None) -> int:
"""Calculate num tokens for gpt-3.5-turbo and gpt-4 with tiktoken package.

View File

@@ -1,7 +1,7 @@
import base64
import copy
import time
from typing import Optional, Tuple, Union
from typing import Optional, Union
import numpy as np
import tiktoken
@@ -149,7 +149,7 @@ class AzureOpenAITextEmbeddingModel(_CommonAzureOpenAI, TextEmbeddingModel):
@staticmethod
def _embedding_invoke(model: str, client: AzureOpenAI, texts: Union[list[str], str],
extra_model_kwargs: dict) -> Tuple[list[list[float]], int]:
extra_model_kwargs: dict) -> tuple[list[list[float]], int]:
response = client.embeddings.create(
input=texts,
model=model,

View File

@@ -1,7 +1,7 @@
import re
class BaichuanTokenizer(object):
class BaichuanTokenizer:
@classmethod
def count_chinese_characters(cls, text: str) -> int:
return len(re.findall(r'[\u4e00-\u9fa5]', text))

View File

@@ -1,7 +1,8 @@
from collections.abc import Generator
from enum import Enum
from hashlib import md5
from json import dumps, loads
from typing import Any, Dict, Generator, List, Union
from typing import Any, Union
from requests import post
@@ -24,10 +25,10 @@ class BaichuanMessage:
role: str = Role.USER.value
content: str
usage: Dict[str, int] = None
usage: dict[str, int] = None
stop_reason: str = ''
def to_dict(self) -> Dict[str, Any]:
def to_dict(self) -> dict[str, Any]:
return {
'role': self.role,
'content': self.content,
@@ -37,7 +38,7 @@ class BaichuanMessage:
self.content = content
self.role = role
class BaichuanModel(object):
class BaichuanModel:
api_key: str
secret_key: str
@@ -106,9 +107,9 @@ class BaichuanModel(object):
message.stop_reason = stop_reason
yield message
def _build_parameters(self, model: str, stream: bool, messages: List[BaichuanMessage],
parameters: Dict[str, Any]) \
-> Dict[str, Any]:
def _build_parameters(self, model: str, stream: bool, messages: list[BaichuanMessage],
parameters: dict[str, Any]) \
-> dict[str, Any]:
if model == 'baichuan2-turbo' or model == 'baichuan2-turbo-192k' or model == 'baichuan2-53b':
prompt_messages = []
for message in messages:
@@ -139,7 +140,7 @@ class BaichuanModel(object):
else:
raise BadRequestError(f"Unknown model: {model}")
def _build_headers(self, model: str, data: Dict[str, Any]) -> Dict[str, Any]:
def _build_headers(self, model: str, data: dict[str, Any]) -> dict[str, Any]:
if model == 'baichuan2-turbo' or model == 'baichuan2-turbo-192k' or model == 'baichuan2-53b':
# there is no secret key for turbo api
return {
@@ -153,8 +154,8 @@ class BaichuanModel(object):
def _calculate_md5(self, input_string):
return md5(input_string.encode('utf-8')).hexdigest()
def generate(self, model: str, stream: bool, messages: List[BaichuanMessage],
parameters: Dict[str, Any], timeout: int) \
def generate(self, model: str, stream: bool, messages: list[BaichuanMessage],
parameters: dict[str, Any], timeout: int) \
-> Union[Generator, BaichuanMessage]:
if model == 'baichuan2-turbo' or model == 'baichuan2-turbo-192k' or model == 'baichuan2-53b':

View File

@@ -1,4 +1,5 @@
from typing import Generator, List, cast
from collections.abc import Generator
from typing import cast
from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk, LLMResultChunkDelta
from core.model_runtime.entities.message_entities import (
@@ -33,7 +34,7 @@ from core.model_runtime.model_providers.baichuan.llm.baichuan_turbo_errors impor
class BaichuanLarguageModel(LargeLanguageModel):
def _invoke(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: list[PromptMessageTool] | None = None, stop: List[str] | None = None,
tools: list[PromptMessageTool] | None = None, stop: list[str] | None = None,
stream: bool = True, user: str | None = None) \
-> LLMResult | Generator:
return self._generate(model=model, credentials=credentials, prompt_messages=prompt_messages,
@@ -43,7 +44,7 @@ class BaichuanLarguageModel(LargeLanguageModel):
tools: list[PromptMessageTool] | None = None) -> int:
return self._num_tokens_from_messages(prompt_messages)
def _num_tokens_from_messages(self, messages: List[PromptMessage],) -> int:
def _num_tokens_from_messages(self, messages: list[PromptMessage],) -> int:
"""Calculate num tokens for baichuan model"""
def tokens(text: str):
return BaichuanTokenizer._get_num_tokens(text)
@@ -107,7 +108,7 @@ class BaichuanLarguageModel(LargeLanguageModel):
def _generate(self, model: str, credentials: dict, prompt_messages: list[PromptMessage],
model_parameters: dict, tools: list[PromptMessageTool] | None = None,
stop: List[str] | None = None, stream: bool = True, user: str | None = None) \
stop: list[str] | None = None, stream: bool = True, user: str | None = None) \
-> LLMResult | Generator:
if tools is not None and len(tools) > 0:
raise InvokeBadRequestError("Baichuan model doesn't support tools")

View File

@@ -1,6 +1,6 @@
import time
from json import dumps
from typing import Optional, Tuple
from typing import Optional
from requests import post
@@ -84,7 +84,7 @@ class BaichuanTextEmbeddingModel(TextEmbeddingModel):
return result
def embedding(self, model: str, api_key, texts: list[str], user: Optional[str] = None) \
-> Tuple[list[list[float]], int]:
-> tuple[list[list[float]], int]:
"""
Embed given texts

View File

@@ -1,6 +1,7 @@
import json
import logging
from typing import Generator, List, Optional, Union
from collections.abc import Generator
from typing import Optional, Union
import boto3
from botocore.config import Config
@@ -37,7 +38,7 @@ class BedrockLargeLanguageModel(LargeLanguageModel):
def _invoke(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) \
-> Union[LLMResult, Generator]:
"""
@@ -159,7 +160,7 @@ class BedrockLargeLanguageModel(LargeLanguageModel):
return message_text
def _convert_messages_to_prompt(self, messages: List[PromptMessage], model_prefix: str) -> str:
def _convert_messages_to_prompt(self, messages: list[PromptMessage], model_prefix: str) -> str:
"""
Format a list of messages into a full prompt for the Anthropic, Amazon and Llama models
@@ -181,7 +182,7 @@ class BedrockLargeLanguageModel(LargeLanguageModel):
# trim off the trailing ' ' that might come from the "Assistant: "
return text.rstrip()
def _create_payload(self, model_prefix: str, prompt_messages: list[PromptMessage], model_parameters: dict, stop: Optional[List[str]] = None, stream: bool = True):
def _create_payload(self, model_prefix: str, prompt_messages: list[PromptMessage], model_parameters: dict, stop: Optional[list[str]] = None, stream: bool = True):
"""
Create payload for bedrock api call depending on model provider
"""
@@ -231,7 +232,7 @@ class BedrockLargeLanguageModel(LargeLanguageModel):
def _generate(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
stop: Optional[List[str]] = None, stream: bool = True,
stop: Optional[list[str]] = None, stream: bool = True,
user: Optional[str] = None) -> Union[LLMResult, Generator]:
"""
Invoke large language model

View File

@@ -1,6 +1,7 @@
import logging
from collections.abc import Generator
from os.path import join
from typing import Generator, List, Optional, cast
from typing import Optional, cast
from httpx import Timeout
from openai import (
@@ -45,7 +46,7 @@ logger = logging.getLogger(__name__)
class ChatGLMLargeLanguageModel(LargeLanguageModel):
def _invoke(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: list[PromptMessageTool] | None = None, stop: List[str] | None = None,
tools: list[PromptMessageTool] | None = None, stop: list[str] | None = None,
stream: bool = True, user: str | None = None) \
-> LLMResult | Generator:
"""
@@ -138,7 +139,7 @@ class ChatGLMLargeLanguageModel(LargeLanguageModel):
def _generate(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: list[PromptMessageTool] | None = None, stop: List[str] | None = None,
tools: list[PromptMessageTool] | None = None, stop: list[str] | None = None,
stream: bool = True, user: str | None = None) \
-> LLMResult | Generator:
"""
@@ -394,7 +395,7 @@ class ChatGLMLargeLanguageModel(LargeLanguageModel):
return num_tokens
def _num_tokens_from_messages(self, messages: List[PromptMessage],
def _num_tokens_from_messages(self, messages: list[PromptMessage],
tools: Optional[list[PromptMessageTool]] = None) -> int:
"""Calculate num tokens for chatglm2 and chatglm3 with GPT2 tokenizer.

View File

@@ -1,5 +1,6 @@
import logging
from typing import Generator, List, Optional, Tuple, Union, cast
from collections.abc import Generator
from typing import Optional, Union, cast
import cohere
from cohere.responses import Chat, Generations
@@ -38,7 +39,7 @@ class CohereLargeLanguageModel(LargeLanguageModel):
def _invoke(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) \
-> Union[LLMResult, Generator]:
"""
@@ -138,7 +139,7 @@ class CohereLargeLanguageModel(LargeLanguageModel):
raise CredentialsValidateFailedError(str(ex))
def _generate(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict, stop: Optional[List[str]] = None,
prompt_messages: list[PromptMessage], model_parameters: dict, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) -> Union[LLMResult, Generator]:
"""
Invoke llm model
@@ -264,7 +265,7 @@ class CohereLargeLanguageModel(LargeLanguageModel):
break
def _chat_generate(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict, stop: Optional[List[str]] = None,
prompt_messages: list[PromptMessage], model_parameters: dict, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) -> Union[LLMResult, Generator]:
"""
Invoke llm chat model
@@ -306,7 +307,7 @@ class CohereLargeLanguageModel(LargeLanguageModel):
return self._handle_chat_generate_response(model, credentials, response, prompt_messages, stop)
def _handle_chat_generate_response(self, model: str, credentials: dict, response: Chat,
prompt_messages: list[PromptMessage], stop: Optional[List[str]] = None) \
prompt_messages: list[PromptMessage], stop: Optional[list[str]] = None) \
-> LLMResult:
"""
Handle llm chat response
@@ -352,7 +353,7 @@ class CohereLargeLanguageModel(LargeLanguageModel):
def _handle_chat_generate_stream_response(self, model: str, credentials: dict, response: StreamingChat,
prompt_messages: list[PromptMessage],
stop: Optional[List[str]] = None) -> Generator:
stop: Optional[list[str]] = None) -> Generator:
"""
Handle llm chat stream response
@@ -427,7 +428,7 @@ class CohereLargeLanguageModel(LargeLanguageModel):
index += 1
def _convert_prompt_messages_to_message_and_chat_histories(self, prompt_messages: list[PromptMessage]) \
-> Tuple[str, list[dict]]:
-> tuple[str, list[dict]]:
"""
Convert prompt messages to message and chat histories
:param prompt_messages: prompt messages
@@ -495,7 +496,7 @@ class CohereLargeLanguageModel(LargeLanguageModel):
return response.length
def _num_tokens_from_messages(self, model: str, credentials: dict, messages: List[PromptMessage]) -> int:
def _num_tokens_from_messages(self, model: str, credentials: dict, messages: list[PromptMessage]) -> int:
"""Calculate num tokens Cohere model."""
messages = [self._convert_prompt_message_to_dict(m) for m in messages]
message_strs = [f"{message['role']}: {message['message']}" for message in messages]

View File

@@ -1,5 +1,5 @@
import time
from typing import Optional, Tuple
from typing import Optional
import cohere
import numpy as np
@@ -168,7 +168,7 @@ class CohereTextEmbeddingModel(TextEmbeddingModel):
except Exception as ex:
raise CredentialsValidateFailedError(str(ex))
def _embedding_invoke(self, model: str, credentials: dict, texts: list[str]) -> Tuple[list[list[float]], int]:
def _embedding_invoke(self, model: str, credentials: dict, texts: list[str]) -> tuple[list[list[float]], int]:
"""
Invoke embedding model

View File

@@ -1,5 +1,6 @@
import logging
from typing import Generator, List, Optional, Union
from collections.abc import Generator
from typing import Optional, Union
import google.api_core.exceptions as exceptions
import google.generativeai as genai
@@ -34,7 +35,7 @@ class GoogleLargeLanguageModel(LargeLanguageModel):
def _invoke(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) \
-> Union[LLMResult, Generator]:
"""
@@ -103,7 +104,7 @@ class GoogleLargeLanguageModel(LargeLanguageModel):
def _generate(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
stop: Optional[List[str]] = None, stream: bool = True,
stop: Optional[list[str]] = None, stream: bool = True,
user: Optional[str] = None) -> Union[LLMResult, Generator]:
"""
Invoke large language model

View File

@@ -1,4 +1,5 @@
from typing import Generator, List, Optional, Union
from collections.abc import Generator
from typing import Optional, Union
from huggingface_hub import InferenceClient
from huggingface_hub.hf_api import HfApi
@@ -29,7 +30,7 @@ from core.model_runtime.model_providers.huggingface_hub._common import _CommonHu
class HuggingfaceHubLargeLanguageModel(_CommonHuggingfaceHub, LargeLanguageModel):
def _invoke(self, model: str, credentials: dict, prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, stream: bool = True,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None, stream: bool = True,
user: Optional[str] = None) -> Union[LLMResult, Generator]:
client = InferenceClient(token=credentials['huggingfacehub_api_token'])

View File

@@ -1,5 +1,6 @@
from collections.abc import Generator
from os.path import join
from typing import Generator, List, cast
from typing import cast
from httpx import Timeout
from openai import (
@@ -52,7 +53,7 @@ from core.model_runtime.utils import helper
class LocalAILarguageModel(LargeLanguageModel):
def _invoke(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: list[PromptMessageTool] | None = None, stop: List[str] | None = None,
tools: list[PromptMessageTool] | None = None, stop: list[str] | None = None,
stream: bool = True, user: str | None = None) \
-> LLMResult | Generator:
return self._generate(model=model, credentials=credentials, prompt_messages=prompt_messages,
@@ -63,7 +64,7 @@ class LocalAILarguageModel(LargeLanguageModel):
# tools is not supported yet
return self._num_tokens_from_messages(prompt_messages, tools=tools)
def _num_tokens_from_messages(self, messages: List[PromptMessage], tools: list[PromptMessageTool]) -> int:
def _num_tokens_from_messages(self, messages: list[PromptMessage], tools: list[PromptMessageTool]) -> int:
"""
Calculate num tokens for baichuan model
LocalAI does not supports
@@ -241,7 +242,7 @@ class LocalAILarguageModel(LargeLanguageModel):
def _generate(self, model: str, credentials: dict, prompt_messages: list[PromptMessage],
model_parameters: dict, tools: list[PromptMessageTool] | None = None,
stop: List[str] | None = None, stream: bool = True, user: str | None = None) \
stop: list[str] | None = None, stream: bool = True, user: str | None = None) \
-> LLMResult | Generator:
kwargs = self._to_client_kwargs(credentials)
@@ -346,7 +347,7 @@ class LocalAILarguageModel(LargeLanguageModel):
return message_dict
def _convert_prompt_message_to_completion_prompts(self, messages: List[PromptMessage]) -> str:
def _convert_prompt_message_to_completion_prompts(self, messages: list[PromptMessage]) -> str:
"""
Convert PromptMessage to completion prompts
"""

View File

@@ -1,5 +1,6 @@
from collections.abc import Generator
from json import dumps, loads
from typing import Any, Dict, Generator, List, Union
from typing import Any, Union
from requests import Response, post
@@ -14,13 +15,13 @@ from core.model_runtime.model_providers.minimax.llm.errors import (
from core.model_runtime.model_providers.minimax.llm.types import MinimaxMessage
class MinimaxChatCompletion(object):
class MinimaxChatCompletion:
"""
Minimax Chat Completion API
"""
def generate(self, model: str, api_key: str, group_id: str,
prompt_messages: List[MinimaxMessage], model_parameters: dict,
tools: List[Dict[str, Any]], stop: List[str] | None, stream: bool, user: str) \
prompt_messages: list[MinimaxMessage], model_parameters: dict,
tools: list[dict[str, Any]], stop: list[str] | None, stream: bool, user: str) \
-> Union[MinimaxMessage, Generator[MinimaxMessage, None, None]]:
"""
generate chat completion

View File

@@ -1,5 +1,6 @@
from collections.abc import Generator
from json import dumps, loads
from typing import Any, Dict, Generator, List, Union
from typing import Any, Union
from requests import Response, post
@@ -14,14 +15,14 @@ from core.model_runtime.model_providers.minimax.llm.errors import (
from core.model_runtime.model_providers.minimax.llm.types import MinimaxMessage
class MinimaxChatCompletionPro(object):
class MinimaxChatCompletionPro:
"""
Minimax Chat Completion Pro API, supports function calling
however, we do not have enough time and energy to implement it, but the parameters are reserved
"""
def generate(self, model: str, api_key: str, group_id: str,
prompt_messages: List[MinimaxMessage], model_parameters: dict,
tools: List[Dict[str, Any]], stop: List[str] | None, stream: bool, user: str) \
prompt_messages: list[MinimaxMessage], model_parameters: dict,
tools: list[dict[str, Any]], stop: list[str] | None, stream: bool, user: str) \
-> Union[MinimaxMessage, Generator[MinimaxMessage, None, None]]:
"""
generate chat completion

View File

@@ -1,4 +1,4 @@
from typing import Generator, List
from collections.abc import Generator
from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk, LLMResultChunkDelta
from core.model_runtime.entities.message_entities import (
@@ -42,7 +42,7 @@ class MinimaxLargeLanguageModel(LargeLanguageModel):
def _invoke(self, model: str, credentials: dict, prompt_messages: list[PromptMessage],
model_parameters: dict, tools: list[PromptMessageTool] | None = None,
stop: List[str] | None = None, stream: bool = True, user: str | None = None) \
stop: list[str] | None = None, stream: bool = True, user: str | None = None) \
-> LLMResult | Generator:
return self._generate(model, credentials, prompt_messages, model_parameters, tools, stop, stream, user)
@@ -79,7 +79,7 @@ class MinimaxLargeLanguageModel(LargeLanguageModel):
tools: list[PromptMessageTool] | None = None) -> int:
return self._num_tokens_from_messages(prompt_messages, tools)
def _num_tokens_from_messages(self, messages: List[PromptMessage], tools: list[PromptMessageTool]) -> int:
def _num_tokens_from_messages(self, messages: list[PromptMessage], tools: list[PromptMessageTool]) -> int:
"""
Calculate num tokens for minimax model
@@ -94,7 +94,7 @@ class MinimaxLargeLanguageModel(LargeLanguageModel):
def _generate(self, model: str, credentials: dict, prompt_messages: list[PromptMessage],
model_parameters: dict, tools: list[PromptMessageTool] | None = None,
stop: List[str] | None = None, stream: bool = True, user: str | None = None) \
stop: list[str] | None = None, stream: bool = True, user: str | None = None) \
-> LLMResult | Generator:
"""
use MinimaxChatCompletionPro as the type of client, anyway, MinimaxChatCompletion has the same interface

View File

@@ -1,5 +1,5 @@
from enum import Enum
from typing import Any, Dict
from typing import Any
class MinimaxMessage:
@@ -11,11 +11,11 @@ class MinimaxMessage:
role: str = Role.USER.value
content: str
usage: Dict[str, int] = None
usage: dict[str, int] = None
stop_reason: str = ''
function_call: Dict[str, Any] = None
function_call: dict[str, Any] = None
def to_dict(self) -> Dict[str, Any]:
def to_dict(self) -> dict[str, Any]:
if self.function_call and self.role == MinimaxMessage.Role.ASSISTANT.value:
return {
'sender_type': 'BOT',

View File

@@ -220,7 +220,7 @@ class ModelProviderFactory:
# read _position.yaml file
position_map = {}
if os.path.exists(position_file_path):
with open(position_file_path, 'r', encoding='utf-8') as f:
with open(position_file_path, encoding='utf-8') as f:
positions = yaml.safe_load(f)
# convert list to dict with key as model provider name, value as index
position_map = {position: index for index, position in enumerate(positions)}

View File

@@ -1,4 +1,5 @@
from typing import Generator, List, Optional, Union
from collections.abc import Generator
from typing import Optional, Union
from core.model_runtime.entities.llm_entities import LLMResult
from core.model_runtime.entities.message_entities import PromptMessage, PromptMessageTool
@@ -8,7 +9,7 @@ from core.model_runtime.model_providers.openai_api_compatible.llm.llm import OAI
class MoonshotLargeLanguageModel(OAIAPICompatLargeLanguageModel):
def _invoke(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) \
-> Union[LLMResult, Generator]:
self._add_custom_parameters(credentials)

View File

@@ -1,8 +1,9 @@
import json
import logging
import re
from collections.abc import Generator
from decimal import Decimal
from typing import Generator, List, Optional, Union, cast
from typing import Optional, Union, cast
from urllib.parse import urljoin
import requests
@@ -51,7 +52,7 @@ class OllamaLargeLanguageModel(LargeLanguageModel):
def _invoke(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) \
-> Union[LLMResult, Generator]:
"""
@@ -131,7 +132,7 @@ class OllamaLargeLanguageModel(LargeLanguageModel):
raise CredentialsValidateFailedError(f'An error occurred during credentials validation: {str(ex)}')
def _generate(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict, stop: Optional[List[str]] = None,
prompt_messages: list[PromptMessage], model_parameters: dict, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) -> Union[LLMResult, Generator]:
"""
Invoke llm completion model
@@ -398,7 +399,7 @@ class OllamaLargeLanguageModel(LargeLanguageModel):
return message_dict
def _num_tokens_from_messages(self, messages: List[PromptMessage]) -> int:
def _num_tokens_from_messages(self, messages: list[PromptMessage]) -> int:
"""
Calculate num tokens.

View File

@@ -1,5 +1,6 @@
import logging
from typing import Generator, List, Optional, Union, cast
from collections.abc import Generator
from typing import Optional, Union, cast
import tiktoken
from openai import OpenAI, Stream
@@ -35,7 +36,7 @@ class OpenAILargeLanguageModel(_CommonOpenAI, LargeLanguageModel):
def _invoke(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) \
-> Union[LLMResult, Generator]:
"""
@@ -215,7 +216,7 @@ class OpenAILargeLanguageModel(_CommonOpenAI, LargeLanguageModel):
return ai_model_entities
def _generate(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict, stop: Optional[List[str]] = None,
prompt_messages: list[PromptMessage], model_parameters: dict, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) -> Union[LLMResult, Generator]:
"""
Invoke llm completion model
@@ -366,7 +367,7 @@ class OpenAILargeLanguageModel(_CommonOpenAI, LargeLanguageModel):
def _chat_generate(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) -> Union[LLMResult, Generator]:
"""
Invoke llm chat model
@@ -706,7 +707,7 @@ class OpenAILargeLanguageModel(_CommonOpenAI, LargeLanguageModel):
return num_tokens
def _num_tokens_from_messages(self, model: str, messages: List[PromptMessage],
def _num_tokens_from_messages(self, model: str, messages: list[PromptMessage],
tools: Optional[list[PromptMessageTool]] = None) -> int:
"""Calculate num tokens for gpt-3.5-turbo and gpt-4 with tiktoken package.

View File

@@ -1,6 +1,6 @@
import base64
import time
from typing import Optional, Tuple, Union
from typing import Optional, Union
import numpy as np
import tiktoken
@@ -162,7 +162,7 @@ class OpenAITextEmbeddingModel(_CommonOpenAI, TextEmbeddingModel):
raise CredentialsValidateFailedError(str(ex))
def _embedding_invoke(self, model: str, client: OpenAI, texts: Union[list[str], str],
extra_model_kwargs: dict) -> Tuple[list[list[float]], int]:
extra_model_kwargs: dict) -> tuple[list[list[float]], int]:
"""
Invoke embedding model

View File

@@ -1,7 +1,8 @@
import json
import logging
from collections.abc import Generator
from decimal import Decimal
from typing import Generator, List, Optional, Union, cast
from typing import Optional, Union, cast
from urllib.parse import urljoin
import requests
@@ -46,7 +47,7 @@ class OAIAPICompatLargeLanguageModel(_CommonOAI_API_Compat, LargeLanguageModel):
def _invoke(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) \
-> Union[LLMResult, Generator]:
"""
@@ -245,7 +246,7 @@ class OAIAPICompatLargeLanguageModel(_CommonOAI_API_Compat, LargeLanguageModel):
# validate_credentials method has been rewritten to use the requests library for compatibility with all providers following OpenAI's API standard.
def _generate(self, model: str, credentials: dict, prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, \
user: Optional[str] = None) -> Union[LLMResult, Generator]:
"""
@@ -567,7 +568,7 @@ class OAIAPICompatLargeLanguageModel(_CommonOAI_API_Compat, LargeLanguageModel):
return num_tokens
def _num_tokens_from_messages(self, model: str, messages: List[PromptMessage],
def _num_tokens_from_messages(self, model: str, messages: list[PromptMessage],
tools: Optional[list[PromptMessageTool]] = None) -> int:
"""
Approximate num tokens with GPT2 tokenizer.

View File

@@ -1,4 +1,4 @@
from typing import Generator, List
from collections.abc import Generator
from core.model_runtime.entities.common_entities import I18nObject
from core.model_runtime.entities.llm_entities import LLMMode, LLMResult, LLMResultChunk, LLMResultChunkDelta
@@ -40,7 +40,7 @@ from core.model_runtime.model_providers.openllm.llm.openllm_generate_errors impo
class OpenLLMLargeLanguageModel(LargeLanguageModel):
def _invoke(self, model: str, credentials: dict, prompt_messages: list[PromptMessage],
model_parameters: dict, tools: list[PromptMessageTool] | None = None,
stop: List[str] | None = None, stream: bool = True, user: str | None = None) \
stop: list[str] | None = None, stream: bool = True, user: str | None = None) \
-> LLMResult | Generator:
return self._generate(model, credentials, prompt_messages, model_parameters, tools, stop, stream, user)
@@ -77,7 +77,7 @@ class OpenLLMLargeLanguageModel(LargeLanguageModel):
tools: list[PromptMessageTool] | None = None) -> int:
return self._num_tokens_from_messages(prompt_messages, tools)
def _num_tokens_from_messages(self, messages: List[PromptMessage], tools: list[PromptMessageTool]) -> int:
def _num_tokens_from_messages(self, messages: list[PromptMessage], tools: list[PromptMessageTool]) -> int:
"""
Calculate num tokens for OpenLLM model
it's a generate model, so we just join them by spe
@@ -87,7 +87,7 @@ class OpenLLMLargeLanguageModel(LargeLanguageModel):
def _generate(self, model: str, credentials: dict, prompt_messages: list[PromptMessage],
model_parameters: dict, tools: list[PromptMessageTool] | None = None,
stop: List[str] | None = None, stream: bool = True, user: str | None = None) \
stop: list[str] | None = None, stream: bool = True, user: str | None = None) \
-> LLMResult | Generator:
client = OpenLLMGenerate()
response = client.generate(

View File

@@ -1,6 +1,7 @@
from collections.abc import Generator
from enum import Enum
from json import dumps, loads
from typing import Any, Dict, Generator, List, Union
from typing import Any, Union
from requests import Response, post
from requests.exceptions import ConnectionError, InvalidSchema, MissingSchema
@@ -19,10 +20,10 @@ class OpenLLMGenerateMessage:
role: str = Role.USER.value
content: str
usage: Dict[str, int] = None
usage: dict[str, int] = None
stop_reason: str = ''
def to_dict(self) -> Dict[str, Any]:
def to_dict(self) -> dict[str, Any]:
return {
'role': self.role,
'content': self.content,
@@ -33,10 +34,10 @@ class OpenLLMGenerateMessage:
self.role = role
class OpenLLMGenerate(object):
class OpenLLMGenerate:
def generate(
self, server_url: str, model_name: str, stream: bool, model_parameters: Dict[str, Any],
stop: List[str], prompt_messages: List[OpenLLMGenerateMessage], user: str,
self, server_url: str, model_name: str, stream: bool, model_parameters: dict[str, Any],
stop: list[str], prompt_messages: list[OpenLLMGenerateMessage], user: str,
) -> Union[Generator[OpenLLMGenerateMessage, None, None], OpenLLMGenerateMessage]:
if not server_url:
raise InvalidAuthenticationError('Invalid server URL')

View File

@@ -1,4 +1,5 @@
from typing import Generator, List, Optional, Union
from collections.abc import Generator
from typing import Optional, Union
from replicate import Client as ReplicateClient
from replicate.exceptions import ReplicateError
@@ -29,7 +30,7 @@ from core.model_runtime.model_providers.replicate._common import _CommonReplicat
class ReplicateLargeLanguageModel(_CommonReplicate, LargeLanguageModel):
def _invoke(self, model: str, credentials: dict, prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, stream: bool = True,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None, stream: bool = True,
user: Optional[str] = None) -> Union[LLMResult, Generator]:
version = credentials['model_version']

View File

@@ -1,5 +1,6 @@
import threading
from typing import Generator, List, Optional, Union
from collections.abc import Generator
from typing import Optional, Union
from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk, LLMResultChunkDelta
from core.model_runtime.entities.message_entities import (
@@ -27,7 +28,7 @@ class SparkLargeLanguageModel(LargeLanguageModel):
def _invoke(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) \
-> Union[LLMResult, Generator]:
"""
@@ -86,7 +87,7 @@ class SparkLargeLanguageModel(LargeLanguageModel):
def _generate(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
stop: Optional[List[str]] = None, stream: bool = True,
stop: Optional[list[str]] = None, stream: bool = True,
user: Optional[str] = None) -> Union[LLMResult, Generator]:
"""
Invoke large language model
@@ -244,7 +245,7 @@ class SparkLargeLanguageModel(LargeLanguageModel):
return message_text
def _convert_messages_to_prompt(self, messages: List[PromptMessage]) -> str:
def _convert_messages_to_prompt(self, messages: list[PromptMessage]) -> str:
"""
Format a list of messages into a full prompt for the Anthropic model

View File

@@ -1,4 +1,5 @@
from typing import Generator, List, Optional, Union
from collections.abc import Generator
from typing import Optional, Union
from core.model_runtime.entities.llm_entities import LLMResult
from core.model_runtime.entities.message_entities import PromptMessage, PromptMessageTool
@@ -14,7 +15,7 @@ class TogetherAILargeLanguageModel(OAIAPICompatLargeLanguageModel):
def _invoke(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) \
-> Union[LLMResult, Generator]:
cred_with_endpoint = self._update_endpoint_url(credentials=credentials)
@@ -27,7 +28,7 @@ class TogetherAILargeLanguageModel(OAIAPICompatLargeLanguageModel):
return super().validate_credentials(model, cred_with_endpoint)
def _generate(self, model: str, credentials: dict, prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) -> Union[LLMResult, Generator]:
cred_with_endpoint = self._update_endpoint_url(credentials=credentials)

View File

@@ -1,4 +1,4 @@
from typing import Any, Dict, List, Optional
from typing import Any, Optional
from langchain.callbacks.manager import CallbackManagerForLLMRun
from langchain.llms import Tongyi
@@ -8,7 +8,7 @@ from langchain.schema import Generation, LLMResult
class EnhanceTongyi(Tongyi):
@property
def _default_params(self) -> Dict[str, Any]:
def _default_params(self) -> dict[str, Any]:
"""Get the default parameters for calling OpenAI API."""
normal_params = {
"top_p": self.top_p,
@@ -19,13 +19,13 @@ class EnhanceTongyi(Tongyi):
def _generate(
self,
prompts: List[str],
stop: Optional[List[str]] = None,
prompts: list[str],
stop: Optional[list[str]] = None,
run_manager: Optional[CallbackManagerForLLMRun] = None,
**kwargs: Any,
) -> LLMResult:
generations = []
params: Dict[str, Any] = {
params: dict[str, Any] = {
**{"model": self.model_name},
**self._default_params,
**kwargs,

View File

@@ -1,4 +1,5 @@
from typing import Generator, List, Optional, Union
from collections.abc import Generator
from typing import Optional, Union
from dashscope import get_tokenizer
from dashscope.api_entities.dashscope_response import DashScopeAPIResponse
@@ -38,7 +39,7 @@ class TongyiLargeLanguageModel(LargeLanguageModel):
def _invoke(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) \
-> Union[LLMResult, Generator]:
"""
@@ -100,7 +101,7 @@ class TongyiLargeLanguageModel(LargeLanguageModel):
def _generate(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
stop: Optional[List[str]] = None, stream: bool = True,
stop: Optional[list[str]] = None, stream: bool = True,
user: Optional[str] = None) -> Union[LLMResult, Generator]:
"""
Invoke large language model
@@ -268,7 +269,7 @@ class TongyiLargeLanguageModel(LargeLanguageModel):
return message_text
def _convert_messages_to_prompt(self, messages: List[PromptMessage]) -> str:
def _convert_messages_to_prompt(self, messages: list[PromptMessage]) -> str:
"""
Format a list of messages into a full prompt for the Anthropic model

View File

@@ -1,8 +1,9 @@
from collections.abc import Generator
from datetime import datetime, timedelta
from enum import Enum
from json import dumps, loads
from threading import Lock
from typing import Any, Dict, Generator, List, Union
from typing import Any, Union
from requests import Response, post
@@ -16,7 +17,7 @@ from core.model_runtime.model_providers.wenxin.llm.ernie_bot_errors import (
)
# map api_key to access_token
baidu_access_tokens: Dict[str, 'BaiduAccessToken'] = {}
baidu_access_tokens: dict[str, 'BaiduAccessToken'] = {}
baidu_access_tokens_lock = Lock()
class BaiduAccessToken:
@@ -105,10 +106,10 @@ class ErnieMessage:
role: str = Role.USER.value
content: str
usage: Dict[str, int] = None
usage: dict[str, int] = None
stop_reason: str = ''
def to_dict(self) -> Dict[str, Any]:
def to_dict(self) -> dict[str, Any]:
return {
'role': self.role,
'content': self.content,
@@ -118,7 +119,7 @@ class ErnieMessage:
self.content = content
self.role = role
class ErnieBotModel(object):
class ErnieBotModel:
api_bases = {
'ernie-bot': 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions',
'ernie-bot-4': 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro',
@@ -138,9 +139,9 @@ class ErnieBotModel(object):
self.api_key = api_key
self.secret_key = secret_key
def generate(self, model: str, stream: bool, messages: List[ErnieMessage],
parameters: Dict[str, Any], timeout: int, tools: List[PromptMessageTool], \
stop: List[str], user: str) \
def generate(self, model: str, stream: bool, messages: list[ErnieMessage],
parameters: dict[str, Any], timeout: int, tools: list[PromptMessageTool], \
stop: list[str], user: str) \
-> Union[Generator[ErnieMessage, None, None], ErnieMessage]:
# check parameters
@@ -216,11 +217,11 @@ class ErnieBotModel(object):
token = BaiduAccessToken.get_access_token(self.api_key, self.secret_key)
return token.access_token
def _copy_messages(self, messages: List[ErnieMessage]) -> List[ErnieMessage]:
def _copy_messages(self, messages: list[ErnieMessage]) -> list[ErnieMessage]:
return [ErnieMessage(message.content, message.role) for message in messages]
def _check_parameters(self, model: str, parameters: Dict[str, Any],
tools: List[PromptMessageTool], stop: List[str]) -> None:
def _check_parameters(self, model: str, parameters: dict[str, Any],
tools: list[PromptMessageTool], stop: list[str]) -> None:
if model not in self.api_bases:
raise BadRequestError(f'Invalid model: {model}')
@@ -241,16 +242,16 @@ class ErnieBotModel(object):
if len(s) > 20:
raise BadRequestError('stop item should not exceed 20 characters.')
def _build_request_body(self, model: str, messages: List[ErnieMessage], stream: bool, parameters: Dict[str, Any],
tools: List[PromptMessageTool], stop: List[str], user: str) -> Dict[str, Any]:
def _build_request_body(self, model: str, messages: list[ErnieMessage], stream: bool, parameters: dict[str, Any],
tools: list[PromptMessageTool], stop: list[str], user: str) -> dict[str, Any]:
# if model in self.function_calling_supports:
# return self._build_function_calling_request_body(model, messages, parameters, tools, stop, user)
return self._build_chat_request_body(model, messages, stream, parameters, stop, user)
def _build_function_calling_request_body(self, model: str, messages: List[ErnieMessage], stream: bool,
parameters: Dict[str, Any], tools: List[PromptMessageTool],
stop: List[str], user: str) \
-> Dict[str, Any]:
def _build_function_calling_request_body(self, model: str, messages: list[ErnieMessage], stream: bool,
parameters: dict[str, Any], tools: list[PromptMessageTool],
stop: list[str], user: str) \
-> dict[str, Any]:
if len(messages) % 2 == 0:
raise BadRequestError('The number of messages should be odd.')
if messages[0].role == 'function':
@@ -260,9 +261,9 @@ class ErnieBotModel(object):
TODO: implement function calling
"""
def _build_chat_request_body(self, model: str, messages: List[ErnieMessage], stream: bool,
parameters: Dict[str, Any], stop: List[str], user: str) \
-> Dict[str, Any]:
def _build_chat_request_body(self, model: str, messages: list[ErnieMessage], stream: bool,
parameters: dict[str, Any], stop: list[str], user: str) \
-> dict[str, Any]:
if len(messages) == 0:
raise BadRequestError('The number of messages should not be zero.')

View File

@@ -1,4 +1,5 @@
from typing import Generator, List, cast
from collections.abc import Generator
from typing import cast
from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk, LLMResultChunkDelta
from core.model_runtime.entities.message_entities import (
@@ -32,7 +33,7 @@ from core.model_runtime.model_providers.wenxin.llm.ernie_bot_errors import (
class ErnieBotLarguageModel(LargeLanguageModel):
def _invoke(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: list[PromptMessageTool] | None = None, stop: List[str] | None = None,
tools: list[PromptMessageTool] | None = None, stop: list[str] | None = None,
stream: bool = True, user: str | None = None) \
-> LLMResult | Generator:
return self._generate(model=model, credentials=credentials, prompt_messages=prompt_messages,
@@ -43,7 +44,7 @@ class ErnieBotLarguageModel(LargeLanguageModel):
# tools is not supported yet
return self._num_tokens_from_messages(prompt_messages)
def _num_tokens_from_messages(self, messages: List[PromptMessage],) -> int:
def _num_tokens_from_messages(self, messages: list[PromptMessage],) -> int:
"""Calculate num tokens for baichuan model"""
def tokens(text: str):
return self._get_num_tokens_by_gpt2(text)
@@ -78,7 +79,7 @@ class ErnieBotLarguageModel(LargeLanguageModel):
def _generate(self, model: str, credentials: dict, prompt_messages: list[PromptMessage],
model_parameters: dict, tools: list[PromptMessageTool] | None = None,
stop: List[str] | None = None, stream: bool = True, user: str | None = None) \
stop: list[str] | None = None, stream: bool = True, user: str | None = None) \
-> LLMResult | Generator:
instance = ErnieBotModel(
api_key=credentials['api_key'],

View File

@@ -1,4 +1,5 @@
from typing import Generator, Iterator, List, cast
from collections.abc import Generator, Iterator
from typing import cast
from openai import (
APIConnectionError,
@@ -62,7 +63,7 @@ from core.model_runtime.utils import helper
class XinferenceAILargeLanguageModel(LargeLanguageModel):
def _invoke(self, model: str, credentials: dict, prompt_messages: list[PromptMessage],
model_parameters: dict, tools: list[PromptMessageTool] | None = None,
stop: List[str] | None = None, stream: bool = True, user: str | None = None) \
stop: list[str] | None = None, stream: bool = True, user: str | None = None) \
-> LLMResult | Generator:
"""
invoke LLM
@@ -131,7 +132,7 @@ class XinferenceAILargeLanguageModel(LargeLanguageModel):
"""
return self._num_tokens_from_messages(prompt_messages, tools)
def _num_tokens_from_messages(self, messages: List[PromptMessage], tools: list[PromptMessageTool],
def _num_tokens_from_messages(self, messages: list[PromptMessage], tools: list[PromptMessageTool],
is_completion_model: bool = False) -> int:
def tokens(text: str):
return self._get_num_tokens_by_gpt2(text)
@@ -359,7 +360,7 @@ class XinferenceAILargeLanguageModel(LargeLanguageModel):
def _generate(self, model: str, credentials: dict, prompt_messages: list[PromptMessage],
model_parameters: dict, extra_model_kwargs: XinferenceModelExtraParameter,
tools: list[PromptMessageTool] | None = None,
stop: List[str] | None = None, stream: bool = True, user: str | None = None) \
stop: list[str] | None = None, stream: bool = True, user: str | None = None) \
-> LLMResult | Generator:
"""
generate text from LLM
@@ -404,7 +405,7 @@ class XinferenceAILargeLanguageModel(LargeLanguageModel):
} for tool in tools
]
if isinstance(xinference_model, (RESTfulChatModelHandle, RESTfulChatglmCppChatModelHandle)):
if isinstance(xinference_model, RESTfulChatModelHandle | RESTfulChatglmCppChatModelHandle):
resp = client.chat.completions.create(
model=credentials['model_uid'],
messages=[self._convert_prompt_message_to_dict(message) for message in prompt_messages],

View File

@@ -1,22 +1,21 @@
from os import path
from threading import Lock
from time import time
from typing import List
from requests.adapters import HTTPAdapter
from requests.exceptions import ConnectionError, MissingSchema, Timeout
from requests.sessions import Session
class XinferenceModelExtraParameter(object):
class XinferenceModelExtraParameter:
model_format: str
model_handle_type: str
model_ability: List[str]
model_ability: list[str]
max_tokens: int = 512
context_length: int = 2048
support_function_call: bool = False
def __init__(self, model_format: str, model_handle_type: str, model_ability: List[str],
def __init__(self, model_format: str, model_handle_type: str, model_ability: list[str],
support_function_call: bool, max_tokens: int, context_length: int) -> None:
self.model_format = model_format
self.model_handle_type = model_handle_type

View File

@@ -1,4 +1,5 @@
from typing import Generator, List, Optional, Union
from collections.abc import Generator
from typing import Optional, Union
from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk, LLMResultChunkDelta
from core.model_runtime.entities.message_entities import (
@@ -23,7 +24,7 @@ class ZhipuAILargeLanguageModel(_CommonZhipuaiAI, LargeLanguageModel):
def _invoke(self, model: str, credentials: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None,
tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None,
stream: bool = True, user: Optional[str] = None) \
-> Union[LLMResult, Generator]:
"""
@@ -89,7 +90,7 @@ class ZhipuAILargeLanguageModel(_CommonZhipuaiAI, LargeLanguageModel):
def _generate(self, model: str, credentials_kwargs: dict,
prompt_messages: list[PromptMessage], model_parameters: dict,
tools: Optional[list[PromptMessageTool]] = None,
stop: Optional[List[str]] = None, stream: bool = True,
stop: Optional[list[str]] = None, stream: bool = True,
user: Optional[str] = None) -> Union[LLMResult, Generator]:
"""
Invoke large language model
@@ -119,7 +120,7 @@ class ZhipuAILargeLanguageModel(_CommonZhipuaiAI, LargeLanguageModel):
prompt_messages = prompt_messages[1:]
# resolve zhipuai model not support system message and user message, assistant message must be in sequence
new_prompt_messages: List[PromptMessage] = []
new_prompt_messages: list[PromptMessage] = []
for prompt_message in prompt_messages:
copy_prompt_message = prompt_message.copy()
if copy_prompt_message.role in [PromptMessageRole.USER, PromptMessageRole.SYSTEM, PromptMessageRole.TOOL]:
@@ -275,7 +276,7 @@ class ZhipuAILargeLanguageModel(_CommonZhipuaiAI, LargeLanguageModel):
:return: llm response
"""
text = ''
assistant_tool_calls: List[AssistantPromptMessage.ToolCall] = []
assistant_tool_calls: list[AssistantPromptMessage.ToolCall] = []
for choice in response.choices:
if choice.message.tool_calls:
for tool_call in choice.message.tool_calls:
@@ -335,7 +336,7 @@ class ZhipuAILargeLanguageModel(_CommonZhipuaiAI, LargeLanguageModel):
if delta.finish_reason is None and (delta.delta.content is None or delta.delta.content == ''):
continue
assistant_tool_calls: List[AssistantPromptMessage.ToolCall] = []
assistant_tool_calls: list[AssistantPromptMessage.ToolCall] = []
for tool_call in delta.delta.tool_calls or []:
if tool_call.type == 'function':
assistant_tool_calls.append(
@@ -409,7 +410,7 @@ class ZhipuAILargeLanguageModel(_CommonZhipuaiAI, LargeLanguageModel):
return message_text
def _convert_messages_to_prompt(self, messages: List[PromptMessage], tools: Optional[list[PromptMessageTool]] = None) -> str:
def _convert_messages_to_prompt(self, messages: list[PromptMessage], tools: Optional[list[PromptMessageTool]] = None) -> str:
"""
:param messages: List of PromptMessage to combine.
:return: Combined string with necessary human_prompt and ai_prompt tags.

View File

@@ -1,5 +1,5 @@
import time
from typing import List, Optional, Tuple
from typing import Optional
from core.model_runtime.entities.model_entities import PriceType
from core.model_runtime.entities.text_embedding_entities import EmbeddingUsage, TextEmbeddingResult
@@ -81,7 +81,7 @@ class ZhipuAITextEmbeddingModel(_CommonZhipuaiAI, TextEmbeddingModel):
except Exception as ex:
raise CredentialsValidateFailedError(str(ex))
def embed_documents(self, model: str, client: ZhipuAI, texts: List[str]) -> Tuple[List[List[float]], int]:
def embed_documents(self, model: str, client: ZhipuAI, texts: list[str]) -> tuple[list[list[float]], int]:
"""Call out to ZhipuAI's embedding endpoint.
Args:
@@ -101,7 +101,7 @@ class ZhipuAITextEmbeddingModel(_CommonZhipuaiAI, TextEmbeddingModel):
return [list(map(float, e)) for e in embeddings], embedding_used_tokens
def embed_query(self, text: str) -> List[float]:
def embed_query(self, text: str) -> list[float]:
"""Call out to ZhipuAI's embedding endpoint.
Args:

View File

@@ -1,7 +1,8 @@
from __future__ import annotations
import os
from typing import Mapping, Union
from collections.abc import Mapping
from typing import Union
import httpx
from httpx import Timeout

View File

@@ -1,9 +1,8 @@
from __future__ import annotations
from typing import TYPE_CHECKING, List, Optional, Union
from typing import TYPE_CHECKING, Literal, Optional, Union
import httpx
from typing_extensions import Literal
from ...core._base_api import BaseAPI
from ...core._base_type import NOT_GIVEN, Headers, NotGiven
@@ -15,7 +14,7 @@ if TYPE_CHECKING:
class AsyncCompletions(BaseAPI):
def __init__(self, client: "ZhipuAI") -> None:
def __init__(self, client: ZhipuAI) -> None:
super().__init__(client)
@@ -29,8 +28,8 @@ class AsyncCompletions(BaseAPI):
top_p: Optional[float] | NotGiven = NOT_GIVEN,
max_tokens: int | NotGiven = NOT_GIVEN,
seed: int | NotGiven = NOT_GIVEN,
messages: Union[str, List[str], List[int], List[List[int]], None],
stop: Optional[Union[str, List[str], None]] | NotGiven = NOT_GIVEN,
messages: Union[str, list[str], list[int], list[list[int]], None],
stop: Optional[Union[str, list[str], None]] | NotGiven = NOT_GIVEN,
sensitive_word_check: Optional[object] | NotGiven = NOT_GIVEN,
tools: Optional[object] | NotGiven = NOT_GIVEN,
tool_choice: str | NotGiven = NOT_GIVEN,

View File

@@ -1,9 +1,8 @@
from __future__ import annotations
from typing import TYPE_CHECKING, List, Optional, Union
from typing import TYPE_CHECKING, Literal, Optional, Union
import httpx
from typing_extensions import Literal
from ...core._base_api import BaseAPI
from ...core._base_type import NOT_GIVEN, Headers, NotGiven
@@ -17,7 +16,7 @@ if TYPE_CHECKING:
class Completions(BaseAPI):
def __init__(self, client: "ZhipuAI") -> None:
def __init__(self, client: ZhipuAI) -> None:
super().__init__(client)
def create(
@@ -31,8 +30,8 @@ class Completions(BaseAPI):
top_p: Optional[float] | NotGiven = NOT_GIVEN,
max_tokens: int | NotGiven = NOT_GIVEN,
seed: int | NotGiven = NOT_GIVEN,
messages: Union[str, List[str], List[int], object, None],
stop: Optional[Union[str, List[str], None]] | NotGiven = NOT_GIVEN,
messages: Union[str, list[str], list[int], object, None],
stop: Optional[Union[str, list[str], None]] | NotGiven = NOT_GIVEN,
sensitive_word_check: Optional[object] | NotGiven = NOT_GIVEN,
tools: Optional[object] | NotGiven = NOT_GIVEN,
tool_choice: str | NotGiven = NOT_GIVEN,

View File

@@ -1,6 +1,6 @@
from __future__ import annotations
from typing import TYPE_CHECKING, List, Optional, Union
from typing import TYPE_CHECKING, Optional, Union
import httpx
@@ -14,13 +14,13 @@ if TYPE_CHECKING:
class Embeddings(BaseAPI):
def __init__(self, client: "ZhipuAI") -> None:
def __init__(self, client: ZhipuAI) -> None:
super().__init__(client)
def create(
self,
*,
input: Union[str, List[str], List[int], List[List[int]]],
input: Union[str, list[str], list[int], list[list[int]]],
model: Union[str],
encoding_format: str | NotGiven = NOT_GIVEN,
user: str | NotGiven = NOT_GIVEN,

View File

@@ -18,7 +18,7 @@ __all__ = ["Files"]
class Files(BaseAPI):
def __init__(self, client: "ZhipuAI") -> None:
def __init__(self, client: ZhipuAI) -> None:
super().__init__(client)
def create(

View File

@@ -17,7 +17,7 @@ __all__ = ["Jobs"]
class Jobs(BaseAPI):
def __init__(self, client: "ZhipuAI") -> None:
def __init__(self, client: ZhipuAI) -> None:
super().__init__(client)
def create(

View File

@@ -14,7 +14,7 @@ if TYPE_CHECKING:
class Images(BaseAPI):
def __init__(self, client: "ZhipuAI") -> None:
def __init__(self, client: ZhipuAI) -> None:
super().__init__(client)
def generations(

View File

@@ -1,21 +1,22 @@
from __future__ import annotations
from collections.abc import Mapping, Sequence
from os import PathLike
from typing import IO, TYPE_CHECKING, Any, List, Mapping, Sequence, Tuple, Type, TypeVar, Union
from typing import IO, TYPE_CHECKING, Any, Literal, TypeVar, Union
import pydantic
from typing_extensions import Literal, override
from typing_extensions import override
Query = Mapping[str, object]
Body = object
AnyMapping = Mapping[str, object]
PrimitiveData = Union[str, int, float, bool, None]
Data = Union[PrimitiveData, List[Any], Tuple[Any], "Mapping[str, Any]"]
Data = Union[PrimitiveData, list[Any], tuple[Any], "Mapping[str, Any]"]
ModelT = TypeVar("ModelT", bound=pydantic.BaseModel)
_T = TypeVar("_T")
if TYPE_CHECKING:
NoneType: Type[None]
NoneType: type[None]
else:
NoneType = type(None)
@@ -74,7 +75,7 @@ Headers = Mapping[str, Union[str, Omit]]
ResponseT = TypeVar(
"ResponseT",
bound="Union[str, None, BaseModel, List[Any], Dict[str, Any], Response, UnknownResponse, ModelBuilderProtocol, BinaryResponseContent]",
bound="Union[str, None, BaseModel, list[Any], Dict[str, Any], Response, UnknownResponse, ModelBuilderProtocol, BinaryResponseContent]",
)
# for user input files
@@ -85,21 +86,21 @@ else:
FileTypes = Union[
FileContent, # file content
Tuple[str, FileContent], # (filename, file)
Tuple[str, FileContent, str], # (filename, file , content_type)
Tuple[str, FileContent, str, Mapping[str, str]], # (filename, file , content_type, headers)
tuple[str, FileContent], # (filename, file)
tuple[str, FileContent, str], # (filename, file , content_type)
tuple[str, FileContent, str, Mapping[str, str]], # (filename, file , content_type, headers)
]
RequestFiles = Union[Mapping[str, FileTypes], Sequence[Tuple[str, FileTypes]]]
RequestFiles = Union[Mapping[str, FileTypes], Sequence[tuple[str, FileTypes]]]
# for httpx client supported files
HttpxFileContent = Union[bytes, IO[bytes]]
HttpxFileTypes = Union[
FileContent, # file content
Tuple[str, HttpxFileContent], # (filename, file)
Tuple[str, HttpxFileContent, str], # (filename, file , content_type)
Tuple[str, HttpxFileContent, str, Mapping[str, str]], # (filename, file , content_type, headers)
tuple[str, HttpxFileContent], # (filename, file)
tuple[str, HttpxFileContent, str], # (filename, file , content_type)
tuple[str, HttpxFileContent, str, Mapping[str, str]], # (filename, file , content_type, headers)
]
HttpxRequestFiles = Union[Mapping[str, HttpxFileTypes], Sequence[Tuple[str, HttpxFileTypes]]]
HttpxRequestFiles = Union[Mapping[str, HttpxFileTypes], Sequence[tuple[str, HttpxFileTypes]]]

View File

@@ -2,14 +2,14 @@ from __future__ import annotations
import io
import os
from collections.abc import Mapping, Sequence
from pathlib import Path
from typing import Mapping, Sequence
from ._base_type import FileTypes, HttpxFileTypes, HttpxRequestFiles, RequestFiles
def is_file_content(obj: object) -> bool:
return isinstance(obj, (bytes, tuple, io.IOBase, os.PathLike))
return isinstance(obj, bytes | tuple | io.IOBase | os.PathLike)
def _transform_file(file: FileTypes) -> HttpxFileTypes:

View File

@@ -1,8 +1,8 @@
# -*- coding:utf-8 -*-
from __future__ import annotations
import inspect
from typing import Any, Mapping, Type, Union, cast
from collections.abc import Mapping
from typing import Any, Union, cast
import httpx
import pydantic
@@ -140,7 +140,7 @@ class HttpClient:
for k, v in value.items():
items.extend(self._object_to_formfata(f"{key}[{k}]", v))
return items
if isinstance(value, (list, tuple)):
if isinstance(value, list | tuple):
for v in value:
items.extend(self._object_to_formfata(key + "[]", v))
return items
@@ -175,7 +175,7 @@ class HttpClient:
def _parse_response(
self,
*,
cast_type: Type[ResponseT],
cast_type: type[ResponseT],
response: httpx.Response,
enable_stream: bool,
request_param: ClientRequestParam,
@@ -224,7 +224,7 @@ class HttpClient:
def request(
self,
*,
cast_type: Type[ResponseT],
cast_type: type[ResponseT],
params: ClientRequestParam,
enable_stream: bool = False,
stream_cls: type[StreamResponse[Any]] | None = None,
@@ -259,7 +259,7 @@ class HttpClient:
self,
path: str,
*,
cast_type: Type[ResponseT],
cast_type: type[ResponseT],
options: UserRequestInput = {},
enable_stream: bool = False,
) -> ResponseT | StreamResponse:
@@ -274,7 +274,7 @@ class HttpClient:
path: str,
*,
body: Body | None = None,
cast_type: Type[ResponseT],
cast_type: type[ResponseT],
options: UserRequestInput = {},
files: RequestFiles | None = None,
enable_stream: bool = False,
@@ -294,7 +294,7 @@ class HttpClient:
path: str,
*,
body: Body | None = None,
cast_type: Type[ResponseT],
cast_type: type[ResponseT],
options: UserRequestInput = {},
) -> ResponseT:
opts = ClientRequestParam.construct(method="patch", url=path, json_data=body, **options)
@@ -308,7 +308,7 @@ class HttpClient:
path: str,
*,
body: Body | None = None,
cast_type: Type[ResponseT],
cast_type: type[ResponseT],
options: UserRequestInput = {},
files: RequestFiles | None = None,
) -> ResponseT | StreamResponse:
@@ -324,7 +324,7 @@ class HttpClient:
path: str,
*,
body: Body | None = None,
cast_type: Type[ResponseT],
cast_type: type[ResponseT],
options: UserRequestInput = {},
) -> ResponseT | StreamResponse:
opts = ClientRequestParam.construct(method="delete", url=path, json_data=body, **options)

View File

@@ -1,4 +1,3 @@
# -*- coding:utf-8 -*-
import time
import cachetools.func

View File

@@ -1,10 +1,10 @@
from __future__ import annotations
from typing import Any, Union
from typing import Any, ClassVar, Union
from httpx import Timeout
from pydantic import ConfigDict
from typing_extensions import ClassVar, TypedDict, Unpack
from typing_extensions import TypedDict, Unpack
from ._base_type import Body, Headers, HttpxRequestFiles, NotGiven, Query
from ._utils import remove_notgiven_indict
@@ -17,7 +17,7 @@ class UserRequestInput(TypedDict, total=False):
params: Query | None
class ClientRequestParam():
class ClientRequestParam:
method: str
url: str
max_retries: Union[int, NotGiven] = NotGiven()

View File

@@ -1,11 +1,11 @@
from __future__ import annotations
import datetime
from typing import TYPE_CHECKING, Any, Generic, TypeVar, cast
from typing import TYPE_CHECKING, Any, Generic, TypeVar, cast, get_args, get_origin
import httpx
import pydantic
from typing_extensions import ParamSpec, get_args, get_origin
from typing_extensions import ParamSpec
from ._base_type import NoneType
from ._sse_client import StreamResponse
@@ -19,7 +19,7 @@ R = TypeVar("R")
class HttpResponse(Generic[R]):
_cast_type: type[R]
_client: "HttpClient"
_client: HttpClient
_parsed: R | None
_enable_stream: bool
_stream_cls: type[StreamResponse[Any]]
@@ -30,7 +30,7 @@ class HttpResponse(Generic[R]):
*,
raw_response: httpx.Response,
cast_type: type[R],
client: "HttpClient",
client: HttpClient,
enable_stream: bool = False,
stream_cls: type[StreamResponse[Any]] | None = None,
) -> None:

View File

@@ -1,8 +1,8 @@
# -*- coding:utf-8 -*-
from __future__ import annotations
import json
from typing import TYPE_CHECKING, Generic, Iterator, Mapping
from collections.abc import Iterator, Mapping
from typing import TYPE_CHECKING, Generic
import httpx
@@ -36,8 +36,7 @@ class StreamResponse(Generic[ResponseT]):
return self._stream_chunks.__next__()
def __iter__(self) -> Iterator[ResponseT]:
for item in self._stream_chunks:
yield item
yield from self._stream_chunks
def __stream__(self) -> Iterator[ResponseT]:
@@ -62,7 +61,7 @@ class StreamResponse(Generic[ResponseT]):
pass
class Event(object):
class Event:
def __init__(
self,
event: str | None = None,

View File

@@ -1,6 +1,7 @@
from __future__ import annotations
from typing import Iterable, Mapping, TypeVar
from collections.abc import Iterable, Mapping
from typing import TypeVar
from ._base_type import NotGiven

View File

@@ -1,4 +1,4 @@
from typing import List, Optional
from typing import Optional
from pydantic import BaseModel
@@ -19,5 +19,5 @@ class AsyncCompletion(BaseModel):
request_id: Optional[str] = None
model: Optional[str] = None
task_status: str
choices: List[CompletionChoice]
choices: list[CompletionChoice]
usage: CompletionUsage

View File

@@ -1,4 +1,4 @@
from typing import List, Optional
from typing import Optional
from pydantic import BaseModel
@@ -19,7 +19,7 @@ class CompletionMessageToolCall(BaseModel):
class CompletionMessage(BaseModel):
content: Optional[str] = None
role: str
tool_calls: Optional[List[CompletionMessageToolCall]] = None
tool_calls: Optional[list[CompletionMessageToolCall]] = None
class CompletionUsage(BaseModel):
@@ -37,7 +37,7 @@ class CompletionChoice(BaseModel):
class Completion(BaseModel):
model: Optional[str] = None
created: Optional[int] = None
choices: List[CompletionChoice]
choices: list[CompletionChoice]
request_id: Optional[str] = None
id: Optional[str] = None
usage: CompletionUsage

View File

@@ -1,4 +1,4 @@
from typing import List, Optional
from typing import Optional
from pydantic import BaseModel
@@ -32,7 +32,7 @@ class ChoiceDeltaToolCall(BaseModel):
class ChoiceDelta(BaseModel):
content: Optional[str] = None
role: Optional[str] = None
tool_calls: Optional[List[ChoiceDeltaToolCall]] = None
tool_calls: Optional[list[ChoiceDeltaToolCall]] = None
class Choice(BaseModel):
@@ -49,7 +49,7 @@ class CompletionUsage(BaseModel):
class ChatCompletionChunk(BaseModel):
id: Optional[str] = None
choices: List[Choice]
choices: list[Choice]
created: Optional[int] = None
model: Optional[str] = None
usage: Optional[CompletionUsage] = None

View File

@@ -1,6 +1,6 @@
from __future__ import annotations
from typing import List, Optional
from typing import Optional
from pydantic import BaseModel
@@ -12,11 +12,11 @@ __all__ = ["Embedding", "EmbeddingsResponded"]
class Embedding(BaseModel):
object: str
index: Optional[int] = None
embedding: List[float]
embedding: list[float]
class EmbeddingsResponded(BaseModel):
object: str
data: List[Embedding]
data: list[Embedding]
model: str
usage: CompletionUsage

View File

@@ -1,4 +1,4 @@
from typing import List, Optional
from typing import Optional
from pydantic import BaseModel
@@ -20,5 +20,5 @@ class FileObject(BaseModel):
class ListOfFileObject(BaseModel):
object: Optional[str] = None
data: List[FileObject]
data: list[FileObject]
has_more: Optional[bool] = None

View File

@@ -1,4 +1,4 @@
from typing import List, Optional, Union
from typing import Optional, Union
from pydantic import BaseModel
@@ -34,7 +34,7 @@ class FineTuningJob(BaseModel):
object: Optional[str] = None
result_files: List[str]
result_files: list[str]
status: str
@@ -47,5 +47,5 @@ class FineTuningJob(BaseModel):
class ListOfFineTuningJob(BaseModel):
object: Optional[str] = None
data: List[FineTuningJob]
data: list[FineTuningJob]
has_more: Optional[bool] = None

View File

@@ -1,4 +1,4 @@
from typing import List, Optional, Union
from typing import Optional, Union
from pydantic import BaseModel
@@ -31,5 +31,5 @@ class JobEvent(BaseModel):
class FineTuningJobEvent(BaseModel):
object: Optional[str] = None
data: List[JobEvent]
data: list[JobEvent]
has_more: Optional[bool] = None

View File

@@ -1,8 +1,8 @@
from __future__ import annotations
from typing import Union
from typing import Literal, Union
from typing_extensions import Literal, TypedDict
from typing_extensions import TypedDict
__all__ = ["Hyperparameters"]

View File

@@ -1,6 +1,6 @@
from __future__ import annotations
from typing import List, Optional
from typing import Optional
from pydantic import BaseModel
@@ -15,4 +15,4 @@ class GeneratedImage(BaseModel):
class ImagesResponded(BaseModel):
created: int
data: List[GeneratedImage]
data: list[GeneratedImage]

View File

@@ -1,8 +1,7 @@
from typing import Any
from typing import Any, Literal
from pydantic import BaseModel
from pydantic.version import VERSION as PYDANTIC_VERSION
from typing_extensions import Literal
PYDANTIC_V2 = PYDANTIC_VERSION.startswith("2.")

View File

@@ -1,13 +1,14 @@
import dataclasses
import datetime
from collections import defaultdict, deque
from collections.abc import Callable
from decimal import Decimal
from enum import Enum
from ipaddress import IPv4Address, IPv4Interface, IPv4Network, IPv6Address, IPv6Interface, IPv6Network
from pathlib import Path, PurePath
from re import Pattern
from types import GeneratorType
from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union
from typing import Any, Optional, Union
from uuid import UUID
from pydantic import BaseModel
@@ -46,7 +47,7 @@ def decimal_encoder(dec_value: Decimal) -> Union[int, float]:
return float(dec_value)
ENCODERS_BY_TYPE: Dict[Type[Any], Callable[[Any], Any]] = {
ENCODERS_BY_TYPE: dict[type[Any], Callable[[Any], Any]] = {
bytes: lambda o: o.decode(),
Color: str,
datetime.date: isoformat,
@@ -77,9 +78,9 @@ ENCODERS_BY_TYPE: Dict[Type[Any], Callable[[Any], Any]] = {
def generate_encoders_by_class_tuples(
type_encoder_map: Dict[Any, Callable[[Any], Any]]
) -> Dict[Callable[[Any], Any], Tuple[Any, ...]]:
encoders_by_class_tuples: Dict[Callable[[Any], Any], Tuple[Any, ...]] = defaultdict(
type_encoder_map: dict[Any, Callable[[Any], Any]]
) -> dict[Callable[[Any], Any], tuple[Any, ...]]:
encoders_by_class_tuples: dict[Callable[[Any], Any], tuple[Any, ...]] = defaultdict(
tuple
)
for type_, encoder in type_encoder_map.items():
@@ -96,7 +97,7 @@ def jsonable_encoder(
exclude_unset: bool = False,
exclude_defaults: bool = False,
exclude_none: bool = False,
custom_encoder: Optional[Dict[Any, Callable[[Any], Any]]] = None,
custom_encoder: Optional[dict[Any, Callable[[Any], Any]]] = None,
sqlalchemy_safe: bool = True,
) -> Any:
custom_encoder = custom_encoder or {}
@@ -109,7 +110,7 @@ def jsonable_encoder(
return encoder_instance(obj)
if isinstance(obj, BaseModel):
# TODO: remove when deprecating Pydantic v1
encoders: Dict[Any, Any] = {}
encoders: dict[Any, Any] = {}
if not PYDANTIC_V2:
encoders = getattr(obj.__config__, "json_encoders", {}) # type: ignore[attr-defined]
if custom_encoder:
@@ -149,7 +150,7 @@ def jsonable_encoder(
return obj.value
if isinstance(obj, PurePath):
return str(obj)
if isinstance(obj, (str, int, float, type(None))):
if isinstance(obj, str | int | float | type(None)):
return obj
if isinstance(obj, Decimal):
return format(obj, 'f')
@@ -184,7 +185,7 @@ def jsonable_encoder(
)
encoded_dict[encoded_key] = encoded_value
return encoded_dict
if isinstance(obj, (list, set, frozenset, GeneratorType, tuple, deque)):
if isinstance(obj, list | set | frozenset | GeneratorType | tuple | deque):
encoded_list = []
for item in obj:
encoded_list.append(
@@ -209,7 +210,7 @@ def jsonable_encoder(
try:
data = dict(obj)
except Exception as e:
errors: List[Exception] = []
errors: list[Exception] = []
errors.append(e)
try:
data = vars(obj)