Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
ee42d16
refactor: clean up code formatting and improve component structure
shivamhwp Aug 4, 2025
a2464bd
chore: update subproject commit and enhance ToolMessage component
shivamhwp Aug 5, 2025
9826312
refactor: enhance ToolMessage and ToolAccordion components for improv…
shivamhwp Aug 5, 2025
e4c09d3
get changes from main
shivamhwp Aug 9, 2025
8e06339
refactor: update prompts and toolbar icons for improved clarity and f…
shivamhwp Aug 12, 2025
e9e0afb
feat: enhance tool integration and output handling in various components
shivamhwp Aug 13, 2025
7964ac9
get changes from main
shivamhwp Aug 13, 2025
723fd17
feat: add feedback settings route and integrate MCP templates
shivamhwp Aug 13, 2025
167e9f6
refactor: clean up code formatting and improve tool retrieval logic
shivamhwp Aug 13, 2025
c238975
refactor: improve tool handling and response extraction in chat actions
shivamhwp Aug 13, 2025
b40b3ad
refactor: clean up component structure and improve styling
shivamhwp Aug 14, 2025
21ddc60
refactor: enhance event handling and improve component structure
shivamhwp Aug 14, 2025
c4f71f2
refactor: optimize checkpoint handling and improve code clarity in ch…
shivamhwp Aug 14, 2025
d1b4bad
refactor: improve code formatting and enhance response handling in ag…
shivamhwp Aug 14, 2025
6cdcab0
refactor: enhance replanner error handling and improve prompt schema …
shivamhwp Aug 15, 2025
871113f
get changes from main.
shivamhwp Aug 16, 2025
0784a7e
refactor: update tool event handling and improve error reporting
shivamhwp Aug 18, 2025
45459f2
get changes from main + resolve conflicts.
shivamhwp Aug 18, 2025
3775438
refactor: streamline tool retrieval logic in getAvailableTools function
shivamhwp Aug 18, 2025
94383c9
get changes from main + resolve conflicts.
shivamhwp Aug 21, 2025
76690a2
get changes from main
shivamhwp Aug 22, 2025
d0c1160
feat: enhance chat streaming functionality
shivamhwp Aug 22, 2025
76483e0
feat: improve error handling and completion logic in chat streaming
shivamhwp Aug 22, 2025
9abbfab
refactor: streamline error messaging in Google and retrieval tools
shivamhwp Aug 23, 2025
2f9f86e
get changes from main
shivamhwp Aug 26, 2025
b85e9c5
refactor: enhance DocumentDialog and TopNav components
shivamhwp Aug 26, 2025
5a8f087
refactor: improve DocumentDialog and ModelPopover components
shivamhwp Aug 26, 2025
f4fd9b9
get branches from main + resolve conflicts
shivamhwp Aug 26, 2025
039f491
refactor: enhance component functionality and error handling
shivamhwp Aug 26, 2025
f0a9d09
1. get changes from main
shivamhwp Aug 26, 2025
31539c1
fix: previous response getting seen in the new chat message bug.
shivamhwp Aug 26, 2025
5a9d51f
get changes from main + resolve conflicts
shivamhwp Aug 27, 2025
5b92c30
chore: update @langchain/openai dependency to version 0.6.9 in bun.lo…
shivamhwp Aug 27, 2025
285c205
lil changes to model-management dialog. + some more changes.
shivamhwp Aug 27, 2025
c885855
refactor: clean up code formatting and improve error handling in retr…
shivamhwp Aug 27, 2025
d105046
get changes from main
shivamhwp Aug 28, 2025
e04d890
refactor: enhance chat message handling and UI components
shivamhwp Aug 29, 2025
7a0a7c6
get changes from main + resolve conflicts
shivamhwp Aug 29, 2025
0fd8609
feat: update dependencies and improve chat component structure
shivamhwp Aug 31, 2025
36067b8
get changes from main + resolve conflicts
shivamhwp Sep 4, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 37 additions & 71 deletions bun.lock

Large diffs are not rendered by default.

508 changes: 254 additions & 254 deletions convex/chatMessages/helpers.ts

Large diffs are not rendered by default.

588 changes: 299 additions & 289 deletions convex/langchain/agent.ts

Large diffs are not rendered by default.

77 changes: 50 additions & 27 deletions convex/langchain/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export type ExtendedRunnableConfig = RunnableConfig & {

export async function createSimpleAgent(
_state: typeof GraphState.State,
config: ExtendedRunnableConfig,
config: ExtendedRunnableConfig
) {
const chat = config.chat;
const model = await getModel(config.ctx, chat.model, chat.reasoningEffort);
Expand All @@ -43,7 +43,7 @@ export async function createSimpleAgent(
undefined,
config.customPrompt,
false,
chat.artifacts,
chat.artifacts
),
new MessagesPlaceholder("messages"),
]);
Expand All @@ -53,7 +53,7 @@ export async function createSimpleAgent(
export async function createAgentWithTools(
state: typeof GraphState.State,
config: ExtendedRunnableConfig,
plannerMode: boolean = false,
plannerMode: boolean = false
) {
const chat = config.chat;
const allTools = await getAvailableTools(state, config);
Expand All @@ -66,7 +66,7 @@ export async function createAgentWithTools(
plannerMode,
plannerMode ? undefined : config.customPrompt,
true,
plannerMode ? false : chat.artifacts,
plannerMode ? false : chat.artifacts
),
new MessagesPlaceholder("messages"),
]);
Expand All @@ -85,15 +85,15 @@ export async function createAgentWithTools(
const supervisorLlm = await getModel(
config.ctx,
chat.model!,
chat.reasoningEffort,
chat.reasoningEffort
);
const agents = toolkits.map((toolkit: Toolkit) =>
createReactAgent({
llm: llm,
tools: toolkit.tools,
name: toolkit.name,
prompt: `You are a ${toolkit.name} assistant`,
}),
})
);
return createSupervisor({
agents: [...agents],
Expand All @@ -103,7 +103,7 @@ export async function createAgentWithTools(
plannerMode,
plannerMode ? undefined : config.customPrompt,
true,
plannerMode ? false : chat.artifacts,
plannerMode ? false : chat.artifacts
),
}).compile();
}
Expand All @@ -112,7 +112,7 @@ export async function createAgentWithTools(
export function getPlannerAgentResponse(messages: BaseMessage[]): BaseMessage {
// filter and concat all ai messages
const aiResponses = messages.filter(
(message) => typeof message === typeof AIMessage,
(message) => message instanceof AIMessage
);
const storedAIResponses = mapChatMessagesToStoredMessages(aiResponses);
return mapStoredMessagesToChatMessages([
Expand All @@ -130,7 +130,7 @@ export function getPlannerAgentResponse(messages: BaseMessage[]): BaseMessage {

export function getLastMessage(
messages: BaseMessage[],
type: "ai" | "human",
type: "ai" | "human"
): { message: BaseMessage; index: number } | null {
for (let i = messages.length - 1; i >= 0; i--) {
const message = messages[i];
Expand All @@ -152,44 +152,62 @@ export type Toolkit = {
// Overloads to provide precise return types based on `groupTools`
export async function getAvailableTools(
state: typeof GraphState.State,
config: ExtendedRunnableConfig,
config: ExtendedRunnableConfig
): Promise<StructuredToolInterface<ToolSchemaBase>[]>;
export async function getAvailableTools(
state: typeof GraphState.State,
config: ExtendedRunnableConfig,
groupTools: false,
groupTools: false
): Promise<StructuredToolInterface<ToolSchemaBase>[]>;
export async function getAvailableTools(
state: typeof GraphState.State,
config: ExtendedRunnableConfig,
groupTools: true,
groupTools: true
): Promise<Toolkit[]>;
export async function getAvailableTools(
state: typeof GraphState.State,
config: ExtendedRunnableConfig,
groupTools: boolean = false,
groupTools: boolean = false
): Promise<Toolkit[] | StructuredToolInterface<ToolSchemaBase>[]> {
const chat = config.chat;

const [mcpTools, retrievalTools] = await Promise.all([
const [mcpResult, retrievalResult] = await Promise.allSettled([
getMCPTools(config.ctx, state, config),
getRetrievalTools(state, config, true),
]);

const mcpData =
mcpResult.status === "fulfilled"
? mcpResult.value
: {
tools: [],
groupedTools: {} as Record<
string,
StructuredToolInterface<ToolSchemaBase>[]
>,
};

const retrievalData =
retrievalResult.status === "fulfilled" ? retrievalResult.value : null;

if (!groupTools) {
return [
...mcpTools,
...(chat.projectId ? [retrievalTools.vectorSearch] : []),
...(chat.webSearch ? [retrievalTools.webSearch] : []),
const pickedRetrievalTools: StructuredToolInterface<ToolSchemaBase>[] = [
...(chat.projectId && retrievalData?.vectorSearch
? [retrievalData.vectorSearch]
: []),
...(chat.webSearch && retrievalData?.webSearch
? [retrievalData.webSearch]
: []),
];
return [...mcpData.tools, ...pickedRetrievalTools];
}

// Group MCP tools by server name (tool name format: "mcp__<server>__<tool>")
const mcpGrouped = new Map<
string,
StructuredToolInterface<ToolSchemaBase>[]
>();
for (const tool of mcpTools) {
for (const tool of mcpData.tools) {
const parts = tool.name.split("__");
const groupName = parts.length >= 2 ? parts[1] : "MCP";
if (!mcpGrouped.has(groupName)) mcpGrouped.set(groupName, []);
Expand All @@ -201,20 +219,25 @@ export async function getAvailableTools(
name,
tools,
})),
...(chat.webSearch
? [{ name: "WebSearch", tools: [retrievalTools.webSearch] }]
: []),
...(chat.projectId
? [{ name: "VectorSearch", tools: [retrievalTools.vectorSearch] }]
: []),
];

if (chat.webSearch && retrievalData?.webSearch) {
toolkits.push({ name: "WebSearch", tools: [retrievalData.webSearch] });
}

if (chat.projectId && retrievalData?.vectorSearch) {
toolkits.push({
name: "VectorSearch",
tools: [retrievalData.vectorSearch],
});
}

return toolkits;
}

export async function getAvailableToolsDescription(
state: typeof GraphState.State,
config: ExtendedRunnableConfig,
config: ExtendedRunnableConfig
): Promise<string> {
const toolsInfo: StructuredToolInterface<ToolSchemaBase>[] =
await getAvailableTools(state, config);
Expand All @@ -229,7 +252,7 @@ export async function getAvailableToolsDescription(
}

export function extractFileIdsFromMessage(
messageContent: any,
messageContent: any
): Id<"documents">[] {
const fileIds: Id<"documents">[] = [];

Expand Down
Loading