Agentic Table Space — Unique AI Documentation
Agentic Table Space
21 min read
Overview Copy link to this section
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 Copy link to this section
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 Copy link to this section
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 Copy link to this section
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 Copy link to this section
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 Copy link to this section
Step 1: Configure the Agentic Table Copy link to this section
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.
Key sub-field is scope_ids (below). 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
To exclude specific documents by ID, use exclude_content_ids: [<id>, …] . |
| search_config.scope_ids | [] | Folder scope(s) that the column retrieves from.
Non-empty list → the column searches only those folders (and, for sub-agent columns, their subfolders) and ignores the row's own documents.
Empty[] (default) → the column searches the sheet sources and uploaded documents.
See also search_config.additional_scope_ids below. |
| 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. |
| subagent_max_wait_seconds | 300 | Maximum seconds to wait for a subagent message to complete before raising a timeout. Only applied for columns with a subagent_id set. Value needs to be between 10-900. |
Scoping Subagent columns withsearch_config
Subagent columns resolve their search scope by the following precedence (first match wins):
scope_ids: The column searches only the listed folders and their subfolders. The sheet’s own sources and question files are ignored.additional_scope_ids: adds a fixed reference corpus on top of the sheet's documents. The column searches the listed folders (and subfolders) in set-union with the sheet’s source documents. Use when a column needs both an always-available library (e.g. an answer library) and the sheet's own files. If bothscope_idsandadditional_scope_idsare set,scope_idswins andadditional_scope_idsis ignored.The row’s specific sources/uploaded documents, if any.
Otherwise, the chat's uploaded question files are excluded and the column searches everything else.
When scope_idsoradditional_scope_idsis active, the column subagent is pinned to internal knowledge search.
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 RfpQuestionentries. 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<br>{<br> "LOW": "GREEN",<br> "MEDIUM": "YELLOW",<br> "HIGH": "RED",<br> }<br> | Assigns colors based on the score |
| scoreToTitle | py<br> {<br> "LOW": "No Hallucination Detected",<br> "MEDIUM": "Hallucination Warning",<br> "HIGH": "High Hallucination",<br> }<br> | 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. |
| strip_html_tags_on_export | False | If true, remove HTML tags from cell text when exporting the table to XLSX. |
| render_markdown_on_export | False | If true, render markdown in cell text as native Excel formatting (rich-text runs) when exporting the table to XLSX. |
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 Copy link to this section
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:
To remove the review status from a space,
json
"magicTableConfig": {
"hideSheetStatus": true
}
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
Note: Changes in Review Status Configuration is not applied to existing sheets. When the review status configuration is change at the space level:
All newly created sheets within that space will automatically use those statuses
Previously created sheets will retain their existing review status configuration
To update existing sheet’s review statuses see: https://unique-ch.atlassian.net/wiki/spaces/SDV/pages/1371832625/Agentic+Table+Space#Migrate-to-Custom-Review-Status-for-Existing-Sheets
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
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). |
| answerRoleVisible | answerRoleVisible (boolean, optional, defaults totrue ) — Controls whether rows in this review status are visible to users with the Can Answer role: when set to false, assigned rows in this status are hidden from those users, and this status-based filtering only takes effect once at least one review status in the sheet sets it to false (otherwise all statuses remain visible as before). |
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
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
Sheet Metadata Form (Optional)
Space Admins can define a metadata form that is shown to end users during the sheet creation flow. The fields configured here are rendered in the General section when a new sheet is created, and the values entered by the user are stored as sheet metadata (visible on the sheet inside the table instructions dropdown).
This is useful for capturing structured context about a sheet up front — for example the fund, investor, reporting date, or frequency a questionnaire relates to.
The metadata form is configured per space and must be placed inside magicTableConfig under the key sheetMetadataFormConfiguration. The configuration consists of a fields array, where each entry describes a single form field.
Example:
"magicTableConfig": {
"sheetMetadataFormConfiguration": [\
{\
"key": "date",\
"type": "date",\
"label": "Date"\
},\
{\
"key": "investor",\
"type": "text",\
"label": "Investor",\
"placeholder": "Enter investor name"\
},\
{\
"key": "frequency",\
"type": "dropdown",\
"label": "Frequency",\
"placeholder": "Select frequency",\
"options": [\
{ "label": "Monthly", "value": "Monthly" },\
{ "label": "Quarterly", "value": "Quarterly" },\
{ "label": "Annually", "value": "Annually" }\
]\
},\
{\
"key": "topic",\
"type": "dropdown",\
"label": "Topic",\
"placeholder": "Select topic",\
"options": [\
{ "label": "Firm", "value": "Firm" },\
{ "label": "Fund", "value": "Fund" },\
{ "label": "Market", "value": "Market" }\
]\
}\
]
}
How it looks like on sheet creation flow:
Field Parameters:
| Parameter | Required | Description |
|---|---|---|
key |
Yes | Unique identifier for the field. Used as the metadata key under which the entered value is stored. |
label |
Yes | The label displayed above the field in the form. |
type |
Yes | The input type. Must be one of: text (free-text input), dropdown (single-select from a fixed list), or date (date picker, stored as YYYY-MM-DD). |
placeholder |
No | Placeholder text shown when the field is empty. For dropdown, defaults to Select an option if omitted. |
options |
Required for dropdown |
List of selectable options, each an object with a non-empty label and value. Ignored for text and date. A dropdown field with no options is invalid and will be skipped. |
Behavior and validation
All metadata form fields are optional for the end user — a sheet can be created without filling any of them in.
Each field is validated: entries missing a
key,label, or validtype, or adropdownwith an empty/invalidoptionslist, are silently dropped. If no valid fields remain, the form is not displayed.Entered values are persisted as sheet metadata only for the fields the user actually saw in the form.
Note: This feature is behind the feature flag FEATURE_FLAG_AGENTIC_TABLE_METADATA_FORM_UN_17903 and must be enabled for the organization for the form to be visible.
Step 3: Using the Agentic Table Interface Copy link to this section
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:
Embeds the question
Executes a semantic search (VectorDB) or full-text search (PostgreSQL)
Retrieves the most relevant internal documents
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 Copy link to this section
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.writeroleOutputs 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.reador theadmin.space.writerole assigned in Zitadel, or are a Space Manager of that spaceBy default, no knowledge is available if the answer column’s
search_config.scope_idsis not defined. To allow access to all knowledge, thesearch_configof the answer column must be set to{ "scope_ids": null }.
Data Retention Copy link to this section
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_TABLEis 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:
Note: Space-level data retention is only executed if the global variable
DATA_RETENTION_IN_DAYS_AGENTIC_TABLEis 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 Copy link to this section
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 configurestrict_verbatimorprefilter_verbatimto 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 Copy link to this section
This document contains all the flow diagrams for the agent, providing a comprehensive view of the system's workflow logic.
Main Controller Flow Overview Copy link to this section
The main controller orchestrates all actions and routes them to appropriate workflows.
Sheet Created Action Flow Copy link to this section
Simple flow for when a new sheet is created.
Add Source Files Action Flow Copy link to this section
Flow for processing source file additions to answer existing questions.
Add Question Files Action Flow Copy link to this section
Flow for processing question files to extract and add questions.
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 Copy link to this section
Flow for processing individual question texts.
Update Cell Action Flow Copy link to this section
Flow for handling cell updates including custom column processing.
Generate Reports Action Flow Copy link to this section
Flow for generating and posting artifacts (reports).
Sheet Completed Action Flow Copy link to this section
Flow for pushing completed sheet data to the library.
Library Row Verified Action Flow Copy link to this section
Flow for ingesting verified library rows.
Common Flows Copy link to this section
Question Addition: Extract → Process → Display → Answer
Source Updates: Re-process existing questions with new sources
Cell Updates: Validate → Process → Update → Track