diff --git a/src/main/proxy/server.ts b/src/main/proxy/server.ts index d11c7708..2386e8a1 100644 --- a/src/main/proxy/server.ts +++ b/src/main/proxy/server.ts @@ -7,6 +7,7 @@ import Koa, { type Context, type Next } from 'koa' import Router from '@koa/router' import bodyParser from 'koa-bodyparser' import { Server as HttpServer } from 'http' +import { app } from 'electron' import routes from './routes' import managementRoutes from './routes/management' import { proxyStatusManager } from './status' @@ -41,7 +42,7 @@ export class ProxyServer { this.app.use(async (ctx, next) => { ctx.set('Access-Control-Allow-Origin', '*') ctx.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS') - ctx.set('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With') + ctx.set('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With, X-API-Key, X-Management-Secret, X-Web-Search, X-Reasoning-Effort, X-Deep-Research') ctx.set('Access-Control-Max-Age', '86400') if (ctx.method === 'OPTIONS') { @@ -163,7 +164,7 @@ export class ProxyServer { this.router.get('/', async (ctx) => { ctx.body = { name: 'Chat2API Proxy', - version: '1.1.2', + version: app.getVersion(), description: 'OpenAI API compatible proxy service', endpoints: [ 'POST /v1/chat/completions', diff --git a/src/preload/index.ts b/src/preload/index.ts index 982dffde..0b267a4e 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -638,8 +638,9 @@ function resolveLocalManagementApiBaseUrl(config: AppConfig): string { const host = configuredHost === '0.0.0.0' || configuredHost === '::' || configuredHost === '[::]' ? '127.0.0.1' : configuredHost + const managementApiPort = config.managementApi?.managementApiPort || config.proxyPort - return `http://${host}:${config.proxyPort}/v0/management` + return `http://${host}:${managementApiPort}/v0/management` } const toolCallingAPI = { diff --git a/src/renderer/src/components/settings/ManagementApiSettings.tsx b/src/renderer/src/components/settings/ManagementApiSettings.tsx index 6c001ec6..7d497db7 100644 --- a/src/renderer/src/components/settings/ManagementApiSettings.tsx +++ b/src/renderer/src/components/settings/ManagementApiSettings.tsx @@ -103,7 +103,8 @@ export function ManagementApiSettings() { return secret.slice(0, 4) + '****' + secret.slice(-4) } - const apiEndpoint = `http://127.0.0.1:${proxyPort}/v0/management` + const managementApiPort = config.managementApiPort || proxyPort + const apiEndpoint = `http://127.0.0.1:${managementApiPort}/v0/management` if (isLoading) { return ( diff --git a/tests/renderer/header-proxy-address.test.mjs b/tests/renderer/header-proxy-address.test.mjs index 37d0f4f8..a491d1c6 100644 --- a/tests/renderer/header-proxy-address.test.mjs +++ b/tests/renderer/header-proxy-address.test.mjs @@ -27,7 +27,8 @@ test('tool calling smoke uses a local management API URL that is actually served assert.match(preloadSource, /function resolveLocalManagementApiBaseUrl\(config: AppConfig\)/) assert.match(preloadSource, /configuredHost === '0\.0\.0\.0'/) - assert.match(preloadSource, /return `http:\/\/\$\{host\}:\$\{config\.proxyPort\}\/v0\/management`/) - assert.doesNotMatch(preloadSource, /managementApi\?\.managementApiPort \|\| config\.proxyPort/) - assert.match(managementSettingsSource, /const apiEndpoint = `http:\/\/127\.0\.0\.1:\$\{proxyPort\}\/v0\/management`/) + assert.match(preloadSource, /managementApi\?\.managementApiPort \|\| config\.proxyPort/) + assert.match(preloadSource, /return `http:\/\/\$\{host\}:\$\{managementApiPort\}\/v0\/management`/) + assert.match(managementSettingsSource, /config\.managementApiPort \|\| proxyPort/) + assert.match(managementSettingsSource, /const apiEndpoint = `http:\/\/127\.0\.0\.1:\$\{managementApiPort\}\/v0\/management`/) })