[AI] Route AI calls through the Xray/V2Ray proxy (reach OpenAI from Iran)
CI/CD / CI · dotnet build (push) Successful in 1m46s
CI/CD / Deploy · hamkadr (push) Failing after 1m58s

Add AiUseProxy setting + a toggle in the AI settings section. ScrapeHttpClients.ForAi(settings) returns a proxied HttpClient (reusing IngestProxyUrl, 100s timeout) when AiUseProxy is on, otherwise direct; AI-cache keys are protected from the scrape-client cleanup. OpenAiCompatibleAuditor now uses it, so the AI auditor (e.g. api.openai.com) is reachable through the same Xray sidecar that serves Telegram. Migration adds the column.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
soroush.asadi
2026-06-07 22:55:07 +03:30
parent 018c0f0286
commit 0c49b89891
9 changed files with 1392 additions and 7 deletions
@@ -27,14 +27,29 @@ public sealed class ScrapeHttpClients : IDisposable
? s.IngestProxyUrl.Trim()
: "direct";
// Drop stale clients if the proxy URL changed (keep only "direct" + the current proxy).
// Drop stale clients if the proxy URL changed (keep "direct", current proxy, and AI clients).
foreach (var k in _cache.Keys)
if (k != "direct" && k != key && _cache.TryRemove(k, out var stale))
if (k != "direct" && k != key && !k.StartsWith("ai:") && _cache.TryRemove(k, out var stale))
stale.Dispose();
return _cache.GetOrAdd(key, Build);
}
/// <summary>HttpClient for AI calls — routed through the proxy when AiUseProxy is on (e.g. to
/// reach api.openai.com from Iran). Longer timeout; cached per proxy URL.</summary>
public HttpClient ForAi(AppSetting s)
{
var useProxy = s.AiUseProxy && !string.IsNullOrWhiteSpace(s.IngestProxyUrl);
var url = useProxy ? s.IngestProxyUrl!.Trim() : null;
var key = "ai:" + (url ?? "direct");
return _cache.GetOrAdd(key, _ =>
{
var handler = new HttpClientHandler { AutomaticDecompression = DecompressionMethods.All };
if (url is not null) { handler.Proxy = new WebProxy(url); handler.UseProxy = true; }
return new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(100) }; // LLMs can be slow
});
}
private static HttpClient Build(string key)
{
var handler = new HttpClientHandler { AutomaticDecompression = DecompressionMethods.All };