refactor: Cleanup
This commit is contained in:
parent
6daa39994c
commit
5dfc520d67
|
|
@ -26,8 +26,8 @@
|
||||||
import { mcpClient } from '$lib/clients';
|
import { mcpClient } from '$lib/clients';
|
||||||
import { ChatService } from '$lib/services';
|
import { ChatService } from '$lib/services';
|
||||||
import { config } from '$lib/stores/settings.svelte';
|
import { config } from '$lib/stores/settings.svelte';
|
||||||
import { getAgenticConfig, toAgenticMessages } from '$lib/utils';
|
import { agenticStore } from '$lib/stores/agentic.svelte';
|
||||||
import type { AgenticMessage, AgenticToolCallList } from '$lib/types/agentic';
|
import type { AgenticMessage, AgenticToolCallList, AgenticConfig } from '$lib/types/agentic';
|
||||||
import type {
|
import type {
|
||||||
ApiChatCompletionToolCall,
|
ApiChatCompletionToolCall,
|
||||||
ApiChatMessageData,
|
ApiChatMessageData,
|
||||||
|
|
@ -49,6 +49,45 @@ import type {
|
||||||
} from '$lib/types/database';
|
} from '$lib/types/database';
|
||||||
import { AttachmentType, MessageRole } from '$lib/enums';
|
import { AttachmentType, MessageRole } from '$lib/enums';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts API messages to agentic format.
|
||||||
|
*/
|
||||||
|
function toAgenticMessages(messages: ApiChatMessageData[]): AgenticMessage[] {
|
||||||
|
return messages.map((message) => {
|
||||||
|
if (
|
||||||
|
message.role === MessageRole.ASSISTANT &&
|
||||||
|
message.tool_calls &&
|
||||||
|
message.tool_calls.length > 0
|
||||||
|
) {
|
||||||
|
return {
|
||||||
|
role: MessageRole.ASSISTANT,
|
||||||
|
content: message.content,
|
||||||
|
tool_calls: message.tool_calls.map((call, index) => ({
|
||||||
|
id: call.id ?? `call_${index}`,
|
||||||
|
type: (call.type as 'function') ?? 'function',
|
||||||
|
function: {
|
||||||
|
name: call.function?.name ?? '',
|
||||||
|
arguments: call.function?.arguments ?? ''
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
} satisfies AgenticMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (message.role === MessageRole.TOOL && message.tool_call_id) {
|
||||||
|
return {
|
||||||
|
role: MessageRole.TOOL,
|
||||||
|
tool_call_id: message.tool_call_id,
|
||||||
|
content: typeof message.content === 'string' ? message.content : ''
|
||||||
|
} satisfies AgenticMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
role: message.role as MessageRole.SYSTEM | MessageRole.USER,
|
||||||
|
content: message.content
|
||||||
|
} satisfies AgenticMessage;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
export interface AgenticFlowCallbacks {
|
export interface AgenticFlowCallbacks {
|
||||||
onChunk?: (chunk: string) => void;
|
onChunk?: (chunk: string) => void;
|
||||||
onReasoningChunk?: (chunk: string) => void;
|
onReasoningChunk?: (chunk: string) => void;
|
||||||
|
|
@ -158,7 +197,7 @@ export class AgenticClient {
|
||||||
} = callbacks;
|
} = callbacks;
|
||||||
|
|
||||||
// Get agentic configuration (considering per-chat MCP overrides)
|
// Get agentic configuration (considering per-chat MCP overrides)
|
||||||
const agenticConfig = getAgenticConfig(config(), perChatOverrides);
|
const agenticConfig = agenticStore.getConfig(config(), perChatOverrides);
|
||||||
if (!agenticConfig.enabled) {
|
if (!agenticConfig.enabled) {
|
||||||
return { handled: false };
|
return { handled: false };
|
||||||
}
|
}
|
||||||
|
|
@ -243,7 +282,7 @@ export class AgenticClient {
|
||||||
messages: ApiChatMessageData[];
|
messages: ApiChatMessageData[];
|
||||||
options: AgenticFlowOptions;
|
options: AgenticFlowOptions;
|
||||||
tools: ReturnType<typeof mcpClient.getToolDefinitionsForLLM>;
|
tools: ReturnType<typeof mcpClient.getToolDefinitionsForLLM>;
|
||||||
agenticConfig: ReturnType<typeof getAgenticConfig>;
|
agenticConfig: AgenticConfig;
|
||||||
callbacks: AgenticFlowCallbacks;
|
callbacks: AgenticFlowCallbacks;
|
||||||
signal?: AbortSignal;
|
signal?: AbortSignal;
|
||||||
}): Promise<void> {
|
}): Promise<void> {
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,9 @@ import {
|
||||||
normalizeModelName,
|
normalizeModelName,
|
||||||
filterByLeafNodeId,
|
filterByLeafNodeId,
|
||||||
findDescendantMessages,
|
findDescendantMessages,
|
||||||
findLeafNode,
|
findLeafNode
|
||||||
getAgenticConfig
|
|
||||||
} from '$lib/utils';
|
} from '$lib/utils';
|
||||||
|
import { agenticStore } from '$lib/stores/agentic.svelte';
|
||||||
import { DEFAULT_CONTEXT } from '$lib/constants/default-context';
|
import { DEFAULT_CONTEXT } from '$lib/constants/default-context';
|
||||||
import { SYSTEM_MESSAGE_PLACEHOLDER } from '$lib/constants/ui';
|
import { SYSTEM_MESSAGE_PLACEHOLDER } from '$lib/constants/ui';
|
||||||
import { REASONING_TAGS } from '$lib/constants/agentic';
|
import { REASONING_TAGS } from '$lib/constants/agentic';
|
||||||
|
|
@ -687,7 +687,7 @@ export class ChatClient {
|
||||||
};
|
};
|
||||||
|
|
||||||
const perChatOverrides = conversationsStore.activeConversation?.mcpServerOverrides;
|
const perChatOverrides = conversationsStore.activeConversation?.mcpServerOverrides;
|
||||||
const agenticConfig = getAgenticConfig(config(), perChatOverrides);
|
const agenticConfig = agenticStore.getConfig(config(), perChatOverrides);
|
||||||
if (agenticConfig.enabled) {
|
if (agenticConfig.enabled) {
|
||||||
const agenticResult = await agenticClient.runAgenticFlow({
|
const agenticResult = await agenticClient.runAgenticFlow({
|
||||||
conversationId: assistantMessage.convId,
|
conversationId: assistantMessage.convId,
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,11 @@
|
||||||
|
|
||||||
import { browser } from '$app/environment';
|
import { browser } from '$app/environment';
|
||||||
import type { AgenticFlowParams, AgenticFlowResult } from '$lib/clients';
|
import type { AgenticFlowParams, AgenticFlowResult } from '$lib/clients';
|
||||||
import type { AgenticSession } from '$lib/types/agentic';
|
import type { AgenticSession, AgenticConfig } from '$lib/types/agentic';
|
||||||
|
import type { SettingsConfigType } from '$lib/types/settings';
|
||||||
|
import type { McpServerOverride } from '$lib/types/database';
|
||||||
|
import { DEFAULT_AGENTIC_CONFIG } from '$lib/constants/agentic';
|
||||||
|
import { mcpStore } from '$lib/stores/mcp.svelte';
|
||||||
import { agenticClient } from '$lib/clients/agentic.client';
|
import { agenticClient } from '$lib/clients/agentic.client';
|
||||||
|
|
||||||
export type {
|
export type {
|
||||||
|
|
@ -212,6 +216,30 @@ class AgenticStore {
|
||||||
clearError(conversationId: string): void {
|
clearError(conversationId: string): void {
|
||||||
this.updateSession(conversationId, { lastError: null });
|
this.updateSession(conversationId, { lastError: null });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Configuration
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the current agentic configuration.
|
||||||
|
* Automatically disables agentic mode if no MCP servers are configured.
|
||||||
|
* @param settings - Global settings configuration
|
||||||
|
* @param perChatOverrides - Optional per-chat MCP server overrides
|
||||||
|
*/
|
||||||
|
getConfig(settings: SettingsConfigType, perChatOverrides?: McpServerOverride[]): AgenticConfig {
|
||||||
|
const maxTurns = Number(settings.agenticMaxTurns) || DEFAULT_AGENTIC_CONFIG.maxTurns;
|
||||||
|
const maxToolPreviewLines =
|
||||||
|
Number(settings.agenticMaxToolPreviewLines) || DEFAULT_AGENTIC_CONFIG.maxToolPreviewLines;
|
||||||
|
|
||||||
|
return {
|
||||||
|
enabled: mcpStore.hasEnabledServers(perChatOverrides) && DEFAULT_AGENTIC_CONFIG.enabled,
|
||||||
|
maxTurns,
|
||||||
|
maxToolPreviewLines
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const agenticStore = new AgenticStore();
|
export const agenticStore = new AgenticStore();
|
||||||
|
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
import type { ApiChatMessageData } from '$lib/types/api';
|
|
||||||
import type { AgenticMessage, AgenticConfig } from '$lib/types/agentic';
|
|
||||||
import type { SettingsConfigType } from '$lib/types/settings';
|
|
||||||
import type { McpServerOverride } from '$lib/types/database';
|
|
||||||
import { DEFAULT_AGENTIC_CONFIG } from '$lib/constants/agentic';
|
|
||||||
import { mcpStore } from '$lib/stores/mcp.svelte';
|
|
||||||
import { MessageRole } from '$lib/enums';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the current agentic configuration.
|
|
||||||
* Automatically disables agentic mode if no MCP servers are configured.
|
|
||||||
* @param settings - Global settings configuration
|
|
||||||
* @param perChatOverrides - Optional per-chat MCP server overrides
|
|
||||||
*/
|
|
||||||
export function getAgenticConfig(
|
|
||||||
settings: SettingsConfigType,
|
|
||||||
perChatOverrides?: McpServerOverride[]
|
|
||||||
): AgenticConfig {
|
|
||||||
const maxTurns = Number(settings.agenticMaxTurns) || DEFAULT_AGENTIC_CONFIG.maxTurns;
|
|
||||||
const maxToolPreviewLines =
|
|
||||||
Number(settings.agenticMaxToolPreviewLines) || DEFAULT_AGENTIC_CONFIG.maxToolPreviewLines;
|
|
||||||
|
|
||||||
return {
|
|
||||||
enabled: mcpStore.hasEnabledServers(perChatOverrides) && DEFAULT_AGENTIC_CONFIG.enabled,
|
|
||||||
maxTurns,
|
|
||||||
maxToolPreviewLines
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts API messages to agentic format.
|
|
||||||
*/
|
|
||||||
export function toAgenticMessages(messages: ApiChatMessageData[]): AgenticMessage[] {
|
|
||||||
return messages.map((message) => {
|
|
||||||
if (
|
|
||||||
message.role === MessageRole.ASSISTANT &&
|
|
||||||
message.tool_calls &&
|
|
||||||
message.tool_calls.length > 0
|
|
||||||
) {
|
|
||||||
return {
|
|
||||||
role: MessageRole.ASSISTANT,
|
|
||||||
content: message.content,
|
|
||||||
tool_calls: message.tool_calls.map((call, index) => ({
|
|
||||||
id: call.id ?? `call_${index}`,
|
|
||||||
type: (call.type as 'function') ?? 'function',
|
|
||||||
function: {
|
|
||||||
name: call.function?.name ?? '',
|
|
||||||
arguments: call.function?.arguments ?? ''
|
|
||||||
}
|
|
||||||
}))
|
|
||||||
} satisfies AgenticMessage;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (message.role === MessageRole.TOOL && message.tool_call_id) {
|
|
||||||
return {
|
|
||||||
role: MessageRole.TOOL,
|
|
||||||
tool_call_id: message.tool_call_id,
|
|
||||||
content: typeof message.content === 'string' ? message.content : ''
|
|
||||||
} satisfies AgenticMessage;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
role: message.role as MessageRole.SYSTEM | MessageRole.USER,
|
|
||||||
content: message.content
|
|
||||||
} satisfies AgenticMessage;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
@ -101,9 +101,6 @@ export { getLanguageFromFilename } from './syntax-highlight-language';
|
||||||
// Text file utilities
|
// Text file utilities
|
||||||
export { isTextFileByName, readFileAsText, isLikelyTextFile } from './text-files';
|
export { isTextFileByName, readFileAsText, isLikelyTextFile } from './text-files';
|
||||||
|
|
||||||
// Agentic utilities
|
|
||||||
export { toAgenticMessages, getAgenticConfig } from './agentic';
|
|
||||||
|
|
||||||
// Debounce utilities
|
// Debounce utilities
|
||||||
export { debounce } from './debounce';
|
export { debounce } from './debounce';
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue