@dahura/super-agent-runtime 0.1.1
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/LICENSE +21 -0
- package/dist/ask.d.ts +75 -0
- package/dist/ask.d.ts.map +1 -0
- package/dist/ask.js +140 -0
- package/dist/ask.js.map +1 -0
- package/dist/builder.d.ts +73 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +477 -0
- package/dist/builder.js.map +1 -0
- package/dist/env.d.ts +36 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +63 -0
- package/dist/env.js.map +1 -0
- package/dist/errors.d.ts +40 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +43 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/loaders.d.ts +39 -0
- package/dist/loaders.d.ts.map +1 -0
- package/dist/loaders.js +113 -0
- package/dist/loaders.js.map +1 -0
- package/dist/model.d.ts +64 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +2 -0
- package/dist/model.js.map +1 -0
- package/dist/providers/anthropic.d.ts +14 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +19 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/anthropic.provider.d.ts +22 -0
- package/dist/providers/anthropic.provider.d.ts.map +1 -0
- package/dist/providers/anthropic.provider.js +62 -0
- package/dist/providers/anthropic.provider.js.map +1 -0
- package/dist/providers/audio-local.d.ts +21 -0
- package/dist/providers/audio-local.d.ts.map +1 -0
- package/dist/providers/audio-local.js +451 -0
- package/dist/providers/audio-local.js.map +1 -0
- package/dist/providers/audio-local.provider.d.ts +15 -0
- package/dist/providers/audio-local.provider.d.ts.map +1 -0
- package/dist/providers/audio-local.provider.js +137 -0
- package/dist/providers/audio-local.provider.js.map +1 -0
- package/dist/providers/index.d.ts +30 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +56 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/llama-server.d.ts +57 -0
- package/dist/providers/llama-server.d.ts.map +1 -0
- package/dist/providers/llama-server.js +231 -0
- package/dist/providers/llama-server.js.map +1 -0
- package/dist/providers/llama-server.provider.d.ts +34 -0
- package/dist/providers/llama-server.provider.d.ts.map +1 -0
- package/dist/providers/llama-server.provider.js +147 -0
- package/dist/providers/llama-server.provider.js.map +1 -0
- package/dist/providers/openai-compatible.d.ts +32 -0
- package/dist/providers/openai-compatible.d.ts.map +1 -0
- package/dist/providers/openai-compatible.js +53 -0
- package/dist/providers/openai-compatible.js.map +1 -0
- package/dist/providers/openai-compatible.provider.d.ts +24 -0
- package/dist/providers/openai-compatible.provider.d.ts.map +1 -0
- package/dist/providers/openai-compatible.provider.js +76 -0
- package/dist/providers/openai-compatible.provider.js.map +1 -0
- package/dist/providers/openai.d.ts +14 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +24 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/openai.provider.d.ts +23 -0
- package/dist/providers/openai.provider.d.ts.map +1 -0
- package/dist/providers/openai.provider.js +68 -0
- package/dist/providers/openai.provider.js.map +1 -0
- package/dist/providers/whisper-cpp.d.ts +23 -0
- package/dist/providers/whisper-cpp.d.ts.map +1 -0
- package/dist/providers/whisper-cpp.js +110 -0
- package/dist/providers/whisper-cpp.js.map +1 -0
- package/dist/providers/whisper-cpp.provider.d.ts +27 -0
- package/dist/providers/whisper-cpp.provider.d.ts.map +1 -0
- package/dist/providers/whisper-cpp.provider.js +139 -0
- package/dist/providers/whisper-cpp.provider.js.map +1 -0
- package/dist/proxy.d.ts +11 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +12 -0
- package/dist/proxy.js.map +1 -0
- package/dist/registry.d.ts +111 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +328 -0
- package/dist/registry.js.map +1 -0
- package/dist/resolver.d.ts +47 -0
- package/dist/resolver.d.ts.map +1 -0
- package/dist/resolver.js +365 -0
- package/dist/resolver.js.map +1 -0
- package/dist/workflow.d.ts +86 -0
- package/dist/workflow.d.ts.map +1 -0
- package/dist/workflow.js +343 -0
- package/dist/workflow.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider definitions index.
|
|
3
|
+
*
|
|
4
|
+
* This module exports all built-in provider definitions and registers
|
|
5
|
+
* them with the default registry.
|
|
6
|
+
*/
|
|
7
|
+
export { llamaServerProvider } from "./llama-server.provider";
|
|
8
|
+
export { audioLocalProvider } from "./audio-local.provider";
|
|
9
|
+
export { whisperCppProvider } from "./whisper-cpp.provider";
|
|
10
|
+
export { openaiCompatibleProvider } from "./openai-compatible.provider";
|
|
11
|
+
export { openaiProvider } from "./openai.provider";
|
|
12
|
+
export { anthropicProvider } from "./anthropic.provider";
|
|
13
|
+
export { buildLlamaServerModel, probeLlamaServer } from "./llama-server";
|
|
14
|
+
export type { LlamaServerConfig } from "./llama-server";
|
|
15
|
+
export { buildAudioLocalModel } from "./audio-local";
|
|
16
|
+
export type { AudioLocalConfig, AudioLocalRuntime } from "./audio-local";
|
|
17
|
+
export { buildWhisperCppModel } from "./whisper-cpp";
|
|
18
|
+
export type { WhisperCppConfig } from "./whisper-cpp";
|
|
19
|
+
export { buildOpenAICompatibleModel, probeOpenAICompatible } from "./openai-compatible";
|
|
20
|
+
export type { OpenAICompatibleConfig, ProviderProbeResult } from "./openai-compatible";
|
|
21
|
+
export { buildOpenAIModel } from "./openai";
|
|
22
|
+
export type { OpenAIConfig } from "./openai";
|
|
23
|
+
export { buildAnthropicModel } from "./anthropic";
|
|
24
|
+
export type { AnthropicConfig } from "./anthropic";
|
|
25
|
+
/**
|
|
26
|
+
* Register all built-in providers with the default registry.
|
|
27
|
+
* This is called when the module is imported.
|
|
28
|
+
*/
|
|
29
|
+
export declare function registerBuiltinProviders(): void;
|
|
30
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGzD,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACzE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACxF,YAAY,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAUnD;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAoB/C"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider definitions index.
|
|
3
|
+
*
|
|
4
|
+
* This module exports all built-in provider definitions and registers
|
|
5
|
+
* them with the default registry.
|
|
6
|
+
*/
|
|
7
|
+
import { defaultRegistry } from "../registry";
|
|
8
|
+
// Provider definitions
|
|
9
|
+
export { llamaServerProvider } from "./llama-server.provider";
|
|
10
|
+
export { audioLocalProvider } from "./audio-local.provider";
|
|
11
|
+
export { whisperCppProvider } from "./whisper-cpp.provider";
|
|
12
|
+
export { openaiCompatibleProvider } from "./openai-compatible.provider";
|
|
13
|
+
export { openaiProvider } from "./openai.provider";
|
|
14
|
+
export { anthropicProvider } from "./anthropic.provider";
|
|
15
|
+
// Re-export original build functions for backward compatibility
|
|
16
|
+
export { buildLlamaServerModel, probeLlamaServer } from "./llama-server";
|
|
17
|
+
export { buildAudioLocalModel } from "./audio-local";
|
|
18
|
+
export { buildWhisperCppModel } from "./whisper-cpp";
|
|
19
|
+
export { buildOpenAICompatibleModel, probeOpenAICompatible } from "./openai-compatible";
|
|
20
|
+
export { buildOpenAIModel } from "./openai";
|
|
21
|
+
export { buildAnthropicModel } from "./anthropic";
|
|
22
|
+
// Import providers for registration
|
|
23
|
+
import { llamaServerProvider } from "./llama-server.provider";
|
|
24
|
+
import { audioLocalProvider } from "./audio-local.provider";
|
|
25
|
+
import { whisperCppProvider } from "./whisper-cpp.provider";
|
|
26
|
+
import { openaiCompatibleProvider } from "./openai-compatible.provider";
|
|
27
|
+
import { openaiProvider } from "./openai.provider";
|
|
28
|
+
import { anthropicProvider } from "./anthropic.provider";
|
|
29
|
+
/**
|
|
30
|
+
* Register all built-in providers with the default registry.
|
|
31
|
+
* This is called when the module is imported.
|
|
32
|
+
*/
|
|
33
|
+
export function registerBuiltinProviders() {
|
|
34
|
+
// Only register if not already registered
|
|
35
|
+
if (!defaultRegistry.get("llama-server")) {
|
|
36
|
+
defaultRegistry.register(llamaServerProvider);
|
|
37
|
+
}
|
|
38
|
+
if (!defaultRegistry.get("audio-local")) {
|
|
39
|
+
defaultRegistry.register(audioLocalProvider);
|
|
40
|
+
}
|
|
41
|
+
if (!defaultRegistry.get("whisper-cpp")) {
|
|
42
|
+
defaultRegistry.register(whisperCppProvider);
|
|
43
|
+
}
|
|
44
|
+
if (!defaultRegistry.get("openai-compatible")) {
|
|
45
|
+
defaultRegistry.register(openaiCompatibleProvider);
|
|
46
|
+
}
|
|
47
|
+
if (!defaultRegistry.get("openai")) {
|
|
48
|
+
defaultRegistry.register(openaiProvider);
|
|
49
|
+
}
|
|
50
|
+
if (!defaultRegistry.get("anthropic")) {
|
|
51
|
+
defaultRegistry.register(anthropicProvider);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Auto-register on import
|
|
55
|
+
registerBuiltinProviders();
|
|
56
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,uBAAuB;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,gEAAgE;AAChE,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGrD,OAAO,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAGxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAG5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGlD,oCAAoC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD;;;GAGG;AACH,MAAM,UAAU,wBAAwB;IACtC,0CAA0C;IAC1C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACzC,eAAe,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QACxC,eAAe,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QACxC,eAAe,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC9C,eAAe,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,eAAe,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,eAAe,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,0BAA0B;AAC1B,wBAAwB,EAAE,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { ResolvedModel } from "../model";
|
|
2
|
+
/**
|
|
3
|
+
* Managed llama.cpp `llama-server` provider.
|
|
4
|
+
*
|
|
5
|
+
* Spawns a local `llama-server` binary on first use, waits for it to be ready,
|
|
6
|
+
* then proxies calls through the standard openai-compatible HTTP interface.
|
|
7
|
+
* Subsequent calls reuse the running process — no double-spawn.
|
|
8
|
+
*
|
|
9
|
+
* This is the "llama.cpp for LLMs" counterpart to the whisper-cpp provider:
|
|
10
|
+
* the same local-binary philosophy, but for a persistent HTTP server instead
|
|
11
|
+
* of a one-shot process.
|
|
12
|
+
*
|
|
13
|
+
* Required env (per-agent or global):
|
|
14
|
+
* SUPERAGENT_PROVIDER=llama-server
|
|
15
|
+
* SUPERAGENT_BIN path to llama-server binary
|
|
16
|
+
* SUPERAGENT_MODEL_PATH path to GGUF model file
|
|
17
|
+
*
|
|
18
|
+
* Optional:
|
|
19
|
+
* SUPERAGENT_PORT port to bind (default 8080)
|
|
20
|
+
* SUPERAGENT_HOST host to bind (default 127.0.0.1)
|
|
21
|
+
* SUPERAGENT_PARALLEL maximum concurrent slots (llama-server --parallel)
|
|
22
|
+
* SUPERAGENT_GPU_LAYERS number of layers to offload to GPU (default 0)
|
|
23
|
+
* SUPERAGENT_THREADS number of CPU threads
|
|
24
|
+
* SUPERAGENT_CTX_SIZE context window size (default 4096)
|
|
25
|
+
* SUPERAGENT_MMPROJ path to mmproj GGUF (required for vision with llama-server)
|
|
26
|
+
* SUPERAGENT_ENABLE_REASONING=true to allow reasoning mode
|
|
27
|
+
*/
|
|
28
|
+
export type LlamaServerConfig = {
|
|
29
|
+
bin: string;
|
|
30
|
+
modelPath: string;
|
|
31
|
+
port: number;
|
|
32
|
+
host: string;
|
|
33
|
+
parallel?: number;
|
|
34
|
+
gpuLayers?: number;
|
|
35
|
+
threads?: number;
|
|
36
|
+
ctxSize?: number;
|
|
37
|
+
/** Path to multimodal projector for vision models (e.g. mmproj-Qwen3.5-9B-BF16.gguf) */
|
|
38
|
+
mmproj?: string;
|
|
39
|
+
/** Disable reasoning/thinking mode (default: true = disabled) */
|
|
40
|
+
noReasoning?: boolean;
|
|
41
|
+
resolvedModelId: string;
|
|
42
|
+
originalModelId: string;
|
|
43
|
+
};
|
|
44
|
+
export declare function shutdownAllManagedLlamaServers(): Promise<void>;
|
|
45
|
+
export declare function buildLlamaServerModel(cfg: LlamaServerConfig): Promise<ResolvedModel>;
|
|
46
|
+
/**
|
|
47
|
+
* Quick reachability probe for the Playground /providers screen.
|
|
48
|
+
* Returns ok=true and model list if a llama-server is already running on the
|
|
49
|
+
* configured port, without starting a new one.
|
|
50
|
+
*/
|
|
51
|
+
export declare function probeLlamaServer(host: string, port: number): Promise<{
|
|
52
|
+
ok: boolean;
|
|
53
|
+
latencyMs: number;
|
|
54
|
+
models?: string[];
|
|
55
|
+
error?: string;
|
|
56
|
+
}>;
|
|
57
|
+
//# sourceMappingURL=llama-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llama-server.d.ts","sourceRoot":"","sources":["../../src/providers/llama-server.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAG9C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAkGF,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,IAAI,CAAC,CAGpE;AA6BD,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CA8F1F;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAwBhF"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { access } from "node:fs/promises";
|
|
2
|
+
import { basename } from "node:path";
|
|
3
|
+
import { buildOpenAICompatibleModel } from "./openai-compatible";
|
|
4
|
+
import { ProviderError } from "../errors";
|
|
5
|
+
const HEALTH_POLL_INTERVAL_MS = 300;
|
|
6
|
+
const HEALTH_TIMEOUT_MS = 60_000;
|
|
7
|
+
const PROCESS_KILL_TIMEOUT_MS = 1_500;
|
|
8
|
+
/** Module-level singleton: port → running subprocess. */
|
|
9
|
+
const _procs = new Map();
|
|
10
|
+
let _shutdownHooksRegistered = false;
|
|
11
|
+
async function fileExists(path) {
|
|
12
|
+
try {
|
|
13
|
+
await access(path);
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function isMmprojFile(path) {
|
|
21
|
+
return /^mmproj-.+\.gguf$/i.test(basename(path));
|
|
22
|
+
}
|
|
23
|
+
async function isPortOpen(host, port) {
|
|
24
|
+
try {
|
|
25
|
+
const res = await fetch(`http://${host}:${port}/health`, {
|
|
26
|
+
signal: AbortSignal.timeout(500),
|
|
27
|
+
});
|
|
28
|
+
return res.ok || res.status === 503; // 503 = loading model, still alive
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function waitForReady(host, port) {
|
|
35
|
+
const deadline = Date.now() + HEALTH_TIMEOUT_MS;
|
|
36
|
+
while (Date.now() < deadline) {
|
|
37
|
+
try {
|
|
38
|
+
const res = await fetch(`http://${host}:${port}/health`, {
|
|
39
|
+
signal: AbortSignal.timeout(500),
|
|
40
|
+
});
|
|
41
|
+
// llama-server returns 200 {"status":"ok"} when fully loaded
|
|
42
|
+
if (res.ok)
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// not ready yet, keep polling
|
|
47
|
+
}
|
|
48
|
+
await new Promise((r) => setTimeout(r, HEALTH_POLL_INTERVAL_MS));
|
|
49
|
+
}
|
|
50
|
+
throw new ProviderError(`llama-server did not become ready within ${HEALTH_TIMEOUT_MS / 1000}s. ` +
|
|
51
|
+
`Check that the binary and model path are correct.`);
|
|
52
|
+
}
|
|
53
|
+
function buildConfigSignature(cfg) {
|
|
54
|
+
return JSON.stringify({
|
|
55
|
+
bin: cfg.bin,
|
|
56
|
+
modelPath: cfg.modelPath,
|
|
57
|
+
host: cfg.host,
|
|
58
|
+
port: cfg.port,
|
|
59
|
+
parallel: cfg.parallel,
|
|
60
|
+
gpuLayers: cfg.gpuLayers,
|
|
61
|
+
threads: cfg.threads,
|
|
62
|
+
ctxSize: cfg.ctxSize ?? 4096,
|
|
63
|
+
mmproj: cfg.mmproj ?? null,
|
|
64
|
+
noReasoning: cfg.noReasoning !== false,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
async function stopManagedProc(port) {
|
|
68
|
+
const managed = _procs.get(port);
|
|
69
|
+
if (!managed)
|
|
70
|
+
return;
|
|
71
|
+
try {
|
|
72
|
+
managed.proc.kill("SIGTERM");
|
|
73
|
+
await Promise.race([
|
|
74
|
+
managed.proc.exited,
|
|
75
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error("SIGTERM timeout")), PROCESS_KILL_TIMEOUT_MS)),
|
|
76
|
+
]);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Best-effort SIGTERM timed out or failed, fallback to force kill.
|
|
80
|
+
try {
|
|
81
|
+
managed.proc.kill("SIGKILL");
|
|
82
|
+
await managed.proc.exited;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Ignore errors during hard kill.
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
_procs.delete(port);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export async function shutdownAllManagedLlamaServers() {
|
|
93
|
+
const ports = [..._procs.keys()];
|
|
94
|
+
await Promise.allSettled(ports.map((port) => stopManagedProc(port)));
|
|
95
|
+
}
|
|
96
|
+
function ensureShutdownHooksRegistered() {
|
|
97
|
+
if (_shutdownHooksRegistered)
|
|
98
|
+
return;
|
|
99
|
+
_shutdownHooksRegistered = true;
|
|
100
|
+
const shutdownForSignal = async (signal, listener) => {
|
|
101
|
+
process.removeListener(signal, listener);
|
|
102
|
+
await shutdownAllManagedLlamaServers();
|
|
103
|
+
process.kill(process.pid, signal);
|
|
104
|
+
};
|
|
105
|
+
const onSigint = () => {
|
|
106
|
+
void shutdownForSignal("SIGINT", onSigint);
|
|
107
|
+
};
|
|
108
|
+
const onSigterm = () => {
|
|
109
|
+
void shutdownForSignal("SIGTERM", onSigterm);
|
|
110
|
+
};
|
|
111
|
+
process.on("SIGINT", onSigint);
|
|
112
|
+
process.on("SIGTERM", onSigterm);
|
|
113
|
+
process.on("beforeExit", () => {
|
|
114
|
+
void shutdownAllManagedLlamaServers();
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
export async function buildLlamaServerModel(cfg) {
|
|
118
|
+
ensureShutdownHooksRegistered();
|
|
119
|
+
if (!cfg.bin) {
|
|
120
|
+
throw new ProviderError("llama-server provider requires BIN (set SUPERAGENT_BIN or SUPERAGENT_<AGENT>_BIN)");
|
|
121
|
+
}
|
|
122
|
+
if (!cfg.modelPath) {
|
|
123
|
+
throw new ProviderError("llama-server provider requires MODEL_PATH (set SUPERAGENT_MODEL_PATH or SUPERAGENT_<AGENT>_MODEL_PATH)");
|
|
124
|
+
}
|
|
125
|
+
if (!(await fileExists(cfg.bin))) {
|
|
126
|
+
throw new ProviderError(`llama-server binary not found at "${cfg.bin}"`);
|
|
127
|
+
}
|
|
128
|
+
if (!(await fileExists(cfg.modelPath))) {
|
|
129
|
+
throw new ProviderError(`llama-server model file not found at "${cfg.modelPath}"`);
|
|
130
|
+
}
|
|
131
|
+
if (isMmprojFile(cfg.modelPath)) {
|
|
132
|
+
throw new ProviderError(`llama-server MODEL_PATH points to "${basename(cfg.modelPath)}", which is an mmproj projector file, not a runnable model. Select the base GGUF model instead and keep mmproj only for vision support.`);
|
|
133
|
+
}
|
|
134
|
+
if (cfg.mmproj && !(await fileExists(cfg.mmproj))) {
|
|
135
|
+
throw new ProviderError(`llama-server mmproj file not found at "${cfg.mmproj}"`);
|
|
136
|
+
}
|
|
137
|
+
const { host, port } = cfg;
|
|
138
|
+
const baseURL = `http://${host}:${port}/v1`;
|
|
139
|
+
const desiredSignature = buildConfigSignature(cfg);
|
|
140
|
+
const managed = _procs.get(port);
|
|
141
|
+
if (managed && managed.signature !== desiredSignature) {
|
|
142
|
+
await stopManagedProc(port);
|
|
143
|
+
}
|
|
144
|
+
const alreadyUp = await isPortOpen(host, port);
|
|
145
|
+
if (!alreadyUp) {
|
|
146
|
+
if (!_procs.has(port)) {
|
|
147
|
+
const args = [
|
|
148
|
+
cfg.bin,
|
|
149
|
+
"--model", cfg.modelPath,
|
|
150
|
+
"--host", host,
|
|
151
|
+
"--port", String(port),
|
|
152
|
+
];
|
|
153
|
+
if (cfg.parallel !== undefined)
|
|
154
|
+
args.push("--parallel", String(cfg.parallel));
|
|
155
|
+
if (cfg.gpuLayers !== undefined)
|
|
156
|
+
args.push("--n-gpu-layers", String(cfg.gpuLayers));
|
|
157
|
+
if (cfg.threads !== undefined)
|
|
158
|
+
args.push("--threads", String(cfg.threads));
|
|
159
|
+
// Default context size 4096 to save memory (vs 32K default which eats ~16GB)
|
|
160
|
+
args.push("--ctx-size", String(cfg.ctxSize ?? 4096));
|
|
161
|
+
// Multimodal projector for vision support
|
|
162
|
+
if (cfg.mmproj)
|
|
163
|
+
args.push("--mmproj", cfg.mmproj);
|
|
164
|
+
// Disable reasoning/thinking mode by default (reasoning-budget 0)
|
|
165
|
+
// This makes Qwen3.5 models output content directly without <think> blocks
|
|
166
|
+
if (cfg.noReasoning !== false)
|
|
167
|
+
args.push("--reasoning-budget", "0");
|
|
168
|
+
const proc = Bun.spawn({
|
|
169
|
+
cmd: args,
|
|
170
|
+
stdout: "ignore",
|
|
171
|
+
stderr: "ignore",
|
|
172
|
+
});
|
|
173
|
+
_procs.set(port, { proc, signature: desiredSignature });
|
|
174
|
+
}
|
|
175
|
+
await waitForReady(host, port);
|
|
176
|
+
}
|
|
177
|
+
const inner = buildOpenAICompatibleModel({
|
|
178
|
+
baseURL,
|
|
179
|
+
apiKey: "local",
|
|
180
|
+
resolvedModelId: cfg.resolvedModelId,
|
|
181
|
+
originalModelId: cfg.originalModelId,
|
|
182
|
+
});
|
|
183
|
+
const managedProcess = _procs.has(port);
|
|
184
|
+
if (inner.kind !== "ai-sdk") {
|
|
185
|
+
throw new ProviderError("llama-server: unexpected inner model kind");
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
kind: "ai-sdk",
|
|
189
|
+
id: inner.id,
|
|
190
|
+
resolvedId: inner.resolvedId,
|
|
191
|
+
provider: "llama-server",
|
|
192
|
+
model: inner.model,
|
|
193
|
+
meta: {
|
|
194
|
+
baseURL,
|
|
195
|
+
bin: cfg.bin,
|
|
196
|
+
modelPath: cfg.modelPath,
|
|
197
|
+
port,
|
|
198
|
+
host,
|
|
199
|
+
managedProcess,
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Quick reachability probe for the Playground /providers screen.
|
|
205
|
+
* Returns ok=true and model list if a llama-server is already running on the
|
|
206
|
+
* configured port, without starting a new one.
|
|
207
|
+
*/
|
|
208
|
+
export async function probeLlamaServer(host, port) {
|
|
209
|
+
const startedAt = performance.now();
|
|
210
|
+
try {
|
|
211
|
+
const url = `http://${host}:${port}/v1/models`;
|
|
212
|
+
const res = await fetch(url, { signal: AbortSignal.timeout(1500) });
|
|
213
|
+
const latencyMs = Math.round(performance.now() - startedAt);
|
|
214
|
+
if (!res.ok) {
|
|
215
|
+
return { ok: false, latencyMs, error: `HTTP ${res.status}` };
|
|
216
|
+
}
|
|
217
|
+
const body = (await res.json().catch(() => null));
|
|
218
|
+
const models = body?.data
|
|
219
|
+
?.map((e) => e.id)
|
|
220
|
+
.filter((id) => typeof id === "string") ?? [];
|
|
221
|
+
return { ok: true, latencyMs, models };
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
return {
|
|
225
|
+
ok: false,
|
|
226
|
+
latencyMs: Math.round(performance.now() - startedAt),
|
|
227
|
+
error: error instanceof Error ? error.message : String(error),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=llama-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llama-server.js","sourceRoot":"","sources":["../../src/providers/llama-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* llama-server provider definition using defineProvider.
|
|
3
|
+
*
|
|
4
|
+
* Manages a local llama.cpp server for LLM inference with automatic
|
|
5
|
+
* model discovery from LM Studio paths.
|
|
6
|
+
*/
|
|
7
|
+
import { type ProviderConfig } from "@dahura/super-agent-kit";
|
|
8
|
+
export declare const LLAMA_SERVER_MODEL_DISCOVERY_PATHS: readonly ["~/.lmstudio/models", "~/.cache/lm-studio/models", "~/Library/Application Support/LM Studio/models"];
|
|
9
|
+
/**
|
|
10
|
+
* Configuration type for llama-server provider.
|
|
11
|
+
*/
|
|
12
|
+
export type LlamaServerProviderConfig = ProviderConfig & {
|
|
13
|
+
bin?: string;
|
|
14
|
+
modelPath?: string;
|
|
15
|
+
port?: string;
|
|
16
|
+
host?: string;
|
|
17
|
+
parallel?: string;
|
|
18
|
+
gpuLayers?: string;
|
|
19
|
+
threads?: string;
|
|
20
|
+
ctxSize?: string;
|
|
21
|
+
mmproj?: string;
|
|
22
|
+
enableReasoning?: string;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* llama-server provider definition.
|
|
26
|
+
*
|
|
27
|
+
* Features:
|
|
28
|
+
* - Automatic server lifecycle management (spawn on first use)
|
|
29
|
+
* - OpenAI-compatible API
|
|
30
|
+
* - Model discovery from LM Studio paths
|
|
31
|
+
* - GPU offloading support
|
|
32
|
+
*/
|
|
33
|
+
export declare const llamaServerProvider: import("@dahura/super-agent-kit").ProviderModule<LlamaServerProviderConfig>;
|
|
34
|
+
//# sourceMappingURL=llama-server.provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llama-server.provider.d.ts","sourceRoot":"","sources":["../../src/providers/llama-server.provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAkB,KAAK,cAAc,EAA4B,MAAM,yBAAyB,CAAC;AAGxG,eAAO,MAAM,kCAAkC,gHAIrC,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG,cAAc,GAAG;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAwEF;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,6EA+D9B,CAAC"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* llama-server provider definition using defineProvider.
|
|
3
|
+
*
|
|
4
|
+
* Manages a local llama.cpp server for LLM inference with automatic
|
|
5
|
+
* model discovery from LM Studio paths.
|
|
6
|
+
*/
|
|
7
|
+
import { basename } from "node:path";
|
|
8
|
+
import { defineProvider } from "@dahura/super-agent-kit";
|
|
9
|
+
import { buildLlamaServerModel, probeLlamaServer } from "./llama-server";
|
|
10
|
+
export const LLAMA_SERVER_MODEL_DISCOVERY_PATHS = [
|
|
11
|
+
"~/.lmstudio/models",
|
|
12
|
+
"~/.cache/lm-studio/models",
|
|
13
|
+
"~/Library/Application Support/LM Studio/models",
|
|
14
|
+
];
|
|
15
|
+
/**
|
|
16
|
+
* Probe function wrapper for defineProvider compatibility.
|
|
17
|
+
*/
|
|
18
|
+
async function probeLlamaServerProvider(config) {
|
|
19
|
+
const host = config.host ?? "127.0.0.1";
|
|
20
|
+
const port = config.port ? parseInt(config.port, 10) : 8080;
|
|
21
|
+
// If no bin/modelPath configured, provider is not set up
|
|
22
|
+
if (!config.bin || !config.modelPath) {
|
|
23
|
+
return {
|
|
24
|
+
ok: false,
|
|
25
|
+
error: "Not configured (BIN and MODEL_PATH required)",
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const result = await probeLlamaServer(host, port);
|
|
29
|
+
return {
|
|
30
|
+
ok: result.ok,
|
|
31
|
+
latencyMs: result.latencyMs,
|
|
32
|
+
models: result.models,
|
|
33
|
+
error: result.error,
|
|
34
|
+
meta: {
|
|
35
|
+
host,
|
|
36
|
+
port,
|
|
37
|
+
bin: config.bin,
|
|
38
|
+
modelPath: config.modelPath,
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Build function wrapper for defineProvider compatibility.
|
|
44
|
+
*/
|
|
45
|
+
async function buildLlamaServerProviderModel(config) {
|
|
46
|
+
const enableReasoning = config.enableReasoning === "true";
|
|
47
|
+
const llamaConfig = {
|
|
48
|
+
bin: config.bin ?? "",
|
|
49
|
+
modelPath: config.modelPath ?? "",
|
|
50
|
+
port: config.port ? parseInt(config.port, 10) : 8080,
|
|
51
|
+
host: config.host ?? "127.0.0.1",
|
|
52
|
+
parallel: config.parallel ? parseInt(config.parallel, 10) : undefined,
|
|
53
|
+
gpuLayers: config.gpuLayers ? parseInt(config.gpuLayers, 10) : undefined,
|
|
54
|
+
threads: config.threads ? parseInt(config.threads, 10) : undefined,
|
|
55
|
+
ctxSize: config.ctxSize ? parseInt(config.ctxSize, 10) : undefined,
|
|
56
|
+
mmproj: config.mmproj,
|
|
57
|
+
noReasoning: !enableReasoning,
|
|
58
|
+
resolvedModelId: basename(config.modelPath ?? "", ".gguf"),
|
|
59
|
+
originalModelId: `local/${basename(config.modelPath ?? "", ".gguf")}`,
|
|
60
|
+
};
|
|
61
|
+
return buildLlamaServerModel(llamaConfig);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Extract a human-readable model ID from a GGUF file path.
|
|
65
|
+
* Examples:
|
|
66
|
+
* ~/.cache/lm-studio/models/lmstudio-community/Qwen3.5-9B-GGUF/Qwen3.5-9B-Q4_K_M.gguf
|
|
67
|
+
* → "Qwen3.5-9B-Q4_K_M"
|
|
68
|
+
*/
|
|
69
|
+
function extractGgufModelId(filePath) {
|
|
70
|
+
const filename = basename(filePath);
|
|
71
|
+
// Remove .gguf extension
|
|
72
|
+
return filename.replace(/\.gguf$/i, "");
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* llama-server provider definition.
|
|
76
|
+
*
|
|
77
|
+
* Features:
|
|
78
|
+
* - Automatic server lifecycle management (spawn on first use)
|
|
79
|
+
* - OpenAI-compatible API
|
|
80
|
+
* - Model discovery from LM Studio paths
|
|
81
|
+
* - GPU offloading support
|
|
82
|
+
*/
|
|
83
|
+
export const llamaServerProvider = defineProvider({
|
|
84
|
+
meta: {
|
|
85
|
+
id: "llama-server",
|
|
86
|
+
description: "Managed llama.cpp server for local LLM inference",
|
|
87
|
+
version: "1.0.0",
|
|
88
|
+
capabilities: ["text", "vision"],
|
|
89
|
+
},
|
|
90
|
+
kind: "ai-sdk",
|
|
91
|
+
env: {
|
|
92
|
+
bin: {
|
|
93
|
+
env: "BIN",
|
|
94
|
+
required: true,
|
|
95
|
+
description: "Path to llama-server binary",
|
|
96
|
+
},
|
|
97
|
+
modelPath: {
|
|
98
|
+
env: "MODEL_PATH",
|
|
99
|
+
required: true,
|
|
100
|
+
description: "Path to GGUF model file",
|
|
101
|
+
},
|
|
102
|
+
port: {
|
|
103
|
+
env: "PORT",
|
|
104
|
+
default: "8080",
|
|
105
|
+
description: "Port to bind (default 8080)",
|
|
106
|
+
},
|
|
107
|
+
host: {
|
|
108
|
+
env: "HOST",
|
|
109
|
+
default: "127.0.0.1",
|
|
110
|
+
description: "Host to bind (default 127.0.0.1)",
|
|
111
|
+
},
|
|
112
|
+
parallel: {
|
|
113
|
+
env: "PARALLEL",
|
|
114
|
+
description: "Maximum concurrent llama-server slots",
|
|
115
|
+
},
|
|
116
|
+
gpuLayers: {
|
|
117
|
+
env: "GPU_LAYERS",
|
|
118
|
+
description: "Number of layers to offload to GPU",
|
|
119
|
+
},
|
|
120
|
+
threads: {
|
|
121
|
+
env: "THREADS",
|
|
122
|
+
description: "Number of CPU threads",
|
|
123
|
+
},
|
|
124
|
+
ctxSize: {
|
|
125
|
+
env: "CTX_SIZE",
|
|
126
|
+
default: "4096",
|
|
127
|
+
description: "Context window size (default 4096)",
|
|
128
|
+
},
|
|
129
|
+
mmproj: {
|
|
130
|
+
env: "MMPROJ",
|
|
131
|
+
description: "Path to mmproj GGUF file for vision models",
|
|
132
|
+
},
|
|
133
|
+
enableReasoning: {
|
|
134
|
+
env: "ENABLE_REASONING",
|
|
135
|
+
description: "Set true to enable reasoning/thinking mode",
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
modelDiscovery: {
|
|
139
|
+
paths: LLAMA_SERVER_MODEL_DISCOVERY_PATHS,
|
|
140
|
+
pattern: "**/*.gguf",
|
|
141
|
+
extractModelId: extractGgufModelId,
|
|
142
|
+
filter: (filePath) => !/\/mmproj-[^/]+\.gguf$/i.test(filePath),
|
|
143
|
+
},
|
|
144
|
+
probe: probeLlamaServerProvider,
|
|
145
|
+
build: buildLlamaServerProviderModel,
|
|
146
|
+
});
|
|
147
|
+
//# sourceMappingURL=llama-server.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llama-server.provider.js","sourceRoot":"","sources":["../../src/providers/llama-server.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ResolvedModel } from "../model";
|
|
2
|
+
/**
|
|
3
|
+
* Local-first OpenAI-compatible provider.
|
|
4
|
+
*
|
|
5
|
+
* One adapter, many backends: Ollama (`/v1`), llama-server (`/v1`),
|
|
6
|
+
* LM Studio (`/v1`), vLLM (`/v1`). They all expose the same OpenAI REST
|
|
7
|
+
* surface, so a single `@ai-sdk/openai` instance with a custom baseURL
|
|
8
|
+
* covers them all.
|
|
9
|
+
*
|
|
10
|
+
* This is the DEFAULT provider in SuperAgent's local-first stance — when
|
|
11
|
+
* `.env` has nothing else, the resolver tries `openai-compatible` first.
|
|
12
|
+
*/
|
|
13
|
+
export type OpenAICompatibleConfig = {
|
|
14
|
+
baseURL: string;
|
|
15
|
+
apiKey: string;
|
|
16
|
+
resolvedModelId: string;
|
|
17
|
+
originalModelId: string;
|
|
18
|
+
};
|
|
19
|
+
export declare function buildOpenAICompatibleModel(cfg: OpenAICompatibleConfig): ResolvedModel;
|
|
20
|
+
/**
|
|
21
|
+
* Quick reachability probe used by the Playground /providers screen.
|
|
22
|
+
* Issues a `/models` GET against the baseURL. Returns latency + list of
|
|
23
|
+
* available model ids on success, or a ProviderError-backed result on failure.
|
|
24
|
+
*/
|
|
25
|
+
export type ProviderProbeResult = {
|
|
26
|
+
ok: boolean;
|
|
27
|
+
latencyMs: number;
|
|
28
|
+
models?: string[];
|
|
29
|
+
error?: string;
|
|
30
|
+
};
|
|
31
|
+
export declare function probeOpenAICompatible(baseURL: string, apiKey: string, abortSignal?: AbortSignal): Promise<ProviderProbeResult>;
|
|
32
|
+
//# sourceMappingURL=openai-compatible.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-compatible.d.ts","sourceRoot":"","sources":["../../src/providers/openai-compatible.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAG9C;;;;;;;;;;GAUG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,sBAAsB,GAAG,aAAa,CAuBrF;AAED;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,mBAAmB,CAAC,CA0B9B"}
|