-
Notifications
You must be signed in to change notification settings - Fork 61k
Qwen #6538
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Qwen #6538
Changes from 2 commits
861d854
4aaa9db
e3fc9ee
cdeb278
b07760f
ee25e4a
8af4d7a
a043f03
4ec717f
972f957
b42c515
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,22 +1,16 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { getServerSideConfig } from "@/app/config/server"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ALIBABA_BASE_URL, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ApiPath, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ModelProvider, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ServiceProvider, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} from "@/app/constant"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { ALIBABA_BASE_URL, ApiPath, ModelProvider } from "@/app/constant"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { prettyObject } from "@/app/utils/format"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { NextRequest, NextResponse } from "next/server"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { auth } from "@/app/api/auth"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { isModelNotavailableInServer } from "@/app/utils/model"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const serverConfig = getServerSideConfig(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export async function handle( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
req: NextRequest, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ params }: { params: { path: string[] } }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
console.log("[Alibaba Route] params ", params); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// console.log("[Alibaba Route] params ", params); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (req.method === "OPTIONS") { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return NextResponse.json({ body: "OK" }, { status: 200 }); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -83,28 +77,36 @@ async function request(req: NextRequest) { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (serverConfig.customModels && req.body) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const clonedBody = await req.text(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fetchOptions.body = clonedBody; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let jsonBody: any = {}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
jsonBody = JSON.parse(clonedBody); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
delete jsonBody.model; // Remove the model key | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fetchOptions.body = JSON.stringify(jsonBody); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} catch (e) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fetchOptions.body = clonedBody; // fallback if not JSON | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const jsonBody = JSON.parse(clonedBody) as { model?: string }; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
console.log("[Alibaba] request body", fetchOptions.body); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
let jsonBody: any = {}; | |
try { | |
jsonBody = JSON.parse(clonedBody); | |
delete jsonBody.model; // Remove the model key | |
fetchOptions.body = JSON.stringify(jsonBody); | |
} catch (e) { | |
fetchOptions.body = clonedBody; // fallback if not JSON | |
} | |
const jsonBody = JSON.parse(clonedBody) as { model?: string }; | |
console.log("[Alibaba] request body", fetchOptions.body); | |
// Read the raw request body | |
const clonedBody = await req.text(); | |
try { | |
// Parse JSON and remove `model` via destructuring | |
const jsonBody = JSON.parse(clonedBody); | |
const { model, ...bodyWithoutModel } = jsonBody; | |
fetchOptions.body = JSON.stringify(bodyWithoutModel); | |
} catch (parseError) { | |
// Improved error handling | |
console.warn("[Alibaba] Failed to parse request body as JSON:", parseError); | |
fetchOptions.body = clonedBody; // fallback if not JSON | |
} | |
console.log("[Alibaba] request body", fetchOptions.body); |
🧰 Tools
🪛 Biome (1.9.4)
[error] 84-84: Avoid the delete operator which can impact performance.
Unsafe fix: Use an undefined assignment instead.
(lint/performance/noDelete)
🤖 Prompt for AI Agents
In app/api/alibaba.ts around lines 80 to 90, avoid using the delete operator on
the parsed JSON object to improve performance by instead creating a new object
that excludes the 'model' key. Additionally, enhance error handling by catching
and logging the JSON parsing error before falling back to using the original
clonedBody as the fetch body.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Remove commented model availability check code.
This large block of commented code should either be removed entirely if no longer needed, or uncommented and fixed if the functionality is still required.
If this functionality is no longer needed, remove the commented code:
- // not undefined and is false
- // if (
- // isModelNotavailableInServer(
- // serverConfig.customModels,
- // jsonBody?.model as string,
- // ServiceProvider.Alibaba as string,
- // )
- // ) {
- // return NextResponse.json(
- // {
- // error: true,
- // message: `you are not allowed to use ${jsonBody?.model} model`,
- // },
- // {
- // status: 403,
- // },
- // );
- // }
If this functionality should be retained, please uncomment and ensure the imports are available.
Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In app/api/alibaba.ts between lines 93 and 109, there is a large block of
commented-out code checking model availability. Determine if this model
availability check is still required; if not, remove the entire commented block
to clean up the code. If it is needed, uncomment the code and verify that all
necessary imports, such as isModelNotavailableInServer and ServiceProvider, are
correctly included and the logic works as intended.
Original file line number | Diff line number | Diff line change | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
@@ -151,7 +151,8 @@ export class DeepSeekApi implements LLMApi { | |||||||||
controller, | ||||||||||
// parseSSE | ||||||||||
(text: string, runTools: ChatMessageTool[]) => { | ||||||||||
// console.log("parseSSE", text, runTools); | ||||||||||
console.log("parseSSE", text, runTools); | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Make debug logging conditional or remove it. The enabled debug log will add noise to production logs and potentially expose sensitive data. Consider making it conditional based on a debug flag or environment variable. - console.log("parseSSE", text, runTools);
+ if (process.env.NODE_ENV === 'development' || process.env.DEBUG_DEEPSEEK) {
+ console.log("parseSSE", text, runTools);
+ } Or if debugging is no longer needed: - console.log("parseSSE", text, runTools); 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents
|
||||||||||
|
||||||||||
const json = JSON.parse(text); | ||||||||||
const choices = json.choices as Array<{ | ||||||||||
delta: { | ||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -153,81 +153,35 @@ export class SiliconflowApi implements LLMApi { | |
tools as any, | ||
funcs, | ||
controller, | ||
// parseSSE | ||
// parseSSE mới cho SiliconFlow response | ||
(text: string, runTools: ChatMessageTool[]) => { | ||
// console.log("parseSSE", text, runTools); | ||
// Parse chuỗi JSON trả về thành đối tượng | ||
const json = JSON.parse(text); | ||
const choices = json.choices as Array<{ | ||
delta: { | ||
content: string | null; | ||
tool_calls: ChatMessageTool[]; | ||
reasoning_content: string | null; | ||
}; | ||
}>; | ||
const tool_calls = choices[0]?.delta?.tool_calls; | ||
if (tool_calls?.length > 0) { | ||
const index = tool_calls[0]?.index; | ||
const id = tool_calls[0]?.id; | ||
const args = tool_calls[0]?.function?.arguments; | ||
if (id) { | ||
runTools.push({ | ||
id, | ||
type: tool_calls[0]?.type, | ||
function: { | ||
name: tool_calls[0]?.function?.name as string, | ||
arguments: args, | ||
}, | ||
}); | ||
} else { | ||
// @ts-ignore | ||
runTools[index]["function"]["arguments"] += args; | ||
} | ||
} | ||
const reasoning = choices[0]?.delta?.reasoning_content; | ||
const content = choices[0]?.delta?.content; | ||
|
||
// Skip if both content and reasoning_content are empty or null | ||
if ( | ||
(!reasoning || reasoning.length === 0) && | ||
(!content || content.length === 0) | ||
) { | ||
return { | ||
isThinking: false, | ||
content: "", | ||
}; | ||
} | ||
// Lấy nội dung trả lời từ output.text | ||
const content = json?.output?.text ?? ""; | ||
|
||
if (reasoning && reasoning.length > 0) { | ||
return { | ||
isThinking: true, | ||
content: reasoning, | ||
}; | ||
} else if (content && content.length > 0) { | ||
// Nếu không có nội dung trả lời, trả về trạng thái không suy nghĩ và nội dung rỗng | ||
if (!content || content.length === 0) { | ||
return { | ||
isThinking: false, | ||
content: content, | ||
content: "", | ||
}; | ||
} | ||
|
||
// Trả về trạng thái không suy nghĩ và nội dung trả lời | ||
return { | ||
isThinking: false, | ||
content: "", | ||
content: content, | ||
}; | ||
}, | ||
// processToolMessage, include tool_calls message and tool call results | ||
// processToolMessage: SiliconFlow không có tool_call nên giữ nguyên hoặc để rỗng | ||
( | ||
requestPayload: RequestPayload, | ||
toolCallMessage: any, | ||
toolCallResult: any[], | ||
) => { | ||
// @ts-ignore | ||
requestPayload?.messages?.splice( | ||
// @ts-ignore | ||
requestPayload?.messages?.length, | ||
0, | ||
toolCallMessage, | ||
...toolCallResult, | ||
); | ||
// Không cần xử lý tool_call, có thể để trống hoặc giữ nguyên nếu muốn tương thích | ||
}, | ||
Comment on lines
+156
to
185
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Verification correctAddress code commenting language consistency and verify functional completeness. The code has several issues that need attention:
Apply this diff to fix the language consistency: - // parseSSE mới cho SiliconFlow response
+ // New parseSSE for SiliconFlow response
(text: string, runTools: ChatMessageTool[]) => {
- // Parse chuỗi JSON trả về thành đối tượng
+ // Parse JSON response string to object
const json = JSON.parse(text);
- // Lấy nội dung trả lời từ output.text
+ // Extract response content from output.text
const content = json?.output?.text ?? "";
- // Nếu không có nội dung trả lời, trả về trạng thái không suy nghĩ và nội dung rỗng
+ // If no response content, return non-thinking state with empty content
if (!content || content.length === 0) {
return {
isThinking: false,
content: "",
};
}
- // Trả về trạng thái không suy nghĩ và nội dung trả lời
+ // Return non-thinking state with response content
return {
isThinking: false,
content: content,
};
},
- // processToolMessage: SiliconFlow không có tool_call nên giữ nguyên hoặc để rỗng
+ // processToolMessage: SiliconFlow does not support tool calls
(
requestPayload: RequestPayload,
toolCallMessage: any,
toolCallResult: any[],
) => {
- // Không cần xử lý tool_call, có thể để trống hoặc giữ nguyên nếu muốn tương thích
+ // No tool call processing needed for SiliconFlow
}, Please verify that removing tool call functionality doesn't break existing features: 🏁 Script executed: #!/bin/bash
# Description: Check if SiliconFlow was previously using tool calls
# Expected: Find any references to tool calls in SiliconFlow context
echo "Searching for tool call usage in SiliconFlow context..."
rg -A 3 -B 3 "tool.*call.*siliconflow|siliconflow.*tool.*call" --ignore-case
echo "Searching for SiliconFlow model configurations..."
rg -A 5 "siliconflow.*tool|tool.*siliconflow" --ignore-case
echo "Checking for any SiliconFlow tool call tests..."
fd -e test.ts -e spec.ts --exec rg -l "siliconflow.*tool" {} \; Length of output: 1488 Address code commenting language consistency and verify functional completeness. The code has several issues that need attention:
Apply this diff to fix the language consistency: - // parseSSE mới cho SiliconFlow response
+ // New parseSSE for SiliconFlow response
(text: string, runTools: ChatMessageTool[]) => {
- // Parse chuỗi JSON trả về thành đối tượng
+ // Parse JSON response string to object
const json = JSON.parse(text);
- // Lấy nội dung trả lời từ output.text
+ // Extract response content from output.text
const content = json?.output?.text ?? "";
- // Nếu không có nội dung trả lời, trả về trạng thái không suy nghĩ và nội dung rỗng
+ // If no response content, return non-thinking state with empty content
if (!content || content.length === 0) {
return {
isThinking: false,
content: "",
};
}
- // Trả về trạng thái không suy nghĩ và nội dung trả lời
+ // Return non-thinking state with response content
return {
isThinking: false,
content: content,
};
},
- // processToolMessage: SiliconFlow không có tool_call nên giữ nguyên hoặc để rỗng
+ // processToolMessage: SiliconFlow does not support tool calls
(
requestPayload: RequestPayload,
toolCallMessage: any,
toolCallResult: any[],
) => {
- // Không cần xử lý tool_call, có thể để trống hoặc giữ nguyên nếu muốn tương thích
+ // No tool call processing needed for SiliconFlow
}, Please verify that removing tool call functionality doesn't break existing features: #!/bin/bash
# Description: Check if SiliconFlow was previously using tool calls
# Expected: Find any references to tool calls in SiliconFlow context
echo "Searching for tool call usage in SiliconFlow context..."
rg -A 3 -B 3 "tool.*call.*siliconflow|siliconflow.*tool.*call" --ignore-case
echo "Searching for SiliconFlow model configurations..."
rg -A 5 "siliconflow.*tool|tool.*siliconflow" --ignore-case
echo "Checking for any SiliconFlow tool call tests..."
fd -e test.ts -e spec.ts --exec rg -l "siliconflow.*tool" {} \; 🤖 Prompt for AI Agents
|
||
options, | ||
); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Remove commented console.log statements instead of leaving them commented out.
Commented-out debug logs should be removed entirely to keep the codebase clean, rather than left as commented code.
Also applies to: 30-30, 65-65, 81-81, 103-103, 131-131, 138-138, 159-159
🤖 Prompt for AI Agents