Skip to content
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

feat: Add form filling use case for TS #417

Merged
merged 49 commits into from
Nov 13, 2024
Merged

Conversation

leehuwuj
Copy link
Collaborator

@leehuwuj leehuwuj commented Nov 6, 2024

Summary by CodeRabbit

  • New Features

    • Introduced a streamlined workflow for filling missing cells in CSV files.
    • Added a comprehensive workflow for generating financial reports.
    • Implemented new tools for extracting and filling missing cells in CSV files.
    • Enhanced multi-agent functionality with improved message handling and workflow execution.
  • Bug Fixes

    • Simplified error handling and validation for incoming messages in chat functionality.
  • Documentation

    • Added README templates for financial report and form filling projects, detailing setup and usage instructions.

Copy link

changeset-bot bot commented Nov 6, 2024

🦋 Changeset detected

Latest commit: f7c0c9e

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
create-llama Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

Copy link

coderabbitai bot commented Nov 6, 2024

Walkthrough

This pull request introduces a series of changes primarily focused on enhancing TypeScript code for multi-agent functionality and form filling. Key updates include the introduction of new workflows for financial reporting and form filling, modifications to existing workflows, and the addition of tools for handling missing data in CSV files. Several files have been deleted, indicating a refactoring of the codebase. The changes also include updates to README templates, providing guidance on project setup and usage.

Changes

File Path Change Summary
.changeset/metal-cherries-sin.md Introduces a patch "create-llama" optimizing TypeScript code for multi-agent functionality.
.changeset/serious-suits-turn.md Adds a new use case for form filling in TypeScript under the "create-llama" patch.
e2e/shared/multiagent_template.spec.ts Modifies test suite logic for "form_filling" agent, updating skip conditions based on framework type.
helpers/typescript.ts Updates installTSTemplate function to enhance path handling and copying of use case files.
questions/simple.ts Modifies askSimpleQuestions function to allow language selection for all app types except "extractor".
templates/components/agents/typescript/financial_report/agents.ts Deleted file containing functions for creating financial report agents.
templates/components/agents/typescript/financial_report/factory.ts Deleted file managing workflows for financial reports.
templates/components/agents/typescript/financial_report/tools.ts Deleted file managing tool retrieval for financial reporting.
templates/components/engines/typescript/agent/tools/form-filling.ts Introduces classes for handling missing cells in CSV files.
templates/components/engines/typescript/agent/tools/index.ts Adds new imports and functions for tool management related to form filling.
templates/components/llamaindex/typescript/documents/helper.ts Changes UPLOADED_FOLDER from private to exported constant.
templates/components/llamaindex/typescript/documents/upload.ts Modifies uploadDocument function to simplify CSV handling logic.
templates/components/llamaindex/typescript/streaming/annotations.ts Enhances message handling and introduces new functions for chat history management.
templates/components/multiagent/typescript/nextjs/route.ts Refactors POST method for improved message validation and workflow execution.
templates/components/multiagent/typescript/workflow/stream.ts Replaces toDataStream with createStreamFromWorkflowContext for better event handling.
templates/components/multiagent/typescript/workflow/tools.ts Introduces new functions and a class for tool interactions in a multi-agent framework.
templates/components/multiagent/typescript/workflow/type.ts Updates AgentInput type and introduces new event types for enhanced event handling.
templates/types/streaming/express/package.json Updates dependencies to include papaparse and related packages.
templates/types/streaming/nextjs/package.json Modifies dependencies to correct placement of @llamaindex/chat-ui and add new packages.
templates/components/multiagent/typescript/workflow/single-agent.ts Enhances FunctionCallingAgent class and updates method signatures for better integration.
templates/components/agents/typescript/financial_report/workflow/factory.ts Introduces a new workflow for financial reporting.
templates/components/agents/typescript/form_filling/workflow/factory.ts Introduces a new workflow for form filling.
templates/components/agents/typescript/blog/workflow/factory.ts Updates workflow for blog post creation with new event handling.
templates/components/agents/typescript/blog/workflow/agents.ts Modifies functions for creating blog-related agents with updated tool retrieval logic.
templates/components/multiagent/typescript/express/chat.controller.ts Refactors chat function for improved message handling and workflow execution.
templates/components/agents/typescript/financial_report/workflow/fin-report.ts Introduces FinancialReportWorkflow class managing financial data processing.
templates/components/agents/typescript/form_filling/workflow/form-filling.ts Introduces FormFillingWorkflow class for managing CSV data filling workflow.
templates/components/agents/typescript/financial_report/README-template.md Adds README template for financial report project setup and usage.
templates/components/agents/typescript/form_filling/README-template.md Adds README template for form filling project setup and usage.

Possibly related PRs

Suggested reviewers

  • marcusschiesser

🐇 In the land of code where the rabbits play,
New workflows hop in, brightening the day.
With tools for filling and agents that gleam,
Our TypeScript dreams are more than they seem!
So let’s code together, with joy and delight,
For every new change makes our project take flight! 🐇✨


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@leehuwuj leehuwuj marked this pull request as ready for review November 8, 2024 04:39
@leehuwuj
Copy link
Collaborator Author

leehuwuj commented Nov 8, 2024

@coderabbitai review

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 18

🧹 Outside diff range and nitpick comments (20)
templates/components/multiagent/typescript/workflow/type.ts (2)

9-17: Consider enhancing progress tracking with status and error handling

The progress tracking structure is well-defined. Consider extending it to handle more complex scenarios:

  1. Add a status field to track states like "pending", "running", "completed", "failed"
  2. Include error handling capabilities for failed operations

Example enhancement:

export type ProgressStatus = "pending" | "running" | "completed" | "failed";

export type ProgressEventData = {
  id: string;
  total: number;
  current: number;
  status: ProgressStatus;
  error?: string;
};

18-36: Consider adding type guard for better type safety

The implementation is solid. To improve type safety, consider adding a type guard method to help TypeScript narrow down the event type:

export class AgentRunEvent extends WorkflowEvent<{
  name: string;
  text: string;
  type: AgentRunEventType;
  data?: AgentRunEventData;
}> {
  constructor(options: {
    name: string;
    text: string;
    type?: AgentRunEventType;
    data?: AgentRunEventData;
  }) {
    super({
      ...options,
      type: options.type || "text",
    });
  }

  isProgressEvent(): this is AgentRunEvent & { data: ProgressEventData } {
    return this.type === "progress" && !!this.data;
  }
}
templates/components/multiagent/typescript/workflow/stream.ts (1)

51-52: Consider improving type safety for StreamData closure check.

The as any type assertion bypasses TypeScript's type checking. Consider extending the StreamData type definition to properly include the isClosed property.

-      if (!(event instanceof AgentRunEvent) || (streamData as any).isClosed) {
+      if (!(event instanceof AgentRunEvent) || streamData.isClosed) {
templates/components/multiagent/typescript/nextjs/route.ts (1)

Line range hint 25-33: Consider standardizing error response structure.

While the validation logic is good, the error response structure differs from the catch block (using error vs detail). Consider standardizing the error response format across all error cases.

-        {
-          error:
-            "messages are required in the request body and the last message must be from the user",
-        },
+        {
+          detail:
+            "messages are required in the request body and the last message must be from the user",
+        },
templates/components/llamaindex/typescript/documents/upload.ts (1)

21-22: LGTM! Consider adding a comment explaining the CSV bypass.

The simplification of CSV file handling is a good change. However, it would be helpful to document why CSV files are excluded from indexing, especially since this is part of a broader form-filling feature.

-  // Do not index csv files
+  // CSV files are handled separately by the form-filling workflow
+  // and don't require indexing
templates/components/engines/typescript/agent/tools/index.ts (1)

63-68: Consider improving type safety and error handling.

While the implementation works, there are opportunities for improvement:

  1. Consider adding runtime type validation before casting the config
  2. Consider handling potential initialization errors
  3. Consider splitting into two separate tool factory entries for better consistency with other tools

Here's a suggested improvement:

-  form_filling: async (config: unknown) => {
-    return [
-      new ExtractMissingCellsTool(config as ExtractMissingCellsParams),
-      new FillMissingCellsTool(config as FillMissingCellsParams),
-    ];
-  },
+  extract_missing_cells: async (config: unknown) => {
+    if (!isExtractMissingCellsParams(config)) {
+      throw new Error('Invalid configuration for ExtractMissingCellsTool');
+    }
+    return [new ExtractMissingCellsTool(config)];
+  },
+  fill_missing_cells: async (config: unknown) => {
+    if (!isFillMissingCellsParams(config)) {
+      throw new Error('Invalid configuration for FillMissingCellsTool');
+    }
+    return [new FillMissingCellsTool(config)];
+  },

You'll need to add these type guard functions:

function isExtractMissingCellsParams(config: unknown): config is ExtractMissingCellsParams {
    // Add runtime type checking logic
    return true; // implement proper validation
}

function isFillMissingCellsParams(config: unknown): config is FillMissingCellsParams {
    // Add runtime type checking logic
    return true; // implement proper validation
}
questions/simple.ts (1)

55-67: Consider adding model requirement notes.

Since form filling requires GPT-4 and text-embedding-3-large, it would be helpful to add a note in the language selection prompt about these requirements.

 const { language: newLanguage } = await prompts(
   {
     type: "select",
     name: "language",
     message: "What language do you want to use?",
+    hint: "Form filling requires GPT-4 and text-embedding-3-large models",
     choices: [
       { title: "Python (FastAPI)", value: "fastapi" },
       { title: "Typescript (NextJS)", value: "nextjs" },
     ],
   },
   questionHandlers,
 );
templates/components/llamaindex/typescript/streaming/annotations.ts (1)

88-91: Consider adding path validation for local file access.

The local file path construction looks good, but consider adding validation to ensure UPLOADED_FOLDER exists and is accessible.

  // Include local file path
  const localFilePath = `${UPLOADED_FOLDER}/${file.name}`;
+ if (!UPLOADED_FOLDER) {
+   console.warn("Warning: UPLOADED_FOLDER is not set. Local file access may be unavailable.");
+ }
  defaultContent += `Local file path (instruction: use for local tool that requires a local path): ${localFilePath}\n`;
helpers/typescript.ts (2)

Line range hint 147-152: Consider adding logging for copied files.

For better debugging and visibility, consider adding detailed logging of which files are being copied from the agent template.

      await copy("**", path.join(root), {
        parents: true,
        cwd: agentsCodePath,
        rename: assetRelocator,
+       onFile: (file) => console.log(`Copying agent file: ${file}`),
      });

Line range hint 142-156: Document the form filling use case in comments.

Since this change is part of adding form filling functionality, consider adding documentation to clarify:

  1. The expected structure of form filling agent files
  2. Any specific configuration requirements
  3. Examples of usage
      // Copy agents use case code for multiagent template
+     // For form filling agents:
+     // - Expects form definition files in the root directory
+     // - Requires specific agent configuration for form processing
+     // Example: formAgent.ts, formConfig.ts, etc.
      if (agents) {
        console.log("\nCopying agent:", agents, "\n");
templates/components/agents/typescript/form_filling/app/api/chat/workflow/factory.ts (2)

52-60: Use constants for tool names to improve maintainability

Currently, the tool names are hardcoded as string literals. Using constants for the tool names can prevent typos and make future updates easier.

Consider defining constants for the tool names:

+const EXTRACTOR_TOOL_NAME = "extract_missing_cells";
+const RETRIEVER_TOOL_NAME = "retriever";
+const FILL_MISSING_CELLS_TOOL_NAME = "fill_missing_cells";

 const extractorTool = tools.find(
-  (tool) => tool.metadata.name === "extract_missing_cells",
+  (tool) => tool.metadata.name === EXTRACTOR_TOOL_NAME,
 );

 const queryEngineTool = tools.find(
-  (tool) => tool.metadata.name === "retriever",
+  (tool) => tool.metadata.name === RETRIEVER_TOOL_NAME,
 );

 const fillMissingCellsTool = tools.find(
-  (tool) => tool.metadata.name === "fill_missing_cells",
+  (tool) => tool.metadata.name === FILL_MISSING_CELLS_TOOL_NAME,
 );

44-79: Specify return type for 'createWorkflow' function

For better type safety and clarity, consider explicitly specifying the return type of the createWorkflow function.

Modify the function signature as follows:

 export async function createWorkflow(options: {
   chatHistory: Message[];
   llm?: ToolCallLLM;
   writeEvents?: boolean;
-}) {
+}): Promise<FormFillingWorkflow> {
templates/components/agents/typescript/financial_report/app/api/chat/workflow/factory.ts (1)

68-70: Improve error message to specify missing tools

Currently, the error message thrown when required tools are missing is generic. It's helpful to the user to know exactly which tools are missing. Consider modifying the error message to specify the missing tools.

You can adjust the code as follows:

+const missingTools = [];
+if (!documentGeneratorTool) missingTools.push('document_generator');
+if (!codeInterpreterTool) missingTools.push('code_interpreter');
+if (retrieverTools.length === 0) missingTools.push('retriever');
+if (missingTools.length > 0) {
+  throw new Error('Missing required tools: ' + missingTools.join(', '));
+}
templates/components/agents/typescript/form_filling/app/api/chat/workflow/formFilling.ts (1)

41-226: Add unit tests for the FormFillingWorkflow class

To ensure the reliability and correctness of the FormFillingWorkflow class, it's important to include unit tests that cover various scenarios and edge cases. This will help in early detection of bugs and facilitate future maintenance.

Would you like assistance in creating a test suite for this class?

templates/components/engines/typescript/agent/tools/form-filling.ts (1)

263-265: Ensure 'newFileName' Does Not Include Directory Paths

When creating newFileName using filePath.replace(".csv", "-filled.csv"), if filePath includes directory paths, newFileName will also include these paths, which may lead to unintended file paths when joined with "output/tools". Extract only the base filename before appending -filled.csv.

Apply this diff to adjust the file naming:

- const newFileName = filePath.replace(".csv", "-filled.csv");
+ const baseFileName = path.basename(filePath, ".csv");
+ const newFileName = baseFileName + "-filled.csv";
templates/components/agents/typescript/financial_report/app/api/chat/workflow/finReport.ts (3)

34-38: Correct grammatical errors in the DEFAULT_SYSTEM_PROMPT

There are grammatical errors in the DEFAULT_SYSTEM_PROMPT that could affect clarity. Consider making the following corrections:

  • Line 35: Change "You are a financial analyst who are given a set of tools..." to "You are a financial analyst who is given a set of tools...".

  • Line 36: Change "It's good to using appropriate tools..." to "It's good to use appropriate tools...".

  • Line 36: Rephrase the sentence for better readability:

    Original: "It's good to use appropriate tools for the user request and always use the information from the tools, don't make up anything yourself."

    Revised: "Use appropriate tools for the user's request and always rely on information from the tools; avoid making up any content yourself."


205-211: Improve the clarity and grammar of the analysis prompt

The analysisPrompt contains grammatical issues that may affect the assistant's understanding. Consider revising it for clarity:

  • Line 210: Change "Don't need to synthesize the data, just analyze and provide your findings." to "You don't need to synthesize new data; just analyze the provided data and share your findings."

41-47: Specify access modifiers for class properties

For better code clarity and maintainability, consider explicitly specifying access modifiers (public, private, or protected) for class properties. This practice enhances readability and helps other developers understand the intended encapsulation.

templates/components/multiagent/typescript/workflow/tools.ts (2)

122-122: Increment currentStep before emitting progress events

The currentStep is incremented after emitting the progress event, which means the progress display might be off by one, starting from zero instead of one. Increment currentStep before writing the event to ensure accurate progress tracking.

Apply this diff to adjust the increment:

for (const toolCall of toolCalls) {
  const tool = tools.find((tool) => tool.metadata.name === toolCall.name);
  if (!tool) {
    throw new Error(`Tool ${toolCall.name} not found`);
  }
+ currentStep++;
  const toolMsg = await callSingleTool(toolCall, tool, (msg: string) => {
    ctx.writeEventToStream(
      new AgentRunEvent({
        name: agentName,
        text: msg,
        type: "progress",
        data: {
          id: progressId,
          total: totalSteps,
          current: currentStep,
        },
      }),
    );
  });
  toolMsgs.push(toolMsg as ChatMessage);
}
- currentStep++;

226-272: Ensure proper handling of the response generator in chatWithTools

The responseGenerator function within chatWithTools may not handle all potential cases, such as when there are no tool calls or when the streaming response doesn't yield any chunks. Ensure that the generator correctly yields responses and handles the completion of the stream.

Consider reviewing and testing the function with various scenarios to ensure robustness.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 6edea6a and 3cae9d7.

⛔ Files ignored due to path filters (1)
  • templates/components/agents/typescript/form_filling/sec_10k_template.csv is excluded by !**/*.csv
📒 Files selected for processing (23)
  • .changeset/metal-cherries-sin.md (1 hunks)
  • .changeset/serious-suits-turn.md (1 hunks)
  • e2e/shared/multiagent_template.spec.ts (1 hunks)
  • helpers/typescript.ts (1 hunks)
  • questions/simple.ts (1 hunks)
  • templates/components/agents/typescript/financial_report/agents.ts (0 hunks)
  • templates/components/agents/typescript/financial_report/app/api/chat/workflow/factory.ts (1 hunks)
  • templates/components/agents/typescript/financial_report/app/api/chat/workflow/finReport.ts (1 hunks)
  • templates/components/agents/typescript/financial_report/factory.ts (0 hunks)
  • templates/components/agents/typescript/financial_report/tools.ts (0 hunks)
  • templates/components/agents/typescript/form_filling/app/api/chat/workflow/factory.ts (1 hunks)
  • templates/components/agents/typescript/form_filling/app/api/chat/workflow/formFilling.ts (1 hunks)
  • templates/components/engines/typescript/agent/tools/form-filling.ts (1 hunks)
  • templates/components/engines/typescript/agent/tools/index.ts (2 hunks)
  • templates/components/llamaindex/typescript/documents/helper.ts (1 hunks)
  • templates/components/llamaindex/typescript/documents/upload.ts (1 hunks)
  • templates/components/llamaindex/typescript/streaming/annotations.ts (3 hunks)
  • templates/components/multiagent/typescript/nextjs/route.ts (3 hunks)
  • templates/components/multiagent/typescript/workflow/stream.ts (1 hunks)
  • templates/components/multiagent/typescript/workflow/tools.ts (1 hunks)
  • templates/components/multiagent/typescript/workflow/type.ts (1 hunks)
  • templates/types/streaming/express/package.json (1 hunks)
  • templates/types/streaming/nextjs/package.json (2 hunks)
💤 Files with no reviewable changes (3)
  • templates/components/agents/typescript/financial_report/agents.ts
  • templates/components/agents/typescript/financial_report/factory.ts
  • templates/components/agents/typescript/financial_report/tools.ts
✅ Files skipped from review due to trivial changes (2)
  • .changeset/metal-cherries-sin.md
  • .changeset/serious-suits-turn.md
🧰 Additional context used
📓 Path-based instructions (15)
templates/components/agents/typescript/financial_report/app/api/chat/workflow/factory.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/agents/typescript/financial_report/app/api/chat/workflow/finReport.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/agents/typescript/form_filling/app/api/chat/workflow/factory.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/agents/typescript/form_filling/app/api/chat/workflow/formFilling.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/engines/typescript/agent/tools/form-filling.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/engines/typescript/agent/tools/index.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/llamaindex/typescript/documents/helper.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/llamaindex/typescript/documents/upload.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/llamaindex/typescript/streaming/annotations.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/multiagent/typescript/nextjs/route.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/multiagent/typescript/workflow/stream.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/multiagent/typescript/workflow/tools.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/multiagent/typescript/workflow/type.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/types/streaming/express/package.json (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/types/streaming/nextjs/package.json (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

🪛 eslint
templates/components/agents/typescript/financial_report/app/api/chat/workflow/factory.ts

[error] 1-1: Parsing error: The keyword 'import' is reserved

templates/components/agents/typescript/financial_report/app/api/chat/workflow/finReport.ts

[error] 1-1: Parsing error: The keyword 'import' is reserved

templates/components/agents/typescript/form_filling/app/api/chat/workflow/factory.ts

[error] 1-1: Parsing error: The keyword 'import' is reserved

templates/components/agents/typescript/form_filling/app/api/chat/workflow/formFilling.ts

[error] 1-1: Parsing error: The keyword 'import' is reserved

templates/components/engines/typescript/agent/tools/form-filling.ts

[error] 1-1: Parsing error: The keyword 'import' is reserved

templates/components/multiagent/typescript/workflow/tools.ts

[error] 1-1: Parsing error: The keyword 'import' is reserved

🪛 Biome
templates/components/agents/typescript/financial_report/app/api/chat/workflow/finReport.ts

[error] 200-200: Use Array.isArray() instead of instanceof Array.

instanceof Array returns false for array-like objects and arrays from other execution contexts.
Unsafe fix: Use Array.isArray() instead.

(lint/suspicious/useIsArray)

🔇 Additional comments (19)
templates/components/multiagent/typescript/workflow/type.ts (1)

1-8: LGTM! Type enhancement improves flexibility

The update to AgentInput.message to accept both string and MessageContent types provides better flexibility while maintaining backward compatibility.

🧰 Tools
🪛 eslint

[error] 1-1: Parsing error: The keyword 'import' is reserved

templates/types/streaming/express/package.json (1)

31-31: LGTM! Appropriate CSV parsing dependencies added.

The addition of papaparse and its corresponding TypeScript types is well-aligned with the form-filling use case mentioned in the PR objectives. The versions are up-to-date and compatible.

Also applies to: 37-37

templates/types/streaming/nextjs/package.json (1)

21-21: LGTM! Proper addition of CSV parsing dependencies.

The addition of papaparse and its TypeScript types is well-structured:

  • Versions are appropriately specified using caret ranges
  • Type definitions match the library version
  • Dependencies are correctly alphabetized

Also applies to: 33-33

templates/components/multiagent/typescript/workflow/stream.ts (2)

55-60: LGTM! Clean and type-safe annotation data structure.

The implementation effectively uses const assertion and conditional property spreading while maintaining type safety.


62-65: LGTM! Proper usage of StreamData API.

The message annotation is correctly structured and maintains consistency with the agent-based architecture.

templates/components/multiagent/typescript/nextjs/route.ts (4)

2-2: LGTM: Import statements are properly organized.

The new imports for StartEvent and utility functions are well-structured and align with their usage in the code.

Also applies to: 7-10


35-46: LGTM: Improved workflow creation structure.

The workflow creation and execution logic is well-organized with proper typing for the input parameters.


50-52: LGTM: Stream handling is properly updated.

The workflow stream events are correctly integrated with the response handling mechanism.


41-47: Consider improving type definitions to avoid type casting.

The double type casting (as unknown as Promise<...>) suggests potential type definition issues in the workflow's run method.

Consider updating the workflow's type definitions to avoid the need for type casting, making the code more type-safe.

✅ Verification successful

Let me check the workflow implementation and type definitions to better understand the type casting necessity.


Let me try a different approach to find the workflow implementation and its usage.


Let me check one more thing to understand the workflow implementation from the llamaindex core package.


Based on the search results, I can now provide the final response:

Type casting appears to be a necessary implementation detail

The type casting pattern as unknown as Promise<StopEvent<AsyncGenerator<ChatResponseChunk>>> is consistently used in both NextJS and Express implementations, suggesting this is a deliberate design choice when working with the @llamaindex/core/workflow package. The type casting appears in only these two specific workflow implementations, indicating it's not a widespread typing issue but rather a specific handling requirement for the workflow's return type.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if there are other instances of similar type casting patterns
# that might indicate a broader typing issue
rg -g '*.ts' -g '*.tsx' 'as unknown as Promise'

Length of output: 328


Script:

#!/bin/bash
# Check workflow implementation and type definitions
ast-grep --pattern 'class Workflow {
  $$$
  run($_) {
    $$$
  }
  $$$
}'

# Also check for any type definitions related to Workflow
rg -g '*.ts' -g '*.tsx' 'type.*Workflow|interface.*Workflow'

Length of output: 140


Script:

#!/bin/bash
# Search for workflow-related imports and implementations
rg -g '*.ts' -g '*.tsx' -A 5 'import.*Workflow|new Workflow'

# Search for StartEvent and StopEvent type definitions
rg -g '*.ts' -g '*.tsx' 'class (Start|Stop)Event|type.*(Start|Stop)Event|interface.*(Start|Stop)Event'

Length of output: 4780


Script:

#!/bin/bash
# Look for workflow-related files and their content
fd -e ts workflow

Length of output: 19

templates/components/llamaindex/typescript/documents/upload.ts (1)

21-22: Verify existing CSV processing workflows.

Since we're changing how CSV files are handled, let's ensure this doesn't affect any existing features that might have depended on the previous behavior with codeExecutorTool.

✅ Verification successful

Based on the search results, I can now generate the final response:

CSV handling changes are safe to proceed

The codebase shows CSV files are handled in specific, isolated ways:

  • Form filling tools in Python and TypeScript that explicitly work with CSV files
  • File type detection and MIME type mapping
  • No dependencies on codeExecutorTool for CSV processing were found

The change to skip indexing CSV files doesn't impact existing features since CSV files are processed through dedicated form-filling tools rather than being indexed for search/retrieval.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Search for CSV-related processing code that might be affected
# by the removal of codeExecutorTool check for CSV files

# Look for CSV processing patterns in the codebase
echo "Searching for CSV processing patterns..."
rg -l 'text/csv|\.csv' | while read -r file; do
  echo "=== $file ==="
  rg -A 5 'text/csv|\.csv' "$file"
done

# Look for potential references to the code executor with CSV files
echo -e "\nSearching for code executor usage with CSV files..."
rg -l 'codeExecutor.*csv|csv.*codeExecutor' | while read -r file; do
  echo "=== $file ==="
  rg -A 5 'codeExecutor.*csv|csv.*codeExecutor' "$file"
done

Length of output: 3828

templates/components/engines/typescript/agent/tools/index.ts (1)

9-14: LGTM! Clean and consistent import declarations.

The new imports follow the established pattern and maintain good separation between tool implementations and their parameter types.

templates/components/llamaindex/typescript/documents/helper.ts (1)

16-16: LGTM! Verify the constant's usage.

The export of UPLOADED_FOLDER is appropriate as it maintains consistency with the internal usage and enables reuse in other modules like annotations.ts.

Let's verify the constant's usage across the codebase:

✅ Verification successful

Export of UPLOADED_FOLDER is correctly used

The constant is imported and used in annotations.ts as expected, maintaining a clean dependency structure within the codebase. The change aligns with the actual usage pattern.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the usage of UPLOADED_FOLDER constant
# Expected: Should find references in this file and annotations.ts

# Search for direct usage of the constant
rg -l "UPLOADED_FOLDER"

# Search for imports of the constant
rg "import.*UPLOADED_FOLDER.*from.*helper"

Length of output: 322

e2e/shared/multiagent_template.spec.ts (1)

30-31: LGTM! Verify framework support matrix.

The skip condition for form filling with Express framework is correctly implemented. The message is clear and accurately reflects the limitation.

Let's verify the framework support matrix for form filling:

✅ Verification successful

Form filling support verification confirmed

Based on the comprehensive analysis of the codebase:

  • Form filling implementation is only present in FastAPI (templates/types/streaming/fastapi/app/api/routers/models.py)
  • No form filling implementation found in Express framework
  • NextJS doesn't show any form filling related code

The skip condition for form filling with Express is correctly implemented as the feature is indeed not supported in the Express framework.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for framework-specific implementations and configurations for form filling

# Test 1: Look for framework-specific form filling implementations
echo "Checking for framework-specific form filling implementations..."
rg -g '!node_modules' -g '!dist' -g '!*.spec.*' -l 'form.?filling' -A 5 -B 5

# Test 2: Look for framework configuration files that might define support
echo "Checking framework configurations..."
fd -g '*config*' -x rg -l 'form.?filling|express|fastapi|nextjs'

Length of output: 916


Script:

#!/bin/bash
# Let's check the actual form filling implementations across frameworks
echo "Checking form filling implementations in framework-specific directories..."
rg -g '!node_modules' -g '!dist' "form.?filling" ./templates/types/streaming/

# Check framework-specific configurations for form filling support
echo "Checking framework configurations for form filling..."
cat ./templates/types/streaming/express/src/controllers/chat-config.controller.ts
echo "---"
cat ./templates/types/streaming/fastapi/app/api/routers/chat_config.py

Length of output: 3325


Script:

#!/bin/bash
# Let's check for form filling implementations in NextJS and FastAPI
echo "Checking NextJS form filling implementation..."
fd . templates/types/streaming/nextjs -t f -x rg -l "form.?filling|FormFilling" {}

echo "Checking FastAPI form filling implementation..."
fd . templates/types/streaming/fastapi -t f -x rg -l "form.?filling|FormFilling" {}

# Let's also check if there are any form filling related routes or handlers
echo "Checking for form filling related routes..."
rg -g '!node_modules' -g '!dist' "router|route|handler.*form" ./templates/types/streaming/

Length of output: 4248

questions/simple.ts (2)

55-67: LGTM! Language selection changes look good.

The changes correctly implement language selection for all app types except "extractor", which aligns with the PR objective of adding form filling support for TypeScript. The prompt structure and type safety are well maintained.


55-67: Verify form filling template compatibility.

Since form filling is now supported in TypeScript, let's verify that all necessary language-specific components are in place.

✅ Verification successful

Form filling template implementation is complete and compatible

The TypeScript implementation of form filling workflow closely mirrors the Python version with all necessary components in place:

  • Workflow implementation with proper event handling and tool integration
  • Identical CSV template structure for financial data extraction
  • Matching system prompts and tool orchestration logic
  • Complete implementation of required tools: extractor, query engine, and form filling
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check for TypeScript-specific form filling components
echo "Checking for TypeScript form filling components..."
fd -e ts -e tsx "formFilling" templates/components/agents/typescript/form_filling

# Verify workflow implementations
echo "Checking workflow implementations..."
fd -e ts "workflow" templates/components/agents/typescript/form_filling

# Check for potential language-specific utilities
echo "Checking for form filling utilities..."
fd -e ts "utils" templates/components/agents/typescript/form_filling

Length of output: 592


Script:

#!/bin/bash
# Let's examine the content of the form filling implementation
echo "Content of formFilling.ts:"
cat templates/components/agents/typescript/form_filling/app/api/chat/workflow/formFilling.ts

# Check if there are corresponding Python implementations for comparison
echo -e "\nChecking Python form filling implementations:"
fd -e py "form" templates/components/agents/python/form_filling

# Let's also check the template structure to ensure all necessary files are in place
echo -e "\nChecking template structure:"
tree templates/components/agents/typescript/form_filling

Length of output: 7344


Script:

#!/bin/bash
# Let's check the Python implementation for comparison
echo "Content of Python form_filling.py:"
cat templates/components/agents/python/form_filling/app/workflows/form_filling.py

# Let's also check the tools implementation that the workflow uses
echo -e "\nChecking for tool implementations in TypeScript:"
fd -e ts "tools" templates/components/agents/typescript/form_filling

# Check the CSV template structure
echo -e "\nChecking CSV template content:"
cat templates/components/agents/typescript/form_filling/sec_10k_template.csv

Length of output: 9595

templates/components/llamaindex/typescript/streaming/annotations.ts (2)

3-3: LGTM!

The import statement is correctly added and the imported constant is properly utilized in the code.


135-138: Great improvement to annotation collection!

The refactored code is more robust and efficient:

  • Uses functional programming patterns effectively
  • Properly handles undefined annotations
  • Collects annotations from all user messages instead of just the last one
helpers/typescript.ts (1)

147-147: Verify potential file overwrites when copying to root directory.

The change to copy agent files directly to the root directory could potentially overwrite existing files. Consider the following recommendations:

  1. Add a check for existing files before copying
  2. Log the files being copied for better visibility
  3. Document the expected file structure in comments

Let's verify the potential file conflicts:

templates/components/agents/typescript/form_filling/app/api/chat/workflow/factory.ts (1)

9-42: Function 'prepareChatHistory' implementation is correct

The prepareChatHistory function correctly processes agent annotations and integrates agent messages into the chat history.

Copy link

coderabbitai bot commented Nov 8, 2024

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🧹 Outside diff range and nitpick comments (11)
templates/components/agents/typescript/financial_report/app/api/chat/workflow/factory.ts (4)

10-12: Add JSDoc comments to document event classes.

While the event classes are well-structured, adding JSDoc comments would improve code documentation and help other developers understand the purpose of each event in the workflow.

Example improvement:

+/** Event triggered when financial research needs to be conducted */
 class ResearchEvent extends WorkflowEvent<{ input: string }> {}
+/** Event triggered when financial data needs to be analyzed */
 class AnalyzeEvent extends WorkflowEvent<{ input: string }> {}
+/** Event triggered when financial report needs to be generated */
 class ReportEvent extends WorkflowEvent<{ input: string }> {}

18-18: Move MAX_AGENT_MESSAGES to constants section.

Consider moving this constant to the top of the file with other constants for better maintainability.

 const TIMEOUT = 360 * 1000;
+const MAX_AGENT_MESSAGES = 10;

40-45: Simplify array manipulation using spread operator.

The current array manipulation can be simplified while maintaining the same functionality.

-    return [
-      ...chatHistory.slice(0, -1),
-      agentMessage,
-      chatHistory.slice(-1)[0],
-    ] as ChatMessage[];
+    return [...chatHistory.slice(0, -1), agentMessage, chatHistory.at(-1)] as ChatMessage[];

57-59: Maintain consistent naming between variable and validation.

The variable queryEngineTool is used to store a tool that starts with "retriever", which could be confusing. Consider renaming for consistency.

-  const queryEngineTool = tools.find((tool) =>
+  const retrieverTool = tools.find((tool) =>
     tool.metadata.name.startsWith("retriever"),
   );

-  if (!documentGeneratorTool || !codeInterpreterTool || !queryEngineTool) {
+  if (!documentGeneratorTool || !codeInterpreterTool || !retrieverTool) {

Also applies to: 67-67

templates/components/engines/typescript/agent/tools/form-filling.ts (1)

97-279: Consider adding validation for cell values

Both tools would benefit from validation of cell values to ensure data consistency. Consider adding:

  1. Value type validation based on column types
  2. Data format validation (e.g., dates, numbers)
  3. Value range validation where applicable

This would help prevent invalid data from being written to the CSV file.

Would you like assistance in implementing these validations?

templates/components/agents/typescript/financial_report/app/api/chat/workflow/finReport.ts (4)

19-32: Add JSDoc comments to document event classes.

Consider adding JSDoc comments to explain the purpose and usage of each event class. This will improve code maintainability and help other developers understand the workflow better.

Example:

/**
 * Event triggered when receiving input messages that need to be processed.
 * @property input - Array of chat messages to be processed
 */
class InputEvent extends WorkflowEvent<{ input: ChatMessage[] }> {}

34-38: Improve system prompt clarity and grammar.

The system prompt contains grammatical errors and could be more precise. Consider this revision:

-You are a financial analyst who are given a set of tools to help you.
-It's good to using appropriate tools for the user request and always use the information from the tools, don't make up anything yourself.
-For the query engine tool, you should break down the user request into a list of queries and call the tool with the queries.
+You are a financial analyst equipped with specialized tools to assist you.
+You should use appropriate tools for each user request and rely solely on information from these tools - do not make assumptions or generate information independently.
+When using the query engine tool, break down user requests into specific queries and execute them systematically.

40-47: Consider using a discriminated union type for tools.

The tool properties could benefit from more specific typing to ensure type safety when handling different tool types.

type Tool = {
  type: 'queryEngine' | 'codeInterpreter' | 'documentGenerator';
  tool: BaseToolWithCall;
};

259-261: Improve error handling for missing document generator tool.

The error handling for missing document generator tool could be more robust by checking this in the constructor.

constructor(options: {...}) {
  if (!options.documentGeneratorTool) {
    throw new Error("Document generator tool is required");
  }
  // ... rest of the constructor
}
templates/components/multiagent/typescript/workflow/tools.ts (2)

21-23: Consider adding type safety for params.

The params parameter is typed as any, which bypasses TypeScript's type checking. Consider creating an interface to define the expected parameter structure.

+interface QueryEngineParams {
+  // Add expected parameters here
+  topK?: number;
+  // ... other params
+}

-export const getQueryEngineTool = async (params?: any
+export const getQueryEngineTool = async (params?: QueryEngineParams

225-305: Add documentation for the complex async generator implementation.

The chatWithTools function uses a sophisticated async generator pattern with state management. Consider adding detailed documentation explaining:

  • The purpose of yieldedIndicator
  • The structure of toolCallMap
  • The significance of the boolean yield at the start

Add JSDoc comments:

/**
 * Manages chat interactions with tool support.
 * @param llm - The language model supporting tool calls
 * @param tools - Available tools for the chat
 * @param messages - Chat history
 * @returns ChatWithToolsResponse containing tool calls and/or response generator
 * 
 * The function uses an async generator to:
 * 1. Yield a boolean indicating if tool calls are present
 * 2. Accumulate tool calls in a map while streaming
 * 3. Yield the final response with complete tool calls
 */
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 3cae9d7 and 7848b83.

📒 Files selected for processing (4)
  • templates/components/agents/typescript/financial_report/app/api/chat/workflow/factory.ts (1 hunks)
  • templates/components/agents/typescript/financial_report/app/api/chat/workflow/finReport.ts (1 hunks)
  • templates/components/engines/typescript/agent/tools/form-filling.ts (1 hunks)
  • templates/components/multiagent/typescript/workflow/tools.ts (1 hunks)
🧰 Additional context used
📓 Path-based instructions (4)
templates/components/agents/typescript/financial_report/app/api/chat/workflow/factory.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/agents/typescript/financial_report/app/api/chat/workflow/finReport.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/engines/typescript/agent/tools/form-filling.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/multiagent/typescript/workflow/tools.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

🪛 eslint
templates/components/agents/typescript/financial_report/app/api/chat/workflow/factory.ts

[error] 1-1: Parsing error: The keyword 'import' is reserved

templates/components/agents/typescript/financial_report/app/api/chat/workflow/finReport.ts

[error] 1-1: Parsing error: The keyword 'import' is reserved

templates/components/engines/typescript/agent/tools/form-filling.ts

[error] 1-1: Parsing error: The keyword 'import' is reserved

templates/components/multiagent/typescript/workflow/tools.ts

[error] 1-1: Parsing error: The keyword 'import' is reserved

🔇 Additional comments (3)
templates/components/agents/typescript/financial_report/app/api/chat/workflow/factory.ts (1)

1-8: LGTM! Well-organized imports and reasonable timeout value.

The imports are specific and the 6-minute timeout seems appropriate for a complex financial report workflow.

🧰 Tools
🪛 eslint

[error] 1-1: Parsing error: The keyword 'import' is reserved

templates/components/agents/typescript/financial_report/app/api/chat/workflow/finReport.ts (2)

126-131: Fix message role in memory.put().

As noted in the previous review, the message about calling different tools should come from the assistant, not the user.


60-63: Review the default timeout value.

The default timeout of 360 seconds (6 minutes) seems quite long. Consider if this could lead to poor user experience for failed operations.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Outside diff range and nitpick comments (4)
templates/components/multiagent/typescript/workflow/stream.ts (2)

10-19: Add JSDoc documentation for better maintainability.

Consider adding documentation to explain the purpose and parameters of this function.

+/**
+ * Creates a readable stream from a workflow context that handles chat responses and agent events.
+ * @param context - The workflow context containing message content and chat response chunks
+ * @returns A promise containing the readable stream and stream data
+ */
 export async function createStreamFromWorkflowContext(
   context: WorkflowContext<
     MessageContent,
     ChatResponseChunk,
     unknown | undefined
   >,
 ): Promise<{ stream: ReadableStream<string>; streamData: StreamData }> {

26-43: Consider performance implications of nested async loops.

The nested for await loops could impact performance with large datasets. Consider implementing a more efficient event processing mechanism or adding batch processing for chunks.

templates/components/agents/typescript/financial_report/app/api/chat/workflow/factory.ts (1)

9-42: Consider type safety improvements and array handling optimization.

The function implementation is solid, but could benefit from some improvements:

  1. Add explicit return type annotation for better type safety
  2. Optimize array operations to avoid multiple slicing

Consider applying these improvements:

-const prepareChatHistory = (chatHistory: Message[]): ChatMessage[] => {
+const prepareChatHistory = (chatHistory: Message[]): ChatMessage[] => {
+  if (chatHistory.length === 0) return [];
+
   // ... existing code ...
 
   if (agentContent) {
+    const lastMessage = chatHistory[chatHistory.length - 1];
+    const previousMessages = chatHistory.slice(0, -1);
     return [
-      ...chatHistory.slice(0, -1),
+      ...previousMessages,
       agentMessage,
-      chatHistory.slice(-1)[0],
+      lastMessage,
     ] as ChatMessage[];
   }
   return chatHistory as ChatMessage[];
 };
templates/components/multiagent/typescript/workflow/single-agent.ts (1)

Line range hint 138-187: Consider breaking down handleLLMInputStream for better maintainability.

The handleLLMInputStream method is quite complex with multiple responsibilities. Consider extracting the response generator logic into a separate method for better maintainability and testability.

 private async handleLLMInputStream(
   ctx: HandlerContext<FunctionCallingAgentContextData>,
   ev: InputEvent,
 ): Promise<StopEvent<AsyncGenerator> | ToolCallEvent> {
   const { llm, tools, memory } = this;
   const llmArgs = { messages: this.chatHistory, tools };
+
+  const generator = await this.createResponseGenerator(llmArgs, memory);
+  const isToolCall = await generator.next();
+
+  if (isToolCall.value) {
+    const fullResponse = await generator.next();
+    const toolCalls = this.getToolCallsFromResponse(
+      fullResponse.value as ChatResponseChunk<ToolCallLLMMessageOptions>,
+    );
+    return new ToolCallEvent({ toolCalls });
+  }
+
+  this.writeEvent("Finished task", ctx);
+  return new StopEvent(generator);
+}
+
+private async createResponseGenerator(
+  llmArgs: { messages: ChatMessage[]; tools: BaseToolWithCall[] },
+  memory: ChatMemoryBuffer,
+): Promise<AsyncGenerator<boolean | ChatResponseChunk<object>>> {
   const responseGenerator = async function* () {
     const responseStream = await llm.chat({ ...llmArgs, stream: true });

     let fullResponse = null;
     let yieldedIndicator = false;
     for await (const chunk of responseStream) {
       const hasToolCalls = chunk.options && "toolCall" in chunk.options;
       if (!hasToolCalls) {
         if (!yieldedIndicator) {
           yield false;
           yieldedIndicator = true;
         }
         yield chunk;
       } else if (!yieldedIndicator) {
         yield true;
         yieldedIndicator = true;
       }

       fullResponse = chunk;
     }

     if (fullResponse?.options && Object.keys(fullResponse.options).length) {
       memory.put({
         role: "assistant",
         content: "",
         options: fullResponse.options,
       });
       yield fullResponse;
     }
   };

-  const generator = responseGenerator();
-  const isToolCall = await generator.next();
-  if (isToolCall.value) {
-    const fullResponse = await generator.next();
-    const toolCalls = this.getToolCallsFromResponse(
-      fullResponse.value as ChatResponseChunk<ToolCallLLMMessageOptions>,
-    );
-    return new ToolCallEvent({ toolCalls });
-  }
-
-  this.writeEvent("Finished task", ctx);
-  return new StopEvent(generator);
+  return responseGenerator();
 }
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 7848b83 and a05d444.

📒 Files selected for processing (7)
  • templates/components/agents/typescript/financial_report/app/api/chat/workflow/factory.ts (1 hunks)
  • templates/components/agents/typescript/financial_report/app/api/chat/workflow/finReport.ts (1 hunks)
  • templates/components/multiagent/typescript/nextjs/route.ts (3 hunks)
  • templates/components/multiagent/typescript/workflow/single-agent.ts (7 hunks)
  • templates/components/multiagent/typescript/workflow/stream.ts (1 hunks)
  • templates/components/multiagent/typescript/workflow/tools.ts (1 hunks)
  • templates/components/multiagent/typescript/workflow/type.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • templates/components/agents/typescript/financial_report/app/api/chat/workflow/finReport.ts
  • templates/components/multiagent/typescript/workflow/tools.ts
🧰 Additional context used
📓 Path-based instructions (5)
templates/components/agents/typescript/financial_report/app/api/chat/workflow/factory.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/multiagent/typescript/nextjs/route.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/multiagent/typescript/workflow/single-agent.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/multiagent/typescript/workflow/stream.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/multiagent/typescript/workflow/type.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

🔇 Additional comments (17)
templates/components/multiagent/typescript/nextjs/route.ts (5)

2-9: LGTM: Import statements are well-organized

The new imports are properly structured and align with the added functionality.


Line range hint 23-30: LGTM: Improved message validation

The validation logic has been properly extracted into a separate function, making it more maintainable. The error response is clear and uses the appropriate HTTP status code.


34-36: Consider applying the suggested conversion function

As suggested in the previous review, consider using convertToChatHistory for proper message conversion.

-      chatHistory: messages,
+      chatHistory: convertToChatHistory(messages),

44-45: ⚠️ Potential issue

Address the TODO comment regarding StreamingTextResponse deprecation

The code is using a deprecated API. Consider migrating to the recommended alternative.

Would you like me to help identify and implement the recommended alternative to StreamingTextResponse?


39-39: ⚠️ Potential issue

Avoid unsafe type casting

The type cast to MessageContent might be unsafe. Consider adding proper type validation or using a type guard.

✅ Verification successful

Type casting is safe in this context

The type cast is actually safe here because retrieveMessageContent function already returns MessageContent type and properly structures the data. The function extracts the last user message, converts it to the expected format with proper type checking, and includes any annotations. The type assertion is redundant but not unsafe.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if MessageContent type is properly validated elsewhere
ast-grep --pattern 'function isValidMessages($_) {
  $$$
  instanceof MessageContent
  $$$
}'

Length of output: 760


Script:

#!/bin/bash
# Check the type definition and usage of MessageContent
rg -A 5 "type MessageContent" 

# Check how userMessageContent is defined and validated
rg -B 5 "userMessageContent.*MessageContent"

# Look for any type validation or type guard related to MessageContent
rg -A 5 "instanceof.*MessageContent|isMessageContent"

Length of output: 3226


Script:

#!/bin/bash
# Check the implementation of retrieveMessageContent function
rg -A 10 "function retrieveMessageContent"

# Look for MessageContent type definition in the codebase
fd -e ts -e tsx -x cat {} | rg -A 5 "interface MessageContent|type MessageContent"

# Check if there's any validation in the workflow.run implementation
ast-grep --pattern 'run($message) {
  $$$
}'

Length of output: 1219

templates/components/multiagent/typescript/workflow/stream.ts (3)

1-7: LGTM! Imports are well organized and types are properly defined.


52-55: LGTM! Clean return structure with proper stream transformation.


58-67: LGTM! Well-structured event transformation following the suggested pattern.

The implementation correctly moves the agent concerns to the events as suggested in the previous review.

templates/components/multiagent/typescript/workflow/single-agent.ts (4)

2-2: LGTM! Well-structured type definition.

The replacement of Context with HandlerContext and the introduction of FunctionCallingAgentContextData type improves type safety and makes the streaming flag handling more explicit.

Also applies to: 30-32


34-38: LGTM! Improved type safety and workflow step structure.

The changes enhance the code in two ways:

  1. The class signature now properly types the workflow with FunctionCallingAgentContextData
  2. The workflow steps are more clearly defined using an object format that explicitly shows input/output event types

Also applies to: 75-95


102-107: LGTM! Improved context handling.

The context handling has been updated to use the new HandlerContext<FunctionCallingAgentContextData> type, making the streaming flag access more type-safe.

Also applies to: 116-120


230-235: LGTM! Improved event handling.

The writeEvent method has been properly updated to use the new context type and ctx.sendEvent for sending events.

templates/components/multiagent/typescript/workflow/type.ts (5)

1-2: Imports are correctly updated

The imports for WorkflowEvent and MessageContent ensure that all necessary dependencies are included.


5-5: Enhanced flexibility for message property

Updating the message property to accept both string and MessageContent types allows for greater flexibility in handling different message formats.


9-17: Introduction of new event types and data structures

The addition of AgentRunEventType, ProgressEventData, and AgentRunEventData provides a clear and structured way to handle different types of agent run events and their associated data.


21-24: Updated AgentRunEvent class with new properties

The AgentRunEvent class now includes text, type, and an optional data property, which align with the new event types and enhance event handling capabilities.


25-35: Constructor handles default type value appropriately

The constructor updates correctly handle optional parameters and assign a default value of "text" to type when it is not provided, ensuring consistent behavior.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Outside diff range and nitpick comments (6)
templates/components/agents/typescript/financial_report/app/api/chat/workflow/finReport.ts (3)

36-40: Fix grammatical issues in the system prompt

The system prompt contains several grammatical errors that should be corrected for better clarity.

Apply this diff to fix the issues:

 const DEFAULT_SYSTEM_PROMPT = `
-You are a financial analyst who are given a set of tools to help you.
-It's good to using appropriate tools for the user request and always use the information from the tools, don't make up anything yourself.
-For the query engine tool, you should break down the user request into a list of queries and call the tool with the queries.
+You are a financial analyst who has been given a set of tools to help you.
+You should use appropriate tools for the user request and always rely on information from the tools. Do not make up anything yourself.
+For the query engine tool, break down the user request into a list of queries and call the tool with these queries.
 `;

193-220: Improve error handling in handleResearch

The method doesn't handle potential errors from callTools. Consider adding try-catch blocks and proper error handling.

Apply this diff to improve error handling:

 private async handleResearch(ctx: HandlerContext<null>, ev: ResearchEvent) {
   ctx.sendEvent(
     new AgentRunEvent({
       name: "Researcher",
       text: "Researching data",
       type: "text",
     }),
   );

   const { toolCalls } = ev.data;

+  try {
     const toolMsgs = await callTools(
       toolCalls,
       [this.queryEngineTool],
       ctx,
       "Researcher",
     );
     for (const toolMsg of toolMsgs) {
       this.memory.put(toolMsg);
     }
+  } catch (error) {
+    this.memory.put({
+      role: "assistant",
+      content: `Error during research: ${error.message}`,
+    });
+  }
   return new AnalyzeEvent({
     input: {
       role: "assistant",
       content:
         "I have finished researching the data, please analyze the data.",
     },
   });
 }

287-307: Improve error handling in handleReportGeneration

The method checks for tool availability but could benefit from better error handling for the callTools operation.

Apply this diff to improve error handling:

 private async handleReportGeneration(
   ctx: HandlerContext<null>,
   ev: ReportGenerationEvent,
 ) {
   const { toolCalls } = ev.data;

   if (!this.documentGeneratorTool) {
     throw new Error("Document generator tool is not available");
   }

+  try {
     const toolMsgs = await callTools(
       toolCalls,
       [this.documentGeneratorTool],
       ctx,
       "Reporter",
     );
     for (const toolMsg of toolMsgs) {
       this.memory.put(toolMsg);
     }
+  } catch (error) {
+    this.memory.put({
+      role: "assistant",
+      content: `Error generating report: ${error.message}`,
+    });
+  }
   return new InputEvent({ input: this.memory.getMessages() });
 }
templates/components/agents/typescript/form_filling/app/api/chat/workflow/formFilling.ts (3)

192-213: Refactor similar methods to reduce code duplication

The methods handleExtractMissingCells, handleFindAnswers, and handleFillMissingCells share similar structures and logic. To enhance maintainability and readability, consider refactoring them into a single generic method that handles tool calls based on the event type.

Also applies to: 216-239, 241-261


132-134: Ensure consistent use of context types

The parameter ctx alternates between Context and HandlerContext<null> across different methods (handleLLMInput, handleExtractMissingCells, handleFindAnswers, handleFillMissingCells). For consistency and clarity, use the same context type in all handler methods.

Also applies to: 146-147, 193-194, 216-217, 242-243


73-83: Destructure options in the constructor for cleaner code

To improve readability, destructure the options parameter in the constructor. This simplifies the initialization of class properties and makes the code more concise.

Apply this diff:

     constructor({
+      llm = Settings.llm as ToolCallLLM,
+      chatHistory,
+      extractorTool,
+      queryEngineTool,
+      fillMissingCellsTool,
+      systemPrompt = DEFAULT_SYSTEM_PROMPT,
+      writeEvents,
+      verbose = false,
+      timeout = 360,
+    }: {
       llm?: ToolCallLLM;
       chatHistory: ChatMessage[];
       extractorTool: BaseToolWithCall;
       queryEngineTool?: BaseToolWithCall;
       fillMissingCellsTool: BaseToolWithCall;
       systemPrompt?: string;
       writeEvents?: boolean;
       verbose?: boolean;
       timeout?: number;
     }) {
       super({
-        verbose: options?.verbose ?? false,
-        timeout: options?.timeout ?? 360,
+        verbose,
+        timeout,
       });

-      this.llm = options.llm ?? (Settings.llm as ToolCallLLM);
-      this.systemPrompt = options.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;
-      this.writeEvents = options.writeEvents;
-      this.extractorTool = options.extractorTool;
-      this.queryEngineTool = options.queryEngineTool;
-      this.fillMissingCellsTool = options.fillMissingCellsTool;
+      this.llm = llm;
+      this.systemPrompt = systemPrompt;
+      this.writeEvents = writeEvents;
+      this.extractorTool = extractorTool;
+      this.queryEngineTool = queryEngineTool;
+      this.fillMissingCellsTool = fillMissingCellsTool;

       this.memory = new ChatMemoryBuffer({
         llm: this.llm,
         chatHistory,
       });
     }
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between a05d444 and ef86d64.

📒 Files selected for processing (2)
  • templates/components/agents/typescript/financial_report/app/api/chat/workflow/finReport.ts (1 hunks)
  • templates/components/agents/typescript/form_filling/app/api/chat/workflow/formFilling.ts (1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
templates/components/agents/typescript/financial_report/app/api/chat/workflow/finReport.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/agents/typescript/form_filling/app/api/chat/workflow/formFilling.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Outside diff range and nitpick comments (5)
templates/components/multiagent/typescript/workflow/type.ts (1)

9-17: LGTM! Consider adding JSDoc comments.

The type definitions are well-structured. The progress event data includes all necessary properties for tracking progress, and the type alias provides flexibility for future extensions.

Consider adding JSDoc comments to document the purpose and usage of these types:

+/** Type of events that can be emitted during agent execution */
 export type AgentRunEventType = "text" | "progress";

+/** Data structure for tracking progress of long-running operations */
 export type ProgressEventData = {
   id: string;
   total: number;
   current: number;
 };
templates/components/agents/typescript/form_filling/app/api/chat/workflow/formFilling.ts (3)

38-38: Improve clarity of system prompt instruction

The instruction about handling missing data could be clearer. Consider rephrasing to explicitly state when to warn users about insufficient data.

-If there is no query engine tool or the gathered information has many N/A values indicating the questions don't match the data, respond with a warning and ask the user to upload a different file or connect to a knowledge base.
+If either (1) the query engine tool is unavailable or (2) the gathered information contains too many N/A values (indicating data mismatch), respond with a warning asking the user to either upload a different file or connect to a knowledge base.

81-127: Consider adding error handling steps

The workflow steps are well-structured, but consider adding error handling steps to gracefully handle failures in each stage of the workflow.

+    // Add error handling step
+    this.addStep(
+      {
+        inputs: [WorkflowError],
+        outputs: [InputEvent],
+      },
+      this.handleError.bind(this),
+    );

251-256: Improve consistency in tool call parameters

For better readability and maintainability, consider using a parameter object for tool calls across all handlers.

-    const toolMsgs = await callTools(
-      toolCalls,
-      [this.fillMissingCellsTool],
-      ctx,
-      "Processor",
-    );
+    const toolMsgs = await callTools({
+      toolCalls,
+      tools: [this.fillMissingCellsTool],
+      ctx,
+      name: "Processor",
+    });
templates/components/agents/typescript/financial_report/app/api/chat/workflow/finReport.ts (1)

35-39: Fix grammatical error in system prompt.

The system prompt contains a grammatical error.

-You are a financial analyst who are given a set of tools to help you.
+You are a financial analyst who is given a set of tools to help you.
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between ef86d64 and bd8812b.

📒 Files selected for processing (6)
  • templates/components/agents/typescript/financial_report/app/api/chat/workflow/finReport.ts (1 hunks)
  • templates/components/agents/typescript/form_filling/app/api/chat/workflow/factory.ts (1 hunks)
  • templates/components/agents/typescript/form_filling/app/api/chat/workflow/formFilling.ts (1 hunks)
  • templates/components/llamaindex/typescript/documents/upload.ts (1 hunks)
  • templates/components/multiagent/typescript/nextjs/route.ts (3 hunks)
  • templates/components/multiagent/typescript/workflow/type.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • templates/components/agents/typescript/form_filling/app/api/chat/workflow/factory.ts
🧰 Additional context used
📓 Path-based instructions (5)
templates/components/agents/typescript/financial_report/app/api/chat/workflow/finReport.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/agents/typescript/form_filling/app/api/chat/workflow/formFilling.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/llamaindex/typescript/documents/upload.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/multiagent/typescript/nextjs/route.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/multiagent/typescript/workflow/type.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

🔇 Additional comments (10)
templates/components/multiagent/typescript/workflow/type.ts (2)

19-36: LGTM! Clean implementation with good defaults.

The class implementation:

  • Properly extends WorkflowEvent with type-safe parameters
  • Handles optional parameters gracefully
  • Maintains backward compatibility with default type "text"

1-8: Verify the impact of MessageContent type change.

The change from string to MessageContent type for the message property is a breaking change. While this aligns with the TypeScript implementation's need for annotated messages, we should ensure all consumers are updated.

templates/components/multiagent/typescript/nextjs/route.ts (3)

2-2: LGTM: Import statements are properly organized

The new imports align well with the added functionality for message validation and content retrieval.

Also applies to: 5-8


32-39: Consider applying the previous review suggestion

A previous review suggested using convertToChatHistory(messages) instead of passing messages directly. This change wasn't applied.


Line range hint 22-29: Verify the implementation of isValidMessages function

The validation logic has been moved to a separate function, which is good for modularity. However, we should verify its implementation.

✅ Verification successful

Implementation of isValidMessages function is properly implemented

The function is implemented in templates/components/llamaindex/typescript/streaming/annotations.ts and correctly validates:

  • The existence of messages array
  • That the last message exists (array not empty)
  • That the last message is from the "user" role

The implementation aligns perfectly with the error message shown in the review comment.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the implementation of isValidMessages function
# Expected: Function should validate that messages exist and last message is from user

# Search for the implementation of isValidMessages
ast-grep --pattern 'function isValidMessages($_) {
  $$$
}'

Length of output: 61


Script:

#!/bin/bash
# Let's try different approaches to find the isValidMessages implementation

# Search for isValidMessages with ripgrep to find its definition
rg "isValidMessages" -A 5

# Also search for const/let declaration in case it's an arrow function
ast-grep --pattern 'const isValidMessages = $_'

# And search for export declaration
ast-grep --pattern 'export const isValidMessages = $_'

Length of output: 4331

templates/components/llamaindex/typescript/documents/upload.ts (2)

20-20: Address the removal of hasCodeExecutorTool.

The hasCodeExecutorTool check was removed as noted in the past review comments. This simplification aligns with the new form-filling workflow, but we should ensure all CSV processing is now handled by the new form-filling tools.

Let's verify the migration to new tools:

#!/bin/bash
# Description: Verify CSV processing is handled by new form-filling tools
# Test: Look for new CSV processing implementations
ast-grep --pattern 'class $_ implements Tool {
  $$$
  csv
  $$$
}'

19-20: Verify the CSV handling bypass.

The change to bypass indexing for CSV files aligns with the new form-filling workflow. However, we should verify that this doesn't break existing functionality.

Let's check for any direct dependencies on CSV indexing:

✅ Verification successful

CSV indexing bypass is intentional and correct

The change to bypass indexing for CSV files is part of a deliberate feature implementation for form-filling functionality. Evidence from the codebase shows:

  1. A dedicated form-filling workflow exists that handles CSV files differently:

    • templates/components/engines/typescript/agent/tools/form-filling.ts implements specialized CSV processing
    • templates/components/agents/typescript/form_filling/app/api/chat/workflow/formFilling.ts contains the form-filling agent
  2. The FastAPI implementation (templates/types/streaming/fastapi/app/services/file.py) has the same pattern:

    # Don't index csv files (they are handled by tools)
    if extension == "csv":
        return document_file
  3. CSV files are meant to be processed by specialized tools rather than being indexed:

    • Form filling tools extract and fill missing cells
    • CSV files are treated as structured data for form operations rather than knowledge base content
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Search for code that might expect CSV files to be indexed
# Test 1: Look for references to CSV indexing
rg -i "csv.*index" 

# Test 2: Look for tests involving CSV files
rg -i "test.*csv"

Length of output: 163


Script:

#!/bin/bash
# Let's try a more comprehensive search strategy

# Search for CSV-related functionality
rg -i "csv" -A 3 -B 3

# Search for file type handling patterns
rg "mimeType.*=.*" -A 3 -B 3

# Look for test files that might involve document processing
fd "test" -e ts -e js -x cat {}

Length of output: 32612

templates/components/agents/typescript/form_filling/app/api/chat/workflow/formFilling.ts (1)

20-33: LGTM: Well-structured event definitions

The custom event classes are well-defined with proper type parameters and follow a consistent pattern.

templates/components/agents/typescript/financial_report/app/api/chat/workflow/finReport.ts (2)

1-34: LGTM! Well-structured imports and event definitions.

The imports are logically grouped and the event classes are well-defined with appropriate type parameters.


82-128: LGTM! Well-structured workflow step definitions.

The workflow steps are clearly defined with appropriate input and output event types, creating a logical flow through the financial report generation process.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Outside diff range and nitpick comments (8)
templates/components/llamaindex/typescript/streaming/annotations.ts (1)

85-104: Add data validation for agent annotations.

While the function works correctly, consider adding validation for the annotation data structure to prevent runtime errors if the data doesn't match the expected format.

   const agentAnnotations = getAnnotations<{ agent: string; text: string }>(
     messages,
     { role: "assistant", type: "agent" },
   ).slice(-maxAgentMessages);

+  // Validate annotation data structure
+  const validAnnotations = agentAnnotations.filter(
+    (annotation) => 
+      annotation.data &&
+      typeof annotation.data.text === 'string' &&
+      typeof annotation.data.agent === 'string'
+  );

-  if (agentAnnotations.length > 0) {
+  if (validAnnotations.length > 0) {
     const messageContent =
       "Here is the previous conversation of agents:\n" +
-      agentAnnotations.map((annotation) => annotation.data.text).join("\n");
+      validAnnotations.map((annotation) => annotation.data.text).join("\n");
templates/components/agents/typescript/form_filling/workflow/form-filling.ts (3)

186-187: Simplify Condition with Optional Chaining

You can use optional chaining to simplify the condition on lines 186-187, enhancing readability.

Apply this diff to simplify the condition:

- if (
-     this.queryEngineTools &&
-     this.queryEngineTools.some((tool) => tool.metadata.name === toolName)
- ) {
+ if (this.queryEngineTools?.some((tool) => tool.metadata.name === toolName)) {
🧰 Tools
🪛 Biome

[error] 186-187: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


35-41: Avoid Contractions in System Prompt for Formal Tone

In the DEFAULT_SYSTEM_PROMPT, consider replacing contractions with full words to maintain a formal tone.

Apply this diff to adjust the prompt:

 Only use the information from the retriever tool - 
- don't make up any information yourself. Fill N/A if an answer is not found.
+ do not make up any information yourself. Fill N/A if an answer is not found.

197-219: Refactor Repetitive Methods to Reduce Code Duplication

The methods handleExtractMissingCells, handleFindAnswers, and handleFillMissingCells contain similar code structures. Consider refactoring shared logic into a common helper function to adhere to the DRY (Don't Repeat Yourself) principle and improve maintainability.

Also applies to: 221-247, 249-265

templates/components/agents/typescript/financial_report/workflow/fin-report.ts (4)

35-39: Correct grammatical errors in DEFAULT_SYSTEM_PROMPT

There are grammatical errors in the DEFAULT_SYSTEM_PROMPT string that could affect clarity.

Apply this diff to fix the grammatical errors:

 const DEFAULT_SYSTEM_PROMPT = `
-You are a financial analyst who are given a set of tools to help you.
+You are a financial analyst who is given a set of tools to help you.
-It's good to using appropriate tools for the user request and always use the information from the tools, don't make up anything yourself.
+It's good to use appropriate tools for the user's request and always use the information from the tools; don't make up anything yourself.
 For the query engine tool, you should break down the user request into a list of queries and call the tool with the queries.
 `;

184-185: Simplify null checks using optional chaining

You can simplify the null check by using optional chaining to make the code more concise.

Apply this diff to use optional chaining:

         if (
-          this.queryEngineTools &&
-          this.queryEngineTools.some((tool) => tool.metadata.name === toolName)
+          this.queryEngineTools?.some((tool) => tool.metadata.name === toolName)
         ) {
🧰 Tools
🪛 Biome

[error] 184-185: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


241-247: Fix grammatical errors in analysisPrompt

Minor grammatical corrections in the analysisPrompt will improve readability.

Apply this diff to correct the grammar:

 const analysisPrompt = `
   You are an expert in analyzing financial data.
   You are given a set of financial data to analyze. Your task is to analyze the financial data and return a report.
   Your response should include a detailed analysis of the financial data, including any trends, patterns, or insights that you find.
   Construct the analysis in textual format; including tables would be great!
-  Don't need to synthesize the data, just analyze and provide your findings.
+  You don't need to synthesize the data; just analyze and provide your findings.
   `;

192-192: Enhance error message for unknown tools

Including the tool name in quotes improves the clarity of the error message.

Apply this diff to adjust the error message:

           throw new Error(`Unknown tool: ${toolName}`);
+          throw new Error(`Unknown tool '${toolName}' encountered.`);
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 8dd5dfd and ab6e5dc.

📒 Files selected for processing (7)
  • templates/components/agents/typescript/blog/workflow/agents.ts (1 hunks)
  • templates/components/agents/typescript/financial_report/workflow/factory.ts (1 hunks)
  • templates/components/agents/typescript/financial_report/workflow/fin-report.ts (1 hunks)
  • templates/components/agents/typescript/form_filling/workflow/factory.ts (1 hunks)
  • templates/components/agents/typescript/form_filling/workflow/form-filling.ts (1 hunks)
  • templates/components/llamaindex/typescript/streaming/annotations.ts (4 hunks)
  • templates/components/multiagent/typescript/express/chat.controller.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (4)
  • templates/components/agents/typescript/blog/workflow/agents.ts
  • templates/components/agents/typescript/financial_report/workflow/factory.ts
  • templates/components/agents/typescript/form_filling/workflow/factory.ts
  • templates/components/multiagent/typescript/express/chat.controller.ts
🧰 Additional context used
📓 Path-based instructions (3)
templates/components/agents/typescript/financial_report/workflow/fin-report.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/agents/typescript/form_filling/workflow/form-filling.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/llamaindex/typescript/streaming/annotations.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

🪛 Biome
templates/components/agents/typescript/financial_report/workflow/fin-report.ts

[error] 184-185: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

templates/components/agents/typescript/form_filling/workflow/form-filling.ts

[error] 186-187: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

🔇 Additional comments (3)
templates/components/llamaindex/typescript/streaming/annotations.ts (3)

67-83: LGTM! Input validation and type safety implemented correctly.

The implementation properly handles:

  • Input validation for null/undefined messages
  • Safe type conversion through explicit mapping
  • Integration with agent history

179-182: LGTM! Clean and efficient filtering of user messages.

The refactored implementation improves readability by filtering user messages first before processing annotations.


132-135: ⚠️ Potential issue

Add path sanitization to prevent path traversal.

The file path construction needs protection against path traversal attacks.

   // Include local file path
+  const sanitizedFileName = file.name.replace(/[/\\]|\.{2,}/g, '');
-  const localFilePath = `${UPLOADED_FOLDER}/${file.name}`;
+  const localFilePath = `${UPLOADED_FOLDER}/${sanitizedFileName}`;
   defaultContent += `Local file path (instruction: use for local tool that requires a local path): ${localFilePath}\n`;

@himself65
Copy link
Member

BTW, if you think pass this to handler is necessary, please justify me

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Outside diff range and nitpick comments (4)
templates/components/agents/typescript/financial_report/workflow/factory.ts (1)

6-6: Document the rationale for the timeout value

The timeout constant of 360 seconds (6 minutes) lacks documentation explaining why this specific duration was chosen. Consider adding a comment explaining the rationale and any factors that influenced this value.

+// Maximum time (in milliseconds) allowed for the workflow to complete
+// Set to 6 minutes based on average completion time of financial report generation
 const TIMEOUT = 360 * 1000;
templates/components/engines/typescript/agent/tools/index.ts (1)

65-70: Consider adding type validation before casting config.

While the implementation follows the factory pattern consistently, the direct type casting of the config parameter could be unsafe. Consider adding runtime type validation before casting.

Example improvement:

 form_filling: async (config: unknown) => {
+  const validateConfig = (config: unknown): config is ExtractMissingCellsParams & FillMissingCellsParams => {
+    const c = config as any;
+    return typeof c === 'object' && c !== null;
+    // Add specific field validations here
+  };
+  
+  if (!validateConfig(config)) {
+    throw new Error('Invalid configuration for form_filling tools');
+  }
+
   return [
     new ExtractMissingCellsTool(config as ExtractMissingCellsParams),
     new FillMissingCellsTool(config as FillMissingCellsParams),
   ];
 },
templates/components/multiagent/typescript/workflow/tools.ts (2)

1-18: Consider splitting this file into smaller, focused modules.

The file contains multiple distinct responsibilities (query engine tools, tool calling, chat responses). Consider splitting it into separate modules for better maintainability:

  • query-engine.ts for query engine related code
  • tool-caller.ts for tool calling functions
  • chat-response.ts for chat response handling

208-219: Improve method naming consistency.

Consider renaming methods to follow common boolean naming conventions:

  • hasMultipleTools() is good
  • hasToolCall() could be hasToolCalls() for consistency with the property name
  • getToolNames() is good
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between ab6e5dc and 613af08.

📒 Files selected for processing (6)
  • templates/components/agents/typescript/financial_report/workflow/factory.ts (1 hunks)
  • templates/components/agents/typescript/form_filling/workflow/factory.ts (1 hunks)
  • templates/components/engines/typescript/agent/tools/index.ts (3 hunks)
  • templates/components/multiagent/typescript/workflow/tools.ts (1 hunks)
  • templates/types/streaming/express/package.json (1 hunks)
  • templates/types/streaming/nextjs/package.json (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • templates/components/agents/typescript/form_filling/workflow/factory.ts
  • templates/types/streaming/express/package.json
  • templates/types/streaming/nextjs/package.json
🧰 Additional context used
📓 Path-based instructions (3)
templates/components/agents/typescript/financial_report/workflow/factory.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/engines/typescript/agent/tools/index.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/multiagent/typescript/workflow/tools.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

🔇 Additional comments (5)
templates/components/agents/typescript/financial_report/workflow/factory.ts (1)

8-20: ⚠️ Potential issue

Add proper error handling and remove non-null assertions

The current implementation has several issues:

  1. Uses dangerous non-null assertions
  2. Lacks error handling for missing required tools
  3. No validation of query engine tools

Apply this diff to add proper error handling and type safety:

 export async function createWorkflow(options: {
   chatHistory: ChatMessage[];
   llm?: ToolCallLLM;
 }) {
+  const codeInterpreterTool = await getTool("interpreter");
+  const documentGeneratorTool = await getTool("document_generator");
+  const queryEngineTools = await getQueryEngineTools() || [];
+
+  if (!codeInterpreterTool || !documentGeneratorTool) {
+    throw new Error(
+      'Required tools "interpreter" and "document_generator" must be available'
+    );
+  }
+
   return new FinancialReportWorkflow({
     chatHistory: options.chatHistory,
-    queryEngineTools: (await getQueryEngineTools()) || [],
-    codeInterpreterTool: (await getTool("interpreter"))!,
-    documentGeneratorTool: (await getTool("document_generator"))!,
+    queryEngineTools,
+    codeInterpreterTool,
+    documentGeneratorTool,
     llm: options.llm,
     timeout: TIMEOUT,
   });
 }

Note: This issue was previously raised in a past review comment, but hasn't been addressed in this implementation.

templates/components/engines/typescript/agent/tools/index.ts (1)

3-4: LGTM! Well-organized imports.

The imports are properly structured with core Node.js modules at the top and related form-filling imports grouped together.

Also applies to: 11-16

templates/components/multiagent/typescript/workflow/tools.ts (3)

22-22: 🛠️ Refactor suggestion

Improve environment variable parsing safety.

The current parsing of TOP_K could result in NaN. Use a safer parsing approach with validation.

-  const topK = process.env.TOP_K ? parseInt(process.env.TOP_K) : undefined;
+  const topK = process.env.TOP_K ? (Number.isNaN(parseInt(process.env.TOP_K)) ? undefined : parseInt(process.env.TOP_K)) : undefined;

Likely invalid or redundant comment.


272-275: 🛠️ Refactor suggestion

Remove unsafe type assertion.

The as any type assertion reduces type safety. Define a proper interface for the response structure.

+interface LLMResponse {
+  choices?: Array<{
+    finish_reason: string | null;
+  }>;
+}

 if (
   hasToolCalls &&
-  (chunk.raw as any)?.choices?.[0]?.finish_reason !== null
+  (chunk.raw as LLMResponse)?.choices?.[0]?.finish_reason !== null
 )

Likely invalid or redundant comment.


154-178: ⚠️ Potential issue

Improve error handling in callTool.

The error handler returns a message instead of properly propagating the error. This could mask issues and make debugging harder.

   error: (...args: unknown[]) => {
     console.error(`Tool ${toolCall.name} got error:`, ...args);
     if (eventEmitter) {
       eventEmitter(`Tool ${toolCall.name} got error: ${args.join(" ")}`);
     }
-    return {
-      content: JSON.stringify({
-        error: args.join(" "),
-      }),
-      role: "user",
-      options: {
-        toolResult: {
-          id: toolCall.id,
-          result: JSON.stringify({
-            error: args.join(" "),
-          }),
-          isError: true,
-        },
-      },
-    };
+    throw new Error(`Tool ${toolCall.name} failed: ${args.join(" ")}`);
   },

Likely invalid or redundant comment.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (3)
templates/components/multiagent/typescript/workflow/single-agent.ts (3)

35-36: Fix missing closing quotation mark in systemPrompt

The systemPrompt string in line 36 is missing a closing quotation mark after "history".

Apply this diff to fix the issue:

- If the request doesn't need any new information because it was in the conversation history, please return "The task doesn't need any new information. Please reuse the existing content in the conversation history.
+ If the request doesn't need any new information because it was in the conversation history, please return "The task doesn't need any new information. Please reuse the existing content in the conversation history."

42-60: Ensure consistent use of async in agent creation functions

The createWriter and createReviewer functions are not declared as async, whereas createResearcher and createPublisher are. For consistency and to simplify usage, consider declaring all agent creation functions as async, even if they do not currently use await internally. This ensures that callers can use them uniformly.

Apply this diff to createWriter:

-export const createWriter = (chatHistory: ChatMessage[]) => {
+export const createWriter = async (chatHistory: ChatMessage[]) => {

And to createReviewer:

-export const createReviewer = (chatHistory: ChatMessage[]) => {
+export const createReviewer = async (chatHistory: ChatMessage[]) => {

Also applies to: 62-78


6-95: Refactor to reduce code duplication among agent creation functions

The agent creation functions share a similar structure when initializing FunctionCallingAgent with name, systemPrompt, and chatHistory. Consider refactoring by extracting the common logic into a helper function to reduce code duplication and improve maintainability.

For example, create a helper function:

function createAgent(
  name: string,
  systemPrompt: string,
  chatHistory: ChatMessage[],
  tools: Tool[] = []
): FunctionCallingAgent {
  return new FunctionCallingAgent({
    name,
    systemPrompt,
    chatHistory,
    tools,
  });
}

Then use it in your agent creation functions:

export const createWriter = async (chatHistory: ChatMessage[]) => {
  return createAgent("writer", `...`, chatHistory);
};

export const createReviewer = async (chatHistory: ChatMessage[]) => {
  return createAgent("reviewer", `...`, chatHistory);
};
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 613af08 and e16426b.

📒 Files selected for processing (2)
  • templates/components/agents/typescript/blog/workflow/agents.ts (2 hunks)
  • templates/components/multiagent/typescript/workflow/single-agent.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • templates/components/agents/typescript/blog/workflow/agents.ts
🧰 Additional context used
📓 Path-based instructions (1)
templates/components/multiagent/typescript/workflow/single-agent.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Outside diff range and nitpick comments (8)
templates/components/multiagent/typescript/workflow/single-agent.ts (1)

Line range hint 37-69: Enhance error message for LLM type check

The runtime type check is good, but the error message could be more descriptive.

Consider this improvement:

-    if (!(this.llm instanceof ToolCallLLM)) {
-      throw new Error("LLM is not a ToolCallLLM");
+    if (!(this.llm instanceof ToolCallLLM)) {
+      throw new Error(
+        `LLM must be an instance of ToolCallLLM. Received: ${this.llm.constructor.name}`
+      );
+    }
templates/components/agents/typescript/form_filling/workflow/form-filling.ts (3)

20-33: Add JSDoc comments to document event classes.

Consider adding documentation to explain the purpose and usage of each event class. This will improve code maintainability and help other developers understand the workflow better.

Example:

/**
 * Event triggered when user input needs to be processed by the workflow.
 */
class InputEvent extends WorkflowEvent<{ input: ChatMessage[] }> {}

/**
 * Event triggered when missing cells need to be extracted from CSV.
 */
class ExtractMissingCellsEvent extends WorkflowEvent<{
  toolCalls: ToolCall[];
}> {}

35-41: Consider structuring and versioning the system prompt.

The system prompt contains important instructions but could benefit from:

  1. Being moved to a separate configuration file for easier maintenance
  2. Adding version information for tracking changes
  3. Using markdown or a similar format for better readability

Example structure:

// system-prompts/form-filling.ts
export const FORM_FILLING_PROMPT = {
  version: '1.0.0',
  content: `
# Form Filling Assistant

## Role
You are a helpful assistant who helps fill missing cells in a CSV file.

## Constraints
- Only use information from the retriever tool
- Don't make up any information
- Fill N/A if answer not found
...
  `
};

43-130: Enhance workflow configuration and documentation.

A few suggestions to improve the code:

  1. The timeout value of 360 seconds should be documented or made configurable
  2. The LLM type check error message could be more specific
  3. The workflow steps would benefit from documentation explaining their purpose

Consider these improvements:

 export class FormFillingWorkflow extends Workflow<
   null,
   AgentInput,
   ChatResponseChunk
 > {
+  static readonly DEFAULT_TIMEOUT_SECONDS = 360;
   // ... existing properties ...

   constructor(options: {
     llm?: ToolCallLLM;
     chatHistory: ChatMessage[];
     extractorTool: BaseToolWithCall;
     queryEngineTools?: BaseToolWithCall[];
     fillMissingCellsTool: BaseToolWithCall;
     systemPrompt?: string;
     verbose?: boolean;
-    timeout?: number;
+    timeoutSeconds?: number;
   }) {
     super({
       verbose: options?.verbose ?? false,
-      timeout: options?.timeout ?? 360,
+      timeout: options?.timeoutSeconds ?? FormFillingWorkflow.DEFAULT_TIMEOUT_SECONDS,
     });

     this.llm = options.llm ?? (Settings.llm as ToolCallLLM);
     if (!(this.llm instanceof ToolCallLLM)) {
-      throw new Error("LLM is not a ToolCallLLM");
+      throw new Error("The provided LLM must be an instance of ToolCallLLM for tool execution support");
     }
     // ... rest of the constructor ...

     // Document workflow steps
+    /**
+     * Step 1: Initialize chat history with system prompt and user message
+     */
     this.addStep(
       {
         inputs: [StartEvent<AgentInput>],
         outputs: [InputEvent],
       },
       this.prepareChatHistory,
     );
     // ... rest of the steps ...
   }
templates/components/agents/typescript/financial_report/workflow/fin-report.ts (4)

35-39: Fix grammatical issues in the system prompt

The system prompt contains grammatical errors that should be corrected for better clarity.

-You are a financial analyst who are given a set of tools to help you.
-It's good to using appropriate tools for the user request and always use the information from the tools, don't make up anything yourself.
+You are a financial analyst who is given a set of tools to help you.
+You should use appropriate tools for the user request and always use information from the tools. Don't make up anything yourself.

192-195: Use optional chaining for better code style

The condition can be simplified using optional chaining.

-        if (
-          this.queryEngineTools &&
-          this.queryEngineTools.some((tool) => tool.metadata.name === toolName)
-        ) {
+        if (this.queryEngineTools?.some((tool) => tool.metadata.name === toolName)) {
🧰 Tools
🪛 Biome

[error] 193-194: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


256-262: Move analysis prompt to a constant

Consider moving the analysis prompt to a constant at the top of the file alongside the DEFAULT_SYSTEM_PROMPT for better maintainability.

+const ANALYSIS_PROMPT = `
+  You are an expert in analyzing financial data.
+  You are given a set of financial data to analyze. Your task is to analyze the financial data and return a report.
+  Your response should include a detailed analysis of the financial data, including any trends, patterns, or insights that you find.
+  Construct the analysis in textual format; including tables would be great!
+  Don't need to synthesize the data, just analyze and provide your findings.
+`;

 export class FinancialReportWorkflow extends Workflow<

41-45: Consider implementing dependency injection for better testability

The workflow could benefit from dependency injection for the tools and memory buffer. This would make it easier to mock dependencies in tests and improve the overall testability of the workflow.

Consider creating an interface for the workflow dependencies:

interface FinancialReportWorkflowDeps {
  llm: ToolCallLLM;
  memory: ChatMemoryBuffer;
  queryEngineTools: BaseToolWithCall[];
  codeInterpreterTool: BaseToolWithCall;
  documentGeneratorTool: BaseToolWithCall;
}

And injecting it through the constructor:

constructor(deps: FinancialReportWorkflowDeps, options: {...})
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between e16426b and f07e58e.

📒 Files selected for processing (3)
  • templates/components/agents/typescript/financial_report/workflow/fin-report.ts (1 hunks)
  • templates/components/agents/typescript/form_filling/workflow/form-filling.ts (1 hunks)
  • templates/components/multiagent/typescript/workflow/single-agent.ts (4 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
templates/components/agents/typescript/financial_report/workflow/fin-report.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/agents/typescript/form_filling/workflow/form-filling.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/multiagent/typescript/workflow/single-agent.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

🪛 Biome
templates/components/agents/typescript/financial_report/workflow/fin-report.ts

[error] 193-194: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

templates/components/agents/typescript/form_filling/workflow/form-filling.ts

[error] 195-196: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

🔇 Additional comments (5)
templates/components/multiagent/typescript/workflow/single-agent.ts (4)

80-100: LGTM! Well-structured workflow definition

The workflow steps are clearly defined with proper type contracts for inputs and outputs, following a logical flow.


121-148: ⚠️ Potential issue

Add timeout handling for streaming responses

The streaming implementation should include timeout handling to prevent hanging, as mentioned in a previous review.

Applying the previously suggested improvement:

   if (ctx.data.streaming) {
+    const timeoutMs = 30000; // 30 seconds
+    const startTime = Date.now();
     if (!toolCallResponse.responseGenerator) {
       throw new Error("No streaming response");
     }
+    const originalGenerator = toolCallResponse.responseGenerator;
+    toolCallResponse.responseGenerator = async function* () {
+      for await (const chunk of originalGenerator) {
+        if (Date.now() - startTime > timeoutMs) {
+          throw new Error('Streaming response timeout after 30 seconds');
+        }
+        yield chunk;
+      }
+    };
     return new StopEvent(toolCallResponse.responseGenerator);
   }

150-168: ⚠️ Potential issue

Add error handling for tool calls

The tool calls implementation still needs proper error handling, as mentioned in a previous review.

Applying the previously suggested improvement:

   const { toolCalls } = ev.data;

-  const toolMsgs = await callTools({
-    tools: this.tools,
-    toolCalls,
-    ctx,
-    agentName: this.name,
-  });
+  let toolMsgs;
+  try {
+    toolMsgs = await callTools({
+      tools: this.tools,
+      toolCalls,
+      ctx,
+      agentName: this.name,
+    });
+  } catch (error) {
+    this.writeEvent(`Error executing tool calls: ${error.message}`, ctx);
+    toolMsgs = [{
+      role: "function",
+      content: `Error: ${error.message}`,
+      name: toolCalls[0]?.id ?? "unknown",
+    }];
+  }

1-18: LGTM! Verify package dependencies

The import changes and new type definitions look good. The types are well-structured and properly define the shape of the data.

Let's verify the package dependencies:

Also applies to: 29-35

templates/components/agents/typescript/financial_report/workflow/fin-report.ts (1)

20-33: LGTM: Well-structured event classes

The event classes are well-defined with appropriate type definitions for their specific purposes in the workflow.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (5)
templates/components/agents/typescript/financial_report/workflow/fin-report.ts (5)

35-39: Improve system prompt clarity and grammar

The system prompt contains grammatical errors and could be more structured. Consider this revision:

-You are a financial analyst who are given a set of tools to help you.
-It's good to using appropriate tools for the user request and always use the information from the tools, don't make up anything yourself.
-For the query engine tool, you should break down the user request into a list of queries and call the tool with the queries.
+You are a financial analyst equipped with specialized tools to assist you.
+Guidelines:
+1. Use appropriate tools for each user request
+2. Always rely on information from the tools - do not make assumptions
+3. When using the query engine tool:
+   - Break down user requests into specific queries
+   - Execute the tool with these queries

69-71: Enhance error message for LLM type check

The error message could be more descriptive to help with troubleshooting.

-      throw new Error("LLM is not a ToolCallLLM");
+      throw new Error("The provided LLM must be an instance of ToolCallLLM for tool execution support");

169-172: Improve error message for multiple tool calls

The error message could be more helpful by explaining why multiple different tools are not allowed and suggesting a workaround.

-          "Calling different tools is not allowed. Please only use multiple calls of the same tool.",
+          "Multiple different tools cannot be called simultaneously. Please restructure your request to use one tool at a time. You can make multiple calls to the same tool if needed.",

256-262: Consider externalizing the analysis prompt

The analysis prompt is hardcoded within the method. Consider moving it to a constants file or configuration to improve maintainability and reusability.

+// In constants.ts
+export const FINANCIAL_ANALYSIS_PROMPT = `
+You are an expert in analyzing financial data.
+You are given a set of financial data to analyze. Your task is to analyze the financial data and return a report.
+Your response should include a detailed analysis of the financial data, including any trends, patterns, or insights that you find.
+Construct the analysis in textual format; including tables would be great!
+Don't need to synthesize the data, just analyze and provide your findings.
+`;
+
+// In fin-report.ts
-      const analysisPrompt = `...`;
+      const analysisPrompt = FINANCIAL_ANALYSIS_PROMPT;

192-195: Use optional chaining for cleaner code

The condition check can be simplified using optional chaining.

-        if (
-          this.queryEngineTools &&
-          this.queryEngineTools.some((tool) => tool.metadata.name === toolName)
-        ) {
+        if (this.queryEngineTools?.some((tool) => tool.metadata.name === toolName)) {
🧰 Tools
🪛 Biome

[error] 193-194: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 0d9e49f and 2e6ad55.

📒 Files selected for processing (1)
  • templates/components/agents/typescript/financial_report/workflow/fin-report.ts (1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
templates/components/agents/typescript/financial_report/workflow/fin-report.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

🪛 Biome
templates/components/agents/typescript/financial_report/workflow/fin-report.ts

[error] 193-194: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

🔇 Additional comments (2)
templates/components/agents/typescript/financial_report/workflow/fin-report.ts (2)

1-34: LGTM! Well-structured event classes with clear purposes.

The event classes are well-defined with appropriate type definitions, providing a clear contract for the workflow steps.


64-66: Consider increasing the default timeout

The default timeout of 360 seconds might be insufficient for complex financial analysis tasks, especially when multiple tool calls are involved.

Let's check if there are any timeout-related issues in the repository:

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Outside diff range and nitpick comments (12)
templates/components/multiagent/typescript/workflow/type.ts (1)

9-17: LGTM! Well-structured event type definitions.

The type definitions are clear and provide good type safety. Using a type alias for AgentRunEventData provides flexibility for future extensions.

Consider using a discriminated union pattern if you plan to add more event types in the future:

type BaseEventData = {
  type: AgentRunEventType;
};

type TextEventData = BaseEventData & {
  type: "text";
  text: string;
};

type ProgressEventData = BaseEventData & {
  type: "progress";
  id: string;
  total: number;
  current: number;
};

type AgentRunEventData = TextEventData | ProgressEventData;
templates/components/multiagent/typescript/workflow/single-agent.ts (1)

37-41: Enhance error message for LLM type check

While the runtime check for ToolCallLLM is good, the error message could be more descriptive.

-      throw new Error("LLM is not a ToolCallLLM");
+      throw new Error(
+        "The provided LLM must be an instance of ToolCallLLM to support tool calling functionality. " +
+        "Please ensure you're using a compatible LLM implementation."
+      );

Also applies to: 67-69

templates/components/agents/typescript/blog/workflow/factory.ts (7)

22-22: Remove unused constant

The TIMEOUT constant is defined but never used in the code.

-const TIMEOUT = 360 * 1000;

33-37: Add documentation for BlogContext type

Consider adding JSDoc comments to document the purpose and properties of the BlogContext type.

+/**
+ * Context for managing blog post creation workflow state
+ * @property task - The blog post task/topic to write about
+ * @property attempts - Number of writing attempts made
+ * @property result - Latest version of the blog post
+ */
 type BlogContext = {
   task: string;
   attempts: number;
   result: string;
 };

46-63: Improve type safety in runAgent function

Consider using a generic type parameter to avoid type casting in the return value.

 const runAgent = async <T = string>(
   context: HandlerContext<BlogContext>,
   agent: FunctionCallingAgent,
   input: FunctionCallingAgentInput,
-) => {
+): Promise<StopEvent<T> | null> => {
   const agentContext = agent.run(input, {
     streaming: input.streaming ?? false,
   });
   for await (const event of agentContext) {
     if (event instanceof AgentRunEvent) {
       context.sendEvent(event);
     }
     if (event instanceof StopEvent) {
-      return event;
+      return event as StopEvent<T>;
     }
   }
   return null;
 };

93-104: Enhance decision-making prompt clarity and robustness

The current prompt could be more specific about the criteria for publishing vs writing decisions.

-If the user is asking for a file or to publish content, respond with 'publish'.
-If the user requests to write or update a blog post, respond with 'not_publish'.
+If the user is explicitly requesting to publish or access an existing blog post, respond with 'publish'.
+If the user wants to create new content, modify existing content, or requires research, respond with 'not_publish'.
+
+Examples:
+- "Can you publish my blog post?" -> 'publish'
+- "I need to write about AI" -> 'not_publish'
+- "Show me the blog post" -> 'publish'
+- "Let's create content about ML" -> 'not_publish'

174-178: Remove type casting by improving type definitions

The type casting to StopEvent<string> can be avoided by properly typing the runAgent function call.

-    const reviewResult = (await runAgent(context, reviewer, {
+    const reviewResult = await runAgent<string>(context, reviewer, {
       message: ev.data.input,
       displayName: "Reviewer",
       streaming: false,
-    })) as unknown as StopEvent<string>;
+    });
+    if (!reviewResult) {
+      throw new Error("Review failed to complete");
+    }

229-233: Simplify complex return type using type alias

Consider creating a type alias for the workflow return type to improve readability.

+type BlogWorkflowOutput = string | AsyncGenerator<boolean | ChatResponseChunk>;
+
 const workflow: Workflow<
   BlogContext,
   AgentInput,
-  string | AsyncGenerator<boolean | ChatResponseChunk>
+  BlogWorkflowOutput
 > = new Workflow();

276-288: Improve run method type safety

The run method override could benefit from stricter typing and error handling.

+type BlogWorkflowContext = WorkflowContext<
+  AgentInput,
+  BlogWorkflowOutput,
+  BlogContext
+>;
+
-  workflow.run = function (
+  workflow.run = function (this: typeof workflow,
     input: AgentInput,
-  ): WorkflowContext<
-    AgentInput,
-    string | AsyncGenerator<boolean | ChatResponseChunk>,
-    BlogContext
-  > {
+  ): BlogWorkflowContext {
+    if (!input.message) {
+      throw new Error("Input message is required");
+    }
     return Workflow.prototype.run.call(workflow, new StartEvent(input), {
       task: input.message.toString(),
       attempts: 0,
       result: "",
     });
   };
templates/components/agents/typescript/financial_report/workflow/fin-report.ts (3)

35-39: Fix grammatical errors in system prompt

The system prompt contains grammatical errors that could affect clarity.

-It's good to using appropriate tools for the user request and always use the information from the tools, don't make up anything yourself.
+It's good to use appropriate tools for the user request and always use information from the tools. Don't make up anything yourself.

192-195: Use optional chaining for better code readability

The condition check can be simplified using optional chaining.

-        if (
-          this.queryEngineTools &&
-          this.queryEngineTools.some((tool) => tool.metadata.name === toolName)
-        ) {
+        if (this.queryEngineTools?.some((tool) => tool.metadata.name === toolName)) {
🧰 Tools
🪛 Biome

[error] 193-194: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


77-80: Consider memory management for chat history

The ChatMemoryBuffer could potentially grow unbounded. Consider implementing a maximum size limit or a cleanup strategy for long-running workflows.

Consider adding a configuration option for maximum history size:

this.memory = new ChatMemoryBuffer({
  llm: this.llm,
  chatHistory: options.chatHistory,
  maxSize: options.maxHistorySize ?? 100, // Limit number of messages
});
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 2e6ad55 and 68b53cc.

⛔ Files ignored due to path filters (1)
  • templates/components/agents/typescript/form_filling/sec_10k_template.csv is excluded by !**/*.csv
📒 Files selected for processing (8)
  • helpers/typescript.ts (1 hunks)
  • templates/components/agents/typescript/blog/workflow/factory.ts (1 hunks)
  • templates/components/agents/typescript/financial_report/README-template.md (1 hunks)
  • templates/components/agents/typescript/financial_report/workflow/fin-report.ts (1 hunks)
  • templates/components/agents/typescript/form_filling/README-template.md (1 hunks)
  • templates/components/multiagent/typescript/nextjs/route.ts (3 hunks)
  • templates/components/multiagent/typescript/workflow/single-agent.ts (4 hunks)
  • templates/components/multiagent/typescript/workflow/type.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • helpers/typescript.ts
🧰 Additional context used
📓 Path-based instructions (7)
templates/components/agents/typescript/blog/workflow/factory.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/agents/typescript/financial_report/README-template.md (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/agents/typescript/financial_report/workflow/fin-report.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/agents/typescript/form_filling/README-template.md (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/multiagent/typescript/nextjs/route.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/multiagent/typescript/workflow/single-agent.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/multiagent/typescript/workflow/type.ts (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

🪛 LanguageTool
templates/components/agents/typescript/financial_report/README-template.md

[misspelling] ~30-~30: Use “a” instead of ‘an’ if the following word doesn’t start with a vowel sound, e.g. ‘a sentence’, ‘a university’.
Context: ... CSV Template You can start by sending an request on the chat UI to create a repo...

(EN_A_VS_AN)


[uncategorized] ~30-~30: Possible missing comma found.
Context: ...paring the finances of Apple and Tesla. Or you can test the /api/chat endpoint w...

(AI_HYDRA_LEO_MISSING_COMMA)

🪛 Markdownlint
templates/components/agents/typescript/financial_report/README-template.md

7-7: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)


16-16: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)


22-22: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)


33-33: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)

templates/components/agents/typescript/form_filling/README-template.md

7-7: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)


16-16: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🪛 Biome
templates/components/agents/typescript/financial_report/workflow/fin-report.ts

[error] 193-194: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

🔇 Additional comments (8)
templates/components/multiagent/typescript/workflow/type.ts (2)

1-7: LGTM! The message type has been updated as discussed.

The change from string to MessageContent type for the message property aligns with the previous discussion and provides better type safety.


19-24: LGTM! Clean class implementation.

The class extends WorkflowEvent with appropriate type parameters and follows the suggested implementation without a constructor.

templates/components/multiagent/typescript/nextjs/route.ts (3)

22-23: LGTM! Good refactoring of validation logic.

Moving the validation logic to a separate isValidMessages function improves code organization and reusability.


33-34: Verify error handling in utility functions.

While the use of utility functions improves code organization, we should verify their error handling.


42-46: Consider stream cleanup handling.

While the dual stream implementation is good, ensure proper cleanup of both streams to prevent memory leaks. Consider implementing an error boundary or cleanup mechanism.

Example cleanup implementation:

const cleanup = () => {
  stream.cancel();
  dataStream.cancel();
};

try {
  return new StreamingTextResponse(stream, {}, dataStream);
} finally {
  // Ensure cleanup runs after response is sent
  setTimeout(cleanup, 0);
}
templates/components/multiagent/typescript/workflow/single-agent.ts (2)

2-7: LGTM! Type definitions enhance type safety

The migration to HandlerContext and introduction of explicit types FunctionCallingAgentContextData and FunctionCallingAgentInput improve type safety and make the code more maintainable.

Also applies to: 29-35


80-100: LGTM! Well-structured workflow step definitions

The workflow steps are clearly defined with explicit input/output types, making the flow easy to understand and maintain.

templates/components/agents/typescript/financial_report/workflow/fin-report.ts (1)

1-34: LGTM! Well-structured event type definitions

The event types are well-defined with clear purposes and properly typed payloads, following TypeScript best practices.

@leehuwuj leehuwuj force-pushed the lee/add-formfilling-ts branch from 2eef40e to f7c0c9e Compare November 13, 2024 05:40
@marcusschiesser marcusschiesser merged commit 8431b78 into main Nov 13, 2024
46 checks passed
@marcusschiesser marcusschiesser deleted the lee/add-formfilling-ts branch November 13, 2024 05:46
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (6)
templates/components/agents/typescript/form_filling/README-template.md (2)

7-9: Add language specifications to code blocks.

For better syntax highlighting and documentation consistency, specify the language in the code blocks.

-```
+```bash
npm install

- +bash
npm run dev

Also applies to: 16-18

🧰 Tools
🪛 Markdownlint

7-7: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)


11-12: Enhance environment variable setup instructions.

Consider providing more detailed instructions about the .env file setup:

  • Mention if a template .env file is provided
  • List all required environment variables
  • Provide guidance on obtaining the OpenAI API key
templates/components/agents/typescript/financial_report/README-template.md (4)

7-9: Add language specifications to code blocks for better readability

Adding language specifications to the code blocks will enable proper syntax highlighting:

-```
+```bash
npm install

- +bash
npm run generate


-```
+```bash
npm run dev

- +bash
curl --location 'localhost:3000/api/chat'
--header 'Content-Type: application/json'
--data '{ "messages": [{ "role": "user", "content": "Create a report comparing the finances of Apple and Tesla" }] }'

Also applies to: 16-18, 22-24, 33-37

🧰 Tools
🪛 Markdownlint

7-7: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)


30-30: Fix grammar: Use "a request" instead of "an request"

-You can start by sending an request on the chat UI to create a report comparing the finances of Apple and Tesla.
+You can start by sending a request on the chat UI to create a report comparing the finances of Apple and Tesla.
🧰 Tools
🪛 LanguageTool

[misspelling] ~30-~30: Use “a” instead of ‘an’ if the following word doesn’t start with a vowel sound, e.g. ‘a sentence’, ‘a university’.
Context: ... CSV Template You can start by sending an request on the chat UI to create a repo...

(EN_A_VS_AN)


11-12: Consider adding more details about environment setup

The README mentions checking pre-configured parameters in .env, but it would be helpful to provide:

  1. A sample .env file or template
  2. Instructions for obtaining an OpenAI API key
  3. Any other required environment variables

Would you like me to help generate a more detailed environment setup section?


28-37: Enhance the use case documentation

The use case section could benefit from:

  1. A sample of the CSV template structure
  2. Expected output format
  3. Additional example queries
  4. Error handling scenarios

Would you like me to help expand this section with more detailed examples and scenarios?

🧰 Tools
🪛 LanguageTool

[misspelling] ~30-~30: Use “a” instead of ‘an’ if the following word doesn’t start with a vowel sound, e.g. ‘a sentence’, ‘a university’.
Context: ... CSV Template You can start by sending an request on the chat UI to create a repo...

(EN_A_VS_AN)

🪛 Markdownlint

33-33: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 2eef40e and f7c0c9e.

📒 Files selected for processing (2)
  • templates/components/agents/typescript/financial_report/README-template.md (1 hunks)
  • templates/components/agents/typescript/form_filling/README-template.md (1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
templates/components/agents/typescript/financial_report/README-template.md (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

templates/components/agents/typescript/form_filling/README-template.md (1)

Pattern templates/**: For files under the templates folder, do not report 'Missing Dependencies Detected' errors.

🪛 LanguageTool
templates/components/agents/typescript/financial_report/README-template.md

[misspelling] ~30-~30: Use “a” instead of ‘an’ if the following word doesn’t start with a vowel sound, e.g. ‘a sentence’, ‘a university’.
Context: ... CSV Template You can start by sending an request on the chat UI to create a repo...

(EN_A_VS_AN)

🪛 Markdownlint
templates/components/agents/typescript/financial_report/README-template.md

7-7: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)


16-16: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)


22-22: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)


33-33: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)

templates/components/agents/typescript/form_filling/README-template.md

7-7: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)


16-16: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🔇 Additional comments (2)
templates/components/agents/typescript/form_filling/README-template.md (2)

1-2: Add LITS documentation link in the introduction.

As previously noted, please include a link to the LITS documentation in the introduction section for completeness.


31-37: LGTM! Comprehensive resource section.

The Learn More section provides all necessary links to documentation and resources, including both Python and TypeScript-specific materials. The workflow documentation link is particularly relevant for this form-filling use case.

Comment on lines +24 to +25
1. Upload the Apple and Tesla financial reports from the [data](./data) directory. Just send an empty message.
2. Upload the CSV file [sec_10k_template.csv](./sec_10k_template.csv) and send the message "Fill the missing cells in the CSV file".
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codebase verification

The "./data" directory referenced in the README does not exist.

Please update the file path to the existing location of "sec_10k_template.csv" or add the missing "data" directory.

🔗 Analysis chain

Verify the existence and paths of referenced files.

Let's verify that the referenced files exist in the repository.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check if the referenced data files exist

# Check for the data directory and CSV template
fd -t f "sec_10k_template.csv" 
fd -t d "data" --max-depth 1

Length of output: 201

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants