Initial project import
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
param(
|
||||
[string]$DockerHost = "ssh://docker-gpu.cin.su",
|
||||
[string]$ComposeFile = "core/deploy/docker-gpu/embeddings/compose.yaml",
|
||||
[string]$EnvFile = "core/deploy/docker-gpu/embeddings/.env.example",
|
||||
[string]$BaseUrl = "http://docker-gpu.cin.su:8082",
|
||||
[string]$ExpectedModel = "qwen3-embedding-0.6b",
|
||||
[int]$WaitSeconds = 900,
|
||||
[switch]$ConfigOnly,
|
||||
[switch]$Pull,
|
||||
[switch]$Down
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
if (-not (Test-Path -LiteralPath $ComposeFile)) {
|
||||
throw "Compose file not found: $ComposeFile"
|
||||
}
|
||||
|
||||
if (-not (Test-Path -LiteralPath $EnvFile)) {
|
||||
throw "Env file not found: $EnvFile"
|
||||
}
|
||||
|
||||
$composeArgs = @(
|
||||
"--host", $DockerHost,
|
||||
"compose",
|
||||
"--env-file", $EnvFile,
|
||||
"-f", $ComposeFile
|
||||
)
|
||||
|
||||
if ($ConfigOnly) {
|
||||
docker @composeArgs config
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
|
||||
if ($Down) {
|
||||
docker @composeArgs down
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
|
||||
if ($Pull) {
|
||||
docker @composeArgs pull
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
}
|
||||
|
||||
docker @composeArgs up -d
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
|
||||
$deadline = [DateTimeOffset]::UtcNow.AddSeconds($WaitSeconds)
|
||||
$lastError = ""
|
||||
do {
|
||||
try {
|
||||
$health = Invoke-RestMethod -Method Get -Uri "$($BaseUrl.TrimEnd('/'))/health" -TimeoutSec 10
|
||||
if ($health.status -eq "ok") {
|
||||
$models = Invoke-RestMethod -Method Get -Uri "$($BaseUrl.TrimEnd('/'))/v1/models" -TimeoutSec 10
|
||||
$modelIds = @($models.data | ForEach-Object { $_.id })
|
||||
if ($modelIds -notcontains $ExpectedModel) {
|
||||
throw "Expected model '$ExpectedModel' is absent. Loaded: $($modelIds -join ', ')"
|
||||
}
|
||||
|
||||
$body = @{
|
||||
model = $ExpectedModel
|
||||
input = @("поиск процедуры проведения документа 1С")
|
||||
} | ConvertTo-Json -Depth 4
|
||||
$embedding = Invoke-RestMethod `
|
||||
-Method Post `
|
||||
-Uri "$($BaseUrl.TrimEnd('/'))/v1/embeddings" `
|
||||
-ContentType "application/json; charset=utf-8" `
|
||||
-Body ([Text.Encoding]::UTF8.GetBytes($body)) `
|
||||
-TimeoutSec 120
|
||||
$dimensions = @($embedding.data[0].embedding).Count
|
||||
if ($dimensions -le 0) {
|
||||
throw "Embedding endpoint returned an empty vector."
|
||||
}
|
||||
Write-Host "Embedding endpoint is ready: model=$ExpectedModel dimensions=$dimensions url=$BaseUrl"
|
||||
exit 0
|
||||
}
|
||||
}
|
||||
catch {
|
||||
$lastError = $_.Exception.Message
|
||||
}
|
||||
Start-Sleep -Seconds 5
|
||||
} while ([DateTimeOffset]::UtcNow -lt $deadline)
|
||||
|
||||
docker @composeArgs logs --tail 100
|
||||
throw "Embedding endpoint did not become ready in $WaitSeconds seconds. Last error: $lastError"
|
||||
Reference in New Issue
Block a user