kyush-llm-router/shared/types.ts

409 lines
8.5 KiB
TypeScript

export interface User {
id: number;
api_key: string;
name: string;
email?: string;
is_active: boolean;
detail_logging: boolean;
copy_reasoning_to_reasoning_content: boolean;
created_at: string;
updated_at: string;
}
export interface Backend {
id: number;
name: string;
base_url: string;
api_key?: string;
is_active: boolean;
detail_logging: boolean;
created_at: string;
updated_at: string;
cached_model_count?: number;
last_model_sync_at?: string;
model_cache_initialized?: boolean;
model_cache_state?: ModelCacheState;
}
export interface BackendModelSnapshot {
id: number;
backend_id: number;
model_id: string;
raw_json?: string;
fetched_at: string;
created_at: string;
updated_at: string;
}
export type ModelCacheState = 'ready' | 'uninitialized' | 'error' | 'inactive';
export interface BackendModelCacheStatus {
backend_id: number;
initialized: boolean;
state: ModelCacheState;
model_count: number;
last_synced_at?: string;
last_attempted_at?: string;
last_error?: string;
}
export interface BackendModelCatalogEntry {
model_id: string;
backend_ids: number[];
}
export interface BackendModelsResponse {
backend: Backend;
cache: BackendModelCacheStatus;
snapshots: BackendModelSnapshot[];
models: string[];
}
export interface ModelCacheOverview {
backends: BackendModelCacheStatus[];
models: BackendModelCatalogEntry[];
}
export interface ModelRewriteRule {
id: number;
source_model: string;
target_model: string;
is_active: boolean;
force: boolean;
note?: string;
created_at: string;
updated_at: string;
}
export interface CreateModelRewriteData {
source_model: string;
target_model: string;
is_active?: boolean;
force?: boolean;
note?: string;
}
export interface UpdateModelRewriteData {
source_model?: string;
target_model?: string;
is_active?: boolean;
force?: boolean;
note?: string;
}
export interface Permission {
id: number;
user_id: number;
backend_id: number;
created_at: string;
}
export interface CreateUserData {
name: string;
email?: string;
api_key?: string;
detail_logging?: boolean;
copy_reasoning_to_reasoning_content?: boolean;
}
export interface CreateBackendData {
name: string;
base_url: string;
api_key?: string;
detail_logging?: boolean;
}
export interface CreatePermissionData {
user_id: number;
backend_id: number;
}
export interface UpdateUserData {
name?: string;
email?: string;
api_key?: string;
is_active?: boolean;
detail_logging?: boolean;
copy_reasoning_to_reasoning_content?: boolean;
}
export interface UpdateBackendData {
name?: string;
base_url?: string;
api_key?: string;
is_active?: boolean;
detail_logging?: boolean;
}
export interface RequestLog {
id: number;
user_id: number;
backend_id: number;
endpoint: string;
request_model?: string;
routed_model?: string;
response_model?: string;
prompt_tokens?: number;
completion_tokens?: number;
total_tokens?: number;
status_code: number;
response_time_ms?: number;
error_message?: string;
detail_logged: boolean;
local_date: string;
request_headers?: string;
request_body?: string;
response_headers?: string;
response_body?: string;
created_at: string;
}
export interface RequestLogPage {
rows: RequestLog[];
total: number;
limit: number;
offset: number;
}
export interface UsageStats {
id: number;
user_id: number;
backend_id: number;
date: string;
total_requests: number;
total_tokens: number;
}
export interface BackendMetrics {
id: number;
backend_id: number;
date: string;
total_requests: number;
total_tokens: number;
avg_response_time_ms: number;
error_count: number;
success_rate: number;
}
export interface AnalyticsDailyTotalsPoint {
date: string;
total_requests: number;
total_tokens: number;
}
export interface AnalyticsBackendQualityPoint {
date: string;
backend_id: number;
total_requests: number;
total_tokens: number;
avg_response_time_ms: number;
error_count: number;
success_rate: number;
}
export interface AnalyticsModelTrendPoint {
date: string;
model: string;
request_count: number;
}
export interface AnalyticsHistogramBin {
bin_start: number;
bin_end: number;
count: number;
}
export interface AnalyticsBoxPlotPoint {
date: string;
min: number;
q1: number;
median: number;
q3: number;
max: number;
count: number;
}
export interface DashboardHealthStatus {
status: 'ok';
timestamp: string;
}
export interface DashboardOverviewSummary {
total_users: number;
active_users: number;
total_backends: number;
active_backends: number;
total_permissions: number;
total_scripts: number;
active_scripts: number;
}
export interface DashboardHealthSummary {
cache_state_counts: Record<ModelCacheState, number>;
stale_backends: Array<{
id: number;
name: string;
state: ModelCacheState;
last_synced_at?: string;
}>;
public_health: DashboardHealthStatus;
admin_health: DashboardHealthStatus;
}
export interface DashboardLoggingSummary {
users_with_detail_logging: number;
backends_with_detail_logging: number;
}
export interface DashboardScriptSummary {
active_by_type: Record<ScriptType, number>;
total_by_type: Record<ScriptType, number>;
}
export interface DashboardAccessSummary {
permission_assignments: number;
users_without_permissions: number;
}
export interface DashboardSummaryResponse {
window_days: number;
generated_at: string;
overview: DashboardOverviewSummary;
health: DashboardHealthSummary;
logging: DashboardLoggingSummary;
scripts: DashboardScriptSummary;
access: DashboardAccessSummary;
series: {
daily_totals: AnalyticsDailyTotalsPoint[];
backend_quality: AnalyticsBackendQualityPoint[];
model_trends: AnalyticsModelTrendPoint[];
};
}
export interface OpenAIChatMessage {
role: 'system' | 'user' | 'assistant';
content: string;
}
export interface OpenAIChatCompletionRequest {
model: string;
messages: OpenAIChatMessage[];
temperature?: number;
max_tokens?: number;
top_p?: number;
frequency_penalty?: number;
presence_penalty?: number;
stream?: boolean;
}
export interface OpenAIChatCompletionResponse {
id: string;
object: string;
created: number;
model: string;
choices: {
index: number;
message: OpenAIChatMessage;
finish_reason: string;
}[];
usage: {
prompt_tokens: number;
completion_tokens: number;
total_tokens: number;
};
}
export interface OpenAIModel {
id: string;
object: string;
created: number;
owned_by: string;
}
export type ScriptType = 'per-user-backend' | 'per-backend' | 'per-user';
export interface UserScript {
id: number;
name: string;
script_type: ScriptType;
target_user_id: number | null;
target_backend_id: number | null;
script_code: string;
is_active: boolean;
created_at: string;
updated_at: string;
}
export interface CreateScriptData {
name: string;
script_type: ScriptType;
target_user_id?: number | null;
target_backend_id?: number | null;
script_code: string;
is_active?: boolean;
}
export interface UpdateScriptData {
name?: string;
script_type?: ScriptType;
target_user_id?: number | null;
target_backend_id?: number | null;
script_code?: string;
is_active?: boolean;
}
export type AdminAuthMode = 'env' | 'oidc' | 'both';
export interface AdminPrincipal {
provider: 'env' | 'oidc';
subject: string;
username?: string;
email?: string;
displayName: string;
}
export interface AdminSessionResponse {
authenticated: boolean;
authMode: AdminAuthMode;
csrfToken: string | null;
principal: AdminPrincipal | null;
}
export interface AdminApiTokenSummary {
id: number;
name: string;
provider: 'env' | 'oidc';
subject: string;
username?: string;
email?: string;
display_name: string;
token_prefix: string;
expires_at: string;
last_used_at?: string;
revoked_at?: string;
created_at: string;
updated_at: string;
}
/**
* Serializable script context data that can be transferred across isolate boundaries
* via structured clone ({ copy: true }).
* Non-serializable values (ReadableStream, callbacks) are NOT included here.
*/
export interface ScriptContextData {
user: { id: number; name: string; email?: string } | null;
backend: { id: number; name: string; base_url: string } | null;
request: {
method: string;
path: string;
headers: Record<string, string>;
body: unknown;
isStream: boolean;
};
response?: {
status: number;
headers: Record<string, string>;
body: unknown;
isStream: boolean;
};
}