Skip to content

Commit ecc105f

Browse files
committed
Update generate.ts
1 parent aac8e98 commit ecc105f

File tree

1 file changed

+30
-5
lines changed

1 file changed

+30
-5
lines changed

src/lib/server/textGeneration/generate.ts

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { generateSummaryOfReasoning } from "./reasoning";
1313
import { logger } from "../logger";
1414
import { getMcpServers } from "$lib/server/mcp/registry";
1515
import { getOpenAiToolsForMcp } from "$lib/server/mcp/tools";
16+
import type { OpenAiTool } from "$lib/server/mcp/tools";
1617
import { callMcpTool } from "$lib/server/mcp/httpClient";
1718
import { archSelectRoute } from "$lib/server/router/arch";
1819
import { getRoutes, resolveRouteModels } from "$lib/server/router/policy";
@@ -54,6 +55,20 @@ type ToolRun = {
5455
output: string;
5556
};
5657

58+
function buildToolPreprompt(tools: OpenAiTool[]): string {
59+
if (!Array.isArray(tools) || tools.length === 0) {
60+
return "";
61+
}
62+
63+
return `When using tools follow those rules:
64+
65+
- Decompose the user's request into distinct goals. When it mentions multiple entities (e.g., "X and Y") or sub-questions, issue a separate tool call for each.
66+
- When a tool can produce information more accurately or faster than guessing, call it.
67+
- After each tool result, check whether every part of the user's request is resolved. If not, refine the query or call another tool.
68+
- When tool outputs include URLs, cite them inline using numbered Markdown links such as ([1](https://...)). Reuse numbers for repeat URLs and never invent links.
69+
- Base the final answer solely on tool results; if the results leave gaps, say you don't know, and mention the tool names you used.`;
70+
}
71+
5772
type RunMcpFlowContext = Pick<
5873
TextGenerationContext,
5974
"model" | "conv" | "assistant" | "forceMultimodal" | "locals"
@@ -181,14 +196,24 @@ async function* runMcpFlow({
181196
};
182197

183198
let messagesOpenAI: ChatCompletionMessageParam[] = messages.map(toOpenAiMessage);
199+
const toolPreprompt = buildToolPreprompt(oaTools);
200+
const prepromptPieces: string[] = [];
201+
if (toolPreprompt.trim().length > 0) {
202+
prepromptPieces.push(toolPreprompt);
203+
}
204+
if (typeof preprompt === "string" && preprompt.trim().length > 0) {
205+
prepromptPieces.push(preprompt);
206+
}
207+
const mergedPreprompt = prepromptPieces.join("\n\n");
184208
const hasSystemMessage = messagesOpenAI.length > 0 && messagesOpenAI[0]?.role === "system";
185209
if (hasSystemMessage) {
186-
if (preprompt !== undefined) {
187-
const existing = messagesOpenAI[0].content || "";
188-
messagesOpenAI[0].content = preprompt + (existing ? "\n\n" + existing : "");
210+
if (mergedPreprompt.length > 0) {
211+
const existing = messagesOpenAI[0].content ?? "";
212+
const existingText = typeof existing === "string" ? existing : "";
213+
messagesOpenAI[0].content = mergedPreprompt + (existingText ? "\n\n" + existingText : "");
189214
}
190-
} else {
191-
messagesOpenAI = [{ role: "system", content: preprompt ?? "" }, ...messagesOpenAI];
215+
} else if (mergedPreprompt.length > 0) {
216+
messagesOpenAI = [{ role: "system", content: mergedPreprompt }, ...messagesOpenAI];
192217
}
193218

194219
if (

0 commit comments

Comments
 (0)