Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 17 additions & 5 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,20 @@ ENABLE_SMART_PROBING=false
PROBE_INTERVAL_MS=30000
PROBE_TIMEOUT_MS=5000

# 多提供商类型支持(实验性功能)
# - false (默认):仅支持 Claude、Codex类型供应商
# - true:支持 Gemini CLI、OpenAI Compatible 等其他类型
# 警告:其他类型功能仍在开发中,暂不建议启用
ENABLE_MULTI_PROVIDER_TYPES=false
# Provider Endpoint Probing (always enabled)
# 功能说明:每 10 秒探测所有启用端点的速度与连通性,并刷新端点选择排序。
# 注意:没有 ENABLE 开关,默认启用;可通过下列参数调优。
ENDPOINT_PROBE_INTERVAL_MS=10000
ENDPOINT_PROBE_TIMEOUT_MS=5000
ENDPOINT_PROBE_CONCURRENCY=10
ENDPOINT_PROBE_CYCLE_JITTER_MS=1000
ENDPOINT_PROBE_LOCK_TTL_MS=30000

# 探测日志策略
# - scheduled 成功日志按最小间隔采样(默认每端点最多 1 条/分钟)
# - 失败日志全量记录
ENDPOINT_PROBE_SUCCESS_LOG_MIN_INTERVAL_MS=60000

# 探测日志保留与清理
ENDPOINT_PROBE_LOG_RETENTION_DAYS=7
ENDPOINT_PROBE_LOG_CLEANUP_BATCH_SIZE=10000
67 changes: 67 additions & 0 deletions drizzle/0056_tidy_quasar.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
CREATE TABLE IF NOT EXISTS "provider_endpoint_probe_logs" (
"id" serial PRIMARY KEY NOT NULL,
"endpoint_id" integer NOT NULL,
"source" varchar(20) DEFAULT 'scheduled' NOT NULL,
"ok" boolean NOT NULL,
"status_code" integer,
"latency_ms" integer,
"error_type" varchar(64),
"error_message" text,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE IF NOT EXISTS "provider_endpoints" (
"id" serial PRIMARY KEY NOT NULL,
"vendor_id" integer NOT NULL,
"provider_type" varchar(20) DEFAULT 'claude' NOT NULL,
"url" text NOT NULL,
"label" varchar(200),
"sort_order" integer DEFAULT 0 NOT NULL,
"is_enabled" boolean DEFAULT true NOT NULL,
"last_probed_at" timestamp with time zone,
"last_probe_ok" boolean,
"last_probe_status_code" integer,
"last_probe_latency_ms" integer,
"last_probe_error_type" varchar(64),
"last_probe_error_message" text,
"created_at" timestamp with time zone DEFAULT now(),
"updated_at" timestamp with time zone DEFAULT now(),
"deleted_at" timestamp with time zone
);
--> statement-breakpoint
CREATE TABLE IF NOT EXISTS "provider_vendors" (
"id" serial PRIMARY KEY NOT NULL,
"website_domain" varchar(255) NOT NULL,
"display_name" varchar(200),
"website_url" text,
"favicon_url" text,
"created_at" timestamp with time zone DEFAULT now(),
"updated_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
ALTER TABLE "providers" ADD COLUMN IF NOT EXISTS "provider_vendor_id" integer;--> statement-breakpoint
DO $$ BEGIN
ALTER TABLE "provider_endpoint_probe_logs" ADD CONSTRAINT "provider_endpoint_probe_logs_endpoint_id_provider_endpoints_id_fk" FOREIGN KEY ("endpoint_id") REFERENCES "public"."provider_endpoints"("id") ON DELETE cascade ON UPDATE no action;
EXCEPTION
WHEN duplicate_object THEN NULL;
END $$;--> statement-breakpoint
DO $$ BEGIN
ALTER TABLE "provider_endpoints" ADD CONSTRAINT "provider_endpoints_vendor_id_provider_vendors_id_fk" FOREIGN KEY ("vendor_id") REFERENCES "public"."provider_vendors"("id") ON DELETE cascade ON UPDATE no action;
EXCEPTION
WHEN duplicate_object THEN NULL;
END $$;--> statement-breakpoint
CREATE INDEX IF NOT EXISTS "idx_provider_endpoint_probe_logs_endpoint_created_at" ON "provider_endpoint_probe_logs" USING btree ("endpoint_id","created_at" DESC NULLS LAST);--> statement-breakpoint
CREATE INDEX IF NOT EXISTS "idx_provider_endpoint_probe_logs_created_at" ON "provider_endpoint_probe_logs" USING btree ("created_at");--> statement-breakpoint
CREATE UNIQUE INDEX IF NOT EXISTS "uniq_provider_endpoints_vendor_type_url" ON "provider_endpoints" USING btree ("vendor_id","provider_type","url");--> statement-breakpoint
CREATE INDEX IF NOT EXISTS "idx_provider_endpoints_vendor_type" ON "provider_endpoints" USING btree ("vendor_id","provider_type") WHERE "provider_endpoints"."deleted_at" IS NULL;--> statement-breakpoint
CREATE INDEX IF NOT EXISTS "idx_provider_endpoints_enabled" ON "provider_endpoints" USING btree ("is_enabled","vendor_id","provider_type") WHERE "provider_endpoints"."deleted_at" IS NULL;--> statement-breakpoint
CREATE INDEX IF NOT EXISTS "idx_provider_endpoints_created_at" ON "provider_endpoints" USING btree ("created_at");--> statement-breakpoint
CREATE INDEX IF NOT EXISTS "idx_provider_endpoints_deleted_at" ON "provider_endpoints" USING btree ("deleted_at");--> statement-breakpoint
CREATE UNIQUE INDEX IF NOT EXISTS "uniq_provider_vendors_website_domain" ON "provider_vendors" USING btree ("website_domain");--> statement-breakpoint
CREATE INDEX IF NOT EXISTS "idx_provider_vendors_created_at" ON "provider_vendors" USING btree ("created_at");--> statement-breakpoint
DO $$ BEGIN
ALTER TABLE "providers" ADD CONSTRAINT "providers_provider_vendor_id_provider_vendors_id_fk" FOREIGN KEY ("provider_vendor_id") REFERENCES "public"."provider_vendors"("id") ON DELETE restrict ON UPDATE no action;
EXCEPTION
WHEN duplicate_object THEN NULL;
END $$;--> statement-breakpoint
CREATE INDEX IF NOT EXISTS "idx_providers_vendor_type" ON "providers" USING btree ("provider_vendor_id","provider_type") WHERE "providers"."deleted_at" IS NULL;
Loading
Loading