feat(admin): add News Engine console and image-make config API

Expose memind-news-engine health, collect, rank, and scheduler controls in md.tkmind.cn admin, proxied via MEMIND_NEWS_ENGINE_URL.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
john
2026-09-22 14:36:38 +08:00
parent eba37640e4
commit 9ec4dda6af
11 changed files with 1097 additions and 0 deletions
+87
View File
@@ -1,5 +1,7 @@
import type {
AssetGatewayConfig,
ImageMakeAdminConfig,
ImageMakeAdminConfigResponse,
AdminDashboardSummary,
AdminServiceRestartAction,
AdminServiceRestartResult,
@@ -70,6 +72,13 @@ import type {
WechatWebNotification,
MindSearchConfig,
MindSearchServiceTestResult,
NewsEngineCollectionDetail,
NewsEngineCollectionSummary,
NewsEngineConfig,
NewsEngineHealth,
NewsEngineRankResult,
NewsEngineRunSummary,
NewsEngineSchedulerStatus,
AdminTemplateCatalogItem,
AdminTemplateCatalogPatch,
} from '../types';
@@ -555,6 +564,35 @@ export async function getAssetGatewayConfig(): Promise<AssetGatewayConfig> {
return portalFetch('/admin-api/asset-gateway/config');
}
export async function getImageMakeAdminConfig(): Promise<ImageMakeAdminConfigResponse> {
return portalFetch('/admin-api/image-make/config');
}
export async function updateImageMakeAdminConfig(
payload: Partial<ImageMakeAdminConfig> & {
providers?: Partial<ImageMakeAdminConfig['providers']> & {
fal_ai?: Partial<ImageMakeAdminConfig['providers']['fal_ai']> & { apiKey?: string };
aliyun_bailian?: Partial<ImageMakeAdminConfig['providers']['aliyun_bailian']> & { apiKey?: string };
};
},
): Promise<ImageMakeAdminConfigResponse> {
return portalFetch('/admin-api/image-make/config', {
method: 'PUT',
body: JSON.stringify(payload),
});
}
export async function getImageMakeRuntimeStatus(): Promise<{
ok: boolean;
defaultProvider: string;
fingerprint?: string;
source?: string;
updatedAt?: number | null;
providers: ImageMakeAdminConfig['providers'];
}> {
return portalFetch('/admin-api/image-make/runtime');
}
export async function updateAssetGatewayConfig(
payload: Pick<AssetGatewayConfig, 'enabled'>,
): Promise<AssetGatewayConfig> {
@@ -1054,6 +1092,55 @@ export async function testMindSearchService(serviceId: string): Promise<MindSear
return portalFetch(`/admin-api/mindsearch/services/${encodeURIComponent(serviceId)}/test`, { method: 'POST' });
}
export async function getNewsEngineHealth(): Promise<NewsEngineHealth> {
return portalFetch('/admin-api/news-engine/health');
}
export async function getNewsEngineConfig(): Promise<NewsEngineConfig> {
return portalFetch('/admin-api/news-engine/config');
}
export async function getNewsEngineCollections(limit = 20): Promise<NewsEngineCollectionSummary[]> {
return portalFetch(`/admin-api/news-engine/collections?limit=${limit}`);
}
export async function getNewsEngineCollection(id: string): Promise<NewsEngineCollectionDetail> {
return portalFetch(`/admin-api/news-engine/collections/${encodeURIComponent(id)}`);
}
export async function collectNewsEngine(body: { useLlm?: boolean; groupIds?: string[] } = {}): Promise<NewsEngineCollectionDetail> {
return portalFetch('/admin-api/news-engine/collect', { method: 'POST', body: JSON.stringify(body) });
}
export async function scoreNewsEngineCollection(id: string, body: Record<string, unknown> = {}): Promise<NewsEngineCollectionDetail> {
return portalFetch(`/admin-api/news-engine/collections/${encodeURIComponent(id)}/score`, {
method: 'POST',
body: JSON.stringify(body),
});
}
export async function rankNewsEngine(body: {
groups: unknown[];
options?: { limit?: number; minimumScore?: number };
}): Promise<NewsEngineRankResult> {
return portalFetch('/admin-api/news-engine/rank', { method: 'POST', body: JSON.stringify(body) });
}
export async function getNewsEngineRuns(limit = 30): Promise<NewsEngineRunSummary[]> {
return portalFetch(`/admin-api/news-engine/runs?limit=${limit}`);
}
export async function getNewsEngineSchedulerStatus(): Promise<NewsEngineSchedulerStatus> {
return portalFetch('/admin-api/news-engine/scheduler/status');
}
export async function triggerNewsEngineScheduler(body: { useLlm?: boolean } = {}): Promise<NewsEngineCollectionDetail> {
return portalFetch('/admin-api/news-engine/scheduler/trigger', {
method: 'POST',
body: JSON.stringify(body),
});
}
// ── Workflow Orchestrator ─────────────────────────────
export async function getOrchestratorConfig() {