Agentic Table Space

18 min read

Overview

Agentic Table is a dynamic interface within the Unique platform that enables AI-powered question answering at scale. Designed for workflows such as RFPs, DDQs, and KYCs, it allows users to upload or input questions and receive accurate, reference-backed responses directly in-table.

The system leverages an underlying AI agent which leverages input documents to execute batch AI workflows and create structured results. The most common use case extracts questions documents and generates answers using configured prompt templates and internal knowledge sources. This feature streamlines large-scale questionnaire processing by combining human review workflows with automated, audit-ready output.

Who is it for

  • Financial services professionals completing RFPs, DDQs, or KYC forms

  • Product, compliance, and legal teams managing internal knowledge related to financial documentation

  • Analysts or operations teams using AI-assisted automation for large-scale documentation handling

Who should have access

Agentic Table can be configured and managed by space admins within the Unique platform. These admins are responsible for adjusting the full configuration including reference settings and user/system prompts, to suit their team’s specific workflows.

Benefits

  • Automation of repetitive questionnaire responses

  • High-quality answers with references to internal knowledge

  • Scalable operations with Agentic Table integration

  • Reduced risk of manual errors and inconsistent answers

Use Cases

  • Filling out RFPs for institutional investors or consultants by importing questions into the Agentic Table and generating accurate, reference-backed answers at scale

  • Responding to recurring DDQs by reusing validated internal content through the Agentic Table’s structured question workflow

  • Completing KYC documentation during onboarding by uploading standardized forms into the Agentic Table for automated processing

  • Bulk answering questionnaires directly in the Agentic Table, leveraging file uploads, knowledge base imports, and manual input

  • Streamlining documentation workflows by enabling teams to manage, edit, and review all questionnaire responses in one centralized, collaborative table view

  • Reducing turnaround times for complex financial questionnaires by combining automation with transparency and control in the Agentic Table interface

  • Extracting and organizing data by retrieving all mentions of specific entities (e.g., person X, company Y, stock Z) from documents and formatting them into a structured table for analysis and reporting

Step-by-Step Guide

Step 1: Configure the Agentic Table

Agentic Table is configured in Space Management when creating or editing a space. The full configuration settings can be found below.

Space admins can define how the table behaves by:

  • Selecting and customizing table templates

  • Customizing user/system prompt templates

  • Choosing relevant knowledge sources from the Knowledge Base

These configurations ensure the setup aligns with the team’s specific questionnaire workflows and standards.

Configuration Templates by Use Case

To simplify setup, Unique provides ready-to-use configuration templates tailored to specific use cases. These templates include recommended prompt settings and module configurations to accelerate deployment and ensure best practices.

Full Default Configuration (all above sections combined)
json
{
  "columns": [
    {
      "assistant_prompt": "",
      "cell_renderer": "CustomCellRenderer",
      "editable": true,
      "rerun_trigger": true,
      "filter": "ValueMatchFilter",
      "is_selected_by_default": false,
      "name": "Section",
      "system_prompt": "",
      "type": "row-reference",
      "width": 100
    },
    {
      "assistant_prompt": "",
      "cell_renderer": "CustomCellRenderer",
      "editable": true,
      "rerun_trigger": true,
      "filter": "PartialMatchFilter",
      "is_selected_by_default": false,
      "name": "Question",
      "system_prompt": "",
      "type": "row-reference",
      "width": 400
    },
    {
      "assistant_prompt": "{% if table_context %}Table Context: {{table_context}}\n\n{% endif %}{% if row_metadata %}Row Metadata: {{row_metadata}}\n\n{% endif %}{% if sources %}The text sources are the following:\n{{sources}}\n\n{% endif %}{% if section %}Question section:\n{{section}}\n\n{% endif %}Question:\n{{question}}\n\nAnswer concisely in {% if language %}{{language}}{% else %}English{% endif %} and ALWAYS reference each of your facts:",
      "cell_renderer": "CustomCellRenderer",
      "editable": true,
      "rerun_trigger": false,
      "filter": "PartialMatchFilter",
      "is_selected_by_default": false,
      "name": "Answers",
      "search_config": {
        "chat_only": false,
        "chunk_relevancy_sort_config": {
          "additional_llm_options": {},
          "enabled": false,
          "fallback_language_model": "AZURE_GPT_35_TURBO_0125",
          "language_model": "AZURE_GPT_35_TURBO_0125",
          "max_tasks": null,
          "relevancy_level_order": {
            "high": 0,
            "low": 2,
            "medium": 1
          },
          "relevancy_levels_to_consider": ["high", "medium", "low"],
          "structured_output_config": {
            "enabled": false,
            "extract_fact_list": false,
            "fact_description": "A fact is an information that is directly answers the user's query. Make sure to emphasize the important information from the fact with bold text.",
            "fact_list_description": "A list of relevant facts extracted from the source that supports or answers the user's query.",
            "reason_description": "A brief explanation justifying your evaluation decision.",
            "value_description": "Assessment of how relevant the facts are to the query. Must be one of: ['low', 'medium', 'high']."
          }
        },
        "chunked_sources": true,
        "max_tokens_for_sources": 10000,
        "metadata_filter": null,
        "limit": 50,
        "reranker_config": null,
        "scope_ids": null,
        "scope_to_chat_on_upload": false,
        "search_language": "english",
        "search_type": "COMBINED",
        "source_format_config": {
          "sections": {
            "document": "\u003C|document|\u003E{}\u003C|/document|\u003E\n",
            "info": "\u003C|info|\u003E{}\u003C|/info|\u003E\n"
          },
          "source_template": "\u003Csource${index}\u003E${document}${info}${text}\u003C/source${index}\u003E"
        }
      },
      "system_prompt": "You are tasked with answering questions in an RFP document.\nBelow, you will find a question, it's section title and several information sources, each marked with XML tags.\n\nPlease respond to the 'Question' using ONLY the facts provided in these sources.\n\nIf not specified, format the answer using an introduction followed by a list of bullet points.\n\nFirst, STRICTLY reference each fact you use. A fact is preferably referenced by ONLY ONE source e.g [sourceX].\n\nHere is an example on how to reference sources (referenced facts must STRICTLY match the source number):\n- Some information retrieved from source N°X.[sourceX]\n- Some information retrieved from source N°Y and some information retrieved from source N°Z.[sourceY][sourceZ]",
      "type": "row-reference",
      "width": 800
    },
    {
      "assistant_prompt": "",
      "cell_renderer": "CustomCellRenderer",
      "editable": false,
      "rerun_trigger": false,
      "filter": "ReferenceFilter",
      "is_selected_by_default": false,
      "name": "References",
      "system_prompt": "",
      "type": "row-reference",
      "width": 400
    },
    {
      "assistant_prompt": "",
      "cell_renderer": "CustomCellRenderer",
      "editable": false,
      "rerun_trigger": false,
      "filter": "HallucinationFilter",
      "is_selected_by_default": false,
      "name": "Hallucination Score",
      "system_prompt": "",
      "type": "row-reference",
      "width": 400
    }
  ],
  "docx_generator_config": {
    "columns_to_include": [
      "Section",
      "Question",
      "Answers",
      "References",
      "Hallucination Score"
    ],
    "skip_ingestion": true,
    "template_content_id": null,
    "template_fields": {
      "date": "CURRENT_DATE",
      "document_title": "Template Document"
    },
    "template_name": "template.docx",
    "template_scope_id": null,
    "upload_scope_id": null,
    "upload_suffix": "_report_output.docx",
    "upload_to_chat": true,
    "strip_citations_from_answers_on_export": false
  },
  "xlsx_generator_config": {
    "strip_citations_from_answers_on_export": false
  },
  "hallucination": {
    "custom_prompts": {
      "systemPrompt": "\nYou will receive a question, references, a conversation between a user and an agent, and an output. \nThe output is the answer to the question. \nYour task is to evaluate if the output is fully supported by the information provided in the references and conversation, and provide explanations on your judgement in 2 sentences.\n\nUse the following entailment scale to generate a score:\n[low] - All information in output is supported by the references/conversation, or extractions from the references/conversation.\n[medium] - The output is supported by the references/conversation to some extent, but there is at least some information in the output that is not discussed in the references/conversation. For example, if an instruction asks about two concepts and the references/conversation only discusses either of them, it should be considered a [medium] hallucination level.\n[high] - The output contains information that is not part of the references/conversation, is unrelated to the references/conversation, or contradicts the references/conversation.\n\nMake sure to not use any external information/knowledge to judge whether the output is true or not. Only check whether the output is supported by the references/conversation, and not whether the output is correct or not. Also do not evaluate if the references/conversation contain further information that is not part of the output but could be relevant to the question. If the output mentions a plot or chart, ignore this information in your evaluation.\n\nYour answer must be in JSON format:\n{\n \"reason\": Your explanation of your judgement of the evaluation,\n \"value\": decision, must be one of the following: [\"high\", \"medium\", \"low\"]\n}                                                  \n",
      "systemPromptDefault": "\nYou will receive a question and an output. \nThe output is the answer to the question. \nThe situation is that no references could be found to answer the question. Your task is to evaluate if the output contains any information to answer the question,\nand provide a short explanations of your reasoning in 2 sentences. Also mention in your explanation that no references were provided to answer the question.\n\nUse the following entailment scale to generate a score:\n[low] - The output does not contain any information to answer the question.\n[medium] - The output contains some information to answer the question, but does not answer the question entirely. \n[high] - The output answers the question.\n\nIt is not considered an answer when the output relates to the questions subject. Make sure to not use any external information/knowledge to judge whether the output is true or not. Only check that the output does not answer the question, and not whether the output is correct or not.\nYour answer must be in JSON format:\n{\n \"reason\": Your explanation of your reasoning of the evaluation,\n \"value\": decision, must be one of the following: [\"low\", \"medium\", \"high\"]\n}\n",
      "userPrompt": "\nHere is the data:\n\nInput:\n'''\n$input_text\n'''\n\nReferences:\n'''\n$contexts_text\n'''\n\nConversation:\n'''\n$history_messages_text\n'''\n\nOutput:\n'''\n$output_text\n'''\n\nAnswer as JSON:\n",
      "userPromptDefault": "                                                  \nHere is the data:\n\nInput:\n'''\n$input_text\n'''\n\nOutput:\n'''\n$output_text\n'''\n\nAnswer as JSON:\n"
    },
    "enabled": true,
    "language_model": "AZURE_GPT_4o_2024_0806",
    "name": "hallucination",
    "score_to_label": {
      "HIGH": "RED",
      "LOW": "GREEN",
      "MEDIUM": "YELLOW"
    },
    "score_to_title": {
      "HIGH": "High Hallucination",
      "LOW": "No Hallucination Detected",
      "MEDIUM": "Hallucination Warning"
    }
  },
  "ingestion_config": {
    "column_ids_in_chunk_text": [
      "Section",
      "Question",
      "Answers",
      "References",
      "Hallucination Score"
    ],
    "column_ids_in_metadata": [],
    "scope_id": ""
  },
  "language_model": "AZURE_GPT_4o_2024_0806",
  "question_extraction": {
    "language_model": "AZURE_GPT_4o_2024_0806",
    "system_prompt": "You are a expert in the field of Request for Proposals (RFPs) and can extract questions from a given text.\nYou will be given a text that is part of an RFP document and you need to extract the questions from the text into a structured JSON object.\nDO NOT extract questions from text belonging to general information or notice sections.\nDO NOT extract questions from text that is just a table header with no content or questions.\nSTRICTLY focus on the sections that are related to the questions and NOTHING ELSE.\nONLY extract questions verbatim from the RFP text without any modifications.\n\nThe JSON object should have the following fields:\n- question: The question verbatim from the text\n- section: The section index that the question is in. Do not include the text here.\n\nThe JSON object should be in the following format:\n{\n    \"questions\": [\n        {\n            \"question\": \"The question from the text\",\n            \"section\": \"The section index the question is in\"\n        },\n        ...\n    ]\n}",
    "trigger_prompt": "Here is the text:\n{{text}}"
  },
  "toc_extraction": {
    "language_model": "AZURE_GPT_4o_2024_0806",
    "system_prompt": "You are a expert in the field of RFPs and can extract the table of contents from a given text. You will be given a text and you need to extract the table of contents from the text into a structured JSON object.\n\nThe JSON object should have the following fields:\n- section: The section of the text that the question is in. Do not include any brackets or other text.\n- title: The title of the section.\n\nNOTE: DO NOT include questions in the table of contents. If no explicit section numbering is found, use the title for both fields.\n\nThe JSON object should be in the following format:\n{\n    \"sections\": [\n        {\n            \"section\": \"The section of the text that the question is in\",\n            \"title\": \"The title of the section\"\n        },\n        ...\n    ]\n}",
    "trigger_prompt": "Here is the text:\n{{text}}"
  }
}
RFP/DDQ
json
{
  "columns": [
    {
      "name": "Section",
      "width": 100,
      "filter": "ValueMatchFilter",
      "editable": true,
      "cell_renderer": "CustomCellRenderer",
      "rerun_trigger": true
    },
    {
      "name": "Question",
      "width": 400,
      "filter": "PartialMatchFilter",
      "editable": true,
      "cell_renderer": "CustomCellRenderer",
      "rerun_trigger": true
    },
    {
      "name": "Answers",
      "width": 600,
      "filter": "PartialMatchFilter",
      "editable": true,
      "cell_renderer": "SelectableCellRenderer",
      "rerun_trigger": false,
      "system_prompt": "You are tasked with answering questions in an RFP document.\nBelow, you will find a question, it's section title and several information sources, each marked with XML tags.\n\nRespond to the 'Question' using ONLY the facts provided in these sources.\n\nIf not specified, format the answer using an introduction followed by a list of bullet points.\n\nIf multiple or conflicting answers exist, provide only the most recent information.\n\nFirst, STRICTLY reference each fact you use. A fact is preferably referenced by ONLY ONE source e.g [sourceX].\n\nHere is an example on how to reference sources (referenced facts must STRICTLY match the source number):\n- Some information retrieved from source N°X.[sourceX]\n- Some information retrieved from source N°Y and some information retrieved from source N°Z.[sourceY][sourceZ]\n",
      "assistant_prompt": "{% if table_context %}Table Context: {{table_context}}\n\n{% endif %}{% if row_metadata %}Row Metadata: {{row_metadata}}\n\n{% endif %}{% if sources %}The text sources are the following:\n{{sources}}\n\n{% endif %}{% if section %}Question section:\n{{section}}\n\n{% endif %}Question:\n{{question}}\n\nAnswer concisely in {% if language %}{{language}}{% else %}English{% endif %} and ALWAYS reference each of your facts. If no sources are provided or no answer is found, respond with 'Not Found'.\n",
      "is_selected_by_default": false
    },
    {
      "name": "References",
      "width": 400,
      "filter": "ReferenceFilter",
      "editable": false,
      "cell_renderer": "CustomCellRenderer",
      "rerun_trigger": false,
      "system_prompt": "",
      "assistant_prompt": ""
    },
    {
      "name": "Hallucination Score",
      "width": 400,
      "filter": "HallucinationFilter",
      "editable": false,
      "cell_renderer": "CustomCellRenderer",
      "rerun_trigger": false,
      "system_prompt": "",
      "assistant_prompt": ""
    },
    {
      "name": "Review Status",
      "width": 200,
      "filter": "ReviewStatusFilter",
      "editable": false,
      "cell_renderer": "ReviewStatusDropdown",
      "rerun_trigger": false,
      "system_prompt": "",
      "assistant_prompt": ""
    },
    {
      "name": "Assignee",
      "width": 200,
      "filter": "AssigneeFilter",
      "editable": false,
      "cell_renderer": "CollaboratorDropdown",
      "rerun_trigger": false,
      "system_prompt": "",
      "assistant_prompt": ""
    }
  ],
  "hallucination": {
    "enabled": true,
    "language_model": "AZURE_GPT_4o_2024_0806",
    "score_to_label": {
      "LOW": "GREEN",
      "HIGH": "RED",
      "MEDIUM": "YELLOW"
    },
    "score_to_title": {
      "LOW": "No Hallucination Detected",
      "HIGH": "High Hallucination",
      "MEDIUM": "Hallucination Warning"
    }
  },
  "language_model": "AZURE_GPT_4o_2024_0806",
  "toc_extraction": {
    "system_prompt": "\nYou are a expert in the field of RFPs and can extract the table of contents from a given text. You will be given a text and you need to extract the table of contents from the text into a structured JSON object.\n\nThe JSON object should have the following fields:\n- section: The section of the text that the question is in. Do not include any brackets or other text.\n- title: The title of the section.\n\nNOTE: DO NOT include questions in the table of contents. If no explicit section numbering is found, use the title for both fields.\n\nThe JSON object should be in the following format:\n{\n    \"sections\": [\n        {\n            \"section\": \"The section of the text that the question is in\",\n            \"title\": \"The title of the section\"\n        },\n        ...\n    ]\n}\n",
    "language_model": "AZURE_GPT_4o_2024_0806",
    "trigger_prompt": "\nHere is the text:\n{{text}}\n"
  },
  "ingestion_config": {
    "scope_id": "{scope_id}",
    "column_ids_in_metadata": [
      "0"
    ],
    "column_ids_in_chunk_text": [
      "0",
      "1",
      "2",
      "3"
    ]
  },
  "question_extraction": {
    "system_prompt": "You are an expert RFP analyst specializing in comprehensive question extraction and document parsing. Your objective is to systematically identify and extract ALL questions, response requirements, and input field titles from RFP documents into a structured JSON format.\n\n## CORE EXTRACTION PRINCIPLES\n\n**Completeness**: Extract EVERY question, requirement, and response field without exception\n**Fidelity**: Preserve exact wording, formatting, and context from the original document\n**Structure**: Maintain logical grouping and hierarchical relationships between questions\n**Precision**: Distinguish between informational content and response requirements\n\n## WHAT TO EXTRACT\n\n### Primary Targets:\n- **Direct questions** (ending with question marks)\n- **Imperative statements** requiring responses (e.g., \"Describe...\", \"Provide...\", \"Explain...\")\n- **Input field labels** and form titles requiring completion (e.g., \"Number of Employees\", \"Corporate Structure\", \"Disaster recovery policy\")\n- **Multi-part questions** (extract each component separately while preserving relationships)\n- **List-based questions** (extract complete lists with all items and sub-items)\n- **Conditional requirements** (e.g., \"If applicable, provide...\")\n- **Evaluation criteria** that require vendor responses\n- **Compliance statements** requiring confirmation or documentation\n\n### List Processing Rules:\n- For bulleted/numbered lists: Extract the introductory statement plus ALL list items\n- Preserve list structure and numbering in the extracted text\n- Include sub-bullets and nested items completely\n- Maintain parent-child relationships between list items\n\n## EXCLUSIONS\n\n- General background information and project descriptions\n- Legal disclaimers and boilerplate text\n- Procedural instructions (submission deadlines, format requirements)\n- Contact information and administrative details\n- Evaluation methodology explanations (unless they contain response requirements)\n- Section headers/titles (unless they contain direct questions)\n- Table headers without question content\n\n## SECTION IDENTIFICATION HIERARCHY\n\n1. **Explicit numbering**: Use most specific identifier (e.g., \"3.2.1.4\" not \"3.2\")\n2. **Alphanumeric codes**: Include full designation (e.g., \"A.2.b.iii\")\n3. **Descriptive headers**: Convert to standardized format using underscores (e.g., \"Technical_Requirements_Phase_2\")\n4. **Page references**: Use \"Page_[number]\" if no other identifier exists\n5. **No identifier**: Return empty string \"\"\n\n## ENHANCED OUTPUT FORMAT\n\n```json\n{\n  \"questions\": [\n    {\n      \"question\": \"Complete extracted text with full context\",\n      \"section\": \"Most specific section identifier\",\n      \"question_type\": \"direct_question|imperative_statement|list_requirement|conditional_requirement\",\n      \"is_multi_part\": true/false,\n      \"related_questions\": [\"array of related question indices if applicable\"]\n    }\n  ],\n  \"extraction_summary\": {\n    \"total_questions\": 0,\n    \"sections_covered\": [\"list of all sections\"],\n    \"question_types_found\": [\"list of question types identified\"]\n  }\n}\n```\n\n## QUALITY ASSURANCE CHECKLIST\n\nBefore finalizing extraction:\n- Verified ALL bulleted/numbered lists are completely extracted\n- Confirmed no imperative statements were missed\n- Checked for conditional requirements (\"if applicable\", \"where relevant\")\n- Ensured multi-part questions are properly separated\n- Validated section identifiers are most specific available\n- Confirmed exact verbatim extraction with no paraphrasing\n- Verified chronological order is maintained\n\n## EXAMPLE EXTRACTION\n\n**Original RFP Text:**\n```\n3.4.2 Project Timeline\nProvide a detailed timeline for implementation including:\n• Major milestones and deliverables\n• Dependencies and critical path elements  \n• Resource allocation by phase\n• Risk mitigation strategies\n\nThe project must be completed within 12 months. How will your organization ensure on-time delivery?\n\n3.4.3 Staffing Requirements\nDescribe your proposed team structure. Include:\n1. Number of full-time equivalent staff\n2. Roles and responsibilities for each position\n3. Percentage of time dedicated to this project\n4. Backup plans for key personnel unavailability\n\nIf using subcontractors, provide their qualifications and oversight approach.\n```\n\n**Extracted JSON:**\n```json\n{\n  \"questions\": [\n    {\n      \"question\": \"Provide a detailed timeline for implementation including: • Major milestones and deliverables • Dependencies and critical path elements • Resource allocation by phase • Risk mitigation strategies\",\n      \"section\": \"3.4.2\",\n      \"question_type\": \"list_requirement\",\n      \"is_multi_part\": true,\n      \"related_questions\": [1]\n    },\n    {\n      \"question\": \"How will your organization ensure on-time delivery?\",\n      \"section\": \"3.4.2\", \n      \"question_type\": \"direct_question\",\n      \"is_multi_part\": false,\n      \"related_questions\": [0]\n    },\n    {\n      \"question\": \"Describe your proposed team structure. Include: 1. Number of full-time equivalent staff 2. Roles and responsibilities for each position 3. Percentage of time dedicated to this project 4. Backup plans for key personnel unavailability\",\n      \"section\": \"3.4.3\",\n      \"question_type\": \"list_requirement\", \n      \"is_multi_part\": true,\n      \"related_questions\": [3]\n    },\n    {\n      \"question\": \"If using subcontractors, provide their qualifications and oversight approach.\",\n      \"section\": \"3.4.3\",\n      \"question_type\": \"conditional_requirement\",\n      \"is_multi_part\": false,\n      \"related_questions\": [2]\n    }\n  ],\n  \"extraction_summary\": {\n    \"total_questions\": 4,\n    \"sections_covered\": [\"3.4.2\", \"3.4.3\"],\n    \"question_types_found\": [\"list_requirement\", \"direct_question\", \"conditional_requirement\"]\n  }\n}\n```\n\n## PROCESSING APPROACH\n\n1. **Initial Scan**: Read through entire document to identify question-bearing sections\n2. **Systematic Extraction**: Process each section sequentially, capturing all requirements\n3. **Relationship Mapping**: Identify connected questions and multi-part requirements  \n4. **Validation Pass**: Review extraction against original document for completeness\n5. **Quality Check**: Apply checklist to ensure comprehensive capture",
    "language_model": "AZURE_GPT_4o_2024_0806",
    "trigger_prompt": "\nHere is the text:\n{{text}}\n"
  },
  "docx_generator_config": {
    "template_name": "template.docx",
    "upload_suffix": "_report_output.docx",
    "skip_ingestion": true,
    "upload_to_chat": true,
    "template_fields": {
      "date": "CURRENT_DATE",
      "document_title": "Template Document"
    },
    "upload_scope_id": null,
    "template_scope_id": null
  }
}
RFP/DDQ with Answer Library
json
{
  "columns": [
    {
      "name": "Section",
      "width": 100,
      "filter": "ValueMatchFilter",
      "editable": true,
      "rerun_trigger": true,
      "cell_renderer": "CustomCellRenderer"
    },
    {
      "name": "Question",
      "width": 400,
      "filter": "PartialMatchFilter",
      "editable": true,
      "rerun_trigger": true,
      "cell_renderer": "CustomCellRenderer"
    },
    {
      "name": "Knowledge Base Answers",
      "width": 600,
      "filter": "PartialMatchFilter",
      "editable": true,
      "rerun_trigger": false,
      "cell_renderer": "SelectableCellRenderer",
      "system_prompt": "You are tasked with answering questions in an RFP document.\nBelow, you will find a question, it's section title and several information sources, each marked with XML tags.\n\nRespond to the 'Question' using ONLY the facts provided in these sources.\n\nIf not specified, format the answer using an introduction followed by a list of bullet points.\n\nIf multiple or conflicting answers exist, provide only the most recent information.\n\nFirst, STRICTLY reference each fact you use. A fact is preferably referenced by ONLY ONE source e.g [sourceX].\n\nHere is an example on how to reference sources (referenced facts must STRICTLY match the source number):\n- Some information retrieved from source N°X.[sourceX]\n- Some information retrieved from source N°Y and some information retrieved from source N°Z.[sourceY][sourceZ]\n",
      "assistant_prompt": "{% if table_context %}Table Context: {{table_context}}\n\n{% endif %}{% if row_metadata %}Row Metadata: {{row_metadata}}\n\n{% endif %}{% if sources %}The text sources are the following:\n{{sources}}\n\n{% endif %}{% if section %}Question section:\n{{section}}\n\n{% endif %}Question:\n{{question}}\n\nAnswer concisely in {% if language %}{{language}}{% else %}English{% endif %} and ALWAYS reference each of your facts. If no sources are provided or no answer is found, respond with 'Not Found'.\n",
      "is_selected_by_default": false
    },
    {
      "name": "Library Answers",
      "width": 600,
      "cell_renderer": "SelectableCellRenderer",
      "search_config": {
        "scope_ids": ["{library_scope_id}"],
        "exclude_uploaded_files": true
      },
      "system_prompt":"You are tasked with answering request for proposal and due diligence questionnaires. Below, you will find a question along with several information sources, marked with XML tags. These sources contain approved answers to frequently questions. Your job is to find the most relevant existing answers and return them verbatim in a consistent format using the following instructions.\n\nThe information sources are a collection of documents from these categories:\n- Fact Sheets: Summary documents with investment strategy and fund details\n- Fund Presentations: In-depth PDFs describing each fund's strategy, key personnel, volatility profile, portfolio construction, expected returns, etc. \n- Historical Examples of RFP/DDQs: Past questionnaire responses (Reviewed and verified answers)\n- Standard RFP/DDQs: Standard questions and answers prepared by the firm (Reviewed and verified answers)\n\nRespond to the question using ONLY the facts provided in these sources.\n\nIf a question has been explicitly answered before in a RFP/DDQ or other document:\n1. Provide the entire answer from the previous question verbatim\n2. Preserve the styling of the answer using markdown formatting\n3. Make sure to cite your sources in the following style [sourceX]\n\nIf a question hasn't been explicitly answered before but sufficient information is given to answer the question:\n1. Use strictly the facts as provided in the existing answers\n2. Always you cite your sources\n3. Follow the styling of existing answers. Avoid bullets unless used in existing answers.\n\nIf there is not enough information to answer the question, return \"Not Found\"\n\nImportant guidelines:\n- Do not change the wording or formatting of quotes\n- Provide the most recent answer if multiple answers exist\n- If there is conflicting information from different sources, include all perspectives\n- Exclude section identifiers or id numbers from questions as written in source\n- Do not include the question in the answer\n- If a question hasn't been answered before, construct a response using ONLY facts from the provided sources\n- Preserve the formatting of the verbatim questions including new lines, bullets and other markdown stylings.\n- Keep responses concise and always cite your sources using the exact source number format",
      "assistant_prompt": "{% if sources %}The text sources are the following:\n{{sources}}\n\n{% endif %}{% if section %}Question section:\n{{section}}\n\n{% endif %}Question:\n{{question}}\n\nAnswer concisely in {% if language %}{{language}}{% else %}English{% endif %} and ALWAYS reference each of your facts. If no sources are provided or no answer is found, respond with 'Not Found'.\n",
      "is_selected_by_default": true
    },
    {
      "name": "References",
      "width": 400,
      "filter": "ReferenceFilter",
      "editable": false,
      "rerun_trigger": false,
      "cell_renderer": "CustomCellRenderer",
      "system_prompt": "",
      "assistant_prompt": ""
    },
    {
      "name": "Hallucination Score",
      "width": 400,
      "filter": "HallucinationFilter",
      "editable": false,
      "rerun_trigger": false,
      "cell_renderer": "CustomCellRenderer",
      "system_prompt": "",
      "assistant_prompt": ""
    },
    {
      "name": "Review Status",
      "width": 200,
      "filter": "ReviewStatusFilter",
      "editable": false,
      "rerun_trigger": false,
      "cell_renderer": "ReviewStatusDropdown",
      "system_prompt": "",
      "assistant_prompt": ""
    },
    {
      "name": "Assignee",
      "width": 200,
      "filter": "AssigneeFilter",
      "editable": false,
      "rerun_trigger": false,
      "cell_renderer": "CollaboratorDropdown",
      "system_prompt": "",
      "assistant_prompt": ""
    }
  ],
  "hallucination": {
    "enabled": true,
    "language_model": "AZURE_GPT_4o_2024_0806",
    "score_to_label": {
      "LOW": "GREEN",
      "HIGH": "RED",
      "MEDIUM": "YELLOW"
    },
    "score_to_title": {
      "LOW": "No Hallucination Detected",
      "HIGH": "High Hallucination",
      "MEDIUM": "Hallucination Warning"
    }
  },
  "language_model": "AZURE_GPT_4o_2024_0806",
  "toc_extraction": {
    "system_prompt": "\nYou are a expert in the field of RFPs and can extract the table of contents from a given text. You will be given a text and you need to extract the table of contents from the text into a structured JSON object.\n\nThe JSON object should have the following fields:\n- section: The section of the text that the question is in. Do not include any brackets or other text.\n- title: The title of the section.\n\nNOTE: DO NOT include questions in the table of contents. If no explicit section numbering is found, use the title for both fields.\n\nThe JSON object should be in the following format:\n{\n    \"sections\": [\n        {\n            \"section\": \"The section of the text that the question is in\",\n            \"title\": \"The title of the section\"\n        },\n        ...\n    ]\n}\n",
    "language_model": "AZURE_GPT_4o_2024_0806",
    "trigger_prompt": "\nHere is the text:\n{{text}}\n"
  },
  "ingestion_config": {
    "scope_id": "{scope_id}",
    "column_ids_in_metadata": [
      "0"
    ],
    "column_ids_in_chunk_text": [
      "0",
      "1",
      "2",
      "3"
    ]
  },
  "question_extraction": {
    "system_prompt": "You are an expert RFP analyst specializing in comprehensive question extraction and document parsing. Your objective is to systematically identify and extract ALL questions, response requirements, and input field titles from RFP documents into a structured JSON format.\n\n## CORE EXTRACTION PRINCIPLES\n\n**Completeness**: Extract EVERY question, requirement, and response field without exception\n**Fidelity**: Preserve exact wording, formatting, and context from the original document\n**Structure**: Maintain logical grouping and hierarchical relationships between questions\n**Precision**: Distinguish between informational content and response requirements\n\n## WHAT TO EXTRACT\n\n### Primary Targets:\n- **Direct questions** (ending with question marks)\n- **Imperative statements** requiring responses (e.g., \"Describe...\", \"Provide...\", \"Explain...\")\n- **Input field labels** and form titles requiring completion (e.g., \"Number of Employees\", \"Corporate Structure\", \"Disaster recovery policy\")\n- **Multi-part questions** (extract each component separately while preserving relationships)\n- **List-based questions** (extract complete lists with all items and sub-items)\n- **Conditional requirements** (e.g., \"If applicable, provide...\")\n- **Evaluation criteria** that require vendor responses\n- **Compliance statements** requiring confirmation or documentation\n\n### List Processing Rules:\n- For bulleted/numbered lists: Extract the introductory statement plus ALL list items\n- Preserve list structure and numbering in the extracted text\n- Include sub-bullets and nested items completely\n- Maintain parent-child relationships between list items\n\n## EXCLUSIONS\n\n- General background information and project descriptions\n- Legal disclaimers and boilerplate text\n- Procedural instructions (submission deadlines, format requirements)\n- Contact information and administrative details\n- Evaluation methodology explanations (unless they contain response requirements)\n- Section headers/titles (unless they contain direct questions)\n- Table headers without question content\n\n## SECTION IDENTIFICATION HIERARCHY\n\n1. **Explicit numbering**: Use most specific identifier (e.g., \"3.2.1.4\" not \"3.2\")\n2. **Alphanumeric codes**: Include full designation (e.g., \"A.2.b.iii\")\n3. **Descriptive headers**: Convert to standardized format using underscores (e.g., \"Technical_Requirements_Phase_2\")\n4. **Page references**: Use \"Page_[number]\" if no other identifier exists\n5. **No identifier**: Return empty string \"\"\n\n## ENHANCED OUTPUT FORMAT\n\n```json\n{\n  \"questions\": [\n    {\n      \"question\": \"Complete extracted text with full context\",\n      \"section\": \"Most specific section identifier\",\n      \"question_type\": \"direct_question|imperative_statement|list_requirement|conditional_requirement\",\n      \"is_multi_part\": true/false,\n      \"related_questions\": [\"array of related question indices if applicable\"]\n    }\n  ],\n  \"extraction_summary\": {\n    \"total_questions\": 0,\n    \"sections_covered\": [\"list of all sections\"],\n    \"question_types_found\": [\"list of question types identified\"]\n  }\n}\n```\n\n## QUALITY ASSURANCE CHECKLIST\n\nBefore finalizing extraction:\n- Verified ALL bulleted/numbered lists are completely extracted\n- Confirmed no imperative statements were missed\n- Checked for conditional requirements (\"if applicable\", \"where relevant\")\n- Ensured multi-part questions are properly separated\n- Validated section identifiers are most specific available\n- Confirmed exact verbatim extraction with no paraphrasing\n- Verified chronological order is maintained\n\n## EXAMPLE EXTRACTION\n\n**Original RFP Text:**\n```\n3.4.2 Project Timeline\nProvide a detailed timeline for implementation including:\n• Major milestones and deliverables\n• Dependencies and critical path elements  \n• Resource allocation by phase\n• Risk mitigation strategies\n\nThe project must be completed within 12 months. How will your organization ensure on-time delivery?\n\n3.4.3 Staffing Requirements\nDescribe your proposed team structure. Include:\n1. Number of full-time equivalent staff\n2. Roles and responsibilities for each position\n3. Percentage of time dedicated to this project\n4. Backup plans for key personnel unavailability\n\nIf using subcontractors, provide their qualifications and oversight approach.\n```\n\n**Extracted JSON:**\n```json\n{\n  \"questions\": [\n    {\n      \"question\": \"Provide a detailed timeline for implementation including: • Major milestones and deliverables • Dependencies and critical path elements • Resource allocation by phase • Risk mitigation strategies\",\n      \"section\": \"3.4.2\",\n      \"question_type\": \"list_requirement\",\n      \"is_multi_part\": true,\n      \"related_questions\": [1]\n    },\n    {\n      \"question\": \"How will your organization ensure on-time delivery?\",\n      \"section\": \"3.4.2\", \n      \"question_type\": \"direct_question\",\n      \"is_multi_part\": false,\n      \"related_questions\": [0]\n    },\n    {\n      \"question\": \"Describe your proposed team structure. Include: 1. Number of full-time equivalent staff 2. Roles and responsibilities for each position 3. Percentage of time dedicated to this project 4. Backup plans for key personnel unavailability\",\n      \"section\": \"3.4.3\",\n      \"question_type\": \"list_requirement\", \n      \"is_multi_part\": true,\n      \"related_questions\": [3]\n    },\n    {\n      \"question\": \"If using subcontractors, provide their qualifications and oversight approach.\",\n      \"section\": \"3.4.3\",\n      \"question_type\": \"conditional_requirement\",\n      \"is_multi_part\": false,\n      \"related_questions\": [2]\n    }\n  ],\n  \"extraction_summary\": {\n    \"total_questions\": 4,\n    \"sections_covered\": [\"3.4.2\", \"3.4.3\"],\n    \"question_types_found\": [\"list_requirement\", \"direct_question\", \"conditional_requirement\"]\n  }\n}\n```\n\n## PROCESSING APPROACH\n\n1. **Initial Scan**: Read through entire document to identify question-bearing sections\n2. **Systematic Extraction**: Process each section sequentially, capturing all requirements\n3. **Relationship Mapping**: Identify connected questions and multi-part requirements  \n4. **Validation Pass**: Review extraction against original document for completeness\n5. **Quality Check**: Apply checklist to ensure comprehensive capture",
    "language_model": "AZURE_GPT_4o_2024_0806",
    "trigger_prompt": "\nHere is the text:\n{{text}}\n"
  },
  "docx_generator_config": {
    "template_name": "template.docx",
    "upload_suffix": "_report_output.docx",
    "skip_ingestion": true,
    "upload_to_chat": true,
    "template_fields": {
      "date": "CURRENT_DATE",
      "document_title": "Template Document"
    },
    "upload_scope_id": null,
    "template_scope_id": null
  }
}

Default Module Configuration

This section outlines the configuration structure and default settings of the Agentic Table. It breaks down the full configuration into its subcomponents and provides default values along with explanations for each field.

Language Model

The language model to use for the RFP agent

json
{
 "language_model": "AZURE_GPT_4o_2024_0806"
}

Parameter

Default

Description

language_model

AZURE_GPT_4o_2024_0806

The language model to use for the RFP agent. Models supported:

  • AZURE_GPT_4o_2024_0513

  • AZURE_GPT_4o_2024_0806

  • AZURE_GPT_4o_2024_1120

  • AZURE_GPT_4o_MINI_2024_0718

  • AZURE_o1_2024_1217

  • AZURE_o3_MINI_2025_0131

  • AZURE_GPT_45_PREVIEW_2025_0227

  • AZURE_GPT_41_2025_0414

  • AZURE_o3_2025_0416

  • AZURE_o4_MINI_2025_0416

  • AZURE_GPT_51_2025_1113

  • litellm:anthropic-claude-3-7-sonnet

  • litellm:anthropic-claude-3-7-sonnet-thinking

  • litellm:anthropic-claude-sonnet-4

  • litellm:anthropic-claude-opus-4

  • litellm:gemini-2-0-flash

  • litellm:gemini-2-5-flash-preview-04-17

  • litellm:gemini-2-5-pro-exp-03-25

Note that the language model can be either a string(like shown above) or a LanguageModelInfo object.

A LanguageModelInfo object would look like this:

json
 "language_model": {
    "capabilities": [
      "structured_output",
      "function_calling",
      "parallel_function_calling",
      "streaming",
      "vision"
    ],
    "deprecated_at": null,
    "encoder_name": "o200k_base",
    "name": "AZURE_GPT_4o_2024_0806",
    "provider": "AZURE",
    "retirement_text": null,
    "token_limits": {
      "token_limit_input": 128000,
      "token_limit_output": 16384
    },
    "version": "2024-08-06"
  },

Parameter

Notes

Description

encoder_name

Can be o200k_base or cl100k_base

Defines the encoder used for the model

capabilities

For the RFP Agent, the structured_output capability must always be added to the LanguageModelInfo

Enumerates the capabilities that the model can support

name

Default value is AZURE_GPT_4o_2024_0806 for the RFP Agent Module

The name of the language model, can be an Azure model name or a custom name

provider

Values can be AZURE, CUSTOM or LITELLM

The provider of the language model, either AZURE or CUSTOM

token_limits

Default values: {7000, 1000}

Defines input and output token limits for the model

Columns

The columns of the RFP table

json
"columns": [
  {
    "assistant_prompt": "",
    "cell_renderer": "CustomCellRenderer",
    "editable": true,
    "rerun_trigger": true,
    "filter": "ValueMatchFilter",
    "name": "Section",
    "system_prompt": "",
    "width": 100
  },
  {
    "assistant_prompt": "",
    "cell_renderer": "CustomCellRenderer",
    "editable": true,
    "rerun_trigger": true,
    "filter": "PartialMatchFilter",
    "name": "Question",
    "system_prompt": "",
    "type": "row-reference",
    "width": 400
  },
  {
    "assistant_prompt": "{% if sources %}The text sources are the following:\n{{sources}}\n\n{% endif %}{% if section %}Question section:\n{{section}}\n\n{% endif %}Question:\n{{question}}\n\nAnswer concisely in {% if language %}{{language}}{% else %}English{% endif %} and ALWAYS reference each of your facts:",
    "cell_renderer": "CustomCellRenderer",
    "editable": true,
    "rerun_trigger": false,
    "filter": "PartialMatchFilter",
    "is_selected_by_default": false,
    "name": "Answers",
    "search_config": {
      "chunk_relevancy_sort_config": {
        "additional_llm_options": {},
        "enabled": false,
        "language_model": "AZURE_GPT_35_TURBO_0125",
        "max_tasks": null,
        "relevancy_level_order": {
          "high": 0,
          "low": 2,
          "medium": 1
        },
        "relevancy_levels_to_consider": ["high", "medium", "low"],
        "structured_output_config": {
          "enabled": false,
          "extract_fact_list": false,
          "fact_description": "A fact is an information that is directly answers the user's query. Make sure to emphasize the important information from the fact with bold text.",
          "fact_list_description": "A list of relevant facts extracted from the source that supports or answers the user's query.",
          "reason_description": "A brief explanation justifying your evaluation decision.",
          "value_description": "Assessment of how relevant the facts are to the query. Must be one of: ['low', 'medium', 'high']."
        }
      },
      "chunked_sources": true,
      "max_tokens_for_sources": 10000,
      "metadata_filter": null,
      "limit": 50,
      "reranker_config": null,
      "scope_ids": null,
      "search_language": "english",
      "search_type": "COMBINED",
      "source_format_config": {
        "sections": {
          "document": "\u003C|document|\u003E{}\u003C|/document|\u003E\n",
          "info": "\u003C|info|\u003E{}\u003C|/info|\u003E\n"
        },
        "source_template": "\u003Csource${index}\u003E${document}${info}${text}\u003C/source${index}\u003E"
      }
    },
    "system_prompt": "You are tasked with answering questions in an RFP document.\nBelow, you will find a question, it's section title and several information sources, each marked with XML tags.\n\nPlease respond to the 'Question' using ONLY the facts provided in these sources.\n\nIf not specified, format the answer using an introduction followed by a list of bullet points.\n\nFirst, STRICTLY reference each fact you use. A fact is preferably referenced by ONLY ONE source e.g [sourceX].\n\nHere is an example on how to reference sources (referenced facts must STRICTLY match the source number):\n- Some information retrieved from source N°X.[sourceX]\n- Some information retrieved from source N°Y and some information retrieved from source N°Z.[sourceY][sourceZ]",
    "type": "row-reference",
    "width": 800
  },
  {
    "assistant_prompt": "",
    "cell_renderer": "CustomCellRenderer",
    "editable": false,
    "rerun_trigger": false,
    "filter": "ReferenceFilter",
    "name": "References",
    "system_prompt": "",
    "width": 400
  },
  {
    "assistant_prompt": "",
    "cell_renderer": "CustomCellRenderer",
    "editable": false,
    "rerun_trigger": false,
    "filter": "HallucinationFilter",
    "name": "Hallucination Score",
    "system_prompt": "",
    "width": 400
  }
],

Parameter

Default

Description

filter

PartialMatchFilter

The filter to apply to the column

(A full list of filters can be found here)

cell_renderer

CustomCellRenderer

The cell renderer to apply to the column

(A full list of cell renderers can be found here)

editable

True

Whether the column is editable

rerun_trigger

True

Editing the column triggers reprocessing of all rerunnable columns in that row

name

The name of the custom column to display in the table header

width

400

The width of the column in pixels

search_config

SearchConfig

The search configuration for the column. Default values can be found here.

By default no knowledge is available if scope_ids is not defined. To allow access to all knowledge, set the configuration to “search_config": { "scope_ids": null}.

To exclude uploaded files from the search for a given column, set exclude_uploaded_files: true

is_selected_by_default

False

Whether the column is selected by default. Only relevant when the renderer is a SelectableCellRenderer.

system_prompt

The system prompt to use for the language model

assistant_prompt

The assistant prompt template with placeholders like {{question}}, {{answer}}, etc.

subagent_id

““

If the column triggers a subagent instead of the system/assistant prompt pair. In this case, the assistant_prompt is compiled with context and passed on as the prompt to the subagent.

TOC Extraction

The configuration for the Table of Contents (TOC) extraction

json
 "toc_extraction": {
    "language_model": "AZURE_GPT_4o_2024_0806",
    "system_prompt": "You are a expert in the field of RFPs and can extract the table of contents from a given text. You will be given a text and you need to extract the table of contents from the text into a structured JSON object.\n\nThe JSON object should have the following fields:\n- section: The section of the text that the question is in. Do not include any brackets or other text.\n- title: The title of the section.\n\nNOTE: DO NOT include questions in the table of contents. If no explicit section numbering is found, use the title for both fields.\n\nThe JSON object should be in the following format:\n{\n    \"sections\": [\n        {\n            \"section\": \"The section of the text that the question is in\",\n            \"title\": \"The title of the section\"\n        },\n        ...\n    ]\n}",
    "trigger_prompt": "Here is the text:\n{{text}}"
  }

Parameter

Default

Description

language_model

AZURE_GPT_4o_2024_0806

The language model to use for the TOC extraction

system_prompt

You are a expert in the field of RFPs and can extract the table of contents from a given text. You will be given a text and you need to extract the table of contents from the text into a structured JSON object.\n\nThe JSON object should have the following fields:\n- section: The section of the text that the question is in. Do not include any brackets or other text.\n- title: The title of the section.\n\nNOTE: DO NOT include questions in the table of contents. If no explicit section numbering is found, use the title for both fields.\n\nThe JSON object should be in the following format:\n{\n \"sections\": [\n {\n \"section\": \"The section of the text that the question is in\",\n \"title\": \"The title of the section\"\n },\n ...\n ]\n}

The system prompt for the TOC extraction

trigger_prompt

Here is the text:\n{{text}}

The trigger prompt for the TOC extraction

Question Extraction

The configuration for the question extraction

json
"question_extraction": {
  "mode": "extract",
  "language_model": "AZURE_GPT_4o_2024_0806",
  "system_prompt": "...",
  "trigger_prompt": "Here is the text:\n{{text}}",
  "use_full_document": false,
  "full_document_max_input_tokens": 20000,
  "use_hierarchical_extraction": false,
  "use_xlsx_preprocessing": false,
  "max_extraction_rows": 500,
  "details_format": "multiline"
}

Parameter

Default

Description

mode

extract

Controls how uploaded question files are converted into table rows. extract uses the existing LLM extraction flow. strict_verbatim imports rows directly from CSV/XLSX and fails with a user-facing validation message if the file does not match the expected table format. prefilter_verbatim tries the same verbatim import first, then falls back to extract if validation fails. Existing configs without mode behave as extract.

language_model

AZURE_GPT_4o_2024_0806

The language model to use for the question extraction

system_prompt

You are a expert in the field of Request for Proposals (RFPs) and can extract questions from a given text.\nYou will be given a text that is part of an RFP document and you need to extract the questions from the text into a structured JSON object.\nDO NOT extract questions from text belonging to general information or notice sections.\nDO NOT extract questions from text that is just a table header with no content or questions.\nSTRICTLY focus on the sections that are related to the questions and NOTHING ELSE.\nONLY extract questions verbatim from the RFP text without any modifications.\n\nThe JSON object should have the following fields:\n- question: The question verbatim from the text\n- section: The section index that the question is in. Do not include the text here.\n\nThe JSON object should be in the following format:\n{\n \"questions\": [\n {\n \"question\": \"The question from the text\",\n \"section\": \"The section index the question is in\"\n },\n ...\n ]\n}

The system prompt for the question extraction

trigger_prompt

Here is the text:\n{{text}}

The trigger prompt for the question extraction

use_full_document

false

If true, extract questions from the full document in a single LLM call instead of chunk-by-chunk. Falls back to chunked mode if the document exceeds the token limit. See full_document_max_input_tokens.

full_document_max_input_tokens

20000

Maximum input tokens (document text only, excluding prompt overhead) for full-document extraction. If exceeded, gracefully falls back to chunked extraction. Default of 20,000 is derived from GPT-4o's 16,384 output token ceiling. For hierarchical extraction, consider lowering to ~15,000 due to richer output schema.

use_hierarchical_extraction

false

If true, use a hierarchical schema (ExtractedDocument) that captures sections, question types, answer options, table structures, and sub-question relationships, then flattens to enriched RfpQuestion entries. Requires use_full_document=true. Eliminates the need for a separate TOC extraction pass.

hierarchical_system_prompt

(specialized form analysis prompt)

Override the default system prompt for hierarchical extraction here. Default is optimized for due diligence questionnaires and multi-part forms.

use_xlsx_preprocessing

false

If true, XLSX files are preprocessed using openpyxl to preserve data validations (dropdown lists), hidden option sheets, VML form controls (checkboxes), bold/merged cells, and sheet structure before sending to the LLM for extraction.

max_extraction_rows

500

Maximum number of questions to extract per document. If extraction produces more questions, only the first max_extraction_rows are processed and the user is notified via an in-app toast. Set to null to disable the limit.

details_format

multiline

Format to render the supplementary <details> block embedded in each extracted question (parent question chain, question type, answer options, table row/column labels, inputs, comments).

Only applies when use_hierarchical_extraction is true.

Use multiline for markdown , bullet lists, and <br> separators Use compact for bold labels with pipe-separated values on a single line.

Recommended Configuration for Excel (XLSX) Workbooks

To enable enhanced question extraction from Excel files, set the following configuration. All three flags are required for XLSX preprocessing. AZURE_GPT_51_2025_1113 produces the highest extraction recall across tested fixtures. The token limit of 25,000 accommodates most single-sheet workbooks; larger workbooks automatically switch to per-sheet extraction.

json
{
  "question_extraction": {
    "use_xlsx_preprocessing": true,
    "use_full_document": true,
    "use_hierarchical_extraction": true,
    "full_document_max_input_tokens": 25000,
    "language_model": "AZURE_GPT_51_2025_1113"
  }
}
Hallucination Check

The configuration for the hallucination check

json
"hallucination": {
    "custom_prompts": {
      "systemPrompt": "\nYou will receive a question, references, a conversation between a user and an agent, and an output. \nThe output is the answer to the question. \nYour task is to evaluate if the output is fully supported by the information provided in the references and conversation, and provide explanations on your judgement in 2 sentences.\n\nUse the following entailment scale to generate a score:\n[low] - All information in output is supported by the references/conversation, or extractions from the references/conversation.\n[medium] - The output is supported by the references/conversation to some extent, but there is at least some information in the output that is not discussed in the references/conversation. For example, if an instruction asks about two concepts and the references/conversation only discusses either of them, it should be considered a [medium] hallucination level.\n[high] - The output contains information that is not part of the references/conversation, is unrelated to the references/conversation, or contradicts the references/conversation.\n\nMake sure to not use any external information/knowledge to judge whether the output is true or not. Only check whether the output is supported by the references/conversation, and not whether the output is correct or not. Also do not evaluate if the references/conversation contain further information that is not part of the output but could be relevant to the question. If the output mentions a plot or chart, ignore this information in your evaluation.\n\nYour answer must be in JSON format:\n{\n \"reason\": Your explanation of your judgement of the evaluation,\n \"value\": decision, must be one of the following: [\"high\", \"medium\", \"low\"]\n}                                                  \n",
      "systemPromptDefault": "\nYou will receive a question and an output. \nThe output is the answer to the question. \nThe situation is that no references could be found to answer the question. Your task is to evaluate if the output contains any information to answer the question,\nand provide a short explanations of your reasoning in 2 sentences. Also mention in your explanation that no references were provided to answer the question.\n\nUse the following entailment scale to generate a score:\n[low] - The output does not contain any information to answer the question.\n[medium] - The output contains some information to answer the question, but does not answer the question entirely. \n[high] - The output answers the question.\n\nIt is not considered an answer when the output relates to the questions subject. Make sure to not use any external information/knowledge to judge whether the output is true or not. Only check that the output does not answer the question, and not whether the output is correct or not.\nYour answer must be in JSON format:\n{\n \"reason\": Your explanation of your reasoning of the evaluation,\n \"value\": decision, must be one of the following: [\"low\", \"medium\", \"high\"]\n}\n",
      "userPrompt": "\nHere is the data:\n\nInput:\n'''\n$input_text\n'''\n\nReferences:\n'''\n$contexts_text\n'''\n\nConversation:\n'''\n$history_messages_text\n'''\n\nOutput:\n'''\n$output_text\n'''\n\nAnswer as JSON:\n",
      "userPromptDefault": "                                                  \nHere is the data:\n\nInput:\n'''\n$input_text\n'''\n\nOutput:\n'''\n$output_text\n'''\n\nAnswer as JSON:\n"
    },
    "enabled": true,
    "language_model": "AZURE_GPT_4o_2024_0806",
    "name": "hallucination",
    "score_to_label": {
      "HIGH": "RED",
      "LOW": "GREEN",
      "MEDIUM": "YELLOW"
    },
    "score_to_title": {
      "HIGH": "High Hallucination",
      "LOW": "No Hallucination Detected",
      "MEDIUM": "Hallucination Warning"
    }
  }

Parameter

Default

Description

language_model

AZURE_GPT_4o_2024_0806

The language model to use for the hallucination evaluation

enabled

True

Activates the specific hallucination metric

scoreToLabel

py
{
        "LOW": "GREEN",
        "MEDIUM": "YELLOW",
        "HIGH": "RED",
    }

Assigns colors based on the score

scoreToTitle

py
 {
        "LOW": "No Hallucination Detected",
        "MEDIUM": "Hallucination Warning",
        "HIGH": "High Hallucination",
    }

Sets custom titles for each score

Docx Generator

Docx Generator configuration for report generation

json
"docx_generator_config": {
    "columns_to_include": [
      "Section",
      "Question",
      "Answers",
      "References",
      "Hallucination Score"
    ],
    "skip_ingestion": true,
    "template_content_id": null,
    "template_fields": {
      "date": "CURRENT_DATE",
      "document_title": "Template Document"
    },
    "upload_scope_id": null,
    "upload_suffix": "_report_output.docx",
    "upload_to_chat": true,
    "strip_citations_from_answers_on_export": false,
    "include_question_details_in_export": true
}

Parameter

Default

Description

columns_to_include

[
"Section",
"Question",
"Answers",
"References",
"Hallucination Score"
]

The columns to include in the report.

Note here that the “Answers” column is specified even if your “selectable” columns are named otherwise and only the selected answers are included in the answer column.

skip_ingestion

True

Whether to skip the ingestion of the file

template_content_id

The content ID of the template file to be found in the templateScopeId. If not provided, the default template will be used.

template_fields

{

"date": "CURRENT_DATE",

"document_title": "Template Document"

}

The fields to be replaced in the template

upload_scope_id

The scope ID where the generated DOCX file will be uploaded. If not provided and upload_to_chat is False, an error will be raised.

upload_suffix

_report_output.docx

The suffix of the uploaded file.

upload_to_chat

True

Whether to upload the file to the chat.

strip_citations_from_answers_on_export

False

When enabled, removes inline citation markers (e.g. [1], [2]) and the "References" section from the DOCX export.

include_question_details_in_export

True

If true, render the question details block (Section, Question Type, etc.) as a 'Details:' section in the DOCX export, styled like Answer: and Reference(s):. If false, the details block is omitted entirely from the export.

Xlsx Generator

Xlsx Generator configuration for table export (consumed by the frontend).

json
"xlsx_generator_config": {
    "strip_citations_from_answers_on_export": false
}

Parameter

Default

Description

strip_citations_from_answers_on_export

False

When enabled, removes inline citation markers (e.g. [1], [2]) and the "References" section from the XLSX export. Note that the unformatted XLSX remains unchanged.

Ingestion

The configuration for the ingestion

json
"ingestion_config": {
    "column_ids_in_chunk_text": [
      "0",
      "1",
      "2",
      "3"
    ],
    "column_ids_in_metadata": ["0"],
    "scope_id": ""
  }

Parameter

Default

Description

column_ids_in_chunk_text

The column ids to include in the chunk text

column_ids_in_metadata

The column ids to include in the metadata

scope_id

The scope id to use for the ingestion. If no scope_id is provided, the ingestion will be skipped

Step 2: Set Advanced Settings

Required Settings

In order to activate the Agentic Table interface, the administrator will need to set two parameters. the first parameter “userInterface" must be set to “MAGIC_TABLE" to activate the user interface. Second the user will have the option to set “magicTableConfig". Within this set of parameters, admins can elect to activate or deactivate the Answer Library. by setting “answerLibrary" to true or false, respectively.

json
 "userInterface": "MAGIC_TABLE",
  "magicTableConfig": {
    "answerLibrary": false
  }

Review Status Visibility (Optional)

A Space Admin can activate or deactivate the review status if they want. With the review status deactivated, a space would look like this:

Screenshot 2025-11-28 at 13.14.31.pngScreenshot 2025-11-28 at 13.14.17.png

To remove the review status from a space,

json
"magicTableConfig": {
  "hideSheetStatus": true
}
info

This does not control the “Review Status” config in the Assistant Configuration. To get the full benefits of a Space without sheet status and row status, do not include the “Review Status” column in the Assistants configuration.

Configure Review Status (Optional)

Review Statuses allow the user to track the progress of their table reviews. In addition to a visual cue, this also helps to protect rows from unwanted editing from AI agents and users. This section will describe the default behavior of review status and how to configure custom review statuses

Review statuses can be configured per space (via Advanced Settings) and need to be placed within the magicTableConfig

info

Note: Changes in Review Status Configuration is not applied to existing sheets. When the review status configuration is change at the space level:

Default Review Statuses

By default, Review Status columns allow users to mark rows as Needs Review, Ready for Verification, or Verified.

This column not only provides visual indicators for the review process but also controls editing permissions for each row.

These default review statuses, correspond to the following behaviors:

  • Needs Review – Rows marked Needs Review are fully editable by both the AI Agent and users.

  • Ready for Verification – Rows marked Ready for Verification can be edited manually by users, but are locked for AI Agent edits.

  • Verified – Rows marked Verified are fully locked and cannot be edited by anyone. Once all rows are verified, the sheet can be marked as completed.

Configuration and Parameters

Custom review statuses can be configured per space (via Advanced Settings) and need to be placed within the magicTableConfig

While users do not need to provide the default configuration as part of their Advanced Settings, the flowing expander explicitly provides the default setting:

Default Review Status Configuration and Parameters
json
"magicTableConfig": {
   "reviewStatuses": [
    {
      "name": "NEEDS_REVIEW",
      "editState": "FULLY_EDITABLE",
      "color": "#FDD812"
    },
    {
      "name": "READY_FOR_VERIFICATION",
      "editState": "MANUAL_EDIT_ONLY",
      "color": "#A0C855"
    },
    {
      "name": "VERIFIED",
      "editState": "FINAL",
      "color": "#32B2D2"
    }
  ]
}

Custom Review Statuses

With the introduction of custom review statuses, users gain more flexibility and control over their review workflows.

Custom review statuses allow users to:

  • Create and name their own status labels.

  • Configure behavior and color for each status.

  • Establish more extensible, user-friendly, and domain-specific review processes.

Expand the two following drop downs to see an example of a Custom Review Status Configuration side-by-side with a rendered Custom review dropdown:

Example Custom Review Status Dropdown
image-20251021-182121.png

Example Custom Review Status Configuration
json
"magicTableConfig": {
   "reviewStatuses": [
    {
      "name": "DRAFT",
      "editState": "FULLY_EDITABLE",
      "color": "#0000AA"
    },
    {
      "name": "IN_REVIEW",
      "editState": "FULLY_EDITABLE",
      "color": "#0000AA"
    },
    {
      "name": "APPROVED",
      "editState": "MANUAL_EDIT_ONLY",
      "color": "#00AA00"
    },
    {
      "name": "PUBLISHED",
      "editState": "FINAL",
      "color": "#AA0000"
    }
  ]
}

Review Status Parameters

Parameter Name

Validation Rules

name

Must be written in UPPER_SNAKE_CASE (e.g., IN_REVIEW).

editState

Must be one of the following: 

  • FULLY_EDITABLE – Row can be edited by both the user and the AI Agent (equivalent to Needs Review).

    • Note: The first FULLY_EDITABLE state will represent the default state when a new row gets generated

  • MANUAL_EDIT_ONLY – Row can only be edited manually by users (equivalent to Ready for Verification). 

  • FULLY_LOCKED – The row is locked for all editing, but it is not considered final (e.g., the sheet cannot yet be marked as completed).

  • FINAL – The row is fully locked (equivalent to Verified). Once all rows reach the FINAL status, the sheet can be marked as completed.

color

Must be provided in hex code format (e.g., #00AA00).

Migrate to Custom Review Status for Existing Sheets

In the case of an update to an existing space’s review status configuration, it may be desirable to convert all existing sheets to the new review status configuration. In order to resolve this complex task, Unique provides a GraphQL mutation that will perform the migration. Review the following dropdown for in-depth instructions.

Migrating Review Status for Existing Sheets

To update existing sheets to use the new custom review statuses defined in a space, a GraphQL mutation can be invoked in the node-chat service. This operation can only be performed by space administrators.

Mutation:

graphql
mutation MigrateAndSyncReviewStatuses($assistantId: String!, $statusMapping: JSONObject!) {
  migrateAndSyncReviewStatuses(assistantId: $assistantId, statusMapping: $statusMapping) {
    message
    status
  }
}

Parameters:

  • assistantId — The ID of the space to be migrated after enabling custom review statuses.

  • statusMapping — A JSON object defining how existing (old) statuses should be mapped to the new custom ones.

For example, if a space previously used the default statuses (NEEDS_REVIEW, READY_FOR_VERIFICATION, VERIFIED) and has introduced new statuses DRAFT, APPROVED, and PUBLISHED, the mapping would be as follows:

{
  "NEEDS_REVIEW": "DRAFT",
  "READY_FOR_VERIFICATION": "APPROVED",
  "VERIFIED": "FINAL"
}

Example 1: Migrate space with default review statuses

Query Variables:

json
{
  "assistantId": "assistant_XYZ",
  "statusMapping": {
    "NEEDS_REVIEW": "DRAFT",
    "READY_FOR_VERIFICATION": "APPROVED",
    "VERIFIED": "PUBLISHED"
  }
}

In this example, the space previously used the default review statuses (NEEDS_REVIEW, READY_FOR_VERIFICATION, VERIFIED) and has been updated to use the following custom configuration:

json
"magicTableConfig": {
   "reviewStatuses": [
    {
      "name": "DRAFT",
      "editState": "FULLY_EDITABLE",
      "color": "#0000AA"
    },
    {
      "name": "APPROVED",
      "editState": "MANUAL_EDIT_ONLY",
      "color": "#00AA00"
    },
    {
      "name": "PUBLISHED",
      "editState": "FINAL",
      "color": "#AA0000"
    }
  ]
}

After the mutation is executed, all existing sheets associated with the specified space will be synchronized to use the new custom review statuses according to the provided mapping.

Example 2: Migrate space with custom review statuses

Query Variables:

json
{
  "assistantId": "assistant_XYZ",
  "statusMapping": {
    "WORK_IN_PROGRESS": "DRAFT",
    "CHECKED": "APPROVED",
    "FINALIZED": "PUBLISHED"
  }
}

In this example, the space previously used custom review statuses (WORK_IN_PROGRESS (editState FULLY_EDITABLE), CHECKED (editState MANUAL_EDIT_ONLY), FINALIZED (editState FINAL)) and has been updated to use the following custom configuration:

json
"magicTableConfig": {
   "reviewStatuses": [
    {
      "name": "DRAFT",
      "editState": "FULLY_EDITABLE",
      "color": "#0000AA"
    },
    {
      "name": "APPROVED",
      "editState": "MANUAL_EDIT_ONLY",
      "color": "#00AA00"
    },
    {
      "name": "PUBLISHED",
      "editState": "FINAL",
      "color": "#AA0000"
    }
  ]
}

After the mutation is executed, all existing sheets associated with the specified space will be synchronized to use the new custom review statuses according to the provided mapping.

info

Note: The Custom Review Status feature is still in beta and can be enabled by setting the feature flag FEATURE_FLAG_ENABLE_CUSTOM_REVIEW_STATUS_UN_13502=true in the next-chat app

Step 3: Using the Agentic Table Interface

End users can interact with the Agentic Table in several ways:

  • Create a new sheet and import questions:

    • Upload a document containing structured questions (e.g., RFP, DDQ)

    • Import questions directly from existing entries in the Knowledge Base

  • Use an existing sheet

    • Manually add or edit individual questions directly in the table interface

  • Post-processing actions:

    • Export the table to share or archive the responses externally

    • Share the table with other users within the organization

    • Move rows of the table to a Library Sheet — a shared repository that consolidates relevant sheets across the organization for cross-team access and reuse

  • The full user interface of the Agentic Table is detailed in the following page Agentic Table ‎.

Processing Logic

Once a question is added, the Agent performs the following steps:

  1. Embeds the question

  2. Executes a semantic search (VectorDB) or full-text search (PostgreSQL)

  3. Retrieves the most relevant internal documents

  4. Generates a response based on the retrieved context

Output in the Agentic Table

Each processed question results in:

  • A generated answer (displayed in the table cell)

  • Reference tags linking to the internal documents used

  • Hallucination score indicating the confidence


Security

  • Access is restricted to internal knowledge sourced only from:

    • Documents uploaded to the Knowledge Base

    • Files uploaded directly during use of the Agentic Table

  • Only accessible by authorized users within configured spaces

  • AI module configuration is restricted to users with the space.admin.write role

  • Outputs are generated strictly from retrieved internal data, with references where applicable

  • Administrators must ensure that users who should access the Agentic Table space have either the chat.knowledge.read or the admin.space.write role assigned in Zitadel, or are a Space Manager of that space

  • By default, no knowledge is available if the answer column’s search_config.scope_ids is not defined. To allow access to all knowledge, the search_config of the answer column must be set to { "scope_ids": null }.


Data Retention

It is possible to define a data retention policy for Agentic Table data. The retention period can be specified in days, and when enabled, it will delete the following data:

  • The sheet, including its cells, rows, and columns

  • Any content manually uploaded directly to the sheet

  • It will NOT impact any data in the Knowledge Base

The deletion of all data is based on the creation timestamp of the sheet. Sheets older than the defined retention period will be removed.

The data retention job runs daily at midnight. To activate data retention, the following configuration options are available:

Global Configuration

A global retention period can be defined via the environment variable DATA_RETENTION_IN_DAYS_AGENTIC_TABLE, which must be specified in the node-chat deployment configuration.

This variable can be either a number or a boolean:

  • If DATA_RETENTION_IN_DAYS_AGENTIC_TABLE = '30'

  • → All sheets older than 30 days will be deleted the next time the job runs.

  • If DATA_RETENTION_IN_DAYS_AGENTIC_TABLE = 'true'

  • → No global retention is applied, but space-level retention (if configured) will be executed.

  • If DATA_RETENTION_IN_DAYS_AGENTIC_TABLE is not defined

  • No data will be deleted, even if a space-level retention period is set.

Space-Level Configuration

At the space level, a retention period can be defined by setting the advanced configuration property dataRetentionInDays inside magicTableConfig. Example:

Screenshot 2025-11-07 at 14.27.29.png
  • Note: Space-level data retention is only executed if the global variable DATA_RETENTION_IN_DAYS_AGENTIC_TABLE is enabled (set to 'true') or specified as a number (e.g., '30'). If the global variable is not defined, the space-level configuration will be ignored.

  • If both a global and a space-level retention period are defined, the space-level configuration takes priority for that space.

  • Data retention can only be defined for spaces without an Answer Library. If a space uses an Answer Library, data retention settings cannot be applied — these two configurations are mutually exclusive.


Limitations

note
  • Follow-up Questions: This functionality is currently not available.

  • Spreadsheet import: Agentic Table supports CSV/XLSX question-file import. By default, uploaded question files use LLM extraction (question_extraction.mode = "extract"). Space admins can configure strict_verbatim or prefilter_verbatim to import matching CSV/XLSX rows directly into the table.

  • One-to-One Configuration per Space: Each configuration is tightly coupled to a specific space. Users cannot maintain multiple configurations within the same space.


Flow Diagrams

This document contains all the flow diagrams for the agent, providing a comprehensive view of the system's workflow logic.


Main Controller Flow Overview

The main controller orchestrates all actions and routes them to appropriate workflows.

image-20250822-023055.png

Sheet Created Action Flow

Simple flow for when a new sheet is created.

image-20250822-023129.png


Add Source Files Action Flow

Flow for processing source file additions to answer existing questions.

image-20250822-023206.png


Add Question Files Action Flow

Flow for processing question files to extract and add questions.

image-20250822-023305.png

XLSX Preprocessing Branch: When an XLSX file is uploaded and use_xlsx_preprocessing is enabled, the agent downloads the raw file and runs a Python preprocessor (openpyxl) that classifies sheets (content vs options vs metadata), reads data validations and VML controls, and produces structured YAML. This YAML is sent to the hierarchical extraction pipeline with an XLSX-specific system prompt. If preprocessing fails or zero questions are extracted, the pipeline falls back to the standard chunk-based extraction path.


Add Individual Questions Action Flow

Flow for processing individual question texts.

image-20250822-023425.png

Update Cell Action Flow

Flow for handling cell updates including custom column processing.

image-20250822-023511.png


Generate Reports Action Flow

Flow for generating and posting artifacts (reports).

image-20250822-023610.png

Sheet Completed Action Flow

Flow for pushing completed sheet data to the library.

image-20250822-023644.png

Library Row Verified Action Flow

Flow for ingesting verified library rows.

image-20250822-023710.png

Common Flows

  • Question Addition: Extract → Process → Display → Answer

  • Source Updates: Re-process existing questions with new sources

  • Cell Updates: Validate → Process → Update → Track

Last updated