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()