fix: honor registered DeepSeek endpoint
This commit is contained in:
parent
bc169824fc
commit
380fca2b9f
2 changed files with 24 additions and 3 deletions
|
|
@ -1,5 +1,11 @@
|
||||||
const DEFAULT_TIMEOUT_MS = 45_000;
|
const DEFAULT_TIMEOUT_MS = 45_000;
|
||||||
|
|
||||||
|
function completionEndpoint(apiUrl) {
|
||||||
|
const value = String(apiUrl || "").replace(/\/+$/, "");
|
||||||
|
if (/\/chat\/completions$/i.test(value)) return value;
|
||||||
|
return `${value}/chat/completions`;
|
||||||
|
}
|
||||||
|
|
||||||
function extractJson(text) {
|
function extractJson(text) {
|
||||||
const value = String(text || "").trim();
|
const value = String(text || "").trim();
|
||||||
if (!value) throw new Error("model_response_empty");
|
if (!value) throw new Error("model_response_empty");
|
||||||
|
|
@ -36,7 +42,7 @@ export class DeepSeekJsonClient {
|
||||||
const controller = new AbortController();
|
const controller = new AbortController();
|
||||||
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
||||||
try {
|
try {
|
||||||
const response = await this.fetchImpl(`${this.apiUrl}/chat/completions`, {
|
const response = await this.fetchImpl(completionEndpoint(this.apiUrl), {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
headers: {
|
headers: {
|
||||||
authorization: `Bearer ${this.apiKey}`,
|
authorization: `Bearer ${this.apiKey}`,
|
||||||
|
|
@ -78,4 +84,4 @@ export class DeepSeekJsonClient {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export { extractJson };
|
export { completionEndpoint, extractJson };
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,27 @@
|
||||||
import assert from "node:assert/strict";
|
import assert from "node:assert/strict";
|
||||||
import test from "node:test";
|
import test from "node:test";
|
||||||
import { DeepSeekJsonClient, extractJson } from "./model-client.mjs";
|
import {
|
||||||
|
DeepSeekJsonClient,
|
||||||
|
completionEndpoint,
|
||||||
|
extractJson,
|
||||||
|
} from "./model-client.mjs";
|
||||||
|
|
||||||
test("extractJson accepts strict JSON and fenced JSON", () => {
|
test("extractJson accepts strict JSON and fenced JSON", () => {
|
||||||
assert.deepEqual(extractJson('{"ok":true}'), { ok: true });
|
assert.deepEqual(extractJson('{"ok":true}'), { ok: true });
|
||||||
assert.deepEqual(extractJson('```json\n{"ok":true}\n```'), { ok: true });
|
assert.deepEqual(extractJson('```json\n{"ok":true}\n```'), { ok: true });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("completionEndpoint accepts either a base URL or a complete registered endpoint", () => {
|
||||||
|
assert.equal(
|
||||||
|
completionEndpoint("https://api.deepseek.com/v1"),
|
||||||
|
"https://api.deepseek.com/v1/chat/completions",
|
||||||
|
);
|
||||||
|
assert.equal(
|
||||||
|
completionEndpoint("https://api.deepseek.com/chat/completions"),
|
||||||
|
"https://api.deepseek.com/chat/completions",
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
test("DeepSeek client sends the secret only as authorization and returns JSON", async () => {
|
test("DeepSeek client sends the secret only as authorization and returns JSON", async () => {
|
||||||
let observed;
|
let observed;
|
||||||
const client = new DeepSeekJsonClient({
|
const client = new DeepSeekJsonClient({
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue