ForcePilot/src/models/chat_model.py

171 lines
5.3 KiB
Python
Raw Normal View History

import os
from openai import OpenAI
from src.utils.logging_config import setup_logger
logger = setup_logger(__name__)
class OpenAIBase():
def __init__(self, api_key, base_url, model_name):
self.client = OpenAI(api_key=api_key, base_url=base_url)
self.model_name = model_name
def predict(self, message, stream=False):
if isinstance(message, str):
messages=[{"role": "user", "content": message}]
else:
messages = message
if stream:
return self._stream_response(messages)
else:
return self._get_response(messages)
def _stream_response(self, messages):
response = self.client.chat.completions.create(
model=self.model_name,
messages=messages,
stream=True,
)
for chunk in response:
yield chunk.choices[0].delta
def _get_response(self, messages):
response = self.client.chat.completions.create(
model=self.model_name,
messages=messages,
stream=False,
)
return response.choices[0].message
2024-09-09 17:07:03 +08:00
class OpenModel(OpenAIBase):
def __init__(self, model_name=None):
model_name = model_name or "gpt-4o-mini"
api_key = os.getenv("OPENAI_API_KEY")
base_url = os.getenv("OPENAI_API_BASE")
super().__init__(api_key=api_key, base_url=base_url, model_name=model_name)
class DeepSeek(OpenAIBase):
def __init__(self, model_name=None):
model_name = model_name or "deepseek-chat"
api_key = os.getenv("DEEPSEEK_API_KEY", "your-default-api-key")
base_url = os.getenv("DEEPSEEK_API_BASE", "https://api.deepseek.com/v1")
super().__init__(api_key=api_key, base_url=base_url, model_name=model_name)
class Zhipu(OpenAIBase):
def __init__(self, model_name=None):
2024-09-28 00:39:31 +08:00
model_name = model_name or "glm-4-flash"
2024-10-02 20:11:28 +08:00
api_key = os.getenv("ZHIPUAI_API_KEY", "270ea71e9560c0ff406acbcdd48bfd97.e3XOMdWKuZb7Q1Sk")
base_url = "https://open.bigmodel.cn/api/paas/v4/"
super().__init__(api_key=api_key, base_url=base_url, model_name=model_name)
2024-09-28 00:39:31 +08:00
class SiliconFlow(OpenAIBase):
def __init__(self, model_name=None):
model_name = model_name or "meta-llama/Meta-Llama-3.1-8B-Instruct"
api_key = os.getenv("SILICONFLOW_API_KEY")
base_url = "https://api.siliconflow.cn/v1"
super().__init__(api_key=api_key, base_url=base_url, model_name=model_name)
2024-10-08 22:16:17 +08:00
class CustomModel(OpenAIBase):
def __init__(self, model_info):
model_name = model_info["name"]
api_key = model_info["api_key"]
base_url = model_info["api_base"]
super().__init__(api_key=api_key, base_url=base_url, model_name=model_name)
2024-07-31 20:22:05 +08:00
class GeneralResponse:
def __init__(self, content):
self.content = content
2024-07-31 20:22:05 +08:00
self.is_full = False
class Qianfan:
def __init__(self, model_name="ernie_speed") -> None:
2024-08-07 17:24:46 +08:00
import qianfan
self.model_name = model_name
access_key = os.getenv("QIANFAN_ACCESS_KEY")
secret_key = os.getenv("QIANFAN_SECRET_KEY")
self.client = qianfan.ChatCompletion(ak=access_key, sk=secret_key)
def predict(self, message, stream=False):
if isinstance(message, str):
messages=[{"role": "user", "content": message}]
else:
messages = message
if stream:
return self._stream_response(messages)
else:
return self._get_response(messages)
def _stream_response(self, messages):
response = self.client.do(
model=self.model_name,
messages=messages,
stream=True,
)
for chunk in response:
2024-07-31 20:22:05 +08:00
yield GeneralResponse(chunk["body"]["result"])
def _get_response(self, messages):
response = self.client.do(
model=self.model_name,
messages=messages,
stream=False,
)
2024-07-31 20:22:05 +08:00
return GeneralResponse(response["body"]["result"])
2024-07-20 15:27:33 +08:00
2024-07-31 20:22:05 +08:00
class DashScope:
2024-09-28 00:39:31 +08:00
def __init__(self, model_name="qwen-max-latest") -> None:
2024-07-31 20:22:05 +08:00
self.model_name = model_name
self.api_key= os.getenv("DASHSCOPE_API_KEY")
def predict(self, message, stream=False):
if isinstance(message, str):
messages=[{"role": "user", "content": message}]
else:
messages = message
if stream:
return self._stream_response(messages)
else:
return self._get_response(messages)
def _stream_response(self, messages):
import dashscope
response = dashscope.Generation.call(
api_key=self.api_key,
model=self.model_name,
messages=messages,
result_format='message',
stream=True,
)
for chunk in response:
message = chunk.output.choices[0].message
message.is_full = True
yield chunk.output.choices[0].message
def _get_response(self, messages):
import dashscope
response = dashscope.Generation.call(
api_key=self.api_key,
model=self.model_name,
messages=messages,
result_format='message',
stream=False,
)
return response.output.choices[0].message
if __name__ == "__main__":
2024-09-28 00:39:31 +08:00
model = SiliconFlow()
2024-07-31 20:22:05 +08:00
for a in model.predict("你好", stream=True):
2024-09-28 00:39:31 +08:00
print(a.content, end="")