AI auditor: surface the real connection error instead of swallowing it
The Test-AI button called AuditAsync, which caught every exception and returned null, and used EnsureSuccessStatusCode() (discarding the response body). So a failing AI service only ever produced a generic 'no response' message with no detail — impossible to diagnose. - Add IAiAuditor.TestAsync: runs the real call and returns a detailed Persian diagnostic — HTTP status + response body on non-2xx, raw body when the shape isn't OpenAI-compatible, and network/proxy/timeout specifics on exceptions. - AuditAsync now logs the actual HTTP status + response body (and proxy state) instead of a bare warning, so server logs show why a call failed. - ExtractContent / ParseVerdict no longer throw on unexpected JSON; they return null so the caller can show the raw body. - Settings 'Test AI' button uses TestAsync; result box renders multi-line and switches to alert-error styling when the test fails. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -16,7 +16,11 @@
|
||||
@if (Model.DemoMsg is not null) { <div class="alert alert-success">@Model.DemoMsg</div> }
|
||||
@if (Model.SmsTest is not null) { <div class="alert alert-success">@Model.SmsTest</div> }
|
||||
@if (Model.ProxyTest is not null) { <div class="alert alert-success">@Model.ProxyTest</div> }
|
||||
@if (Model.AiTest is not null) { <div class="alert alert-success">@Model.AiTest</div> }
|
||||
@if (Model.AiTest is not null)
|
||||
{
|
||||
<div class="alert @(Model.AiTest.StartsWith("✅") ? "alert-success" : "alert-error")"
|
||||
style="white-space:pre-wrap; word-break:break-word;">@Model.AiTest</div>
|
||||
}
|
||||
|
||||
<form method="post">
|
||||
<div class="settings-layout">
|
||||
|
||||
@@ -212,14 +212,9 @@ public class SettingsModel : PageModel
|
||||
{ AiTest = "ابتدا «فعالسازی هوش مصنوعی» را بزن و آدرس/کلید را ذخیره کن."; return RedirectToPage(); }
|
||||
|
||||
const string sample = "استخدام پرستار خانم برای بخش اورژانس بیمارستان میلاد تهران، شیفت شب، حقوق توافقی، تماس ۰۹۱۲۱۲۳۴۵۶۷";
|
||||
try
|
||||
{
|
||||
var r = await _ai.AuditAsync(sample, s);
|
||||
AiTest = r is null
|
||||
? "❌ پاسخی از هوش مصنوعی دریافت نشد. کلید/آدرس و (در صورت نیاز) تیک «از طریق پروکسی» را بررسی کن."
|
||||
: $"✅ هوش مصنوعی پاسخ داد — تصمیم: {r.Decision} | اطمینان: {r.Confidence}٪ | نقش: {r.Data?.Role} | شهر: {r.Data?.City} | شیفت: {r.Data?.ShiftType}";
|
||||
}
|
||||
catch (Exception ex) { AiTest = "❌ خطا در تماس با هوش مصنوعی: " + ex.Message; }
|
||||
// TestAsync runs the real call and returns the exact reason on failure (HTTP status,
|
||||
// response body, network/proxy error) — unlike AuditAsync, which swallows errors to null.
|
||||
AiTest = await _ai.TestAsync(sample, s);
|
||||
return RedirectToPage();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user