sh2551 commited on
Commit
f46c1fc
verified
1 Parent(s): 93acb6c

Create app.py

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