diff --git a/app/services/llm.py b/app/services/llm.py index 9ef8b9c..69ec25d 100644 --- a/app/services/llm.py +++ b/app/services/llm.py @@ -2,6 +2,7 @@ import logging import re import json from typing import List +import g4f from loguru import logger from openai import OpenAI @@ -9,41 +10,57 @@ from app.config import config def _generate_response(prompt: str) -> str: + content = "" llm_provider = config.app.get("llm_provider", "openai") - if llm_provider == "moonshot": - api_key = config.app.get("moonshot_api_key") - model_name = config.app.get("moonshot_model_name") - base_url = "https://api.moonshot.cn/v1" - elif llm_provider == "openai": - api_key = config.app.get("openai_api_key") - model_name = config.app.get("openai_model_name") - base_url = config.app.get("openai_base_url", "") - if not base_url: - base_url = "https://api.openai.com/v1" - elif llm_provider == "oneapi": - api_key = config.app.get("oneapi_api_key") - model_name = config.app.get("oneapi_model_name") - base_url = config.app.get("oneapi_base_url", "") + logger.info(f"llm provider: {llm_provider}") + if llm_provider == "g4f": + model_name = config.app.get("g4f_model_name", "") + if not model_name: + model_name = "gpt-3.5-turbo-16k-0613" + + content = g4f.ChatCompletion.create( + model=model_name, + messages=[{"role": "user", "content": prompt}], + ) else: - raise ValueError("llm_provider is not set, please set it in the config.toml file.") + if llm_provider == "moonshot": + api_key = config.app.get("moonshot_api_key") + model_name = config.app.get("moonshot_model_name") + base_url = "https://api.moonshot.cn/v1" + elif llm_provider == "openai": + api_key = config.app.get("openai_api_key") + model_name = config.app.get("openai_model_name") + base_url = config.app.get("openai_base_url", "") + if not base_url: + base_url = "https://api.openai.com/v1" + elif llm_provider == "oneapi": + api_key = config.app.get("oneapi_api_key") + model_name = config.app.get("oneapi_model_name") + base_url = config.app.get("oneapi_base_url", "") + model_name = config.app.get("g4f_model_name") + else: + raise ValueError("llm_provider is not set, please set it in the config.toml file.") - if not api_key: - raise ValueError(f"{llm_provider}: api_key is not set, please set it in the config.toml file.") - if not model_name: - raise ValueError(f"{llm_provider}: model_name is not set, please set it in the config.toml file.") - if not base_url: - raise ValueError(f"{llm_provider}: base_url is not set, please set it in the config.toml file.") + if not api_key: + raise ValueError(f"{llm_provider}: api_key is not set, please set it in the config.toml file.") + if not model_name: + raise ValueError(f"{llm_provider}: model_name is not set, please set it in the config.toml file.") + if not base_url: + raise ValueError(f"{llm_provider}: base_url is not set, please set it in the config.toml file.") - client = OpenAI( - api_key=api_key, - base_url=base_url, - ) + client = OpenAI( + api_key=api_key, + base_url=base_url, + ) - response = client.chat.completions.create( - model=model_name, - messages=[{"role": "user", "content": prompt}], - ).choices[0].message.content - return response + response = client.chat.completions.create( + model=model_name, + messages=[{"role": "user", "content": prompt}] + ) + if response: + content = response.choices[0].message.content + + return content def generate_script(video_subject: str, language: str = "zh-CN", paragraph_number: int = 1) -> str: @@ -160,6 +177,6 @@ if __name__ == "__main__": script = generate_script(video_subject=video_subject, language="zh-CN", paragraph_number=1) # print("######################") # print(script) - search_terms = generate_terms(video_subject=video_subject, video_script=script, amount=5) + # search_terms = generate_terms(video_subject=video_subject, video_script=script, amount=5) # print("######################") # print(search_terms) diff --git a/config.example.toml b/config.example.toml index b394786..7f5d3b9 100644 --- a/config.example.toml +++ b/config.example.toml @@ -5,7 +5,7 @@ # For example: pexels_api_keys = ["123456789","abcdefghi"] pexels_api_keys = [] - llm_provider="openai" # "openai" or "moonshot" or "oneapi" + llm_provider="openai" # "openai" or "moonshot" or "oneapi" or "g4f" # OpenAI API Key # Visit https://openai.com/api/ for details on obtaining an API key. @@ -25,6 +25,11 @@ oneapi_base_url="" oneapi_model_name="" + # G4F + # Visit https://github.com/xtekky/gpt4free to get more details + # Supported model list: https://github.com/xtekky/gpt4free/blob/main/g4f/models.py + g4f_model_name = "gpt-3.5-turbo-16k-0613" + # Subtitle Provider, "edge" or "whisper" # If empty, the subtitle will not be generated subtitle_provider = "edge" diff --git a/requirements.txt b/requirements.txt index e61d116..884c2fd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,4 +11,5 @@ loguru~=0.7.2 aiohttp~=3.9.3 urllib3~=2.2.1 pillow~=10.2.0 -pydantic~=2.6.3 \ No newline at end of file +pydantic~=2.6.3 +g4f~=0.2.5.4 \ No newline at end of file