@miller-tech/uap 1.26.6 → 1.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/bin/cli.js +20 -0
- package/dist/bin/cli.js.map +1 -1
- package/dist/cli/deliver.d.ts +21 -0
- package/dist/cli/deliver.d.ts.map +1 -0
- package/dist/cli/deliver.js +197 -0
- package/dist/cli/deliver.js.map +1 -0
- package/dist/delivery/applier.d.ts +50 -0
- package/dist/delivery/applier.d.ts.map +1 -0
- package/dist/delivery/applier.js +258 -0
- package/dist/delivery/applier.js.map +1 -0
- package/dist/delivery/convergence-loop.d.ts +143 -0
- package/dist/delivery/convergence-loop.d.ts.map +1 -0
- package/dist/delivery/convergence-loop.js +301 -0
- package/dist/delivery/convergence-loop.js.map +1 -0
- package/dist/delivery/critic.d.ts +35 -0
- package/dist/delivery/critic.d.ts.map +1 -0
- package/dist/delivery/critic.js +77 -0
- package/dist/delivery/critic.js.map +1 -0
- package/dist/delivery/explorer.d.ts +77 -0
- package/dist/delivery/explorer.d.ts.map +1 -0
- package/dist/delivery/explorer.js +166 -0
- package/dist/delivery/explorer.js.map +1 -0
- package/dist/delivery/index.d.ts +15 -0
- package/dist/delivery/index.d.ts.map +1 -0
- package/dist/delivery/index.js +15 -0
- package/dist/delivery/index.js.map +1 -0
- package/dist/delivery/judge.d.ts +33 -0
- package/dist/delivery/judge.d.ts.map +1 -0
- package/dist/delivery/judge.js +70 -0
- package/dist/delivery/judge.js.map +1 -0
- package/dist/delivery/verifier-ladder.d.ts +78 -0
- package/dist/delivery/verifier-ladder.d.ts.map +1 -0
- package/dist/delivery/verifier-ladder.js +213 -0
- package/dist/delivery/verifier-ladder.js.map +1 -0
- package/dist/models/openai-compat-client.d.ts +34 -0
- package/dist/models/openai-compat-client.d.ts.map +1 -0
- package/dist/models/openai-compat-client.js +82 -0
- package/dist/models/openai-compat-client.js.map +1 -0
- package/package.json +1 -1
- package/tools/agents/docker-compose.qdrant.yml +7 -1
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI-compatible ModelClient
|
|
3
|
+
*
|
|
4
|
+
* Production implementation of the ModelClient interface from executor.ts.
|
|
5
|
+
* Talks to any /v1/chat/completions server — the local inference gateway
|
|
6
|
+
* (:4000), llama.cpp (:8080), vLLM, Ollama, or hosted OpenAI-compatible
|
|
7
|
+
* endpoints.
|
|
8
|
+
*/
|
|
9
|
+
import type { ModelConfig } from './types.js';
|
|
10
|
+
import type { ModelClient } from './executor.js';
|
|
11
|
+
export interface OpenAICompatClientOptions {
|
|
12
|
+
/** Fallback endpoint when the ModelConfig has none (default: UAP_INFERENCE_ENDPOINT or http://localhost:4000/v1) */
|
|
13
|
+
defaultEndpoint?: string;
|
|
14
|
+
/** Request timeout in ms (default 300000) */
|
|
15
|
+
timeoutMs?: number;
|
|
16
|
+
}
|
|
17
|
+
export declare class OpenAICompatClient implements ModelClient {
|
|
18
|
+
private readonly defaultEndpoint;
|
|
19
|
+
private readonly timeoutMs;
|
|
20
|
+
constructor(options?: OpenAICompatClientOptions);
|
|
21
|
+
complete(model: ModelConfig, prompt: string, options?: {
|
|
22
|
+
maxTokens?: number;
|
|
23
|
+
timeout?: number;
|
|
24
|
+
temperature?: number;
|
|
25
|
+
}): Promise<{
|
|
26
|
+
content: string;
|
|
27
|
+
tokensUsed: {
|
|
28
|
+
input: number;
|
|
29
|
+
output: number;
|
|
30
|
+
};
|
|
31
|
+
latencyMs: number;
|
|
32
|
+
}>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=openai-compat-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-compat-client.d.ts","sourceRoot":"","sources":["../../src/models/openai-compat-client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,WAAW,yBAAyB;IACxC,oHAAoH;IACpH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAiBD,qBAAa,kBAAmB,YAAW,WAAW;IACpD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,GAAE,yBAA8B;IAQ7C,QAAQ,CACZ,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GACvE,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CA+DlG"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI-compatible ModelClient
|
|
3
|
+
*
|
|
4
|
+
* Production implementation of the ModelClient interface from executor.ts.
|
|
5
|
+
* Talks to any /v1/chat/completions server — the local inference gateway
|
|
6
|
+
* (:4000), llama.cpp (:8080), vLLM, Ollama, or hosted OpenAI-compatible
|
|
7
|
+
* endpoints.
|
|
8
|
+
*/
|
|
9
|
+
const DEFAULT_TIMEOUT_MS = 300_000;
|
|
10
|
+
const LOOPBACK_RE = /^(localhost|127\.\d+\.\d+\.\d+|\[?::1\]?)$/i;
|
|
11
|
+
const PRIVATE_HOST_RE = /^(10\.|192\.168\.|172\.(1[6-9]|2\d|3[01])\.)/;
|
|
12
|
+
function isLocalEndpoint(url) {
|
|
13
|
+
return LOOPBACK_RE.test(url.hostname) || PRIVATE_HOST_RE.test(url.hostname);
|
|
14
|
+
}
|
|
15
|
+
export class OpenAICompatClient {
|
|
16
|
+
defaultEndpoint;
|
|
17
|
+
timeoutMs;
|
|
18
|
+
constructor(options = {}) {
|
|
19
|
+
this.defaultEndpoint =
|
|
20
|
+
options.defaultEndpoint ??
|
|
21
|
+
process.env.UAP_INFERENCE_ENDPOINT ??
|
|
22
|
+
'http://localhost:4000/v1';
|
|
23
|
+
this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
24
|
+
}
|
|
25
|
+
async complete(model, prompt, options) {
|
|
26
|
+
const endpoint = (model.endpoint ?? this.defaultEndpoint).replace(/\/$/, '');
|
|
27
|
+
const apiKey = model.apiKeyEnvVar ? process.env[model.apiKeyEnvVar] : undefined;
|
|
28
|
+
const timeout = options?.timeout ?? this.timeoutMs;
|
|
29
|
+
const url = new URL(`${endpoint}/chat/completions`);
|
|
30
|
+
// Never send a credential in cleartext beyond the local network.
|
|
31
|
+
if (apiKey && url.protocol !== 'https:' && !isLocalEndpoint(url)) {
|
|
32
|
+
throw new Error(`Refusing to send ${model.apiKeyEnvVar} over ${url.protocol}// to non-local host ${url.hostname} — use https.`);
|
|
33
|
+
}
|
|
34
|
+
const start = Date.now();
|
|
35
|
+
const controller = new AbortController();
|
|
36
|
+
const timer = setTimeout(() => controller.abort(), timeout);
|
|
37
|
+
try {
|
|
38
|
+
const response = await fetch(url, {
|
|
39
|
+
method: 'POST',
|
|
40
|
+
headers: {
|
|
41
|
+
'Content-Type': 'application/json',
|
|
42
|
+
...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}),
|
|
43
|
+
},
|
|
44
|
+
body: JSON.stringify({
|
|
45
|
+
model: model.apiModel,
|
|
46
|
+
messages: [{ role: 'user', content: prompt }],
|
|
47
|
+
...(options?.maxTokens ? { max_tokens: options.maxTokens } : {}),
|
|
48
|
+
...(options?.temperature !== undefined ? { temperature: options.temperature } : {}),
|
|
49
|
+
}),
|
|
50
|
+
signal: controller.signal,
|
|
51
|
+
});
|
|
52
|
+
if (!response.ok) {
|
|
53
|
+
const body = await response.text().catch(() => '');
|
|
54
|
+
throw new Error(`Inference request failed (${response.status}): ${body.slice(0, 500)}`);
|
|
55
|
+
}
|
|
56
|
+
const data = (await response.json());
|
|
57
|
+
const content = data.choices?.[0]?.message?.content;
|
|
58
|
+
if (typeof content !== 'string') {
|
|
59
|
+
const errMsg = typeof data.error === 'string' ? data.error : data.error?.message ?? 'no choices in response';
|
|
60
|
+
throw new Error(`Inference response missing content: ${errMsg}`);
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
content,
|
|
64
|
+
tokensUsed: {
|
|
65
|
+
input: data.usage?.prompt_tokens ?? 0,
|
|
66
|
+
output: data.usage?.completion_tokens ?? 0,
|
|
67
|
+
},
|
|
68
|
+
latencyMs: Date.now() - start,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
if (err instanceof Error && err.name === 'AbortError') {
|
|
73
|
+
throw new Error(`Inference request timed out after ${timeout}ms (${url.hostname})`);
|
|
74
|
+
}
|
|
75
|
+
throw err;
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
clearTimeout(timer);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=openai-compat-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-compat-client.js","sourceRoot":"","sources":["../../src/models/openai-compat-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,13 +2,19 @@ version: '3.8'
|
|
|
2
2
|
|
|
3
3
|
services:
|
|
4
4
|
qdrant:
|
|
5
|
-
|
|
5
|
+
# Pinned (was :latest, which drifts: a stale cached 1.16.3 broke client
|
|
6
|
+
# compatibility against @qdrant/js-client-rest 1.18.0, whose minor must be
|
|
7
|
+
# within 1 of the server). v1.18.1 matches the client minor.
|
|
8
|
+
image: qdrant/qdrant:v1.18.1
|
|
6
9
|
container_name: uap-qdrant
|
|
7
10
|
ports:
|
|
8
11
|
- '6333:6333' # REST API
|
|
9
12
|
- '6334:6334' # gRPC
|
|
10
13
|
volumes:
|
|
11
14
|
- ./qdrant_storage:/qdrant/storage:z
|
|
15
|
+
# Persist snapshots on the host (default /qdrant/snapshots is ephemeral,
|
|
16
|
+
# so backups are lost on container recreate).
|
|
17
|
+
- ./qdrant_snapshots:/qdrant/snapshots:z
|
|
12
18
|
environment:
|
|
13
19
|
- QDRANT__SERVICE__GRPC_PORT=6334
|
|
14
20
|
- QDRANT__REST__PORT=6333
|