feat: статья из Discover, локализация, подсказки

- Статья: заголовок + ссылка (truncate), title в URL, articleTitle в Message
- Локализация Sources, Research Progress, Answer, шагов, formingAnswer
- Подсказки: промпт без жёсткого примера, разнообразие, label 'Что ещё спросить'
- embeddedTranslations, countryToLocale, locale инструкция для LLM

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
home
2026-02-21 00:37:06 +03:00
parent f4d945a2b5
commit 3fa83bc605
68 changed files with 2301 additions and 345 deletions

View File

@@ -1,19 +1,40 @@
import {
getConfiguredModelProviders,
isEnvOnlyMode,
} from '@/lib/config/serverRegistry';
import ModelRegistry from '@/lib/models/registry';
import { NextRequest } from 'next/server';
export const GET = async (req: Request) => {
export const GET = async () => {
try {
const registry = new ModelRegistry();
const envOnlyMode = isEnvOnlyMode();
const configuredProviders = getConfiguredModelProviders();
const registry = new ModelRegistry();
const activeProviders = await registry.getActiveProviders();
const filteredProviders = activeProviders.filter((p) => {
return !p.chatModels.some((m) => m.key === 'error');
});
// env-only: если у провайдера пустой chatModels, подставляем модель из конфига
const providers =
envOnlyMode && configuredProviders.length > 0
? filteredProviders.map((p) => {
if (p.chatModels.length > 0) return p;
const configProvider = configuredProviders.find((c) => c.id === p.id);
const fallbackChat =
(configProvider?.chatModels?.length ?? 0) > 0
? configProvider!.chatModels
: [{ key: 'gpt-4', name: 'gpt-4' }];
return { ...p, chatModels: fallbackChat };
})
: filteredProviders;
return Response.json(
{
providers: filteredProviders,
providers,
envOnlyMode: envOnlyMode,
},
{
status: 200,
@@ -33,6 +54,10 @@ export const GET = async (req: Request) => {
};
export const POST = async (req: NextRequest) => {
if (isEnvOnlyMode()) {
return Response.json({ message: 'Not available.' }, { status: 405 });
}
try {
const body = await req.json();
const { type, name, config } = body;
@@ -49,7 +74,6 @@ export const POST = async (req: NextRequest) => {
}
const registry = new ModelRegistry();
const newProvider = await registry.addProvider(type, name, config);
return Response.json(