From 1a78de96b9866ad32cd27544bebe78ededf591ba Mon Sep 17 00:00:00 2001 From: nikolay Date: Wed, 6 May 2026 16:42:03 +0300 Subject: [PATCH] update db fix --- chat.sqlite3 | Bin 0 -> 16384 bytes index.html | 16 ++++++++++++++-- server.py | 4 ++++ 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 chat.sqlite3 diff --git a/chat.sqlite3 b/chat.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..f316c42e4ca58220c7c88d6be7e23f9cf2fdaa0d GIT binary patch literal 16384 zcmeHNOK%(373Qn8qncH+C=9Q9Y@wi}h_qchD4+sKREKei%Ce%+NW2n;`7G0QnFs5WZfB;!#Gt-~ou8Xd^X*d1Oy&OK|2bxWR8kZ6u zbLZT1&i9?yaKH~gm^3{>H*BYBcyuB1dL$N$yh{{`L}GX*@C+YEkE7vDe?*cS$yvPVhh{)Cpc&8%Xa+O`ngPv#WxiEH_*xhd$mlAX$r9oZA& zqZn~u7_M!Z zR{6W{m=zXBt4m3Utz+)oQERSecy;$hrd$u+RN>1rUJA#tofmC;M!EMCZ)2D}4?d0(vbu^^sMWHOJ zRpa9Lh4Y1;{r)3*y7)WtH~a(tN$?=J?>B;V3fBF{!K%ND#Z9^3@8RRN-(;CF!sm@( zCAf#Uq2aiQQMUAP6`MZzaF2F$(U%y-me7bIef+?%=~?DcR(BgxD1O4d8$R87>4J zJCxBiW`bcbM0N;{b5eZH7@e4ggdKNL3^~T;QbJp{uYnkwaefQXnJF&0$BSI>20>&OcpzcrimX;QtZ0 zkU-t~X{Z*+`ODxpWWBC3394<$R>sYVTSBK|$=h?P^90;2c%*aLn zeTULuUk^eJ%O((f9;^cdvq@Q@b)2f8=g4TP7_Wf)hB`2b3k zG8pEz-OVsQVA=-Kg!+4=QXAF8y_q`~;E#@?pRe$CC}UNs|Fpx!*rbX6{(~b9=SDk3 zviIYd`zqcJgH<@&V8fwZmTk`*Sz5g_s})&rdJa9?CT*w&_;5B^s$2*R1H4IZhAV~KP#Sna0wLnh*x(Z^BZg6`zB z@+8b)%)pMJ2G4wk&rN+(CXx)a-}*TpF9i=J^}$_8s7Z-#&AU6PsAxijdWR>=0vIRJ zR)3(Gui&nPz0ZKV_0DLa89XdWpy>EWB3vOTxT=wLQyS+m((sDW!xQZ5zsREBK<8i` zYhOQ60M=B$Z1Rxeamd+?U3_T*^UsM6au>nycX^!g8-x)B@U+Ix@}{tja?eMq@Kog( zw{V_ogr{MLS6KmahKE;9%q1+~s)?ys=}jKYGp@b8G|qtwsaTaa7F3X)F8)>ml7+x| z39xExoX*b)s=LCWc?b6}Trw@1sk^ReSmSgCYQn3^GgK9Z{N8-Yt*X4S+^2%K}r5GVl7&_u=UP}LK#O#4FSCZ@2<-~Xe7e~;i_KQsfH0nLDBKr^5j z&Gy|Fe&46Y=GoTrG6&QFU8c#+0ehHEo0ItN~H<7`=4gPcRo58=n3NSSW&46Y= zGoTsJ3}^;41DXNNfM!55pc&8%ypjx@NSumB)en9XiPsaS!vp^9Zan@*VkjEz`GI0A OHjp^=+H30PcK-ouCpH@Z literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 8f431b7..87b5ed3 100644 --- a/index.html +++ b/index.html @@ -965,8 +965,20 @@ if (oldest && oldest.id) url += `&before_id=${encodeURIComponent(oldest.id)}`; } const r = await fetch(url); - const data = await r.json().catch(() => ({})); - if (!r.ok || !data.ok) throw new Error(data.error || "chat load failed"); + const raw = await r.text().catch(() => ""); + let data = {}; + try { + data = raw ? JSON.parse(raw) : {}; + } catch { + data = {}; + } + if (!r.ok || !data.ok) { + const details = + (data && data.error) || + (raw && raw.trim() ? raw.trim().slice(0, 300) : "") || + `${r.status} ${r.statusText}`.trim(); + throw new Error(details || "chat load failed"); + } const pageDesc = data.items || []; const pageChrono = pageDesc.slice().reverse(); // newest->oldest => oldest->newest diff --git a/server.py b/server.py index 85ded77..ca01476 100644 --- a/server.py +++ b/server.py @@ -224,6 +224,8 @@ def _required_str(payload: Dict[str, Any], key: str) -> Tuple[Optional[str], Opt app = Flask(__name__, static_folder=".", static_url_path="") +# Accept both `/path` and `/path/` to be resilient behind proxies/CDNs. +app.url_map.strict_slashes = False def _db_connect() -> sqlite3.Connection: @@ -510,6 +512,7 @@ def discover_models(provider: str) -> list: @app.get("/api/chat") +@app.get("/api/chat/") def api_chat_list() -> Any: provider = request.args.get("provider", "").strip() if not provider: @@ -580,6 +583,7 @@ def api_chat_list() -> Any: @app.post("/api/chat/clear") +@app.post("/api/chat/clear/") def api_chat_clear() -> Any: payload = request.get_json(silent=True) or {} provider, err = _required_str(payload, "provider")