From 846eea11b7d9adb0de6c50755211068fe82b811f Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Mon, 30 Mar 2026 14:50:42 -0400 Subject: [PATCH] feat(klms): add listModels to OpenV1BaseService --- .../src/open-v1/base.test.ts | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/packages/kernel-language-model-service/src/open-v1/base.test.ts b/packages/kernel-language-model-service/src/open-v1/base.test.ts index 298f43a53..47485c961 100644 --- a/packages/kernel-language-model-service/src/open-v1/base.test.ts +++ b/packages/kernel-language-model-service/src/open-v1/base.test.ts @@ -296,6 +296,44 @@ describe('OpenV1BaseService', () => { }); }); + describe('listModels', () => { + it('gETs /v1/models and returns model IDs', async () => { + const modelsFetch = makeMockFetch({ + data: [{ id: 'model-a' }, { id: 'model-b' }], + }); + const modelsService = new OpenV1BaseService( + modelsFetch, + 'http://localhost:8080', + 'sk-test', + ); + + const result = await modelsService.listModels(); + + expect(modelsFetch).toHaveBeenCalledWith( + 'http://localhost:8080/v1/models', + expect.any(Object), + ); + expect(result).toStrictEqual(['model-a', 'model-b']); + }); + + it('includes Authorization header when apiKey is set', async () => { + const modelsFetch = makeMockFetch({ data: [{ id: 'model-a' }] }); + const modelsService = new OpenV1BaseService( + modelsFetch, + 'http://localhost:8080', + 'sk-key', + ); + + await modelsService.listModels(); + + const [, init] = (modelsFetch as ReturnType).mock + .calls[0] as [string, RequestInit]; + expect((init.headers as Record).Authorization).toBe( + 'Bearer sk-key', + ); + }); + }); + describe('chat with stream: true', () => { it('posts to /v1/chat/completions with stream: true in body', async () => { const streamFetch = makeMockStreamFetch([makeStreamChunk('hi')]);