feat(ai): Z.ai GLM birincil sağlayıcı; OpenRouter yalnız yedek
OpenRouter anahtarı iptal olup bakiye eksiye düşünce şartname analizi, TED çevirisi ve site taraması durmuştu. Artık ZAI_API_KEY ile GLM 5.3 ve GLM 5.3 Flash doğrudan Z.ai Coding Plan üzerinden çağrılır; kalan modeller OpenRouter anahtarı varsa yedek olarak denenir. - server/zai.mjs: doğrudan istemci; glm-5.x için reasoning_effort:low, glm-4.x için thinking kapalı; süreç genelinde en fazla 2 eşzamanlı istek (kullanıcı istekleri arka plan çevirisinden öncelikli); geçici 429'da aynı modelle yeniden deneme, 1113 bakiye hatasında hemen sıradaki model. - ai.mjs: 'zai' (GLM 5.3) sağlayıcısı eklendi, Z.ai yolu yeni istemciyi kullanıyor; varsayılan sıra zai → glmflash → gemini → … - ted-ceviri.mjs: önce ZAI_TRANSLATE_MODELS (glm-5.3-flash, glm-5.3), sonra OpenRouter; 2'li eşzamanlı parça işleme. - Admin model kataloğuna GLM 5.3 eklendi, kayıtlı zincirler sürüm 4'e taşınır. - tests/zai.test.mjs: düşünme ayarı, 429/1113 davranışı, eşzamanlılık, analyzeSpec ve TED çevirisinin Z.ai'ye gittiği. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
+25
-9
@@ -1,16 +1,20 @@
|
||||
import { analyzeInParts } from './analysis-parts.mjs';
|
||||
import { qualifyAnalysis } from './analysis-quality.mjs';
|
||||
import { zaiChat } from './zai.mjs';
|
||||
/**
|
||||
* Gerçek AI şartname analizi — OpenRouter öncelikli, çoklu sağlayıcı fallback.
|
||||
* Gerçek AI şartname analizi — Z.ai (GLM) birincil, çoklu sağlayıcı fallback.
|
||||
* Bağımlılık yok (Node 18+ built-in fetch).
|
||||
*
|
||||
* EN KOLAY KURULUM — tek anahtar, tüm modeller:
|
||||
* OPENROUTER_API_KEY=sk-or-v1-...
|
||||
* Bu tanımlıysa zincirdeki tüm modeller OpenRouter üzerinden çağrılır.
|
||||
* BİRİNCİL KURULUM (2026-09'dan beri):
|
||||
* ZAI_API_KEY=... GLM 5.3 ve GLM 5.3 Flash doğrudan Z.ai'den
|
||||
* ZAI_BASE_URL=... Coding Plan ucu (bkz. zai.mjs)
|
||||
*
|
||||
* İsteğe bağlı doğrudan sağlayıcı anahtarları (OpenRouter'ı ezer):
|
||||
* ZAI_API_KEY, DEEPSEEK_API_KEY, GEMINI_API_KEY,
|
||||
* XAI_API_KEY, OPENAI_API_KEY, ANTHROPIC_API_KEY
|
||||
* YEDEK — tek anahtar, kalan tüm modeller:
|
||||
* OPENROUTER_API_KEY=sk-or-v1-...
|
||||
* Doğrudan anahtarı olmayan sağlayıcılar OpenRouter üzerinden çağrılır.
|
||||
*
|
||||
* İsteğe bağlı diğer doğrudan anahtarlar (OpenRouter'ı ezer):
|
||||
* DEEPSEEK_API_KEY, GEMINI_API_KEY, XAI_API_KEY, OPENAI_API_KEY, ANTHROPIC_API_KEY
|
||||
*
|
||||
* Model kimlikleri env ile değiştirilebilir (ör. GLM_MODEL, GLM_OR_MODEL).
|
||||
*/
|
||||
@@ -18,11 +22,17 @@ import { qualifyAnalysis } from './analysis-quality.mjs';
|
||||
const OPENROUTER_URL = 'https://openrouter.ai/api/v1/chat/completions';
|
||||
|
||||
export const PROVIDERS = {
|
||||
zai: {
|
||||
label: 'GLM 5.3', provider: 'Z.ai', envKey: 'ZAI_API_KEY',
|
||||
model: () => process.env.GLM_MODEL || 'glm-5.3',
|
||||
or: () => process.env.GLM_OR_MODEL || '~z-ai/glm-latest',
|
||||
style: 'zai',
|
||||
},
|
||||
glmflash: {
|
||||
label: 'GLM 5.3 Flash', provider: 'Z.ai', envKey: 'ZAI_API_KEY',
|
||||
model: () => process.env.GLM_FLASH_MODEL || 'glm-5.3-flash',
|
||||
or: () => process.env.GLM_FLASH_OR_MODEL || 'z-ai/glm-5.3-flash',
|
||||
url: 'https://api.z.ai/api/paas/v4/chat/completions', style: 'openai',
|
||||
style: 'zai',
|
||||
},
|
||||
gemini: {
|
||||
label: 'Gemini', provider: 'Google', envKey: 'GEMINI_API_KEY',
|
||||
@@ -331,7 +341,7 @@ export async function analyzeSpec({ text, fileName, tender, chain, systemOverrid
|
||||
// modeller (ör. ücretsiz/limitli olanlar) tıkanınca analiz boş kalmasın;
|
||||
// yalnız üsttekilerin hepsi başarısız olursa devreye girer.
|
||||
const YEDEK = 'gemini';
|
||||
const secim = (Array.isArray(chain) && chain.length ? chain : ['glmflash', 'gemini', 'deepseek', 'grok', 'gpt', 'claude'])
|
||||
const secim = (Array.isArray(chain) && chain.length ? chain : ['zai', 'glmflash', 'gemini', 'deepseek', 'grok', 'gpt', 'claude'])
|
||||
.filter((id) => PROVIDERS[id]);
|
||||
const order = secim.includes(YEDEK) ? secim : [...secim, YEDEK];
|
||||
// Derin analiz hem daha çok metin okur hem daha uzun JSON üretir; çıktı
|
||||
@@ -358,6 +368,12 @@ export async function analyzeSpec({ text, fileName, tender, chain, systemOverrid
|
||||
let raw;
|
||||
if (route.yol === 'openrouter') {
|
||||
raw = await callOpenRouter(route.model, route.key, userPrompt, ac.signal, sistem, maxTokens);
|
||||
} else if (p.style === 'zai') {
|
||||
// Kullanıcı bekliyor: eşzamanlılık sırasında arka plan çevirisinin önüne geçer.
|
||||
raw = await zaiChat(route.model, [
|
||||
{ role: 'system', content: sistem },
|
||||
{ role: 'user', content: userPrompt },
|
||||
], { signal: ac.signal, maxTokens, temperature: 0.2, json: true, oncelik: 'yuksek' });
|
||||
} else if (p.style === 'gemini') {
|
||||
raw = await callGemini(p, route.key, route.model, userPrompt, ac.signal, sistem, maxTokens);
|
||||
} else if (p.style === 'anthropic') {
|
||||
|
||||
Reference in New Issue
Block a user