2023-08-13 06:28:24 +03:00
|
|
|
from typing import Any, List, Mapping, Optional, Union
|
2023-09-07 03:54:37 +03:00
|
|
|
from functools import partial
|
2023-07-08 11:37:54 +03:00
|
|
|
|
2023-08-13 06:28:24 +03:00
|
|
|
from g4f import ChatCompletion
|
|
|
|
from g4f.models import Model
|
2023-08-18 15:22:22 +03:00
|
|
|
from g4f.Provider.base_provider import BaseProvider
|
2023-09-07 03:54:37 +03:00
|
|
|
from langchain.callbacks.manager import CallbackManagerForLLMRun, AsyncCallbackManagerForLLMRun
|
2023-07-08 11:37:54 +03:00
|
|
|
from langchain.llms.base import LLM
|
|
|
|
from langchain.llms.utils import enforce_stop_tokens
|
|
|
|
|
2023-09-14 12:00:27 +03:00
|
|
|
MAX_TRIES = 5
|
2023-07-08 11:37:54 +03:00
|
|
|
class G4FLLM(LLM):
|
2023-08-13 06:28:24 +03:00
|
|
|
model: Union[Model, str]
|
2023-08-18 15:22:22 +03:00
|
|
|
provider: Optional[type[BaseProvider]] = None
|
2023-07-08 11:37:54 +03:00
|
|
|
auth: Optional[Union[str, bool]] = None
|
2023-08-13 06:41:58 +03:00
|
|
|
create_kwargs: Optional[dict[str, Any]] = None
|
2023-07-08 11:37:54 +03:00
|
|
|
|
|
|
|
@property
|
|
|
|
def _llm_type(self) -> str:
|
2023-07-23 04:27:25 +03:00
|
|
|
return "custom"
|
|
|
|
|
|
|
|
def _call(
|
|
|
|
self,
|
|
|
|
prompt: str,
|
|
|
|
stop: Optional[List[str]] = None,
|
|
|
|
run_manager: Optional[CallbackManagerForLLMRun] = None,
|
|
|
|
**kwargs: Any,
|
|
|
|
) -> str:
|
2023-07-08 11:37:54 +03:00
|
|
|
create_kwargs = {} if self.create_kwargs is None else self.create_kwargs.copy()
|
2023-08-13 06:41:58 +03:00
|
|
|
create_kwargs["model"] = self.model
|
2023-07-08 11:37:54 +03:00
|
|
|
if self.provider is not None:
|
2023-07-23 04:27:25 +03:00
|
|
|
create_kwargs["provider"] = self.provider
|
2023-07-08 11:37:54 +03:00
|
|
|
if self.auth is not None:
|
2023-07-23 04:27:25 +03:00
|
|
|
create_kwargs["auth"] = self.auth
|
2023-07-08 11:37:54 +03:00
|
|
|
|
2023-09-14 12:00:27 +03:00
|
|
|
for i in range(MAX_TRIES):
|
|
|
|
try:
|
|
|
|
text = ChatCompletion.create(
|
|
|
|
messages=[{"role": "user", "content": prompt}],
|
|
|
|
**create_kwargs,
|
|
|
|
)
|
|
|
|
|
|
|
|
# Generator -> str
|
|
|
|
text = text if type(text) is str else "".join(text)
|
|
|
|
if stop is not None:
|
|
|
|
text = enforce_stop_tokens(text, stop)
|
|
|
|
if text:
|
|
|
|
return text
|
|
|
|
print(f"Empty response, trying {i+1} of {MAX_TRIES}")
|
|
|
|
except Exception as e:
|
|
|
|
print(f"Error in G4FLLM._call: {e}, trying {i+1} of {MAX_TRIES}")
|
|
|
|
return ""
|
|
|
|
|
2023-08-20 05:18:13 +03:00
|
|
|
|
2023-09-07 03:54:37 +03:00
|
|
|
async def _acall(self, prompt: str, stop: Optional[List[str]] = None, run_manager: Optional[AsyncCallbackManagerForLLMRun] = None, **kwargs: Any) -> str:
|
|
|
|
create_kwargs = {} if self.create_kwargs is None else self.create_kwargs.copy()
|
|
|
|
create_kwargs["model"] = self.model
|
|
|
|
if self.provider is not None:
|
|
|
|
create_kwargs["provider"] = self.provider
|
|
|
|
if self.auth is not None:
|
|
|
|
create_kwargs["auth"] = self.auth
|
|
|
|
|
|
|
|
text_callback = None
|
|
|
|
if run_manager:
|
|
|
|
text_callback = partial(run_manager.on_llm_new_token)
|
|
|
|
|
|
|
|
text = ""
|
|
|
|
for token in ChatCompletion.create(messages=[{"role": "user", "content": prompt}], stream=True, **create_kwargs):
|
|
|
|
if text_callback:
|
|
|
|
await text_callback(token)
|
|
|
|
text += token
|
|
|
|
return text
|
2023-07-08 11:37:54 +03:00
|
|
|
|
|
|
|
@property
|
|
|
|
def _identifying_params(self) -> Mapping[str, Any]:
|
|
|
|
"""Get the identifying parameters."""
|
|
|
|
return {
|
2023-07-23 04:27:25 +03:00
|
|
|
"model": self.model,
|
|
|
|
"provider": self.provider,
|
|
|
|
"auth": self.auth,
|
|
|
|
"create_kwargs": self.create_kwargs,
|
2023-07-08 11:37:54 +03:00
|
|
|
}
|