You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

main.py 2.8 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #! /bin/env python3
  2. import os
  3. import argparse
  4. from revChatGPT.V1 import Chatbot
  5. from typing import List
  6. from marko.parser import Parser
  7. from marko.block import FencedCode
  8. from marko.inline import RawText
  9. ENV_UUID = "GPTTRACE_CONV_UUID"
  10. ENV_ACCESS_TOKEN = "GPTTRACE_ACCESS_TOKEN"
  11. def main():
  12. parser = argparse.ArgumentParser(
  13. prog='GPTtrace',
  14. description='Use ChatGPT to write eBPF programs (bpftrace, etc.)')
  15. group = parser.add_mutually_exclusive_group()
  16. group.add_argument(
  17. "-e", "--explain", help="Let ChatGPT explain what's eBPF", action="store_true")
  18. group.add_argument(
  19. "-r", "--run", help="Generate commands using your input with ChatGPT, and run it", action="store", metavar="TEXT")
  20. parser.add_argument(
  21. "-u", "--uuid", help=f"Conversion UUID to use, or passed through environment variable `{ENV_UUID}`")
  22. parser.add_argument("-t", "--access-token",
  23. help=f"ChatGPT access token, see `https://chat.openai.com/api/auth/session` or passed through `{ENV_ACCESS_TOKEN}`")
  24. args = parser.parse_args()
  25. if (args.explain or args.run) is None:
  26. parser.print_help()
  27. return
  28. access_token = args.access_token or os.environ.get(ENV_ACCESS_TOKEN, None)
  29. conv_uuid = args.uuid or os.environ.get(ENV_UUID, None)
  30. if access_token is None:
  31. print(
  32. f"Either provide your access token through `-t` or through environment variable {ENV_ACCESS_TOKEN}")
  33. return
  34. chatbot = Chatbot(config={"access_token": access_token})
  35. if args.explain:
  36. generate_result(chatbot, "解释一下什么是 eBPF", conv_uuid, True)
  37. elif args.run is not None:
  38. desc: str = args.run
  39. ret_val = generate_result(chatbot, desc, conv_uuid, True)
  40. # print(ret_val)
  41. parsed = extract_code_blocks(ret_val)
  42. print(f"Command to run: {parsed[0]}")
  43. os.system(parsed[0])
  44. def generate_result(bot: Chatbot, text: str, session: str = None, print_out: bool = False) -> str:
  45. from io import StringIO
  46. prev_text = ""
  47. buf = StringIO()
  48. for data in bot.ask(
  49. text, conversation_id=session
  50. ):
  51. message = data["message"][len(prev_text):]
  52. if print_out:
  53. print(message, end="", flush=True)
  54. buf.write(message)
  55. prev_text = data["message"]
  56. if print_out:
  57. print()
  58. return buf.getvalue()
  59. def extract_code_blocks(text: str) -> List[str]:
  60. result = []
  61. parser = Parser()
  62. for block in parser.parse(text).children:
  63. if type(block) is FencedCode:
  64. block: FencedCode
  65. blk: RawText = block.children[0]
  66. result.append(blk.children)
  67. return result
  68. if __name__ == "__main__":
  69. main()

Generate eBPF programs and tracing with ChatGPT and natural language