
Implementation Guide: Generate product specifications, quality control procedures, and supplier rfqs
Step-by-step implementation guide for deploying AI to generate product specifications, quality control procedures, and supplier rfqs for Manufacturing clients.
Hardware Procurement
Document Scanner for Legacy Digitization
Document Scanner for Legacy Digitization
$350 MSP cost / $475 suggested resale
Digitizes existing paper-based product specifications, engineering drawings, QC procedures, and supplier records for ingestion into the RAG knowledge base. 40 ppm duplex scanning with intelligent document sorting feeds directly into SharePoint or local staging folder.
Large-Format Document Scanner (Optional)
Large-Format Document Scanner
$400 MSP cost / $525 suggested resale
For manufacturers with oversized engineering drawings, schematics, or large-format quality inspection sheets that exceed standard letter/legal size scanning. Only needed if client has significant legacy large-format documentation.
AI Inference Server (On-Premise Option Only)
$7,500–$9,000 MSP cost / $10,500–$13,000 suggested resale
On-premise LLM inference server for ITAR/CMMC-regulated manufacturers who cannot use cloud AI services. Hosts Ollama or vLLM with open-source models (Mistral Small 3 24B or Llama 3.1 8B). Not required for cloud-first deployments — skip this item for non-regulated clients.
GPU Accelerator (On-Premise Option Only)
NVIDIA L4 24GB PCIe
$2,500–$2,800 MSP cost / $3,200–$3,500 suggested resale
Provides 24GB VRAM for running 7B–24B parameter models at acceptable inference speeds on the PowerEdge T560. The L4's 72W TDP means no specialized cooling is required, making it suitable for standard server rooms. Not required for cloud deployments.
Software Procurement
Azure OpenAI Service
$25–$200/month depending on volume; GPT-5.4 mini at $0.15/$0.60 per 1M input/output tokens, GPT-5.4 at $2.50/$10.00 per 1M input/output tokens
Core LLM engine for generating product specifications, QC procedures, and supplier RFQs. Azure OpenAI provides enterprise data residency, RBAC via Entra ID, and content filtering. GPT-5.4 mini handles 80% of routine documents cost-effectively; GPT-5.4 handles complex multi-section technical specifications.
Microsoft 365 Copilot
$30/user/month via CSP; resale at $37–$40/user/month
Provides AI-assisted document editing directly in Word and Excel for refinement of AI-generated drafts. Engineers can use Copilot to modify specs in-context, generate comparison tables in Excel, and draft RFQ cover emails in Outlook.
Microsoft 365 Business Premium
$22/user/month via CSP; resale at $27–$30/user/month
Base productivity suite providing Word, Excel, Outlook, SharePoint, and Teams. SharePoint serves as the document management layer for AI-generated content. Business Premium includes Entra ID P1 for conditional access and Intune for device management.
Power Automate Premium
$15/user/month via CSP; resale at $19–$22/user/month
Orchestrates the end-to-end document generation workflow: triggers from ERP or user requests, calls Azure OpenAI API via HTTP connector, routes generated documents to SharePoint for review, sends approval notifications, and emails finalized RFQs to suppliers.
Copilot Studio
$200/month via CSP; resale at $250–$280/month
Builds custom manufacturing AI agents accessible through Teams. Engineers can chat with a 'Spec Generator' agent that pulls BOM data from the ERP and generates formatted specifications. Quality managers interact with a 'QC Procedure Writer' agent.
Pinecone Vector Database
Free Starter tier (2GB) for POC; Standard at $50–$100/month for production. Resale at $70–$130/month.
Stores vector embeddings of the manufacturer's existing document corpus (legacy specs, material databases, industry standards, approved supplier lists) for RAG retrieval. When the AI generates a document, it first queries Pinecone for relevant existing content to ensure consistency and accuracy.
Python Runtime and Libraries
$0 — free and open source
Core development runtime for the RAG pipeline, API integration scripts, and document processing. Key libraries: langchain, openai, pinecone-client, python-docx, openpyxl, fastapi, pydantic.
LangChain Framework
$0 — free and open source
Orchestration framework for building the RAG pipeline. Handles document loading, text splitting, embedding generation, vector store interaction, prompt template management, and chain-of-thought orchestration for complex multi-section documents.
AirgapAI (ITAR/Defense Alternative Only)
$697/user one-time; resale at $900–$1,100/user
Pre-built on-premise AI platform for ITAR/CMMC-regulated manufacturers. Includes 2,800+ manufacturing-specific workflows for technical documentation and quality procedures. Runs on Intel Core Ultra processors with zero cloud dependency. Only recommended for defense/aerospace manufacturers who cannot use cloud services.
Prerequisites
- Active Microsoft 365 Business Standard or Premium tenant with SharePoint Online enabled and at least 5 licensed users
- Azure subscription with billing configured and Owner or Contributor role on the subscription for deploying Azure OpenAI resources
- Azure OpenAI Service access approved (apply at https://aka.ms/oai/access if not already provisioned — approval typically takes 1–5 business days)
- ERP system with API access enabled: Epicor Kinetic REST services activated, Acumatica REST endpoints configured, Dynamics 365 BC API published, or NetSuite RESTlets deployed
- Client has identified and can provide: (a) 20+ existing product specification templates/examples, (b) 10+ existing QC procedures/SOPs, (c) 5+ recent RFQ examples, (d) approved supplier list with contact information
- Domain admin or Global Admin credentials for Microsoft 365 tenant for app registrations and Power Automate setup
- Network allows outbound HTTPS (port 443) to: *.openai.azure.com, *.pinecone.io, login.microsoftonline.com, graph.microsoft.com
- Python 3.10+ installed on the MSP development workstation with pip and virtualenv
- Git installed on the MSP development workstation for version control of prompt templates and pipeline code
- Client has designated: (a) a Project Champion (typically Director of Engineering or Quality Manager), (b) 2–3 subject matter experts for template validation, (c) IT contact for ERP API credentials and network access
- If on-premise deployment (ITAR/CMMC): server room with adequate power (standard 120V/15A circuit sufficient for L4 GPU at 72W TDP), rack or tower space, and Ethernet connectivity to internal network
- SharePoint document library structure planned: at minimum, libraries for 'Product Specifications', 'QC Procedures', 'Supplier RFQs', and 'AI Templates'
- Client's existing document control numbering scheme documented (e.g., SPEC-XXXX-Rev.X, QCP-XXXX-Rev.X, RFQ-XXXX) for integration into AI-generated documents
Installation Steps
...
Step 1: Provision Azure OpenAI Service
Create the Azure OpenAI resource that will serve as the core LLM engine. Deploy two model instances: GPT-5.4 for complex specifications and GPT-5.4 mini for high-volume routine documents. Configure content filtering policies appropriate for manufacturing content.
az login
az account set --subscription "<CLIENT_SUBSCRIPTION_ID>"
az group create --name rg-mfg-ai-content --location eastus2
az cognitiveservices account create --name oai-mfg-content-prod --resource-group rg-mfg-ai-content --kind OpenAI --sku S0 --location eastus2 --yes
az cognitiveservices account deployment create --name oai-mfg-content-prod --resource-group rg-mfg-ai-content --deployment-name gpt-5.4-mfg --model-name gpt-5.4 --model-version 2024-11-20 --model-format OpenAI --sku-capacity 30 --sku-name GlobalStandard
az cognitiveservices account deployment create --name oai-mfg-content-prod --resource-group rg-mfg-ai-content --deployment-name gpt-5.4-mini-mfg --model-name gpt-5.4-mini --model-version 2024-07-18 --model-format OpenAI --sku-capacity 60 --sku-name GlobalStandard
az cognitiveservices account deployment create --name oai-mfg-content-prod --resource-group rg-mfg-ai-content --deployment-name text-embedding-3-large --model-name text-embedding-3-large --model-version 1 --model-format OpenAI --sku-capacity 50 --sku-name Standard
az cognitiveservices account keys list --name oai-mfg-content-prod --resource-group rg-mfg-ai-contentChoose the Azure region closest to the client's operations. For ITAR clients, use Azure Government (usgovvirginia or usgovarizona) and the Azure Government CLI endpoint. The capacity units (30 for GPT-5.4, 60 for GPT-5.4 mini) represent thousands of tokens per minute — adjust based on expected volume. Store the API key securely in Azure Key Vault, never in code.
Step 2: Configure Azure Key Vault for Secrets Management
Set up Azure Key Vault to securely store all API keys, connection strings, and credentials used by the AI pipeline. This is critical for compliance and security.
az keyvault create --name kv-mfg-ai-content --resource-group rg-mfg-ai-content --location eastus2 --sku standard
AOAI_KEY=$(az cognitiveservices account keys list --name oai-mfg-content-prod --resource-group rg-mfg-ai-content --query key1 -o tsv)
az keyvault secret set --vault-name kv-mfg-ai-content --name azure-openai-key --value "$AOAI_KEY"
az keyvault secret set --vault-name kv-mfg-ai-content --name azure-openai-endpoint --value "https://oai-mfg-content-prod.openai.azure.com/"
az keyvault secret set --vault-name kv-mfg-ai-content --name pinecone-api-key --value "<PINECONE_API_KEY>"Grant access policies using Entra ID managed identities where possible rather than storing keys in application configuration. For Power Automate flows, use the Azure Key Vault connector to retrieve secrets at runtime.
Step 3: Set Up Pinecone Vector Database for RAG
Create a Pinecone index to store document embeddings from the manufacturer's existing specs, QC procedures, standards, and supplier data. This enables the RAG pipeline to retrieve relevant context before generating new documents.
pip install pinecone-client
python3 -c "
import pinecone
from pinecone import Pinecone, ServerlessSpec
pc = Pinecone(api_key='<PINECONE_API_KEY>')
pc.create_index(
name='mfg-knowledge-base',
dimension=3072, # text-embedding-3-large dimension
metric='cosine',
spec=ServerlessSpec(
cloud='aws',
region='us-east-1'
)
)
print('Index created successfully')
print(pc.describe_index('mfg-knowledge-base'))
"Dimension 3072 matches Azure OpenAI's text-embedding-3-large model. If using text-embedding-3-small (cheaper, slightly less accurate), change dimension to 1536. The Starter tier (free, 2GB) is sufficient for POC with up to ~10,000 document chunks. Upgrade to Standard ($50+/month) for production with larger document corpora. Alternative: use ChromaDB self-hosted (free) if client prefers no external SaaS for vector storage.
Step 4: Set Up Development Environment and RAG Pipeline Repository
Initialize the Python project that houses the RAG pipeline, document processors, prompt templates, and API integration code. This codebase will be deployed as an Azure Function App or containerized service.
mkdir mfg-ai-content-gen && cd mfg-ai-content-gen
python3 -m venv .venv && source .venv/bin/activate
pip install langchain langchain-openai langchain-community pinecone-client python-docx openpyxl fastapi uvicorn pydantic azure-identity azure-keyvault-secrets tiktoken unstructured pdf2image pytesseract
pip freeze > requirements.txt
mkdir -p src/{ingestion,generation,templates,api} tests/ docs/ prompts/
touch src/__init__.py src/ingestion/__init__.py src/generation/__init__.py src/templates/__init__.py src/api/__init__.py
git init && echo '.venv/\n__pycache__/\n.env\n*.pyc' > .gitignore && git add -A && git commit -m 'Initial project structure'Use Python 3.11 for best compatibility with LangChain and Azure SDKs. The 'unstructured' library handles parsing of PDF, DOCX, and other document formats for ingestion. pytesseract is needed for OCR of scanned documents. Ensure Tesseract OCR is installed on the system: 'apt-get install tesseract-ocr' on Ubuntu or 'brew install tesseract' on macOS.
Step 5: Build Document Ingestion Pipeline
Create the pipeline that processes the manufacturer's existing documents (specs, QC procedures, standards, supplier data), chunks them appropriately, generates embeddings via Azure OpenAI, and upserts them into Pinecone. This forms the knowledge base that grounds all AI-generated content. ``` cat > src/ingestion/document_processor.py << 'PYEOF' import os from typing import List from langchain_openai import AzureOpenAIEmbeddings from langchain.text_splitter import RecursiveCharacterTextSplitter ...
Step 6: Create Prompt Template Library
Build the structured prompt templates for each document type. These templates encode the manufacturer's specific formatting requirements, terminology, section structures, and compliance language. Templates are versioned in Git and parameterized with Jinja2-style variables.
cat > prompts/product_specification.json << 'JSONEOF'
{
"template_id": "PROD_SPEC_V1",
"template_version": "1.0",
"document_type": "product_specification",
"model": "gpt-5.4",
"max_tokens": 4000,
"temperature": 0.2,
"system_prompt": "You are a senior manufacturing engineer creating formal product specifications for {{company_name}}. You write precise, unambiguous technical documentation that conforms to the company's document control standards. All specifications must be complete, measurable, and testable. Use SI units with imperial equivalents in parentheses where applicable. Reference industry standards (ASTM, ISO, MIL-STD, SAE) when relevant. Never fabricate test results or certifications.",
"user_prompt_template": "Generate a complete Product Specification document with the following structure:\n\n## Document Header\n- Document Number: {{doc_number}}\n- Revision: {{revision}}\n- Date: {{date}}\n- Product Name: {{product_name}}\n- Part Number: {{part_number}}\n\n## Sections Required:\n1. **Scope and Purpose** — Define what this specification covers\n2. **Applicable Documents and Standards** — List referenced standards and specs\n3. **Requirements**\n 3.1 Material Requirements (reference BOM data below)\n 3.2 Dimensional Requirements (include tolerances)\n 3.3 Performance Requirements\n 3.4 Environmental Requirements (operating temp, humidity, etc.)\n 3.5 Reliability Requirements\n4. **Quality Assurance Provisions**\n 4.1 Inspection Requirements\n 4.2 Test Methods\n 4.3 Acceptance Criteria\n5. **Packaging and Marking**\n6. **Revision History**\n\n## Input Data:\n- Product Description: {{product_description}}\n- BOM/Material Data: {{bom_data}}\n- Key Performance Parameters: {{performance_params}}\n- Target Application: {{application}}\n- Regulatory Requirements: {{regulatory_reqs}}\n\n## Reference Context (from existing company specifications):\n{{rag_context}}\n\nGenerate the complete specification following the section structure above. Be specific with numerical values, tolerances, and test methods. Where exact values are not provided in the input data, provide realistic placeholder values clearly marked with [TBD - VERIFY] tags."
}
JSONEOF
cat > prompts/qc_procedure.json << 'JSONEOF'
{
"template_id": "QC_PROC_V1",
"template_version": "1.0",
"document_type": "qc_procedure",
"model": "gpt-5.4",
"max_tokens": 5000,
"temperature": 0.15,
"system_prompt": "You are a Quality Assurance Manager creating formal quality control procedures and Standard Operating Procedures (SOPs) for {{company_name}}, a manufacturing facility certified to {{certifications}}. All procedures must follow the company's QMS document format, include clear step-by-step instructions that a trained operator can follow, specify required equipment and calibration requirements, define acceptance criteria with measurable values, and include proper safety warnings. Reference applicable standards and regulations. Never skip safety-critical steps.",
"user_prompt_template": "Generate a complete Quality Control Procedure / SOP with the following structure:\n\n## Document Header\n- Document Number: {{doc_number}}\n- Revision: {{revision}}\n- Effective Date: {{date}}\n- Procedure Title: {{procedure_title}}\n- Department: {{department}}\n- Process Area: {{process_area}}\n\n## Sections Required:\n1. **Purpose** — Why this procedure exists\n2. **Scope** — What processes/products it covers\n3. **References** — Standards, regulations, related SOPs\n4. **Definitions** — Technical terms used\n5. **Responsibilities** — Who does what (roles, not names)\n6. **Equipment and Materials Required** — Include calibration requirements\n7. **Safety Requirements** — PPE, hazards, emergency procedures\n8. **Procedure Steps** — Numbered, detailed, with decision points and acceptance criteria\n - Each step: Action, parameters, acceptance criteria, what to do if out-of-spec\n9. **Recording and Documentation** — What forms to fill, what data to record\n10. **Non-Conformance Handling** — Escalation path for failures\n11. **Revision History**\n\n## Input Data:\n- Process Description: {{process_description}}\n- Product/Part Affected: {{product_info}}\n- Critical Quality Parameters: {{quality_params}}\n- Equipment Available: {{equipment_list}}\n- Applicable Standards: {{standards}}\n- Known Failure Modes: {{failure_modes}}\n\n## Reference Context (from existing company procedures):\n{{rag_context}}\n\nGenerate the complete procedure. Every step must be actionable and measurable. Mark any values that need client verification with [TBD - VERIFY]."
}
JSONEOF
cat > prompts/supplier_rfq.json << 'JSONEOF'
{
"template_id": "SUPPLIER_RFQ_V1",
"template_version": "1.0",
"document_type": "supplier_rfq",
"model": "gpt-5.4-mini",
"max_tokens": 3000,
"temperature": 0.25,
"system_prompt": "You are a Procurement Specialist at {{company_name}} creating formal Requests for Quotation to send to suppliers. RFQs must be professional, comprehensive, and unambiguous. Include all information a supplier needs to provide an accurate quote: exact specifications, quantities, delivery requirements, quality requirements, and commercial terms. Reference specific part numbers, material specs, and standards. The tone should be professional and direct.",
"user_prompt_template": "Generate a complete Supplier Request for Quotation (RFQ) with the following structure:\n\n## RFQ Header\n- RFQ Number: {{rfq_number}}\n- Date Issued: {{date}}\n- Response Deadline: {{deadline}}\n- Buyer Contact: {{buyer_name}}, {{buyer_email}}, {{buyer_phone}}\n- Company: {{company_name}}\n\n## Sections Required:\n1. **Introduction** — Brief company intro and purpose of RFQ\n2. **Items Requested** — Table format with:\n - Line Item #, Part Number, Description, Specification Reference, Material, Quantity, Unit of Measure\n3. **Technical Requirements**\n - Material specifications and certifications required\n - Dimensional tolerances\n - Surface finish / treatment requirements\n - Testing and inspection requirements\n - Applicable standards\n4. **Quality Requirements**\n - QMS certification required (ISO 9001, AS9100, etc.)\n - Certificate of Conformance requirements\n - First Article Inspection requirements\n - Material traceability requirements\n5. **Commercial Terms**\n - Requested delivery date / lead time\n - Shipping terms (FOB point)\n - Payment terms\n - Pricing validity period\n - Minimum order quantities\n6. **Quotation Response Format** — What info supplier must include\n7. **Terms and Conditions** — Standard T&Cs reference\n\n## Input Data:\n- Items to Quote: {{items_data}}\n- Quantities Needed: {{quantities}}\n- Required Delivery Date: {{delivery_date}}\n- Special Requirements: {{special_requirements}}\n- Approved Suppliers (if sending to specific): {{supplier_info}}\n\n## Reference Context (from existing company RFQs and specs):\n{{rag_context}}\n\nGenerate the complete RFQ document. Use the company's standard formatting where available from the reference context."
}
JSONEOF
git add prompts/ && git commit -m 'Add manufacturing prompt templates v1.0'Temperature is set low (0.15–0.25) for manufacturing documents where precision and consistency matter more than creativity. The [TBD - VERIFY] tags are critical — they flag AI-generated values that require human engineering review. Always use GPT-5.4 for specs and QC procedures (higher accuracy for technical content) and GPT-5.4 mini for RFQs (simpler content, higher volume). Customize these templates extensively with the client during Phase 1 — the quality of the output depends heavily on template quality.
Step 7: Build the Content Generation Engine
Create the core Python module that orchestrates RAG retrieval and LLM generation for each document type. This engine loads the appropriate prompt template, queries Pinecone for relevant context, constructs the full prompt, calls Azure OpenAI, and returns the generated document. ``` cat > src/generation/content_engine.py << 'PYEOF' import json import os from typing import Optional, Dict, Any from langchain_openai import AzureOpenAIEmbeddings, AzureChatOpenAI from pinecone import Pinecone class...
Step 8: Build the REST API Service
Create a FastAPI service that exposes the content generation engine as REST endpoints. This API will be called by Power Automate flows, Copilot Studio agents, and any custom web frontend. Includes authentication, rate limiting, and audit logging. ``` cat > src/api/main.py << 'PYEOF' from fastapi import FastAPI, HTTPException, Depends, Header from fastapi.middleware.cors import CORSMiddleware from pydantic import BaseModel, Field from typing import Dict, Any, Optional import os import json impor...
Step 9: Deploy API to Azure Container Apps
Deploy the containerized API to Azure Container Apps for production use. This provides auto-scaling, HTTPS, and integration with Azure Monitor for logging and alerts. ``` az acr create --resource-group rg-mfg-ai-content --name acrmfgaicontent --sku Basic az acr login --name acrmfgaicontent docker tag mfg-ai-content-api:1.0 acrmfgaicontent.azurecr.io/mfg-ai-content-api:1.0 docker push acrmfgaicontent.azurecr.io/mfg-ai-content-api:1.0 az containerapp env create --name cae-mfg-ai --resource-group ...
Step 10: Configure SharePoint Document Libraries
Set up the SharePoint Online document libraries that serve as the document management system for AI-generated content. Configure metadata columns, content types, and folder structure to support document control workflows. ``` # PowerShell commands using PnP PowerShell module Install-Module PnP.PowerShell -Scope CurrentUser -Force Connect-PnPOnline -Url https://<TENANT>.sharepoint.com/sites/manufacturing -Interactive # Create document libraries New-PnPList -Title 'AI Generated Specs' -Template D...
Step 11: Build Power Automate Workflows
Create three Power Automate flows that orchestrate the end-to-end document generation process: (1) Product Spec Generator triggered from a SharePoint form or Teams request, (2) QC Procedure Generator, and (3) Supplier RFQ Generator with email distribution. Each flow calls the AI API, saves the result to SharePoint, and routes for approval.
# HTTP POST body for Power Automate HTTP action. Method: POST, URI:
# https://ca-mfg-ai-api.<REGION>.azurecontainerapps.io/api/v1/generate,
# Headers: { 'Content-Type': 'application/json', 'X-Api-Key':
# '<MFG_API_KEY>' }. Triggered when a new item is created in a SharePoint
# 'Spec Requests' list. Save full flow definition as product-spec-flow.json
# and import via Power Automate UI.
{
"document_type": "product_specification",
"variables": {
"company_name": "<CLIENT_NAME>",
"doc_number": "triggerOutputs()?['body/DocNumber']",
"revision": "A",
"date": "utcNow('yyyy-MM-dd')",
"product_name": "triggerOutputs()?['body/ProductName']",
"part_number": "triggerOutputs()?['body/PartNumber']",
"product_description": "triggerOutputs()?['body/Description']",
"bom_data": "triggerOutputs()?['body/BOMData']",
"performance_params": "triggerOutputs()?['body/PerformanceParams']",
"application": "triggerOutputs()?['body/Application']",
"regulatory_reqs": "triggerOutputs()?['body/RegulatoryReqs']"
},
"requested_by": "triggerOutputs()?['body/Author/Email']"
}Build the flows in Power Automate's maker portal (https://make.powerautomate.com). The flows require Power Automate Premium licenses for the HTTP connector (used to call the custom AI API). Create a 'Spec Requests' SharePoint list as the intake form with columns matching the template variables. For the RFQ flow, add an additional step using the Outlook connector to email the generated RFQ to selected suppliers from the approved supplier list. Consider building a Power Apps canvas app as a user-friendly intake form instead of raw SharePoint list forms.
Step 12: Build ERP Integration for BOM Data Retrieval
Create an integration module that pulls Bill of Materials (BOM) data, part master information, and supplier data from the client's ERP system to auto-populate AI generation requests. This eliminates manual data entry and ensures accuracy.
cat > src/integration/erp_connector.py << 'PYEOF'
import requests
from typing import Dict, Any, Optional
from abc import ABC, abstractmethod
class ERPConnector(ABC):
@abstractmethod
def get_part_info(self, part_number: str) -> Dict[str, Any]:
pass
@abstractmethod
def get_bom(self, part_number: str) -> Dict[str, Any]:
pass
@abstractmethod
def get_approved_suppliers(self, part_number: str) -> list:
pass
class EpicorKineticConnector(ERPConnector):
"""Connector for Epicor Kinetic ERP REST API v2."""
def __init__(self, base_url: str, api_key: str, company: str):
self.base_url = base_url.rstrip('/')
self.headers = {
'Authorization': f'Bearer {api_key}',
'X-API-Key': api_key,
'Content-Type': 'application/json',
'Company': company
}
def get_part_info(self, part_number: str) -> Dict[str, Any]:
url = f'{self.base_url}/api/v2/odata/Erp.BO.PartSvc/Parts'
params = {'$filter': f"PartNum eq '{part_number}'",
'$select': 'PartNum,PartDescription,ClassID,TypeCode,UOMClassID,NetWeight,NetWeightUOM'}
resp = requests.get(url, headers=self.headers, params=params)
resp.raise_for_status()
data = resp.json()
return data.get('value', [{}])[0] if data.get('value') else {}
def get_bom(self, part_number: str) -> Dict[str, Any]:
url = f'{self.base_url}/api/v2/odata/Erp.BO.BillOfMaterialSvc/BillOfMaterials'
params = {'$filter': f"PartNum eq '{part_number}'",
'$expand': 'BOMDetails'}
resp = requests.get(url, headers=self.headers, params=params)
resp.raise_for_status()
return resp.json()
def get_approved_suppliers(self, part_number: str) -> list:
url = f'{self.base_url}/api/v2/odata/Erp.BO.AprvVendSvc/AprvVends'
params = {'$filter': f"PartNum eq '{part_number}'"}
resp = requests.get(url, headers=self.headers, params=params)
resp.raise_for_status()
return resp.json().get('value', [])
class AcumaticaConnector(ERPConnector):
"""Connector for Acumatica Cloud ERP REST API."""
def __init__(self, base_url: str, username: str, password: str, company: str, branch: str):
self.base_url = base_url.rstrip('/')
self.session = requests.Session()
# Authenticate
login_url = f'{self.base_url}/entity/auth/login'
self.session.post(login_url, json={
'name': username, 'password': password,
'company': company, 'branch': branch
})
def get_part_info(self, part_number: str) -> Dict[str, Any]:
url = f'{self.base_url}/entity/Default/24.200.001/StockItem/{part_number}'
resp = self.session.get(url)
resp.raise_for_status()
return resp.json()
def get_bom(self, part_number: str) -> Dict[str, Any]:
url = f'{self.base_url}/entity/Manufacturing/24.200.001/BillOfMaterial'
params = {'$filter': f"InventoryID eq '{part_number}'"}
resp = self.session.get(url, params=params)
resp.raise_for_status()
return resp.json()
def get_approved_suppliers(self, part_number: str) -> list:
url = f'{self.base_url}/entity/Default/24.200.001/StockItem/{part_number}'
params = {'$expand': 'VendorDetails'}
resp = self.session.get(url, params=params)
resp.raise_for_status()
data = resp.json()
return data.get('VendorDetails', [])
class DynamicsBCConnector(ERPConnector):
"""Connector for Dynamics 365 Business Central API."""
def __init__(self, tenant_id: str, environment: str, company_id: str, access_token: str):
self.base_url = f'https://api.businesscentral.dynamics.com/v2.0/{tenant_id}/{environment}/api/v2.0/companies({company_id})'
self.headers = {
'Authorization': f'Bearer {access_token}',
'Content-Type': 'application/json'
}
def get_part_info(self, part_number: str) -> Dict[str, Any]:
url = f'{self.base_url}/items'
params = {'$filter': f"number eq '{part_number}'"}
resp = requests.get(url, headers=self.headers, params=params)
resp.raise_for_status()
data = resp.json()
return data.get('value', [{}])[0] if data.get('value') else {}
def get_bom(self, part_number: str) -> Dict[str, Any]:
url = f'{self.base_url}/productionBOMs'
params = {'$filter': f"number eq '{part_number}'"}
resp = requests.get(url, headers=self.headers, params=params)
resp.raise_for_status()
return resp.json()
def get_approved_suppliers(self, part_number: str) -> list:
url = f'{self.base_url}/vendors'
resp = requests.get(url, headers=self.headers)
resp.raise_for_status()
return resp.json().get('value', [])
PYEOFChoose the connector matching the client's ERP. Epicor Kinetic is most common in discrete manufacturing SMBs. The API endpoints and field names may vary by ERP version — verify against the client's specific version documentation. For Epicor, ensure REST API services are enabled in System Setup > Security > API Key Management. For Acumatica, ensure the Manufacturing Edition is licensed for BOM access. For Business Central, use OAuth 2.0 with an Azure AD app registration for the access token.
Step 13: Configure DOCX Output Generation
Build the module that converts AI-generated Markdown content into formatted Word documents (.docx) using the client's branded templates. This ensures generated documents match the client's existing document control format. ``` cat > src/generation/docx_builder.py << 'PYEOF' from docx import Document from docx.shared import Inches, Pt, RGBColor from docx.enum.text import WD_ALIGN_PARAGRAPH from typing import Dict, Any import re from datetime import datetime class ManufacturingDocxBuilder: ...
Step 14: Build Copilot Studio Manufacturing Agents
Create custom Copilot Studio agents that manufacturing staff can interact with through Microsoft Teams to generate documents conversationally. Build three agents: Spec Generator, QC Procedure Writer, and RFQ Builder.
Copilot Studio requires the tenant-wide Copilot Studio license ($200/month per 25K credit pack). Each agent interaction consumes credits based on complexity — a typical document generation conversation uses approximately 5–15 credits. Monitor credit consumption in the first month and adjust the credit pack size accordingly. The conversational interface is especially valuable for the QC Procedure agent, where quality managers can iteratively refine procedures through follow-up questions.
Step 15: Run Document Ingestion for Client Knowledge Base
Execute the initial bulk ingestion of the client's existing documents into the Pinecone vector database. This is the critical step that makes the RAG pipeline effective — the quality and breadth of ingested documents directly determines output quality.
cd mfg-ai-content-gen && source .venv/bin/activatecat > .env << 'ENVEOF'
AZURE_OPENAI_ENDPOINT=https://oai-mfg-content-prod.openai.azure.com/
AZURE_OPENAI_KEY=<YOUR_KEY>
PINECONE_API_KEY=<YOUR_KEY>
MFG_API_KEY=<YOUR_KEY>
ENVEOFpython3 -c "
import os
from dotenv import load_dotenv
load_dotenv()
from src.ingestion.document_processor import ManufacturingDocumentProcessor
processor = ManufacturingDocumentProcessor(
azure_endpoint=os.getenv('AZURE_OPENAI_ENDPOINT'),
azure_api_key=os.getenv('AZURE_OPENAI_KEY'),
pinecone_api_key=os.getenv('PINECONE_API_KEY')
)
# Ingest each document category
for category in ['specs', 'qc-procedures', 'rfqs', 'standards', 'materials']:
path = f'./staging/{category}'
if os.path.exists(path):
print(f'Processing {category}...')
stats = processor.ingest_directory(path, namespace='default')
print(f' Processed: {stats["processed"]} files, {stats["chunks"]} chunks')
if stats['errors']:
print(f' Errors: {len(stats["errors"])}')
for err in stats['errors']:
print(f' - {err["file"]}: {err["error"]}')
"Staging directory must be populated with client documents before running this step. Work with the client's engineering and quality teams to gather: (1) 20+ product specifications across different product lines, (2) all current QC SOPs and inspection procedures, (3) recent RFQ examples and supplier correspondence, (4) material specifications and datasheets, (5) relevant industry standards (ISO, ASTM, etc.). Expect 2–4 hours for 500 documents. Monitor Pinecone dashboard for index size and vector count. Re-run ingestion whenever the client creates significant new documentation outside the AI system.
Step 16: Configure Monitoring and Alerting
Set up Azure Monitor alerts, application logging, and a dashboard to track AI system health, usage metrics, cost, and document quality indicators.
az monitor diagnostic-settings create --resource /subscriptions/<SUB_ID>/resourceGroups/rg-mfg-ai-content/providers/Microsoft.App/containerApps/ca-mfg-ai-api --name mfg-ai-diagnostics --workspace /subscriptions/<SUB_ID>/resourceGroups/rg-mfg-ai-content/providers/Microsoft.OperationalInsights/workspaces/<WORKSPACE_NAME> --logs '[{"category":"ContainerAppConsoleLogs","enabled":true},{"category":"ContainerAppSystemLogs","enabled":true}]'az monitor metrics alert create --name 'AI-API-Error-Rate' --resource-group rg-mfg-ai-content --scopes /subscriptions/<SUB_ID>/resourceGroups/rg-mfg-ai-content/providers/Microsoft.App/containerApps/ca-mfg-ai-api --condition 'count requests where resultCode >= 500 > 5' --window-size 15m --evaluation-frequency 5m --action /subscriptions/<SUB_ID>/resourceGroups/rg-mfg-ai-content/providers/Microsoft.Insights/actionGroups/<ACTION_GROUP>az consumption budget create --budget-name 'AI-Content-Monthly' --resource-group rg-mfg-ai-content --amount 500 --time-grain Monthly --start-date 2025-01-01 --end-date 2026-12-31 --notification-key 80pct --notification-enabled true --notification-operator GreaterThanOrEqualTo --notification-threshold 80 --notification-contact-emails msp-alerts@yourmsp.comKey metrics to monitor: (1) API response time (p95 should be <30 seconds), (2) Error rate (<1%), (3) Azure OpenAI token consumption (for cost management), (4) Pinecone query latency (<200ms), (5) Document generation count per day/week (for usage trending), (6) Average TBD count per document (quality indicator — should decrease over time as knowledge base improves). Set the monthly Azure OpenAI budget alert at 80% of the estimated budget to prevent cost overruns.
Custom AI Components
Product Specification Generator
Type: agent A Copilot Studio agent accessible through Microsoft Teams that guides manufacturing engineers through a conversational flow to generate complete product specifications. It retrieves BOM data from the ERP, pulls relevant context from the RAG knowledge base, and generates a formatted DOCX specification document with all required sections (Scope, Standards, Requirements, QA Provisions, Packaging). The output includes [TBD - VERIFY] flags for values that require engineering validati...
QC Procedure Generator
Type: agent A Copilot Studio agent for Quality Managers that generates ISO 9001-compliant quality control procedures and SOPs. It asks targeted questions about the manufacturing process, equipment, critical parameters, and known failure modes, then generates a comprehensive procedure document with step-by-step instructions, acceptance criteria, non-conformance handling, and safety requirements. Implementation: ``` # Copilot Studio Agent: QC Procedure Generator ## Agent Configuration ...
Supplier RFQ Builder
Type: workflow A Power Automate workflow that generates supplier RFQs from procurement requests, auto-populates technical requirements from the product specification knowledge base, and optionally emails the finalized RFQ directly to selected suppliers from the approved vendor list. Implementation: ``` # Power Automate Workflow: Supplier RFQ Builder ## Workflow Overview Trigger: New item in SharePoint 'RFQ Requests' list Output: Formatted RFQ document in SharePoint + optional email t...
Manufacturing RAG Context Retriever
Type: skill A reusable skill that queries the Pinecone vector database with intelligent context retrieval strategies specific to manufacturing documents. It handles multi-document-type retrieval (pulling from specs AND standards when generating a spec), relevance scoring, and source attribution for audit trail compliance.
Implementation:
# Manufacturing RAG Context Retriever Skill
# File: src/generation/rag_retriever.py
from typing import List, Dict, Any, Optional, Tuple
from langchain_openai import AzureOpenAIEmbeddings
from pinecone import Pinecone
import logging
logger = logging.getLogger('mfg-rag')
class ManufacturingRAGRetriever:
"""
Intelligent RAG retriever for manufacturing documents.
Implements multi-strategy retrieval based on document type.
"""
# Define which source document types are relevant for each generation type
RETRIEVAL_STRATEGIES = {
'product_specification': {
'primary_types': ['product_specification'],
'secondary_types': ['industry_standard', 'material_data'],
'primary_top_k': 5,
'secondary_top_k': 3,
'min_relevance': 0.72
},
'qc_procedure': {
'primary_types': ['qc_procedure'],
'secondary_types': ['industry_standard', 'product_specification'],
'primary_top_k': 5,
'secondary_top_k': 3,
'min_relevance': 0.70
},
'supplier_rfq': {
'primary_types': ['supplier_rfq', 'product_specification'],
'secondary_types': ['material_data'],
'primary_top_k': 4,
'secondary_top_k': 2,
'min_relevance': 0.68
}
}
def __init__(self, azure_endpoint: str, azure_api_key: str,
pinecone_api_key: str, index_name: str = 'mfg-knowledge-base'):
self.embeddings = AzureOpenAIEmbeddings(
azure_deployment='text-embedding-3-large',
azure_endpoint=azure_endpoint,
api_key=azure_api_key,
api_version='2024-06-01'
)
self.pc = Pinecone(api_key=pinecone_api_key)
self.index = self.pc.Index(index_name)
def retrieve(self, query: str, target_doc_type: str,
namespace: str = 'default') -> Tuple[str, List[Dict[str, Any]]]:
"""
Retrieve relevant context using multi-strategy approach.
Returns (formatted_context_string, source_attribution_list)
"""
strategy = self.RETRIEVAL_STRATEGIES.get(target_doc_type, {
'primary_types': [target_doc_type],
'secondary_types': ['general_manufacturing'],
'primary_top_k': 5,
'secondary_top_k': 2,
'min_relevance': 0.70
})
query_embedding = self.embeddings.embed_query(query)
all_chunks = []
sources = []
# Primary retrieval
for doc_type in strategy['primary_types']:
results = self.index.query(
vector=query_embedding,
top_k=strategy['primary_top_k'],
namespace=namespace,
include_metadata=True,
filter={'doc_type': {'$eq': doc_type}}
)
for match in results.get('matches', []):
if match.get('score', 0) >= strategy['min_relevance']:
meta = match.get('metadata', {})
all_chunks.append({
'text': meta.get('text', ''),
'source': meta.get('source_file', 'Unknown'),
'doc_type': meta.get('doc_type', 'unknown'),
'score': match.get('score', 0),
'priority': 'primary'
})
# Secondary retrieval
for doc_type in strategy['secondary_types']:
results = self.index.query(
vector=query_embedding,
top_k=strategy['secondary_top_k'],
namespace=namespace,
include_metadata=True,
filter={'doc_type': {'$eq': doc_type}}
)
for match in results.get('matches', []):
if match.get('score', 0) >= strategy['min_relevance']:
meta = match.get('metadata', {})
all_chunks.append({
'text': meta.get('text', ''),
'source': meta.get('source_file', 'Unknown'),
'doc_type': meta.get('doc_type', 'unknown'),
'score': match.get('score', 0),
'priority': 'secondary'
})
# Sort by priority then score
all_chunks.sort(key=lambda x: (0 if x['priority'] == 'primary' else 1, -x['score']))
# Deduplicate by source file
seen_sources = set()
unique_chunks = []
for chunk in all_chunks:
source_key = f"{chunk['source']}_{chunk['text'][:100]}"
if source_key not in seen_sources:
seen_sources.add(source_key)
unique_chunks.append(chunk)
# Build formatted context
context_parts = []
for chunk in unique_chunks:
context_parts.append(
f"[Source: {chunk['source']} | Type: {chunk['doc_type']} | "
f"Relevance: {chunk['score']:.2f} | Priority: {chunk['priority']}]\n"
f"{chunk['text']}"
)
sources.append({
'source_file': chunk['source'],
'doc_type': chunk['doc_type'],
'relevance_score': round(chunk['score'], 3),
'priority': chunk['priority']
})
context_string = '\n\n---\n\n'.join(context_parts) if context_parts else \
'No matching reference documents found. Generate based on general manufacturing best practices.'
logger.info(f'RAG retrieval for {target_doc_type}: {len(unique_chunks)} chunks from {len(set(c["source"] for c in unique_chunks))} sources')
return context_string, sourcesDocument Audit Logger
Type: integration An audit logging integration that records every AI document generation event with full traceability for ISO 9001, AS9100, and CMMC compliance. Logs to both Azure Table Storage (cheap, queryable) and the SharePoint audit library for QMS integration. Implementation: ``` # Document Audit Logger Integration # File: src/integration/audit_logger.py import os import json import logging from datetime import datetime, timezone from typing import Dict, Any, Optional from azur...
Manufacturing Terminology Validator
Type: prompt A specialized prompt component that post-processes AI-generated documents to validate manufacturing terminology, unit consistency, tolerance format compliance, and standards reference accuracy. Runs as a quality gate before documents are saved to SharePoint. Implementation: ``` # Manufacturing Terminology Validator # File: src/generation/validator.py from typing import Dict, Any, List, Tuple from langchain_openai import AzureChatOpenAI from langchain.schema import System...
Testing & Validation
- HEALTH CHECK: Call GET https://ca-mfg-ai-api.<region>.azurecontainerapps.io/api/v1/health and verify response returns {"status": "healthy"} with HTTP 200 - TEMPLATE LISTING: Call GET /api/v1/templates with valid API key and verify all three templates are returned: product_specification, qc_procedure, supplier_rfq - PRODUCT SPEC GENERATION: Call POST /api/v1/generate with document_type='product_specification' and a test part number. Verify: (a) response contains all required sections (Scope, St...
Client Handoff
Client Handoff Checklist
Training Sessions (Schedule 3 sessions, 90 minutes each)
Session 1: Engineering Team — Product Specification Generation
- How to request a new specification via Teams (Copilot Studio agent) or SharePoint form
- Understanding the conversation flow: what information to provide for best results
- How to review [TBD - VERIFY] items and fill in actual values
- How to iterate on a generated draft (regenerate with modifications)
- Best practices: providing detailed input yields better output
- Hands-on: Each engineer generates a spec for a real product
Session 2: Quality Team — QC Procedure Generation
- How to use the QC Procedure Writer agent in Teams
- Importance of describing known failure modes and equipment for accurate output
- Review workflow: how to submit for QMS approval
- How generated procedures integrate with existing document control system
- When to use AI vs. manual writing (complex novel processes may need human authoring)
- Hands-on: Quality managers generate a procedure for a real process
Session 3: Procurement Team — RFQ Generation
- How to submit RFQ requests via SharePoint list
- Understanding auto-population from ERP data
- Review and approval workflow for RFQs before supplier distribution
- How the system auto-emails approved RFQs to selected suppliers
- Hands-on: Generate and send a test RFQ
Documentation to Deliver
Success Criteria Review (Joint meeting with client stakeholders)
Transition to Managed Service
Maintenance
Ongoing Maintenance Plan
Weekly Tasks (30 minutes)
- Review Azure Monitor dashboard for API errors, latency spikes, or unusual usage patterns
- Check Azure OpenAI token consumption against budget
- Review any failed Power Automate flow runs and remediate
- Monitor Pinecone index health (vector count, query latency)
Monthly Tasks (2–4 hours)
- Run cost analysis: Azure OpenAI spend, Container Apps, Storage, Pinecone
- Generate and deliver monthly compliance audit report using the audit logger
- Review [TBD] count trends — if increasing, the knowledge base may need expansion
- Ingest any new documents the client has created outside the AI system into the RAG knowledge base
- Review and update prompt templates based on client feedback (common edits indicate template gaps)
- Check for Azure OpenAI model updates or deprecations — plan migration if needed (Microsoft provides 6-month deprecation notices)
- Test all three document generation workflows end-to-end
Quarterly Tasks (4–8 hours)
- Quarterly Business Review with client: usage metrics, ROI analysis, feature requests
- Prompt template optimization: analyze the 20 most-edited documents to identify patterns and improve prompts
- Knowledge base refresh: re-embed documents if embedding model is updated, add new product lines or standards
- Security review: rotate API keys, review access logs, verify Entra ID permissions
- Test disaster recovery: verify API can be redeployed from Git repository and container registry
- Review Power Automate flow performance and optimize any bottlenecks
- Assess new AI model capabilities (e.g., new GPT version) and plan upgrades
Annual Tasks
- Full system security audit including penetration testing of the API endpoint
- Comprehensive prompt template review with engineering and quality leadership
- Knowledge base cleanup: remove obsolete documents, re-classify misclassified content
- Contract and licensing review: M365 Copilot seat count, Azure commitment, Pinecone tier
- Technology roadmap planning: evaluate new capabilities (vision models for drawing analysis, fine-tuned models for specific product lines)
Model Update/Migration Protocol
When Azure OpenAI announces a new model version (e.g., GPT-5.4 → GPT-5.4 successor):
SLA Considerations
- Uptime target: 99.5% during business hours (Mon–Fri 6am–6pm client local time)
- Response time for P1 issues (system down): 1 hour
- Response time for P2 issues (degraded performance): 4 hours
- Response time for P3 issues (feature requests, minor bugs): Next business day
- Planned maintenance window: Saturday 10pm–Sunday 6am
Escalation Path
- Level 1: Client IT team checks Power Automate flows, SharePoint, Teams agent availability
- Level 2: MSP helpdesk reviews API health, Azure service status, recent deployment changes
- Level 3: MSP AI engineer investigates prompt template issues, RAG retrieval quality, ERP integration failures, model performance degradation
- Level 4: Vendor escalation to Microsoft (Azure OpenAI issues), Pinecone (vector DB issues), or ERP vendor (API changes)
Alternatives
Microsoft 365 Copilot-Only Approach (No Custom Development)
Use Microsoft 365 Copilot natively in Word and Excel without building a custom RAG pipeline or API. Users open Word, invoke Copilot, and use carefully crafted prompts with reference documents open in the same session. Templates are stored as Word documents with Copilot prompt instructions. No ERP integration — users manually input part data.
AirgapAI On-Premise Deployment (ITAR/Defense)
Replace the entire Azure OpenAI cloud stack with AirgapAI's on-premise solution, running entirely on the manufacturer's local server. AirgapAI provides 2,800+ pre-built manufacturing workflows for technical documentation and quality procedures, eliminating the need for custom prompt engineering. Runs on Intel Core Ultra processors or standard servers with NVIDIA GPUs.
Acumatica AI Studio Native Integration
For clients running Acumatica Cloud ERP, leverage Acumatica AI Studio's built-in LLM integration rather than building a separate API service. AI Studio connects natively to Azure OpenAI, AWS Bedrock, OpenAI, and Anthropic, and can access all Acumatica data directly without custom ERP connectors.
Open-Source Self-Hosted LLM (Ollama + Mistral/Llama)
Replace Azure OpenAI with self-hosted open-source models via Ollama or vLLM on the Dell PowerEdge T560 with NVIDIA L4 GPU. Use Mistral Small 3 (24B parameters) or Meta Llama 3.1 (8B/70B) for document generation. All processing stays on-premise with zero cloud API costs.
Jasper AI + Zapier Lightweight Stack
Use Jasper AI Business ($63K/year for 10 users) as the content generation platform instead of building a custom solution. Jasper provides a web UI for content creation with brand voice training, knowledge base uploads, and team collaboration. Connect to ERP and SharePoint via Zapier workflows.
When to recommend: Generally NOT recommended for manufacturing technical documents. Only consider if the client's primary need is marketing-adjacent content (product datasheets for sales, catalog descriptions) rather than engineering specifications. Output quality for product specs and QC procedures will be significantly lower than the primary approach.
Want early access to the full toolkit?