feat: expand companion platform, device controls, and memoir workflows
ci / verify (push) Canceled after 0s
ci / verify (push) Canceled after 0s
Add customer and operator login, BLE provisioning, device fleet controls, call memory, memoir generation, and refreshed family and maintenance portals. Include API contracts, migrations, firmware sources, tests, assets, and deployment documentation.
This commit is contained in:
@@ -23,6 +23,11 @@ const (
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
volcAccount map[string]string
|
||||
TOSRecordingAccountID string
|
||||
TOSRecordingBucket string
|
||||
TOSRecordingRegion string
|
||||
TOSRecordingPlaybackEndpoint string
|
||||
Onboarding OnboardingConfig
|
||||
VikingResourceID string
|
||||
VikingCollectionName string
|
||||
@@ -121,7 +126,15 @@ type Config struct {
|
||||
ArkBaseURL string
|
||||
ArkAPIKey string
|
||||
ArkContentModel string
|
||||
ArkMemoirModel string
|
||||
ArkMemoirImageModel string
|
||||
ArkRequestTimeout time.Duration
|
||||
DifyEnabled bool
|
||||
DifyBaseURL string
|
||||
DifyBridgeURL string
|
||||
DifyBridgeSecret string
|
||||
DifyExtractionAPIKey string
|
||||
DifyMemoirAPIKey string
|
||||
ContentSafetyProvider string
|
||||
ContentSafetyEndpoint string
|
||||
ContentSafetyAPIKey string
|
||||
@@ -145,6 +158,10 @@ func Load(serviceName string) (Config, error) {
|
||||
return Config{}, errors.New("service name is required")
|
||||
}
|
||||
|
||||
account, err := loadVolcAccount()
|
||||
if err != nil {
|
||||
return Config{}, err
|
||||
}
|
||||
redisDB, err := intEnv("REDIS_DB", 0)
|
||||
if err != nil {
|
||||
return Config{}, err
|
||||
@@ -225,6 +242,10 @@ func Load(serviceName string) (Config, error) {
|
||||
if err != nil {
|
||||
return Config{}, err
|
||||
}
|
||||
difyEnabled, err := boolEnv("DIFY_ENABLED", false)
|
||||
if err != nil {
|
||||
return Config{}, err
|
||||
}
|
||||
contentSafetyTimeout, err := durationEnv("CONTENT_SAFETY_TIMEOUT", 5*time.Second)
|
||||
if err != nil {
|
||||
return Config{}, err
|
||||
@@ -254,14 +275,15 @@ func Load(serviceName string) (Config, error) {
|
||||
return Config{}, err
|
||||
}
|
||||
environment := stringEnv("APP_ENV", EnvironmentLocal)
|
||||
secretValues, err := loadSecretValues(
|
||||
"ONBOARDING_MASTER_KEY", "ONBOARDING_SMS_GATEWAY_TOKEN",
|
||||
secretValues, err := loadSecretValuesWithAccount(account,
|
||||
"ONBOARDING_MASTER_KEY", "ONBOARDING_SMS_GATEWAY_TOKEN", "TENCENT_SMS_SECRET_ID", "TENCENT_SMS_SECRET_KEY", "WECHAT_MINI_APP_SECRET",
|
||||
"DATABASE_URL", "REDIS_PASSWORD", "DEVICE_LOCAL_SECRET", "DEVICE_CREDENTIAL_MASTER_KEY", "MODEL_CREDENTIAL_MASTER_KEY", "RTC_APP_KEY", "RTC_TOKEN_SIGNING_SECRET",
|
||||
"CURSOR_SIGNING_SECRET", "SHARE_TOKEN_SIGNING_SECRET", "PROVIDER_CALLBACK_SECRET", "PLATFORM_HEALTH_CALLBACK_SECRET",
|
||||
"VOLC_SUBTITLE_CALLBACK_SECRET", "VIKING_MEMORY_API_KEY",
|
||||
"MOCK_PROVIDER_API_KEY", "VOLC_ACCESS_KEY_ID", "VOLC_SECRET_ACCESS_KEY", "VOLC_SESSION_TOKEN",
|
||||
"VOLC_HARDWARE_PRODUCT_SECRET", "VOLC_HARDWARE_DEVICE_CREDENTIAL_MASTER_KEY",
|
||||
"OBJECT_STORE_ACCESS_KEY", "OBJECT_STORE_SECRET_KEY", "ALERT_WEBHOOK_SECRET", "ARK_API_KEY", "CONTENT_SAFETY_API_KEY", "MEMORY_TOOL_SIGNING_SECRET", "PROVIDER_MEMORY_API_KEY",
|
||||
"DIFY_BRIDGE_SECRET", "DIFY_EXTRACTION_API_KEY", "DIFY_MEMOIR_API_KEY",
|
||||
)
|
||||
if err != nil {
|
||||
return Config{}, err
|
||||
@@ -404,8 +426,16 @@ func Load(serviceName string) (Config, error) {
|
||||
ContentGenerator: stringEnv("CONTENT_GENERATOR", "local"),
|
||||
ArkBaseURL: stringEnv("ARK_BASE_URL", "https://ark.cn-beijing.volces.com/api/v3"),
|
||||
ArkAPIKey: secretValues["ARK_API_KEY"],
|
||||
ArkContentModel: strings.TrimSpace(os.Getenv("ARK_CONTENT_MODEL")),
|
||||
ArkContentModel: stringEnv("ARK_CONTENT_MODEL", "deepseek-v4-1-flash-260910"),
|
||||
ArkMemoirModel: stringEnv("ARK_MEMOIR_MODEL", "doubao-seed-evolving"),
|
||||
ArkMemoirImageModel: stringEnv("ARK_MEMOIR_IMAGE_MODEL", "doubao-seedream-5-0-pro-260628"),
|
||||
ArkRequestTimeout: arkRequestTimeout,
|
||||
DifyEnabled: difyEnabled,
|
||||
DifyBaseURL: stringEnv("DIFY_BASE_URL", "http://story-dify-nginx/v1"),
|
||||
DifyBridgeURL: stringEnv("DIFY_BRIDGE_URL", "http://model-bridge:8188"),
|
||||
DifyBridgeSecret: secretValues["DIFY_BRIDGE_SECRET"],
|
||||
DifyExtractionAPIKey: secretValues["DIFY_EXTRACTION_API_KEY"],
|
||||
DifyMemoirAPIKey: secretValues["DIFY_MEMOIR_API_KEY"],
|
||||
ContentSafetyProvider: stringEnv("CONTENT_SAFETY_PROVIDER", "local"),
|
||||
ContentSafetyEndpoint: strings.TrimSpace(os.Getenv("CONTENT_SAFETY_ENDPOINT")),
|
||||
ContentSafetyAPIKey: secretValues["CONTENT_SAFETY_API_KEY"],
|
||||
@@ -491,6 +521,15 @@ func Load(serviceName string) (Config, error) {
|
||||
if err != nil {
|
||||
return Config{}, err
|
||||
}
|
||||
if err = cfg.Onboarding.loadTencentSMSFile(serviceName); err != nil {
|
||||
return Config{}, err
|
||||
}
|
||||
if err = cfg.Onboarding.loadTencentCaptchaFile(serviceName); err != nil {
|
||||
return Config{}, err
|
||||
}
|
||||
if err := cfg.applyVolcAccount(account); err != nil {
|
||||
return Config{}, err
|
||||
}
|
||||
if err := cfg.Validate(); err != nil {
|
||||
return Config{}, err
|
||||
}
|
||||
@@ -668,6 +707,9 @@ func (c Config) Validate() error {
|
||||
}
|
||||
}
|
||||
if c.ServiceName == "api" || c.ServiceName == "worker" {
|
||||
if c.DifyEnabled && (!isAbsoluteHTTPURL(c.DifyBaseURL) || !isAbsoluteHTTPURL(c.DifyBridgeURL) || c.DifyBridgeSecret == "" || c.DifyExtractionAPIKey == "" || c.DifyMemoirAPIKey == "") {
|
||||
return errors.New("Dify workflows require internal URLs and extraction, memoir, bridge credentials")
|
||||
}
|
||||
if c.EmbeddingProvider != "local" && c.EmbeddingProvider != "ark" {
|
||||
return errors.New("EMBEDDING_PROVIDER must be local or ark")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user