Spaces:
Runtime error
Runtime error
Update agent.py
Browse files
agent.py
CHANGED
@@ -127,8 +127,6 @@ gemini_llm = ChatGoogleGenerativeAI(
|
|
127 |
model="gemini-2.0-flash",
|
128 |
temperature=0,
|
129 |
max_output_tokens=2048,
|
130 |
-
).bind_tools(
|
131 |
-
[web_search, wiki_search, parse_csv, parse_excel, python_repl]
|
132 |
)
|
133 |
|
134 |
# ---------------------------------------------------------------------
|
@@ -136,33 +134,50 @@ gemini_llm = ChatGoogleGenerativeAI(
|
|
136 |
# ---------------------------------------------------------------------
|
137 |
SYSTEM_PROMPT = SystemMessage(
|
138 |
content=(
|
139 |
-
"You are a helpful assistant with access to
|
140 |
-
"
|
141 |
-
"
|
142 |
-
"
|
143 |
-
"
|
144 |
-
"
|
145 |
-
"
|
146 |
-
"
|
147 |
-
"
|
148 |
-
"
|
|
|
|
|
149 |
)
|
150 |
)
|
151 |
|
152 |
# ---------------------------------------------------------------------
|
153 |
# 7) LangGraph – Planner + Tools + Router
|
154 |
# ---------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
155 |
def planner(state: MessagesState):
|
156 |
-
"""LLM-Planner – entscheidet, ob Tool nötig oder Final Answer erreicht."""
|
157 |
msgs = state["messages"]
|
158 |
if msgs[0].type != "system":
|
159 |
msgs = [SYSTEM_PROMPT] + msgs
|
|
|
160 |
resp = with_backoff(lambda: gemini_llm.invoke(msgs))
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
166 |
|
167 |
def route(state):
|
168 |
return "END" if state["should_end"] else "tools"
|
|
|
127 |
model="gemini-2.0-flash",
|
128 |
temperature=0,
|
129 |
max_output_tokens=2048,
|
|
|
|
|
130 |
)
|
131 |
|
132 |
# ---------------------------------------------------------------------
|
|
|
134 |
# ---------------------------------------------------------------------
|
135 |
SYSTEM_PROMPT = SystemMessage(
|
136 |
content=(
|
137 |
+
"You are a helpful assistant with access to several tools.\n"
|
138 |
+
"You can think step by step and use tools to find answers.\n\n"
|
139 |
+
"When you want to use a tool, write it like this:\n"
|
140 |
+
"Tool: <tool_name>\n"
|
141 |
+
"Input: <input for the tool>\n\n"
|
142 |
+
"Wait for the tool result before continuing.\n"
|
143 |
+
"When you know the final answer, reply with the answer **only**.\n"
|
144 |
+
"Don't include any prefix, explanation or formatting around the answer.\n"
|
145 |
+
"Answer formatting:\n"
|
146 |
+
"- For numbers: no units unless requested\n"
|
147 |
+
"- For strings: no articles or abbreviations\n"
|
148 |
+
"- For lists: comma + space separated, correct order\n"
|
149 |
)
|
150 |
)
|
151 |
|
152 |
# ---------------------------------------------------------------------
|
153 |
# 7) LangGraph – Planner + Tools + Router
|
154 |
# ---------------------------------------------------------------------
|
155 |
+
def extract_tool_call(text: str) -> tuple[str, str] | None:
|
156 |
+
"""Parse Gemini output like: 'Tool: xyz\nInput: abc'."""
|
157 |
+
match = re.search(r"Tool:\s*(\w+)\s*Input:\s*(.+)", text, re.DOTALL)
|
158 |
+
if match:
|
159 |
+
return match.group(1).strip(), match.group(2).strip()
|
160 |
+
return None
|
161 |
+
|
162 |
def planner(state: MessagesState):
|
|
|
163 |
msgs = state["messages"]
|
164 |
if msgs[0].type != "system":
|
165 |
msgs = [SYSTEM_PROMPT] + msgs
|
166 |
+
|
167 |
resp = with_backoff(lambda: gemini_llm.invoke(msgs))
|
168 |
+
content = resp.content.strip()
|
169 |
+
|
170 |
+
parsed = extract_tool_call(content)
|
171 |
+
if parsed:
|
172 |
+
tool_name, tool_input = parsed
|
173 |
+
tool = {t.name: t for t in TOOLS}.get(tool_name)
|
174 |
+
if tool:
|
175 |
+
result = tool.invoke(tool_input)
|
176 |
+
new_msg = HumanMessage(content=f"Tool result:\n{result}")
|
177 |
+
return {"messages": msgs + [resp, new_msg], "should_end": False}
|
178 |
+
|
179 |
+
finished = "\n" not in content # einfache Heuristik
|
180 |
+
return {"messages": msgs + [resp], "should_end": finished}
|
181 |
|
182 |
def route(state):
|
183 |
return "END" if state["should_end"] else "tools"
|