Updating ask sage models to support tool calling. Plan and Agent mode now work correctly.
This commit is contained in:
@@ -4,6 +4,8 @@ import {
|
||||
CompletionOptions,
|
||||
LLMOptions,
|
||||
TextMessagePart,
|
||||
Tool,
|
||||
ToolCallDelta,
|
||||
} from "../../index.js";
|
||||
import { BaseLLM } from "../index.js";
|
||||
|
||||
@@ -61,15 +63,26 @@ interface AskSageRequestArgs {
|
||||
file?: unknown;
|
||||
}
|
||||
|
||||
interface AskSageToolCall {
|
||||
id: string;
|
||||
type: "function";
|
||||
function: {
|
||||
name: string;
|
||||
arguments: string;
|
||||
};
|
||||
}
|
||||
|
||||
interface AskSageResponse {
|
||||
text?: string;
|
||||
answer?: string;
|
||||
message?: string;
|
||||
status?: number | string;
|
||||
response?: unknown;
|
||||
tool_calls?: AskSageToolCall[];
|
||||
choices?: Array<{
|
||||
message?: {
|
||||
content?: string;
|
||||
tool_calls?: AskSageToolCall[];
|
||||
};
|
||||
}>;
|
||||
}
|
||||
@@ -185,6 +198,17 @@ class Asksage extends BaseLLM {
|
||||
};
|
||||
}
|
||||
|
||||
protected _convertToolToAskSageTool(tool: Tool): AskSageTool {
|
||||
return {
|
||||
type: tool.type,
|
||||
function: {
|
||||
name: tool.function.name,
|
||||
description: tool.function.description,
|
||||
parameters: tool.function.parameters,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
protected _convertArgs(
|
||||
options: AskSageCompletionOptions,
|
||||
messages: ChatMessage[],
|
||||
@@ -196,6 +220,14 @@ class Asksage extends BaseLLM {
|
||||
formattedMessage = messages.map(this._convertMessage);
|
||||
}
|
||||
|
||||
// Convert standard tools to AskSage format, or use askSageTools if provided
|
||||
const tools =
|
||||
options.tools?.map((tool) => this._convertToolToAskSageTool(tool)) ??
|
||||
options.askSageTools;
|
||||
|
||||
// Map standard toolChoice to AskSage format, or use askSageToolChoice if provided
|
||||
const toolChoice = options.toolChoice ?? options.askSageToolChoice;
|
||||
|
||||
const args: AskSageRequestArgs = {
|
||||
message: formattedMessage,
|
||||
model: options.model,
|
||||
@@ -207,10 +239,8 @@ class Asksage extends BaseLLM {
|
||||
options.systemPrompt ??
|
||||
process.env.ASKSAGE_SYSTEM_PROMPT ??
|
||||
"You are an expert software developer. You give helpful and concise responses.",
|
||||
tools: options.askSageTools,
|
||||
// enabled_mcp_tools: options.enabledMcpTools as string[] | undefined,
|
||||
// tools_to_execute: options.toolsToExecute as string[] | undefined,
|
||||
tool_choice: options.askSageToolChoice,
|
||||
tools,
|
||||
tool_choice: toolChoice,
|
||||
reasoning_effort: options.reasoningEffort as
|
||||
| "low"
|
||||
| "medium"
|
||||
@@ -391,6 +421,22 @@ class Asksage extends BaseLLM {
|
||||
|
||||
const data = (await response.json()) as AskSageResponse;
|
||||
|
||||
// Extract tool calls from response (check both top-level and choices format)
|
||||
const rawToolCalls =
|
||||
data.tool_calls || data.choices?.[0]?.message?.tool_calls;
|
||||
|
||||
// Convert to ToolCallDelta format if present
|
||||
const toolCalls: ToolCallDelta[] | undefined = rawToolCalls?.map(
|
||||
(tc) => ({
|
||||
id: tc.id,
|
||||
type: tc.type,
|
||||
function: {
|
||||
name: tc.function.name,
|
||||
arguments: tc.function.arguments,
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
const assistantMessage: ChatMessage = {
|
||||
role: "assistant",
|
||||
content:
|
||||
@@ -399,6 +445,7 @@ class Asksage extends BaseLLM {
|
||||
data.message ||
|
||||
data.choices?.[0]?.message?.content ||
|
||||
"",
|
||||
...(toolCalls && toolCalls.length > 0 ? { toolCalls } : {}),
|
||||
};
|
||||
|
||||
yield assistantMessage;
|
||||
|
||||
Reference in New Issue
Block a user