// 神识(Shenshi)入口:魂镜模型网关(rewrite/1.0)。 // 数据面 POST /v1/chat/completions(IR 入站,SSE 出站);健康面 /healthz /readyz; // 计量面 /me/usage、对账抽样 /admin/usage/sample;BYOK 面 /me/byok-keys。 package main import ( "fmt" "log" "net/http" "os" "hunjing/shenshi/internal/byok" "hunjing/shenshi/internal/quota" "hunjing/shenshi/internal/route" "hunjing/shenshi/internal/server" "hunjing/shenshi/internal/store" ) func envOr(key, fallback string) string { if v := os.Getenv(key); v != "" { return v } return fallback } func main() { st, err := store.Open(os.Getenv("SHENSHI_DATABASE_URL")) if err != nil { log.Fatalf("神识存储初始化失败: %v", err) } cfg := server.Config{ ServiceToken: os.Getenv("SHENSHI_SERVICE_TOKEN"), Store: st, } // BYOK:主密钥未配置时整体禁用(fail-closed) if master := os.Getenv("SHENSHI_BYOK_MASTER_KEY"); master != "" { vault, err := byok.NewVault(master, st) if err != nil { log.Fatalf("BYOK 主密钥配置无效: %v", err) } cfg.Vault = vault log.Printf("BYOK 密钥库就绪") } // 配额:用户级软配额(token 口径;0 = 不限制) var budget int64 if raw := os.Getenv("SHENSHI_USER_BUDGET_TOKENS"); raw != "" { if _, err := fmt.Sscanf(raw, "%d", &budget); err != nil { log.Fatalf("SHENSHI_USER_BUDGET_TOKENS 须为整数: %v", err) } cfg.Quota = quota.New(st, budget) } srv := server.New(cfg, route.New()) addr := ":" + envOr("SHENSHI_PORT", "8080") log.Printf("神识就绪:http://0.0.0.0%s(端点目录 SHENSHI_ENDPOINTS,未配置时回声桩兜底)", addr) if err := http.ListenAndServe(addr, srv); err != nil { log.Fatal(err) } }