phantomllm 0.3.0 → 1.0.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 +48 -156
- package/dist/index.cjs +485 -42
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -10
- package/dist/index.d.ts +2 -10
- package/dist/index.js +481 -43
- package/dist/index.js.map +1 -1
- package/package.json +3 -8
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/driver/container.config.ts","../src/driver/container.manager.ts","../src/errors/base.ts","../src/errors/admin.errors.ts","../src/driver/admin.client.ts","../src/stubs/chat.builder.ts","../src/stubs/embedding.builder.ts","../src/stubs/models.builder.ts","../src/stubs/given.ts","../src/stubs/expect.ts","../src/errors/lifecycle.errors.ts","../src/driver/mock-llm.ts","../src/errors/stub.errors.ts"],"names":["GenericContainer","Wait"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { MockLLMOptions, ContainerConfig } from \"../types/config.js\";\n\nconst DEFAULT_IMAGE = \"phantomllm-server:latest\";\nconst DEFAULT_PORT = 8080;\n\nexport function resolveContainerConfig(options?: MockLLMOptions): ContainerConfig {\n return {\n image: options?.image ?? process.env[\"PHANTOMLLM_IMAGE\"] ?? DEFAULT_IMAGE,\n containerPort: options?.containerPort ?? DEFAULT_PORT,\n reuse: options?.reuse ?? true,\n startupTimeout: options?.startupTimeout ?? 30_000,\n };\n}\n","import { GenericContainer, Wait } from \"testcontainers\";\nimport type { StartedTestContainer } from \"testcontainers\";\nimport type { ContainerConfig } from \"../types/config.js\";\n\nexport class ContainerManager {\n private container: StartedTestContainer | null = null;\n\n constructor(private readonly config: ContainerConfig) {}\n\n async start(): Promise<{ host: string; port: number }> {\n const builder = new GenericContainer(this.config.image)\n .withExposedPorts(this.config.containerPort)\n .withWaitStrategy(\n Wait.forHttp(\"/_admin/health\", this.config.containerPort)\n .forStatusCode(200),\n )\n .withStartupTimeout(this.config.startupTimeout)\n .withLabels({ \"com.phantomllm\": \"true\" });\n\n this.container = await builder.start();\n\n return {\n host: this.container.getHost(),\n port: this.container.getMappedPort(this.config.containerPort),\n };\n }\n\n async stop(): Promise<void> {\n if (this.container) {\n await this.container.stop();\n this.container = null;\n }\n }\n}\n","export abstract class MockLLMError extends Error {\n abstract readonly code: string;\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = this.constructor.name;\n }\n}\n","import { MockLLMError } from './base.js';\n\nexport class AdminAPIError extends MockLLMError {\n readonly code = 'ADMIN_API_ERROR' as const;\n constructor(\n public readonly statusCode: number,\n public readonly responseBody: string,\n options?: { cause?: unknown },\n ) {\n super(\n `Admin API returned HTTP ${statusCode}: ${responseBody}`,\n options,\n );\n }\n}\n\nexport class AdminConnectionRefusedError extends MockLLMError {\n readonly code = 'ADMIN_CONNECTION_REFUSED' as const;\n constructor(options?: { cause?: unknown }) {\n super(\n 'Cannot connect to MockLLM admin API. The container may have crashed.',\n options,\n );\n }\n}\n\nexport class AdminTimeoutError extends MockLLMError {\n readonly code = 'ADMIN_TIMEOUT' as const;\n constructor(\n public readonly timeoutMs: number,\n options?: { cause?: unknown },\n ) {\n super(\n `Admin API did not respond within ${timeoutMs}ms.`,\n options,\n );\n }\n}\n","import {\n AdminConnectionRefusedError,\n AdminTimeoutError,\n AdminAPIError,\n} from \"../errors/admin.errors.js\";\nimport type {\n AdminStubDefinition,\n AdminHealthPayload,\n AdminRecordedRequestPayload,\n} from \"./admin.client.types.js\";\n\nconst REQUEST_TIMEOUT_MS = 5_000;\n\nexport class AdminClient {\n private pendingStubs: AdminStubDefinition[] = [];\n private pendingConfigs: Array<{ apiKey: string }> = [];\n\n constructor(private readonly baseUrl: string) {}\n\n enqueueStub(stub: AdminStubDefinition): void {\n this.pendingStubs.push(stub);\n }\n\n enqueueConfig(config: { apiKey: string }): void {\n this.pendingConfigs.push(config);\n }\n\n async flush(): Promise<void> {\n if (this.pendingConfigs.length > 0) {\n const configs = this.pendingConfigs.splice(0);\n for (const config of configs) {\n await this.post(\"/_admin/config\", config);\n }\n }\n\n if (this.pendingStubs.length > 0) {\n const stubs = this.pendingStubs.splice(0);\n await this.post(\"/_admin/stubs/batch\", { stubs });\n }\n }\n\n async clearStubs(): Promise<void> {\n await this.flush();\n await this.delete(\"/_admin/stubs\");\n }\n\n async getHealth(): Promise<AdminHealthPayload> {\n return this.get<AdminHealthPayload>(\"/_admin/health\");\n }\n\n async getRequests(): Promise<AdminRecordedRequestPayload[\"requests\"]> {\n await this.flush();\n const data = await this.get<AdminRecordedRequestPayload>(\"/_admin/requests\");\n return data.requests;\n }\n\n private async get<T>(path: string): Promise<T> {\n const response = await this.fetch(path, { method: \"GET\" });\n return (await response.json()) as T;\n }\n\n private async post<T>(path: string, body: unknown): Promise<T> {\n const response = await this.fetch(path, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n return (await response.json()) as T;\n }\n\n private async delete(path: string): Promise<void> {\n await this.fetch(path, { method: \"DELETE\" });\n }\n\n private async fetch(path: string, init: RequestInit): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n let response: Response;\n\n try {\n response = await fetch(url, {\n ...init,\n signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),\n });\n } catch (error: unknown) {\n if (error instanceof TypeError) {\n const cause = error.cause as { code?: string } | undefined;\n if (cause?.code === \"ECONNREFUSED\") {\n throw new AdminConnectionRefusedError({ cause: error });\n }\n }\n if (error instanceof DOMException && error.name === \"TimeoutError\") {\n throw new AdminTimeoutError(REQUEST_TIMEOUT_MS, { cause: error });\n }\n throw error;\n }\n\n if (!response.ok) {\n const body = await response.text();\n throw new AdminAPIError(response.status, body);\n }\n\n return response;\n }\n}\n","import type { AdminClient } from \"../driver/admin.client.js\";\nimport type { AdminStubMatcher } from \"../driver/admin.client.types.js\";\n\nexport class ChatCompletionStubBuilder {\n private readonly matcher: AdminStubMatcher = { endpoint: \"chat\" };\n\n constructor(private readonly adminClient: AdminClient) {}\n\n forModel(model: string): this {\n this.matcher.model = model;\n return this;\n }\n\n withMessageContaining(substring: string): this {\n this.matcher.content = substring;\n return this;\n }\n\n willReturn(content: string): void {\n this.adminClient.enqueueStub({\n matcher: this.matcher,\n response: { type: \"chat\", body: content },\n });\n }\n\n willStream(chunks: string[]): void {\n this.adminClient.enqueueStub({\n matcher: this.matcher,\n response: { type: \"streaming-chat\", chunks },\n });\n }\n\n willError(statusCode: number, message: string): void {\n this.adminClient.enqueueStub({\n matcher: this.matcher,\n response: {\n type: \"error\",\n status: statusCode,\n error: { message, type: \"api_error\", code: null },\n },\n });\n }\n}\n","import type { AdminClient } from \"../driver/admin.client.js\";\nimport type { AdminStubMatcher } from \"../driver/admin.client.types.js\";\n\nexport class EmbeddingStubBuilder {\n private readonly matcher: AdminStubMatcher = { endpoint: \"embeddings\" };\n\n constructor(private readonly adminClient: AdminClient) {}\n\n forModel(model: string): this {\n this.matcher.model = model;\n return this;\n }\n\n willReturn(vector: number[] | number[][]): void {\n const vectors = Array.isArray(vector[0])\n ? (vector as number[][])\n : [vector as number[]];\n\n this.adminClient.enqueueStub({\n matcher: this.matcher,\n response: { type: \"embedding\", vectors },\n });\n }\n\n willError(statusCode: number, message: string): void {\n this.adminClient.enqueueStub({\n matcher: this.matcher,\n response: {\n type: \"error\",\n status: statusCode,\n error: { message, type: \"api_error\", code: null },\n },\n });\n }\n}\n","import type { AdminClient } from \"../driver/admin.client.js\";\n\nexport class ModelsStubBuilder {\n constructor(private readonly adminClient: AdminClient) {}\n\n willReturn(models: Array<{ id: string; ownedBy?: string }>): void {\n this.adminClient.enqueueStub({\n matcher: {},\n response: { type: \"models\", models },\n });\n }\n}\n","import type { AdminClient } from \"../driver/admin.client.js\";\nimport { ChatCompletionStubBuilder } from \"./chat.builder.js\";\nimport { EmbeddingStubBuilder } from \"./embedding.builder.js\";\nimport { ModelsStubBuilder } from \"./models.builder.js\";\n\nexport class GivenStubs {\n constructor(private readonly adminClient: AdminClient) {}\n\n get chatCompletion(): ChatCompletionStubBuilder {\n return new ChatCompletionStubBuilder(this.adminClient);\n }\n\n get embedding(): EmbeddingStubBuilder {\n return new EmbeddingStubBuilder(this.adminClient);\n }\n\n get models(): ModelsStubBuilder {\n return new ModelsStubBuilder(this.adminClient);\n }\n}\n","import type { AdminClient } from \"../driver/admin.client.js\";\n\nexport class ExpectConditions {\n constructor(private readonly adminClient: AdminClient) {}\n\n apiKey(key: string): void {\n this.adminClient.enqueueConfig({ apiKey: key });\n }\n}\n","import { MockLLMError } from './base.js';\n\nexport class ContainerNotStartedError extends MockLLMError {\n readonly code = 'CONTAINER_NOT_STARTED' as const;\n constructor(options?: { cause?: unknown }) {\n super(\n 'MockLLM container is not running. Call `await mock.start()` before configuring stubs.',\n options,\n );\n }\n}\n\nexport class ContainerAlreadyStartedError extends MockLLMError {\n readonly code = 'CONTAINER_ALREADY_STARTED' as const;\n constructor(options?: { cause?: unknown }) {\n super(\n 'MockLLM container is already running. Call `await mock.stop()` first if you need to restart.',\n options,\n );\n }\n}\n","import type { MockLLMOptions } from \"../types/config.js\";\nimport { resolveContainerConfig } from \"./container.config.js\";\nimport { ContainerManager } from \"./container.manager.js\";\nimport { AdminClient } from \"./admin.client.js\";\nimport { GivenStubs } from \"../stubs/given.js\";\nimport { ExpectConditions } from \"../stubs/expect.js\";\nimport { ContainerNotStartedError } from \"../errors/lifecycle.errors.js\";\n\ntype MockLLMState = \"idle\" | \"starting\" | \"running\" | \"stopping\" | \"stopped\";\n\nexport class MockLLM {\n private state: MockLLMState = \"idle\";\n private startPromise: Promise<void> | null = null;\n private containerManager: ContainerManager;\n private adminClient: AdminClient | null = null;\n private _given: GivenStubs | null = null;\n private _expect: ExpectConditions | null = null;\n private _baseUrl: string | null = null;\n\n constructor(options?: MockLLMOptions) {\n const config = resolveContainerConfig(options);\n this.containerManager = new ContainerManager(config);\n }\n\n async start(): Promise<void> {\n if (this.state === \"running\") return;\n if (this.state === \"starting\" && this.startPromise) return this.startPromise;\n\n this.state = \"starting\";\n this.startPromise = this.doStart();\n return this.startPromise;\n }\n\n private async doStart(): Promise<void> {\n const { host, port } = await this.containerManager.start();\n this._baseUrl = `http://${host}:${port}`;\n this.adminClient = new AdminClient(this._baseUrl);\n this._given = new GivenStubs(this.adminClient);\n this._expect = new ExpectConditions(this.adminClient);\n this.state = \"running\";\n }\n\n async stop(): Promise<void> {\n if (this.state === \"stopped\" || this.state === \"idle\") return;\n this.state = \"stopping\";\n try {\n await this.containerManager.stop();\n } finally {\n this.state = \"stopped\";\n this.adminClient = null;\n this._given = null;\n this._expect = null;\n this._baseUrl = null;\n }\n }\n\n get baseUrl(): string {\n this.assertRunning();\n return this._baseUrl!;\n }\n\n get apiBaseUrl(): string {\n return `${this.baseUrl}/v1`;\n }\n\n get given(): GivenStubs {\n this.assertRunning();\n return this._given!;\n }\n\n get expect(): ExpectConditions {\n this.assertRunning();\n return this._expect!;\n }\n\n async clear(): Promise<void> {\n this.assertRunning();\n await this.adminClient!.clearStubs();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.stop();\n }\n\n private assertRunning(): void {\n if (this.state !== \"running\") {\n throw new ContainerNotStartedError();\n }\n }\n}\n","import { MockLLMError } from './base.js';\n\nexport class StubConfigurationError extends MockLLMError {\n readonly code = 'STUB_CONFIGURATION_INVALID' as const;\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors/base.ts","../src/errors/admin.errors.ts","../src/driver/admin.client.ts","../src/stubs/chat.builder.ts","../src/stubs/embedding.builder.ts","../src/stubs/models.builder.ts","../src/stubs/given.ts","../src/stubs/expect.ts","../src/errors/lifecycle.errors.ts","../src/server/stubs/stub.matcher.ts","../src/server/stubs/stub.registry.ts","../src/server/plugins/registry.plugin.ts","../src/server/plugins/auth.plugin.ts","../src/server/admin/admin.routes.ts","../src/server/utils/id.generator.ts","../src/server/utils/token.counter.ts","../src/server/responses/chat.response.ts","../src/server/responses/error.response.ts","../src/server/chat/chat.streaming.ts","../src/server/chat/chat.handler.ts","../src/server/chat/chat.routes.ts","../src/server/responses/embedding.response.ts","../src/server/embeddings/embeddings.handler.ts","../src/server/embeddings/embeddings.routes.ts","../src/server/models/models.routes.ts","../src/server/app.ts","../src/driver/mock-llm.ts","../src/errors/stub.errors.ts"],"names":["delay","randomUUID","fp","randomBytes","body","Fastify"],"mappings":"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","file":"index.cjs","sourcesContent":["export abstract class MockLLMError extends Error {\n abstract readonly code: string;\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = this.constructor.name;\n }\n}\n","import { MockLLMError } from './base.js';\n\nexport class AdminAPIError extends MockLLMError {\n readonly code = 'ADMIN_API_ERROR' as const;\n constructor(\n public readonly statusCode: number,\n public readonly responseBody: string,\n options?: { cause?: unknown },\n ) {\n super(\n `Admin API returned HTTP ${statusCode}: ${responseBody}`,\n options,\n );\n }\n}\n\nexport class AdminConnectionRefusedError extends MockLLMError {\n readonly code = 'ADMIN_CONNECTION_REFUSED' as const;\n constructor(options?: { cause?: unknown }) {\n super(\n 'Cannot connect to MockLLM admin API. The container may have crashed.',\n options,\n );\n }\n}\n\nexport class AdminTimeoutError extends MockLLMError {\n readonly code = 'ADMIN_TIMEOUT' as const;\n constructor(\n public readonly timeoutMs: number,\n options?: { cause?: unknown },\n ) {\n super(\n `Admin API did not respond within ${timeoutMs}ms.`,\n options,\n );\n }\n}\n","import {\n AdminConnectionRefusedError,\n AdminTimeoutError,\n AdminAPIError,\n} from \"../errors/admin.errors.js\";\nimport type {\n AdminStubDefinition,\n AdminHealthPayload,\n AdminRecordedRequestPayload,\n} from \"./admin.client.types.js\";\n\nconst REQUEST_TIMEOUT_MS = 5_000;\n\nexport class AdminClient {\n private pendingStubs: AdminStubDefinition[] = [];\n private pendingConfigs: Array<{ apiKey: string }> = [];\n\n constructor(private readonly baseUrl: string) {}\n\n enqueueStub(stub: AdminStubDefinition): void {\n this.pendingStubs.push(stub);\n }\n\n enqueueConfig(config: { apiKey: string }): void {\n this.pendingConfigs.push(config);\n }\n\n async flush(): Promise<void> {\n if (this.pendingConfigs.length > 0) {\n const configs = this.pendingConfigs.splice(0);\n for (const config of configs) {\n await this.post(\"/_admin/config\", config);\n }\n }\n\n if (this.pendingStubs.length > 0) {\n const stubs = this.pendingStubs.splice(0);\n await this.post(\"/_admin/stubs/batch\", { stubs });\n }\n }\n\n async clearStubs(): Promise<void> {\n await this.flush();\n await this.delete(\"/_admin/stubs\");\n }\n\n async getHealth(): Promise<AdminHealthPayload> {\n return this.get<AdminHealthPayload>(\"/_admin/health\");\n }\n\n async getRequests(): Promise<AdminRecordedRequestPayload[\"requests\"]> {\n await this.flush();\n const data = await this.get<AdminRecordedRequestPayload>(\"/_admin/requests\");\n return data.requests;\n }\n\n private async get<T>(path: string): Promise<T> {\n const response = await this.fetch(path, { method: \"GET\" });\n return (await response.json()) as T;\n }\n\n private async post<T>(path: string, body: unknown): Promise<T> {\n const response = await this.fetch(path, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n return (await response.json()) as T;\n }\n\n private async delete(path: string): Promise<void> {\n await this.fetch(path, { method: \"DELETE\" });\n }\n\n private async fetch(path: string, init: RequestInit): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n let response: Response;\n\n try {\n response = await fetch(url, {\n ...init,\n signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),\n });\n } catch (error: unknown) {\n if (error instanceof TypeError) {\n const cause = error.cause as { code?: string } | undefined;\n if (cause?.code === \"ECONNREFUSED\") {\n throw new AdminConnectionRefusedError({ cause: error });\n }\n }\n if (error instanceof DOMException && error.name === \"TimeoutError\") {\n throw new AdminTimeoutError(REQUEST_TIMEOUT_MS, { cause: error });\n }\n throw error;\n }\n\n if (!response.ok) {\n const body = await response.text();\n throw new AdminAPIError(response.status, body);\n }\n\n return response;\n }\n}\n","import type { AdminClient } from \"../driver/admin.client.js\";\nimport type { AdminStubMatcher } from \"../driver/admin.client.types.js\";\n\nexport class ChatCompletionStubBuilder {\n private readonly matcher: AdminStubMatcher = { endpoint: \"chat\" };\n\n constructor(private readonly adminClient: AdminClient) {}\n\n forModel(model: string): this {\n this.matcher.model = model;\n return this;\n }\n\n withMessageContaining(substring: string): this {\n this.matcher.content = substring;\n return this;\n }\n\n willReturn(content: string): void {\n this.adminClient.enqueueStub({\n matcher: this.matcher,\n response: { type: \"chat\", body: content },\n });\n }\n\n willStream(chunks: string[]): void {\n this.adminClient.enqueueStub({\n matcher: this.matcher,\n response: { type: \"streaming-chat\", chunks },\n });\n }\n\n willError(statusCode: number, message: string): void {\n this.adminClient.enqueueStub({\n matcher: this.matcher,\n response: {\n type: \"error\",\n status: statusCode,\n error: { message, type: \"api_error\", code: null },\n },\n });\n }\n}\n","import type { AdminClient } from \"../driver/admin.client.js\";\nimport type { AdminStubMatcher } from \"../driver/admin.client.types.js\";\n\nexport class EmbeddingStubBuilder {\n private readonly matcher: AdminStubMatcher = { endpoint: \"embeddings\" };\n\n constructor(private readonly adminClient: AdminClient) {}\n\n forModel(model: string): this {\n this.matcher.model = model;\n return this;\n }\n\n willReturn(vector: number[] | number[][]): void {\n const vectors = Array.isArray(vector[0])\n ? (vector as number[][])\n : [vector as number[]];\n\n this.adminClient.enqueueStub({\n matcher: this.matcher,\n response: { type: \"embedding\", vectors },\n });\n }\n\n willError(statusCode: number, message: string): void {\n this.adminClient.enqueueStub({\n matcher: this.matcher,\n response: {\n type: \"error\",\n status: statusCode,\n error: { message, type: \"api_error\", code: null },\n },\n });\n }\n}\n","import type { AdminClient } from \"../driver/admin.client.js\";\n\nexport class ModelsStubBuilder {\n constructor(private readonly adminClient: AdminClient) {}\n\n willReturn(models: Array<{ id: string; ownedBy?: string }>): void {\n this.adminClient.enqueueStub({\n matcher: {},\n response: { type: \"models\", models },\n });\n }\n}\n","import type { AdminClient } from \"../driver/admin.client.js\";\nimport { ChatCompletionStubBuilder } from \"./chat.builder.js\";\nimport { EmbeddingStubBuilder } from \"./embedding.builder.js\";\nimport { ModelsStubBuilder } from \"./models.builder.js\";\n\nexport class GivenStubs {\n constructor(private readonly adminClient: AdminClient) {}\n\n get chatCompletion(): ChatCompletionStubBuilder {\n return new ChatCompletionStubBuilder(this.adminClient);\n }\n\n get embedding(): EmbeddingStubBuilder {\n return new EmbeddingStubBuilder(this.adminClient);\n }\n\n get models(): ModelsStubBuilder {\n return new ModelsStubBuilder(this.adminClient);\n }\n}\n","import type { AdminClient } from \"../driver/admin.client.js\";\n\nexport class ExpectConditions {\n constructor(private readonly adminClient: AdminClient) {}\n\n apiKey(key: string): void {\n this.adminClient.enqueueConfig({ apiKey: key });\n }\n}\n","import { MockLLMError } from './base.js';\n\nexport class ContainerNotStartedError extends MockLLMError {\n readonly code = 'CONTAINER_NOT_STARTED' as const;\n constructor(options?: { cause?: unknown }) {\n super(\n 'MockLLM container is not running. Call `await mock.start()` before configuring stubs.',\n options,\n );\n }\n}\n\nexport class ContainerAlreadyStartedError extends MockLLMError {\n readonly code = 'CONTAINER_ALREADY_STARTED' as const;\n constructor(options?: { cause?: unknown }) {\n super(\n 'MockLLM container is already running. Call `await mock.stop()` first if you need to restart.',\n options,\n );\n }\n}\n","import type { StubMatcher, StubEntry } from \"./stub.types.js\";\n\nexport function matchModel(matcher: StubMatcher, model: string): boolean {\n if (matcher.model === undefined) return true;\n return matcher.model === model;\n}\n\nexport function matchContent(\n matcher: StubMatcher,\n messages: Array<{ role: string; content: string | null }>,\n): boolean {\n if (matcher.content === undefined) return true;\n const needle = matcher.content.toLowerCase();\n return messages.some(\n (m) =>\n m.role === \"user\" &&\n m.content !== null &&\n m.content.toLowerCase().includes(needle),\n );\n}\n\nexport function matchInput(\n matcher: StubMatcher,\n input: string | string[],\n): boolean {\n if (matcher.input === undefined) return true;\n const needle = matcher.input.toLowerCase();\n const items = Array.isArray(input) ? input : [input];\n return items.some((item) => item.toLowerCase().includes(needle));\n}\n\nexport function stubMatches(\n entry: StubEntry,\n endpoint: \"chat\" | \"embeddings\",\n model: string,\n messages?: Array<{ role: string; content: string | null }>,\n input?: string | string[],\n): boolean {\n const { matcher } = entry;\n\n if (matcher.endpoint !== undefined && matcher.endpoint !== endpoint) {\n return false;\n }\n\n if (!matchModel(matcher, model)) return false;\n\n if (messages !== undefined && !matchContent(matcher, messages)) return false;\n\n if (input !== undefined && !matchInput(matcher, input)) return false;\n\n return true;\n}\n\nexport function specificity(matcher: StubMatcher): number {\n let count = 0;\n if (matcher.model !== undefined) count++;\n if (matcher.content !== undefined) count++;\n if (matcher.input !== undefined) count++;\n return count;\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { StubMatcher, StubResponseConfig, StubEntry } from \"./stub.types.js\";\nimport { stubMatches, specificity } from \"./stub.matcher.js\";\nimport type { RecordedRequest } from \"../admin/admin.types.js\";\n\nexport class StubRegistry {\n private stubs: StubEntry[] = [];\n private requests: RecordedRequest[] = [];\n\n register(\n matcher: StubMatcher,\n response: StubResponseConfig,\n delay?: number,\n ): StubEntry {\n const entry: StubEntry = {\n id: randomUUID(),\n createdAt: Date.now(),\n matcher,\n response,\n delay: delay ?? 0,\n callCount: 0,\n };\n this.stubs.push(entry);\n return entry;\n }\n\n findMatch(\n endpoint: \"chat\" | \"embeddings\",\n model: string,\n messages?: Array<{ role: string; content: string | null }>,\n input?: string | string[],\n ): StubEntry | undefined {\n const matches = this.stubs.filter((s) =>\n stubMatches(s, endpoint, model, messages, input),\n );\n\n if (matches.length === 0) return undefined;\n\n matches.sort((a, b) => {\n const specDiff = specificity(b.matcher) - specificity(a.matcher);\n if (specDiff !== 0) return specDiff;\n return a.createdAt - b.createdAt;\n });\n\n const match = matches[0]!;\n match.callCount++;\n return match;\n }\n\n clear(): number {\n const count = this.stubs.length;\n this.stubs = [];\n return count;\n }\n\n getAll(): readonly StubEntry[] {\n return this.stubs;\n }\n\n recordRequest(request: RecordedRequest): void {\n this.requests.push(request);\n }\n\n getRequests(): readonly RecordedRequest[] {\n return this.requests;\n }\n\n clearRequests(): void {\n this.requests = [];\n }\n}\n","import fp from \"fastify-plugin\";\nimport type { FastifyPluginAsync } from \"fastify\";\nimport { StubRegistry } from \"../stubs/stub.registry.js\";\n\ndeclare module \"fastify\" {\n interface FastifyInstance {\n stubRegistry: StubRegistry;\n }\n}\n\nconst registryPlugin: FastifyPluginAsync = async (fastify) => {\n const registry = new StubRegistry();\n fastify.decorate(\"stubRegistry\", registry);\n};\n\nexport const stubRegistryPlugin = fp(registryPlugin, {\n name: \"stub-registry\",\n});\n","import fp from \"fastify-plugin\";\nimport type { FastifyPluginAsync } from \"fastify\";\n\nexport interface AuthConfig {\n apiKey: string | undefined;\n}\n\ndeclare module \"fastify\" {\n interface FastifyInstance {\n authConfig: AuthConfig;\n }\n}\n\nconst authPlugin: FastifyPluginAsync = async (fastify) => {\n const config: AuthConfig = {\n apiKey: process.env[\"PHANTOMLLM_API_KEY\"] || undefined,\n };\n\n fastify.decorate(\"authConfig\", config);\n\n fastify.addHook(\"onRequest\", async (request, reply) => {\n if (request.url.startsWith(\"/_admin\")) return;\n if (!fastify.authConfig.apiKey) return;\n\n const header = request.headers.authorization;\n if (!header) {\n return reply.status(401).send({\n error: {\n message:\n \"Missing Authorization header. Expected: Bearer <api-key>\",\n type: \"authentication_error\",\n param: null,\n code: \"missing_api_key\",\n },\n });\n }\n\n const token = header.replace(/^Bearer\\s+/i, \"\");\n if (token !== fastify.authConfig.apiKey) {\n return reply.status(401).send({\n error: {\n message: \"Invalid API key provided.\",\n type: \"authentication_error\",\n param: null,\n code: \"invalid_api_key\",\n },\n });\n }\n });\n};\n\nexport const apiKeyAuthPlugin = fp(authPlugin, { name: \"api-key-auth\" });\n","import type { FastifyPluginAsync, FastifyRequest, FastifyReply } from \"fastify\";\nimport type {\n RegisterStubRequest,\n RegisterStubBatchRequest,\n HealthResponse,\n ClearStubsResponse,\n} from \"./admin.types.js\";\n\nexport const adminRoutes: FastifyPluginAsync = async (fastify) => {\n fastify.post(\n \"/_admin/stubs\",\n async (\n request: FastifyRequest<{ Body: RegisterStubRequest }>,\n reply: FastifyReply,\n ) => {\n const { matcher, response, delay } = request.body;\n const stub = fastify.stubRegistry.register(matcher, response, delay);\n return reply.status(201).send({ id: stub.id, stub });\n },\n );\n\n fastify.post(\n \"/_admin/stubs/batch\",\n async (\n request: FastifyRequest<{ Body: RegisterStubBatchRequest }>,\n reply: FastifyReply,\n ) => {\n const { stubs: definitions } = request.body;\n const created = definitions.map((def) =>\n fastify.stubRegistry.register(def.matcher, def.response, def.delay),\n );\n return reply.status(201).send(created);\n },\n );\n\n fastify.delete(\"/_admin/stubs\", async (_request, reply: FastifyReply) => {\n const count = fastify.stubRegistry.clear();\n const body: ClearStubsResponse = { cleared: count };\n return reply.send(body);\n });\n\n fastify.get(\"/_admin/health\", async (_request, reply: FastifyReply) => {\n const body: HealthResponse = {\n status: \"ok\",\n stubCount: fastify.stubRegistry.getAll().length,\n uptime: process.uptime(),\n };\n return reply.send(body);\n });\n\n fastify.get(\"/_admin/requests\", async (_request, reply: FastifyReply) => {\n return reply.send({ requests: fastify.stubRegistry.getRequests() });\n });\n\n fastify.delete(\"/_admin/requests\", async (_request, reply: FastifyReply) => {\n fastify.stubRegistry.clearRequests();\n return reply.status(204).send();\n });\n\n fastify.post(\n \"/_admin/config\",\n async (\n request: FastifyRequest<{ Body: { apiKey?: string | null } }>,\n reply: FastifyReply,\n ) => {\n const { apiKey } = request.body;\n if (apiKey !== undefined) {\n fastify.authConfig.apiKey = apiKey ?? undefined;\n }\n return reply.send({ ok: true });\n },\n );\n};\n","import { randomBytes } from \"node:crypto\";\n\nexport function generateChatCompletionId(): string {\n return \"chatcmpl-\" + randomBytes(18).toString(\"base64url\").slice(0, 24);\n}\n\nexport function generateEmbeddingId(): string {\n return \"embd-\" + randomBytes(18).toString(\"base64url\").slice(0, 24);\n}\n","export function estimateTokens(text: string): number {\n return Math.max(1, Math.ceil(text.length / 4));\n}\n\nexport function estimatePromptTokens(\n messages: Array<{ role: string; content: string | null }>,\n): number {\n let tokens = 2; // framing overhead\n for (const msg of messages) {\n tokens += 4; // per-message overhead\n tokens += estimateTokens(msg.content ?? \"\");\n }\n return tokens;\n}\n","import type { ChatCompletionResponse } from \"../../types/openai.js\";\nimport { generateChatCompletionId } from \"../utils/id.generator.js\";\nimport { estimateTokens, estimatePromptTokens } from \"../utils/token.counter.js\";\n\nexport function buildChatCompletion(\n content: string,\n model: string,\n messages?: Array<{ role: string; content: string | null }>,\n): ChatCompletionResponse {\n const completionTokens = estimateTokens(content);\n const promptTokens = messages ? estimatePromptTokens(messages) : 0;\n\n return {\n id: generateChatCompletionId(),\n object: \"chat.completion\",\n created: Math.floor(Date.now() / 1000),\n model,\n system_fingerprint: \"fp_mock\",\n choices: [\n {\n index: 0,\n message: { role: \"assistant\", content },\n finish_reason: \"stop\",\n logprobs: null,\n },\n ],\n usage: {\n prompt_tokens: promptTokens,\n completion_tokens: completionTokens,\n total_tokens: promptTokens + completionTokens,\n },\n };\n}\n","import type { OpenAIErrorBody } from \"../../types/openai.js\";\n\nexport function buildErrorResponse(\n _status: number,\n message: string,\n type?: string,\n): OpenAIErrorBody {\n return {\n error: {\n message,\n type: type ?? \"invalid_request_error\",\n param: null,\n code: null,\n },\n };\n}\n\nexport function buildNoStubMatchResponse(\n method: string,\n path: string,\n model: string,\n messages?: unknown,\n): { status: number; body: OpenAIErrorBody } {\n const msgSummary =\n messages !== undefined ? ` messages=${JSON.stringify(messages)}` : \"\";\n\n return {\n status: 418,\n body: buildErrorResponse(\n 418,\n `No stub matched request: ${method} ${path} model=${model}${msgSummary}`,\n \"stub_not_found\",\n ),\n };\n}\n","import type { FastifyReply } from \"fastify\";\nimport type { ChatCompletionChunk } from \"../../types/openai.js\";\nimport { generateChatCompletionId } from \"../utils/id.generator.js\";\nimport {\n estimateTokens,\n estimatePromptTokens,\n} from \"../utils/token.counter.js\";\nimport type { ChatMessage } from \"../../types/openai.js\";\n\nfunction buildChunk(\n id: string,\n model: string,\n content: string,\n finishReason: \"stop\" | null,\n usage?: ChatCompletionChunk[\"usage\"],\n): ChatCompletionChunk {\n return {\n id,\n object: \"chat.completion.chunk\",\n created: Math.floor(Date.now() / 1000),\n model,\n system_fingerprint: \"fp_mock\",\n choices: [\n {\n index: 0,\n delta: finishReason === null ? { role: \"assistant\", content } : {},\n finish_reason: finishReason,\n logprobs: null,\n },\n ],\n usage: usage ?? null,\n };\n}\n\nfunction writeSSE(reply: FastifyReply, chunk: ChatCompletionChunk): void {\n reply.raw.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n}\n\nexport function streamChunks(\n reply: FastifyReply,\n model: string,\n chunks: string[],\n messages: ChatMessage[],\n includeUsage: boolean,\n): void {\n reply.raw.writeHead(200, {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n });\n reply.hijack();\n\n const id = generateChatCompletionId();\n\n for (const word of chunks) {\n writeSSE(reply, buildChunk(id, model, word, null));\n }\n\n const fullContent = chunks.join(\"\");\n const completionTokens = estimateTokens(fullContent);\n const promptTokens = estimatePromptTokens(messages);\n const usage = includeUsage\n ? {\n prompt_tokens: promptTokens,\n completion_tokens: completionTokens,\n total_tokens: promptTokens + completionTokens,\n }\n : undefined;\n\n writeSSE(reply, buildChunk(id, model, \"\", \"stop\", usage));\n reply.raw.write(\"data: [DONE]\\n\\n\");\n reply.raw.end();\n}\n","import type { FastifyRequest, FastifyReply } from \"fastify\";\nimport type { ChatCompletionRequest } from \"../../types/openai.js\";\nimport type { RecordedRequest } from \"../admin/admin.types.js\";\nimport { buildChatCompletion } from \"../responses/chat.response.js\";\nimport { buildNoStubMatchResponse } from \"../responses/error.response.js\";\nimport { streamChunks } from \"./chat.streaming.js\";\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nexport async function handleChatCompletion(\n request: FastifyRequest<{ Body: ChatCompletionRequest }>,\n reply: FastifyReply,\n): Promise<void> {\n const { model, messages, stream, stream_options } = request.body;\n const registry = request.server.stubRegistry;\n\n const recorded: RecordedRequest = {\n timestamp: Date.now(),\n method: request.method,\n path: request.url,\n headers: request.headers as Record<string, string>,\n body: request.body,\n };\n registry.recordRequest(recorded);\n\n const stub = registry.findMatch(\"chat\", model, messages);\n\n if (!stub) {\n const noMatch = buildNoStubMatchResponse(\n request.method,\n request.url,\n model,\n messages,\n );\n return reply.status(noMatch.status).send(noMatch.body);\n }\n\n if (stub.response.type === \"error\") {\n return reply.status(stub.response.status).send({\n error: {\n message: stub.response.error.message,\n type: stub.response.error.type,\n param: null,\n code: stub.response.error.code,\n },\n });\n }\n\n if (stub.delay > 0) {\n await delay(stub.delay);\n }\n\n if (stream === true) {\n const includeUsage = stream_options?.include_usage === true;\n const chunks: string[] =\n stub.response.type === \"streaming-chat\"\n ? stub.response.chunks\n : stub.response.type === \"chat\"\n ? stub.response.body.split(/(\\s+)/).filter((s) => s.length > 0)\n : [];\n\n streamChunks(reply, model, chunks, messages, includeUsage);\n return;\n }\n\n if (stub.response.type === \"chat\") {\n return reply.send(buildChatCompletion(stub.response.body, model, messages));\n }\n\n if (stub.response.type === \"streaming-chat\") {\n const fullContent = stub.response.chunks.join(\"\");\n return reply.send(buildChatCompletion(fullContent, model, messages));\n }\n}\n","import type { FastifyPluginAsync } from \"fastify\";\nimport { handleChatCompletion } from \"./chat.handler.js\";\n\nexport const chatRoutes: FastifyPluginAsync = async (fastify) => {\n fastify.post(\"/chat/completions\", handleChatCompletion);\n};\n","import type { EmbeddingResponse } from \"../../types/openai.js\";\nimport { estimateTokens } from \"../utils/token.counter.js\";\n\nexport function buildEmbeddingResponse(\n vectors: number[][],\n model: string,\n input: string | string[],\n): EmbeddingResponse {\n const inputs = Array.isArray(input) ? input : [input];\n const promptTokens = inputs.reduce(\n (sum, text) => sum + estimateTokens(text),\n 0,\n );\n\n return {\n object: \"list\",\n data: vectors.map((embedding, index) => ({\n object: \"embedding\" as const,\n index,\n embedding,\n })),\n model,\n usage: {\n prompt_tokens: promptTokens,\n total_tokens: promptTokens,\n },\n };\n}\n","import type { FastifyRequest, FastifyReply } from \"fastify\";\nimport type { EmbeddingRequest } from \"../../types/openai.js\";\nimport type { RecordedRequest } from \"../admin/admin.types.js\";\nimport { buildEmbeddingResponse } from \"../responses/embedding.response.js\";\n\nconst DEFAULT_DIMENSION = 1536;\n\nfunction zeroVector(dim: number): number[] {\n return new Array<number>(dim).fill(0);\n}\n\nexport async function handleEmbeddings(\n request: FastifyRequest<{ Body: EmbeddingRequest }>,\n reply: FastifyReply,\n): Promise<void> {\n const { model, input } = request.body;\n const registry = request.server.stubRegistry;\n\n const recorded: RecordedRequest = {\n timestamp: Date.now(),\n method: request.method,\n path: request.url,\n headers: request.headers as Record<string, string>,\n body: request.body,\n };\n registry.recordRequest(recorded);\n\n const stub = registry.findMatch(\"embeddings\", model, undefined, input);\n\n if (stub && stub.response.type === \"error\") {\n return reply.status(stub.response.status).send({\n error: {\n message: stub.response.error.message,\n type: stub.response.error.type,\n param: null,\n code: stub.response.error.code,\n },\n });\n }\n\n if (stub && stub.response.type === \"embedding\") {\n return reply.send(\n buildEmbeddingResponse(stub.response.vectors, model, input),\n );\n }\n\n const inputs = Array.isArray(input) ? input : [input];\n const vectors = inputs.map(() => zeroVector(DEFAULT_DIMENSION));\n return reply.send(buildEmbeddingResponse(vectors, model, input));\n}\n","import type { FastifyPluginAsync } from \"fastify\";\nimport { handleEmbeddings } from \"./embeddings.handler.js\";\n\nexport const embeddingsRoutes: FastifyPluginAsync = async (fastify) => {\n fastify.post(\"/embeddings\", handleEmbeddings);\n};\n","import type { FastifyPluginAsync } from \"fastify\";\nimport type { ModelListResponse, ModelObject } from \"../../types/openai.js\";\n\nconst DEFAULT_MODELS: ModelObject[] = [\n { id: \"gpt-4\", object: \"model\", created: 1687882411, owned_by: \"openai\" },\n { id: \"gpt-4o\", object: \"model\", created: 1715367049, owned_by: \"openai\" },\n {\n id: \"gpt-3.5-turbo\",\n object: \"model\",\n created: 1677610602,\n owned_by: \"openai\",\n },\n {\n id: \"text-embedding-3-small\",\n object: \"model\",\n created: 1705948997,\n owned_by: \"openai\",\n },\n];\n\nexport const modelsRoutes: FastifyPluginAsync = async (fastify) => {\n fastify.get(\"/models\", async (_request, reply) => {\n const registry = fastify.stubRegistry;\n const allStubs = registry.getAll();\n const modelsStub = allStubs.find((s) => s.response.type === \"models\");\n\n if (modelsStub) {\n modelsStub.callCount++;\n const config = modelsStub.response;\n if (config.type !== \"models\") return;\n\n const data: ModelObject[] = config.models.map((m) => ({\n id: m.id,\n object: \"model\" as const,\n created: Math.floor(Date.now() / 1000),\n owned_by: m.ownedBy ?? \"phantomllm\",\n }));\n\n const body: ModelListResponse = { object: \"list\", data };\n return reply.send(body);\n }\n\n const body: ModelListResponse = { object: \"list\", data: DEFAULT_MODELS };\n return reply.send(body);\n });\n};\n","import Fastify from \"fastify\";\nimport { stubRegistryPlugin } from \"./plugins/registry.plugin.js\";\nimport { apiKeyAuthPlugin } from \"./plugins/auth.plugin.js\";\nimport { adminRoutes } from \"./admin/admin.routes.js\";\nimport { chatRoutes } from \"./chat/chat.routes.js\";\nimport { embeddingsRoutes } from \"./embeddings/embeddings.routes.js\";\nimport { modelsRoutes } from \"./models/models.routes.js\";\n\nexport async function buildApp(\n opts: Record<string, unknown> = {},\n): Promise<ReturnType<typeof Fastify>> {\n const app = Fastify(opts);\n\n await app.register(stubRegistryPlugin);\n await app.register(apiKeyAuthPlugin);\n await app.register(adminRoutes);\n await app.register(chatRoutes, { prefix: \"/v1\" });\n await app.register(embeddingsRoutes, { prefix: \"/v1\" });\n await app.register(modelsRoutes, { prefix: \"/v1\" });\n\n return app;\n}\n","import { AdminClient } from \"./admin.client.js\";\nimport { GivenStubs } from \"../stubs/given.js\";\nimport { ExpectConditions } from \"../stubs/expect.js\";\nimport { ContainerNotStartedError } from \"../errors/lifecycle.errors.js\";\nimport { buildApp } from \"../server/app.js\";\n\ntype MockLLMState = \"idle\" | \"starting\" | \"running\" | \"stopping\" | \"stopped\";\n\nexport class MockLLM {\n private state: MockLLMState = \"idle\";\n private startPromise: Promise<void> | null = null;\n private app: Awaited<ReturnType<typeof buildApp>> | null = null;\n private adminClient: AdminClient | null = null;\n private _given: GivenStubs | null = null;\n private _expect: ExpectConditions | null = null;\n private _baseUrl: string | null = null;\n\n async start(): Promise<void> {\n if (this.state === \"running\") return;\n if (this.state === \"starting\" && this.startPromise) return this.startPromise;\n\n this.state = \"starting\";\n this.startPromise = this.doStart();\n return this.startPromise;\n }\n\n private async doStart(): Promise<void> {\n this.app = await buildApp({ logger: false });\n await this.app.listen({ port: 0, host: \"127.0.0.1\" });\n\n const address = this.app.server.address();\n const port = typeof address === \"object\" && address ? address.port : 0;\n this._baseUrl = `http://127.0.0.1:${port}`;\n this.adminClient = new AdminClient(this._baseUrl);\n this._given = new GivenStubs(this.adminClient);\n this._expect = new ExpectConditions(this.adminClient);\n this.state = \"running\";\n }\n\n async stop(): Promise<void> {\n if (this.state === \"stopped\" || this.state === \"idle\") return;\n this.state = \"stopping\";\n try {\n if (this.app) {\n await this.app.close();\n }\n } finally {\n this.state = \"stopped\";\n this.app = null;\n this.adminClient = null;\n this._given = null;\n this._expect = null;\n this._baseUrl = null;\n }\n }\n\n get baseUrl(): string {\n this.assertRunning();\n return this._baseUrl!;\n }\n\n get apiBaseUrl(): string {\n return `${this.baseUrl}/v1`;\n }\n\n get given(): GivenStubs {\n this.assertRunning();\n return this._given!;\n }\n\n get expect(): ExpectConditions {\n this.assertRunning();\n return this._expect!;\n }\n\n async clear(): Promise<void> {\n this.assertRunning();\n await this.adminClient!.clearStubs();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.stop();\n }\n\n private assertRunning(): void {\n if (this.state !== \"running\") {\n throw new ContainerNotStartedError();\n }\n }\n}\n","import { MockLLMError } from './base.js';\n\nexport class StubConfigurationError extends MockLLMError {\n readonly code = 'STUB_CONFIGURATION_INVALID' as const;\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n }\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
interface MockLLMOptions {
|
|
2
|
-
image?: string;
|
|
3
|
-
containerPort?: number;
|
|
4
|
-
reuse?: boolean;
|
|
5
|
-
startupTimeout?: number;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
1
|
interface AdminStubMatcher {
|
|
9
2
|
model?: string;
|
|
10
3
|
content?: string;
|
|
@@ -126,12 +119,11 @@ declare class ExpectConditions {
|
|
|
126
119
|
declare class MockLLM {
|
|
127
120
|
private state;
|
|
128
121
|
private startPromise;
|
|
129
|
-
private
|
|
122
|
+
private app;
|
|
130
123
|
private adminClient;
|
|
131
124
|
private _given;
|
|
132
125
|
private _expect;
|
|
133
126
|
private _baseUrl;
|
|
134
|
-
constructor(options?: MockLLMOptions);
|
|
135
127
|
start(): Promise<void>;
|
|
136
128
|
private doStart;
|
|
137
129
|
stop(): Promise<void>;
|
|
@@ -239,4 +231,4 @@ interface EmbeddingResponse {
|
|
|
239
231
|
};
|
|
240
232
|
}
|
|
241
233
|
|
|
242
|
-
export { type ChatCompletionChunk, type ChatCompletionRequest, type ChatCompletionResponse, ContainerNotStartedError, type EmbeddingRequest, type EmbeddingResponse, MockLLM, MockLLMError,
|
|
234
|
+
export { type ChatCompletionChunk, type ChatCompletionRequest, type ChatCompletionResponse, ContainerNotStartedError, type EmbeddingRequest, type EmbeddingResponse, MockLLM, MockLLMError, StubConfigurationError };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
interface MockLLMOptions {
|
|
2
|
-
image?: string;
|
|
3
|
-
containerPort?: number;
|
|
4
|
-
reuse?: boolean;
|
|
5
|
-
startupTimeout?: number;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
1
|
interface AdminStubMatcher {
|
|
9
2
|
model?: string;
|
|
10
3
|
content?: string;
|
|
@@ -126,12 +119,11 @@ declare class ExpectConditions {
|
|
|
126
119
|
declare class MockLLM {
|
|
127
120
|
private state;
|
|
128
121
|
private startPromise;
|
|
129
|
-
private
|
|
122
|
+
private app;
|
|
130
123
|
private adminClient;
|
|
131
124
|
private _given;
|
|
132
125
|
private _expect;
|
|
133
126
|
private _baseUrl;
|
|
134
|
-
constructor(options?: MockLLMOptions);
|
|
135
127
|
start(): Promise<void>;
|
|
136
128
|
private doStart;
|
|
137
129
|
stop(): Promise<void>;
|
|
@@ -239,4 +231,4 @@ interface EmbeddingResponse {
|
|
|
239
231
|
};
|
|
240
232
|
}
|
|
241
233
|
|
|
242
|
-
export { type ChatCompletionChunk, type ChatCompletionRequest, type ChatCompletionResponse, ContainerNotStartedError, type EmbeddingRequest, type EmbeddingResponse, MockLLM, MockLLMError,
|
|
234
|
+
export { type ChatCompletionChunk, type ChatCompletionRequest, type ChatCompletionResponse, ContainerNotStartedError, type EmbeddingRequest, type EmbeddingResponse, MockLLM, MockLLMError, StubConfigurationError };
|