pi-llama-cpp 0.14.0 → 0.16.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/README.md +52 -13
- package/package.json +3 -3
- package/src/api/client.ts +59 -22
- package/src/constants.ts +5 -0
- package/src/enums/mode.ts +1 -0
- package/src/index.ts +2 -1
- package/src/interfaces/endpoints/models.ts +6 -0
- package/src/interfaces/endpoints/props.ts +14 -0
- package/src/interfaces/settings.ts +6 -0
- package/src/managers/command/models.ts +12 -6
- package/src/managers/command.ts +6 -1
- package/src/managers/server.ts +30 -38
- package/src/managers/settings.ts +23 -3
- package/src/models/legacyModel.ts +3 -3
- package/src/models/llamaSwapModel.ts +90 -0
- package/src/models/routerModel.ts +2 -2
- package/src/models/singleModel.ts +2 -2
- package/src/server.ts +42 -15
- package/src/sse/manager.ts +2 -2
- package/src/ui/dialog/confirm.ts +1 -1
- package/src/ui/dialog/input.ts +1 -1
- package/src/ui/editors/editorOptions.ts +8 -1
- package/src/ui/editors/itemBuilder.ts +2 -6
- package/src/ui/editors/listEditor.ts +24 -15
- package/src/ui/editors/override/entryEditor.ts +105 -23
- package/src/ui/editors/override/fields/base.ts +53 -0
- package/src/ui/editors/override/fields/capabilities.ts +36 -0
- package/src/ui/editors/override/fields/cost.ts +64 -0
- package/src/ui/editors/override/fields/index.ts +68 -0
- package/src/ui/editors/override/fields/numeric.ts +55 -0
- package/src/ui/editors/override/fields/pattern.ts +24 -0
- package/src/ui/editors/override/fields/reasoning.ts +33 -0
- package/src/ui/editors/override/itemBuilder.ts +4 -4
- package/src/ui/editors/server/fields.ts +2 -2
- package/src/ui/editors/server/itemBuilder.ts +2 -3
- package/src/ui/editors/server/serverEditor.ts +58 -22
- package/src/ui/editors/server/utils.ts +50 -0
- package/src/ui/settings/index.ts +11 -0
- package/src/ui/strings.ts +17 -0
- package/src/utils/credentialResolver.ts +110 -0
- package/src/utils/health.ts +2 -2
- package/src/utils/urlResolver.ts +1 -1
- package/tests/{commandManager.test.ts → command/commandManager.test.ts} +80 -9
- package/tests/{events.test.ts → events/events.test.ts} +6 -6
- package/tests/mocks.ts +4 -0
- package/tests/{legacyModel.test.ts → models/legacyModel.test.ts} +5 -5
- package/tests/models/llamaSwapModel.test.ts +327 -0
- package/tests/{routerModel.test.ts → models/routerModel.test.ts} +5 -5
- package/tests/{singleModel.test.ts → models/singleModel.test.ts} +5 -5
- package/tests/{health.test.ts → server/health.test.ts} +4 -4
- package/tests/{server.test.ts → server/server.test.ts} +57 -7
- package/tests/{serverManager.test.ts → server/serverManager.test.ts} +4 -4
- package/tests/{settings.test.ts → settings/settings.test.ts} +198 -355
- package/tests/{settingsStore.test.ts → settings/settingsStore.test.ts} +1 -1
- package/tests/{sseManager.test.ts → sse/sseManager.test.ts} +2 -2
- package/tests/{dialog.test.ts → ui/dialog.test.ts} +5 -4
- package/tests/{overrides.test.ts → ui/overrides.test.ts} +9 -42
- package/tests/utils/credentialResolver.test.ts +66 -0
- package/tests/utils/urlResolver.test.ts +116 -0
- package/src/ui/editors/override/fields.ts +0 -294
- package/src/ui/editors/override/handlers.ts +0 -118
- package/src/ui/editors/server/handlers.ts +0 -32
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
-
import { ServerStatus } from "
|
|
3
|
-
import { checkServerHealth } from "
|
|
2
|
+
import { ServerStatus } from "../../src/enums/serverStatus";
|
|
3
|
+
import { checkServerHealth } from "../../src/utils/health";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Stubs `global.fetch` for one test. The probe only reads the parsed body,
|
|
@@ -10,7 +10,7 @@ const stubFetch = (
|
|
|
10
10
|
impl: (url: string, init?: RequestInit) => Promise<unknown>,
|
|
11
11
|
) => vi.stubGlobal("fetch", vi.fn(impl));
|
|
12
12
|
|
|
13
|
-
const okResponse = () => ({ json: async () => ({ status: "ok" }) });
|
|
13
|
+
const okResponse = () => ({ ok: true, json: async () => ({ status: "ok" }) });
|
|
14
14
|
|
|
15
15
|
const URL_ = "http://127.0.0.1:8080";
|
|
16
16
|
|
|
@@ -20,7 +20,7 @@ afterEach(() => {
|
|
|
20
20
|
|
|
21
21
|
describe("checkServerHealth", () => {
|
|
22
22
|
it("should return READY when the payload status is ok", async () => {
|
|
23
|
-
stubFetch(async () => ({ json: async () => ({ status: "ok" }) }));
|
|
23
|
+
stubFetch(async () => ({ ok: true, json: async () => ({ status: "ok" }) }));
|
|
24
24
|
|
|
25
25
|
expect(await checkServerHealth(URL_, 1000)).toBe(ServerStatus.READY);
|
|
26
26
|
});
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
-
import { POLLING_TIMEOUT, SERVER_TIMEOUT } from "
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
2
|
+
import { POLLING_TIMEOUT, SERVER_TIMEOUT } from "../../src/constants";
|
|
3
|
+
import { Mode } from "../../src/enums/mode";
|
|
4
|
+
import { ServerStatus } from "../../src/enums/serverStatus";
|
|
5
|
+
import type { PropsEndpoint } from "../../src/interfaces/endpoints/props";
|
|
6
|
+
import type { LlamaSettingsManager } from "../../src/managers/settings";
|
|
7
|
+
import { Server } from "../../src/server";
|
|
8
|
+
import { createMockServer, makeSettingsStub, mockRpc } from "../mocks";
|
|
7
9
|
|
|
8
10
|
// Injected into every real Server below; fresh per test so per-case
|
|
9
11
|
// overrides never leak. The Server constructor resolves the API key eagerly
|
|
@@ -133,9 +135,57 @@ describe("Server fetchServerProps", () => {
|
|
|
133
135
|
const server = createMockServer();
|
|
134
136
|
const result = await server.fetchServerProps();
|
|
135
137
|
|
|
136
|
-
|
|
138
|
+
// Test mocks return a PropsEndpoint shape
|
|
139
|
+
expect((result as PropsEndpoint).role).toBe("router");
|
|
137
140
|
expect(mockRpc).toHaveBeenCalledWith("/props?autoload=false");
|
|
138
141
|
});
|
|
142
|
+
|
|
143
|
+
it("should return LlamaSwapPropsError shape for llama-swap", async () => {
|
|
144
|
+
mockRpc.mockResolvedValueOnce({
|
|
145
|
+
src: "llama-swap",
|
|
146
|
+
error: {
|
|
147
|
+
message: "no model id could be identified",
|
|
148
|
+
type: "invalid_request_error",
|
|
149
|
+
param: null,
|
|
150
|
+
code: "not_found",
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
const server = createMockServer();
|
|
155
|
+
const result = await server.fetchServerProps();
|
|
156
|
+
|
|
157
|
+
expect((result as { src: string }).src).toBe("llama-swap");
|
|
158
|
+
expect(mockRpc).toHaveBeenCalledWith("/props?autoload=false");
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
describe("Server detectServerMode", () => {
|
|
163
|
+
it("should detect LLAMASWAP mode when /props returns src", async () => {
|
|
164
|
+
// initialize() calls fetchModels() first, then fetchServerProps()
|
|
165
|
+
mockRpc
|
|
166
|
+
.mockResolvedValueOnce({
|
|
167
|
+
data: [{ id: "test-model" }],
|
|
168
|
+
object: "list",
|
|
169
|
+
})
|
|
170
|
+
.mockResolvedValueOnce({
|
|
171
|
+
src: "llama-swap",
|
|
172
|
+
error: {
|
|
173
|
+
message: "no model id could be identified",
|
|
174
|
+
type: "invalid_request_error",
|
|
175
|
+
param: null,
|
|
176
|
+
code: "not_found",
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
const server = createMockServer({
|
|
181
|
+
initialize: async () => {
|
|
182
|
+
await Server.prototype.initialize.call(server);
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
await server.initialize();
|
|
186
|
+
|
|
187
|
+
expect(server.models[0].mode).toBe(Mode.LLAMASWAP);
|
|
188
|
+
});
|
|
139
189
|
});
|
|
140
190
|
|
|
141
191
|
describe("Server postRequest", () => {
|
|
@@ -214,7 +264,7 @@ describe("Server isReady", () => {
|
|
|
214
264
|
});
|
|
215
265
|
|
|
216
266
|
it("should return READY when health status is ok", async () => {
|
|
217
|
-
stubFetch(async () => ({ json: async () => ({ status: "ok" }) }));
|
|
267
|
+
stubFetch(async () => ({ ok: true, json: async () => ({ status: "ok" }) }));
|
|
218
268
|
|
|
219
269
|
const server = createMockServer();
|
|
220
270
|
const status = await server.isReady(1000);
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
-
import { ServerManager } from "
|
|
3
|
-
import { BaseModel } from "
|
|
4
|
-
import { Server } from "
|
|
2
|
+
import { ServerManager } from "../../src/managers/server";
|
|
3
|
+
import { BaseModel } from "../../src/models/baseModel";
|
|
4
|
+
import { Server } from "../../src/server";
|
|
5
5
|
import {
|
|
6
6
|
createMockModel,
|
|
7
7
|
createMockServer,
|
|
8
8
|
makeSettingsStub,
|
|
9
9
|
mockRpc,
|
|
10
|
-
} from "
|
|
10
|
+
} from "../mocks";
|
|
11
11
|
|
|
12
12
|
// Injected settings stub — the single instance passed to ServerManager and
|
|
13
13
|
// to every real `new Server(...)` construction below (Server's eager
|