mirror of
https://github.com/xtekky/gpt4free.git
synced 2025-11-02 04:22:44 +08:00
Improve logging implementation (#2347)
This commit is contained in:
@@ -9,6 +9,7 @@ from ..typing import AsyncResult, Messages
|
|||||||
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
|
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
|
||||||
from .helper import format_prompt
|
from .helper import format_prompt
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
class Ai4Chat(AsyncGeneratorProvider, ProviderModelMixin):
|
class Ai4Chat(AsyncGeneratorProvider, ProviderModelMixin):
|
||||||
label = "AI4Chat"
|
label = "AI4Chat"
|
||||||
@@ -84,5 +85,5 @@ class Ai4Chat(AsyncGeneratorProvider, ProviderModelMixin):
|
|||||||
|
|
||||||
yield clean_message
|
yield clean_message
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.exception("Error while calling AI 4Chat API: %s", e)
|
logger.exception("Error while calling AI 4Chat API: %s", e)
|
||||||
yield f"Error: {e}"
|
yield f"Error: {e}"
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ from .helper import format_prompt
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
class Mhystical(AsyncGeneratorProvider, ProviderModelMixin):
|
class Mhystical(AsyncGeneratorProvider, ProviderModelMixin):
|
||||||
url = "https://api.mhystical.cc"
|
url = "https://api.mhystical.cc"
|
||||||
api_endpoint = "https://api.mhystical.cc/v1/completions"
|
api_endpoint = "https://api.mhystical.cc/v1/completions"
|
||||||
@@ -84,5 +86,5 @@ class Mhystical(AsyncGeneratorProvider, ProviderModelMixin):
|
|||||||
message_content = json_response["choices"][0]["message"]["content"]
|
message_content = json_response["choices"][0]["message"]["content"]
|
||||||
return message_content
|
return message_content
|
||||||
except (KeyError, IndexError, json.JSONDecodeError) as e:
|
except (KeyError, IndexError, json.JSONDecodeError) as e:
|
||||||
logging.error("Error parsing response: %s", e)
|
logger.error("Error parsing response: %s", e)
|
||||||
return "Error: Failed to parse response from API."
|
return "Error: Failed to parse response from API."
|
||||||
@@ -11,7 +11,7 @@ from ...cookies import get_cookies_dir
|
|||||||
from ...errors import MissingRequirementsError
|
from ...errors import MissingRequirementsError
|
||||||
from ... import debug
|
from ... import debug
|
||||||
|
|
||||||
logging.basicConfig(level=logging.ERROR)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
class NoValidHarFileError(Exception):
|
class NoValidHarFileError(Exception):
|
||||||
...
|
...
|
||||||
@@ -81,14 +81,14 @@ async def get_telemetry_ids(proxy: str = None) -> list:
|
|||||||
return [await create_telemetry_id(proxy)]
|
return [await create_telemetry_id(proxy)]
|
||||||
except NoValidHarFileError as e:
|
except NoValidHarFileError as e:
|
||||||
if debug.logging:
|
if debug.logging:
|
||||||
logging.error(e)
|
logger.error(e)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from nodriver import start
|
from nodriver import start
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise MissingRequirementsError('Add .har file from you.com or install "nodriver" package | pip install -U nodriver')
|
raise MissingRequirementsError('Add .har file from you.com or install "nodriver" package | pip install -U nodriver')
|
||||||
if debug.logging:
|
if debug.logging:
|
||||||
logging.error('Getting telemetry_id for you.com with nodriver')
|
logger.error('Getting telemetry_id for you.com with nodriver')
|
||||||
|
|
||||||
browser = page = None
|
browser = page = None
|
||||||
try:
|
try:
|
||||||
@@ -112,4 +112,4 @@ async def get_telemetry_ids(proxy: str = None) -> list:
|
|||||||
await browser.stop()
|
await browser.stop()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if debug.logging:
|
if debug.logging:
|
||||||
logging.error(e)
|
logger.error(e)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import logging
|
||||||
|
|
||||||
from . import debug, version
|
from . import debug, version
|
||||||
from .models import Model
|
from .models import Model
|
||||||
@@ -12,6 +13,14 @@ from .providers.types import ProviderType
|
|||||||
from .providers.base_provider import AsyncGeneratorProvider
|
from .providers.base_provider import AsyncGeneratorProvider
|
||||||
from .client.service import get_model_and_provider, get_last_provider
|
from .client.service import get_model_and_provider, get_last_provider
|
||||||
|
|
||||||
|
#Configure "g4f" logger
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
log_handler = logging.StreamHandler()
|
||||||
|
log_handler.setFormatter(logging.Formatter(logging.BASIC_FORMAT))
|
||||||
|
logger.addHandler(log_handler)
|
||||||
|
|
||||||
|
logger.setLevel(logging.ERROR)
|
||||||
|
|
||||||
class ChatCompletion:
|
class ChatCompletion:
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def create(model : Union[Model, str],
|
def create(model : Union[Model, str],
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ from g4f.client import Client, ChatCompletion, ChatCompletionChunk, ImagesRespon
|
|||||||
from g4f.typing import Messages
|
from g4f.typing import Messages
|
||||||
from g4f.cookies import read_cookie_files
|
from g4f.cookies import read_cookie_files
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
def create_app(g4f_api_key: str = None):
|
def create_app(g4f_api_key: str = None):
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
@@ -200,14 +202,14 @@ class Api:
|
|||||||
except GeneratorExit:
|
except GeneratorExit:
|
||||||
pass
|
pass
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.exception(e)
|
logger.exception(e)
|
||||||
yield f'data: {format_exception(e, config)}\n\n'
|
yield f'data: {format_exception(e, config)}\n\n'
|
||||||
yield "data: [DONE]\n\n"
|
yield "data: [DONE]\n\n"
|
||||||
|
|
||||||
return StreamingResponse(streaming(), media_type="text/event-stream")
|
return StreamingResponse(streaming(), media_type="text/event-stream")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.exception(e)
|
logger.exception(e)
|
||||||
return Response(content=format_exception(e, config), status_code=500, media_type="application/json")
|
return Response(content=format_exception(e, config), status_code=500, media_type="application/json")
|
||||||
|
|
||||||
@self.app.post("/v1/images/generate")
|
@self.app.post("/v1/images/generate")
|
||||||
@@ -222,7 +224,7 @@ class Api:
|
|||||||
response_data = [image.to_dict() for image in response.data]
|
response_data = [image.to_dict() for image in response.data]
|
||||||
return JSONResponse({"data": response_data})
|
return JSONResponse({"data": response_data})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.exception(e)
|
logger.exception(e)
|
||||||
return Response(content=format_exception(e, config), status_code=500, media_type="application/json")
|
return Response(content=format_exception(e, config), status_code=500, media_type="application/json")
|
||||||
|
|
||||||
@self.app.post("/v1/completions")
|
@self.app.post("/v1/completions")
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import sys,logging
|
import sys,logging
|
||||||
|
|
||||||
from loguru import logger
|
#from loguru import logger
|
||||||
|
|
||||||
def __exception_handle(e_type, e_value, e_traceback):
|
def __exception_handle(e_type, e_value, e_traceback):
|
||||||
if issubclass(e_type, KeyboardInterrupt):
|
if issubclass(e_type, KeyboardInterrupt):
|
||||||
@@ -9,24 +9,24 @@ def __exception_handle(e_type, e_value, e_traceback):
|
|||||||
|
|
||||||
sys.__excepthook__(e_type, e_value, e_traceback)
|
sys.__excepthook__(e_type, e_value, e_traceback)
|
||||||
|
|
||||||
class __InterceptHandler(logging.Handler):
|
#class __InterceptHandler(logging.Handler):
|
||||||
def emit(self, record):
|
# def emit(self, record):
|
||||||
try:
|
# try:
|
||||||
level = logger.level(record.levelname).name
|
# level = logger.level(record.levelname).name
|
||||||
except ValueError:
|
# except ValueError:
|
||||||
level = record.levelno
|
# level = record.levelno
|
||||||
|
#
|
||||||
|
# frame, depth = logging.currentframe(), 2
|
||||||
|
# while frame.f_code.co_filename == logging.__file__:
|
||||||
|
# frame = frame.f_back
|
||||||
|
# depth += 1
|
||||||
|
|
||||||
frame, depth = logging.currentframe(), 2
|
# logger.opt(depth=depth, exception=record.exc_info).log(
|
||||||
while frame.f_code.co_filename == logging.__file__:
|
# level, record.getMessage()
|
||||||
frame = frame.f_back
|
# )
|
||||||
depth += 1
|
|
||||||
|
|
||||||
logger.opt(depth=depth, exception=record.exc_info).log(
|
|
||||||
level, record.getMessage()
|
|
||||||
)
|
|
||||||
|
|
||||||
def hook_except_handle():
|
def hook_except_handle():
|
||||||
sys.excepthook = __exception_handle
|
sys.excepthook = __exception_handle
|
||||||
|
|
||||||
def hook_logging(**kwargs):
|
#def hook_logging(**kwargs):
|
||||||
logging.basicConfig(handlers=[__InterceptHandler()], **kwargs)
|
# logging.basicConfig(handlers=[__InterceptHandler()], **kwargs)
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ from g4f.Provider import ProviderType, __providers__, __map__
|
|||||||
from g4f.providers.base_provider import ProviderModelMixin, FinishReason
|
from g4f.providers.base_provider import ProviderModelMixin, FinishReason
|
||||||
from g4f.providers.conversation import BaseConversation
|
from g4f.providers.conversation import BaseConversation
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
# Define the directory for generated images
|
# Define the directory for generated images
|
||||||
images_dir = "./generated_images"
|
images_dir = "./generated_images"
|
||||||
|
|
||||||
@@ -155,7 +157,7 @@ class Api:
|
|||||||
conversations[provider][conversation_id] = chunk
|
conversations[provider][conversation_id] = chunk
|
||||||
yield self._format_json("conversation", conversation_id)
|
yield self._format_json("conversation", conversation_id)
|
||||||
elif isinstance(chunk, Exception):
|
elif isinstance(chunk, Exception):
|
||||||
logging.exception(chunk)
|
logger.exception(chunk)
|
||||||
yield self._format_json("message", get_error_message(chunk))
|
yield self._format_json("message", get_error_message(chunk))
|
||||||
elif isinstance(chunk, ImagePreview):
|
elif isinstance(chunk, ImagePreview):
|
||||||
yield self._format_json("preview", chunk.to_string())
|
yield self._format_json("preview", chunk.to_string())
|
||||||
@@ -165,7 +167,7 @@ class Api:
|
|||||||
elif not isinstance(chunk, FinishReason):
|
elif not isinstance(chunk, FinishReason):
|
||||||
yield self._format_json("content", str(chunk))
|
yield self._format_json("content", str(chunk))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.exception(e)
|
logger.exception(e)
|
||||||
yield self._format_json('error', get_error_message(e))
|
yield self._format_json('error', get_error_message(e))
|
||||||
|
|
||||||
async def _copy_images(self, images: list[str], cookies: Optional[Cookies] = None):
|
async def _copy_images(self, images: list[str], cookies: Optional[Cookies] = None):
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ PyExecJS
|
|||||||
duckduckgo-search>=5.0
|
duckduckgo-search>=5.0
|
||||||
nest_asyncio
|
nest_asyncio
|
||||||
werkzeug
|
werkzeug
|
||||||
loguru
|
|
||||||
pillow
|
pillow
|
||||||
platformdirs
|
platformdirs
|
||||||
fastapi
|
fastapi
|
||||||
|
|||||||
2
setup.py
2
setup.py
@@ -39,7 +39,7 @@ EXTRA_REQUIRE = {
|
|||||||
"pillow", # image
|
"pillow", # image
|
||||||
"cairosvg", # svg image
|
"cairosvg", # svg image
|
||||||
"werkzeug", "flask", # gui
|
"werkzeug", "flask", # gui
|
||||||
"loguru", "fastapi", # api
|
"fastapi", # api
|
||||||
"uvicorn", "nest_asyncio", # api
|
"uvicorn", "nest_asyncio", # api
|
||||||
"pycryptodome" # openai
|
"pycryptodome" # openai
|
||||||
],
|
],
|
||||||
|
|||||||
Reference in New Issue
Block a user