From 91ea2da58589373bd03e01695a30008afcf091cd Mon Sep 17 00:00:00 2001 From: Nate Date: Fri, 9 May 2025 21:14:37 -0700 Subject: [PATCH 1/5] fix inception/deepseek openai-adapters and test --- packages/openai-adapters/package.json | 2 +- packages/openai-adapters/src/apis/DeepSeek.ts | 6 ++- .../openai-adapters/src/apis/Inception.ts | 6 ++- .../openai-adapters/src/test/main.test.ts | 44 +++++++++++++++++++ 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/packages/openai-adapters/package.json b/packages/openai-adapters/package.json index 766b93eb51..f12af0ba29 100644 --- a/packages/openai-adapters/package.json +++ b/packages/openai-adapters/package.json @@ -1,6 +1,6 @@ { "name": "@continuedev/openai-adapters", - "version": "1.0.21", + "version": "1.0.22", "description": "", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/openai-adapters/src/apis/DeepSeek.ts b/packages/openai-adapters/src/apis/DeepSeek.ts index cd2c70dbd8..a79298d4fd 100644 --- a/packages/openai-adapters/src/apis/DeepSeek.ts +++ b/packages/openai-adapters/src/apis/DeepSeek.ts @@ -6,11 +6,13 @@ import { OpenAIApi } from "./OpenAI.js"; import { FimCreateParamsStreaming } from "./base.js"; export class DeepSeekApi extends OpenAIApi { - apiBase: string = "https://api.deepseek.com/"; + static apiBase: string = "https://api.deepseek.com/"; + constructor(config: DeepseekConfig) { super({ ...config, provider: "openai", + apiBase: config.apiBase ?? DeepSeekApi.apiBase, }); } @@ -18,7 +20,7 @@ export class DeepSeekApi extends OpenAIApi { body: FimCreateParamsStreaming, signal: AbortSignal, ): AsyncGenerator { - const endpoint = new URL("beta/completions", this.apiBase); + const endpoint = new URL("beta/completions", DeepSeekApi.apiBase); const resp = await customFetch(this.config.requestOptions)(endpoint, { method: "POST", body: JSON.stringify({ diff --git a/packages/openai-adapters/src/apis/Inception.ts b/packages/openai-adapters/src/apis/Inception.ts index 35d585bb8f..5fe3f31b26 100644 --- a/packages/openai-adapters/src/apis/Inception.ts +++ b/packages/openai-adapters/src/apis/Inception.ts @@ -6,11 +6,13 @@ import { OpenAIApi } from "./OpenAI.js"; import { FimCreateParamsStreaming } from "./base.js"; export class InceptionApi extends OpenAIApi { - apiBase: string = "https://api.inceptionlabs.ai/v1/"; + static apiBase: string = "https://api.inceptionlabs.ai/v1/"; + constructor(config: InceptionConfig) { super({ ...config, provider: "openai", + apiBase: config.apiBase ?? InceptionApi.apiBase, }); } @@ -18,7 +20,7 @@ export class InceptionApi extends OpenAIApi { body: FimCreateParamsStreaming, signal: AbortSignal, ): AsyncGenerator { - const endpoint = new URL("completions", this.apiBase); + const endpoint = new URL("completions", InceptionApi.apiBase); const resp = await customFetch(this.config.requestOptions)(endpoint, { method: "POST", body: JSON.stringify({ diff --git a/packages/openai-adapters/src/test/main.test.ts b/packages/openai-adapters/src/test/main.test.ts index 4222216ff4..41d5e36599 100644 --- a/packages/openai-adapters/src/test/main.test.ts +++ b/packages/openai-adapters/src/test/main.test.ts @@ -1,5 +1,9 @@ import { ModelConfig } from "@continuedev/config-yaml"; import * as dotenv from "dotenv"; +import { DeepSeekApi } from "../apis/DeepSeek.js"; +import { InceptionApi } from "../apis/Inception.js"; +import { OpenAIApi } from "../apis/OpenAI.js"; +import { constructLlmApi } from "../index.js"; import { getLlmApi, testChat, testCompletion, testEmbed } from "./util.js"; dotenv.config(); @@ -108,3 +112,43 @@ TESTS.forEach((config) => { testConfig({ name: config.model, ...config }); }); }); + +describe("Configuration", () => { + it("should configure DeepSeek OpenAI client with correct apiBase and apiKey", () => { + const deepseek = constructLlmApi({ + provider: "deepseek", + apiKey: "sk-xxx", + }); + + expect((deepseek as OpenAIApi).openai.baseURL).toBe(DeepSeekApi.apiBase); + expect((deepseek as OpenAIApi).openai.apiKey).toBe("sk-xxx"); + + const deepseek2 = constructLlmApi({ + provider: "deepseek", + apiKey: "sk-xxx", + apiBase: "https://api.example.com", + }); + expect((deepseek2 as OpenAIApi).openai.baseURL).toBe( + "https://api.example.com", + ); + }); + + it("should configure Inception OpenAI client with correct apiBase and apiKey", () => { + const inception = constructLlmApi({ + provider: "inception", + apiKey: "sk-xxx", + }); + + expect((inception as OpenAIApi).openai.baseURL).toBe(InceptionApi.apiBase); + expect((inception as OpenAIApi).openai.apiKey).toBe("sk-xxx"); + + const inception2 = constructLlmApi({ + provider: "inception", + apiKey: "sk-xxx", + apiBase: "https://api.example.com", + }); + expect((inception2 as OpenAIApi).openai.baseURL).toBe( + "https://api.example.com", + ); + }); +}); From d13583ab3a4818c99bf79347bb49173e0f26111c Mon Sep 17 00:00:00 2001 From: Nate Date: Fri, 9 May 2025 21:15:11 -0700 Subject: [PATCH 2/5] bump openai-adapters version in core --- core/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/package.json b/core/package.json index 9332baa21c..8c2754589e 100644 --- a/core/package.json +++ b/core/package.json @@ -50,7 +50,7 @@ "@continuedev/config-yaml": "file:../packages/config-yaml", "@continuedev/fetch": "^1.0.6", "@continuedev/llm-info": "^1.0.8", - "@continuedev/openai-adapters": "^1.0.19", + "@continuedev/openai-adapters": "^1.0.22", "@modelcontextprotocol/sdk": "^1.5.0", "@mozilla/readability": "^0.5.0", "@octokit/rest": "^20.1.1", From b9f901bf7b5d8d4ebd0ff7cde08538853b98cc64 Mon Sep 17 00:00:00 2001 From: Nate Date: Sat, 10 May 2025 19:24:57 -0700 Subject: [PATCH 3/5] don't use static property --- packages/openai-adapters/package.json | 2 +- packages/openai-adapters/src/apis/DeepSeek.ts | 7 +++---- packages/openai-adapters/src/apis/Inception.ts | 7 +++---- packages/openai-adapters/src/test/main.test.ts | 8 ++++---- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/packages/openai-adapters/package.json b/packages/openai-adapters/package.json index f12af0ba29..a7d40943d8 100644 --- a/packages/openai-adapters/package.json +++ b/packages/openai-adapters/package.json @@ -1,6 +1,6 @@ { "name": "@continuedev/openai-adapters", - "version": "1.0.22", + "version": "1.0.23", "description": "", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/openai-adapters/src/apis/DeepSeek.ts b/packages/openai-adapters/src/apis/DeepSeek.ts index a79298d4fd..da6a78386f 100644 --- a/packages/openai-adapters/src/apis/DeepSeek.ts +++ b/packages/openai-adapters/src/apis/DeepSeek.ts @@ -5,14 +5,13 @@ import { chatChunk, customFetch } from "../util.js"; import { OpenAIApi } from "./OpenAI.js"; import { FimCreateParamsStreaming } from "./base.js"; +export const DEEPSEEK_API_BASE = "https://api.deepseek.com/"; export class DeepSeekApi extends OpenAIApi { - static apiBase: string = "https://api.deepseek.com/"; - constructor(config: DeepseekConfig) { super({ ...config, provider: "openai", - apiBase: config.apiBase ?? DeepSeekApi.apiBase, + apiBase: config.apiBase ?? DEEPSEEK_API_BASE, }); } @@ -20,7 +19,7 @@ export class DeepSeekApi extends OpenAIApi { body: FimCreateParamsStreaming, signal: AbortSignal, ): AsyncGenerator { - const endpoint = new URL("beta/completions", DeepSeekApi.apiBase); + const endpoint = new URL("beta/completions", this.config.apiBase); const resp = await customFetch(this.config.requestOptions)(endpoint, { method: "POST", body: JSON.stringify({ diff --git a/packages/openai-adapters/src/apis/Inception.ts b/packages/openai-adapters/src/apis/Inception.ts index 5fe3f31b26..47e8104f52 100644 --- a/packages/openai-adapters/src/apis/Inception.ts +++ b/packages/openai-adapters/src/apis/Inception.ts @@ -5,14 +5,13 @@ import { chatChunk, customFetch } from "../util.js"; import { OpenAIApi } from "./OpenAI.js"; import { FimCreateParamsStreaming } from "./base.js"; +export const INCEPTION_API_BASE = "https://api.inceptionlabs.ai/v1/"; export class InceptionApi extends OpenAIApi { - static apiBase: string = "https://api.inceptionlabs.ai/v1/"; - constructor(config: InceptionConfig) { super({ ...config, provider: "openai", - apiBase: config.apiBase ?? InceptionApi.apiBase, + apiBase: config.apiBase ?? INCEPTION_API_BASE, }); } @@ -20,7 +19,7 @@ export class InceptionApi extends OpenAIApi { body: FimCreateParamsStreaming, signal: AbortSignal, ): AsyncGenerator { - const endpoint = new URL("completions", InceptionApi.apiBase); + const endpoint = new URL("completions", this.config.apiBase); const resp = await customFetch(this.config.requestOptions)(endpoint, { method: "POST", body: JSON.stringify({ diff --git a/packages/openai-adapters/src/test/main.test.ts b/packages/openai-adapters/src/test/main.test.ts index 41d5e36599..d1aff84e0a 100644 --- a/packages/openai-adapters/src/test/main.test.ts +++ b/packages/openai-adapters/src/test/main.test.ts @@ -1,7 +1,7 @@ import { ModelConfig } from "@continuedev/config-yaml"; import * as dotenv from "dotenv"; -import { DeepSeekApi } from "../apis/DeepSeek.js"; -import { InceptionApi } from "../apis/Inception.js"; +import { DEEPSEEK_API_BASE } from "../apis/DeepSeek.js"; +import { INCEPTION_API_BASE } from "../apis/Inception.js"; import { OpenAIApi } from "../apis/OpenAI.js"; import { constructLlmApi } from "../index.js"; import { getLlmApi, testChat, testCompletion, testEmbed } from "./util.js"; @@ -120,7 +120,7 @@ describe("Configuration", () => { apiKey: "sk-xxx", }); - expect((deepseek as OpenAIApi).openai.baseURL).toBe(DeepSeekApi.apiBase); + expect((deepseek as OpenAIApi).openai.baseURL).toBe(DEEPSEEK_API_BASE); expect((deepseek as OpenAIApi).openai.apiKey).toBe("sk-xxx"); const deepseek2 = constructLlmApi({ @@ -139,7 +139,7 @@ describe("Configuration", () => { apiKey: "sk-xxx", }); - expect((inception as OpenAIApi).openai.baseURL).toBe(InceptionApi.apiBase); + expect((inception as OpenAIApi).openai.baseURL).toBe(INCEPTION_API_BASE); expect((inception as OpenAIApi).openai.apiKey).toBe("sk-xxx"); const inception2 = constructLlmApi({ From 6d85b8353fd4044c540fb160c639afef47bb3ad4 Mon Sep 17 00:00:00 2001 From: Nate Date: Sat, 10 May 2025 19:33:25 -0700 Subject: [PATCH 4/5] build and bump again --- packages/openai-adapters/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/openai-adapters/package.json b/packages/openai-adapters/package.json index a7d40943d8..b66fa7edf5 100644 --- a/packages/openai-adapters/package.json +++ b/packages/openai-adapters/package.json @@ -1,6 +1,6 @@ { "name": "@continuedev/openai-adapters", - "version": "1.0.23", + "version": "1.0.24", "description": "", "main": "dist/index.js", "types": "dist/index.d.ts", From 9c13b5eca83d7c6bb15d639a5ab0a90aa1a432b1 Mon Sep 17 00:00:00 2001 From: Nate Date: Sun, 25 May 2025 18:26:18 -0700 Subject: [PATCH 5/5] this this.apiBase instead of this.config.apiBase --- packages/openai-adapters/src/apis/DeepSeek.ts | 2 +- packages/openai-adapters/src/apis/Inception.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/openai-adapters/src/apis/DeepSeek.ts b/packages/openai-adapters/src/apis/DeepSeek.ts index da6a78386f..0beba18fee 100644 --- a/packages/openai-adapters/src/apis/DeepSeek.ts +++ b/packages/openai-adapters/src/apis/DeepSeek.ts @@ -19,7 +19,7 @@ export class DeepSeekApi extends OpenAIApi { body: FimCreateParamsStreaming, signal: AbortSignal, ): AsyncGenerator { - const endpoint = new URL("beta/completions", this.config.apiBase); + const endpoint = new URL("beta/completions", this.apiBase); const resp = await customFetch(this.config.requestOptions)(endpoint, { method: "POST", body: JSON.stringify({ diff --git a/packages/openai-adapters/src/apis/Inception.ts b/packages/openai-adapters/src/apis/Inception.ts index 47e8104f52..99795517a6 100644 --- a/packages/openai-adapters/src/apis/Inception.ts +++ b/packages/openai-adapters/src/apis/Inception.ts @@ -19,7 +19,7 @@ export class InceptionApi extends OpenAIApi { body: FimCreateParamsStreaming, signal: AbortSignal, ): AsyncGenerator { - const endpoint = new URL("completions", this.config.apiBase); + const endpoint = new URL("completions", this.apiBase); const resp = await customFetch(this.config.requestOptions)(endpoint, { method: "POST", body: JSON.stringify({