mirror of
				https://github.com/xtekky/gpt4free.git
				synced 2025-11-01 03:52:43 +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
	 foxfire52
					foxfire52