slither.utils.codex

  1import logging
  2import os
  3from argparse import ArgumentParser
  4from pathlib import Path
  5
  6from slither.utils.command_line import defaults_flag_in_config
  7
  8logger = logging.getLogger("Slither")
  9
 10
 11def init_parser(parser: ArgumentParser, always_enable_codex: bool = False) -> None:
 12    """
 13    Init the cli arg with codex features
 14
 15    Args:
 16        parser:
 17        always_enable_codex (Optional(bool)): if true, --codex is not enabled
 18
 19    Returns:
 20
 21    """
 22    group_codex = parser.add_argument_group("Codex (https://beta.openai.com/docs/guides/code)")
 23
 24    if not always_enable_codex:
 25        group_codex.add_argument(
 26            "--codex",
 27            help="Enable codex (require an OpenAI API Key)",
 28            action="store_true",
 29            default=defaults_flag_in_config["codex"],
 30        )
 31
 32    group_codex.add_argument(
 33        "--codex-log",
 34        help="Log codex queries (in crytic_export/codex/)",
 35        action="store_true",
 36        default=False,
 37    )
 38
 39    group_codex.add_argument(
 40        "--codex-contracts",
 41        help="Comma separated list of contracts to submit to OpenAI Codex",
 42        action="store",
 43        default=defaults_flag_in_config["codex_contracts"],
 44    )
 45
 46    group_codex.add_argument(
 47        "--codex-model",
 48        help="Name of the Codex model to use (affects pricing).  Defaults to 'text-davinci-003'",
 49        action="store",
 50        default=defaults_flag_in_config["codex_model"],
 51    )
 52
 53    group_codex.add_argument(
 54        "--codex-temperature",
 55        help="Temperature to use with Codex.  Lower number indicates a more precise answer while higher numbers return more creative answers.  Defaults to 0",
 56        action="store",
 57        default=defaults_flag_in_config["codex_temperature"],
 58    )
 59
 60    group_codex.add_argument(
 61        "--codex-max-tokens",
 62        help="Maximum amount of tokens to use on the response.  This number plus the size of the prompt can be no larger than the limit (4097 for text-davinci-003)",
 63        action="store",
 64        default=defaults_flag_in_config["codex_max_tokens"],
 65    )
 66
 67    group_codex.add_argument(
 68        "--codex-organization",
 69        help="Codex organization",
 70        action="store",
 71        default=None,
 72    )
 73
 74
 75# TODO: investigate how to set the correct return type
 76# So that the other modules can work with openai
 77def openai_module():  # type: ignore
 78    """
 79    Return the openai module
 80    Consider checking the usage of open (slither.codex_enabled) before using this function
 81
 82    Returns:
 83        Optional[the openai module]
 84    """
 85    try:
 86        # pylint: disable=import-outside-toplevel
 87        import openai
 88
 89        api_key = os.getenv("OPENAI_API_KEY")
 90        if api_key is None:
 91            logger.info(
 92                "Please provide an Open API Key in OPENAI_API_KEY (https://beta.openai.com/account/api-keys)"
 93            )
 94            return None
 95        openai.api_key = api_key
 96    except ImportError:
 97        logger.info("OpenAI was not installed")  # type: ignore
 98        logger.info('run "pip install openai"')
 99        return None
100    return openai
101
102
103def log_codex(filename: str, prompt: str) -> None:
104    """
105    Log the prompt in crytic/export/codex/filename
106    Append to the file
107
108    Args:
109        filename: filename to write to
110        prompt: prompt to write
111
112    Returns:
113        None
114    """
115
116    Path("crytic_export/codex").mkdir(parents=True, exist_ok=True)
117
118    with open(Path("crytic_export/codex", filename), "a", encoding="utf8") as file:
119        file.write(prompt)
120        file.write("\n")
logger = <Logger Slither (WARNING)>
def init_parser( parser: argparse.ArgumentParser, always_enable_codex: bool = False) -> None:
12def init_parser(parser: ArgumentParser, always_enable_codex: bool = False) -> None:
13    """
14    Init the cli arg with codex features
15
16    Args:
17        parser:
18        always_enable_codex (Optional(bool)): if true, --codex is not enabled
19
20    Returns:
21
22    """
23    group_codex = parser.add_argument_group("Codex (https://beta.openai.com/docs/guides/code)")
24
25    if not always_enable_codex:
26        group_codex.add_argument(
27            "--codex",
28            help="Enable codex (require an OpenAI API Key)",
29            action="store_true",
30            default=defaults_flag_in_config["codex"],
31        )
32
33    group_codex.add_argument(
34        "--codex-log",
35        help="Log codex queries (in crytic_export/codex/)",
36        action="store_true",
37        default=False,
38    )
39
40    group_codex.add_argument(
41        "--codex-contracts",
42        help="Comma separated list of contracts to submit to OpenAI Codex",
43        action="store",
44        default=defaults_flag_in_config["codex_contracts"],
45    )
46
47    group_codex.add_argument(
48        "--codex-model",
49        help="Name of the Codex model to use (affects pricing).  Defaults to 'text-davinci-003'",
50        action="store",
51        default=defaults_flag_in_config["codex_model"],
52    )
53
54    group_codex.add_argument(
55        "--codex-temperature",
56        help="Temperature to use with Codex.  Lower number indicates a more precise answer while higher numbers return more creative answers.  Defaults to 0",
57        action="store",
58        default=defaults_flag_in_config["codex_temperature"],
59    )
60
61    group_codex.add_argument(
62        "--codex-max-tokens",
63        help="Maximum amount of tokens to use on the response.  This number plus the size of the prompt can be no larger than the limit (4097 for text-davinci-003)",
64        action="store",
65        default=defaults_flag_in_config["codex_max_tokens"],
66    )
67
68    group_codex.add_argument(
69        "--codex-organization",
70        help="Codex organization",
71        action="store",
72        default=None,
73    )

Init the cli arg with codex features

Args: parser: always_enable_codex (Optional(bool)): if true, --codex is not enabled

Returns:

def openai_module():
 78def openai_module():  # type: ignore
 79    """
 80    Return the openai module
 81    Consider checking the usage of open (slither.codex_enabled) before using this function
 82
 83    Returns:
 84        Optional[the openai module]
 85    """
 86    try:
 87        # pylint: disable=import-outside-toplevel
 88        import openai
 89
 90        api_key = os.getenv("OPENAI_API_KEY")
 91        if api_key is None:
 92            logger.info(
 93                "Please provide an Open API Key in OPENAI_API_KEY (https://beta.openai.com/account/api-keys)"
 94            )
 95            return None
 96        openai.api_key = api_key
 97    except ImportError:
 98        logger.info("OpenAI was not installed")  # type: ignore
 99        logger.info('run "pip install openai"')
100        return None
101    return openai

Return the openai module Consider checking the usage of open (slither.codex_enabled) before using this function

Returns: Optional[the openai module]

def log_codex(filename: str, prompt: str) -> None:
104def log_codex(filename: str, prompt: str) -> None:
105    """
106    Log the prompt in crytic/export/codex/filename
107    Append to the file
108
109    Args:
110        filename: filename to write to
111        prompt: prompt to write
112
113    Returns:
114        None
115    """
116
117    Path("crytic_export/codex").mkdir(parents=True, exist_ok=True)
118
119    with open(Path("crytic_export/codex", filename), "a", encoding="utf8") as file:
120        file.write(prompt)
121        file.write("\n")

Log the prompt in crytic/export/codex/filename Append to the file

Args: filename: filename to write to prompt: prompt to write

Returns: None