Skip to content

Commit b4425d2

Browse files
RFP sample data and team configuration
1 parent c1d26b6 commit b4425d2

13 files changed

+398
-284
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
{
2+
"id": "1",
3+
"team_id": "team-clm-1",
4+
"name": "RFP Team",
5+
"status": "visible",
6+
"created": "",
7+
"created_by": "",
8+
"description": "A specialized multi-agent team that analyzes RFP and contract documents to summarize content, identify potential risks, check compliance gaps, and provide action plans for contract improvement.",
9+
"logo": "",
10+
"plan": "",
11+
"agents": [
12+
{
13+
"input_key": "",
14+
"type": "summary",
15+
"name": "SummaryAgent",
16+
"deployment_name": "gpt-4o-mini",
17+
"icon": "",
18+
"system_message": "You are an expert in summarizing large and complex RFP or contract documents. Your job is to generate concise, accurate, and structured summaries of each section of the dataset (Scope of Work, Functional Requirements, SLAs, Evaluation Criteria, etc.). Focus on clarity and factual representation.",
19+
"description": "Summarizes RFP and contract documents into structured, easy-to-understand overviews.",
20+
"use_rag": true,
21+
"use_mcp": false,
22+
"use_bing": false,
23+
"use_reasoning": false,
24+
"index_name": "clm-rfp-index",
25+
"index_foundry_name": "",
26+
"index_endpoint": "",
27+
"coding_tools": false
28+
},
29+
{
30+
"input_key": "",
31+
"type": "risk",
32+
"name": "RiskAgent",
33+
"deployment_name": "gpt-4o-mini",
34+
"icon": "",
35+
"system_message": "You are a risk analysis specialist focused on identifying potential contractual, operational, and financial risks within RFP or contract documents. Evaluate clauses for ambiguity, unfair terms, delivery risks, compliance issues, and unrealistic KPIs. Provide detailed risk insights and mitigation recommendations.",
36+
"description": "Analyzes the dataset for risks such as delivery, financial, operational, and compliance-related vulnerabilities.",
37+
"use_rag": true,
38+
"use_mcp": false,
39+
"use_bing": false,
40+
"use_reasoning": true,
41+
"index_name": "clm-rfp-index",
42+
"index_foundry_name": "",
43+
"index_endpoint": "",
44+
"coding_tools": false
45+
},
46+
{
47+
"input_key": "",
48+
"type": "compliance",
49+
"name": "ComplianceAgent",
50+
"deployment_name": "gpt-4o-mini",
51+
"icon": "",
52+
"system_message": "You are responsible for checking the RFP or contract against compliance frameworks, regulatory requirements, and internal policy standards. Detect missing clauses, inconsistencies, or non-compliant terms, and recommend necessary adjustments to align with compliance best practices.",
53+
"description": "Checks for compliance gaps against regulations, policies, and standard contracting practices.",
54+
"use_rag": true,
55+
"use_mcp": false,
56+
"use_bing": false,
57+
"use_reasoning": true,
58+
"index_name": "clm-rfp-index",
59+
"index_foundry_name": "",
60+
"index_endpoint": "",
61+
"coding_tools": false
62+
}
63+
],
64+
"protected": false,
65+
"starting_tasks": [
66+
{
67+
"id": "task-1",
68+
"name": "RFP Evaluation Workflow",
69+
"prompt": "Summarize all sections of the RFP dataset. Identify high-level risks, compliance gaps, and generate a final actionable summary plan.",
70+
"created": "",
71+
"creator": "",
72+
"logo": ""
73+
},
74+
{
75+
"id": "task-2",
76+
"name": "Risk & Compliance Deep Dive",
77+
"prompt": "Perform a detailed risk and compliance audit of the RFP dataset using the RiskAgent and ComplianceAgent outputs.",
78+
"created": "",
79+
"creator": "",
80+
"logo": ""
81+
}
82+
]
83+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
id,section,text
2+
RFP-2025-CLM-002-sec1,Background and Objectives,"GlobalTech seeks to implement a comprehensive Contract Lifecycle Management system to streamline contract creation, review, approval, and renewal processes. Current manual processes have led to inefficiencies and compliance challenges across 30,000+ contracts worldwide."
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
id,section,text
2+
RFP-2025-CLM-002-sec6,Evaluation Criteria,"Functionality 40%, Cost 25%, Implementation Plan 20%, Vendor References 15%, Security/Compliance 10%."
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
id,section,text
2+
RFP-2025-CLM-002-sec3,Functional Requirements,"Contract authoring, clause library, automated approval workflows, e-signature support, role-based access, reporting dashboards, alerts for renewals, AI-assisted clause recommendation."
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
id,section,text
2+
RFP-2025-CLM-002-sec7,Implementation Timeline,"Discovery (Month 1), Pilot (Month 2-3), Rollout (Month 4-5), Training (Month 5), Go-Live (Month 6)."
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
id,section,text
2+
RFP-2025-CLM-002-sec2,Scope of Work,"The vendor shall provide a CLM solution including requirements gathering, system configuration, integration with ERP and CRM, data migration, workflow automation, testing, user training, and post-deployment support."
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
id,section,text
2+
RFP-2025-CLM-002-sec5,SLA Clauses,"Availability 99.9%, response/resolution times defined, data retention policy, disaster recovery plan, termination, liability limits, confidentiality obligations."
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
id,section,text
2+
RFP-2025-CLM-002-sec8,Submission Instructions,"Submit complete proposals in PDF format to [email protected] no later than 5:00 PM EST on 2025-11-08. Include cover letter, technical proposal, implementation plan, project governance, and references."
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
id,section,text
2+
RFP-2025-CLM-002-sec4,Technical Requirements,"Cloud-based deployment, API integrations with SAP and Salesforce, secure data storage (AES-256), encryption in transit (TLS 1.2+), SOC 2 Type II compliance, GDPR/CCPA readiness."

scripts/index_rfp_doc.py

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
import os
2+
from azure.core.credentials import AzureKeyCredential
3+
from azure.search.documents.indexes import SearchIndexClient, SearchIndexerClient
4+
from azure.search.documents.indexes.models import (
5+
SearchIndex,
6+
SimpleField,
7+
SearchableField,
8+
SearchFieldDataType,
9+
SearchIndexerDataSourceConnection,
10+
SearchIndexer,
11+
SearchIndexerDataContainer,
12+
BlobIndexerDataToExtract,
13+
BlobIndexerParsingMode,
14+
FieldMapping,
15+
FieldMappingFunction
16+
)
17+
18+
# --- CONFIGURATION ---
19+
search_service_endpoint = "https://macae-search.search.windows.net"
20+
admin_key = "prm3QaLrqYIBeKAOO9GlcvMTOc6WlvVewKyHoTjXxhAzSeBLxz7K"
21+
22+
storage_connection_string = "DefaultEndpointsProtocol=https;AccountName=rfpstorage1010;AccountKey=zPdUD9vPl8MNzs1HfOS0xoFxEJh+HKTfvqQvGTLacf24CmP83TbHT/lU5zvyDuxbeJH8Ryck3C96+AStGXstYA==;EndpointSuffix=core.windows.net"
23+
blob_container_name = "rfp-documents"
24+
25+
data_source_name = "clm-rfp-blob-datasource"
26+
index_name = "clm-rfp-index"
27+
indexer_name = "clm-rfp-indexer"
28+
29+
# --- Initialize Clients ---
30+
index_client = SearchIndexClient(endpoint=search_service_endpoint, credential=AzureKeyCredential(admin_key))
31+
indexer_client = SearchIndexerClient(endpoint=search_service_endpoint, credential=AzureKeyCredential(admin_key))
32+
33+
# --- Define Index ---
34+
fields = [
35+
SimpleField(name="id", type=SearchFieldDataType.String, key=True),
36+
SearchableField(name="section", type=SearchFieldDataType.String, filterable=True, sortable=True),
37+
SearchableField(name="text", type=SearchFieldDataType.String, analyzer_name="en.microsoft"),
38+
SimpleField(name="source_csv", type=SearchFieldDataType.String, filterable=True)
39+
]
40+
41+
index = SearchIndex(name=index_name, fields=fields)
42+
43+
try:
44+
index_client.create_index(index)
45+
print(f"✅ Created index: {index_name}")
46+
except Exception as e:
47+
if "already exists" in str(e):
48+
print(f"⚠️ Index already exists: {index_name}")
49+
else:
50+
print(f"❌ Failed to create index: {e}")
51+
52+
# --- Define Data Source (Blob Storage) ---
53+
data_source = SearchIndexerDataSourceConnection(
54+
name=data_source_name,
55+
type="azureblob",
56+
connection_string=storage_connection_string,
57+
container=SearchIndexerDataContainer(name=blob_container_name),
58+
description="CLM RFP CSVs from Azure Blob Storage"
59+
)
60+
61+
try:
62+
indexer_client.create_data_source_connection(data_source)
63+
print(f"✅ Created data source: {data_source_name}")
64+
except Exception as e:
65+
if "already exists" in str(e):
66+
print(f"⚠️ Data source already exists: {data_source_name}")
67+
else:
68+
print(f"❌ Failed to create data source: {e}")
69+
70+
# --- Define Indexer (CSV parsing) ---
71+
indexer = SearchIndexer(
72+
name=indexer_name,
73+
description="Indexer for CLM RFP CSV data from Blob Storage",
74+
data_source_name=data_source_name,
75+
target_index_name=index_name,
76+
parameters={
77+
"configuration": {
78+
"parsingMode": "delimitedText",
79+
"delimiter": ",",
80+
"firstLineContainsHeaders": True,
81+
"dataToExtract": "contentAndMetadata",
82+
"documentRoot": "/",
83+
"failOnUnsupportedContentType": False,
84+
"indexedFileNameExtensions": ".csv",
85+
"contentTypeDetection": "auto", # ✅ REQUIRED
86+
"detectEncodingFromByteOrderMarks": True,
87+
"encoding": "utf-8"
88+
}
89+
}
90+
91+
,
92+
field_mappings=[
93+
FieldMapping(source_field_name="id", target_field_name="id"),
94+
FieldMapping(source_field_name="section", target_field_name="section"),
95+
FieldMapping(source_field_name="text", target_field_name="text"),
96+
FieldMapping(source_field_name="metadata_storage_name", target_field_name="source_csv")
97+
]
98+
)
99+
100+
try:
101+
indexer_client.create_indexer(indexer)
102+
print(f"✅ Created indexer: {indexer_name}")
103+
except Exception as e:
104+
if "already exists" in str(e):
105+
print(f"⚠️ Indexer already exists: {indexer_name}")
106+
else:
107+
print(f"❌ Failed to create indexer: {e}")
108+
109+
# --- Run Indexer ---
110+
try:
111+
indexer_client.run_indexer(indexer_name)
112+
print("🚀 Indexer started successfully.")
113+
except Exception as e:
114+
print(f"❌ Failed to run indexer: {e}")

0 commit comments

Comments
 (0)