fix: don't send duplicate messages to Agent (#8909)
* fix: update message input handling in LCAgentComponent and improve memory data retrieval * Refactor MessageTextInput to MessageInput for consistency. * Enhance input dictionary construction to handle different input types in LCAgentComponent. * Update get_memory_data method to filter out current input value from retrieved messages. * fix: update AgentComponent to include documentation link and improve input handling * Added documentation link for AgentComponent. * Removed memory inputs from the agent component for cleaner input management. * Enhanced error handling in message_response method to ensure better validation and logging of exceptions. * fix: enhance input handling in LCAgentComponent by updating message conversion * Updated input dictionary construction in LCAgentComponent to use to_lc_message() for Message instances, improving input handling consistency. * test: add regression test for message duplication in agent component * Introduced a new test to verify that mathematical expressions do not experience message duplication when processed by the agent component. * The test checks both input and output JSON to ensure correct handling of expressions like "2+2" without duplication errors. * test: add workspace tag to regression test for message duplication in agent component * Updated the regression test for mathematical expressions to include the "@workspace" tag, enhancing test categorization and organization. * This change ensures better tracking and management of tests related to the agent component. * fix: add temporary comment in get_memory_data to address message duplication * Added a TODO comment in the get_memory_data method of AgentComponent to indicate a temporary fix for message duplication issues. This serves as a reminder to develop a more robust solution in the future. * feat: add message extraction utility for BaseMessage * Introduced a new helper function, _get_message_from_base_message, to extract and concatenate text content from BaseMessage instances, improving message handling. * Updated input handling in handle_on_chain_start to utilize the new extraction function, ensuring consistent processing of input messages. * refactor: standardize code snippets across starter project JSON files * Updated the "value" field in multiple starter project JSON files to ensure consistent formatting and structure of code snippets. * This change enhances readability and maintainability of the code examples provided in the starter projects. * feat: add caching and content dictionary creation for images * Introduced a new function, create_image_content_dict, to generate a content dictionary for multimodal inputs from image files, enhancing image handling capabilities. * Implemented LRU caching to optimize performance for repeated image processing. * Added comprehensive error handling and documentation for better usability and maintainability. * refactor: update message handling to utilize create_image_content_dict * Replaced direct image URL creation with create_image_content_dict for improved image content handling in the Data and Message classes. * Adjusted the order of content in human messages to ensure text appears first, enhancing message structure and clarity. * Removed deprecated to_lc_message method to streamline the codebase and improve maintainability. * docs: enhance _get_message_from_base_message docstring for clarity * Expanded the docstring for the _get_message_from_base_message function to provide detailed information on input types, expected behavior, and examples of usage. * Improved documentation aims to enhance usability and maintainability of the code by clarifying how to extract text content from BaseMessage instances. * refactor: enhance image path handling and update message content structure * Modified the get_file_paths function to support both Image objects and string paths for improved flexibility in file handling. * Updated test cases to reflect changes in image content structure, ensuring consistency in type and source type attributes. * Introduced new tests for create_image_content_dict to validate successful creation and error handling for image content dictionaries. * refactor: streamline message extraction in handle_on_chain_start * Removed the _get_message_from_base_message function to simplify the codebase. * Updated handle_on_chain_start to directly use the text method of BaseMessage for extracting message content, enhancing clarity and maintainability. * feat: enhance input handling for multimodal messages * Added functionality to process image content within input messages, ensuring images are included in chat history as HumanMessage instances. * Updated input handling logic to separate image types from text, improving the structure and clarity of message content. * This enhancement supports better management of multimodal inputs in the agent's chat history. * feat: add to_lc_message method for converting Data to BaseMessage * Introduced the to_lc_message method in the Message class to facilitate conversion of Data instances to BaseMessage. * Implemented logic to handle both HumanMessage and AIMessage based on the presence of required keys and sender type. * Added logging for missing required keys to improve debugging and maintainability. * refactor: simplify sender check in Message class * Updated the sender validation logic in the Message class to remove unnecessary checks for missing sender values. * This change enhances code clarity and maintains the intended functionality for handling user messages with associated files. * test: update test_message_from_human_text to reflect content type change * Modified the test for message conversion to assert that lc_message.content is a string instead of a list. * Updated assertions to ensure the content matches the expected text, enhancing test accuracy and reliability. * fix: update sender validation in Message class and adjust test case * Modified the sender validation logic to handle cases where the sender is not specified, defaulting to HumanMessage. * Updated the corresponding test case to reflect this change, ensuring accurate type assertion for lc_message when no sender is provided. * refactor: update import statements for consistency and clarity * Replaced the import of BaseModel from langchain.pydantic_v1 with the direct import from pydantic to streamline dependencies. * This change enhances code clarity and aligns with best practices for managing imports in the codebase. --------- Co-authored-by: Edwin Jose <edwin.jose@datastax.com> Co-authored-by: Carlos Coelho <80289056+carlosrcoelho@users.noreply.github.com>
This commit is contained in:
parent
30c678b293
commit
7aeb687533
26 changed files with 232 additions and 46 deletions
|
|
@ -0,0 +1,83 @@
|
|||
import { expect, test } from "@playwright/test";
|
||||
import dotenv from "dotenv";
|
||||
import path from "path";
|
||||
import { awaitBootstrapTest } from "../../utils/await-bootstrap-test";
|
||||
|
||||
test(
|
||||
"user must not experience message duplication in mathematical expressions with agent component",
|
||||
{ tag: ["@release", "@components", "@workspace"] },
|
||||
async ({ page }) => {
|
||||
test.skip(
|
||||
!process?.env?.ANTHROPIC_API_KEY,
|
||||
"ANTHROPIC_API_KEY required to run this test",
|
||||
);
|
||||
|
||||
if (!process.env.CI) {
|
||||
dotenv.config({ path: path.resolve(__dirname, "../../.env") });
|
||||
}
|
||||
await awaitBootstrapTest(page);
|
||||
|
||||
await page.getByTestId("side_nav_options_all-templates").click();
|
||||
await page.getByRole("heading", { name: "Simple Agent" }).first().click();
|
||||
|
||||
await page.getByTestId("value-dropdown-dropdown_str_agent_llm").click();
|
||||
|
||||
await page.waitForTimeout(200);
|
||||
|
||||
await page.getByText("Anthropic").last().click();
|
||||
|
||||
await page
|
||||
.getByTestId("popover-anchor-input-api_key")
|
||||
.fill(process.env.ANTHROPIC_API_KEY || "");
|
||||
|
||||
await page.getByTestId("playground-btn-flow-io").click();
|
||||
|
||||
await page.waitForSelector('[data-testid="input-chat-playground"]', {
|
||||
timeout: 100000,
|
||||
});
|
||||
|
||||
// Test simple math expression
|
||||
await page.getByTestId("input-chat-playground").fill("2+2");
|
||||
|
||||
await page.waitForSelector('[data-testid="button-send"]', {
|
||||
timeout: 100000,
|
||||
});
|
||||
|
||||
await page.getByTestId("button-send").click();
|
||||
// Wait for response completion
|
||||
await page.waitForSelector(
|
||||
'[data-testid="header-icon"] svg[data-testid="icon-Check"]',
|
||||
{
|
||||
timeout: 30000,
|
||||
},
|
||||
);
|
||||
|
||||
// Click on the execution section to expand and reveal the JSON blocks
|
||||
await page.locator('[data-testid="header-icon"]').first().click();
|
||||
|
||||
// Wait for the JSON code blocks to appear after clicking
|
||||
await page.waitForSelector('[data-testid="chat-code-tab"]', {
|
||||
timeout: 10000,
|
||||
});
|
||||
|
||||
// Get all the JSON code content to check both input and output
|
||||
const codeBlocks = await page
|
||||
.locator('[data-testid="chat-code-tab"] code.language-json')
|
||||
.allTextContents();
|
||||
|
||||
// First code block should contain the input expression
|
||||
const inputJson = codeBlocks[0];
|
||||
expect(inputJson).toContain('"expression": "2+2"');
|
||||
|
||||
// Verify the input is NOT duplicated (should not contain "2+22+2")
|
||||
expect(inputJson).not.toContain('"expression": "2+22+2"');
|
||||
expect(inputJson).not.toContain('"expression": "22+2"');
|
||||
|
||||
// Second code block should contain the output result
|
||||
const outputJson = codeBlocks[1];
|
||||
expect(outputJson).toContain('"result": "4"');
|
||||
|
||||
// Ensure the result is not 26 (which would be 2+22+2)
|
||||
expect(outputJson).not.toContain('"result": "26"');
|
||||
},
|
||||
);
|
||||
Loading…
Add table
Add a link
Reference in a new issue