File size: 6,045 Bytes
f46c1fc 48afeb0 f46c1fc | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | import google.generativeai as genai
import importlib.metadata
import requests
from packaging import version as pkg_version
import io
import sys
import os
# 讛讙讚专转 UTF-8 讘爪讜专讛 砖转砖诪讜专 注诇 讻讬讜讜谉 转拽讬谉 讘注讘专讬转
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
# 拽专讬讗转 API key 诪讛住讘讬讘讛 (诪转讗讬诐 诇诪专讞讘 Hugging Face)
API_KEY = os.getenv("GOOGLE_GENAI_API_KEY", "")
genai.configure(api_key=API_KEY)
# 驻讜谞拽爪讬讛 诇讻转讬讘讛 诇鈥憀og
def log_output(text, filename="log.txt"):
with open(filename, "a", encoding="utf-8") as f:
f.write(text + "\n")
# 讘讚讬拽转 讙专住讛
try:
lib_version = importlib.metadata.version("google-generativeai")
print(f"讙专住转 google-generativeai: {lib_version}")
if pkg_version.parse(lib_version) < pkg_version.parse("0.7.2"):
print("砖讚专讙 讗转 讛住驻专讬讬讛: pip install --upgrade google-generativeai")
exit(1)
except importlib.metadata.PackageNotFoundError:
print("讛住驻专讬讬讛 google-generativeai 诇讗 诪讜转拽谞转.")
exit(1)
# 讟注讬谞转 诪讜讚诇
try:
model = genai.GenerativeModel(model_name="gemini-2.5-flash")
print("诪讜讚诇 谞讟注谉 讘讛爪诇讞讛")
except Exception as e:
print(f"砖讙讬讗讛 讘讟注讬谞转 讛诪讜讚诇: {e}")
exit(1)
# 讛转讞诇转 爪'讗讟
try:
chat = model.start_chat()
print("爪'讗讟 讛转讞讬诇")
except Exception as e:
print(f"砖讙讬讗讛 讘讛转讞诇转 爪'讗讟: {e}")
exit(1)
# 砖诇讬讞转 System Prompt
chat.send_message("""
讗转讛 AI Agent 讞讻诐 砖诪讘爪注 诪砖讬诪讜转 砖诇讘 讗讞专 砖诇讘.
讻讗砖专 讬砖 爪讜专讱, 讗转讛 讬讻讜诇 诇讛砖转诪砖 讘住讬诪讜谉 @@PYTHON@@ 诇讛专爪转 拽讜讚 驻讬讬转讜谉
讗讜 讘住讬诪讜谉 @@URL@@ 讻讚讬 诇讛讘讬讗 转讜讻谉 诪讚驻讬 讗讬谞讟专谞讟.
谞讬转谉 诇讛砖转诪砖 讘-@@THOUGHTS@@ 讻讚讬 诇转讻谞谉 诪讞砖讘讜转 砖诇讘 讗讞专讬 砖诇讘.
讛诪砖讱 注讚 砖讬砖 转砖讜讘讛 住讜驻讬转 砖诪讜爪讙转 诇诪砖转诪砖.
""")
# 驻讜谞拽爪讬讜转 注讝专
def execute_code(code):
try:
exec_globals = {}
buffer = io.StringIO()
old_stdout = sys.stdout
sys.stdout = buffer
result = None
try:
# 诪谞住讛 eval 讗诐 讝讛 讘讬讟讜讬
result = eval(code, exec_globals)
except:
# 讗诐 讝讛 诇讗 eval, 讛专抓 讻志exec 专讙讬诇
exec(code, exec_globals)
result = exec_globals.get("result", None)
output = buffer.getvalue().strip()
sys.stdout = old_stdout
# 砖讬诇讜讘 驻诇讟 print 讜-result
if result is not None:
if output:
final = f"{output}\n{result}"
else:
final = str(result)
else:
final = output or "No result"
# 讻转讬讘讛 诇诇讜讙 注诐 讛拽讜讚 注爪诪讜 讜讛驻诇讟
log_output(f"========== PYTHON CODE ==========\n{code}\n========== OUTPUT ==========\n{final}\n", "LOG.TXT")
return final
except Exception as e:
err = f"砖讙讬讗转 拽讜讚: {str(e)}"
log_output(f"========== PYTHON CODE ==========\n{code}\n========== ERROR ==========\n{err}\n", "LOG.TXT")
return err
def get_web_page(url):
"""拽讘诇转 转讜讻谉 诪讚祝 讗讬谞讟专谞讟"""
try:
headers = {"User-Agent": "Mozilla/5.0"}
r = requests.get(url, headers=headers, timeout=5)
r.raise_for_status()
html_snippet = r.text[:5000]
log_output(f"@@URL@@ {url}\n{html_snippet}")
return html_snippet
except Exception as e:
err = f"砖讙讬讗讛 讘拽讘诇转 讛讚祝: {str(e)}"
log_output(f"@@URL@@ {url}\n{err}")
return err
LOG_FILE = "log.txt"
THOUGHTS_FILE = "thoughts_log.txt"
def handle_special_requests(text):
import re
# 讟讬驻讜诇 讘志URL
url_pattern = re.compile(r"@@URL@@\s*(.*?)\s*(?:@@|$)", re.DOTALL)
for match in url_pattern.finditer(text):
url = match.group(1).strip()
result = get_web_page(url)
text = text.replace(match.group(0), result)
log_output(f"\n========== URL REQUEST ==========\n{url}\n========== OUTPUT ==========\n{result}\n", LOG_FILE)
# 讟讬驻讜诇 讘志PYTHON
python_pattern = re.compile(r"@@PYTHON@@\s*(.*?)\s*(?:@@|$)", re.DOTALL)
for match in python_pattern.finditer(text):
code = match.group(1).strip()
result = execute_code(code)
text = text.replace(match.group(0), result)
log_output(f"\n========== PYTHON CODE ==========\n{code}\n========== OUTPUT ==========\n{result}\n", LOG_FILE)
# 讟讬驻讜诇 讘志THOUGHTS
thoughts_pattern = re.compile(r"@@THOUGHTS@@\s*(.*?)\s*(?:@@|$)", re.DOTALL)
for match in thoughts_pattern.finditer(text):
thoughts = match.group(1).strip()
# 砖诪讬专讛 诇诇讜讙
log_output(f"\n========== THOUGHTS ==========\n{thoughts}\n", THOUGHTS_FILE)
# 诪讞讝讬专 讞讝专讛 诇讗讜讟讜诪爪讬讛
text = text.replace(match.group(0), f"(诪讞砖讘讜转 AI 诪转讻谞谞讜转 砖诇讘 讗讞专讬 砖诇讘)\n{thoughts}")
return text
def process_message(user_input):
"""砖诇讬讞转 讘拽砖讛 诇诪讜讚诇 讜讟讬驻讜诇 讘讻诇 住讬诪讜谉"""
response = chat.send_message(user_input)
output = getattr(response, "text", "")
while True:
new_output = handle_special_requests(output)
if new_output == output:
break
response = chat.send_message(new_output)
output = getattr(response, "text", "")
return output
def main():
print("AI Agent 诪讜讻谉! 讛拽诇讚 诪砖讬诪讛 (讗讜 'exit' 诇住讬讜诐).")
while True:
try:
user_input = input("\n诪砖讬诪讛: ")
if user_input.lower() == "exit":
print("讬讜爪讗...")
break
answer = process_message(user_input)
print(f"\nAgent:\n{answer}\n")
except KeyboardInterrupt:
print("\n讬讜爪讗...")
break
except Exception as e:
print(f"砖讙讬讗讛 讻诇诇讬转: {str(e)}\n")
if __name__ == "__main__":
main()
|