Upload app.py
Browse files
app.py
CHANGED
|
@@ -994,9 +994,14 @@ def run_sympy(problem: str) -> dict:
|
|
| 994 |
|
| 995 |
# ββ Series sum ββββββββββββββββββββββββββββββββββββββββββββ
|
| 996 |
elif any(k in p for k in ["series","sum of"]):
|
| 997 |
-
m = re.search(r"(?:sum|series
|
| 998 |
if m:
|
| 999 |
-
raw =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1000 |
try:
|
| 1001 |
expr_ser = parse_expr(raw, transformations=tfms,
|
| 1002 |
local_dict={**ld, "n": n_s})
|
|
@@ -1247,13 +1252,34 @@ def ask_ai(problem: str, sympy_info: dict, history: list) -> str:
|
|
| 1247 |
user_msg = problem
|
| 1248 |
messages.append({"role": "user", "content": user_msg})
|
| 1249 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1250 |
# Try each provider in order β auto-rotate on 429 or error
|
| 1251 |
last_error = ""
|
| 1252 |
for provider_name, key, call_fn in providers:
|
| 1253 |
if not key:
|
| 1254 |
continue # skip if key not set
|
| 1255 |
try:
|
| 1256 |
-
|
|
|
|
| 1257 |
except requests.exceptions.Timeout:
|
| 1258 |
last_error = f"β³ {provider_name} timed out"
|
| 1259 |
continue
|
|
|
|
| 994 |
|
| 995 |
# ββ Series sum ββββββββββββββββββββββββββββββββββββββββββββ
|
| 996 |
elif any(k in p for k in ["series","sum of"]):
|
| 997 |
+
m = re.search(r"(?:sum\s+of|series\s+(?:of\s+)?|convergence\s+of)\s*(.+?)(?:\s+from|\s+using|\s+by|$)", p)
|
| 998 |
if m:
|
| 999 |
+
raw = m.group(1).strip()
|
| 1000 |
+
raw = re.sub(r"^series\s+sum\s+of\s+", "", raw)
|
| 1001 |
+
raw = re.sub(r"^series\s+of\s+", "", raw)
|
| 1002 |
+
raw = re.sub(r"^sum\s+of\s+", "", raw)
|
| 1003 |
+
raw = re.sub(r"^of\s+", "", raw)
|
| 1004 |
+
raw = clean(raw)
|
| 1005 |
try:
|
| 1006 |
expr_ser = parse_expr(raw, transformations=tfms,
|
| 1007 |
local_dict={**ld, "n": n_s})
|
|
|
|
| 1252 |
user_msg = problem
|
| 1253 |
messages.append({"role": "user", "content": user_msg})
|
| 1254 |
|
| 1255 |
+
# ββ Permanent fix: force correct final answer from SymPy ββββββββ
|
| 1256 |
+
def enforce_verified_answer(ai_response: str) -> str:
|
| 1257 |
+
"""Remove AI final answer, replace with SymPy verified one."""
|
| 1258 |
+
result = sympy_info.get("result", "")
|
| 1259 |
+
latex = sympy_info.get("latex", "")
|
| 1260 |
+
# Only enforce if SymPy has a real computed result
|
| 1261 |
+
if (not result or
|
| 1262 |
+
result in (None, "matrix_detected", "mod_detected") or
|
| 1263 |
+
not latex):
|
| 1264 |
+
return ai_response # theory question β leave AI response untouched
|
| 1265 |
+
# Remove everything after last "β
" or "Final Answer"
|
| 1266 |
+
cleaned = re.sub(
|
| 1267 |
+
r'(β
\s*\*{0,2}Final\s*Answer\*{0,2}.*|β
[^\n]*$)',
|
| 1268 |
+
"", ai_response,
|
| 1269 |
+
flags=re.DOTALL | re.IGNORECASE
|
| 1270 |
+
).rstrip()
|
| 1271 |
+
# Append our verified final answer
|
| 1272 |
+
verified_line = f"\n\nβ
**Final Answer:** $${latex}$$"
|
| 1273 |
+
return cleaned + verified_line
|
| 1274 |
+
|
| 1275 |
# Try each provider in order β auto-rotate on 429 or error
|
| 1276 |
last_error = ""
|
| 1277 |
for provider_name, key, call_fn in providers:
|
| 1278 |
if not key:
|
| 1279 |
continue # skip if key not set
|
| 1280 |
try:
|
| 1281 |
+
response = call_fn(key, messages)
|
| 1282 |
+
return enforce_verified_answer(response)
|
| 1283 |
except requests.exceptions.Timeout:
|
| 1284 |
last_error = f"β³ {provider_name} timed out"
|
| 1285 |
continue
|