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.
Files changed (62) hide show
  1. package/README.md +52 -13
  2. package/package.json +3 -3
  3. package/src/api/client.ts +59 -22
  4. package/src/constants.ts +5 -0
  5. package/src/enums/mode.ts +1 -0
  6. package/src/index.ts +2 -1
  7. package/src/interfaces/endpoints/models.ts +6 -0
  8. package/src/interfaces/endpoints/props.ts +14 -0
  9. package/src/interfaces/settings.ts +6 -0
  10. package/src/managers/command/models.ts +12 -6
  11. package/src/managers/command.ts +6 -1
  12. package/src/managers/server.ts +30 -38
  13. package/src/managers/settings.ts +23 -3
  14. package/src/models/legacyModel.ts +3 -3
  15. package/src/models/llamaSwapModel.ts +90 -0
  16. package/src/models/routerModel.ts +2 -2
  17. package/src/models/singleModel.ts +2 -2
  18. package/src/server.ts +42 -15
  19. package/src/sse/manager.ts +2 -2
  20. package/src/ui/dialog/confirm.ts +1 -1
  21. package/src/ui/dialog/input.ts +1 -1
  22. package/src/ui/editors/editorOptions.ts +8 -1
  23. package/src/ui/editors/itemBuilder.ts +2 -6
  24. package/src/ui/editors/listEditor.ts +24 -15
  25. package/src/ui/editors/override/entryEditor.ts +105 -23
  26. package/src/ui/editors/override/fields/base.ts +53 -0
  27. package/src/ui/editors/override/fields/capabilities.ts +36 -0
  28. package/src/ui/editors/override/fields/cost.ts +64 -0
  29. package/src/ui/editors/override/fields/index.ts +68 -0
  30. package/src/ui/editors/override/fields/numeric.ts +55 -0
  31. package/src/ui/editors/override/fields/pattern.ts +24 -0
  32. package/src/ui/editors/override/fields/reasoning.ts +33 -0
  33. package/src/ui/editors/override/itemBuilder.ts +4 -4
  34. package/src/ui/editors/server/fields.ts +2 -2
  35. package/src/ui/editors/server/itemBuilder.ts +2 -3
  36. package/src/ui/editors/server/serverEditor.ts +58 -22
  37. package/src/ui/editors/server/utils.ts +50 -0
  38. package/src/ui/settings/index.ts +11 -0
  39. package/src/ui/strings.ts +17 -0
  40. package/src/utils/credentialResolver.ts +110 -0
  41. package/src/utils/health.ts +2 -2
  42. package/src/utils/urlResolver.ts +1 -1
  43. package/tests/{commandManager.test.ts → command/commandManager.test.ts} +80 -9
  44. package/tests/{events.test.ts → events/events.test.ts} +6 -6
  45. package/tests/mocks.ts +4 -0
  46. package/tests/{legacyModel.test.ts → models/legacyModel.test.ts} +5 -5
  47. package/tests/models/llamaSwapModel.test.ts +327 -0
  48. package/tests/{routerModel.test.ts → models/routerModel.test.ts} +5 -5
  49. package/tests/{singleModel.test.ts → models/singleModel.test.ts} +5 -5
  50. package/tests/{health.test.ts → server/health.test.ts} +4 -4
  51. package/tests/{server.test.ts → server/server.test.ts} +57 -7
  52. package/tests/{serverManager.test.ts → server/serverManager.test.ts} +4 -4
  53. package/tests/{settings.test.ts → settings/settings.test.ts} +198 -355
  54. package/tests/{settingsStore.test.ts → settings/settingsStore.test.ts} +1 -1
  55. package/tests/{sseManager.test.ts → sse/sseManager.test.ts} +2 -2
  56. package/tests/{dialog.test.ts → ui/dialog.test.ts} +5 -4
  57. package/tests/{overrides.test.ts → ui/overrides.test.ts} +9 -42
  58. package/tests/utils/credentialResolver.test.ts +66 -0
  59. package/tests/utils/urlResolver.test.ts +116 -0
  60. package/src/ui/editors/override/fields.ts +0 -294
  61. package/src/ui/editors/override/handlers.ts +0 -118
  62. 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 "../src/enums/serverStatus";
3
- import { checkServerHealth } from "../src/utils/health";
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 "../src/constants";
3
- import { ServerStatus } from "../src/enums/serverStatus";
4
- import type { LlamaSettingsManager } from "../src/managers/settings";
5
- import { Server } from "../src/server";
6
- import { createMockServer, makeSettingsStub, mockRpc } from "./mocks";
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
- expect(result.role).toBe("router");
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 "../src/managers/server";
3
- import { BaseModel } from "../src/models/baseModel";
4
- import { Server } from "../src/server";
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 "./mocks";
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