Fix : Codex on cursor

This commit is contained in:
decolua
2026-03-01 15:35:41 +07:00
parent a84477e815
commit a7365c5a4e
4 changed files with 24 additions and 1 deletions

View File

@@ -12,3 +12,20 @@ export const FORMATS = {
CURSOR: "cursor"
};
// Map endpoint suffix → source format (takes priority over body-based detection)
const ENDPOINT_FORMAT_MAP = {
"/v1/responses": FORMATS.OPENAI_RESPONSES,
"/v1/chat/completions": FORMATS.OPENAI,
};
/**
* Detect source format from request URL pathname.
* Returns null if no matching endpoint found.
*/
export function detectFormatByEndpoint(pathname) {
for (const [segment, format] of Object.entries(ENDPOINT_FORMAT_MAP)) {
if (pathname.includes(segment)) return format;
}
return null;
}

View File

@@ -143,6 +143,9 @@ export function openaiResponsesToOpenAIRequest(model, body, stream, credentials)
* Convert OpenAI Chat Completions to OpenAI Responses API format
*/
export function openaiToOpenAIResponsesRequest(model, body, stream, credentials) {
// Body already in Responses API format (e.g. Cursor CLI calling /chat/completions with input[])
if (body.input) return { ...body, model, stream: true };
const result = {
model,
input: [],

View File

@@ -1,6 +1,6 @@
{
"name": "9router-app",
"version": "0.3.18",
"version": "0.3.19",
"description": "9Router web dashboard",
"private": true,
"scripts": {

View File

@@ -13,6 +13,7 @@ import { handleChatCore } from "open-sse/handlers/chatCore.js";
import { errorResponse, unavailableResponse } from "open-sse/utils/error.js";
import { handleComboChat } from "open-sse/services/combo.js";
import { HTTP_STATUS } from "open-sse/config/constants.js";
import { detectFormatByEndpoint } from "open-sse/translator/formats.js";
import * as log from "../utils/logger.js";
import { updateProviderCredentials, checkAndRefreshToken } from "../services/tokenRefresh.js";
import { getProjectIdForConnection } from "open-sse/services/projectId.js";
@@ -180,6 +181,8 @@ async function handleSingleModelChat(body, modelStr, clientRawRequest = null, re
connectionId: credentials.connectionId,
userAgent,
apiKey,
// Detect source format by endpoint — /chat/completions is always openai, /responses is always openai-responses
sourceFormatOverride: request?.url ? detectFormatByEndpoint(new URL(request.url).pathname) : null,
onCredentialsRefreshed: async (newCreds) => {
await updateProviderCredentials(credentials.connectionId, {
accessToken: newCreds.accessToken,