内部/配置管理.ps1

# 配置管理:DPAPI 加密存储凭据
# API 字段名(密钥/基础地址/模型)保持英文

function Import-记住的配置 {
    param([string]$配置路径)
    if (-not (Test-Path $配置路径)) { return $null }
    try { return Import-Clixml -Path $配置路径 }
    catch {
        Write-Warning "无法读取已记住的配置($配置路径):$($_.Exception.Message)"
        return $null
    }
}

function Save-配置 {
    param(
        [Parameter(Mandatory = $true)][System.Security.SecureString]$安全密钥,
        [Parameter(Mandatory = $true)][string]$保存基础地址,
        [Parameter(Mandatory = $true)][string]$保存模型,
        [Parameter(Mandatory = $true)][string]$配置路径
    )
    $配置目录 = Split-Path -Parent $配置路径
    if (-not (Test-Path $配置目录)) {
        New-Item -ItemType Directory -Path $配置目录 -Force | Out-Null
    }
    [pscustomobject]@{ 密钥 = $安全密钥; 基础地址 = $保存基础地址; 模型 = $保存模型 } |
        Export-Clixml -Path $配置路径 -Force
}

function Resolve-配置凭据 {
    <#
    .SYNOPSIS
        解析密钥/基础地址/模型:参数 > 已记住 > 交互/报错
    #>

    param(
        [string]$参数密钥,
        [string]$参数基础地址,
        [string]$参数模型,
        [object]$记住的配置,
        [string]$配置路径
    )

    # 密钥
    $密钥来源 = $null
    $安全密钥对象 = $null
    if (-not [string]::IsNullOrWhiteSpace($参数密钥)) {
        $安全密钥对象 = ConvertTo-SecureString -String $参数密钥 -AsPlainText -Force
        $密钥来源 = '参数'
    }
    elseif ($记住的配置 -and $记住的配置.密钥) {
        $安全密钥对象 = $记住的配置.密钥
        $密钥来源 = '已记住'
    }
    else {
        $输入密钥 = Read-Host -Prompt '请输入 API 密钥(sk-...)' -AsSecureString
        if ($输入密钥.Length -eq 0) { throw '未提供 API 密钥。' }
        $安全密钥对象 = $输入密钥
        $密钥来源 = '交互输入'
    }
    $密钥明文 = [System.Net.NetworkCredential]::new([string]::Empty, $安全密钥对象).Password

    # 基础地址
    $基础地址来源 = $null
    if (-not [string]::IsNullOrWhiteSpace($参数基础地址)) {
        $基础地址来源 = '参数'
    }
    elseif ($记住的配置 -and -not [string]::IsNullOrWhiteSpace($记住的配置.基础地址)) {
        $参数基础地址 = $记住的配置.基础地址
        $基础地址来源 = '已记住'
    }
    else {
        throw "未指定基础地址,且没有已记住的基础地址。请通过 -基础地址 参数指定,调用成功后将被记住。"
    }

    # 模型
    $模型来源 = $null
    if (-not [string]::IsNullOrWhiteSpace($参数模型)) {
        $模型来源 = '参数'
    }
    elseif ($记住的配置 -and $记住的配置.PSObject.Properties['模型'] -and -not [string]::IsNullOrWhiteSpace($记住的配置.模型)) {
        $参数模型 = $记住的配置.模型
        $模型来源 = '已记住'
    }
    else {
        throw "未指定模型,且没有已记住的模型。请通过 -模型 参数指定,调用成功后将被记住。"
    }

    [pscustomobject]@{
        安全密钥对象 = $安全密钥对象
        密钥明文     = $密钥明文
        基础地址     = $参数基础地址
        模型         = $参数模型
        密钥来源     = $密钥来源
        基础地址来源 = $基础地址来源
        模型来源     = $模型来源
    }
}