fix(admin): use AdminGrpcClient instead of direct fetch, add model capability table
- Replace direct REST fetch with AdminGrpcClient for AI model/provider/pricing routes - Add model_capability table to sync route - AdminGrpcClient handles all admin RPC calls with workspace_id routing
This commit is contained in:
parent
aef5280ae8
commit
850a5392ce
18
admin/package-lock.json
generated
18
admin/package-lock.json
generated
@ -8,6 +8,8 @@
|
|||||||
"name": "admin",
|
"name": "admin",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@bufbuild/connect": "^0.13.0",
|
||||||
|
"@bufbuild/protobuf": "^2.11.0",
|
||||||
"@types/node-cron": "^3.0.11",
|
"@types/node-cron": "^3.0.11",
|
||||||
"argon2": "^0.44.0",
|
"argon2": "^0.44.0",
|
||||||
"bcrypt": "^5.1.1",
|
"bcrypt": "^5.1.1",
|
||||||
@ -272,6 +274,22 @@
|
|||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@bufbuild/connect": {
|
||||||
|
"version": "0.13.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@bufbuild/connect/-/connect-0.13.0.tgz",
|
||||||
|
"integrity": "sha512-eZSMbVLyUFtXiZNORgCEvv580xKZeYQdMOWj2i/nxOcpXQcrEzTMTA7SZzWv4k4gveWCOSRoWmYDeOhfWXJv0g==",
|
||||||
|
"deprecated": "Connect has moved to its own org @connectrpc and has a stable v1. Run `npx @connectrpc/connect-migrate@latest` to update. See https://github.com/connectrpc/connect-es/releases/tag/v0.13.1 for details.",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"peerDependencies": {
|
||||||
|
"@bufbuild/protobuf": "^1.2.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@bufbuild/protobuf": {
|
||||||
|
"version": "2.11.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@bufbuild/protobuf/-/protobuf-2.11.0.tgz",
|
||||||
|
"integrity": "sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ==",
|
||||||
|
"license": "(Apache-2.0 AND BSD-3-Clause)"
|
||||||
|
},
|
||||||
"node_modules/@emnapi/core": {
|
"node_modules/@emnapi/core": {
|
||||||
"version": "1.10.0",
|
"version": "1.10.0",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
|||||||
@ -13,6 +13,8 @@
|
|||||||
"test:ui": "playwright test --ui"
|
"test:ui": "playwright test --ui"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@bufbuild/connect": "^0.13.0",
|
||||||
|
"@bufbuild/protobuf": "^2.11.0",
|
||||||
"@types/node-cron": "^3.0.11",
|
"@types/node-cron": "^3.0.11",
|
||||||
"argon2": "^0.44.0",
|
"argon2": "^0.44.0",
|
||||||
"bcrypt": "^5.1.1",
|
"bcrypt": "^5.1.1",
|
||||||
|
|||||||
@ -1,40 +1,48 @@
|
|||||||
import { NextRequest, NextResponse } from "next/server";
|
import { NextRequest, NextResponse } from "next/server";
|
||||||
import { RUST_BACKEND_URL, ADMIN_API_SHARED_KEY } from "@/lib/env";
|
import { createModel, updateModel, deleteModel } from "@/lib/adminrpc/client";
|
||||||
|
|
||||||
export const runtime = "nodejs";
|
export const runtime = "nodejs";
|
||||||
|
|
||||||
async function adminFetch(path: string, method: string, body?: unknown) {
|
|
||||||
if (!ADMIN_API_SHARED_KEY) {
|
|
||||||
return NextResponse.json({ error: "ADMIN_API_SHARED_KEY 未配置" }, { status: 500 });
|
|
||||||
}
|
|
||||||
const res = await fetch(`${RUST_BACKEND_URL}${path}`, {
|
|
||||||
method,
|
|
||||||
headers: { "Content-Type": "application/json", "x-admin-api-key": ADMIN_API_SHARED_KEY },
|
|
||||||
body: body ? JSON.stringify(body) : undefined,
|
|
||||||
signal: AbortSignal.timeout(30_000),
|
|
||||||
});
|
|
||||||
const data = await res.json();
|
|
||||||
if (!res.ok) return NextResponse.json(data, { status: res.status });
|
|
||||||
return NextResponse.json(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
// POST /api/admin/ai/models — create model
|
// POST /api/admin/ai/models — create model
|
||||||
export async function POST(req: NextRequest) {
|
export async function POST(req: NextRequest) {
|
||||||
return adminFetch("/api/admin/ai/models", "POST", await req.json());
|
try {
|
||||||
|
const body = await req.json();
|
||||||
|
const data = await createModel(body);
|
||||||
|
return NextResponse.json(data);
|
||||||
|
} catch (e) {
|
||||||
|
const msg = e instanceof Error ? e.message : String(e);
|
||||||
|
console.error("Create model error:", msg);
|
||||||
|
return NextResponse.json({ error: `创建失败: ${msg}` }, { status: 500 });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// PATCH /api/admin/ai/models?id={id} — update model
|
// PATCH /api/admin/ai/models?id={id} — update model
|
||||||
export async function PATCH(req: NextRequest) {
|
export async function PATCH(req: NextRequest) {
|
||||||
const { searchParams } = new URL(req.url);
|
try {
|
||||||
const id = searchParams.get("id");
|
const { searchParams } = new URL(req.url);
|
||||||
if (!id) return NextResponse.json({ error: "Missing id" }, { status: 400 });
|
const id = searchParams.get("id");
|
||||||
return adminFetch(`/api/admin/ai/models/${id}`, "PATCH", await req.json());
|
if (!id) return NextResponse.json({ error: "Missing id" }, { status: 400 });
|
||||||
|
const body = await req.json();
|
||||||
|
const data = await updateModel(id, body);
|
||||||
|
return NextResponse.json(data);
|
||||||
|
} catch (e) {
|
||||||
|
const msg = e instanceof Error ? e.message : String(e);
|
||||||
|
console.error("Update model error:", msg);
|
||||||
|
return NextResponse.json({ error: `更新失败: ${msg}` }, { status: 500 });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DELETE /api/admin/ai/models?id={id} — delete model
|
// DELETE /api/admin/ai/models?id={id} — delete model
|
||||||
export async function DELETE(req: NextRequest) {
|
export async function DELETE(req: NextRequest) {
|
||||||
const { searchParams } = new URL(req.url);
|
try {
|
||||||
const id = searchParams.get("id");
|
const { searchParams } = new URL(req.url);
|
||||||
if (!id) return NextResponse.json({ error: "Missing id" }, { status: 400 });
|
const id = searchParams.get("id");
|
||||||
return adminFetch(`/api/admin/ai/models/${id}`, "DELETE");
|
if (!id) return NextResponse.json({ error: "Missing id" }, { status: 400 });
|
||||||
|
const data = await deleteModel(id);
|
||||||
|
return NextResponse.json(data);
|
||||||
|
} catch (e) {
|
||||||
|
const msg = e instanceof Error ? e.message : String(e);
|
||||||
|
console.error("Delete model error:", msg);
|
||||||
|
return NextResponse.json({ error: `删除失败: ${msg}` }, { status: 500 });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { NextRequest, NextResponse } from "next/server";
|
import { NextRequest, NextResponse } from "next/server";
|
||||||
import { RUST_BACKEND_URL, ADMIN_API_SHARED_KEY } from "@/lib/env";
|
import { updatePricing } from "@/lib/adminrpc/client";
|
||||||
|
|
||||||
export const runtime = "nodejs";
|
export const runtime = "nodejs";
|
||||||
|
|
||||||
@ -8,18 +8,14 @@ export async function PATCH(
|
|||||||
req: NextRequest,
|
req: NextRequest,
|
||||||
{ params }: { params: Promise<{ id: string }> }
|
{ params }: { params: Promise<{ id: string }> }
|
||||||
) {
|
) {
|
||||||
const { id } = await params;
|
try {
|
||||||
if (!ADMIN_API_SHARED_KEY) {
|
const { id } = await params;
|
||||||
return NextResponse.json({ error: "ADMIN_API_SHARED_KEY 未配置" }, { status: 500 });
|
const body = await req.json();
|
||||||
|
const data = await updatePricing(id, body);
|
||||||
|
return NextResponse.json(data);
|
||||||
|
} catch (e) {
|
||||||
|
const msg = e instanceof Error ? e.message : String(e);
|
||||||
|
console.error("Update pricing error:", msg);
|
||||||
|
return NextResponse.json({ error: `更新失败: ${msg}` }, { status: 500 });
|
||||||
}
|
}
|
||||||
const body = await req.json();
|
|
||||||
const res = await fetch(`${RUST_BACKEND_URL}/api/admin/ai/pricing/${id}`, {
|
|
||||||
method: "PATCH",
|
|
||||||
headers: { "Content-Type": "application/json", "x-admin-api-key": ADMIN_API_SHARED_KEY },
|
|
||||||
body: JSON.stringify(body),
|
|
||||||
signal: AbortSignal.timeout(30_000),
|
|
||||||
});
|
|
||||||
const data = await res.json();
|
|
||||||
if (!res.ok) return NextResponse.json(data, { status: res.status });
|
|
||||||
return NextResponse.json(data);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,40 +1,48 @@
|
|||||||
import { NextRequest, NextResponse } from "next/server";
|
import { NextRequest, NextResponse } from "next/server";
|
||||||
import { RUST_BACKEND_URL, ADMIN_API_SHARED_KEY } from "@/lib/env";
|
import { createProvider, updateProvider, deleteProvider } from "@/lib/adminrpc/client";
|
||||||
|
|
||||||
export const runtime = "nodejs";
|
export const runtime = "nodejs";
|
||||||
|
|
||||||
async function adminFetch(path: string, method: string, body?: unknown) {
|
|
||||||
if (!ADMIN_API_SHARED_KEY) {
|
|
||||||
return NextResponse.json({ error: "ADMIN_API_SHARED_KEY 未配置" }, { status: 500 });
|
|
||||||
}
|
|
||||||
const res = await fetch(`${RUST_BACKEND_URL}${path}`, {
|
|
||||||
method,
|
|
||||||
headers: { "Content-Type": "application/json", "x-admin-api-key": ADMIN_API_SHARED_KEY },
|
|
||||||
body: body ? JSON.stringify(body) : undefined,
|
|
||||||
signal: AbortSignal.timeout(30_000),
|
|
||||||
});
|
|
||||||
const data = await res.json();
|
|
||||||
if (!res.ok) return NextResponse.json(data, { status: res.status });
|
|
||||||
return NextResponse.json(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
// POST /api/admin/ai/providers — create provider
|
// POST /api/admin/ai/providers — create provider
|
||||||
export async function POST(req: NextRequest) {
|
export async function POST(req: NextRequest) {
|
||||||
return adminFetch("/api/admin/ai/providers", "POST", await req.json());
|
try {
|
||||||
|
const body = await req.json();
|
||||||
|
const data = await createProvider(body);
|
||||||
|
return NextResponse.json(data);
|
||||||
|
} catch (e) {
|
||||||
|
const msg = e instanceof Error ? e.message : String(e);
|
||||||
|
console.error("Create provider error:", msg);
|
||||||
|
return NextResponse.json({ error: `创建失败: ${msg}` }, { status: 500 });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// PATCH /api/admin/ai/providers?id={id} — update provider
|
// PATCH /api/admin/ai/providers?id={id} — update provider
|
||||||
export async function PATCH(req: NextRequest) {
|
export async function PATCH(req: NextRequest) {
|
||||||
const { searchParams } = new URL(req.url);
|
try {
|
||||||
const id = searchParams.get("id");
|
const { searchParams } = new URL(req.url);
|
||||||
if (!id) return NextResponse.json({ error: "Missing id" }, { status: 400 });
|
const id = searchParams.get("id");
|
||||||
return adminFetch(`/api/admin/ai/providers/${id}`, "PATCH", await req.json());
|
if (!id) return NextResponse.json({ error: "Missing id" }, { status: 400 });
|
||||||
|
const body = await req.json();
|
||||||
|
const data = await updateProvider(id, body);
|
||||||
|
return NextResponse.json(data);
|
||||||
|
} catch (e) {
|
||||||
|
const msg = e instanceof Error ? e.message : String(e);
|
||||||
|
console.error("Update provider error:", msg);
|
||||||
|
return NextResponse.json({ error: `更新失败: ${msg}` }, { status: 500 });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DELETE /api/admin/ai/providers?id={id} — delete provider
|
// DELETE /api/admin/ai/providers?id={id} — delete provider
|
||||||
export async function DELETE(req: NextRequest) {
|
export async function DELETE(req: NextRequest) {
|
||||||
const { searchParams } = new URL(req.url);
|
try {
|
||||||
const id = searchParams.get("id");
|
const { searchParams } = new URL(req.url);
|
||||||
if (!id) return NextResponse.json({ error: "Missing id" }, { status: 400 });
|
const id = searchParams.get("id");
|
||||||
return adminFetch(`/api/admin/ai/providers/${id}`, "DELETE");
|
if (!id) return NextResponse.json({ error: "Missing id" }, { status: 400 });
|
||||||
|
const data = await deleteProvider(id);
|
||||||
|
return NextResponse.json(data);
|
||||||
|
} catch (e) {
|
||||||
|
const msg = e instanceof Error ? e.message : String(e);
|
||||||
|
console.error("Delete provider error:", msg);
|
||||||
|
return NextResponse.json({ error: `删除失败: ${msg}` }, { status: 500 });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,40 +1,48 @@
|
|||||||
import { NextRequest, NextResponse } from "next/server";
|
import { NextRequest, NextResponse } from "next/server";
|
||||||
import { RUST_BACKEND_URL, ADMIN_API_SHARED_KEY } from "@/lib/env";
|
import { createVersion, updateVersion, deleteVersion } from "@/lib/adminrpc/client";
|
||||||
|
|
||||||
export const runtime = "nodejs";
|
export const runtime = "nodejs";
|
||||||
|
|
||||||
async function adminFetch(path: string, method: string, body?: unknown) {
|
|
||||||
if (!ADMIN_API_SHARED_KEY) {
|
|
||||||
return NextResponse.json({ error: "ADMIN_API_SHARED_KEY 未配置" }, { status: 500 });
|
|
||||||
}
|
|
||||||
const res = await fetch(`${RUST_BACKEND_URL}${path}`, {
|
|
||||||
method,
|
|
||||||
headers: { "Content-Type": "application/json", "x-admin-api-key": ADMIN_API_SHARED_KEY },
|
|
||||||
body: body ? JSON.stringify(body) : undefined,
|
|
||||||
signal: AbortSignal.timeout(30_000),
|
|
||||||
});
|
|
||||||
const data = await res.json();
|
|
||||||
if (!res.ok) return NextResponse.json(data, { status: res.status });
|
|
||||||
return NextResponse.json(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
// POST /api/admin/ai/versions — create version
|
// POST /api/admin/ai/versions — create version
|
||||||
export async function POST(req: NextRequest) {
|
export async function POST(req: NextRequest) {
|
||||||
return adminFetch("/api/admin/ai/versions", "POST", await req.json());
|
try {
|
||||||
|
const body = await req.json();
|
||||||
|
const data = await createVersion(body);
|
||||||
|
return NextResponse.json(data);
|
||||||
|
} catch (e) {
|
||||||
|
const msg = e instanceof Error ? e.message : String(e);
|
||||||
|
console.error("Create version error:", msg);
|
||||||
|
return NextResponse.json({ error: `创建失败: ${msg}` }, { status: 500 });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// PATCH /api/admin/ai/versions?id={id} — update version
|
// PATCH /api/admin/ai/versions?id={id} — update version
|
||||||
export async function PATCH(req: NextRequest) {
|
export async function PATCH(req: NextRequest) {
|
||||||
const { searchParams } = new URL(req.url);
|
try {
|
||||||
const id = searchParams.get("id");
|
const { searchParams } = new URL(req.url);
|
||||||
if (!id) return NextResponse.json({ error: "Missing id" }, { status: 400 });
|
const id = searchParams.get("id");
|
||||||
return adminFetch(`/api/admin/ai/versions/${id}`, "PATCH", await req.json());
|
if (!id) return NextResponse.json({ error: "Missing id" }, { status: 400 });
|
||||||
|
const body = await req.json();
|
||||||
|
const data = await updateVersion(id, body);
|
||||||
|
return NextResponse.json(data);
|
||||||
|
} catch (e) {
|
||||||
|
const msg = e instanceof Error ? e.message : String(e);
|
||||||
|
console.error("Update version error:", msg);
|
||||||
|
return NextResponse.json({ error: `更新失败: ${msg}` }, { status: 500 });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DELETE /api/admin/ai/versions?id={id} — delete version
|
// DELETE /api/admin/ai/versions?id={id} — delete version
|
||||||
export async function DELETE(req: NextRequest) {
|
export async function DELETE(req: NextRequest) {
|
||||||
const { searchParams } = new URL(req.url);
|
try {
|
||||||
const id = searchParams.get("id");
|
const { searchParams } = new URL(req.url);
|
||||||
if (!id) return NextResponse.json({ error: "Missing id" }, { status: 400 });
|
const id = searchParams.get("id");
|
||||||
return adminFetch(`/api/admin/ai/versions/${id}`, "DELETE");
|
if (!id) return NextResponse.json({ error: "Missing id" }, { status: 400 });
|
||||||
|
const data = await deleteVersion(id);
|
||||||
|
return NextResponse.json(data);
|
||||||
|
} catch (e) {
|
||||||
|
const msg = e instanceof Error ? e.message : String(e);
|
||||||
|
console.error("Delete version error:", msg);
|
||||||
|
return NextResponse.json({ error: `删除失败: ${msg}` }, { status: 500 });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,48 +1,18 @@
|
|||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
import { RUST_BACKEND_URL, ADMIN_API_SHARED_KEY } from "@/lib/env";
|
import { syncModels } from "@/lib/adminrpc/client";
|
||||||
|
|
||||||
export const runtime = "nodejs";
|
export const runtime = "nodejs";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Trigger AI model sync via Rust backend.
|
* Trigger AI model sync via adminrpc gRPC.
|
||||||
* Calls POST /api/admin/ai/sync on the Rust app.
|
|
||||||
*/
|
*/
|
||||||
export async function POST() {
|
export async function POST() {
|
||||||
if (!ADMIN_API_SHARED_KEY) {
|
|
||||||
return NextResponse.json(
|
|
||||||
{ error: "ADMIN_API_SHARED_KEY 未配置" },
|
|
||||||
{ status: 500 }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const url = `${RUST_BACKEND_URL}/api/admin/ai/sync`;
|
const data = await syncModels();
|
||||||
const res = await fetch(url, {
|
|
||||||
method: "POST",
|
|
||||||
headers: {
|
|
||||||
"Content-Type": "application/json",
|
|
||||||
"x-admin-api-key": ADMIN_API_SHARED_KEY,
|
|
||||||
},
|
|
||||||
// Timeout: 2 minutes for sync
|
|
||||||
signal: AbortSignal.timeout(120_000),
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!res.ok) {
|
|
||||||
const body = await res.text();
|
|
||||||
return NextResponse.json(
|
|
||||||
{ error: `同步失败: ${res.status} ${body}` },
|
|
||||||
{ status: res.status }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const data = await res.json();
|
|
||||||
return NextResponse.json(data);
|
return NextResponse.json(data);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
const msg = e instanceof Error ? e.message : String(e);
|
const msg = e instanceof Error ? e.message : String(e);
|
||||||
console.error("AI sync error:", msg);
|
console.error("AI sync error:", msg);
|
||||||
return NextResponse.json(
|
return NextResponse.json({ error: `同步失败: ${msg}` }, { status: 500 });
|
||||||
{ error: `同步失败: ${msg}` },
|
|
||||||
{ status: 500 }
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,47 +1,18 @@
|
|||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
import { RUST_BACKEND_URL, ADMIN_API_SHARED_KEY } from "@/lib/env";
|
import { checkAlerts } from "@/lib/adminrpc/client";
|
||||||
|
|
||||||
export const runtime = "nodejs";
|
export const runtime = "nodejs";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Trigger workspace billing alert check via Rust backend.
|
* Trigger workspace billing alert check via adminrpc gRPC.
|
||||||
* Calls POST /api/admin/alerts/check on the Rust app.
|
|
||||||
*/
|
*/
|
||||||
export async function POST() {
|
export async function POST() {
|
||||||
if (!ADMIN_API_SHARED_KEY) {
|
|
||||||
return NextResponse.json(
|
|
||||||
{ error: "ADMIN_API_SHARED_KEY 未配置" },
|
|
||||||
{ status: 500 }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const url = `${RUST_BACKEND_URL}/api/admin/alerts/check`;
|
const data = await checkAlerts();
|
||||||
const res = await fetch(url, {
|
|
||||||
method: "POST",
|
|
||||||
headers: {
|
|
||||||
"Content-Type": "application/json",
|
|
||||||
"x-admin-api-key": ADMIN_API_SHARED_KEY,
|
|
||||||
},
|
|
||||||
signal: AbortSignal.timeout(60_000),
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!res.ok) {
|
|
||||||
const body = await res.text();
|
|
||||||
return NextResponse.json(
|
|
||||||
{ error: `检查失败: ${res.status} ${body}` },
|
|
||||||
{ status: res.status }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const data = await res.json();
|
|
||||||
return NextResponse.json(data);
|
return NextResponse.json(data);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
const msg = e instanceof Error ? e.message : String(e);
|
const msg = e instanceof Error ? e.message : String(e);
|
||||||
console.error("Alert check error:", msg);
|
console.error("Alert check error:", msg);
|
||||||
return NextResponse.json(
|
return NextResponse.json({ error: `检查失败: ${msg}` }, { status: 500 });
|
||||||
{ error: `检查失败: ${msg}` },
|
|
||||||
{ status: 500 }
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
270
admin/src/lib/adminrpc/client.ts
Normal file
270
admin/src/lib/adminrpc/client.ts
Normal file
@ -0,0 +1,270 @@
|
|||||||
|
/**
|
||||||
|
* AdminRPC gRPC client for Node.js environment.
|
||||||
|
*
|
||||||
|
* Uses raw HTTP/1.1 with the tonic gRPC server.
|
||||||
|
* All methods pass body_json as a JSON string (matching the proto design).
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { create, toBinary, fromBinary } from "@bufbuild/protobuf";
|
||||||
|
import type { IncomingMessage } from "node:http";
|
||||||
|
import { ADMIN_RPC_URL } from "@/lib/env";
|
||||||
|
|
||||||
|
// Import schemas from generated proto
|
||||||
|
import * as admin from "./generated/proto/admin_pb";
|
||||||
|
|
||||||
|
// ─── Low-level gRPC-Web over HTTP/1.1 ────────────────────────────────────────
|
||||||
|
|
||||||
|
function grpcRequest(
|
||||||
|
baseUrl: string,
|
||||||
|
servicePath: string,
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
schema: any,
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
responseSchema: any,
|
||||||
|
body: Uint8Array,
|
||||||
|
): Promise<Uint8Array> {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const url = new URL(baseUrl);
|
||||||
|
const isHttps = url.protocol === "https:";
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
||||||
|
const http = (isHttps ? require("node:https") : require("node:http")) as typeof import("node:http");
|
||||||
|
|
||||||
|
const req = http.request(
|
||||||
|
{
|
||||||
|
hostname: url.hostname,
|
||||||
|
port: url.port || (isHttps ? 443 : 80),
|
||||||
|
path: servicePath,
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/grpc-web+proto",
|
||||||
|
"X-Grpc-Web": "1",
|
||||||
|
"TE": "trailers",
|
||||||
|
"User-Agent": "admin-module/1.0",
|
||||||
|
"Content-Length": body.byteLength,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
(res: IncomingMessage) => {
|
||||||
|
const chunks: Buffer[] = [];
|
||||||
|
res.on("data", (chunk: Buffer) => chunks.push(chunk));
|
||||||
|
res.on("end", () => {
|
||||||
|
const data = Buffer.concat(chunks);
|
||||||
|
if (data.length === 0) {
|
||||||
|
const grpcStatus = res.headers["grpc-status"];
|
||||||
|
if (grpcStatus && grpcStatus !== "0") {
|
||||||
|
reject(new Error(`gRPC error ${grpcStatus}: ${res.headers["grpc-message"] || ""}`));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resolve(new Uint8Array(0));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// gRPC-web body format: [0x00, 4-byte big-endian length, payload...]
|
||||||
|
if (data[0] === 0x00 && data.length > 5) {
|
||||||
|
const bodyBytes = data.slice(5);
|
||||||
|
resolve(new Uint8Array(bodyBytes.buffer, bodyBytes.byteOffset, bodyBytes.byteLength));
|
||||||
|
} else {
|
||||||
|
resolve(new Uint8Array(data.buffer, data.byteOffset, data.byteLength));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
req.on("error", reject);
|
||||||
|
req.write(body);
|
||||||
|
req.end();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─── Message encoding / decoding ──────────────────────────────────────────────
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
function encode(schema: any, init: Record<string, unknown>): Uint8Array {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
const msg = create(schema as any, init as any);
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
return toBinary(schema as any, msg as any);
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
function decode(schema: any, bytes: Uint8Array): any {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
return fromBinary(schema as any, bytes) as any;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─── AI: Sync Models ──────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export async function syncModels(): Promise<unknown> {
|
||||||
|
const body = encode(admin.SyncModelsRequestSchema, {});
|
||||||
|
const bytes = await grpcRequest(
|
||||||
|
ADMIN_RPC_URL,
|
||||||
|
"/admin.SessionAdmin/SyncModels",
|
||||||
|
admin.SyncModelsRequestSchema,
|
||||||
|
admin.SyncModelsResponseSchema,
|
||||||
|
body,
|
||||||
|
);
|
||||||
|
if (bytes.length === 0) return {};
|
||||||
|
const resp = decode(admin.SyncModelsResponseSchema, bytes);
|
||||||
|
return JSON.parse(resp.bodyJson || "{}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─── AI: Check Alerts ─────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export async function checkAlerts(): Promise<unknown> {
|
||||||
|
const body = encode(admin.CheckAlertsRequestSchema, {});
|
||||||
|
const bytes = await grpcRequest(
|
||||||
|
ADMIN_RPC_URL,
|
||||||
|
"/admin.SessionAdmin/CheckAlerts",
|
||||||
|
admin.CheckAlertsRequestSchema,
|
||||||
|
admin.CheckAlertsResponseSchema,
|
||||||
|
body,
|
||||||
|
);
|
||||||
|
if (bytes.length === 0) return {};
|
||||||
|
const resp = decode(admin.CheckAlertsResponseSchema, bytes);
|
||||||
|
return JSON.parse(resp.bodyJson || "{}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─── AI: Provider CRUD ────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export async function createProvider(body: unknown): Promise<unknown> {
|
||||||
|
const msgBody = encode(admin.CreateProviderRequestSchema, { bodyJson: JSON.stringify(body) });
|
||||||
|
const bytes = await grpcRequest(
|
||||||
|
ADMIN_RPC_URL,
|
||||||
|
"/admin.SessionAdmin/CreateProvider",
|
||||||
|
admin.CreateProviderRequestSchema,
|
||||||
|
admin.ProviderResponseSchema,
|
||||||
|
msgBody,
|
||||||
|
);
|
||||||
|
if (bytes.length === 0) return {};
|
||||||
|
const resp = decode(admin.ProviderResponseSchema, bytes);
|
||||||
|
return JSON.parse(resp.bodyJson || "{}");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function updateProvider(id: string, body: unknown): Promise<unknown> {
|
||||||
|
const msgBody = encode(admin.UpdateProviderRequestSchema, { id, bodyJson: JSON.stringify(body) });
|
||||||
|
const bytes = await grpcRequest(
|
||||||
|
ADMIN_RPC_URL,
|
||||||
|
"/admin.SessionAdmin/UpdateProvider",
|
||||||
|
admin.UpdateProviderRequestSchema,
|
||||||
|
admin.ProviderResponseSchema,
|
||||||
|
msgBody,
|
||||||
|
);
|
||||||
|
if (bytes.length === 0) return {};
|
||||||
|
const resp = decode(admin.ProviderResponseSchema, bytes);
|
||||||
|
return JSON.parse(resp.bodyJson || "{}");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function deleteProvider(id: string): Promise<{ deleted: boolean }> {
|
||||||
|
const msgBody = encode(admin.DeleteProviderRequestSchema, { id });
|
||||||
|
const bytes = await grpcRequest(
|
||||||
|
ADMIN_RPC_URL,
|
||||||
|
"/admin.SessionAdmin/DeleteProvider",
|
||||||
|
admin.DeleteProviderRequestSchema,
|
||||||
|
admin.DeleteResponseSchema,
|
||||||
|
msgBody,
|
||||||
|
);
|
||||||
|
if (bytes.length === 0) return { deleted: false };
|
||||||
|
const resp = decode(admin.DeleteResponseSchema, bytes);
|
||||||
|
return { deleted: resp.deleted };
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─── AI: Model CRUD ───────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export async function createModel(body: unknown): Promise<unknown> {
|
||||||
|
const msgBody = encode(admin.CreateModelRequestSchema, { bodyJson: JSON.stringify(body) });
|
||||||
|
const bytes = await grpcRequest(
|
||||||
|
ADMIN_RPC_URL,
|
||||||
|
"/admin.SessionAdmin/CreateModel",
|
||||||
|
admin.CreateModelRequestSchema,
|
||||||
|
admin.ModelResponseSchema,
|
||||||
|
msgBody,
|
||||||
|
);
|
||||||
|
if (bytes.length === 0) return {};
|
||||||
|
const resp = decode(admin.ModelResponseSchema, bytes);
|
||||||
|
return JSON.parse(resp.bodyJson || "{}");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function updateModel(id: string, body: unknown): Promise<unknown> {
|
||||||
|
const msgBody = encode(admin.UpdateModelRequestSchema, { id, bodyJson: JSON.stringify(body) });
|
||||||
|
const bytes = await grpcRequest(
|
||||||
|
ADMIN_RPC_URL,
|
||||||
|
"/admin.SessionAdmin/UpdateModel",
|
||||||
|
admin.UpdateModelRequestSchema,
|
||||||
|
admin.ModelResponseSchema,
|
||||||
|
msgBody,
|
||||||
|
);
|
||||||
|
if (bytes.length === 0) return {};
|
||||||
|
const resp = decode(admin.ModelResponseSchema, bytes);
|
||||||
|
return JSON.parse(resp.bodyJson || "{}");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function deleteModel(id: string): Promise<{ deleted: boolean }> {
|
||||||
|
const msgBody = encode(admin.DeleteModelRequestSchema, { id });
|
||||||
|
const bytes = await grpcRequest(
|
||||||
|
ADMIN_RPC_URL,
|
||||||
|
"/admin.SessionAdmin/DeleteModel",
|
||||||
|
admin.DeleteModelRequestSchema,
|
||||||
|
admin.DeleteResponseSchema,
|
||||||
|
msgBody,
|
||||||
|
);
|
||||||
|
if (bytes.length === 0) return { deleted: false };
|
||||||
|
const resp = decode(admin.DeleteResponseSchema, bytes);
|
||||||
|
return { deleted: resp.deleted };
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─── AI: Version CRUD ─────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export async function createVersion(body: unknown): Promise<unknown> {
|
||||||
|
const msgBody = encode(admin.CreateVersionRequestSchema, { bodyJson: JSON.stringify(body) });
|
||||||
|
const bytes = await grpcRequest(
|
||||||
|
ADMIN_RPC_URL,
|
||||||
|
"/admin.SessionAdmin/CreateVersion",
|
||||||
|
admin.CreateVersionRequestSchema,
|
||||||
|
admin.VersionResponseSchema,
|
||||||
|
msgBody,
|
||||||
|
);
|
||||||
|
if (bytes.length === 0) return {};
|
||||||
|
const resp = decode(admin.VersionResponseSchema, bytes);
|
||||||
|
return JSON.parse(resp.bodyJson || "{}");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function updateVersion(id: string, body: unknown): Promise<unknown> {
|
||||||
|
const msgBody = encode(admin.UpdateVersionRequestSchema, { id, bodyJson: JSON.stringify(body) });
|
||||||
|
const bytes = await grpcRequest(
|
||||||
|
ADMIN_RPC_URL,
|
||||||
|
"/admin.SessionAdmin/UpdateVersion",
|
||||||
|
admin.UpdateVersionRequestSchema,
|
||||||
|
admin.VersionResponseSchema,
|
||||||
|
msgBody,
|
||||||
|
);
|
||||||
|
if (bytes.length === 0) return {};
|
||||||
|
const resp = decode(admin.VersionResponseSchema, bytes);
|
||||||
|
return JSON.parse(resp.bodyJson || "{}");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function deleteVersion(id: string): Promise<{ deleted: boolean }> {
|
||||||
|
const msgBody = encode(admin.DeleteVersionRequestSchema, { id });
|
||||||
|
const bytes = await grpcRequest(
|
||||||
|
ADMIN_RPC_URL,
|
||||||
|
"/admin.SessionAdmin/DeleteVersion",
|
||||||
|
admin.DeleteVersionRequestSchema,
|
||||||
|
admin.DeleteResponseSchema,
|
||||||
|
msgBody,
|
||||||
|
);
|
||||||
|
if (bytes.length === 0) return { deleted: false };
|
||||||
|
const resp = decode(admin.DeleteResponseSchema, bytes);
|
||||||
|
return { deleted: resp.deleted };
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─── AI: Pricing Update ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export async function updatePricing(id: string, body: unknown): Promise<unknown> {
|
||||||
|
const msgBody = encode(admin.UpdatePricingRequestSchema, { id, bodyJson: JSON.stringify(body) });
|
||||||
|
const bytes = await grpcRequest(
|
||||||
|
ADMIN_RPC_URL,
|
||||||
|
"/admin.SessionAdmin/UpdatePricing",
|
||||||
|
admin.UpdatePricingRequestSchema,
|
||||||
|
admin.PricingResponseSchema,
|
||||||
|
msgBody,
|
||||||
|
);
|
||||||
|
if (bytes.length === 0) return {};
|
||||||
|
const resp = decode(admin.PricingResponseSchema, bytes);
|
||||||
|
return JSON.parse(resp.bodyJson || "{}");
|
||||||
|
}
|
||||||
225
admin/src/lib/adminrpc/generated/proto/admin_connect.d.ts
vendored
Normal file
225
admin/src/lib/adminrpc/generated/proto/admin_connect.d.ts
vendored
Normal file
@ -0,0 +1,225 @@
|
|||||||
|
// @generated by protoc-gen-connect-es v0.13.0
|
||||||
|
// @generated from file proto/admin.proto (package admin, syntax proto3)
|
||||||
|
/* eslint-disable */
|
||||||
|
// @ts-nocheck
|
||||||
|
|
||||||
|
import { CheckAlertsRequest, CheckAlertsResponse, CreateModelRequest, CreateProviderRequest, CreateVersionRequest, DeleteModelRequest, DeleteProviderRequest, DeleteResponse, DeleteVersionRequest, ExportMetricsCsvRequest, ExportMetricsCsvResponse, GetMetricsRequest, GetMetricsResponse, GetUserInfoRequest, GetUserInfoResponse, GetUserStatusRequest, GetUserStatusResponse, GetWorkspaceOnlineUsersRequest, GetWorkspaceOnlineUsersResponse, IsUserOnlineRequest, IsUserOnlineResponse, KickUserFromWorkspaceRequest, KickUserFromWorkspaceResponse, KickUserRequest, KickUserResponse, ListUserSessionsRequest, ListUserSessionsResponse, ListWorkspaceSessionsRequest, ListWorkspaceSessionsResponse, ModelResponse, PricingResponse, ProviderResponse, SyncModelsRequest, SyncModelsResponse, UpdateModelRequest, UpdatePricingRequest, UpdateProviderRequest, UpdateVersionRequest, VersionResponse } from "./admin_pb.js";
|
||||||
|
import { MethodKind } from "@bufbuild/protobuf";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @generated from service admin.SessionAdmin
|
||||||
|
*/
|
||||||
|
export declare const SessionAdmin: {
|
||||||
|
readonly typeName: "admin.SessionAdmin",
|
||||||
|
readonly methods: {
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.ListWorkspaceSessions
|
||||||
|
*/
|
||||||
|
readonly listWorkspaceSessions: {
|
||||||
|
readonly name: "ListWorkspaceSessions",
|
||||||
|
readonly I: typeof ListWorkspaceSessionsRequest,
|
||||||
|
readonly O: typeof ListWorkspaceSessionsResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.ListUserSessions
|
||||||
|
*/
|
||||||
|
readonly listUserSessions: {
|
||||||
|
readonly name: "ListUserSessions",
|
||||||
|
readonly I: typeof ListUserSessionsRequest,
|
||||||
|
readonly O: typeof ListUserSessionsResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.KickUserFromWorkspace
|
||||||
|
*/
|
||||||
|
readonly kickUserFromWorkspace: {
|
||||||
|
readonly name: "KickUserFromWorkspace",
|
||||||
|
readonly I: typeof KickUserFromWorkspaceRequest,
|
||||||
|
readonly O: typeof KickUserFromWorkspaceResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.KickUser
|
||||||
|
*/
|
||||||
|
readonly kickUser: {
|
||||||
|
readonly name: "KickUser",
|
||||||
|
readonly I: typeof KickUserRequest,
|
||||||
|
readonly O: typeof KickUserResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.GetUserStatus
|
||||||
|
*/
|
||||||
|
readonly getUserStatus: {
|
||||||
|
readonly name: "GetUserStatus",
|
||||||
|
readonly I: typeof GetUserStatusRequest,
|
||||||
|
readonly O: typeof GetUserStatusResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.GetUserInfo
|
||||||
|
*/
|
||||||
|
readonly getUserInfo: {
|
||||||
|
readonly name: "GetUserInfo",
|
||||||
|
readonly I: typeof GetUserInfoRequest,
|
||||||
|
readonly O: typeof GetUserInfoResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.GetWorkspaceOnlineUsers
|
||||||
|
*/
|
||||||
|
readonly getWorkspaceOnlineUsers: {
|
||||||
|
readonly name: "GetWorkspaceOnlineUsers",
|
||||||
|
readonly I: typeof GetWorkspaceOnlineUsersRequest,
|
||||||
|
readonly O: typeof GetWorkspaceOnlineUsersResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.IsUserOnline
|
||||||
|
*/
|
||||||
|
readonly isUserOnline: {
|
||||||
|
readonly name: "IsUserOnline",
|
||||||
|
readonly I: typeof IsUserOnlineRequest,
|
||||||
|
readonly O: typeof IsUserOnlineResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.GetMetrics
|
||||||
|
*/
|
||||||
|
readonly getMetrics: {
|
||||||
|
readonly name: "GetMetrics",
|
||||||
|
readonly I: typeof GetMetricsRequest,
|
||||||
|
readonly O: typeof GetMetricsResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.ExportMetricsCsv
|
||||||
|
*/
|
||||||
|
readonly exportMetricsCsv: {
|
||||||
|
readonly name: "ExportMetricsCsv",
|
||||||
|
readonly I: typeof ExportMetricsCsvRequest,
|
||||||
|
readonly O: typeof ExportMetricsCsvResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* AI
|
||||||
|
*
|
||||||
|
* @generated from rpc admin.SessionAdmin.SyncModels
|
||||||
|
*/
|
||||||
|
readonly syncModels: {
|
||||||
|
readonly name: "SyncModels",
|
||||||
|
readonly I: typeof SyncModelsRequest,
|
||||||
|
readonly O: typeof SyncModelsResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.CheckAlerts
|
||||||
|
*/
|
||||||
|
readonly checkAlerts: {
|
||||||
|
readonly name: "CheckAlerts",
|
||||||
|
readonly I: typeof CheckAlertsRequest,
|
||||||
|
readonly O: typeof CheckAlertsResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* AI Provider
|
||||||
|
*
|
||||||
|
* @generated from rpc admin.SessionAdmin.CreateProvider
|
||||||
|
*/
|
||||||
|
readonly createProvider: {
|
||||||
|
readonly name: "CreateProvider",
|
||||||
|
readonly I: typeof CreateProviderRequest,
|
||||||
|
readonly O: typeof ProviderResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.UpdateProvider
|
||||||
|
*/
|
||||||
|
readonly updateProvider: {
|
||||||
|
readonly name: "UpdateProvider",
|
||||||
|
readonly I: typeof UpdateProviderRequest,
|
||||||
|
readonly O: typeof ProviderResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.DeleteProvider
|
||||||
|
*/
|
||||||
|
readonly deleteProvider: {
|
||||||
|
readonly name: "DeleteProvider",
|
||||||
|
readonly I: typeof DeleteProviderRequest,
|
||||||
|
readonly O: typeof DeleteResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* AI Model
|
||||||
|
*
|
||||||
|
* @generated from rpc admin.SessionAdmin.CreateModel
|
||||||
|
*/
|
||||||
|
readonly createModel: {
|
||||||
|
readonly name: "CreateModel",
|
||||||
|
readonly I: typeof CreateModelRequest,
|
||||||
|
readonly O: typeof ModelResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.UpdateModel
|
||||||
|
*/
|
||||||
|
readonly updateModel: {
|
||||||
|
readonly name: "UpdateModel",
|
||||||
|
readonly I: typeof UpdateModelRequest,
|
||||||
|
readonly O: typeof ModelResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.DeleteModel
|
||||||
|
*/
|
||||||
|
readonly deleteModel: {
|
||||||
|
readonly name: "DeleteModel",
|
||||||
|
readonly I: typeof DeleteModelRequest,
|
||||||
|
readonly O: typeof DeleteResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* AI Version
|
||||||
|
*
|
||||||
|
* @generated from rpc admin.SessionAdmin.CreateVersion
|
||||||
|
*/
|
||||||
|
readonly createVersion: {
|
||||||
|
readonly name: "CreateVersion",
|
||||||
|
readonly I: typeof CreateVersionRequest,
|
||||||
|
readonly O: typeof VersionResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.UpdateVersion
|
||||||
|
*/
|
||||||
|
readonly updateVersion: {
|
||||||
|
readonly name: "UpdateVersion",
|
||||||
|
readonly I: typeof UpdateVersionRequest,
|
||||||
|
readonly O: typeof VersionResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.DeleteVersion
|
||||||
|
*/
|
||||||
|
readonly deleteVersion: {
|
||||||
|
readonly name: "DeleteVersion",
|
||||||
|
readonly I: typeof DeleteVersionRequest,
|
||||||
|
readonly O: typeof DeleteResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* AI Pricing
|
||||||
|
*
|
||||||
|
* @generated from rpc admin.SessionAdmin.UpdatePricing
|
||||||
|
*/
|
||||||
|
readonly updatePricing: {
|
||||||
|
readonly name: "UpdatePricing",
|
||||||
|
readonly I: typeof UpdatePricingRequest,
|
||||||
|
readonly O: typeof PricingResponse,
|
||||||
|
readonly kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
225
admin/src/lib/adminrpc/generated/proto/admin_connect.js
Normal file
225
admin/src/lib/adminrpc/generated/proto/admin_connect.js
Normal file
@ -0,0 +1,225 @@
|
|||||||
|
// @generated by protoc-gen-connect-es v0.13.0
|
||||||
|
// @generated from file proto/admin.proto (package admin, syntax proto3)
|
||||||
|
/* eslint-disable */
|
||||||
|
// @ts-nocheck
|
||||||
|
|
||||||
|
import { CheckAlertsRequest, CheckAlertsResponse, CreateModelRequest, CreateProviderRequest, CreateVersionRequest, DeleteModelRequest, DeleteProviderRequest, DeleteResponse, DeleteVersionRequest, ExportMetricsCsvRequest, ExportMetricsCsvResponse, GetMetricsRequest, GetMetricsResponse, GetUserInfoRequest, GetUserInfoResponse, GetUserStatusRequest, GetUserStatusResponse, GetWorkspaceOnlineUsersRequest, GetWorkspaceOnlineUsersResponse, IsUserOnlineRequest, IsUserOnlineResponse, KickUserFromWorkspaceRequest, KickUserFromWorkspaceResponse, KickUserRequest, KickUserResponse, ListUserSessionsRequest, ListUserSessionsResponse, ListWorkspaceSessionsRequest, ListWorkspaceSessionsResponse, ModelResponse, PricingResponse, ProviderResponse, SyncModelsRequest, SyncModelsResponse, UpdateModelRequest, UpdatePricingRequest, UpdateProviderRequest, UpdateVersionRequest, VersionResponse } from "./admin_pb.js";
|
||||||
|
import { MethodKind } from "@bufbuild/protobuf";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @generated from service admin.SessionAdmin
|
||||||
|
*/
|
||||||
|
export const SessionAdmin = {
|
||||||
|
typeName: "admin.SessionAdmin",
|
||||||
|
methods: {
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.ListWorkspaceSessions
|
||||||
|
*/
|
||||||
|
listWorkspaceSessions: {
|
||||||
|
name: "ListWorkspaceSessions",
|
||||||
|
I: ListWorkspaceSessionsRequest,
|
||||||
|
O: ListWorkspaceSessionsResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.ListUserSessions
|
||||||
|
*/
|
||||||
|
listUserSessions: {
|
||||||
|
name: "ListUserSessions",
|
||||||
|
I: ListUserSessionsRequest,
|
||||||
|
O: ListUserSessionsResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.KickUserFromWorkspace
|
||||||
|
*/
|
||||||
|
kickUserFromWorkspace: {
|
||||||
|
name: "KickUserFromWorkspace",
|
||||||
|
I: KickUserFromWorkspaceRequest,
|
||||||
|
O: KickUserFromWorkspaceResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.KickUser
|
||||||
|
*/
|
||||||
|
kickUser: {
|
||||||
|
name: "KickUser",
|
||||||
|
I: KickUserRequest,
|
||||||
|
O: KickUserResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.GetUserStatus
|
||||||
|
*/
|
||||||
|
getUserStatus: {
|
||||||
|
name: "GetUserStatus",
|
||||||
|
I: GetUserStatusRequest,
|
||||||
|
O: GetUserStatusResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.GetUserInfo
|
||||||
|
*/
|
||||||
|
getUserInfo: {
|
||||||
|
name: "GetUserInfo",
|
||||||
|
I: GetUserInfoRequest,
|
||||||
|
O: GetUserInfoResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.GetWorkspaceOnlineUsers
|
||||||
|
*/
|
||||||
|
getWorkspaceOnlineUsers: {
|
||||||
|
name: "GetWorkspaceOnlineUsers",
|
||||||
|
I: GetWorkspaceOnlineUsersRequest,
|
||||||
|
O: GetWorkspaceOnlineUsersResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.IsUserOnline
|
||||||
|
*/
|
||||||
|
isUserOnline: {
|
||||||
|
name: "IsUserOnline",
|
||||||
|
I: IsUserOnlineRequest,
|
||||||
|
O: IsUserOnlineResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.GetMetrics
|
||||||
|
*/
|
||||||
|
getMetrics: {
|
||||||
|
name: "GetMetrics",
|
||||||
|
I: GetMetricsRequest,
|
||||||
|
O: GetMetricsResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.ExportMetricsCsv
|
||||||
|
*/
|
||||||
|
exportMetricsCsv: {
|
||||||
|
name: "ExportMetricsCsv",
|
||||||
|
I: ExportMetricsCsvRequest,
|
||||||
|
O: ExportMetricsCsvResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* AI
|
||||||
|
*
|
||||||
|
* @generated from rpc admin.SessionAdmin.SyncModels
|
||||||
|
*/
|
||||||
|
syncModels: {
|
||||||
|
name: "SyncModels",
|
||||||
|
I: SyncModelsRequest,
|
||||||
|
O: SyncModelsResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.CheckAlerts
|
||||||
|
*/
|
||||||
|
checkAlerts: {
|
||||||
|
name: "CheckAlerts",
|
||||||
|
I: CheckAlertsRequest,
|
||||||
|
O: CheckAlertsResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* AI Provider
|
||||||
|
*
|
||||||
|
* @generated from rpc admin.SessionAdmin.CreateProvider
|
||||||
|
*/
|
||||||
|
createProvider: {
|
||||||
|
name: "CreateProvider",
|
||||||
|
I: CreateProviderRequest,
|
||||||
|
O: ProviderResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.UpdateProvider
|
||||||
|
*/
|
||||||
|
updateProvider: {
|
||||||
|
name: "UpdateProvider",
|
||||||
|
I: UpdateProviderRequest,
|
||||||
|
O: ProviderResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.DeleteProvider
|
||||||
|
*/
|
||||||
|
deleteProvider: {
|
||||||
|
name: "DeleteProvider",
|
||||||
|
I: DeleteProviderRequest,
|
||||||
|
O: DeleteResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* AI Model
|
||||||
|
*
|
||||||
|
* @generated from rpc admin.SessionAdmin.CreateModel
|
||||||
|
*/
|
||||||
|
createModel: {
|
||||||
|
name: "CreateModel",
|
||||||
|
I: CreateModelRequest,
|
||||||
|
O: ModelResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.UpdateModel
|
||||||
|
*/
|
||||||
|
updateModel: {
|
||||||
|
name: "UpdateModel",
|
||||||
|
I: UpdateModelRequest,
|
||||||
|
O: ModelResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.DeleteModel
|
||||||
|
*/
|
||||||
|
deleteModel: {
|
||||||
|
name: "DeleteModel",
|
||||||
|
I: DeleteModelRequest,
|
||||||
|
O: DeleteResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* AI Version
|
||||||
|
*
|
||||||
|
* @generated from rpc admin.SessionAdmin.CreateVersion
|
||||||
|
*/
|
||||||
|
createVersion: {
|
||||||
|
name: "CreateVersion",
|
||||||
|
I: CreateVersionRequest,
|
||||||
|
O: VersionResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.UpdateVersion
|
||||||
|
*/
|
||||||
|
updateVersion: {
|
||||||
|
name: "UpdateVersion",
|
||||||
|
I: UpdateVersionRequest,
|
||||||
|
O: VersionResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* @generated from rpc admin.SessionAdmin.DeleteVersion
|
||||||
|
*/
|
||||||
|
deleteVersion: {
|
||||||
|
name: "DeleteVersion",
|
||||||
|
I: DeleteVersionRequest,
|
||||||
|
O: DeleteResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* AI Pricing
|
||||||
|
*
|
||||||
|
* @generated from rpc admin.SessionAdmin.UpdatePricing
|
||||||
|
*/
|
||||||
|
updatePricing: {
|
||||||
|
name: "UpdatePricing",
|
||||||
|
I: UpdatePricingRequest,
|
||||||
|
O: PricingResponse,
|
||||||
|
kind: MethodKind.Unary,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
1017
admin/src/lib/adminrpc/generated/proto/admin_pb.d.ts
vendored
Normal file
1017
admin/src/lib/adminrpc/generated/proto/admin_pb.d.ts
vendored
Normal file
File diff suppressed because it is too large
Load Diff
325
admin/src/lib/adminrpc/generated/proto/admin_pb.js
Normal file
325
admin/src/lib/adminrpc/generated/proto/admin_pb.js
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user