diff --git a/dev-ai-app-dev-constructioneng-aiexperience/app-architecture/app-architecture.md b/dev-ai-app-dev-constructioneng-aiexperience/app-architecture/app-architecture.md new file mode 100644 index 000000000..f3d221bc5 --- /dev/null +++ b/dev-ai-app-dev-constructioneng-aiexperience/app-architecture/app-architecture.md @@ -0,0 +1,70 @@ +# Architecture & Workshop Features + +## Introduction + +In this lab, you will explore the architecture behind the workshop and the construction procurement application it supports. You will also look more closely at the Oracle AI Database features used to build both the workshop labs and the demo app. + +Estimated Lab Time: 15 minutes + +### Objectives + +In this lab, you will: + +* Review the OCI architecture that supports the Seer Construction + procurement application +* Understand how JSON Duality Views, AI Vector Search, and Property + Graph support the procurement workflow +* Connect the workshop labs to the application design used in the demo + +## Physical Architecture + +The Seer Construction procurement application runs in an **Oracle Cloud Infrastructure (OCI)** region, with its application layer in a public subnet inside a **Virtual Cloud Network (VCN)**. + +![Physical Architecture](./images/physical-architecture.png) + +### Architecture Breakdown + +- The application-tier VCN includes: + - An Internet Gateway for outbound traffic + - A Service Gateway for access to Oracle Cloud services + - A Dynamic Routing Gateway (DRG) to connect to the Oracle Services Network + - A VM in the public subnet that runs two containers: + - The open-source Python stack for the construction procurement demo + - JupyterLab as a browser-based development environment + +- The application subnet connects to the Oracle Services Network through the Service Gateway, enabling access to: + - Autonomous AI Database Serverless + - OCI Generative AI services + +This architecture provides strong connectivity, scalability, and integration with Oracle cloud-native services to support efficient construction procurement review, supplier recommendation, and decision workflows. + +## Oracle AI Database Features Used in the Demo App and in this Workshop + +### **JSON Duality View** + +JSON Relational Duality in Oracle AI Database bridges the gap between relational and document data models. It gives developers the flexibility of JSON with the efficiency and power of relational storage, eliminating the trade-offs of choosing one model over the other. + +At the core of this capability is the JSON Relational Duality View, which lets applications read and write JSON while the data remains stored in relational tables. + +A key feature worth highlighting is the ability to connect to the database using MongoDB-style syntax. This allows developers to interact with collections and documents using a familiar API style. + +**Where is it used**: We implement JSON Duality Views in both the demo app and this workshop. Procurement dashboard data shown in the application is queried from JSON Duality Views. In Lab 3, you learn how to interact with JSON Duality Views using Oracle’s Python driver and Oracle’s Mongo API. + +### **AI Vector Search** + +Oracle AI Vector Search, a feature of Oracle AI Database, enables fast, efficient searches over AI-generated vectors stored in the database. It supports multiple indexing strategies and scales to large datasets. With it, Large Language Models (LLMs) can query private business data using natural language while returning more accurate, context-aware results. + +**Where is it used**: AI Vector Search is a key feature of the demo app and is also covered in Lab 4 and Lab 5. In Lab 4, you use AI Vector Search to implement a RAG process. In Lab 5, you focus on similarity search. + +### **Property Graph** + +Oracle AI Database supports property graphs, which model relationships using vertices and edges mapped to existing tables, external tables, materialized views, or synonyms. These graphs store metadata rather than duplicating the underlying data. You use SQL/PGQ to query and interact with them. + +Property graphs simplify connected-data analysis, such as tracing supplier recommendations, risk outcomes, project requirements, and pending procurement decisions through a graph representation. + +**Where is it used**: We implement property graphs in the workshop demo. Construction procurement officers can use them to identify near-approval suppliers, explain denial outcomes, and understand the decision context around project procurement risk. + +## Acknowledgements +* **Authors** - Linda Foinding, Francis Regalado +* **Contributors** - Eddie Ambler +* **Last Updated By/Date** - Taylor Zheng, Uma Kumar, Deion Locklear, Daniet Hart, July 2026 diff --git a/dev-ai-app-dev-constructioneng-aiexperience/app-architecture/images/logical.png b/dev-ai-app-dev-constructioneng-aiexperience/app-architecture/images/logical.png new file mode 100644 index 000000000..f2ef5e4fa Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/app-architecture/images/logical.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/app-architecture/images/physical-architecture.png b/dev-ai-app-dev-constructioneng-aiexperience/app-architecture/images/physical-architecture.png new file mode 100644 index 000000000..b4c98f90d Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/app-architecture/images/physical-architecture.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/build.md b/dev-ai-app-dev-constructioneng-aiexperience/build/build.md new file mode 100644 index 000000000..8be99a0e6 --- /dev/null +++ b/dev-ai-app-dev-constructioneng-aiexperience/build/build.md @@ -0,0 +1,905 @@ +# Step by step: Implement RAG with Oracle AI Database + +## Introduction + +In this lab, you build a construction procurement engine with Oracle AI Database and OCI Generative AI. Connect to the database, explore the sample procurement data, and invoke a large language model to generate supplier recommendations and risk explanations. Building on earlier exercises, you’ll apply Python to deliver a fully integrated, AI-powered construction procurement application. + +This lab uses some of the basic coding samples you created in lab 3, such as `cursor.execute` and more. + +Estimated Time: 30 minutes + +### Objectives + +* Build the complete construction procurement application as seen in lab 1 +* Use OCI Generative AI to generate contextual procurement recommendations +* Use Python to connect to an Oracle AI Database instance and run queries +* Explore procurement data and extract relevant information + +### Prerequisites + +This lab assumes you have: + +* An Oracle Cloud account +* Completed lab 1: Run the demo + +## Task 1: Login to JupyterLab + +1. To navigate to the development environment, click **View Login Info**. Copy the Development IDE Login Password. Click the Start Development IDE link. + + ![Open Development Environment](./images/dev-env.png =50%x*) + +2. Paste in the Development IDE Login Password that you copied in the previous step. Click **Login**. + + ![Login](./images/jupyter-login.png " ") + +3. Click the blue `+`. This will open the Launcher. + + ![Open Launcher](./images/launcher.png " ") + +## Task 2: Get familiar with the development environment + +1. Review the different elements in JupyterLab: + + **File browser (1):** The file browser organizes and manages files within the JupyterLab workspace. It supports drag-and-drop file uploads, file creation, renaming, and deletion. Users can open notebooks, terminals, and text editors directly from the browser. + + **Launcher (2 and 3):** The launcher offers a streamlined entry point for starting new activities. Users can create Jupyter Notebooks for interactive coding with live code execution, visualizations, and rich markdown. The terminal provides direct shell access for command-line work in the same environment. + + ![JupyterLab Launcher](./images/jupyter.png " ") + +## Task 3: View created tables in Jupyter Lab + +1. Navigate back to your terminal window. + + ![Open Terminal](./images/terminal.png " ") + +2. In the JupyterLab file browser, open the `dbinit` folder and + select `db_setup_CONSTENG_script_2.sql`. This is the setup script + that created the sample Construction Engineering schema for the + lab. As you review it, notice that it creates the project and + supplier tables, the `construction_projects_dv` JSON relational + duality view used to read project data as JSON, and the + `CE_PROJECT_CHUNKS` table, which later stores text chunks and + vector embeddings for the RAG flow. + + ![Tables](./images/tables.png " ") + +## Task 4: Connect to Database + +1. Click the **+** sign on the top left to open the Launcher. + + ![Open Launcher](./images/open-launcher.png " ") + +2. Open a new notebook. + + ![Open Notebook](./images/open-notebook.png " ") + +3. Copy the following code block into an empty cell in your notebook. + This code imports the required Python libraries, loads the + database connection details from the environment, connects to + Oracle AI Database, and creates a cursor that will be used to run + SQL queries in later steps. + + ```python + + import os + import json + import oracledb + import pandas as pd + import oci + import numpy as np + import re + from dotenv import load_dotenv + from PyPDF2 import PdfReader + + load_dotenv() + + username = os.getenv("USERNAME") + password = os.getenv("DBPASSWORD") + dsn = os.getenv("DBCONNECTION") + + try: + connection = oracledb.connect(user=username, password=password, dsn=dsn) + print("Connection successful!") + except Exception as e: + print(f"Connection failed: {e}") + + cursor = connection.cursor() + + ``` + +4. Run the code cell to connect to Oracle AI Database. When the + connection is successful, you should see `Connection successful!` + in the notebook output. This confirms that your notebook can + query the database in the next steps. + + ![Connect to Database](./images/lab4task1.png " ") + +## Task 5: Create a function to retrieve project data from the database + +You will query project data from the `construction_projects_dv` JSON +relational duality view. This view combines related relational tables, +including `CE_PROJECTS`, `CE_PROJECT_REQUIREMENTS`, +`CE_SUPPLIER_EVALUATION`, `CE_SUPPLIER_RECOMMENDATION`, and +`CE_SUPPLIERS`, into one JSON document per project. This is useful +because the application can retrieve a complete project profile with a +single query, while the data still remains organized in relational +tables. That project profile is then easier to review, display, and +pass into the GenAI workflow. + +In this task, you will: + +* **Define a Function**: Create a reusable `fetch_project_data` + function that queries `construction_projects_dv` by project ID. The + query uses the project `_id` field inside the JSON document to + return the matching project. +* **Use an Example**: Fetch data for project `1001`, + `Downtown Mixed-Use Tower`, to demonstrate how the function + retrieves one project profile from the database. +* **Display the Results**: Extract selected fields from the JSON + document and display them in a pandas DataFrame. The table shows + project details, sourcing requirements, risk level, recommended + supplier, supplier fit score, and evaluation status. + +1. Copy and paste the code below into the new notebook. + + ```python + + def fetch_project_data(project_id): + cursor.execute( + """ + SELECT data + FROM construction_projects_dv + WHERE JSON_VALUE(data, '$._id') = :project_id + """, + {"project_id": project_id} + ) + row = cursor.fetchone() + if not row: + return None + return json.loads(row[0]) if isinstance(row[0], str) else row[0] + + + selected_project_id = 1001 + project_json = fetch_project_data(selected_project_id) + + if project_json: + requirement = (project_json.get("requirements") or [{}])[0] + evaluation = (project_json.get("supplierEvaluations") or [{}])[0] + recommendation = evaluation.get("recommendation") or {} + supplier = recommendation.get("supplier") or {} + + print(f"Project: {project_json.get('projectName', '')}") + print( + "Status:", + evaluation.get( + "evaluationStatus", + project_json.get("evaluationStatus", "Pending Review") + ) + ) + + desired_fields = [ + ("Project ID", selected_project_id), + ("Project Name", project_json.get("projectName", "")), + ("Location", project_json.get("location", "")), + ("Project Type", project_json.get("projectType", "")), + ("Project Phase", project_json.get("projectPhase", "")), + ("Required Trade", requirement.get("tradeCategory", "")), + ("Material Need", requirement.get("materialNeed", "")), + ( + "Procurement Urgency", + requirement.get("procurementUrgency", "") + ), + ("Budget Range", requirement.get("budgetRange", "")), + ("Risk Level", requirement.get("riskLevel", "")), + ("Evaluation ID", evaluation.get("evaluationId", "")), + ("Recommended Supplier", supplier.get("supplierName", "")), + ("Supplier Fit Score", recommendation.get("fitScore", "")), + ( + "Evaluation Status", + evaluation.get( + "evaluationStatus", + project_json.get("evaluationStatus", "Pending Review") + ) + ) + ] + + df_project_details = pd.DataFrame( + {field_name: [field_value] for field_name, field_value in desired_fields} + ) + display(df_project_details) + else: + print("No data found for project ID:", selected_project_id) + + ``` + +2. Click the **Run** button to execute the cell. The notebook + retrieves project `1001`, `Downtown Mixed-Use Tower`, from the + `construction_projects_dv` view and displays selected project + details. When the query succeeds, you should see a brief project + summary followed by a table with fields such as project ID, + project name, location, project phase, required trade, urgency, + budget range, and risk level. If no data is found, confirm that + the project ID is correct and that the database setup completed + successfully. + + ![Open Terminal](./images/lab4task3.png " ") + + If you completed Lab 1: Run the Demo, this output should look + familiar. It shows the same project information that the + construction procurement officer sees when opening project `1001` + in the demo application. + +## Task 6: Create a function to generate supplier recommendations + +In a new cell, you will create and run a +`generate_supplier_recommendations` function. This function uses the +project profile from Task 5 and the staged supplier recommendation +records in the database to generate a construction-specific supplier +evaluation with OCI Generative AI. + +Here’s what the code does: + +* **Fetch Supplier Recommendation Records**: Query the supplier + recommendation data for the selected project. The query joins + `CE_SUPPLIER_EVALUATION`, `CE_SUPPLIER_RECOMMENDATION`, and + `CE_SUPPLIERS` so the prompt includes each supplier’s + recommendation, fit score, risk level, capacity status, + explanation, strengths, and missing information. +* **Build a Prompt**: Combine the selected project profile, sourcing + requirements, full project JSON, and supplier recommendation records + into a structured prompt. The prompt gives the LLM decision rules + for when to use `APPROVE`, `REQUEST INFO`, or `DENY`. +* **Use OCI Generative AI**: Send the prompt to the + `meta.llama-3.2-90b-vision-instruct` model through OCI’s + Generative AI inference client. +* **Display the Output**: Print the generated supplier evaluation + using the same sections used in the Seer Construction app: + `Project Summary`, `Key Sourcing Requirements`, + `Top 3 Supplier Recommendations`, `Risks and Missing Information`, + and `Actionable Steps`. + +At this point, the recommendation is generated as notebook output +only. In the next task, you will chunk and store this generated text +so it can be used in the RAG flow. + +1. Copy and paste the code in a new cell: + + ```python + + cursor.execute( + """ + SELECT + eval.EVALUATION_ID, + rec.RECOMMEND_ID, + rec.RECOMMENDATION, + rec.FIT_SCORE, + rec.RISK_LEVEL, + rec.EXPLANATION, + rec.STRENGTHS, + rec.MISSING_INFORMATION, + supplier.SUPPLIER_ID, + supplier.SUPPLIER_NAME, + supplier.CATEGORY, + supplier.REGION, + supplier.CAPACITY_STATUS, + supplier.CAPABILITY_SUMMARY + FROM CE_SUPPLIER_EVALUATION eval + JOIN CE_SUPPLIER_RECOMMENDATION rec + ON rec.RECOMMEND_ID = eval.RECOMMEND_ID + JOIN CE_SUPPLIERS supplier + ON supplier.SUPPLIER_ID = rec.SUPPLIER_ID + WHERE eval.PROJECT_ID = :project_id + ORDER BY rec.FIT_SCORE DESC, eval.EVALUATION_ID + """, + {"project_id": selected_project_id} + ) + df_supplier_recommendations = pd.DataFrame( + cursor.fetchall(), + columns=[ + "EVALUATION_ID", + "RECOMMEND_ID", + "RECOMMENDATION", + "FIT_SCORE", + "RISK_LEVEL", + "EXPLANATION", + "STRENGTHS", + "MISSING_INFORMATION", + "SUPPLIER_ID", + "SUPPLIER_NAME", + "CATEGORY", + "REGION", + "CAPACITY_STATUS", + "CAPABILITY_SUMMARY" + ] + ) + + + def generate_supplier_recommendations(project_id, project_json, df_supplier_recommendations): + requirement = (project_json.get("requirements") or [{}])[0] + evaluation = (project_json.get("supplierEvaluations") or [{}])[0] + recommendation = evaluation.get("recommendation") or {} + + available_data_text = "\n".join([ + ( + f"Supplier Evaluation {row['EVALUATION_ID']}: " + f"{row['SUPPLIER_NAME']} | Decision: {row['RECOMMENDATION']} | " + f"Fit Score: {row['FIT_SCORE']} | Risk: {row['RISK_LEVEL']} | " + f"Capacity: {row['CAPACITY_STATUS']} | " + f"Explanation: {row['EXPLANATION']} | " + f"Missing Information: {row['MISSING_INFORMATION']}" + ) + for row in df_supplier_recommendations.to_dict(orient="records") + ]) + + project_profile_text = "\n".join([ + f"- Project Name: {project_json.get('projectName', '')}", + f"- Location: {project_json.get('location', '')}", + f"- Project Type: {project_json.get('projectType', '')}", + f"- Project Phase: {project_json.get('projectPhase', '')}", + f"- Project Summary: {project_json.get('projectSummary', '')}", + f"- Required Trade: {requirement.get('tradeCategory', '')}", + f"- Material Need: {requirement.get('materialNeed', '')}", + f"- Required Certification: {requirement.get('requiredCertification', '')}", + f"- Delivery Window: {requirement.get('deliveryWindow', '')}", + f"- Procurement Urgency: {requirement.get('procurementUrgency', '')}", + f"- Budget Range: {requirement.get('budgetRange', '')}", + f"- Risk Level: {requirement.get('riskLevel', '')}", + f"- Current Evaluation Status: {evaluation.get('evaluationStatus', '')}", + f"- Current Recommended Supplier: {recommendation.get('supplier', {}).get('supplierName', '')}" + ]) + + question = "Generate a supplier evaluation for this project." + prompt = f""" +You are an AI supplier evaluation assistant for construction engineering procurement. + +Analyze the selected project and supplier data below. Do not ask for more +project details unless the supplied data is actually missing. Produce the +analysis now. + +Industry: +Construction Engineering + +User request: +{question} + +Selected project profile: +{project_profile_text} + +Project and supplier JSON: +{json.dumps(project_json, default=str)} + +Available supplier recommendation records: +{available_data_text} + +Decision rules: +- Use APPROVE when the supplier is a strong fit and material risks are controlled. +- Use REQUEST INFO when inspection logs, capacity confirmation, certificates, + submittals, RFIs, safety records, or schedule evidence are missing. +- Use DENY when the supplier cannot satisfy core technical, compliance, + delivery, or safety requirements. +- For evidence that says documentation is complete and risk is Low, + recommend APPROVE. +- For Harbor Seismic Retrofit, deny the current suppliers and recommend + submitting a new RFP because the supplier pool does not meet DBE, AISC, + NCR, and logistics requirements. +- For North Campus Lab Expansion, treat an uploaded technical addendum PDF + as new evidence and explicitly reflect it in the re-analysis. + +Return a concise, decision-ready supplier evaluation with these exact sections: + +Project Summary +Key Sourcing Requirements +Top 3 Supplier Recommendations +Risks and Missing Information +Actionable Steps +""" + + print("Generating AI response...") + print(" ") + + genai_client = oci.generative_ai_inference.GenerativeAiInferenceClient( + config=oci.config.from_file(os.getenv("OCI_CONFIG_PATH", "~/.oci/config")), + service_endpoint=os.getenv("ENDPOINT") + ) + + chat_detail = oci.generative_ai_inference.models.ChatDetails( + compartment_id=os.getenv("COMPARTMENT_OCID"), + chat_request=oci.generative_ai_inference.models.GenericChatRequest( + messages=[oci.generative_ai_inference.models.UserMessage( + content=[oci.generative_ai_inference.models.TextContent(text=prompt)] + )], + temperature=0.0, + top_p=1.00 + ), + serving_mode=oci.generative_ai_inference.models.OnDemandServingMode( + model_id="meta.llama-3.2-90b-vision-instruct" + ) + ) + chat_response = genai_client.chat(chat_detail) + return chat_response.data.chat_response.choices[0].message.content[0].text + + + recommendations = generate_supplier_recommendations( + selected_project_id, + project_json, + df_supplier_recommendations + ) + print(recommendations) + + ``` + +2. Click the **Run** button to execute the cell. This step sends the + project profile and supplier recommendation records to OCI + Generative AI, so it may take a little time to complete. + While the model is processing, you should see + `Generating AI response...`. Wait for the cell to finish. When it + completes, the notebook will print a supplier evaluation with + recommendations, risks, missing information, and actionable next + steps. + + ![Run task 4](./images/lab4task4.png " ") + +3. Review the generated supplier evaluation. The output should + include sections such as `Project Summary`, + `Key Sourcing Requirements`, `Top 3 Supplier Recommendations`, + `Risks and Missing Information`, and `Actionable Steps`. + In Lab 1: Run the Demo, this corresponds to the point where the + construction procurement manager selected + **Navigate To Project Decisions** after reviewing the + AI-generated recommendation. + + >*Note:* Your exact wording may be different because generative + >AI responses can vary, even when the same project data is used. + + ![ai recommendation](./images/task4recommendations.png " ") + +## Task 7: Chunk & Store the Recommendations + +In this task, you will prepare the AI-generated supplier +recommendation for RAG by splitting it into smaller text chunks and +storing those chunks in the `CE_PROJECT_CHUNKS` database table. + +RAG works best when the system can retrieve focused pieces of relevant +text instead of searching one long response. To support that, this +code uses Oracle AI Database’s `VECTOR_CHUNKS` function to split the +generated recommendation into smaller sentence-based chunks. + +Here’s what the code does: + +* **Check for Generated Recommendations**: Confirm that the + recommendations text from Task 6 exists before trying to chunk it. +* **Remove Prior AI Recommendation Chunks**: Delete only the previous + `AI Recommendation` chunks for this project from the + `CE_PROJECT_CHUNKS` table. Seeded project and supplier context rows + remain in the table. +* **Create New Text Chunks**: Use `VECTOR_CHUNKS` to split the + generated recommendation text into smaller sentence-based chunks. +* **Store the Chunks**: Insert the new chunks into the + `CE_PROJECT_CHUNKS` table with new `CHUNK_ID` values to avoid + duplicate IDs. +* **Review the Results**: Display a DataFrame showing each + `CHUNK_ID`, character count, word count, and preview text so you + can confirm what will be used in the RAG flow. + +In the next task, you will create vector embeddings for these stored +chunks. + +1. Copy the following code and run it in a new cell: + + ```python + + if not recommendations: + raise ValueError( + "No recommendations text available to chunk. Run Task 6 first." + ) + + cursor.execute( + """ + DELETE FROM CE_PROJECT_CHUNKS + WHERE PROJECT_ID = :project_id + AND SOURCE_TYPE = 'AI Recommendation' + """, + {"project_id": selected_project_id} + ) + connection.commit() + + cursor.execute("SELECT NVL(MAX(CHUNK_ID), 0) FROM CE_PROJECT_CHUNKS") + base_chunk_id = (cursor.fetchone()[0] or 0) + 1 + + chunk_sizes = [50] + + for size in chunk_sizes: + insert_sql = f""" + INSERT INTO CE_PROJECT_CHUNKS ( + CHUNK_ID, + PROJECT_ID, + SUPPLIER_ID, + SOURCE_TYPE, + CHUNK_TEXT + ) + SELECT + :base_chunk_id + vc.chunk_offset, + :project_id, + NULL, + 'AI Recommendation', + vc.chunk_text + FROM (SELECT :rec_text AS txt FROM dual) s, + VECTOR_CHUNKS( + dbms_vector_chain.utl_to_text(s.txt) + BY words + MAX {size} + OVERLAP 0 + SPLIT BY sentence + LANGUAGE american + NORMALIZE all + ) vc + """ + cursor.execute( + insert_sql, + { + "base_chunk_id": base_chunk_id, + "project_id": selected_project_id, + "rec_text": recommendations + } + ) + + cursor.execute( + """ + SELECT CHUNK_ID, CHUNK_TEXT + FROM CE_PROJECT_CHUNKS + WHERE PROJECT_ID = :project_id + AND SOURCE_TYPE = 'AI Recommendation' + ORDER BY CHUNK_ID + """, + {"project_id": selected_project_id} + ) + rows = cursor.fetchall() + + + def _lob_to_str(v): + return v.read() if isinstance(v, oracledb.LOB) else v + + + items = [] + for cid, ctext in rows: + txt = _lob_to_str(ctext) or "" + items.append( + { + "CHUNK_ID": cid, + "Chars": len(txt), + "Words": len(txt.split()), + "Preview": (txt[:160] + "…") if len(txt) > 160 else txt + } + ) + + df_chunks = pd.DataFrame(items).sort_values("CHUNK_ID") + connection.commit() + print( + "✅ Task 7 complete: recommendation chunked for project " + f"{selected_project_id} (sizes: {chunk_sizes})." + ) + display(df_chunks) + + ``` + +2. Run the cell to split the generated supplier recommendation into + text chunks and store them in the `CE_PROJECT_CHUNKS` table. This + step may take a few moments. When the cell finishes, review the + output to confirm the recommendation was chunked successfully. + + ![Run task 7](./images/task5.png " ") + +3. Review the output to confirm that the AI-generated supplier + recommendation was split into multiple chunks. The table shows + each `CHUNK_ID`, the number of words in the chunk, and a preview + of the chunk text. These stored chunks will be used later as + retrievable context in the RAG flow. + + ![Run task 7](./images/task7recs.png " ") + +## Task 8: Create embeddings - Use Oracle AI Database to create vector data + +In Task 7, you stored the AI-generated supplier recommendation as +smaller text chunks in the `CE_PROJECT_CHUNKS` database table. In +this task, you will convert those text chunks into vector embeddings +so Oracle AI Database can search them by meaning, not just by exact +keyword matches. + +A vector embedding is a numerical representation of text. When a user +asks a follow-up question, the system can create an embedding for the +question and compare it to the stored chunk embeddings. This allows +Oracle AI Database to retrieve the recommendation chunks that are most +relevant to the question and use them as context in the RAG response. + +This code uses `dbms_vector_chain.utl_to_embedding` to generate the +embeddings directly inside Oracle AI Database. The code passes +`DEMO_MODEL` as the embedding model identifier. In this lab +environment, `DEMO_MODEL` is already configured, so you do not need +to choose or deploy an embedding model during the workshop. The +`dimensions: 384` value matches the vector size stored in the +`CHUNK_VECTOR` column of the `CE_PROJECT_CHUNKS` table. + +This step: + +* **Uses the Recommendation Chunks**: Works with the + `AI Recommendation` rows that were inserted into the + `CE_PROJECT_CHUNKS` table in Task 7. +* **Generates Embeddings in the Database**: Uses + `dbms_vector_chain.utl_to_embedding` with the lab’s configured + `DEMO_MODEL` to convert each chunk’s text into a vector embedding. +* **Stores the Embeddings**: Updates the `CHUNK_VECTOR` column in the + `CE_PROJECT_CHUNKS` table so the chunks can be searched by semantic + similarity in the next task. + +1. Run and review the code in a new cell: + + ```python + + vp = json.dumps( + { + "provider": "database", + "model": "DEMO_MODEL", + "dimensions": 384 + } + ) + + cursor.execute( + """ + UPDATE CE_PROJECT_CHUNKS + SET CHUNK_VECTOR = dbms_vector_chain.utl_to_embedding( + CHUNK_TEXT, + JSON(:vp) + ) + WHERE PROJECT_ID = :project_id + AND SOURCE_TYPE = 'AI Recommendation' + """, + {"vp": vp, "project_id": selected_project_id} + ) + updated = cursor.rowcount or 0 + connection.commit() + print( + "✅ Task 8 complete: embedded vectors for " + f"{updated} CE_PROJECT_CHUNKS row(s)." + ) + + ``` + +2. Click the **Run** button to execute the cell. The code creates + vector embeddings for the `AI Recommendation` chunks and stores + them in the `CHUNK_VECTOR` column of the `CE_PROJECT_CHUNKS` + table. + When the cell finishes, review the output message to confirm how + many recommendation rows were embedded. This confirms the chunks + are ready for vector search in the next task. + + ![vector](./images/task8.png " ") + +## Task 9: Implement RAG with Oracle AI Database's Vector Search + +Now that the recommendation chunks have vector embeddings, you can use +them to answer a natural-language follow-up question: + +```text +Which supplier is the best fit for Downtown Mixed-Use Tower if we +prioritize complete documentation and delivery reliability? +``` + +This step shows the full RAG flow. The user’s question is converted +into a vector, Oracle AI Database searches for the most relevant +recommendation chunks, and OCI Generative AI uses those retrieved +chunks as context to generate a grounded answer. + +This step: + +* **Vectorizes the Question**: Uses + `dbms_vector_chain.utl_to_embedding` with the lab’s configured + `DEMO_MODEL` to convert the user’s question into a vector + embedding. +* **Performs AI Vector Search**: Compares the question vector to the + stored chunk vectors in the `CE_PROJECT_CHUNKS` table and retrieves + the most relevant chunks using cosine distance. +* **Uses RAG**: Combines the selected project profile, supplier + recommendation records, and retrieved chunk context into a prompt + for OCI Generative AI. +* **Helps Reduce Hallucinations**: Instructs the model to use only + the supplied project data, supplier records, and retrieved context. + The prompt also tells the model not to invent supplier names and to + use only supplier names that appear in the provided records or + context. + +1. Copy the code block below to implement RAG: + + ```python + + question = ( + "Which supplier is the best fit for Downtown Mixed-Use Tower " + "if we prioritize complete documentation and delivery reliability?" + ) + + + def vectorize_question(q): + cursor.execute( + """ + SELECT dbms_vector_chain.utl_to_embedding( + :q, + JSON('{"provider":"database","model":"DEMO_MODEL","dimensions":384}') + ) + FROM DUAL + """, + {"q": q} + ) + return cursor.fetchone()[0] + + + print("Processing your question using AI Vector Search...") + + try: + q_vec = vectorize_question(question) + + cursor.execute( + """ + SELECT CHUNK_ID, CHUNK_TEXT + FROM CE_PROJECT_CHUNKS + WHERE PROJECT_ID = :project_id + AND CHUNK_VECTOR IS NOT NULL + ORDER BY VECTOR_DISTANCE(CHUNK_VECTOR, :qv, COSINE) + FETCH FIRST 4 ROWS ONLY + """, + {"project_id": selected_project_id, "qv": q_vec} + ) + retrieved = [ + ( + row[0], + row[1].read() if isinstance(row[1], oracledb.LOB) else row[1] + ) + for row in cursor.fetchall() + ] + + if not retrieved: + retrieved = [(0, recommendations)] + + requirement = (project_json.get("requirements") or [{}])[0] + available_data_text = "\n".join([ + ( + f"Supplier Evaluation {row['EVALUATION_ID']}: " + f"{row['SUPPLIER_NAME']} | Decision: {row['RECOMMENDATION']} | " + f"Fit Score: {row['FIT_SCORE']} | Risk: {row['RISK_LEVEL']} | " + f"Capacity: {row['CAPACITY_STATUS']} | " + f"Explanation: {row['EXPLANATION']} | " + f"Missing Information: {row['MISSING_INFORMATION']}" + ) + for row in df_supplier_recommendations.to_dict(orient="records") + ]) + project_profile_text = "\n".join([ + f"- Project Name: {project_json.get('projectName', '')}", + f"- Location: {project_json.get('location', '')}", + f"- Project Phase: {project_json.get('projectPhase', '')}", + f"- Required Trade: {requirement.get('tradeCategory', '')}", + f"- Delivery Window: {requirement.get('deliveryWindow', '')}", + f"- Budget Range: {requirement.get('budgetRange', '')}", + f"- Risk Level: {requirement.get('riskLevel', '')}" + ]) + context_text = "\n========\n".join(text for _, text in retrieved) + + rag_prompt = f"""[INST] <> +You are the AI Procurement Guru for construction engineering. +Use only the supplied project profile, supplier recommendation +records, and retrieved context. +Do not invent supplier names. +Only use supplier names that appear verbatim in the supplier +recommendation records or retrieved context. +If the evidence is insufficient, say so plainly. +Keep the answer under 220 words and make it decision-ready. +<> [/INST] +[INST] +Question: "{question}" + +Selected Project Profile: +{project_profile_text} + +Available Supplier Recommendation Records: +{available_data_text} + +Retrieved Context: +{context_text} + +Tasks: +1. Answer the question directly. +2. Justify the answer using fit, risk, delivery, and documentation signals. +3. If there is a reasonable backup supplier, name it briefly. + [/INST]""" + + print("Generating AI response...") + + genai_client = oci.generative_ai_inference.GenerativeAiInferenceClient( + config=oci.config.from_file(os.getenv("OCI_CONFIG_PATH", "~/.oci/config")), + service_endpoint=os.getenv("ENDPOINT") + ) + chat_detail = oci.generative_ai_inference.models.ChatDetails( + compartment_id=os.getenv("COMPARTMENT_OCID"), + chat_request=oci.generative_ai_inference.models.GenericChatRequest( + messages=[oci.generative_ai_inference.models.UserMessage( + content=[oci.generative_ai_inference.models.TextContent(text=rag_prompt)] + )], + temperature=0.0, + top_p=0.90 + ), + serving_mode=oci.generative_ai_inference.models.OnDemandServingMode( + model_id="meta.llama-3.2-90b-vision-instruct" + ) + ) + chat_response = genai_client.chat(chat_detail) + ai_response = ( + chat_response.data.chat_response.choices[0] + .message.content[0].text + ) + + print("\\n🤖 AI Procurement Guru Response:") + print(ai_response) + + print("\\n📑 Retrieved Chunks Used in Response:") + for cid, text in retrieved: + preview = text[:140].replace("\\n", " ") + if len(text) > 140: + preview += "..." + print(f"[Chunk {cid}] : {preview}") + + except Exception as e: + print(f"RAG flow error: {e}") + + ``` + +2. Click the **Run** button to execute the cell. The notebook will + process the question using AI Vector Search, retrieve the most + relevant chunks from the `CE_PROJECT_CHUNKS` table, and send the + retrieved context to OCI Generative AI. + + ![ask question](./images/task7.png " ") + +3. Review the AI Procurement Guru Response. The answer should + identify the best-fit supplier and explain the reasoning using + retrieved evidence, such as fit score, documentation, delivery + reliability, risk level, and missing information. + Also review the `Retrieved Chunks Used in Response` section. + These are the specific text chunks retrieved by vector search and + used as grounding context for the AI response. + + >*Note:* Your exact wording may be different because generative + >AI responses can vary, even when the same project data and + >retrieved context are used. + + ![rag](./images/task7results.png " ") + +## Summary + +Congratulations! You implemented a RAG process in Oracle AI Database +using Python. + +To summarize, you: + +* Connected from a Jupyter notebook to Oracle AI Database using the + Oracle Python driver, `oracledb`. +* Retrieved construction project data from the + `construction_projects_dv` JSON relational duality view. +* Used OCI Generative AI to generate a construction-specific + supplier evaluation. +* Split the generated recommendation into smaller text chunks and + stored them in the `CE_PROJECT_CHUNKS` database table. +* Created vector embeddings for the recommendation chunks directly in + Oracle AI Database. +* Used Oracle AI Database Vector Search and RAG to answer a + natural-language follow-up question with retrieved project and + supplier context. + +Congratulations, you completed the lab. + +You may now proceed to the next lab. + +## Learn More + +* [Code with Python](https://www.oracle.com/developer/python-developers/) +* [Oracle AI Database Documentation](https://docs.oracle.com/en/database/oracle/oracle-database/23/) + +## Acknowledgements +* **Authors** - Francis Regalado +* **Last Updated By/Date** - Taylor Zheng, Uma Kumar, Deion Locklear, Daniet Hart, July 2026 diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/files/starter-file.sql b/dev-ai-app-dev-constructioneng-aiexperience/build/files/starter-file.sql new file mode 100644 index 000000000..52397f1ae --- /dev/null +++ b/dev-ai-app-dev-constructioneng-aiexperience/build/files/starter-file.sql @@ -0,0 +1,302 @@ +-- Construction Engineering supplier evaluation model +DROP TABLE IF EXISTS CE_SUPPLIER_DEPENDENCIES CASCADE CONSTRAINTS PURGE; +DROP TABLE IF EXISTS CE_PROJECT_CHUNKS CASCADE CONSTRAINTS PURGE; +DROP TABLE IF EXISTS CE_DECISION CASCADE CONSTRAINTS PURGE; +DROP TABLE IF EXISTS CE_SUPPORTING_DOCS CASCADE CONSTRAINTS PURGE; +DROP TABLE IF EXISTS CE_SUPPLIER_EVALUATION CASCADE CONSTRAINTS PURGE; +DROP TABLE IF EXISTS CE_SUPPLIER_RECOMMENDATION CASCADE CONSTRAINTS PURGE; +DROP TABLE IF EXISTS CE_SUPPLIER_PERFORMANCE CASCADE CONSTRAINTS PURGE; +DROP TABLE IF EXISTS CE_SUPPLIER_CERTIFICATIONS CASCADE CONSTRAINTS PURGE; +DROP TABLE IF EXISTS CE_SUPPLIERS CASCADE CONSTRAINTS PURGE; +DROP TABLE IF EXISTS CE_PROJECT_REQUIREMENTS CASCADE CONSTRAINTS PURGE; +DROP TABLE IF EXISTS CE_PROJECTS CASCADE CONSTRAINTS PURGE; +DROP VIEW IF EXISTS CONSTRUCTION_PROJECTS_DV; +DROP PROPERTY GRAPH IF EXISTS CONSTRUCTION_ENGINEERING_GRAPH; + +CREATE TABLE IF NOT EXISTS CE_PROJECTS ( + PROJECT_ID NUMBER PRIMARY KEY, + PROJECT_NAME VARCHAR2(200) NOT NULL, + LOCATION VARCHAR2(200), + PROJECT_TYPE VARCHAR2(100), + PROJECT_PHASE VARCHAR2(100), + PROJECT_SUMMARY CLOB, + START_DATE DATE, + TARGET_DELIVERY_DATE DATE, + EVALUATION_STATUS VARCHAR2(50), + CREATED_BY VARCHAR2(100) +); + +CREATE TABLE IF NOT EXISTS CE_PROJECT_REQUIREMENTS ( + REQUIREMENT_ID NUMBER PRIMARY KEY, + PROJECT_ID NUMBER REFERENCES CE_PROJECTS(PROJECT_ID), + TRADE_CATEGORY VARCHAR2(100), + MATERIAL_NEED VARCHAR2(200), + TECHNICAL_SPEC CLOB, + REQUIRED_CERTIFICATION VARCHAR2(200), + DELIVERY_WINDOW VARCHAR2(100), + PROCUREMENT_URGENCY VARCHAR2(50), + BUDGET_RANGE VARCHAR2(100), + RISK_LEVEL VARCHAR2(50) +); + +CREATE TABLE IF NOT EXISTS CE_SUPPLIERS ( + SUPPLIER_ID NUMBER PRIMARY KEY, + SUPPLIER_NAME VARCHAR2(200) NOT NULL, + CATEGORY VARCHAR2(100), + REGION VARCHAR2(100), + EMAIL VARCHAR2(100), + PHONE_NUMBER VARCHAR2(20), + ACTIVE CHAR(1), + CAPACITY_STATUS VARCHAR2(50), + CAPABILITY_SUMMARY CLOB +); + +CREATE TABLE IF NOT EXISTS CE_SUPPLIER_CERTIFICATIONS ( + CERT_ID NUMBER PRIMARY KEY, + SUPPLIER_ID NUMBER REFERENCES CE_SUPPLIERS(SUPPLIER_ID), + CERTIFICATION_NAME VARCHAR2(200), + ISSUED_BY VARCHAR2(200), + EXPIRES_ON DATE, + STATUS VARCHAR2(50) +); + +CREATE TABLE IF NOT EXISTS CE_SUPPLIER_PERFORMANCE ( + PERFORMANCE_ID NUMBER PRIMARY KEY, + SUPPLIER_ID NUMBER REFERENCES CE_SUPPLIERS(SUPPLIER_ID), + PROJECT_TYPE VARCHAR2(100), + SIMILAR_PROJECT_COUNT NUMBER, + ON_TIME_DELIVERY_RATE NUMBER(5,2), + COST_VARIANCE_PCT NUMBER(5,2), + UNRESOLVED_NCR_COUNT NUMBER, + SAFETY_SCORE NUMBER(5,2), + LAST_EVALUATED DATE +); + +CREATE TABLE IF NOT EXISTS CE_SUPPLIER_RECOMMENDATION ( + RECOMMEND_ID NUMBER PRIMARY KEY, + PROJECT_ID NUMBER REFERENCES CE_PROJECTS(PROJECT_ID), + SUPPLIER_ID NUMBER REFERENCES CE_SUPPLIERS(SUPPLIER_ID), + RECOMMENDATION VARCHAR2(50), + FIT_SCORE NUMBER(5,2), + RISK_LEVEL VARCHAR2(50), + EXPLANATION CLOB, + STRENGTHS CLOB, + MISSING_INFORMATION CLOB, + GENERATED_DATE DATE DEFAULT SYSDATE +); + +CREATE TABLE IF NOT EXISTS CE_SUPPLIER_EVALUATION ( + EVALUATION_ID NUMBER PRIMARY KEY, + PROJECT_ID NUMBER REFERENCES CE_PROJECTS(PROJECT_ID), + RECOMMEND_ID NUMBER REFERENCES CE_SUPPLIER_RECOMMENDATION(RECOMMEND_ID), + REQUEST_DATE DATE, + EVALUATION_STATUS VARCHAR2(50), + FINAL_DECISION VARCHAR2(50), + DECISION_DATE DATE +); + +CREATE TABLE IF NOT EXISTS CE_SUPPORTING_DOCS ( + DOC_ID NUMBER PRIMARY KEY, + PROJECT_ID NUMBER REFERENCES CE_PROJECTS(PROJECT_ID), + SUPPLIER_ID NUMBER REFERENCES CE_SUPPLIERS(SUPPLIER_ID), + DOC_TYPE VARCHAR2(100), + FILE_NAME VARCHAR2(255), + DOC_TEXT CLOB, + UPLOAD_TIME DATE DEFAULT SYSDATE +); + +CREATE TABLE IF NOT EXISTS CE_DECISION ( + DEC_ID NUMBER PRIMARY KEY, + EVALUATION_ID NUMBER REFERENCES CE_SUPPLIER_EVALUATION(EVALUATION_ID), + DECISION_TYPE VARCHAR2(50), + LETTER_TEXT CLOB, + GENERATED_ON DATE DEFAULT SYSDATE +); + +CREATE TABLE IF NOT EXISTS CE_PROJECT_CHUNKS ( + CHUNK_ID NUMBER PRIMARY KEY, + PROJECT_ID NUMBER REFERENCES CE_PROJECTS(PROJECT_ID), + SUPPLIER_ID NUMBER REFERENCES CE_SUPPLIERS(SUPPLIER_ID), + SOURCE_TYPE VARCHAR2(50), + CHUNK_TEXT CLOB, + CHUNK_VECTOR VECTOR(384,*,DENSE) +); + +CREATE TABLE IF NOT EXISTS CE_SUPPLIER_DEPENDENCIES ( + DEPENDENCY_ID NUMBER PRIMARY KEY, + SUPPLIER_ID NUMBER REFERENCES CE_SUPPLIERS(SUPPLIER_ID), + RELATED_SUPPLIER_ID NUMBER REFERENCES CE_SUPPLIERS(SUPPLIER_ID), + DEPENDENCY_TYPE VARCHAR2(100), + RISK_NOTE VARCHAR2(1000) +); + +INSERT INTO CE_PROJECTS VALUES (1001, 'Downtown Mixed-Use Tower', 'San Jose, California', 'Mixed-use commercial building', 'Procurement', 'Mid-rise mixed-use project requiring structural steel framing, fire-rated assemblies, shop drawing support, inspection documentation, and regional delivery within a compressed schedule. Atlas Structural Fabrication has complete documentation and low supplier risk, so this project is ready for approval.', DATE '2026-06-01', DATE '2026-08-15', 'Pending Review', 'Maya Chen'); +INSERT INTO CE_PROJECTS VALUES (1002, 'Bayfront Utility Upgrade', 'Oakland, California', 'Infrastructure', 'Preconstruction', 'Public works utility upgrade requiring concrete vaults, electrical gear, traffic controls, and suppliers with public-sector documentation history.', DATE '2026-07-10', DATE '2026-10-01', 'In Progress', 'Jordan Patel'); +INSERT INTO CE_PROJECTS VALUES (1003, 'Harbor Seismic Retrofit', 'Long Beach, California', 'Public works retrofit', 'Procurement', 'Seismic retrofit project requiring specialty steel bracing, strict public works documentation, DBE participation, and suppliers with clean nonconformance history. Existing supplier pool does not meet core compliance requirements, so the recommended action is to deny current suppliers and issue a new RFP.', DATE '2026-07-15', DATE '2026-09-30', 'Pending Review', 'Elena Ruiz'); +INSERT INTO CE_PROJECTS VALUES (1004, 'North Campus Lab Expansion', 'Palo Alto, California', 'Laboratory expansion', 'Procurement', 'Laboratory expansion requiring HVAC equipment, cleanroom-compatible ductwork, seismic anchorage documentation, and manufacturer startup support. The evaluation is waiting for an uploaded technical addendum before AI re-analysis.', DATE '2026-08-01', DATE '2026-11-15', 'Pending Review', 'Priya Raman'); + +INSERT INTO CE_PROJECT_REQUIREMENTS VALUES (2001, 1001, 'Structural Steel', 'Fabricated beams, columns, and connection assemblies', 'AISC-compliant structural steel package for a mid-rise commercial frame, including mill certificates, weld procedures, shop drawings, and inspection documentation.', 'AISC Certification; AWS Certified Welders', 'Six weeks', 'High', '$2.4M - $2.9M', 'Low'); +INSERT INTO CE_PROJECT_REQUIREMENTS VALUES (2002, 1002, 'Electrical Systems', 'Switchgear and underground utility components', 'Utility-grade electrical equipment with public works submittals, delivery traceability, and site coordination documentation.', 'UL Listed Components; OSHA Safety Program', 'Ten weeks', 'Medium', '$900K - $1.3M', 'Medium'); +INSERT INTO CE_PROJECT_REQUIREMENTS VALUES (2003, 1003, 'Seismic Steel Bracing', 'Buckling-restrained braces, embeds, and retrofit connection plates', 'Public works seismic retrofit package requiring documented AISC fabrication, DBE participation, certified welding procedures, unresolved NCR count of zero, and verified delivery access for night work.', 'AISC Certification; AWS Certified Welders; DBE Participation', 'Four weeks', 'Critical', '$1.8M - $2.2M', 'High'); +INSERT INTO CE_PROJECT_REQUIREMENTS VALUES (2004, 1004, 'Mechanical Systems', 'Cleanroom HVAC units, ductwork, controls, and startup support', 'Laboratory HVAC package requiring cleanroom-compatible ductwork, seismic anchorage calculations, TAB plan, manufacturer startup support, and submittal-ready technical documentation.', 'OSHPD/Seismic Anchorage Documentation; Factory Startup Authorization', 'Eight weeks', 'Medium', '$1.1M - $1.6M', 'Medium'); + +INSERT INTO CE_SUPPLIERS VALUES (3001, 'Atlas Structural Fabrication', 'Structural Steel', 'Northern California', 'estimating@atlasstructural.example', '408-555-0140', 'Y', 'Constrained', 'Certified structural steel fabricator with mid-rise commercial experience, shop drawing support, weld procedure documentation, and strong regional delivery history.'); +INSERT INTO CE_SUPPLIERS VALUES (3002, 'WestBridge Steel Supply', 'Structural Steel', 'Bay Area', 'bids@westbridgesteel.example', '510-555-0188', 'Y', 'Available', 'Regional steel supplier with competitive cost history and broad material availability; updated inspection package is still pending.'); +INSERT INTO CE_SUPPLIERS VALUES (3003, 'Northline Industrial Metals', 'Structural Steel', 'Central California', 'rfq@northlinemetals.example', '559-555-0199', 'Y', 'Available', 'Industrial metals supplier with strong fabrication capabilities and prior commercial work, but recent schedule confirmations are required due to historical delivery delays.'); +INSERT INTO CE_SUPPLIERS VALUES (3004, 'Coastal Retrofit Metals', 'Seismic Steel', 'Southern California', 'bids@coastalretrofit.example', '562-555-0111', 'Y', 'Overloaded', 'Retrofit steel supplier with partial seismic brace experience but missing DBE documentation and open nonconformance items.'); +INSERT INTO CE_SUPPLIERS VALUES (3005, 'Pacific Brace Works', 'Seismic Steel', 'California', 'estimating@pacificbrace.example', '714-555-0122', 'Y', 'Available', 'Specialty bracing supplier with competitive pricing but expired AISC certification and limited public works documentation.'); +INSERT INTO CE_SUPPLIERS VALUES (3006, 'Civic Steel Partners', 'Seismic Steel', 'Western US', 'rfp@civicsteel.example', '916-555-0177', 'Y', 'Available', 'Regional steel supplier with public-sector references but unresolved weld NCRs and no verified night-work delivery plan.'); +INSERT INTO CE_SUPPLIERS VALUES (3007, 'Precision Air Systems', 'Mechanical Systems', 'Northern California', 'labprojects@precisionair.example', '650-555-0133', 'Y', 'Available', 'Mechanical systems supplier with cleanroom HVAC experience, seismic anchorage partners, and factory startup authorization after updated technical package is received.'); +INSERT INTO CE_SUPPLIERS VALUES (3008, 'Valley Mechanical Supply', 'Mechanical Systems', 'Bay Area', 'quotes@valleymechanical.example', '408-555-0166', 'Y', 'Constrained', 'Mechanical supplier with competitive cost history but missing cleanroom TAB documentation and limited startup support availability.'); + +INSERT INTO CE_SUPPLIER_CERTIFICATIONS VALUES (4001, 3001, 'AISC Certified Fabricator', 'AISC', DATE '2027-05-31', 'Current'); +INSERT INTO CE_SUPPLIER_CERTIFICATIONS VALUES (4002, 3001, 'AWS Certified Welding Program', 'AWS', DATE '2027-03-15', 'Current'); +INSERT INTO CE_SUPPLIER_CERTIFICATIONS VALUES (4003, 3002, 'AISC Certified Fabricator', 'AISC', DATE '2026-12-31', 'Current'); +INSERT INTO CE_SUPPLIER_CERTIFICATIONS VALUES (4004, 3003, 'AWS Certified Welding Program', 'AWS', DATE '2027-01-20', 'Current'); +INSERT INTO CE_SUPPLIER_CERTIFICATIONS VALUES (4005, 3004, 'DBE Participation Letter', 'Agency Self-Report', DATE '2026-08-01', 'Missing'); +INSERT INTO CE_SUPPLIER_CERTIFICATIONS VALUES (4006, 3005, 'AISC Certified Fabricator', 'AISC', DATE '2025-12-31', 'Expired'); +INSERT INTO CE_SUPPLIER_CERTIFICATIONS VALUES (4007, 3006, 'AWS Certified Welding Program', 'AWS', DATE '2027-02-28', 'Current'); +INSERT INTO CE_SUPPLIER_CERTIFICATIONS VALUES (4008, 3007, 'Factory Startup Authorization', 'HVAC Manufacturer', DATE '2027-06-30', 'Current'); +INSERT INTO CE_SUPPLIER_CERTIFICATIONS VALUES (4009, 3007, 'Seismic Anchorage Partner Letter', 'Structural Engineer', DATE '2027-04-30', 'Current'); +INSERT INTO CE_SUPPLIER_CERTIFICATIONS VALUES (4010, 3008, 'Cleanroom TAB Documentation', 'Independent TAB Agency', DATE '2026-09-01', 'Missing'); + +INSERT INTO CE_SUPPLIER_PERFORMANCE VALUES (5001, 3001, 'Mid-rise commercial', 3, 94.00, 2.10, 0, 96.00, DATE '2026-05-20'); +INSERT INTO CE_SUPPLIER_PERFORMANCE VALUES (5002, 3002, 'Commercial steel framing', 2, 89.00, -1.80, 1, 91.00, DATE '2026-05-18'); +INSERT INTO CE_SUPPLIER_PERFORMANCE VALUES (5003, 3003, 'Industrial and commercial', 4, 82.00, 4.70, 2, 88.00, DATE '2026-05-12'); +INSERT INTO CE_SUPPLIER_PERFORMANCE VALUES (5004, 3004, 'Seismic retrofit', 1, 61.00, 9.40, 3, 74.00, DATE '2026-05-25'); +INSERT INTO CE_SUPPLIER_PERFORMANCE VALUES (5005, 3005, 'Public works retrofit', 1, 68.00, 6.10, 1, 79.00, DATE '2026-05-28'); +INSERT INTO CE_SUPPLIER_PERFORMANCE VALUES (5006, 3006, 'Civic infrastructure', 2, 72.00, 8.90, 2, 81.00, DATE '2026-05-29'); +INSERT INTO CE_SUPPLIER_PERFORMANCE VALUES (5007, 3007, 'Laboratory HVAC', 4, 93.00, 1.80, 0, 95.00, DATE '2026-06-02'); +INSERT INTO CE_SUPPLIER_PERFORMANCE VALUES (5008, 3008, 'Healthcare and lab mechanical', 3, 84.00, 3.90, 1, 88.00, DATE '2026-06-03'); + +INSERT INTO CE_SUPPLIER_RECOMMENDATION VALUES (6001, 1001, 3001, 'Approved', 97.00, 'Low', 'Atlas Structural Fabrication is approved because it has completed three similar mid-rise steel frame projects, maintains current AISC and AWS documentation, has a 96 percent on-time delivery rate, has no unresolved inspection failures in the past 24 months, and has confirmed capacity for the six-week delivery window.', 'AISC certification, certified weld procedures, commercial steel framing experience, complete mill certificates, clean inspection history, confirmed delivery capacity, low supplier risk.', 'No blocking information is missing. Proceed with supplier confirmation and purchase package preparation.', SYSDATE); +INSERT INTO CE_SUPPLIER_RECOMMENDATION VALUES (6002, 1001, 3002, 'Request Info', 86.00, 'Medium', 'WestBridge Steel Supply has competitive cost history and good regional availability, but the evaluation is incomplete because current inspection documentation has not been provided.', 'Competitive cost performance, regional availability, current AISC certification.', 'Updated inspection logs, mill certificates, and nonconformance closeout evidence.', SYSDATE); +INSERT INTO CE_SUPPLIER_RECOMMENDATION VALUES (6003, 1001, 3003, 'Request Info', 78.00, 'High', 'Northline Industrial Metals has fabrication capability and similar project experience, but prior delivery delays and unresolved nonconformance count require schedule and quality confirmation before selection.', 'Strong fabrication capabilities and similar project references.', 'Delivery schedule confirmation, corrective action evidence, and updated inspection records.', SYSDATE); +INSERT INTO CE_SUPPLIER_RECOMMENDATION VALUES (6004, 1003, 3004, 'Denied', 38.00, 'High', 'Coastal Retrofit Metals should be denied because DBE participation documentation is missing, capacity is overloaded, and three unresolved nonconformance reports conflict with the public works retrofit requirements.', 'Some seismic retrofit experience.', 'DBE letter, NCR closeout evidence, and capacity plan are missing. Submit an RFP for new qualified seismic steel suppliers.', SYSDATE); +INSERT INTO CE_SUPPLIER_RECOMMENDATION VALUES (6005, 1003, 3005, 'Denied', 34.00, 'High', 'Pacific Brace Works should be denied because AISC certification is expired and public works documentation is incomplete for the required seismic retrofit scope.', 'Competitive pricing.', 'Current AISC certification and public works documentation are missing. Submit an RFP for new qualified seismic steel suppliers.', SYSDATE); +INSERT INTO CE_SUPPLIER_RECOMMENDATION VALUES (6006, 1003, 3006, 'Denied', 31.00, 'Very High', 'Civic Steel Partners should be denied because unresolved weld nonconformance reports and no verified night-work logistics plan create unacceptable schedule and quality risk.', 'Public-sector references.', 'NCR closeout evidence and night-work delivery plan are missing. Submit an RFP for new qualified seismic steel suppliers.', SYSDATE); +INSERT INTO CE_SUPPLIER_RECOMMENDATION VALUES (6007, 1004, 3007, 'Request Info', 82.00, 'Medium', 'Precision Air Systems is the leading candidate for the lab expansion, but the evaluation is pending the updated technical addendum with cleanroom TAB plan, seismic anchorage package, and factory startup letter. Re-analyze after PDF upload.', 'Laboratory HVAC experience, clean startup support, current factory authorization.', 'Upload technical addendum with TAB plan, seismic anchorage package, startup letter, and updated delivery confirmation.', SYSDATE); +INSERT INTO CE_SUPPLIER_RECOMMENDATION VALUES (6008, 1004, 3008, 'Request Info', 68.00, 'Medium', 'Valley Mechanical Supply has cost advantages but lacks cleanroom TAB documentation and has constrained startup support availability.', 'Competitive cost history and regional availability.', 'Cleanroom TAB documentation and startup support confirmation are missing.', SYSDATE); + +INSERT INTO CE_SUPPLIER_EVALUATION VALUES (7001, 1001, 6001, SYSDATE, 'Pending Review', NULL, NULL); +INSERT INTO CE_SUPPLIER_EVALUATION VALUES (7002, 1002, NULL, SYSDATE, 'In Progress', NULL, NULL); +INSERT INTO CE_SUPPLIER_EVALUATION VALUES (7003, 1003, 6004, SYSDATE, 'Pending Review', NULL, NULL); +INSERT INTO CE_SUPPLIER_EVALUATION VALUES (7004, 1004, 6007, SYSDATE, 'Pending Review', NULL, NULL); + +INSERT INTO CE_SUPPORTING_DOCS VALUES (8001, 1001, 3001, 'Inspection Log', 'atlas_inspection_log_2026.pdf', 'Inspection log shows no unresolved weld inspection failures for comparable mid-rise commercial projects in the last 24 months.', SYSDATE); +INSERT INTO CE_SUPPORTING_DOCS VALUES (8002, 1001, 3001, 'Material Certificate', 'atlas_mill_certificates.pdf', 'Mill certificate package covers wide flange beams, columns, and connection assemblies required for the Downtown Mixed-Use Tower.', SYSDATE); +INSERT INTO CE_SUPPORTING_DOCS VALUES (8003, 1001, 3002, 'Qualification File', 'westbridge_supplier_qualification.pdf', 'Supplier qualification file confirms AISC certification and regional availability but omits the most recent inspection log.', SYSDATE); +INSERT INTO CE_SUPPORTING_DOCS VALUES (8004, 1003, 3004, 'Supplier Qualification', 'coastal_retrofit_qualification.pdf', 'Supplier package has missing DBE participation letter, overloaded shop capacity, and unresolved NCR history. Existing suppliers should be denied and new RFP should be submitted.', SYSDATE); +INSERT INTO CE_SUPPORTING_DOCS VALUES (8005, 1004, 3007, 'Pending Technical Addendum', 'Construction_Supplier_Evaluation.pdf', 'Upload PDF contains the lab HVAC technical addendum needed for AI re-analysis, including TAB plan, seismic anchorage package, startup letter, and updated delivery confirmation.', SYSDATE); +INSERT INTO CE_DECISION VALUES (9001, 7001, 'Approve Recommended', 'Atlas Structural Fabrication has complete certification, inspection, capacity, and delivery evidence. Recommended path is to approve and confirm the supplier.', SYSDATE); +INSERT INTO CE_DECISION VALUES (9002, 7003, 'RFP Recommended', 'Current seismic steel suppliers do not meet DBE, AISC, nonconformance, and logistics requirements. Deny current suppliers and submit a new RFP.', SYSDATE); +INSERT INTO CE_DECISION VALUES (9003, 7004, 'Request Info', 'Upload the lab HVAC technical addendum and re-run AI analysis before confirming supplier selection.', SYSDATE); + +INSERT INTO CE_PROJECT_CHUNKS (CHUNK_ID, PROJECT_ID, SUPPLIER_ID, SOURCE_TYPE, CHUNK_TEXT) VALUES (10001, 1001, 3001, 'Project Requirement', 'Downtown Mixed-Use Tower requires structural steel framing, fabricated beams and columns, connection assemblies, AISC certification, AWS certified welders, mill certificates, shop drawings, inspection records, and delivery within six weeks. Required evidence is complete.'); +INSERT INTO CE_PROJECT_CHUNKS (CHUNK_ID, PROJECT_ID, SUPPLIER_ID, SOURCE_TYPE, CHUNK_TEXT) VALUES (10002, 1001, 3001, 'Supplier Profile', 'Atlas Structural Fabrication has completed three similar mid-rise steel frame projects, maintains current AISC certification, has certified weld procedure documentation, confirmed delivery capacity, no unresolved inspection failures, and low supplier risk.'); +INSERT INTO CE_PROJECT_CHUNKS (CHUNK_ID, PROJECT_ID, SUPPLIER_ID, SOURCE_TYPE, CHUNK_TEXT) VALUES (10003, 1001, 3002, 'Supplier Profile', 'WestBridge Steel Supply has competitive cost history and good regional availability, but updated inspection documentation and nonconformance closeout records are missing.'); +INSERT INTO CE_PROJECT_CHUNKS (CHUNK_ID, PROJECT_ID, SUPPLIER_ID, SOURCE_TYPE, CHUNK_TEXT) VALUES (10004, 1003, 3004, 'RFP Trigger', 'Harbor Seismic Retrofit has no acceptable supplier in the current pool. Coastal Retrofit Metals lacks DBE documentation, Pacific Brace Works has expired AISC certification, and Civic Steel Partners has unresolved weld NCRs. Deny suppliers and submit an RFP.'); +INSERT INTO CE_PROJECT_CHUNKS (CHUNK_ID, PROJECT_ID, SUPPLIER_ID, SOURCE_TYPE, CHUNK_TEXT) VALUES (10005, 1004, 3007, 'PDF Upload Scenario', 'North Campus Lab Expansion is awaiting a technical addendum PDF. Upload should add cleanroom TAB plan, seismic anchorage package, factory startup authorization, and updated delivery confirmation for AI re-analysis.'); +INSERT INTO CE_SUPPLIER_DEPENDENCIES VALUES (11001, 3001, 3002, 'Shared coating subcontractor', 'Both suppliers may use the same coating subcontractor, which could create schedule pressure if both are selected for concurrent projects.'); +INSERT INTO CE_SUPPLIER_DEPENDENCIES VALUES (11002, 3004, 3006, 'Shared inspection consultant', 'Both seismic retrofit suppliers rely on the same inspection consultant, creating a hidden review bottleneck for public works closeout.'); + +CREATE OR REPLACE JSON RELATIONAL DUALITY VIEW construction_projects_dv AS +SELECT JSON { + '_id': p.PROJECT_ID, + 'projectName': p.PROJECT_NAME, + 'location': p.LOCATION, + 'projectType': p.PROJECT_TYPE, + 'projectPhase': p.PROJECT_PHASE, + 'projectSummary': p.PROJECT_SUMMARY, + 'startDate': p.START_DATE, + 'targetDeliveryDate': p.TARGET_DELIVERY_DATE, + 'evaluationStatus': p.EVALUATION_STATUS, + 'createdBy': p.CREATED_BY, + 'requirements': [ + SELECT JSON { + 'requirementId': r.REQUIREMENT_ID, + 'tradeCategory': r.TRADE_CATEGORY, + 'materialNeed': r.MATERIAL_NEED, + 'technicalSpec': r.TECHNICAL_SPEC, + 'requiredCertification': r.REQUIRED_CERTIFICATION, + 'deliveryWindow': r.DELIVERY_WINDOW, + 'procurementUrgency': r.PROCUREMENT_URGENCY, + 'budgetRange': r.BUDGET_RANGE, + 'riskLevel': r.RISK_LEVEL + } + FROM CE_PROJECT_REQUIREMENTS r WITH INSERT UPDATE DELETE + WHERE r.PROJECT_ID = p.PROJECT_ID + ], + 'supplierEvaluations': [ + SELECT JSON { + 'evaluationId': e.EVALUATION_ID, + 'requestDate': e.REQUEST_DATE, + 'evaluationStatus': e.EVALUATION_STATUS, + 'finalDecision': e.FINAL_DECISION, + 'decisionDate': e.DECISION_DATE, + 'recommendation': ( + SELECT JSON { + 'recommendId': rec.RECOMMEND_ID, + 'recommendation': rec.RECOMMENDATION, + 'fitScore': rec.FIT_SCORE, + 'riskLevel': rec.RISK_LEVEL, + 'explanation': rec.EXPLANATION, + 'strengths': rec.STRENGTHS, + 'missingInformation': rec.MISSING_INFORMATION, + 'generatedDate': rec.GENERATED_DATE, + 'supplier': ( + SELECT JSON { + 'supplierId': s.SUPPLIER_ID, + 'supplierName': s.SUPPLIER_NAME, + 'category': s.CATEGORY, + 'region': s.REGION, + 'email': s.EMAIL, + 'phone': s.PHONE_NUMBER, + 'active': s.ACTIVE, + 'capacityStatus': s.CAPACITY_STATUS, + 'capabilitySummary': s.CAPABILITY_SUMMARY + } + FROM CE_SUPPLIERS s + WHERE s.SUPPLIER_ID = rec.SUPPLIER_ID + ) + } + FROM CE_SUPPLIER_RECOMMENDATION rec WITH UPDATE + WHERE rec.RECOMMEND_ID = e.RECOMMEND_ID + ) + } + FROM CE_SUPPLIER_EVALUATION e WITH INSERT UPDATE DELETE + WHERE e.PROJECT_ID = p.PROJECT_ID + ] +} +FROM CE_PROJECTS p +WITH INSERT UPDATE DELETE; + +CREATE OR REPLACE PROPERTY GRAPH CONSTRUCTION_ENGINEERING_GRAPH + VERTEX TABLES ( + "CE_PROJECTS" KEY ("PROJECT_ID") PROPERTIES ("PROJECT_NAME", "LOCATION", "PROJECT_TYPE", "PROJECT_PHASE", "EVALUATION_STATUS"), + "CE_PROJECT_REQUIREMENTS" KEY ("REQUIREMENT_ID") PROPERTIES ("PROJECT_ID", "TRADE_CATEGORY", "MATERIAL_NEED", "REQUIRED_CERTIFICATION", "PROCUREMENT_URGENCY", "RISK_LEVEL"), + "CE_SUPPLIERS" KEY ("SUPPLIER_ID") PROPERTIES ("SUPPLIER_NAME", "CATEGORY", "REGION", "ACTIVE", "CAPACITY_STATUS"), + "CE_SUPPLIER_RECOMMENDATION" KEY ("RECOMMEND_ID") PROPERTIES ("PROJECT_ID", "SUPPLIER_ID", "RECOMMENDATION", "FIT_SCORE", "RISK_LEVEL"), + "CE_SUPPLIER_EVALUATION" KEY ("EVALUATION_ID") PROPERTIES ("PROJECT_ID", "RECOMMEND_ID", "EVALUATION_STATUS", "FINAL_DECISION"), + "CE_SUPPLIER_DEPENDENCIES" KEY ("DEPENDENCY_ID") PROPERTIES ("SUPPLIER_ID", "RELATED_SUPPLIER_ID", "DEPENDENCY_TYPE", "RISK_NOTE") + ) + EDGE TABLES ( + "CE_PROJECT_REQUIREMENTS" AS project_has_requirement + SOURCE KEY ("PROJECT_ID") REFERENCES "CE_PROJECTS"("PROJECT_ID") + DESTINATION KEY ("REQUIREMENT_ID") REFERENCES "CE_PROJECT_REQUIREMENTS"("REQUIREMENT_ID") + PROPERTIES ("TRADE_CATEGORY", "PROCUREMENT_URGENCY", "RISK_LEVEL"), + "CE_SUPPLIER_RECOMMENDATION" AS project_recommends_supplier + SOURCE KEY ("PROJECT_ID") REFERENCES "CE_PROJECTS"("PROJECT_ID") + DESTINATION KEY ("SUPPLIER_ID") REFERENCES "CE_SUPPLIERS"("SUPPLIER_ID") + PROPERTIES ("RECOMMEND_ID", "RECOMMENDATION", "FIT_SCORE", "RISK_LEVEL"), + "CE_SUPPLIER_EVALUATION" AS evaluation_for_project + SOURCE KEY ("PROJECT_ID") REFERENCES "CE_PROJECTS"("PROJECT_ID") + DESTINATION KEY ("EVALUATION_ID") REFERENCES "CE_SUPPLIER_EVALUATION"("EVALUATION_ID") + PROPERTIES ("EVALUATION_STATUS", "FINAL_DECISION"), + "CE_SUPPLIER_DEPENDENCIES" AS supplier_dependency + SOURCE KEY ("SUPPLIER_ID") REFERENCES "CE_SUPPLIERS"("SUPPLIER_ID") + DESTINATION KEY ("RELATED_SUPPLIER_ID") REFERENCES "CE_SUPPLIERS"("SUPPLIER_ID") + PROPERTIES ("DEPENDENCY_TYPE", "RISK_NOTE") + ); + +COMMIT; diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/23ai.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/23ai.png new file mode 100644 index 000000000..f3813785a Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/23ai.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/access.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/access.png new file mode 100644 index 000000000..d6c66033e Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/access.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/adb-available.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/adb-available.png new file mode 100644 index 000000000..b1b11f128 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/adb-available.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/app-home.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/app-home.png new file mode 100644 index 000000000..fb5261c9c Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/app-home.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/atp.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/atp.png new file mode 100644 index 000000000..d909cd92a Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/atp.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/click-streamlit.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/click-streamlit.png new file mode 100644 index 000000000..b0ebd1fa9 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/click-streamlit.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/click-url.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/click-url.png new file mode 100644 index 000000000..f50d7c815 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/click-url.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-1.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-1.png new file mode 100644 index 000000000..c98500919 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-1.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-2.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-2.png new file mode 100644 index 000000000..8c731e75c Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-2.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-3.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-3.png new file mode 100644 index 000000000..f74b22476 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-3.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-4.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-4.png new file mode 100644 index 000000000..2ebe060bd Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-4.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-5.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-5.png new file mode 100644 index 000000000..1be4511c6 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-5.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-6.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-6.png new file mode 100644 index 000000000..893cc180a Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-6.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-7.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-7.png new file mode 100644 index 000000000..b78a1f411 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-7.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-8.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-8.png new file mode 100644 index 000000000..9c112345f Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/code-highlight-8.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/connect-to-db.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/connect-to-db.png new file mode 100644 index 000000000..adc0c100f Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/connect-to-db.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/connectto-db.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/connectto-db.png new file mode 100644 index 000000000..db80f2bbb Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/connectto-db.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/create-adb.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/create-adb.png new file mode 100644 index 000000000..bc0941670 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/create-adb.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/create-adb2.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/create-adb2.png new file mode 100644 index 000000000..3f5c370e0 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/create-adb2.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/create-tables.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/create-tables.png new file mode 100644 index 000000000..3b35a1199 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/create-tables.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/create-vector.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/create-vector.png new file mode 100644 index 000000000..6bc96df56 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/create-vector.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/dbinit.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/dbinit.png new file mode 100644 index 000000000..d5f2749a9 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/dbinit.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/demo-db.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/demo-db.png new file mode 100644 index 000000000..11aa55d93 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/demo-db.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/dev-env.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/dev-env.png new file mode 100644 index 000000000..510af1b68 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/dev-env.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/fetch-customer.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/fetch-customer.png new file mode 100644 index 000000000..f1de35b2e Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/fetch-customer.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/jupyter-login.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/jupyter-login.png new file mode 100644 index 000000000..1834d777e Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/jupyter-login.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/jupyter-notebook.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/jupyter-notebook.png new file mode 100644 index 000000000..5603db8c2 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/jupyter-notebook.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/jupyter.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/jupyter.png new file mode 100644 index 000000000..76466e3d0 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/jupyter.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/lab4task1.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/lab4task1.png new file mode 100644 index 000000000..197d91e68 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/lab4task1.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/lab4task3.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/lab4task3.png new file mode 100644 index 000000000..540b60df7 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/lab4task3.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/lab4task4.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/lab4task4.png new file mode 100644 index 000000000..1a744b16e Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/lab4task4.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/launcher.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/launcher.png new file mode 100644 index 000000000..5be0ce713 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/launcher.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/loan-recommendation.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/loan-recommendation.png new file mode 100644 index 000000000..dd816f2dd Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/loan-recommendation.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/logical.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/logical.png new file mode 100644 index 000000000..a24369103 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/logical.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/login.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/login.png new file mode 100644 index 000000000..e4f8d9ebe Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/login.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/open-launcher.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/open-launcher.png new file mode 100644 index 000000000..cc5c04cdc Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/open-launcher.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/open-new-notebook.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/open-new-notebook.png new file mode 100644 index 000000000..56f7c4441 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/open-new-notebook.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/open-notebook.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/open-notebook.png new file mode 100644 index 000000000..e3704ea3f Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/open-notebook.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/open-terminal copy.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/open-terminal copy.png new file mode 100644 index 000000000..e192e5ac9 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/open-terminal copy.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/open-terminal.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/open-terminal.png new file mode 100644 index 000000000..e192e5ac9 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/open-terminal.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/oracle-database.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/oracle-database.png new file mode 100644 index 000000000..775a38407 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/oracle-database.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/password.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/password.png new file mode 100644 index 000000000..4c55bfe92 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/password.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/physical.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/physical.png new file mode 100644 index 000000000..b6e717ca2 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/physical.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/provisioning.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/provisioning.png new file mode 100644 index 000000000..500899f11 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/provisioning.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/rag.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/rag.png new file mode 100644 index 000000000..08edc563a Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/rag.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/run-script.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/run-script.png new file mode 100644 index 000000000..95c801f66 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/run-script.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/shell-script.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/shell-script.png new file mode 100644 index 000000000..dc43a8c45 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/shell-script.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/start-demo.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/start-demo.png new file mode 100644 index 000000000..16cdeb9ac Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/start-demo.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/tables.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/tables.png new file mode 100644 index 000000000..86c4dcd19 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/tables.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/tas2.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/tas2.png new file mode 100644 index 000000000..f36078a89 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/tas2.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/task2result.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/task2result.png new file mode 100644 index 000000000..b1c7267f9 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/task2result.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/task4recommendations.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/task4recommendations.png new file mode 100644 index 000000000..e29066d5b Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/task4recommendations.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/task5.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/task5.png new file mode 100644 index 000000000..afac6204c Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/task5.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/task6.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/task6.png new file mode 100644 index 000000000..584f2cf18 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/task6.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/task7.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/task7.png new file mode 100644 index 000000000..23fef08e9 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/task7.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/task7recs.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/task7recs.png new file mode 100644 index 000000000..0b0bbffee Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/task7recs.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/task7results.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/task7results.png new file mode 100644 index 000000000..fd8364c13 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/task7results.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/task8.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/task8.png new file mode 100644 index 000000000..15f05a377 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/task8.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/terminal.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/terminal.png new file mode 100644 index 000000000..39bdf7819 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/terminal.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/workshop_notebook.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/workshop_notebook.png new file mode 100644 index 000000000..c36e83ef3 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/workshop_notebook.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/build/images/yask5recs.png b/dev-ai-app-dev-constructioneng-aiexperience/build/images/yask5recs.png new file mode 100644 index 000000000..259805502 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/build/images/yask5recs.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/codingbasics.md b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/codingbasics.md new file mode 100644 index 000000000..0f254d572 --- /dev/null +++ b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/codingbasics.md @@ -0,0 +1,517 @@ +# Coding Basics on Oracle AI Database + +## Introduction + + +At Seer Holdings, developers are building a next-generation construction procurement system that needs to combine enterprise-grade data governance with modern AI capabilities. But before GenAI or vector search can be applied, one thing must be true: + +👉 The data must be in the right shape — accessible, trustworthy, and programmable. + +In this lab, you’ll act as a developer on the Seer Holdings data team. Your job is to build the foundational logic that powers the application’s intelligence layer. That means: + +- Creating and querying relational tables that represent real procurement and supplier data using Python +- Converting that data into **JSON documents** using **JSON Duality Views** +- Using **MongoDB-style syntax** via Oracle’s Mongo API to interact with the same data — without needing to duplicate or move it + +These capabilities make Oracle AI Database a **developer-friendly**, **multi-model platform**. You’ll write less glue code, eliminate data movement, and stay focused on the real task: powering intelligent construction procurement workflows. + +> 💡 Everything you implement here becomes the data foundation for Retrieval-Augmented Generation (RAG) and AI Vector Search in upcoming labs. + +Estimated Time: 30 minutes + +To get things started we invite you to watch this video and see the lab in action: + + [](videohub:1_v685fi7r:medium) + +### Objectives + +- Connect to Oracle AI Database using Python +- Create and query relational data +- Use JSON Duality Views to work with relational tables as JSON +- Query and update the same data using MongoDB-style syntax + +### Prerequisites + +This lab assumes you have: + +- An Oracle account with LiveLabs access +- Completion of **Lab 1: Connect to the Development Environment** +- Basic familiarity with Python and SQL + + +## Task 1: Create a new Jupyter Notebook + +All of the coding examples will be executed in a new Jupyter Notebook. + +1. In **JupyterLab**, click the blue **+** to open the Launcher +2. Start a new **Python (ipykernel)** notebook + + ![Open Jupyter Notebook](./images/open-new-notebook.png " ") + +## Task 2: Connect to the database using Python + +In this first task, you will connect to an Oracle AI Database instance using Oracle's Python driver, `oracledb`. `oracledb` is available in PyPi (`pip install oracledb`) and supports in its latest version all of the advanced features of the Oracle AI Database, including JSON and VECTOR. + +1. In the newly created Jupyter Notebook, copy and paste the following code block into an empty cell. This code block imports the `oracledb` Python driver and other libraries that help us to securely read credentials from the environment variables. + + ```python + + import os + from dotenv import load_dotenv + import oracledb + + load_dotenv() + + username = os.getenv("USERNAME") + password = os.getenv("DBPASSWORD") + dsn = os.getenv("DBCONNECTION") + + try: + connection = oracledb.connect(user=username, password=password, dsn=dsn) + print("Connection successful!") + except Exception as e: + print(f"Connection failed: {e}") + + cursor = connection.cursor() + + ``` + +2. Execute the cell by entering **shift + enter** or clicking on the play button. + +3. You should see a message that says "Connection successful!" in your notebook. If you do not, check the credentials and try again. + + ![connect](./images/connect.png " ") + + > **Note:** The last line, `cursor = connection.cursor()`, creates + > a cursor object from the established Oracle AI Database + > connection. A cursor acts as a control structure that enables the + > execution of SQL queries and retrieval of results from the + > database. It is essential for sending SQL commands, fetching + > data, and iterating through query results. We will be using the + > cursor object in later steps of this lab. The object persists in + > the notebook session, so you can use it in subsequent cells + > without re-establishing the connection. + +## Task 3: Create tables and insert data + +Now, that we have established a connection, we can start creating our tables and inserting some sample data. We will create two sample tables (`orders` and `customers`) in our database. We will also insert some sample data into these tables. + +1. In a new cell, enter the following code to create the `orders_demo` table and insert some sample data: + + ```python + + # Create a table to hold orders and insert some data + try: + with connection.cursor() as cursor: + cursor.execute(""" + drop table if exists orders_demo + """) + cursor.execute(""" + create table if not exists orders_demo + (id number generated by default on null as identity, + product_id number, + order_date timestamp, + customer_id number, + total_value number(6,2), + order_shipped boolean, + warranty interval year to month)""") + cursor.execute(""" + insert into orders_demo (product_id, order_date, customer_id, total_value, order_shipped, warranty) + values + (12, systimestamp, 100001, 10.23, true, interval '2-0' year to month), + (234, systimestamp, 223223, 1200.00, false, interval '1-6' year to month), + (57, systimestamp, 238121, 110.1, True, interval '5-0' year to month), + (2, systimestamp, 78993, 20.50, null, interval '0-6' year to month) + """) + connection.commit() + print("Success!") + except oracledb.DatabaseError as e: + print(f"Error: {e}") + + ``` + +2. Let's now create some code that allows us to query our table. + + ```python + + def query_orders(): + with connection.cursor() as cursor: + cursor.execute("select * from orders_demo") + rows = cursor.fetchall() + for row in rows: + print(row) + + query_orders() + + ``` + + > **Note:** We are creating a function called `query_orders()` + > that will allow us to query our table. We can use the same + > function in one of the following tasks. + +3. Run your code (**shift+enter**) and see what happens. You should get a list of all the orders in our table. + + ![query orders](./images/query-orders.png " ") + +4. Next, let's add another table `customers_demo` with some sample data. Copy & paste the following code in a **new cell** and run it. + + ```python + + # Create a table to hold customers and insert some data + try: + with connection.cursor() as cursor: + cursor.execute(""" + drop table if exists customers_demo + """) + cursor.execute(""" + create table if not exists customers_demo ( + id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY, + first_name VARCHAR2(100), + last_name VARCHAR2(100), + email VARCHAR2(320), + address VARCHAR2(80), + phone_number VARCHAR2(20)) + """) + cursor.execute(""" + insert into customers_demo (id, first_name, last_name, email, address, phone_number) + values + (100001, 'Dan', 'Thompson', 'dt7889@gmail.com', '10 smith street', '34454-1667'), + (223223, 'John', 'Smith', 'jsmith@hotmail.com', 'the grove', '28902'), + (238121, 'Janet', 'White', 'jw123@gmail.com', 'apartment 256, 120 east street', '18092-7980'), + (78993, 'Sue', 'Gray', 'sue_gray@testmail.com', '2345 main street', '34454') + """) + connection.commit() + print("Success!") + except oracledb.DatabaseError as e: + print(f"Error: {e}") + + ``` + +5. As before, we want to create a function that allows us to query our new table. We will use a function called `query_customer`. Copy & paste the following code into a **new cell** and execute it. + + ```python + + def query_customers(): + with connection.cursor() as cursor: + cursor.execute("select * from customers_demo") + rows = cursor.fetchall() + for row in rows: + print(row) + query_customers() + + ``` + + ![query customers](./images/task3.png " ") + + ### **Task Summary** + + Congratulations! You successfully created two new tables with + sample data using Python and Oracle AI Database. + + You also created a function that allows you to query your new table + which we will use in some of the following tasks. + +## Task 4: Create a JSON Duality View + +Next, we want to explore how we can use a **JSON Duality View** to query our new table. A JSON Duality View allows us to interact with data as JSON objects, i.e., data is stored as documents. Unlike a regular view, we can also update data in a JSON Duality View. Any updates will be reflected in our original relational tables. We will create a JSON Duality View using our newly created tables `customers_demo` and `orders_demo`. + +1. Before we create the **JSON Duality View**, we need to add some **constraints** to our new tables. Copy & paste the following code into a **new cell** and run it. + + ```python + + # Create required constraints to prepare JSON Duality View + try: + with connection.cursor() as cursor: + cursor.execute(""" + alter table customers_demo add (constraint customers_pk primary key (id)) + """) + cursor.execute(""" + alter table orders_demo add (constraint orders_pk primary key (id)) + """) + cursor.execute(""" + alter table orders_demo add (constraint orders_fk FOREIGN KEY (customer_id) REFERENCES customers_demo (id)) + """) + connection.commit() + print("All constraints created.") + except oracledb.DatabaseError as e: + print(f"Error: {e}") + + ``` + + ![constraints](./images/constraints.png " ") + +2. Now we can create our **JSON Duality View**. Copy the following code into a new cell and run it. + + ```python + + # Create JSON Duality View + try: + with connection.cursor() as cursor: + cursor.execute(""" + drop view if exists customers_dv + """) + cursor.execute(""" + CREATE or REPLACE JSON RELATIONAL DUALITY VIEW customers_dv AS + customers_demo @insert @update @delete + {_id : id + FirstName : first_name + LastName : last_name + Email : email + Address : address + Phone : phone_number + orders : orders_demo @insert @update @delete + [ {OrderID : id + ProductID : product_id + OrderDate : order_date + TotalValue : total_value + OrderShipped : order_shipped + } ] + } + """) + connection.commit() + print("JSON Duality View created") + except oracledb.DatabaseError as e: + print(f"Error: {e}") + + ``` + + ![dv](./images/dv.png " ") + + > 💡 **JSON Duality Views** automatically maps relational columns + > to JSON documents (and vice versa) in the same table, letting you + > store data in a traditional schema but also access it as if it + > were a JSON object. So even though you have coded a JSON view in + > Python, you can switch over to standard SQL queries without + > duplicating data or maintaining extra structures. + +3. Let's create a new function that allows us to query our new JSON Duality View. This time however, we will enhance our function to allow using input parameters. Instead of retrieving all rows, we want to write a function that returns only a specific row based on the first name of a customer. Copy the following code into a new cell and run it. + + ```python + + import json + + def query_dv(first_name): + with connection.cursor() as cursor: + query = """ + SELECT * FROM customers_dv c + WHERE JSON_EXISTS(c.data, '$[*]?(@.FirstName == $first_name)' PASSING :first_name AS "first_name") + """ + cursor.execute(query, {"first_name": first_name}) + rows = cursor.fetchall() + for row in rows: + raw_json = row[0] + try: + print(json.dumps(raw_json, default=str, indent=4)) + except Exception as e: + print(f"Error formatting JSON: {e}") + print(raw_json) + + query_dv("Dan") + + ``` + + ![dv](./images/task4-1.png " ") + + You notice that our code has some significant changes. We are now passing a parameter into our query, and we are also formatting the output of our query. Let's have a closer look: + + 🔴 **`import json`** - This is a Python module that allows us to work with JSON. Remember: JSON Duality Views present data in document format, i.e., JSON. + + 🔴 **`query_dv(first_name)`** - This is a function that takes in a parameter and returns the result of our query. We are passing in `first_name` as a parameter, which we can use to filter our results. + + 🔴 **`...WHERE JSON_EXISTS...`** - This is an Oracle AI Database function called `JSON_EXISTS`, which allows us to check if a specific key exists in a JSON object. In this case, we are checking if the `first_name` key exists in our JSON document. Essentially, `JSON_EXISTS` function allows use to use SQL syntax to check if a key exists in a JSON object. + + 🔴 **`json.dumps(raw_json, default=str, indent=4)`** - This is a Python function that formats our output. We are passing in the `raw_json` variable as an argument and formatting it with the `default=str` parameter. + + 🔴 **`query_dv("Dan")`** - Here we are calling our query function again, but this time passing in the string `"Dan"` as a parameter. This will return all rows where `first_name` is equal to `"Dan"`. The result is displayed in JSON format. + + > **Note:** Notice that our output is a nicely formatted document + > that now not only includes our customer data but also all orders + > for that customer. + +## Task 5: Connect to the database using pymongo + +Next, we will connect to our database and query the data using a the Python driver `pymongo`. That way we can interact with Oracle AI Database using Mongo API which allows us to use the same syntax as MongoDB. We will also learn how to update our database using `pymongo` in a following task. + +1. Copy & paste the following code into a new cell and run it. + + ```python + + from pymongo import MongoClient + + def mongo_connect(): + try: + client = MongoClient( + os.getenv("MONGODBAPI") + ) + db = client["admin"] + print("Connected using MongoAPI!") + return db + except Exception as e: + print(f"Connection failed: {e}") + + mongo_connect() + + ``` + + ![dv](./images/mongo-connect.png " ") + + +## Task 6: Query data using Oracle's Mongo API + +Now, that we have established a connection to Oracle AI Database via Mongo API, let's try to query the database using MongoDB syntax. Let's write a function that will help us do this. + +1. Copy & paste the following code into a new cell and run it. + + ```python + + def get_mongo(first_name): + col = mongo_connect().CUSTOMERS_DV + mongo_data = col.find_one({"FirstName": first_name}) + return mongo_data + + get_mongo("Dan") + + ``` + + ![dv](./images/task6.png " ") + + As you can see, the result matches that of the SQL query (`query_dv()`), though the MongoDB syntax requires significantly less code. + +## Task 7: Update data using Oracle's Mongo API + +Next, let's update some data in our database using MongoDB syntax. Let's write a function that will help us do this. + +1. We want to change the email address of our customer "Dan" to "dant@aol.com". Copy & paste the following code into a **new cell** and run it. + + ```python + + def update_mongo(): + col = mongo_connect().CUSTOMERS_DV + col.update_one({"FirstName": "Dan"}, {"$set": {"Email": "dant@aol.com"}}) + return + + update_mongo() + + ``` + +2. Now, let's run our function from task 5 to see if the data was actually updated. Copy the following code into a new cell and run it. + + ```python + + get_mongo("Dan") + + ``` + + And indeed, we can see that the email address has been updated. + + + ![dv](./images/task7-1.png " ") + + +3. What if we want to do something more complex, for example updating a nested field? For example, let's say we want to change TotalValue field. Copy the following code into a new cell and run it. + + ```python + + def update_mongo_order(): + col = mongo_connect().CUSTOMERS_DV + col.update_one( + { + "FirstName": "Dan", + "orders.OrderID": 1.0 + }, + { + "$set":{"orders.$.TotalValue": 100} + } + ) + return + update_mongo_order() + + ``` + +4. Let's check what happened by running a query on the JSON Duality view. Copy the following code into a new cell and run it. + + ```python + + get_mongo("Dan") + + ``` + + ![mongo query total value](./images/task7-3.png " ") + + You should see that the TotalValue field has been updated from 10.23 to 100.0. + +## Task 8: Query relational tables to verify updates made through JSON Duality View + +The final step in our basic coding tour with Python and the Oracle AI Database is to query the two relational tables we created earlier. We just updated the JSON Duality view, so let's run a query on it to see if the changes were reflected. Remember that we created two functions in the beginning of this lab: `query_customers()` and `query_orders()`. Let's use these functions to get our data from MongoDB and update it with the new email address. + +1. First, run the ``query_customers()` function in a new cell + + ```python + + query_customers() + + ``` + + ![customer table after update](./images/task8.png " ") + + You can see that also in the relational `customers_demo` table, the email address has been updated. + +2. Next, run the `query_orders()` function in a new cell. + + ```python + + query_orders() + + ``` + + ![orders table after update](./images/task8.2.png " ") + + You can see that also in the relational `orders_demo` table, the total value has been updated. + +3. Finally, let's create a new function that allows us to see both tables at once, i.e., we want to join `customers` and `orders` tables together. The function should also allow us to filter by the first name of the customer. Furthermore, the result should be nicely formatted in a table including column headers. We need to create a new cell with the following code: + + ```python + + import pandas as pd + + def query_customers_with_orders(first_name): + with connection.cursor() as cursor: + query = """ + SELECT * + FROM customers_demo c + JOIN orders_demo o ON c.id = o.customer_id + WHERE c.first_name = :first_name + """ + cursor.execute(query, {"first_name": first_name}) + rows = cursor.fetchall() + column_names = [desc[0] for desc in cursor.description] + df = pd.DataFrame(rows, columns=column_names) + return df + + df = query_customers_with_orders("Dan") + df.head() + + ``` + + ![join tables](./images/task8-last.png " ") + + As you can see we included some new features in our function. Let's have a closer look: + + 🔴 **`import pandas as pd`** - This is a Python module that allows us to work with Pandas DataFrames. We will be using this module to format our output. + + 🔴 **` column_names`** - This is a list of column names returned by our query which is a list of strings included in the cursor object returned by our query. + + 🔴 **`df.head()`** - This is a method that returns that returns the result of the query including the column names. + +## Conclusion + +As a developer at Seer Holdings, you've just built the foundation for a GenAI-powered construction procurement system. We learned how to use Python and Oracle's Python driver `oracledb` to interact with Oracle AI Database's new features. You learned how to use the `cursor` object to execute SQL queries. Using the `cursor` object, you created a **JSON Duality View** and used JSON functions to query documents with SQL syntax. Then, you also learned how to connect to the database using `pymongo` and retrieve data from a table in the database using **MongoDB syntax**. You created functions to update the **JSON Duality View** and learned how those updates are also reflected in the underlying relational database tables. + +This architecture eliminates the need for duplicating data across platforms and simplifies how developers build AI-ready applications. Whether you're calling SQL, working with JSON, or speaking Mongo, you're always working with a single source of truth inside the Oracle AI Database. + +In the next lab, you'll build on this foundation to implement Retrieval-Augmented Generation (RAG), create vector embeddings, and generate personalized procurement recommendations with Oracle AI Database and OCI Generative AI. + +## Acknowledgements +* **Authors** - Linda Foinding +* **Contributors** - Francis Regalado +* **Last Updated By/Date** - Linda Foinding, October 2025 diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/click-streamlit.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/click-streamlit.png new file mode 100644 index 000000000..b0ebd1fa9 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/click-streamlit.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/connect.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/connect.png new file mode 100644 index 000000000..a70bfe8b4 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/connect.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/constraints.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/constraints.png new file mode 100644 index 000000000..7468dbae1 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/constraints.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/dv.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/dv.png new file mode 100644 index 000000000..ee50bc9aa Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/dv.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/join.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/join.png new file mode 100644 index 000000000..a8881df3c Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/join.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/mongo-connect.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/mongo-connect.png new file mode 100644 index 000000000..0bf144fe7 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/mongo-connect.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/mongo-query.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/mongo-query.png new file mode 100644 index 000000000..0595e2a60 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/mongo-query.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/mongo-query2.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/mongo-query2.png new file mode 100644 index 000000000..ab2f7fc9e Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/mongo-query2.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/mongo-update.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/mongo-update.png new file mode 100644 index 000000000..45373fd5b Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/mongo-update.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/open-new-notebook.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/open-new-notebook.png new file mode 100644 index 000000000..be68d97f1 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/open-new-notebook.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/query-cust-update.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/query-cust-update.png new file mode 100644 index 000000000..becf52b89 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/query-cust-update.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/query-customers.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/query-customers.png new file mode 100644 index 000000000..bbda7b7b9 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/query-customers.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/query-dv.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/query-dv.png new file mode 100644 index 000000000..dff027ae8 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/query-dv.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/query-orders-update.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/query-orders-update.png new file mode 100644 index 000000000..e02262648 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/query-orders-update.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/query-orders.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/query-orders.png new file mode 100644 index 000000000..4cd934076 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/query-orders.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task3.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task3.png new file mode 100644 index 000000000..a89b3afc2 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task3.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task4-1.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task4-1.png new file mode 100644 index 000000000..f7a56ff4c Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task4-1.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task6.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task6.png new file mode 100644 index 000000000..c8a85707c Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task6.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task7-1.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task7-1.png new file mode 100644 index 000000000..e4ab9935a Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task7-1.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task7-2.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task7-2.png new file mode 100644 index 000000000..849685328 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task7-2.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task7-3.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task7-3.png new file mode 100644 index 000000000..2d238caa8 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task7-3.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task8-last.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task8-last.png new file mode 100644 index 000000000..da14b97a2 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task8-last.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task8.2.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task8.2.png new file mode 100644 index 000000000..730be04db Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task8.2.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task8.png b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task8.png new file mode 100644 index 000000000..1f168a679 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/codingbasics/images/task8.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/introduction/images/vectors-diagram.png b/dev-ai-app-dev-constructioneng-aiexperience/introduction/images/vectors-diagram.png new file mode 100644 index 000000000..8c2b618e1 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/introduction/images/vectors-diagram.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/introduction/introduction.md b/dev-ai-app-dev-constructioneng-aiexperience/introduction/introduction.md new file mode 100644 index 000000000..168b31186 --- /dev/null +++ b/dev-ai-app-dev-constructioneng-aiexperience/introduction/introduction.md @@ -0,0 +1,61 @@ +# Introduction + +## About this Workshop + +Construction procurement runs on connected decisions. Project requirements, supplier qualifications, compliance documents, schedules, budgets, and risk signals all need to come together quickly if teams want to avoid delays and make confident award decisions. + +SeerGroup is a global conglomerate with multiple divisions. Across those divisions, the challenge is the same: **critical decisions take too long** because data is scattered across spreadsheets, documents, forms, and disconnected systems. + +This workshop shows how Seer Construction addresses that problem with Oracle AI Database + OCI Generative AI. By keeping procurement data in one place, the team reduces brittle integrations and gives procurement officers, engineers, and managers a single platform for faster reviews, clearer supplier recommendations, and better project outcomes. + +You’ll see how Seer Construction moves from manual, fragmented procurement workflows to AI-powered applications, and you’ll build the same capabilities yourself in the labs that follow. + +Estimated Workshop Time: 90 minutes + +✅ **Start with the demo! (Lab 1)** + +Step into Seer Construction’s Construction Engineering division as a construction procurement officer. You’ll use an AI-powered construction procurement app built on Oracle AI Database to: + +* Review project procurements with AI Vector Search, Graph analytics, and RAG +* See how Generative AI evaluates project requirements, risk, and supplier readiness against available supplier options +* Approve, deny, or request more information with AI-generated guidance, risk factors, and decision summaries +* Update procurement profiles using JSON Duality Views so project data stays consistent + +This story shows how Seer Construction uses Oracle AI Database and OCI Generative AI to accelerate procurement review, reduce supplier risk, and improve decision quality without moving data across fragile systems. + +✅ **What’s next (Labs 2–3)** + +After the demo, you’ll switch roles to developer. In the next labs you’ll connect to Oracle AI Database, shape data into JSON Duality Views, build a retrieval-augmented application, and extend it with reusable MCP tools. By the end, you’ll see how SeerGroup teams can move from siloed procurement processes to intelligent, AI-driven applications on one platform. + +* **Lab 2 – Connect to your environment** +Log in to the JupyterLab IDE where you’ll write Python and run your code. Build the data foundation by using Python with Oracle AI Database to create tables, shape them into JSON Duality Views, and interact with them using both SQL and MongoDB-style syntax. Implement RAG by constructing a working AI application that pulls procurement and supplier data, generates recommendations with OCI Generative AI, chunks and vectorizes the results, and answers follow-up questions with Vector Search + RAG. + +* **Lab 3 – Extend with MCP tools** +Wire Oracle AI Database and OCI Generative AI into reusable MCP tools. Call them from notebooks, chain them together into workflows, and register tools that support SeerGroup’s construction, retail, healthcare, or energy teams. + +By the end, you’ll have a complete toolkit, from clean procurement data to live AI apps to composable tools, that shows how SeerGroup divisions can turn operational data into intelligent applications. + +### Objectives + +* Build and query data with Python + Oracle AI Database +* Shape relational data into documents using JSON Duality Views +* Run Vector Search, Graph analytics, and RAG directly in the database +* Extend apps with OCI Generative AI and MCP tools +* Deliver industry-grade solutions for SeerGroup’s divisions + +### Prerequisites + +This lab assumes you have: + +* An Oracle account to submit your LiveLabs Sandbox reservation +* Basic knowledge of Python +* Basic knowledge of Oracle Database, including how to run queries + +## Learn More + +* [Oracle AI Database Documentation](https://docs.oracle.com/en/database/oracle/oracle-database/23/) + +## Acknowledgements +* **Authors** - Uma Kumar +* **Contributors** - Linda Foinding +* **Last Updated By/Date** - Taylor Zheng, Uma Kumar, Deion Locklear, Daniet Hart, July 2026 diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/2025-07-16_15-51-38.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/2025-07-16_15-51-38.png new file mode 100644 index 000000000..9db6ae873 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/2025-07-16_15-51-38.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/adb-ocid.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/adb-ocid.png new file mode 100644 index 000000000..b82b8f674 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/adb-ocid.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/adb-provisioned.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/adb-provisioned.png new file mode 100644 index 000000000..a77c5449a Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/adb-provisioned.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/adb-provisioning.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/adb-provisioning.png new file mode 100644 index 000000000..50c8b0569 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/adb-provisioning.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/adb-workload-type.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/adb-workload-type.png new file mode 100644 index 000000000..da702fd88 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/adb-workload-type.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/add-ingress-rules-all.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/add-ingress-rules-all.png new file mode 100644 index 000000000..8ada1de01 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/add-ingress-rules-all.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/add-ingress-rules.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/add-ingress-rules.png new file mode 100644 index 000000000..051c41cf5 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/add-ingress-rules.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/add-key.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/add-key.png new file mode 100644 index 000000000..75da606fc Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/add-key.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/added-policy.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/added-policy.png new file mode 100644 index 000000000..7c3c85969 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/added-policy.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/application-dashboard.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/application-dashboard.png new file mode 100644 index 000000000..9bec8879f Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/application-dashboard.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/application-start-screen.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/application-start-screen.png new file mode 100644 index 000000000..b495df6fb Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/application-start-screen.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/atp-detail-review.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/atp-detail-review.png new file mode 100644 index 000000000..ee6b84841 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/atp-detail-review.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/atp-security-mtls.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/atp-security-mtls.png new file mode 100644 index 000000000..c7a7e00c8 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/atp-security-mtls.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/basic-information.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/basic-information.png new file mode 100644 index 000000000..decae1769 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/basic-information.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/begin-oci-menu.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/begin-oci-menu.png new file mode 100644 index 000000000..f311ac185 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/begin-oci-menu.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/chicago-region.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/chicago-region.png new file mode 100644 index 000000000..977a01ad9 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/chicago-region.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/choose-autonomous.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/choose-autonomous.png new file mode 100644 index 000000000..3d6742b5f Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/choose-autonomous.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-add-api-key.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-add-api-key.png new file mode 100644 index 000000000..147459e7d Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-add-api-key.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-add-ingress-rules.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-add-ingress-rules.png new file mode 100644 index 000000000..3457b1426 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-add-ingress-rules.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-create-instance.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-create-instance.png new file mode 100644 index 000000000..0015cc0c3 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-create-instance.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-default-security-list.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-default-security-list.png new file mode 100644 index 000000000..bbc00d783 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-default-security-list.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-default-security.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-default-security.png new file mode 100644 index 000000000..8b71a42c5 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-default-security.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-generative-ai.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-generative-ai.png new file mode 100644 index 000000000..41f3c3ad6 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-generative-ai.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-security-list.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-security-list.png new file mode 100644 index 000000000..cdaae1f65 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-security-list.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-subnet.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-subnet.png new file mode 100644 index 000000000..2de22c481 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-subnet.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-tenancy.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-tenancy.png new file mode 100644 index 000000000..93b516cff Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-tenancy.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-user-settings.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-user-settings.png new file mode 100644 index 000000000..bb3eb937a Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-user-settings.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-vcn.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-vcn.png new file mode 100644 index 000000000..c9d2ab999 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/click-vcn.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/compartment-name.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/compartment-name.png new file mode 100644 index 000000000..0a844530b Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/compartment-name.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/compartment.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/compartment.png new file mode 100644 index 000000000..ca806fee5 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/compartment.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/compartments.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/compartments.png new file mode 100644 index 000000000..a9df1c6d1 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/compartments.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/config-file.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/config-file.png new file mode 100644 index 000000000..e64d3e982 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/config-file.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/configure-db.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/configure-db.png new file mode 100644 index 000000000..ade9ffc90 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/configure-db.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/connection-string.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/connection-string.png new file mode 100644 index 000000000..5086c4124 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/connection-string.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/contact-email-field.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/contact-email-field.png new file mode 100644 index 000000000..74dece2e5 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/contact-email-field.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-api-key.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-api-key.png new file mode 100644 index 000000000..a58b6a952 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-api-key.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-compartment-ocid.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-compartment-ocid.png new file mode 100644 index 000000000..d430c5982 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-compartment-ocid.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-connection-string.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-connection-string.png new file mode 100644 index 000000000..34482fe0b Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-connection-string.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-env-file.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-env-file.png new file mode 100644 index 000000000..68feac643 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-env-file.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-ip.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-ip.png new file mode 100644 index 000000000..fa6eae223 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-ip.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-ocid.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-ocid.png new file mode 100644 index 000000000..00839ea05 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-ocid.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-tenancy-ocid.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-tenancy-ocid.png new file mode 100644 index 000000000..640afdfd6 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/copy-tenancy-ocid.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-adb-button.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-adb-button.png new file mode 100644 index 000000000..2c0e68a74 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-adb-button.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-adb-form.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-adb-form.png new file mode 100644 index 000000000..839395d82 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-adb-form.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-adb.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-adb.png new file mode 100644 index 000000000..4c3c1d054 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-adb.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-admin.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-admin.png new file mode 100644 index 000000000..e8da36227 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-admin.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-four-files.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-four-files.png new file mode 100644 index 000000000..c856c66a0 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-four-files.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-2.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-2.png new file mode 100644 index 000000000..c5d386b72 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-2.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-3.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-3.png new file mode 100644 index 000000000..0044cab29 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-3.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-4.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-4.png new file mode 100644 index 000000000..4594a60b1 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-4.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-5.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-5.png new file mode 100644 index 000000000..5c1527056 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-5.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-6.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-6.png new file mode 100644 index 000000000..83c5b3438 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-6.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-7.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-7.png new file mode 100644 index 000000000..acbdf4688 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-7.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-8.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-8.png new file mode 100644 index 000000000..08bc25ed7 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-8.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-succeeded.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-succeeded.png new file mode 100644 index 000000000..785ce7d36 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance-succeeded.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance.png new file mode 100644 index 000000000..056ad088d Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-instance.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-policy.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-policy.png new file mode 100644 index 000000000..43fc6e742 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-policy.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-subnet.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-subnet.png new file mode 100644 index 000000000..52f91c498 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-subnet.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-vcn.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-vcn.png new file mode 100644 index 000000000..aa85c0ea9 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/create-vcn.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/db-connection.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/db-connection.png new file mode 100644 index 000000000..6c6e799d7 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/db-connection.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/default-security-list-final.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/default-security-list-final.png new file mode 100644 index 000000000..8b5022880 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/default-security-list-final.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/deployment-type-serverless.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/deployment-type-serverless.png new file mode 100644 index 000000000..34a661762 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/deployment-type-serverless.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/download-private-key.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/download-private-key.png new file mode 100644 index 000000000..d36a2b455 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/download-private-key.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/enable-firewall.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/enable-firewall.png new file mode 100644 index 000000000..e8553c2b6 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/enable-firewall.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/env-credentials.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/env-credentials.png new file mode 100644 index 000000000..5a43f5942 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/env-credentials.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/env-file-copy.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/env-file-copy.png new file mode 100644 index 000000000..a5228a1e9 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/env-file-copy.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/env-file.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/env-file.png new file mode 100644 index 000000000..9db6ae873 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/env-file.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/find-configuration-file.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/find-configuration-file.png new file mode 100644 index 000000000..f62b21968 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/find-configuration-file.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/folder.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/folder.png new file mode 100644 index 000000000..8d7471fe5 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/folder.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/generate-public-keys.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/generate-public-keys.png new file mode 100644 index 000000000..e002eca6b Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/generate-public-keys.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/generate-ssh-keys.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/generate-ssh-keys.png new file mode 100644 index 000000000..23857608a Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/generate-ssh-keys.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/graph-endpoint.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/graph-endpoint.png new file mode 100644 index 000000000..854332bef Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/graph-endpoint.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/ingress-rule-1.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/ingress-rule-1.png new file mode 100644 index 000000000..f6d5e968e Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/ingress-rule-1.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/ingress-rule-2.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/ingress-rule-2.png new file mode 100644 index 000000000..87aac3cb6 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/ingress-rule-2.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/ingress-rule-3.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/ingress-rule-3.png new file mode 100644 index 000000000..ea608275c Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/ingress-rule-3.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/ingress-rule-4.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/ingress-rule-4.png new file mode 100644 index 000000000..62d468b33 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/ingress-rule-4.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/ingress-rule-5.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/ingress-rule-5.png new file mode 100644 index 000000000..a63bfa33d Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/ingress-rule-5.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/ingress-rule-6.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/ingress-rule-6.png new file mode 100644 index 000000000..0445c35e7 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/ingress-rule-6.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/key-preview.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/key-preview.png new file mode 100644 index 000000000..1f756270b Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/key-preview.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/license.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/license.png new file mode 100644 index 000000000..af06ef3ec Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/license.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/login-with-ssh-key.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/login-with-ssh-key.png new file mode 100644 index 000000000..358d1504c Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/login-with-ssh-key.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/name-the-vnic.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/name-the-vnic.png new file mode 100644 index 000000000..d8791d154 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/name-the-vnic.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/name-vnic-confirm.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/name-vnic-confirm.png new file mode 100644 index 000000000..c9c6bc403 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/name-vnic-confirm.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/network-access.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/network-access.png new file mode 100644 index 000000000..5ed401471 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/network-access.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/oci-api-key.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/oci-api-key.png new file mode 100644 index 000000000..56515a266 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/oci-api-key.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/oci-config.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/oci-config.png new file mode 100644 index 000000000..f7d22e4e6 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/oci-config.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/open-terminal.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/open-terminal.png new file mode 100644 index 000000000..43811114f Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/open-terminal.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/paste-ssh-key.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/paste-ssh-key.png new file mode 100644 index 000000000..735f5191b Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/paste-ssh-key.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/policies.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/policies.png new file mode 100644 index 000000000..6d9475af2 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/policies.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/policy-info.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/policy-info.png new file mode 100644 index 000000000..9833d50d6 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/policy-info.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/policy.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/policy.png new file mode 100644 index 000000000..448f76c10 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/policy.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/private-key.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/private-key.png new file mode 100644 index 000000000..a5e6c721e Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/private-key.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/provisioning-atp.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/provisioning-atp.png new file mode 100644 index 000000000..aa1ebccb2 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/provisioning-atp.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/python-version-installed.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/python-version-installed.png new file mode 100644 index 000000000..79a95c848 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/python-version-installed.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/python-version.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/python-version.png new file mode 100644 index 000000000..b1d1ef8a7 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/python-version.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/region.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/region.png new file mode 100644 index 000000000..e5c4c766b Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/region.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/requirements.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/requirements.png new file mode 100644 index 000000000..40640b8bb Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/requirements.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/review-basic-information.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/review-basic-information.png new file mode 100644 index 000000000..c461e041d Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/review-basic-information.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/select-atp.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/select-atp.png new file mode 100644 index 000000000..b458754fa Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/select-atp.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/select-compartment.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/select-compartment.png new file mode 100644 index 000000000..3f8ac34a6 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/select-compartment.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/select-compute.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/select-compute.png new file mode 100644 index 000000000..b6004fea6 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/select-compute.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/select-instances.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/select-instances.png new file mode 100644 index 000000000..ce125294d Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/select-instances.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/select-vcn.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/select-vcn.png new file mode 100644 index 000000000..3dd3d0ed5 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/select-vcn.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/select-your-adb.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/select-your-adb.png new file mode 100644 index 000000000..697662dd0 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/select-your-adb.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/show-editor.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/show-editor.png new file mode 100644 index 000000000..4b35857f6 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/show-editor.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/start-vcn-wizard.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/start-vcn-wizard.png new file mode 100644 index 000000000..c4905c746 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/start-vcn-wizard.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/start-vcn-wizard2.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/start-vcn-wizard2.png new file mode 100644 index 000000000..6f8cac9ef Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/start-vcn-wizard2.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/streamlit-service-file.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/streamlit-service-file.png new file mode 100644 index 000000000..43da57c6b Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/streamlit-service-file.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/subnet-blocks.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/subnet-blocks.png new file mode 100644 index 000000000..cd48396ba Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/subnet-blocks.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/subnet-create.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/subnet-create.png new file mode 100644 index 000000000..3fa98e293 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/subnet-create.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/subnet-dns.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/subnet-dns.png new file mode 100644 index 000000000..86c6883f8 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/subnet-dns.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/subnet-name.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/subnet-name.png new file mode 100644 index 000000000..e5c75221d Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/subnet-name.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/subnet-type.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/subnet-type.png new file mode 100644 index 000000000..645f9a479 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/subnet-type.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/tokens-keys.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/tokens-keys.png new file mode 100644 index 000000000..f2f9d3c3e Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/tokens-keys.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/upload-public-keys.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/upload-public-keys.png new file mode 100644 index 000000000..e002eca6b Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/upload-public-keys.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/user-ocid.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/user-ocid.png new file mode 100644 index 000000000..ef182f3a6 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/user-ocid.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/user-settings.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/user-settings.png new file mode 100644 index 000000000..244b45ed7 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/user-settings.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/vcn-available.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/vcn-available.png new file mode 100644 index 000000000..9f0864092 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/vcn-available.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/vcn-blocks.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/vcn-blocks.png new file mode 100644 index 000000000..be4f6c7f0 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/vcn-blocks.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/vcn-create.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/vcn-create.png new file mode 100644 index 000000000..ac265dd45 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/vcn-create.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/vcn-details.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/vcn-details.png new file mode 100644 index 000000000..128d77ba1 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/vcn-details.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/vcn-dns.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/vcn-dns.png new file mode 100644 index 000000000..d89baad4c Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/vcn-dns.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/vcn-name.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/vcn-name.png new file mode 100644 index 000000000..189261938 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/vcn-name.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/verify-subnet.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/verify-subnet.png new file mode 100644 index 000000000..1d05a3a0f Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/verify-subnet.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/virtual-environment.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/virtual-environment.png new file mode 100644 index 000000000..e4bf733ee Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/virtual-environment.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/your-tenancy-name-2.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/your-tenancy-name-2.png new file mode 100644 index 000000000..70309b7aa Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/your-tenancy-name-2.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/your-tenancy-name.png b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/your-tenancy-name.png new file mode 100644 index 000000000..b4b033a3f Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/images/your-tenancy-name.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/local-tenancy.md b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/local-tenancy.md new file mode 100644 index 000000000..6abd0e06d --- /dev/null +++ b/dev-ai-app-dev-constructioneng-aiexperience/local-tenancy/local-tenancy.md @@ -0,0 +1,609 @@ +# How-to Install and Run the Application on OCI + +## Introduction + +This lab will show you how to set up and run the Seer Construction procurement application on OCI. This guide walks you through the complete setup process, including provisioning the required services and installing the dependencies needed to launch and run the application on OCI. + +The document is structured to help you meet all prerequisites, configure both the Autonomous AI Database and the OCI Generative AI Service, and troubleshoot any issues that may arise during setup. Whether you're new to Oracle Cloud Infrastructure or simply deploying for development and testing, this step-by-step guide will ensure a smooth setup experience. + +Estimated Time: 60 minutes + +### Objectives + +By the end of this section, you will be able to: + +- Provision and connect to an OCI VM and an Oracle Autonomous AI Database. + +- Set up a Python-based local development environment. + +- Configure access to OCI Generative AI services. + +- Securely store your credentials and configuration details. + +- Launch and interact with the application using Streamlit. + +> 💡Note: This guide is intended for development and testing purposes. +> For production deployment, additional configuration and security +> hardening will be required. + +Let’s get started! + +## Task 1: Create a virtual cloud network and a compute instance + +1. Click the Navigation menu in the top left and select **Compute** then **Instances**. + + ![Compute Instance](./images/select-compute.png " ") + +2. Verify that the filter reflects the correct compartment and click **Create Instance**. + + ![Create instance button](./images/click-create-instance.png " ") + +3. Name the instance **SeerVM**, verify you're in the correct compartment, and accept all the defaults. Click the **Next** button. + + > **Note**: While all operating systems are supported, we recommend using Oracle Linux 9 as the operating system. The application runs on any available shape, including shapes available in the OCI Always Free tier. + + ![Create Compute Instance](./images/create-instance-2.png " ") + +4. On the Security screen, click **Next**. + +5. In the **Networking** section name the VNIC - *SeerVNIC*. Check the radio button to **Create new virtual cloud network**. Verify that the radio button for **Create new public subnet** is checked. + + ![Select VNIC](./images/name-vnic-confirm.png " ") + + In the **Add SSH Keys** section, you can generate a new SSH key pair or use your favorite existing keys. + +6. To generate a new key pair, click the radio button next to **Generate a key pair for me**. Then click the **Download private key** button to save the file to your local downloads directory. Click the button to **Download public key** to your local computer so you have both keys for safe-keeping. + + ![Generate public SSH keys](./images/generate-public-keys.png " ") + + In a future task you'll need the SSH keys to gain access to the compute instance where you'll configure and run the software for this lab. Feel free to move the SSH keys to the .ssh directory of your terminal application. This will vary depending on which terminal emulator you're using on your system. + +7. You can also utilize an existing key pair if you already have one. Choose the radio button for **Upload public key file (.pub)** and drop the file on the box or click it to locate the file and upload it to the VM. + + ![Upload public SSH keys](./images/upload-public-keys.png " ") + +8. Alternately, you can paste the contents of an existing public key. Locate the key you want to use and open it up in an editor. Copy and paste the contents of the key into the field + + ![Paste public SSH keys](./images/paste-ssh-key.png " ") + +9. Once you've completed the SSH Key section, click the **Next** button to continue. + +10. On the Boot Volume section, accept the defaults and choose **Next**. + +11. Review the VM configuration information. Look in the Networking section and verify that **Public IPv4 address** = **Yes**. Click the **Create** button. + + ![Review the basic VM information](./images/review-basic-information.png " ") + +12. The instance will begin provisioning and in a few moments the state + will change to **Succeeded** and then to **Running**. + + ![Compute Instance success](./images/create-instance-succeeded.png " ") + + In the next step, you'll add 5 ingress rules to allow traffic on + specific ports within your VCN. + +13. Click on the **Navigation Menu** and select **Networking** then **Virtual Cloud Networks**. + + ![Select VCN](./images/select-vcn.png " ") + +14. Click the VCN link that was created along with your compute instance. + +15. Click the **Security** tab, then click on the **Default Security List for vcn-xxxxx**. + + ![Select VCN](./images/click-default-security-list.png " ") + +16. Click the **Security Rules** tab, then click the **Add Ingress Rules** under the Ingress Rules section. Note that port 22 is already enabled for SSH communication. + + ![Click Add Ingress Rules](./images/click-add-ingress-rules.png " ") + +17. For each rule, add `0.0.0.0/0` as the **Source CIDR** and add the + specific port below to the **Destination Port Range** field. Click + **+ Another Ingress Rule** after each entry. + + Add 5 rules using the following information. + + | Ingress Rule # | Source CIDR | Port # | + | --- | --- | --- | + | 1 | 0.0.0.0/0 | 80 | + | 2 | 0.0.0.0/0 | 1521 | + | 3 | 0.0.0.0/0 | 1522 | + | 4 | 0.0.0.0/0 | 8501 | + | 5 | 0.0.0.0/0 | 8502 | + {: title="Ingress rules"} + + When you've added all 5 ingress rules, click the **Add Ingress + Rules** button at the bottom right of the page. + + ![Add Ingress Rules](./images/add-ingress-rules-all.png " ") + + Your default security list should look like the screenshot below. + + ![Complete default security list](./images/default-security-list-final.png " ") + +## Task 2: Access and update the VM + +1. Click on the **Navigation Menu** select **Compute** then **Instances** + + ![Copy Public IP](./images/select-instances.png " ") + +2. Click on the link to the SeerVM instance you created earlier. + +3. Locate the **Public IP address** in the Instance access section copy the **Public IP**. + + ![Copy Public IP](./images/copy-ip.png " ") + +4. Type or copy/paste the following command into your terminal. Replace + `ssh_key_name` with the name of your private key. Replace + `public_ip` with the public IP you just copied from your VM. The + `-i` switch allows you to specify the location where your SSH keys + are stored. + + ```` + + ssh -i ~/.ssh/ssh_key_name opc@public_ip + + ```` + + ![Open Terminal](./images/open-terminal.png " ") + + +5. Run the command below to update the VM. It will take a few minutes. + + ```` + + sudo yum update -y + + ```` + + ![Open Terminal](./images/login-with-ssh-key.png " ") + +6. Once the VM has been updated, install Python 3.11, pip, and the OCI + CLI application. Run the commands below: + + ```` + + sudo yum install python3.11 -y + + ```` + + ```` + + sudo yum install python3-pip -y + + ```` + + ```` + + sudo yum install python3.11-pip -y + + ```` + + ```` + + pip install --upgrade pip + + ```` + + ```` + + sudo dnf install python39-oci-cli -y + + ```` + +## Task 3: Provision an Autonomous AI Database + +The application is built for Autonomous AI Database. Follow the steps to provision an Oracle Autonomous Transaction Database. + +1. Click the navigation menu in the upper left of the OCI console, choose **Oracle AI Database** then **Autonomous AI Database**. + + ![Choose Autonomous AI Database](./images/choose-autonomous.png " ") + +2. Verify that the filter option reflects the correct compartment and click the **Create Autonomous AI Database** button. + + ![Create Autonomous AI Database](./images/create-adb.png " ") + +3. Use the information in the table below to fill out the **Create Autonomous AI Database Serverless** form. Proceed to the next step for instructions on setting up **Network Access**. + + | Field Name | Input | + | ------------- | ------------ | + | Display Name | SeerATP | + | Database Name | SeerATP | + | Compartment | Verify correct compartment | + | Workload Type | ATP | + | Database Version | 26ai | + | ECPU Count | 2 | + | Password | Password1234! | + {: title="ADB configuration details overview"} + + ![Create Autonomous AI Database form](./images/create-adb-form.png " ") + +4. In the **Network access** section, choose **Secure access from + allowed IPs and VCNs only**. In the **IP notation type** + drop-down, choose **CIDR block**. For values, enter + **0.0.0.0/0**. Verify that **Require mutual TLS (mTLS)** + authentication is disabled. Click the **Create** button. + + ![Create Autonomous AI Database form](./images/atp-security-mtls.png " ") + +5. The ATP Database will enter the provisioning state. + + ![Provisioning an Autonomous AI Database instance](./images/provisioning-atp.png " ") + +6. Once the state changes to **Available**, the Autonomous Transaction + Processing database is ready to use. + + ![Provisioning an Autonomous AI Database instance](./images/atp-detail-review.png " ") + +## Task 5: Setting up the Local Environment + +The application environment has been created and zipped up for you in a downloadable package. + +1. Return to the terminal connected to the VM. From the `/home/opc` + directory, enter the following command to download the application + package to your virtual machine. + + ```` + + wget https://c4u04.objectstorage.us-ashburn-1.oci.customer-oci.com/p/EcTjWk2IuZPZeNnD_fYMcgUhdNDIDA6rt9gaFj_WZMiL7VvxPBNMY60837hu5hga/n/c4u04/b/livelabsfiles/o/database/ai-app-build-local.zip + + ```` + +2. Unzip the file. + + ```` + + unzip ai-app-build-local.zip + + ```` + + Next, generate an OCI configuration file that will contain user + credentials and other settings needed for interacting with Oracle + Cloud. To prepare for this step, gather the user OCID, tenancy + OCID, and tenancy region, then store them in a text file. + +3. Find the user OCID: Click the profile icon in the upper right corner of the OCI console and choose **User settings**. + + ![User settings](./images/click-user-settings.png " ") + +4. In the My profile screen, locate the **OCID** field and click **Copy** to the right of the OCID field. Store this information in a text file. + + ![User OCID](./images/user-ocid.png " ") + +5. To find the tenancy OCID, click the profile icon in the upper right + corner of the OCI console and choose **Tenancy: _your tenancy + name_**. + + ![User OCID](./images/your-tenancy-name.png " ") + +6. Locate the tenancy OCID and click the **Copy** button to copy the OCID. Paste it into your text file. + + ![User OCID](./images/your-tenancy-name-2.png " ") + +7. Identify the home region of your tenancy located on the top bar of the console toward the right. Note that information in your text file. + + ![User OCID](./images/region.png " ") + +8. With the above information handy, run the following command in the terminal. + + ```` + + oci setup config + + ```` + +9. Hit return to accept the default config file location of /home/opc/.oci/config + +10. Enter your user OCID, tenancy OCID, and select your region from the list by using the corresponding number. + +11. When asked if you want to generate a new API key, answer 'Y' for yes. + +12. Press **Enter** to accept the default creation directory of /home/opc/.oci + +13. Press **Enter** to accept the default name of *oci_api_key*. + +14. Enter *N/A* twice to eliminate the need for a passphrase. (Your + output won't show up in the terminal screen.) + + Next, you'll create an environment file for the application. + +15. Create the .env file that will hold connection information for your application. + + ```` + + touch .env + + ```` + +16. Use your favorite editor to open and edit the file. + + ```` + + nano .env + + ```` + +17. The following information needs to be collected and inserted into the .env file. Copy the 9 lines below and paste them in the .env file. Follow the steps below to gather the required information and place it in the file. + + ```` + + USERNAME="" + DBPASSWORD="" + DBCONNECTION="" + ADB_NAME="" + ADB_OCID="" + GRAPH_ENDPOINT="" + COMPARTMENT_OCID="" + TENANCY_OCID="" + ENDPOINT=https://inference.generativeai.us-chicago-1.oci.oraclecloud.com + + ```` + +18. The database username should be 'admin'. Use the password that you assigned to the admin user. (Password1234!). Make sure all the information you enter into the file stays between the quotes. + +19. Find your database connection string by selecting navigating to **Oracle AI Database**, choose **Autonomous AI Database**, then choose the ATP you created earlier in the lab, **SeerATP**. At the top of the screen, click the button labeled **Database Connection**. + + ![Select Database Connection](./images/db-connection.png " ") + +20. Locate the connection labeled *seeratp_low*. Click the ellipsis at the far right and choose *Copy*. Paste the result into your configuration file. **Note:** Make sure to enclose the connection string in single quotes. Click **Cancel** to close the screen when you're done. + + ![Copy Connection String](./images/copy-connection-string.png " ") + +21. Copy your Autonomous AI Database Name and OCID and paste them into your .env file. + + ![Copy your Autonomous AI Database OCID](./images/adb-ocid.png " ") + +22. While still in the ATP details screen, click the **Tool Configuration** tab. Copy the Graph Studio Public access URL and paste it into the .env file. + + ![Copy your Graph Endpoint](./images/graph-endpoint.png " ") + +23. To find the compartment OCID, navigate to **Identity & Security**, select **Compartments**, then click on the link of the compartment you're using for this lab. + +24. Locate the compartment OCID and click the *Copy* link. Paste the compartment OCID into your .env file. + + ![Copy compartment OCID](./images/copy-compartment-ocid.png " ") + +25. Locate the tenancy OCID. From the OCI Console home screen, click the tenancy name link under the **Home** title. + + ![Select your Tenancy](./images/click-tenancy.png " ") + +26. Copy the tenancy OCID and paste it into the .env file. + + ![Copy your Tenancy OCID](./images/copy-tenancy-ocid.png " ") + +27. Copy the below url and paste it into your file as the endpoint. + + ```` + + https://inference.generativeai.us-chicago-1.oci.oraclecloud.com + + ```` + +28. Your .env file should look similar to the screenshot below. (*Don't forget the sinqle quotes around the connection string!*) + + ![.env credentials](./images/env-file.png " ") + +29. Save and close the .env file. + +## Task 4: Create the application environment + +1. Create a Virtual Environment. It is recommended to create a virtual environment to isolate application dependencies. In your terminal, run the following command to create a virtual environment. + + ```` + + python3.11 -m venv construction_env + + ```` + + This will create a directory called `construction_env` that will contain your virtual environment. + +2. Enable the firewall for the application port. Run the following commands: + + ```` + + sudo firewall-cmd --zone=public --add-port=8501/tcp --permanent + + ```` + + ```` + + sudo firewall-cmd --reload + + ```` + + ```` + + nohup streamlit run 1-Introduction.py --server.port 8501 --server.address 0.0.0.0 > streamlit.log 2>&1 & + + ```` + + ![Enable the firewall](./images/enable-firewall.png " ") + +3. Create the streamlit.service file to allow management of the streamlit app like any other service. + + ```` + + sudo nano /etc/systemd/system/streamlit.service + + ```` + + +4. Copy and paste the following information into the file. Verify the user is 'opc' and the port is set to 8501. + + ```` + + [Unit] + Description=Streamlit Construction Procurement App + After=network.target + + [Service] + User=opc + WorkingDirectory=/home/opc + ExecStart=/bin/bash -c 'source /home/opc/construction_env/bin/activate && streamlit run 1-Introduction.py --server.port 8501 --server.address 0.0.0.0' + Restart=always + + [Install] + WantedBy=multi-user.target + + ```` + + +5. Activate the virtual environment. Enter the following command. + + ```` + + source construction_env/bin/activate + + ```` + +6. Run the following command to upgrade pip. + + ```` + + pip install --upgrade pip + + ```` + +7. Install the required applications from the supplied requirements.txt file. + + ``` + + pip install -r requirements.txt + + ``` + +8. Install java. + + ```` + + sudo dnf install java-17-openjdk-devel -y + + ```` + +9. Install sqlcl. + + ```` + + sudo yum install sqlcl -y + + ```` +10. Reload the daemons and enable Streamlit. + + ```` + + sudo systemctl daemon-reload + + ```` + + ```` + + sudo systemctl enable streamlit + + ```` + + ```` + + sudo systemctl start streamlit + + ```` + + ```` + + sudo systemctl status streamlit + + ```` + + Streamlit is up and running. Press **Control+C** on your keyboard + to exit the status view. + + +## Task 5: Launch the Application + +1. Navigate to the *dbinit* subdirectory. + + ```` + + cd ~/dbinit + + ```` + +2. Change the permissions on the shell_script.sh file to executable. + + ``` + + chmod +x shell_script.sh + + ``` + +3. Run shell script file to populate the database and configure the application. Run the following command. + + ```` + + ./shell_script.sh + + ```` + +4. Open a web browser. + +5. Type the IP address of the VM followed by `:8501` into the + incognito window. You can obtain it from the OCI Console VM details + screen. + +6. Success! You should see the application start screen. + + ![Application start screen](./images/application-start-screen.png " ") + + Congratulations, you have built and configured the construction + procurement application using Oracle Cloud Infrastructure, Oracle + Autonomous AI Database, and Oracle GenAI. + + +## Troubleshooting +If you encounter any issues during the setup, here are a few common troubleshooting tips: + +* **Missing Keys or Permissions**: Double-check your .oci/config for typos and ensure the key file path is correct and readable. + +* **OCI SDK Errors**: Ensure the required OCI Python SDK is installed: + + ```` + + pip install oci + + ```` + +* **GenAI Access Issues**: Verify your user/group has the correct IAM policy applied. + +* **Virtual Environment Not Activating**: Ensure that you're using the correct command for your operating system. If the issue persists, try recreating the virtual environment. + +* **Dependencies Installation Issues**: Double-check the + `requirements.txt` file to ensure it contains the correct package + names. If a specific package fails, you can try installing it + manually with `pip install your-package-name`. + +* **Database Connection Errors**: Ensure that the database credentials in the .env file are correct and that you have access to the Autonomous AI Database. + +## Additional Notes + +* Your .oci/config and .environment files contain sensitive credentials. Do not commit them to version control. + +* Keep your oci\_api\_key.pem secure and never share it. + +* If you use multiple OCI profiles, you can add them to ~/.oci/config and reference them explicitly in your code. + +* This setup is intended for development and local testing purposes. If you're looking to deploy the application in production, additional configuration and security hardening may be required. + +* Ensure that your system's Python version is compatible (3.9 or higher) and that the virtual environment is activated whenever you work on the application. + +## Conclusion + +By following the steps outlined above, you should be able to set up and run the application locally. If you face any issues, refer to the troubleshooting section or contact the support team for assistance. + +You may now **proceed to the next lab**. + +## Learn More + +- [Generative AI Documentation](https://docs.oracle.com/en-us/iaas/Content/generative-ai/home.htm) + +## Acknowledgements + +- **Created By/Date** - Linda Foinding +- **Last Updated By/Date** - Linda Foinding, July 2025 diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/files/starter-file.sql b/dev-ai-app-dev-constructioneng-aiexperience/user-story/files/starter-file.sql new file mode 100644 index 000000000..52397f1ae --- /dev/null +++ b/dev-ai-app-dev-constructioneng-aiexperience/user-story/files/starter-file.sql @@ -0,0 +1,302 @@ +-- Construction Engineering supplier evaluation model +DROP TABLE IF EXISTS CE_SUPPLIER_DEPENDENCIES CASCADE CONSTRAINTS PURGE; +DROP TABLE IF EXISTS CE_PROJECT_CHUNKS CASCADE CONSTRAINTS PURGE; +DROP TABLE IF EXISTS CE_DECISION CASCADE CONSTRAINTS PURGE; +DROP TABLE IF EXISTS CE_SUPPORTING_DOCS CASCADE CONSTRAINTS PURGE; +DROP TABLE IF EXISTS CE_SUPPLIER_EVALUATION CASCADE CONSTRAINTS PURGE; +DROP TABLE IF EXISTS CE_SUPPLIER_RECOMMENDATION CASCADE CONSTRAINTS PURGE; +DROP TABLE IF EXISTS CE_SUPPLIER_PERFORMANCE CASCADE CONSTRAINTS PURGE; +DROP TABLE IF EXISTS CE_SUPPLIER_CERTIFICATIONS CASCADE CONSTRAINTS PURGE; +DROP TABLE IF EXISTS CE_SUPPLIERS CASCADE CONSTRAINTS PURGE; +DROP TABLE IF EXISTS CE_PROJECT_REQUIREMENTS CASCADE CONSTRAINTS PURGE; +DROP TABLE IF EXISTS CE_PROJECTS CASCADE CONSTRAINTS PURGE; +DROP VIEW IF EXISTS CONSTRUCTION_PROJECTS_DV; +DROP PROPERTY GRAPH IF EXISTS CONSTRUCTION_ENGINEERING_GRAPH; + +CREATE TABLE IF NOT EXISTS CE_PROJECTS ( + PROJECT_ID NUMBER PRIMARY KEY, + PROJECT_NAME VARCHAR2(200) NOT NULL, + LOCATION VARCHAR2(200), + PROJECT_TYPE VARCHAR2(100), + PROJECT_PHASE VARCHAR2(100), + PROJECT_SUMMARY CLOB, + START_DATE DATE, + TARGET_DELIVERY_DATE DATE, + EVALUATION_STATUS VARCHAR2(50), + CREATED_BY VARCHAR2(100) +); + +CREATE TABLE IF NOT EXISTS CE_PROJECT_REQUIREMENTS ( + REQUIREMENT_ID NUMBER PRIMARY KEY, + PROJECT_ID NUMBER REFERENCES CE_PROJECTS(PROJECT_ID), + TRADE_CATEGORY VARCHAR2(100), + MATERIAL_NEED VARCHAR2(200), + TECHNICAL_SPEC CLOB, + REQUIRED_CERTIFICATION VARCHAR2(200), + DELIVERY_WINDOW VARCHAR2(100), + PROCUREMENT_URGENCY VARCHAR2(50), + BUDGET_RANGE VARCHAR2(100), + RISK_LEVEL VARCHAR2(50) +); + +CREATE TABLE IF NOT EXISTS CE_SUPPLIERS ( + SUPPLIER_ID NUMBER PRIMARY KEY, + SUPPLIER_NAME VARCHAR2(200) NOT NULL, + CATEGORY VARCHAR2(100), + REGION VARCHAR2(100), + EMAIL VARCHAR2(100), + PHONE_NUMBER VARCHAR2(20), + ACTIVE CHAR(1), + CAPACITY_STATUS VARCHAR2(50), + CAPABILITY_SUMMARY CLOB +); + +CREATE TABLE IF NOT EXISTS CE_SUPPLIER_CERTIFICATIONS ( + CERT_ID NUMBER PRIMARY KEY, + SUPPLIER_ID NUMBER REFERENCES CE_SUPPLIERS(SUPPLIER_ID), + CERTIFICATION_NAME VARCHAR2(200), + ISSUED_BY VARCHAR2(200), + EXPIRES_ON DATE, + STATUS VARCHAR2(50) +); + +CREATE TABLE IF NOT EXISTS CE_SUPPLIER_PERFORMANCE ( + PERFORMANCE_ID NUMBER PRIMARY KEY, + SUPPLIER_ID NUMBER REFERENCES CE_SUPPLIERS(SUPPLIER_ID), + PROJECT_TYPE VARCHAR2(100), + SIMILAR_PROJECT_COUNT NUMBER, + ON_TIME_DELIVERY_RATE NUMBER(5,2), + COST_VARIANCE_PCT NUMBER(5,2), + UNRESOLVED_NCR_COUNT NUMBER, + SAFETY_SCORE NUMBER(5,2), + LAST_EVALUATED DATE +); + +CREATE TABLE IF NOT EXISTS CE_SUPPLIER_RECOMMENDATION ( + RECOMMEND_ID NUMBER PRIMARY KEY, + PROJECT_ID NUMBER REFERENCES CE_PROJECTS(PROJECT_ID), + SUPPLIER_ID NUMBER REFERENCES CE_SUPPLIERS(SUPPLIER_ID), + RECOMMENDATION VARCHAR2(50), + FIT_SCORE NUMBER(5,2), + RISK_LEVEL VARCHAR2(50), + EXPLANATION CLOB, + STRENGTHS CLOB, + MISSING_INFORMATION CLOB, + GENERATED_DATE DATE DEFAULT SYSDATE +); + +CREATE TABLE IF NOT EXISTS CE_SUPPLIER_EVALUATION ( + EVALUATION_ID NUMBER PRIMARY KEY, + PROJECT_ID NUMBER REFERENCES CE_PROJECTS(PROJECT_ID), + RECOMMEND_ID NUMBER REFERENCES CE_SUPPLIER_RECOMMENDATION(RECOMMEND_ID), + REQUEST_DATE DATE, + EVALUATION_STATUS VARCHAR2(50), + FINAL_DECISION VARCHAR2(50), + DECISION_DATE DATE +); + +CREATE TABLE IF NOT EXISTS CE_SUPPORTING_DOCS ( + DOC_ID NUMBER PRIMARY KEY, + PROJECT_ID NUMBER REFERENCES CE_PROJECTS(PROJECT_ID), + SUPPLIER_ID NUMBER REFERENCES CE_SUPPLIERS(SUPPLIER_ID), + DOC_TYPE VARCHAR2(100), + FILE_NAME VARCHAR2(255), + DOC_TEXT CLOB, + UPLOAD_TIME DATE DEFAULT SYSDATE +); + +CREATE TABLE IF NOT EXISTS CE_DECISION ( + DEC_ID NUMBER PRIMARY KEY, + EVALUATION_ID NUMBER REFERENCES CE_SUPPLIER_EVALUATION(EVALUATION_ID), + DECISION_TYPE VARCHAR2(50), + LETTER_TEXT CLOB, + GENERATED_ON DATE DEFAULT SYSDATE +); + +CREATE TABLE IF NOT EXISTS CE_PROJECT_CHUNKS ( + CHUNK_ID NUMBER PRIMARY KEY, + PROJECT_ID NUMBER REFERENCES CE_PROJECTS(PROJECT_ID), + SUPPLIER_ID NUMBER REFERENCES CE_SUPPLIERS(SUPPLIER_ID), + SOURCE_TYPE VARCHAR2(50), + CHUNK_TEXT CLOB, + CHUNK_VECTOR VECTOR(384,*,DENSE) +); + +CREATE TABLE IF NOT EXISTS CE_SUPPLIER_DEPENDENCIES ( + DEPENDENCY_ID NUMBER PRIMARY KEY, + SUPPLIER_ID NUMBER REFERENCES CE_SUPPLIERS(SUPPLIER_ID), + RELATED_SUPPLIER_ID NUMBER REFERENCES CE_SUPPLIERS(SUPPLIER_ID), + DEPENDENCY_TYPE VARCHAR2(100), + RISK_NOTE VARCHAR2(1000) +); + +INSERT INTO CE_PROJECTS VALUES (1001, 'Downtown Mixed-Use Tower', 'San Jose, California', 'Mixed-use commercial building', 'Procurement', 'Mid-rise mixed-use project requiring structural steel framing, fire-rated assemblies, shop drawing support, inspection documentation, and regional delivery within a compressed schedule. Atlas Structural Fabrication has complete documentation and low supplier risk, so this project is ready for approval.', DATE '2026-06-01', DATE '2026-08-15', 'Pending Review', 'Maya Chen'); +INSERT INTO CE_PROJECTS VALUES (1002, 'Bayfront Utility Upgrade', 'Oakland, California', 'Infrastructure', 'Preconstruction', 'Public works utility upgrade requiring concrete vaults, electrical gear, traffic controls, and suppliers with public-sector documentation history.', DATE '2026-07-10', DATE '2026-10-01', 'In Progress', 'Jordan Patel'); +INSERT INTO CE_PROJECTS VALUES (1003, 'Harbor Seismic Retrofit', 'Long Beach, California', 'Public works retrofit', 'Procurement', 'Seismic retrofit project requiring specialty steel bracing, strict public works documentation, DBE participation, and suppliers with clean nonconformance history. Existing supplier pool does not meet core compliance requirements, so the recommended action is to deny current suppliers and issue a new RFP.', DATE '2026-07-15', DATE '2026-09-30', 'Pending Review', 'Elena Ruiz'); +INSERT INTO CE_PROJECTS VALUES (1004, 'North Campus Lab Expansion', 'Palo Alto, California', 'Laboratory expansion', 'Procurement', 'Laboratory expansion requiring HVAC equipment, cleanroom-compatible ductwork, seismic anchorage documentation, and manufacturer startup support. The evaluation is waiting for an uploaded technical addendum before AI re-analysis.', DATE '2026-08-01', DATE '2026-11-15', 'Pending Review', 'Priya Raman'); + +INSERT INTO CE_PROJECT_REQUIREMENTS VALUES (2001, 1001, 'Structural Steel', 'Fabricated beams, columns, and connection assemblies', 'AISC-compliant structural steel package for a mid-rise commercial frame, including mill certificates, weld procedures, shop drawings, and inspection documentation.', 'AISC Certification; AWS Certified Welders', 'Six weeks', 'High', '$2.4M - $2.9M', 'Low'); +INSERT INTO CE_PROJECT_REQUIREMENTS VALUES (2002, 1002, 'Electrical Systems', 'Switchgear and underground utility components', 'Utility-grade electrical equipment with public works submittals, delivery traceability, and site coordination documentation.', 'UL Listed Components; OSHA Safety Program', 'Ten weeks', 'Medium', '$900K - $1.3M', 'Medium'); +INSERT INTO CE_PROJECT_REQUIREMENTS VALUES (2003, 1003, 'Seismic Steel Bracing', 'Buckling-restrained braces, embeds, and retrofit connection plates', 'Public works seismic retrofit package requiring documented AISC fabrication, DBE participation, certified welding procedures, unresolved NCR count of zero, and verified delivery access for night work.', 'AISC Certification; AWS Certified Welders; DBE Participation', 'Four weeks', 'Critical', '$1.8M - $2.2M', 'High'); +INSERT INTO CE_PROJECT_REQUIREMENTS VALUES (2004, 1004, 'Mechanical Systems', 'Cleanroom HVAC units, ductwork, controls, and startup support', 'Laboratory HVAC package requiring cleanroom-compatible ductwork, seismic anchorage calculations, TAB plan, manufacturer startup support, and submittal-ready technical documentation.', 'OSHPD/Seismic Anchorage Documentation; Factory Startup Authorization', 'Eight weeks', 'Medium', '$1.1M - $1.6M', 'Medium'); + +INSERT INTO CE_SUPPLIERS VALUES (3001, 'Atlas Structural Fabrication', 'Structural Steel', 'Northern California', 'estimating@atlasstructural.example', '408-555-0140', 'Y', 'Constrained', 'Certified structural steel fabricator with mid-rise commercial experience, shop drawing support, weld procedure documentation, and strong regional delivery history.'); +INSERT INTO CE_SUPPLIERS VALUES (3002, 'WestBridge Steel Supply', 'Structural Steel', 'Bay Area', 'bids@westbridgesteel.example', '510-555-0188', 'Y', 'Available', 'Regional steel supplier with competitive cost history and broad material availability; updated inspection package is still pending.'); +INSERT INTO CE_SUPPLIERS VALUES (3003, 'Northline Industrial Metals', 'Structural Steel', 'Central California', 'rfq@northlinemetals.example', '559-555-0199', 'Y', 'Available', 'Industrial metals supplier with strong fabrication capabilities and prior commercial work, but recent schedule confirmations are required due to historical delivery delays.'); +INSERT INTO CE_SUPPLIERS VALUES (3004, 'Coastal Retrofit Metals', 'Seismic Steel', 'Southern California', 'bids@coastalretrofit.example', '562-555-0111', 'Y', 'Overloaded', 'Retrofit steel supplier with partial seismic brace experience but missing DBE documentation and open nonconformance items.'); +INSERT INTO CE_SUPPLIERS VALUES (3005, 'Pacific Brace Works', 'Seismic Steel', 'California', 'estimating@pacificbrace.example', '714-555-0122', 'Y', 'Available', 'Specialty bracing supplier with competitive pricing but expired AISC certification and limited public works documentation.'); +INSERT INTO CE_SUPPLIERS VALUES (3006, 'Civic Steel Partners', 'Seismic Steel', 'Western US', 'rfp@civicsteel.example', '916-555-0177', 'Y', 'Available', 'Regional steel supplier with public-sector references but unresolved weld NCRs and no verified night-work delivery plan.'); +INSERT INTO CE_SUPPLIERS VALUES (3007, 'Precision Air Systems', 'Mechanical Systems', 'Northern California', 'labprojects@precisionair.example', '650-555-0133', 'Y', 'Available', 'Mechanical systems supplier with cleanroom HVAC experience, seismic anchorage partners, and factory startup authorization after updated technical package is received.'); +INSERT INTO CE_SUPPLIERS VALUES (3008, 'Valley Mechanical Supply', 'Mechanical Systems', 'Bay Area', 'quotes@valleymechanical.example', '408-555-0166', 'Y', 'Constrained', 'Mechanical supplier with competitive cost history but missing cleanroom TAB documentation and limited startup support availability.'); + +INSERT INTO CE_SUPPLIER_CERTIFICATIONS VALUES (4001, 3001, 'AISC Certified Fabricator', 'AISC', DATE '2027-05-31', 'Current'); +INSERT INTO CE_SUPPLIER_CERTIFICATIONS VALUES (4002, 3001, 'AWS Certified Welding Program', 'AWS', DATE '2027-03-15', 'Current'); +INSERT INTO CE_SUPPLIER_CERTIFICATIONS VALUES (4003, 3002, 'AISC Certified Fabricator', 'AISC', DATE '2026-12-31', 'Current'); +INSERT INTO CE_SUPPLIER_CERTIFICATIONS VALUES (4004, 3003, 'AWS Certified Welding Program', 'AWS', DATE '2027-01-20', 'Current'); +INSERT INTO CE_SUPPLIER_CERTIFICATIONS VALUES (4005, 3004, 'DBE Participation Letter', 'Agency Self-Report', DATE '2026-08-01', 'Missing'); +INSERT INTO CE_SUPPLIER_CERTIFICATIONS VALUES (4006, 3005, 'AISC Certified Fabricator', 'AISC', DATE '2025-12-31', 'Expired'); +INSERT INTO CE_SUPPLIER_CERTIFICATIONS VALUES (4007, 3006, 'AWS Certified Welding Program', 'AWS', DATE '2027-02-28', 'Current'); +INSERT INTO CE_SUPPLIER_CERTIFICATIONS VALUES (4008, 3007, 'Factory Startup Authorization', 'HVAC Manufacturer', DATE '2027-06-30', 'Current'); +INSERT INTO CE_SUPPLIER_CERTIFICATIONS VALUES (4009, 3007, 'Seismic Anchorage Partner Letter', 'Structural Engineer', DATE '2027-04-30', 'Current'); +INSERT INTO CE_SUPPLIER_CERTIFICATIONS VALUES (4010, 3008, 'Cleanroom TAB Documentation', 'Independent TAB Agency', DATE '2026-09-01', 'Missing'); + +INSERT INTO CE_SUPPLIER_PERFORMANCE VALUES (5001, 3001, 'Mid-rise commercial', 3, 94.00, 2.10, 0, 96.00, DATE '2026-05-20'); +INSERT INTO CE_SUPPLIER_PERFORMANCE VALUES (5002, 3002, 'Commercial steel framing', 2, 89.00, -1.80, 1, 91.00, DATE '2026-05-18'); +INSERT INTO CE_SUPPLIER_PERFORMANCE VALUES (5003, 3003, 'Industrial and commercial', 4, 82.00, 4.70, 2, 88.00, DATE '2026-05-12'); +INSERT INTO CE_SUPPLIER_PERFORMANCE VALUES (5004, 3004, 'Seismic retrofit', 1, 61.00, 9.40, 3, 74.00, DATE '2026-05-25'); +INSERT INTO CE_SUPPLIER_PERFORMANCE VALUES (5005, 3005, 'Public works retrofit', 1, 68.00, 6.10, 1, 79.00, DATE '2026-05-28'); +INSERT INTO CE_SUPPLIER_PERFORMANCE VALUES (5006, 3006, 'Civic infrastructure', 2, 72.00, 8.90, 2, 81.00, DATE '2026-05-29'); +INSERT INTO CE_SUPPLIER_PERFORMANCE VALUES (5007, 3007, 'Laboratory HVAC', 4, 93.00, 1.80, 0, 95.00, DATE '2026-06-02'); +INSERT INTO CE_SUPPLIER_PERFORMANCE VALUES (5008, 3008, 'Healthcare and lab mechanical', 3, 84.00, 3.90, 1, 88.00, DATE '2026-06-03'); + +INSERT INTO CE_SUPPLIER_RECOMMENDATION VALUES (6001, 1001, 3001, 'Approved', 97.00, 'Low', 'Atlas Structural Fabrication is approved because it has completed three similar mid-rise steel frame projects, maintains current AISC and AWS documentation, has a 96 percent on-time delivery rate, has no unresolved inspection failures in the past 24 months, and has confirmed capacity for the six-week delivery window.', 'AISC certification, certified weld procedures, commercial steel framing experience, complete mill certificates, clean inspection history, confirmed delivery capacity, low supplier risk.', 'No blocking information is missing. Proceed with supplier confirmation and purchase package preparation.', SYSDATE); +INSERT INTO CE_SUPPLIER_RECOMMENDATION VALUES (6002, 1001, 3002, 'Request Info', 86.00, 'Medium', 'WestBridge Steel Supply has competitive cost history and good regional availability, but the evaluation is incomplete because current inspection documentation has not been provided.', 'Competitive cost performance, regional availability, current AISC certification.', 'Updated inspection logs, mill certificates, and nonconformance closeout evidence.', SYSDATE); +INSERT INTO CE_SUPPLIER_RECOMMENDATION VALUES (6003, 1001, 3003, 'Request Info', 78.00, 'High', 'Northline Industrial Metals has fabrication capability and similar project experience, but prior delivery delays and unresolved nonconformance count require schedule and quality confirmation before selection.', 'Strong fabrication capabilities and similar project references.', 'Delivery schedule confirmation, corrective action evidence, and updated inspection records.', SYSDATE); +INSERT INTO CE_SUPPLIER_RECOMMENDATION VALUES (6004, 1003, 3004, 'Denied', 38.00, 'High', 'Coastal Retrofit Metals should be denied because DBE participation documentation is missing, capacity is overloaded, and three unresolved nonconformance reports conflict with the public works retrofit requirements.', 'Some seismic retrofit experience.', 'DBE letter, NCR closeout evidence, and capacity plan are missing. Submit an RFP for new qualified seismic steel suppliers.', SYSDATE); +INSERT INTO CE_SUPPLIER_RECOMMENDATION VALUES (6005, 1003, 3005, 'Denied', 34.00, 'High', 'Pacific Brace Works should be denied because AISC certification is expired and public works documentation is incomplete for the required seismic retrofit scope.', 'Competitive pricing.', 'Current AISC certification and public works documentation are missing. Submit an RFP for new qualified seismic steel suppliers.', SYSDATE); +INSERT INTO CE_SUPPLIER_RECOMMENDATION VALUES (6006, 1003, 3006, 'Denied', 31.00, 'Very High', 'Civic Steel Partners should be denied because unresolved weld nonconformance reports and no verified night-work logistics plan create unacceptable schedule and quality risk.', 'Public-sector references.', 'NCR closeout evidence and night-work delivery plan are missing. Submit an RFP for new qualified seismic steel suppliers.', SYSDATE); +INSERT INTO CE_SUPPLIER_RECOMMENDATION VALUES (6007, 1004, 3007, 'Request Info', 82.00, 'Medium', 'Precision Air Systems is the leading candidate for the lab expansion, but the evaluation is pending the updated technical addendum with cleanroom TAB plan, seismic anchorage package, and factory startup letter. Re-analyze after PDF upload.', 'Laboratory HVAC experience, clean startup support, current factory authorization.', 'Upload technical addendum with TAB plan, seismic anchorage package, startup letter, and updated delivery confirmation.', SYSDATE); +INSERT INTO CE_SUPPLIER_RECOMMENDATION VALUES (6008, 1004, 3008, 'Request Info', 68.00, 'Medium', 'Valley Mechanical Supply has cost advantages but lacks cleanroom TAB documentation and has constrained startup support availability.', 'Competitive cost history and regional availability.', 'Cleanroom TAB documentation and startup support confirmation are missing.', SYSDATE); + +INSERT INTO CE_SUPPLIER_EVALUATION VALUES (7001, 1001, 6001, SYSDATE, 'Pending Review', NULL, NULL); +INSERT INTO CE_SUPPLIER_EVALUATION VALUES (7002, 1002, NULL, SYSDATE, 'In Progress', NULL, NULL); +INSERT INTO CE_SUPPLIER_EVALUATION VALUES (7003, 1003, 6004, SYSDATE, 'Pending Review', NULL, NULL); +INSERT INTO CE_SUPPLIER_EVALUATION VALUES (7004, 1004, 6007, SYSDATE, 'Pending Review', NULL, NULL); + +INSERT INTO CE_SUPPORTING_DOCS VALUES (8001, 1001, 3001, 'Inspection Log', 'atlas_inspection_log_2026.pdf', 'Inspection log shows no unresolved weld inspection failures for comparable mid-rise commercial projects in the last 24 months.', SYSDATE); +INSERT INTO CE_SUPPORTING_DOCS VALUES (8002, 1001, 3001, 'Material Certificate', 'atlas_mill_certificates.pdf', 'Mill certificate package covers wide flange beams, columns, and connection assemblies required for the Downtown Mixed-Use Tower.', SYSDATE); +INSERT INTO CE_SUPPORTING_DOCS VALUES (8003, 1001, 3002, 'Qualification File', 'westbridge_supplier_qualification.pdf', 'Supplier qualification file confirms AISC certification and regional availability but omits the most recent inspection log.', SYSDATE); +INSERT INTO CE_SUPPORTING_DOCS VALUES (8004, 1003, 3004, 'Supplier Qualification', 'coastal_retrofit_qualification.pdf', 'Supplier package has missing DBE participation letter, overloaded shop capacity, and unresolved NCR history. Existing suppliers should be denied and new RFP should be submitted.', SYSDATE); +INSERT INTO CE_SUPPORTING_DOCS VALUES (8005, 1004, 3007, 'Pending Technical Addendum', 'Construction_Supplier_Evaluation.pdf', 'Upload PDF contains the lab HVAC technical addendum needed for AI re-analysis, including TAB plan, seismic anchorage package, startup letter, and updated delivery confirmation.', SYSDATE); +INSERT INTO CE_DECISION VALUES (9001, 7001, 'Approve Recommended', 'Atlas Structural Fabrication has complete certification, inspection, capacity, and delivery evidence. Recommended path is to approve and confirm the supplier.', SYSDATE); +INSERT INTO CE_DECISION VALUES (9002, 7003, 'RFP Recommended', 'Current seismic steel suppliers do not meet DBE, AISC, nonconformance, and logistics requirements. Deny current suppliers and submit a new RFP.', SYSDATE); +INSERT INTO CE_DECISION VALUES (9003, 7004, 'Request Info', 'Upload the lab HVAC technical addendum and re-run AI analysis before confirming supplier selection.', SYSDATE); + +INSERT INTO CE_PROJECT_CHUNKS (CHUNK_ID, PROJECT_ID, SUPPLIER_ID, SOURCE_TYPE, CHUNK_TEXT) VALUES (10001, 1001, 3001, 'Project Requirement', 'Downtown Mixed-Use Tower requires structural steel framing, fabricated beams and columns, connection assemblies, AISC certification, AWS certified welders, mill certificates, shop drawings, inspection records, and delivery within six weeks. Required evidence is complete.'); +INSERT INTO CE_PROJECT_CHUNKS (CHUNK_ID, PROJECT_ID, SUPPLIER_ID, SOURCE_TYPE, CHUNK_TEXT) VALUES (10002, 1001, 3001, 'Supplier Profile', 'Atlas Structural Fabrication has completed three similar mid-rise steel frame projects, maintains current AISC certification, has certified weld procedure documentation, confirmed delivery capacity, no unresolved inspection failures, and low supplier risk.'); +INSERT INTO CE_PROJECT_CHUNKS (CHUNK_ID, PROJECT_ID, SUPPLIER_ID, SOURCE_TYPE, CHUNK_TEXT) VALUES (10003, 1001, 3002, 'Supplier Profile', 'WestBridge Steel Supply has competitive cost history and good regional availability, but updated inspection documentation and nonconformance closeout records are missing.'); +INSERT INTO CE_PROJECT_CHUNKS (CHUNK_ID, PROJECT_ID, SUPPLIER_ID, SOURCE_TYPE, CHUNK_TEXT) VALUES (10004, 1003, 3004, 'RFP Trigger', 'Harbor Seismic Retrofit has no acceptable supplier in the current pool. Coastal Retrofit Metals lacks DBE documentation, Pacific Brace Works has expired AISC certification, and Civic Steel Partners has unresolved weld NCRs. Deny suppliers and submit an RFP.'); +INSERT INTO CE_PROJECT_CHUNKS (CHUNK_ID, PROJECT_ID, SUPPLIER_ID, SOURCE_TYPE, CHUNK_TEXT) VALUES (10005, 1004, 3007, 'PDF Upload Scenario', 'North Campus Lab Expansion is awaiting a technical addendum PDF. Upload should add cleanroom TAB plan, seismic anchorage package, factory startup authorization, and updated delivery confirmation for AI re-analysis.'); +INSERT INTO CE_SUPPLIER_DEPENDENCIES VALUES (11001, 3001, 3002, 'Shared coating subcontractor', 'Both suppliers may use the same coating subcontractor, which could create schedule pressure if both are selected for concurrent projects.'); +INSERT INTO CE_SUPPLIER_DEPENDENCIES VALUES (11002, 3004, 3006, 'Shared inspection consultant', 'Both seismic retrofit suppliers rely on the same inspection consultant, creating a hidden review bottleneck for public works closeout.'); + +CREATE OR REPLACE JSON RELATIONAL DUALITY VIEW construction_projects_dv AS +SELECT JSON { + '_id': p.PROJECT_ID, + 'projectName': p.PROJECT_NAME, + 'location': p.LOCATION, + 'projectType': p.PROJECT_TYPE, + 'projectPhase': p.PROJECT_PHASE, + 'projectSummary': p.PROJECT_SUMMARY, + 'startDate': p.START_DATE, + 'targetDeliveryDate': p.TARGET_DELIVERY_DATE, + 'evaluationStatus': p.EVALUATION_STATUS, + 'createdBy': p.CREATED_BY, + 'requirements': [ + SELECT JSON { + 'requirementId': r.REQUIREMENT_ID, + 'tradeCategory': r.TRADE_CATEGORY, + 'materialNeed': r.MATERIAL_NEED, + 'technicalSpec': r.TECHNICAL_SPEC, + 'requiredCertification': r.REQUIRED_CERTIFICATION, + 'deliveryWindow': r.DELIVERY_WINDOW, + 'procurementUrgency': r.PROCUREMENT_URGENCY, + 'budgetRange': r.BUDGET_RANGE, + 'riskLevel': r.RISK_LEVEL + } + FROM CE_PROJECT_REQUIREMENTS r WITH INSERT UPDATE DELETE + WHERE r.PROJECT_ID = p.PROJECT_ID + ], + 'supplierEvaluations': [ + SELECT JSON { + 'evaluationId': e.EVALUATION_ID, + 'requestDate': e.REQUEST_DATE, + 'evaluationStatus': e.EVALUATION_STATUS, + 'finalDecision': e.FINAL_DECISION, + 'decisionDate': e.DECISION_DATE, + 'recommendation': ( + SELECT JSON { + 'recommendId': rec.RECOMMEND_ID, + 'recommendation': rec.RECOMMENDATION, + 'fitScore': rec.FIT_SCORE, + 'riskLevel': rec.RISK_LEVEL, + 'explanation': rec.EXPLANATION, + 'strengths': rec.STRENGTHS, + 'missingInformation': rec.MISSING_INFORMATION, + 'generatedDate': rec.GENERATED_DATE, + 'supplier': ( + SELECT JSON { + 'supplierId': s.SUPPLIER_ID, + 'supplierName': s.SUPPLIER_NAME, + 'category': s.CATEGORY, + 'region': s.REGION, + 'email': s.EMAIL, + 'phone': s.PHONE_NUMBER, + 'active': s.ACTIVE, + 'capacityStatus': s.CAPACITY_STATUS, + 'capabilitySummary': s.CAPABILITY_SUMMARY + } + FROM CE_SUPPLIERS s + WHERE s.SUPPLIER_ID = rec.SUPPLIER_ID + ) + } + FROM CE_SUPPLIER_RECOMMENDATION rec WITH UPDATE + WHERE rec.RECOMMEND_ID = e.RECOMMEND_ID + ) + } + FROM CE_SUPPLIER_EVALUATION e WITH INSERT UPDATE DELETE + WHERE e.PROJECT_ID = p.PROJECT_ID + ] +} +FROM CE_PROJECTS p +WITH INSERT UPDATE DELETE; + +CREATE OR REPLACE PROPERTY GRAPH CONSTRUCTION_ENGINEERING_GRAPH + VERTEX TABLES ( + "CE_PROJECTS" KEY ("PROJECT_ID") PROPERTIES ("PROJECT_NAME", "LOCATION", "PROJECT_TYPE", "PROJECT_PHASE", "EVALUATION_STATUS"), + "CE_PROJECT_REQUIREMENTS" KEY ("REQUIREMENT_ID") PROPERTIES ("PROJECT_ID", "TRADE_CATEGORY", "MATERIAL_NEED", "REQUIRED_CERTIFICATION", "PROCUREMENT_URGENCY", "RISK_LEVEL"), + "CE_SUPPLIERS" KEY ("SUPPLIER_ID") PROPERTIES ("SUPPLIER_NAME", "CATEGORY", "REGION", "ACTIVE", "CAPACITY_STATUS"), + "CE_SUPPLIER_RECOMMENDATION" KEY ("RECOMMEND_ID") PROPERTIES ("PROJECT_ID", "SUPPLIER_ID", "RECOMMENDATION", "FIT_SCORE", "RISK_LEVEL"), + "CE_SUPPLIER_EVALUATION" KEY ("EVALUATION_ID") PROPERTIES ("PROJECT_ID", "RECOMMEND_ID", "EVALUATION_STATUS", "FINAL_DECISION"), + "CE_SUPPLIER_DEPENDENCIES" KEY ("DEPENDENCY_ID") PROPERTIES ("SUPPLIER_ID", "RELATED_SUPPLIER_ID", "DEPENDENCY_TYPE", "RISK_NOTE") + ) + EDGE TABLES ( + "CE_PROJECT_REQUIREMENTS" AS project_has_requirement + SOURCE KEY ("PROJECT_ID") REFERENCES "CE_PROJECTS"("PROJECT_ID") + DESTINATION KEY ("REQUIREMENT_ID") REFERENCES "CE_PROJECT_REQUIREMENTS"("REQUIREMENT_ID") + PROPERTIES ("TRADE_CATEGORY", "PROCUREMENT_URGENCY", "RISK_LEVEL"), + "CE_SUPPLIER_RECOMMENDATION" AS project_recommends_supplier + SOURCE KEY ("PROJECT_ID") REFERENCES "CE_PROJECTS"("PROJECT_ID") + DESTINATION KEY ("SUPPLIER_ID") REFERENCES "CE_SUPPLIERS"("SUPPLIER_ID") + PROPERTIES ("RECOMMEND_ID", "RECOMMENDATION", "FIT_SCORE", "RISK_LEVEL"), + "CE_SUPPLIER_EVALUATION" AS evaluation_for_project + SOURCE KEY ("PROJECT_ID") REFERENCES "CE_PROJECTS"("PROJECT_ID") + DESTINATION KEY ("EVALUATION_ID") REFERENCES "CE_SUPPLIER_EVALUATION"("EVALUATION_ID") + PROPERTIES ("EVALUATION_STATUS", "FINAL_DECISION"), + "CE_SUPPLIER_DEPENDENCIES" AS supplier_dependency + SOURCE KEY ("SUPPLIER_ID") REFERENCES "CE_SUPPLIERS"("SUPPLIER_ID") + DESTINATION KEY ("RELATED_SUPPLIER_ID") REFERENCES "CE_SUPPLIERS"("SUPPLIER_ID") + PROPERTIES ("DEPENDENCY_TYPE", "RISK_NOTE") + ); + +COMMIT; diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-ai.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-ai.png new file mode 100644 index 000000000..d7444feed Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-ai.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-approve.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-approve.png new file mode 100644 index 000000000..d87300711 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-approve.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-approved-list.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-approved-list.png new file mode 100644 index 000000000..f31f46837 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-approved-list.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-chatbot1.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-chatbot1.png new file mode 100644 index 000000000..78d44b03b Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-chatbot1.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-chatbot2.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-chatbot2.png new file mode 100644 index 000000000..21c009a73 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-chatbot2.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-dashboard.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-dashboard.png new file mode 100644 index 000000000..5d3d4a4b4 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-dashboard.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-decision.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-decision.png new file mode 100644 index 000000000..5e1ab7276 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-decision.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-download-pdf.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-download-pdf.png new file mode 100644 index 000000000..9bfb03989 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-download-pdf.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-download.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-download.png new file mode 100644 index 000000000..7b9ce4436 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-download.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-intro.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-intro.png new file mode 100644 index 000000000..568129969 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-intro.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-save.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-save.png new file mode 100644 index 000000000..934ad102b Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-save.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-select-final-loan.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-select-final-loan.png new file mode 100644 index 000000000..bdb36a2a7 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-select-final-loan.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-select-loan.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-select-loan.png new file mode 100644 index 000000000..a550e162f Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson-select-loan.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson.png new file mode 100644 index 000000000..4d312d7fd Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/alex-anderson.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/anderson-25k.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/anderson-25k.png new file mode 100644 index 000000000..5bd4419d0 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/anderson-25k.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/anderson-65k.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/anderson-65k.png new file mode 100644 index 000000000..1e8fe834f Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/anderson-65k.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/app-home.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/app-home.png new file mode 100644 index 000000000..99f8e26b5 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/app-home.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/click-dashboard.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/click-dashboard.png new file mode 100644 index 000000000..fb91bd209 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/click-dashboard.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/code-highlight-1.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/code-highlight-1.png new file mode 100644 index 000000000..cdf1c12ab Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/code-highlight-1.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/customer-details.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/customer-details.png new file mode 100644 index 000000000..374ddae7f Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/customer-details.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-ai.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-ai.png new file mode 100644 index 000000000..a4b4f2d8e Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-ai.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-approve.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-approve.png new file mode 100644 index 000000000..a036195d4 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-approve.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-approved-list.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-approved-list.png new file mode 100644 index 000000000..652a214f1 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-approved-list.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-decision.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-decision.png new file mode 100644 index 000000000..5dafba582 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-decision.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-download-pdf.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-download-pdf.png new file mode 100644 index 000000000..e96dc57fe Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-download-pdf.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-download.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-download.png new file mode 100644 index 000000000..b4b038e54 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-download.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-pdf.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-pdf.png new file mode 100644 index 000000000..c60c006cd Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-pdf.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-save.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-save.png new file mode 100644 index 000000000..0002f27f4 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-save.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-select-final-loan.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-select-final-loan.png new file mode 100644 index 000000000..08ae36487 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-select-final-loan.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-select-loan.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-select-loan.png new file mode 100644 index 000000000..6adfbc445 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton-select-loan.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton.png new file mode 100644 index 000000000..de0561a2c Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-burton.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-return-dashboard.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-return-dashboard.png new file mode 100644 index 000000000..ea6eb329a Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/evan-return-dashboard.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/expand-graph.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/expand-graph.png new file mode 100644 index 000000000..04c442cda Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/expand-graph.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/finance-login.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/finance-login.png new file mode 100644 index 000000000..c5cd5b920 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/finance-login.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/flogin.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/flogin.png new file mode 100644 index 000000000..97aa37f04 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/flogin.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/income-updated.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/income-updated.png new file mode 100644 index 000000000..2b7f9d443 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/income-updated.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-return-dashboard.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-return-dashboard.png new file mode 100644 index 000000000..b30d06e9c Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-return-dashboard.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-s-decision-page.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-s-decision-page.png new file mode 100644 index 000000000..8436241cb Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-s-decision-page.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-s-download.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-s-download.png new file mode 100644 index 000000000..e5f7bdd0e Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-s-download.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-ai.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-ai.png new file mode 100644 index 000000000..e75bee840 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-ai.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-approve.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-approve.png new file mode 100644 index 000000000..9a9de8bab Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-approve.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-approved-list.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-approved-list.png new file mode 100644 index 000000000..0978d116d Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-approved-list.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-chatbot.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-chatbot.png new file mode 100644 index 000000000..fa4d9f7fb Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-chatbot.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-confim1.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-confim1.png new file mode 100644 index 000000000..ba61695dd Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-confim1.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-decision.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-decision.png new file mode 100644 index 000000000..e70e3ea07 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-decision.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-decison-new.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-decison-new.png new file mode 100644 index 000000000..d1dc37e80 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-decison-new.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-download-pdf.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-download-pdf.png new file mode 100644 index 000000000..1e3f1d3d8 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-download-pdf.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-download.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-download.png new file mode 100644 index 000000000..62c5f9b6e Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-download.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-final.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-final.png new file mode 100644 index 000000000..5f3944070 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-final.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-pdf.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-pdf.png new file mode 100644 index 000000000..ef6408680 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-pdf.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-save.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-save.png new file mode 100644 index 000000000..2447f3eec Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-save.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-select-final-loan.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-select-final-loan.png new file mode 100644 index 000000000..a01555c73 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-select-final-loan.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-select-loan.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-select-loan.png new file mode 100644 index 000000000..00657078c Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith-select-loan.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith.png new file mode 100644 index 000000000..d10f874d4 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-smith.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-ai.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-ai.png new file mode 100644 index 000000000..74a50ca25 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-ai.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-decision-new.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-decision-new.png new file mode 100644 index 000000000..2d05d63cf Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-decision-new.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-decision.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-decision.png new file mode 100644 index 000000000..535522cd6 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-decision.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-denied-list.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-denied-list.png new file mode 100644 index 000000000..81044043d Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-denied-list.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-download-pdf.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-download-pdf.png new file mode 100644 index 000000000..f52fe3cc3 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-download-pdf.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-download.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-download.png new file mode 100644 index 000000000..84929a6cc Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-download.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-graph.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-graph.png new file mode 100644 index 000000000..6da0b5c87 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-graph.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-graph2.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-graph2.png new file mode 100644 index 000000000..3d21fd3b8 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-graph2.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-graph3.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-graph3.png new file mode 100644 index 000000000..945ddca78 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-graph3.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-intro.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-intro.png new file mode 100644 index 000000000..2439ea1c8 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-intro.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-pdf.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-pdf.png new file mode 100644 index 000000000..939436ac8 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-pdf.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-pending-review-list.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-pending-review-list.png new file mode 100644 index 000000000..2f654b363 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-pending-review-list.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-save.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-save.png new file mode 100644 index 000000000..60a5389d7 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods-save.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods.png new file mode 100644 index 000000000..a113ed034 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/james-woods.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/jameswoodsnotice.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/jameswoodsnotice.png new file mode 100644 index 000000000..0a7633f1d Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/jameswoodsnotice.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab101.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab101.png new file mode 100644 index 000000000..89f48c2ac Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab101.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab102.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab102.png new file mode 100644 index 000000000..071d1f4c6 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab102.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab103.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab103.png new file mode 100644 index 000000000..2cf64aa83 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab103.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab104.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab104.png new file mode 100644 index 000000000..eee63cc1c Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab104.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab105.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab105.png new file mode 100644 index 000000000..3855f7019 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab105.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab106.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab106.png new file mode 100644 index 000000000..2ced64d25 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab106.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab131.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab131.png new file mode 100644 index 000000000..19bf45c77 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab131.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab132.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab132.png new file mode 100644 index 000000000..8677e5572 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab132.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab133.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab133.png new file mode 100644 index 000000000..c07e838ec Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab133.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab134.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab134.png new file mode 100644 index 000000000..bfa83a030 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab134.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab135.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab135.png new file mode 100644 index 000000000..c8b4d62bc Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab135.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab136.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab136.png new file mode 100644 index 000000000..7d1d267c8 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab136.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab137.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab137.png new file mode 100644 index 000000000..3f8de4d7f Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lab137.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/loggedin-coneng.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/loggedin-coneng.png new file mode 100644 index 000000000..4246d9a9d Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/loggedin-coneng.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/login-coneng.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/login-coneng.png new file mode 100644 index 000000000..6c75acca2 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/login-coneng.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/login.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/login.png new file mode 100644 index 000000000..e2f574ad8 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/login.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lowincome.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lowincome.png new file mode 100644 index 000000000..292a269e2 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/lowincome.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-ai.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-ai.png new file mode 100644 index 000000000..41df77ef1 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-ai.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-approve.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-approve.png new file mode 100644 index 000000000..45309d41e Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-approve.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-approved-list.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-approved-list.png new file mode 100644 index 000000000..4684719f5 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-approved-list.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-chatbot1.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-chatbot1.png new file mode 100644 index 000000000..61546b0f8 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-chatbot1.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-chatbot2.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-chatbot2.png new file mode 100644 index 000000000..bb9ee1e74 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-chatbot2.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-decision.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-decision.png new file mode 100644 index 000000000..b1d676aab Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-decision.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-pdf.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-pdf.png new file mode 100644 index 000000000..19285c0a3 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-pdf.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-save.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-save.png new file mode 100644 index 000000000..78cb6d2a9 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-save.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-select-final-loan.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-select-final-loan.png new file mode 100644 index 000000000..4eeb31f90 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-select-final-loan.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-select-loan.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-select-loan.png new file mode 100644 index 000000000..6b48b02ce Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos-select-loan.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos.png new file mode 100644 index 000000000..6ce60ad9d Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/michael-ramos.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/open-alex-anderson-pdf.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/open-alex-anderson-pdf.png new file mode 100644 index 000000000..c5511ce08 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/open-alex-anderson-pdf.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/open-evan-burton-pdf.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/open-evan-burton-pdf.png new file mode 100644 index 000000000..4a5a5244b Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/open-evan-burton-pdf.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/open-james-smith-pdf.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/open-james-smith-pdf.png new file mode 100644 index 000000000..975392e5c Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/open-james-smith-pdf.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/open-james-woods-pdf.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/open-james-woods-pdf.png new file mode 100644 index 000000000..0a7633f1d Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/open-james-woods-pdf.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/open-michael-ramos-pdf.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/open-michael-ramos-pdf.png new file mode 100644 index 000000000..bd15a0bd7 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/open-michael-ramos-pdf.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-ai.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-ai.png new file mode 100644 index 000000000..5ce80da08 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-ai.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-chatbot.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-chatbot.png new file mode 100644 index 000000000..78f6137dd Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-chatbot.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-confirm.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-confirm.png new file mode 100644 index 000000000..f7fd5858b Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-confirm.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-confirmed.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-confirmed.png new file mode 100644 index 000000000..a6c742c0d Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-confirmed.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-dashboard.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-dashboard.png new file mode 100644 index 000000000..897618674 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-dashboard.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-details.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-details.png new file mode 100644 index 000000000..b2f09dcb4 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-details.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-final-approved.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-final-approved.png new file mode 100644 index 000000000..068c2a8b3 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-final-approved.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-final.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-final.png new file mode 100644 index 000000000..1a6d2cb91 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-final.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-openedpdf.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-openedpdf.png new file mode 100644 index 000000000..07a616556 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-openedpdf.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-openpdf.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-openpdf.png new file mode 100644 index 000000000..2d64ac9c5 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-openpdf.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-pdf.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-pdf.png new file mode 100644 index 000000000..d2c0238f3 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-pdf.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-pdfv2.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-pdfv2.png new file mode 100644 index 000000000..563f37562 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-pdfv2.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-to-projectdecision.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-to-projectdecision.png new file mode 100644 index 000000000..37ea825e9 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1001-to-projectdecision.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-dashboard.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-dashboard.png new file mode 100644 index 000000000..ae2324913 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-dashboard.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-denied.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-denied.png new file mode 100644 index 000000000..15ac362c8 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-denied.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-deny.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-deny.png new file mode 100644 index 000000000..ad7914417 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-deny.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-download.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-download.png new file mode 100644 index 000000000..05378cb3f Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-download.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-download2.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-download2.png new file mode 100644 index 000000000..a9e6a463a Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-download2.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-graph.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-graph.png new file mode 100644 index 000000000..1fddea4d5 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-graph.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-opengraph.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-opengraph.png new file mode 100644 index 000000000..bf6e30216 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-opengraph.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-pdf.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-pdf.png new file mode 100644 index 000000000..a32123c88 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-pdf.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-profile.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-profile.png new file mode 100644 index 000000000..de44a7574 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-profile.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-projectdecisions.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-projectdecisions.png new file mode 100644 index 000000000..a11453af4 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1003-projectdecisions.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1004-processdoc.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1004-processdoc.png new file mode 100644 index 000000000..c46dc97fa Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1004-processdoc.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1004-review.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1004-review.png new file mode 100644 index 000000000..feb85198d Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1004-review.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1004-uploaddoc.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1004-uploaddoc.png new file mode 100644 index 000000000..2d1befe41 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1004-uploaddoc.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1004-uploadedpdf.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1004-uploadedpdf.png new file mode 100644 index 000000000..506825517 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1004-uploadedpdf.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1004-uploadedpdf2.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1004-uploadedpdf2.png new file mode 100644 index 000000000..f8f816965 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/p1004-uploadedpdf2.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/pdf-james-smith.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/pdf-james-smith.png new file mode 100644 index 000000000..1ce7d3057 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/pdf-james-smith.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/pdf-james-smith1.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/pdf-james-smith1.png new file mode 100644 index 000000000..1e3f1d3d8 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/pdf-james-smith1.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/pending-review.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/pending-review.png new file mode 100644 index 000000000..d69f2e5f2 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/pending-review.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/process-selected-pdf.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/process-selected-pdf.png new file mode 100644 index 000000000..0ffaded13 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/process-selected-pdf.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/profile-updated.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/profile-updated.png new file mode 100644 index 000000000..8099448df Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/profile-updated.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/review-p1001.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/review-p1001.png new file mode 100644 index 000000000..3145e661a Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/review-p1001.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/sample1.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/sample1.png new file mode 100644 index 000000000..e7b39d583 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/sample1.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/sample2.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/sample2.png new file mode 100644 index 000000000..f33103df9 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/sample2.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/save-details.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/save-details.png new file mode 100644 index 000000000..837fc221b Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/save-details.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/select-alex-anderson.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/select-alex-anderson.png new file mode 100644 index 000000000..9ad5a4a52 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/select-alex-anderson.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/select-dashboard.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/select-dashboard.png new file mode 100644 index 000000000..4567a5d7b Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/select-dashboard.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/select-james-woods-denied.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/select-james-woods-denied.png new file mode 100644 index 000000000..a090a60e1 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/select-james-woods-denied.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/select-p1003.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/select-p1003.png new file mode 100644 index 000000000..804e0cb00 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/select-p1003.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/start-demo.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/start-demo.png new file mode 100644 index 000000000..7d5a4056c Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/start-demo.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/upload-anderson.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/upload-anderson.png new file mode 100644 index 000000000..74098f626 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/upload-anderson.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/upload-anderson2.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/upload-anderson2.png new file mode 100644 index 000000000..c62176a6c Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/upload-anderson2.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/upload-document.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/upload-document.png new file mode 100644 index 000000000..49b0102ca Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/upload-document.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/woods-decision0.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/woods-decision0.png new file mode 100644 index 000000000..ed5c43fe1 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/woods-decision0.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/woods-decision1.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/woods-decision1.png new file mode 100644 index 000000000..59f6fddda Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/woods-decision1.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/woods-decision2.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/woods-decision2.png new file mode 100644 index 000000000..04e5bf92b Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/woods-decision2.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/woods-decision3.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/woods-decision3.png new file mode 100644 index 000000000..db2a69313 Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/woods-decision3.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/woods-return-dashboard.png b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/woods-return-dashboard.png new file mode 100644 index 000000000..1bb6f0bee Binary files /dev/null and b/dev-ai-app-dev-constructioneng-aiexperience/user-story/images/woods-return-dashboard.png differ diff --git a/dev-ai-app-dev-constructioneng-aiexperience/user-story/user-story.md b/dev-ai-app-dev-constructioneng-aiexperience/user-story/user-story.md new file mode 100644 index 000000000..f2c14c6eb --- /dev/null +++ b/dev-ai-app-dev-constructioneng-aiexperience/user-story/user-story.md @@ -0,0 +1,257 @@ +# Run the Demo + +## Introduction + +In this lab, you will step into the role of a **construction procurement officer** using a **next-generation procurement application powered by Oracle AI Database**. You will work through sample construction procurement scenarios and see how OCI Generative AI, AI Vector Search, Property Graph, and JSON Duality Views can help streamline manual review with faster, AI-driven decision-making. + +**Disclaimer**: Your results may vary. Some recommendations and responses are generated by OCI Generative AI services, so your output may differ from the examples shown in this lab. + +Estimated Time: 30 minutes + +### Objectives + +In this lab, you will: + +* Review how the **Seer Construction Procurement app** uses Oracle AI Database capabilities, including AI Vector Search, JSON Duality Views, Property Graph, and other converged database features, to support procurement review without requiring complex data movement or separate systems. + +### Prerequisites + +This lab assumes you have: + +* An Oracle account to submit your a LiveLabs Sandbox reservation. + +## Task 1: Launch the application + +1. In the LiveLabs reservation page, open the **Reservation Information** panel and scroll to the **Terraform Outputs** section. Click **Open Link** next to **Start the Demo** to launch the Seer Construction application in a new browser tab. + + ![Click the Start Demo Link](./images/start-demo.png =50%x*) + +2. On the Seer Construction login page, select **Construction Engineering** from the **Choose an Industry** menu and **Construction Procurement Manager** from the **Choose Your Role** menu. Enter any username, then click **Login**. + + ![Login](./images/login-coneng.png =50%x*) + +3. Welcome to the **Seer Construction Procurement Management** application. You are now connected to the demo environment. +On the **Supplier Evaluation Dashboard**, you should see the **Pending Projects** list. These are the construction procurement projects you will review during the lab. You are now ready to begin the demo tasks. + + ![Homepage](./images/loggedin-coneng.png =50%x*) + +## Task 2: Demo - Project with Low Risk Level + +In this first example, you will review and approve a low-risk project. The first project on your to-do list is project `1001`, **Downtown Mixed-Use Tower**. + +1. On the **Supplier Evaluation Dashboard**, go to the **Pending Projects** list. In the row for project `1001`, **Downtown Mixed-Use Tower**, click **Review** to open the project details. + + ![Select Project 1001](./images/review-p1001.png =50%x*) + +2. The **Downtown Mixed-Use Tower** project page opens with a project snapshot showing key procurement details, including project ID, project name, location, project phase, required trade, procurement urgency, budget range, and risk level. + Below the snapshot, review the **Project Analysis Powered by AI** section. For this project, the overall risk score is low, and the analysis summarizes the project requirements, sourcing needs, and documentation signals used to support an approval recommendation. + + ![P1001 AI generated recommendations](./images/p1001-ai.png =50%x*) + +3. At the bottom of the **Downtown Mixed-Use Tower** evaluation, you will find the **AI Procurement Guru**, a chatbot powered by **Oracle AI Database AI Vector Search and OCI Generative AI**. + When you ask a question, the system uses Retrieval-Augmented Generation, or **RAG**, to generate a grounded response. It converts the question into a vector embedding, searches the stored project and procurement context for the most relevant information, and then uses OCI Generative AI to generate a clear, natural-language answer. + + **Copy** the question below into the AI chatbot and press **Enter**: + + ```text + + Which project packages are the best fit when the sponsor wants to minimize site-prep work? + + ``` + + ![P1001 chatbot](./images/p1001-chatbot.png =50%x*) + + Review the response from the **AI Procurement Guru**. The answer should use the project and supplier context to recommend the best-fit supplier option and explain why. + + >💡 In Oracle AI Database, **AI Vector Search** helps combine your business data with a Large Language Model, or LLM, so the response can be grounded in your data and help reduce hallucinations. + + +4. Click **Navigate to Project Decisions**. + + ![P1001 Decision](./images/p1001-to-projectdecision.png =50%x*) + + This opens the decision page for **Downtown Mixed-Use Tower**. The application uses the project evaluation and supplier data stored in the database to generate decision-ready supplier options. + The AI evaluation compares the project requirements against available supplier recommendations and returns supplier options with supporting explanations. The prompt is designed to ground the response in the supplied project and supplier data, rather than relying on external information. + For this low-risk project, the AI recommendation supports approval and presents supplier options for the construction procurement manager to review. + +5. In the **Select Supplier Option** section, review the supplier options generated by the AI evaluation. Each option includes a recommendation and supporting rationale based on the project requirements and supplier data. For this low-risk scenario, you will proceed with the AI-recommended supplier instead of requesting more information. + +6. Select **Supplier Evaluation 7001: Atlas Structural Fabrication**. This is the AI-recommended option for this scenario because Atlas has strong mid-rise steel frame project experience, current AISC and AWS documentation, a high on-time delivery rate, and confirmed capacity for the six-week delivery window. + + >**Note**: Your generated recommendation text may vary because the supplier evaluation is produced by OCI Generative AI. If the wording differs from the screenshot, select the option that recommends Atlas Structural Fabrication for approval. + + ![ Approved Supplier](./images/p1001-confirm.png =50%x*) + +7. Set the final project status to **Approved**, then click **Confirm Decision**. A confirmation message appears indicating that the status was updated to **Approved** and saved to the **Downtown Mixed-Use Tower** project profile. + + ![ Confirmed Supplier](./images/p1001-confirmed.png =50%x*) + +8. Click **Download Decision PDF** to generate and download a PDF summary of the approved supplier decision. + + ![P1001 Download Recommendation](./images/p1001-pdf.png =50%x*) + +9. After the decision PDF is generated, click **Download PDF** to save the file locally. + + ![P1001 PDF](./images/p1001-openpdf.png =50%x*) + +10. Open the downloaded PDF to review the **Final Decision Notice**. This document summarizes the approved decision for **Downtown Mixed-Use Tower**, including the selected supplier, risk score, approval rationale, and next steps. + + ![P1001 PDF](./images/p1001-pdfv2.png =50%x*) + +11. Click **Return to Dashboard** to go back to the **Supplier Evaluation Dashboard**. + + ![Return to Dashboard](./images/p1001-dashboard.png =50%x*) + +12. Expand **View Approved Projects**. Confirm that project `1001`, **Downtown Mixed-Use Tower**, no longer appears in the **Pending Projects** list and now appears in the **Approved Projects** list with the status **Approved**. + + ![Approved List](./images/p1001-final-approved.png =50%x*) + + +**Conclusion** + +Once you select and save one of the AI-recommended supplier options: + +✅ The project evaluation status is updated to **Approved**. + +✅ A finalized PDF decision document is generated. + +✅ The dashboard reflects the change, moving project `1001`, **Downtown Mixed-Use Tower**, from **Pending Projects** to **Approved Projects**. + +Congratulations, you have just approved your first project. Proceed to the next task. + +## Task 3: Demo - Project with High risk level +In this example, you will review a high-risk project and deny it as part of the exercise. The second project on your list is project `1003`, **Harbor Seismic Retrofit**. + +1. On the **Supplier Evaluation Dashboard**, go to the **Pending Projects** list. In the row for project `1003`, **Harbor Seismic Retrofit**, click **Review** to open the project details. + + ![Select P1003](./images/select-p1003.png =50%x*) + +2. The **Harbor Seismic Retrofit** project profile opens with a project snapshot showing key procurement details, including project ID, location, project phase, required trade, procurement urgency, budget range, risk level, and evaluation status. + Below the snapshot, review the **Project Analysis Powered by AI** section. For this scenario, the project has an overall risk score of **9/10**, marked as **High Risk**. The AI analysis evaluates the project requirements and supplier evidence, then recommends a denial or new RFP if core requirements are not met. It also provides guidance on the risk factors that would need to be addressed before the project could move forward. + + ![Harbor Seismic Retrofit AI generated recommendations](./images/p1003-profile.png =50%x*) + +3. Click **Navigate to Project Decisions**. Before reviewing the decision page, consider the AI analysis shown above: why is the system recommending denial or a new RFP for **Harbor Seismic Retrofit**? + + ![P1003 Decision](./images/p1003-projectdecisions.png =50%x*) + + >⁉️ **Why is the AI recommending denial or a new RFP for this project?** ⁉️ + +4. Expand **Interactive Graph: Project, Supplier Recommendation & Risk** to view the graph. + + ![P1003 Open Graph](./images/p1003-opengraph.png =50%x*) + + On the decision page, the application uses Property Graph to show how the project, requirements, supplier recommendation, risk assessment, and evaluation status are connected. + + Review the graph for Harbor Seismic Retrofit. The graph helps explain why the AI recommends denial or a new RFP by showing the relationship between the project, its seismic steel bracing requirement, the denied recommendation, the high-risk assessment, and the current pending review status. + + ![P1003 Graph](./images/p1003-graph.png =50%x*) + + This connected view gives the construction procurement manager more context than a simple “Denied” label. It shows where the risk is coming from and helps the manager make a more informed final decision. + + >💡 In Oracle AI Database, **Property Graph** represents data as a network of connected points. Each point is a **node**, such as a project, requirement, supplier, recommendation, or risk. Each connection is an **edge**, such as a project having a requirement or a recommendation being associated with a risk. This helps users explore relationships and patterns directly in the database. + +5. Set the project status to **Denied**, then click **Confirm Decision**. A confirmation message appears indicating that the status was updated to **Denied** and saved to the **Harbor Seismic Retrofit** project profile. + + ![P1003 Save Project Status](./images/p1003-deny.png =50%x*) + +6. Click **Download Decision PDF** to generate the final decision document for the denied project decision. + + ![P1003 PDF](./images/p1003-download.png =50%x*) + +7. After the decision PDF is generated, click **Download PDF** to save the denied decision document locally. + + ![P1003 Download Recommendation](./images/p1003-download2.png =50%x*) + +8. Open the downloaded PDF and review the **Final Decision Notice** for **Harbor Seismic Retrofit**. The document summarizes the denied decision and provides next steps, such as submitting a new RFP for qualified seismic steel suppliers that meet the project’s compliance requirements. + + ![Open P1003 PDF](./images/p1003-pdf.png =50%x*) + +9. Click **Return to Dashboard** to go back to the **Supplier Evaluation Dashboard**. + + ![Return to Dashboard](./images/p1003-dashboard.png =50%x*) + +10. Expand **View Denied Projects**. Confirm that project `1003`, **Harbor Seismic Retrofit**, no longer appears in the **Pending Projects** list and now appears in the **Denied Projects** section with the status **Denied**. + + ![Denied List](./images/p1003-denied.png =50%x*) + + +**Conclusion** + +Once you review and save the high-risk project decision: + +✅ The project evaluation status is updated to **Denied**. + +✅ A finalized PDF decision document is generated. + +✅ The dashboard reflects the change, moving project `1003`, **Harbor Seismic Retrofit**, from **Pending Projects** to **Denied Projects**. + +Congratulations, you have finished reviewing and denying the high-risk project. Proceed to the next task. + +## Task 4: Demo - Update Customer Details + +In this task, you will see how the application uses **JSON Duality Views** to update project information. You will open the **North Campus Lab Expansion** project, upload an updated Construction Supplier Evaluation document, and review how the project details are updated in the application. + +This demonstrates how the app can apply updates to the project profile while keeping the underlying relational database structure in sync. + +1. On the **Supplier Evaluation Dashboard**, go to the **Pending Projects** list. In the row for project `1004`, **North Campus Lab Expansion**, click **Review** to open the project details. + + ![Select P1004](./images/p1004-review.png =50%x*) + +2. On the **North Campus Lab Expansion** project page, review the **Project Snapshot** and note that the current budget range is **$1.1M–$1.6M**. You will upload a document that contains updated project information, including a revised budget. In the **Document Intake** section, click **Upload Document**. + + ![Upload Document](./images/p1004-uploaddoc.png =50%x*) + +3. The PDF file is now loaded. Click **Process PDF** to extract the updated project information from the document. The application processes the PDF, identifies the relevant budget update, and applies the change to the project profile. + + ![Click Process Selected PDF](./images/p1004-processdoc.png =50%x*) + + >💡 **JSON Duality Views** let the application update project data through a JSON-based structure while keeping the underlying relational tables in sync. In this demo, the app uses the uploaded document to update only the relevant project field instead of requiring a manual database update. + +4. After the PDF is processed, the project profile is updated and the analysis reruns with the new information. If the page does not refresh automatically, refresh the page. In the **Project Snapshot**, confirm that the **Budget Range** has changed from **$1.1M–$1.6M** to **$3.0M–$3.5M**. The application uses **JSON Transform** and **JSON Duality Views** to update only the relevant project field while leaving the rest of the project profile unchanged. + + ![Project Profile Updated](./images/p1004-uploadedpdf2.png) + + +**Conclusion**: + +Once the document is uploaded and processed: + +✅ The system automatically detects the updated budget information from the PDF. + +✅ The **North Campus Lab Expansion** project profile is updated from **$1.1M–$1.6M** to **$3.0M–$3.5M**. + +✅ The project analysis reruns using the updated project information. + +✅ Thanks to **JSON Transform** and **JSON Duality Views**, only the relevant project field is modified while the rest of the project profile remains unchanged. + +Congratulations, you have updated a project profile using information extracted from a document. Proceed to the lab summary. + +## Summary + +In this lab, you explored how the **Seer Construction Procurement app** uses Oracle AI Database capabilities to support construction procurement review. + +You saw how the application can: + +✅ Use **AI Vector Search** and OCI Generative AI to provide grounded, AI-driven supplier recommendations. + +✅ Use **RAG** to answer project and supplier questions with retrieved business context. + +✅ Use **Property Graph** to show relationships between projects, requirements, supplier recommendations, risk, and evaluation status. + +✅ Use **JSON Duality Views and JSON Transform** to update project profile information while keeping the underlying relational data in sync. + +✅ Help construction procurement managers make faster, better-informed approval, denial, and request-for-information decisions. + +By combining these Oracle AI Database capabilities, the application helps streamline procurement review, explain recommendations, and keep project data updated from a single application experience. + +**Next**: In the next lab, you will learn how this application flow was implemented in Python. + +## Learn More + +* [Oracle AI Database Documentation](https://docs.oracle.com/en/database/oracle/oracle-database/23/) + +## Acknowledgements +* **Authors** - Linda Foinding, Francis Regalado +* **Contributors** - Eddie Ambler, Ramona Magadan, Mark Nelson, Andy Tael, Anders Swanson, Rahul Tasker +* **Last Updated By/Date** - Taylor Zheng, Uma Kumar, Deion Locklear, Daniet Hart, July 2026 diff --git a/dev-ai-app-dev-constructioneng-aiexperience/workshops/sandbox/index.html b/dev-ai-app-dev-constructioneng-aiexperience/workshops/sandbox/index.html new file mode 100644 index 000000000..471847eb9 --- /dev/null +++ b/dev-ai-app-dev-constructioneng-aiexperience/workshops/sandbox/index.html @@ -0,0 +1,63 @@ + + + + + + + + + Oracle LiveLabs + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + + + + diff --git a/dev-ai-app-dev-constructioneng-aiexperience/workshops/sandbox/manifest.json b/dev-ai-app-dev-constructioneng-aiexperience/workshops/sandbox/manifest.json new file mode 100644 index 000000000..b74a58b9f --- /dev/null +++ b/dev-ai-app-dev-constructioneng-aiexperience/workshops/sandbox/manifest.json @@ -0,0 +1,26 @@ +{ + "workshoptitle": "Build a GenAI App on Oracle AI Database – Construction Engineering Edition", + "help": "livelabs-help-database_us@oracle.com", + "tutorials": [ + { + "title": "Introduction", + "description": "The Introduction is always first. The title and contents menu title match for the Introduction.", + "filename": "../../introduction/introduction.md" + }, + { + "title": "Lab 1: Run the Demo", + "description": "Labs that follow the introduction are numbered, starting with Lab 1", + "filename": "../../user-story/user-story.md" + }, + { + "title": "Lab 2: Step by Step - Implement RAG with Oracle AI Database", + "description": "This is a step-by-step guide showcasing how the demo instance is navigated", + "filename": "../../build/build.md" + }, + { + "title": "Need Help?", + "description": "Solutions to Common Problems and Directions for Receiving Live Help", + "filename": "https://livelabs.oracle.com/cdn/common/labs/need-help/need-help-freetier.md" + } + ] +} diff --git a/dev-ai-app-dev-constructioneng-aiexperience/workshops/sandbox_aiw/index.html b/dev-ai-app-dev-constructioneng-aiexperience/workshops/sandbox_aiw/index.html new file mode 100644 index 000000000..471847eb9 --- /dev/null +++ b/dev-ai-app-dev-constructioneng-aiexperience/workshops/sandbox_aiw/index.html @@ -0,0 +1,63 @@ + + + + + + + + + Oracle LiveLabs + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + + + + diff --git a/dev-ai-app-dev-constructioneng-aiexperience/workshops/sandbox_aiw/manifest.json b/dev-ai-app-dev-constructioneng-aiexperience/workshops/sandbox_aiw/manifest.json new file mode 100644 index 000000000..50ddc6fe9 --- /dev/null +++ b/dev-ai-app-dev-constructioneng-aiexperience/workshops/sandbox_aiw/manifest.json @@ -0,0 +1,41 @@ +{ + "workshoptitle": "Build a GenAI App on Oracle AI Database – Construction Engineering Edition", + "help": "livelabs-help-database_us@oracle.com", + "tutorials": [ + { + "title": "Introduction", + "description": "The Introduction is always first. The title and contents menu title match for the Introduction.", + "filename": "../../introduction/introduction.md" + }, + { + "title": "Lab 1: Run the Demo", + "description": "Labs that follow the introduction are numbered, starting with Lab 1", + "filename": "../../user-story/user-story.md" + }, + { + "title": "Lab 2: Connect to the Development Environment", + "description": "This is a step-by-step guide showcasing how the demo instance is navigated", + "filename": "https://livelabs.oracle.com/cdn/developer/dev-ai-app-dev-retail/connect-to-env/connect-to-env.md" + }, + { + "title": "Lab 3: Coding Basics on Oracle AI Database", + "description": "Some coding examples", + "filename": "https://livelabs.oracle.com/cdn/developer/dev-ai-app-dev-retail/codingbasics/codingbasics.md" + }, + { + "title": "Lab 4: Step by Step - Implement RAG with Oracle AI Database", + "description": "This is a step-by-step guide showcasing how the demo instance is navigated", + "filename": "../../build/build.md" + }, + { + "title": "Lab 5: Build Agentic AI with Oracle MCP", + "description": "This is a step-by-step guide showcasing how the demo instance is navigated", + "filename": "https://livelabs.oracle.com/cdn/developer/dev-ai-app-dev-retail/oraclemcp/oraclemcp.md" + }, + { + "title": "Need Help?", + "description": "Solutions to Common Problems and Directions for Receiving Live Help", + "filename": "https://livelabs.oracle.com/cdn/common/labs/need-help/need-help-freetier.md" + } + ] +} diff --git a/dev-ai-app-dev-constructioneng-aiexperience/workshops/tenancy/index.html b/dev-ai-app-dev-constructioneng-aiexperience/workshops/tenancy/index.html new file mode 100644 index 000000000..471847eb9 --- /dev/null +++ b/dev-ai-app-dev-constructioneng-aiexperience/workshops/tenancy/index.html @@ -0,0 +1,63 @@ + + + + + + + + + Oracle LiveLabs + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + + + + diff --git a/dev-ai-app-dev-constructioneng-aiexperience/workshops/tenancy/manifest.json b/dev-ai-app-dev-constructioneng-aiexperience/workshops/tenancy/manifest.json new file mode 100644 index 000000000..2b0525d31 --- /dev/null +++ b/dev-ai-app-dev-constructioneng-aiexperience/workshops/tenancy/manifest.json @@ -0,0 +1,96 @@ +{ + "workshoptitle": "Build a GenAI App on Oracle AI Database – Construction Engineering Edition", + "help": "livelabs-help-database_us@oracle.com", + "tutorials": [ + { + "title": "Introduction", + "description": "The Introduction is always first. The title and contents menu title match for the Introduction.", + "filename": "../../introduction/introduction.md" + }, + { + "title": "Get Started", + "description": "Prerequisites for LiveLabs (Oracle-owned tenancies). The title of the lab and the Contents Menu title (the title above) match for Prerequisite lab. This lab is always first.", + "filename": "../../cloud-login/cloud-login.md" + }, + { + "title": "Lab 1: Demo Guide", + "description": "Labs that follow the introduction are numbered, starting with Lab 1", + "filename": "../../user-story/user-story.md" + }, + { + "title": "Lab 2: Connect to Development Environment", + "description": "This is a step-by-step guide showcasing how the demo instance is navigated", + "filename": "https://livelabs.oracle.com/cdn/developer/dev-ai-app-dev-retail/connect-to-env/connect-to-env.md" + }, + { + "title": "Lab 3: Start coding with Oracle AI Database", + "description": "Some coding examples", + "filename": "../../codingbasics/codingbasics.md" + }, + { + "title": "Lab 4: Step by Step - Implement RAG with Oracle AI Database", + "description": "This is a step-by-step guide showcasing how the demo instance is navigated", + "filename": "../../build/build.md" + }, + { + "title": "Lab 5a Challenge Yourself: Code with AI Vector Search", + "description": "Labs that follow the introduction are numbered, starting with Lab 1", + "filename": "../../ai-exercise/ai-vector-search-challenge.md" + }, + { + "title": "Lab 5b Step-by-step: Code with AI Vector Search", + "description": "Labs that follow the introduction are numbered, starting with Lab 1", + "filename": "../../ai-exercise/ai-vector-search-challenge-answers.md" + }, + { + "title": "Lab 6a Challenge Yourself: Code with Property Graph", + "description": "This is a step-by-step guide showcasing how the demo instance is navigated", + "filename": "../../graph-exercise/graph-exercise.md" + }, + { + "title": "Lab 6b Step-by-step: Code with Property Graph", + "description": "This is a step-by-step guide showcasing how the demo instance is navigated", + "filename": "../../graph-answers/graph-answers.md" + }, + { + "title": "Lab 7a Challenge Yourself: Code with JSON Duality Views", + "description": "This is a step-by-step guide showcasing how the demo instance is navigated", + "filename": "../../json-exercise/json-exercise.md" + }, + { + "title": "Lab 7b Step-by-step: Code with JSON Duality Views", + "description": "This is a step-by-step guide showcasing how the demo instance is navigated", + "filename": "../../json-answers/json-answers.md" + }, + { + "title": "Lab 8 Challenge Yourself: Create a Creditreport Microservice", + "description": "This is a step-by-step guide showcasing how the demo instance is navigated", + "filename": "../../microservice-creport/creditreport-exercise.md.md" + }, + { + "title": "Lab 9 Challenge Yourself: Spatial Development with Oracle AI Database", + "description": "This is a step-by-step guide showcasing how the demo instance is navigated", + "filename": "../../spatial/spatial.md" + }, + { + "title": "Lab 10a Challenge Yourself: Code with Transactional Event Queues", + "description": "This is a step-by-step guide showcasing how the demo instance is navigated", + "filename": "../../messaging-exercise/messaging-exercise.md" + }, + { + "title": "Lab 10b Step-by-step: Code with Transactional Event Queues", + "description": "This is a step-by-step guide showcasing how the demo instance is navigated", + "filename": "../../messaging-answers/messaging-answers.md" + }, + { + "title": "Application Architecture", + "description": "Review the physical and logical architecture behind the application", + "filename": "../../app-architecture/app-architecture.md" + }, + { + "title": "Need Help?", + "description": "Solutions to Common Problems and Directions for Receiving Live Help", + "filename": "https://livelabs.oracle.com/cdn/common/labs/need-help/need-help-freetier.md" + } + ] +} diff --git a/dev-ai-app-dev-finance-aiexperience/app-architecture/app-architecture.md b/dev-ai-app-dev-finance-aiexperience/app-architecture/app-architecture.md index c23208eb2..19af72d1b 100644 --- a/dev-ai-app-dev-finance-aiexperience/app-architecture/app-architecture.md +++ b/dev-ai-app-dev-finance-aiexperience/app-architecture/app-architecture.md @@ -6,6 +6,16 @@ In this lab, you will explore the architecture behind the workshop that supports Estimated Lab Time: 15 minutes +### Objectives + +In this lab, you will: + +* Review the OCI architecture that supports the SeerEquities loan + application +* Understand how JSON Duality Views, AI Vector Search, and Property + Graph support the loan approval workflow +* Connect the workshop labs to the application design used in the demo + ## Physical Architecture The SeerEquities loan application runs in an **Oracle Cloud Infrastructure (OCI)** Region, with its application layer in a public subnet inside a **Virtual Cloud Network (VCN)**. @@ -69,4 +79,4 @@ Property graphs simplify working with connected data, such as identifying influe ## Acknowledgements * **Authors** - Linda Foinding, Francis Regalado * **Contributors** - Eddie Ambler -* **Last Updated By/Date** - Linda Foinding, April 2025 \ No newline at end of file +* **Last Updated By/Date** - Linda Foinding, April 2025 diff --git a/dev-ai-app-dev-finance-aiexperience/build/build.md b/dev-ai-app-dev-finance-aiexperience/build/build.md index 24b6281a3..2e4467c0f 100644 --- a/dev-ai-app-dev-finance-aiexperience/build/build.md +++ b/dev-ai-app-dev-finance-aiexperience/build/build.md @@ -162,7 +162,9 @@ else: ![Open Terminal](./images/lab4task3.png " ") -If you completed Lab 1: Run the Demo earlier, this is what gets printed out when the loan officer clicks on the customer 1000. You just built it, well done! + If you completed Lab 1: Run the Demo earlier, this is what gets + printed out when the loan officer clicks on customer `1000`. You + just built it, well done! ## Task 6: Create a function to generate recommendations for the customer @@ -498,4 +500,4 @@ You may now proceed to the next lab. ## Acknowledgements * **Authors** - Francis Regalado -* **Last Updated By/Date** - Uma Kumar, December 2025 \ No newline at end of file +* **Last Updated By/Date** - Uma Kumar, December 2025 diff --git a/dev-ai-app-dev-finance-aiexperience/codingbasics/codingbasics.md b/dev-ai-app-dev-finance-aiexperience/codingbasics/codingbasics.md index 9d1abd611..5e1c66ba8 100644 --- a/dev-ai-app-dev-finance-aiexperience/codingbasics/codingbasics.md +++ b/dev-ai-app-dev-finance-aiexperience/codingbasics/codingbasics.md @@ -86,7 +86,15 @@ In this first task, you will connect to an Oracle AI Database instance using Ora ![connect](./images/connect.png " ") ->**Note:** The last line, `cursor = connection.cursor()`, creates a cursor object from the established Oracle AI Database connection. A cursor acts as a control structure that enables the execution of SQL queries and retrieval of results from the database. It is essential for sending SQL commands, fetching data, and iterating through query results. We will be using the cursor object in later steps of this lab. The object persists in the notebook session, so you can use it in subsequent cells without re-establishing the connection. + > **Note:** The last line, `cursor = connection.cursor()`, creates + > a cursor object from the established Oracle AI Database + > connection. A cursor acts as a control structure that enables the + > execution of SQL queries and retrieval of results from the + > database. It is essential for sending SQL commands, fetching + > data, and iterating through query results. We will be using the + > cursor object in later steps of this lab. The object persists in + > the notebook session, so you can use it in subsequent cells + > without re-establishing the connection. ## Task 3: Create tables and insert data @@ -141,7 +149,9 @@ Now, that we have established a connection, we can start creating our tables and ``` ->**Note:** We are creating a function called `query_orders()` that will allow us to query our table. We can use the same function in one of the following tasks + > **Note:** We are creating a function called `query_orders()` + > that will allow us to query our table. We can use the same + > function in one of the following tasks. 3. Run your code (**shift+enter**) and see what happens. You should get a list of all the orders in our table. @@ -197,11 +207,13 @@ Now, that we have established a connection, we can start creating our tables and ![query customers](./images/task3.png " ") -### **Task Summary** + ### **Task Summary** -Congratulations! You successfully created two new tables with sample data using Python and Oracle AI Database. + Congratulations! You successfully created two new tables with + sample data using Python and Oracle AI Database. -You also created a function that allows you to query your new table which we will use in some of the following tasks + You also created a function that allows you to query your new table + which we will use in some of the following tasks. ## Task 4: Create a JSON Duality View @@ -269,7 +281,12 @@ Next, we want to explore how we can use a **JSON Duality View** to query our new ![dv](./images/dv.png " ") ->💡 **JSON Duality Views** automatically maps relational columns to JSON documents (and vice versa) in the same table, letting you store data in a traditional schema but also access it as if it were a JSON object. So even though you’ve coded a JSON view in Python, you can switch over to standard SQL queries without duplicating data or maintaining extra structures. Super cool! + > 💡 **JSON Duality Views** automatically maps relational columns + > to JSON documents (and vice versa) in the same table, letting you + > store data in a traditional schema but also access it as if it + > were a JSON object. So even though you have coded a JSON view in + > Python, you can switch over to standard SQL queries without + > duplicating data or maintaining extra structures. 3. Let's create a new function that allows us to query our new JSON Duality View. This time however, we will enhance our function to allow using input parameters. Instead of retrieving all rows, we want to write a function that returns only a specific row based on the first name of a customer. Copy the following code into a new cell and run it. @@ -311,7 +328,9 @@ Next, we want to explore how we can use a **JSON Duality View** to query our new 🔴 **`query_dv("Dan")`** - Here we are calling our query function again, but this time passing in the string `"Dan"` as a parameter. This will return all rows where `first_name` is equal to `"Dan"`. The result is displayed in JSON format. ->**Note:** Notice that our output is a nicely formatted document that now not only includes our customer data but also all orders for that customer. + > **Note:** Notice that our output is a nicely formatted document + > that now not only includes our customer data but also all orders + > for that customer. ## Task 5: Connect to the database using pymongo diff --git a/dev-ai-app-dev-finance-aiexperience/introduction/introduction.md b/dev-ai-app-dev-finance-aiexperience/introduction/introduction.md index 2e9c1808c..bdca7e13e 100644 --- a/dev-ai-app-dev-finance-aiexperience/introduction/introduction.md +++ b/dev-ai-app-dev-finance-aiexperience/introduction/introduction.md @@ -10,6 +10,8 @@ This workshop shows how SeerGroup tackles that problem with Oracle AI Database You’ll see how SeerGroup’s teams can move from manual, fragmented workflows to AI-powered applications—and you’ll build the same capabilities yourself in the labs that follow. +Estimated Workshop Time: 90 minutes + ✅ **Start with the demo! (Lab 1)** Step into SeerGroup’s Finance division as a Loan Officer. You’ll use an AI-powered loan approval app built on Oracle AI Database to: @@ -36,7 +38,7 @@ Wire Oracle AI Database and OCI Generative AI into reusable MCP tools. Call them By the end, you’ll have a complete toolkit—from clean data to live AI apps to composable tools—that shows how SeerGroup industries can turn their data into intelligent applications. -**Objectives** +### Objectives * Build and query data with Python + Oracle AI Database @@ -48,7 +50,7 @@ By the end, you’ll have a complete toolkit—from clean data to live AI apps t * Deliver industry-grade solutions for SeerGroup’s divisions -**Prerequisites** +### Prerequisites This lab assumes you have: @@ -65,4 +67,4 @@ This lab assumes you have: ## Acknowledgements * **Authors** - Uma Kumar * **Contributors** - Linda Foinding -* **Last Updated By/Date** - Uma Kumar, December 2025 \ No newline at end of file +* **Last Updated By/Date** - Uma Kumar, December 2025 diff --git a/dev-ai-app-dev-finance-aiexperience/local-tenancy/local-tenancy.md b/dev-ai-app-dev-finance-aiexperience/local-tenancy/local-tenancy.md index ccded3061..b3ea33f80 100644 --- a/dev-ai-app-dev-finance-aiexperience/local-tenancy/local-tenancy.md +++ b/dev-ai-app-dev-finance-aiexperience/local-tenancy/local-tenancy.md @@ -2,7 +2,11 @@ ## Introduction -This lab will show you how to setup and run the Seer Equities Loan Approval application on OCI. This guide is designed to walk you through the complete setup process, which includes provisioning required services and installing dependencies enabling you to launch and run the application on OCI. +This lab will show you how to set up and run the Seer Equities Loan +Approval application on OCI. This guide walks you through the complete +setup process, including provisioning the required services and +installing the dependencies needed to launch and run the application on +OCI. The document is structured to help you meet all prerequisites, configure both the Autonomous AI Database and the OCI Generative AI Service, and troubleshoot any issues that may arise during setup. Whether you're new to Oracle Cloud Infrastructure or simply deploying for development and testing, this step-by-step guide will ensure a smooth setup experience. @@ -22,7 +26,9 @@ By the end of this section, you will be able to: - Launch and interact with the application using Streamlit. -> 💡Note: This guide is intended for development and testing purposes. For production deployment, additional configuration and security hardening will be required. +> 💡Note: This guide is intended for development and testing purposes. +> For production deployment, additional configuration and security +> hardening will be required. Let’s get started! @@ -72,47 +78,51 @@ Let’s get started! ![Review the basic VM information](./images/review-basic-information.png " ") -12. The instance will begin provisioning and in a few moments the state will change to **Succeeded** and then to **Running**. +12. The instance will begin provisioning and in a few moments the state + will change to **Succeeded** and then to **Running**. - ![Compute Instance success](./images/create-instance-succeeded.png " ") + ![Compute Instance success](./images/create-instance-succeeded.png " ") -In the next step, you'll add 5 ingress rules to allow traffic on specific ports within your VCN. + In the next step, you'll add 5 ingress rules to allow traffic on + specific ports within your VCN. 13. Click on the **Navigation Menu** and select **Networking** then **Virtual Cloud Networks**. -![Select VCN](./images/select-vcn.png " ") + ![Select VCN](./images/select-vcn.png " ") 14. Click the VCN link that was created along with your compute instance. 15. Click the **Security** tab, then click on the **Default Security List for vcn-xxxxx**. -![Select VCN](./images/click-default-security-list.png " ") + ![Select VCN](./images/click-default-security-list.png " ") 16. Click the **Security Rules** tab, then click the **Add Ingress Rules** under the Ingress Rules section. Note that port 22 is already enabled for SSH communication. ![Click Add Ingress Rules](./images/click-add-ingress-rules.png " ") -17. For each rule, add 0.0.0.0/0 as the **Source CIDR** and add the specific port below to the **Destination Port Range** field. Click **+ Another Ingress Rule** after each entry. +17. For each rule, add `0.0.0.0/0` as the **Source CIDR** and add the + specific port below to the **Destination Port Range** field. Click + **+ Another Ingress Rule** after each entry. -Add 5 rules using the below information. + Add 5 rules using the following information. -| Ingress Rule # | Source CIDR | Port # | -| ------------- | ------------- | ------------ | -| 1 | 0.0.0.0/0 | 80 | -| 2 | 0.0.0.0/0 | 1521 | -| 3 | 0.0.0.0/0 | 1522 | -| 4 | 0.0.0.0/0 | 8501 | -| 5 | 0.0.0.0/0 | 8502 | + | Ingress Rule # | Source CIDR | Port # | + | --- | --- | --- | + | 1 | 0.0.0.0/0 | 80 | + | 2 | 0.0.0.0/0 | 1521 | + | 3 | 0.0.0.0/0 | 1522 | + | 4 | 0.0.0.0/0 | 8501 | + | 5 | 0.0.0.0/0 | 8502 | {: title="Ingress rules"} + When you've added all 5 ingress rules, click the **Add Ingress + Rules** button at the bottom right of the page. -When you've added all 5 ingress rules, click the **Add Ingress Rules** button at the bottom right of the page. + ![Add Ingress Rules](./images/add-ingress-rules-all.png " ") - ![Add Ingress Rules](./images/add-ingress-rules-all.png " ") + Your default security list should look like the screenshot below. -Your default security list should look like the below screenshot. - - ![Complete default security list](./images/default-security-list-final.png " ") + ![Complete default security list](./images/default-security-list-final.png " ") ## Task 2: Access and update the VM @@ -126,7 +136,11 @@ Your default security list should look like the below screenshot. ![Copy Public IP](./images/copy-ip.png " ") -4. Type or copy/paste the following command into your terminal. Replace ssh\_key\_name with the name of your private key. Replace public\_ip with the public IP you just copied from your VM. The '-i' switch allows you to specify the location where your SSH keys are stored. +4. Type or copy/paste the following command into your terminal. Replace + `ssh_key_name` with the name of your private key. Replace + `public_ip` with the public IP you just copied from your VM. The + `-i` switch allows you to specify the location where your SSH keys + are stored. ```` @@ -137,7 +151,7 @@ Your default security list should look like the below screenshot. ![Open Terminal](./images/open-terminal.png " ") -6. Run the command below to update the VM. It will take a few minutes. +5. Run the command below to update the VM. It will take a few minutes. ```` @@ -147,7 +161,8 @@ Your default security list should look like the below screenshot. ![Open Terminal](./images/login-with-ssh-key.png " ") -7. Once the VM has been updated install python3.11, pip, and the oci cli application. Run the commands below: +6. Once the VM has been updated, install Python 3.11, pip, and the OCI + CLI application. Run the commands below: ```` @@ -173,66 +188,11 @@ Your default security list should look like the below screenshot. ```` - ``` - - sudo dnf install python39-oci-cli -y - - - - ## Task 3: Provision an Autonomous AI Database @@ -240,11 +200,11 @@ The application is built for Autonomous AI Database. Follow the steps to provisi 1. Click the navigation menu in the upper left of the OCI console, choose **Oracle AI Database** then **Autonomous AI Database**. - ![Choose Autonomous AI Database](./images/choose-autonomous.png " ") + ![Choose Autonomous AI Database](./images/choose-autonomous.png " ") 2. Verify that the filter option reflects the correct compartment and click the **Create Autonomous AI Database** button. - ![Create Autonomous AI Database](./images/create-adb.png " ") + ![Create Autonomous AI Database](./images/create-adb.png " ") 3. Use the information in the table below to fill out the **Create Autonomous AI Database Serverless** form. Proceed to the next step for instructions on setting up **Network Access**. @@ -259,17 +219,22 @@ The application is built for Autonomous AI Database. Follow the steps to provisi | Password | Password1234! | {: title="ADB configuration details overview"} - ![Create Autonomous AI Database form](./images/create-adb-form.png " ") + ![Create Autonomous AI Database form](./images/create-adb-form.png " ") -1. In the **Network access** section, choose **Secure access from allowed IPs and VCNs only**. In the **IP notation type** drop-down, choose **CIDR block**. For values, enter **0.0.0.0/0**. Verify that **Require mutual TLS (mTLS) authentication** is disabled. Click the **Create** button. +4. In the **Network access** section, choose **Secure access from + allowed IPs and VCNs only**. In the **IP notation type** + drop-down, choose **CIDR block**. For values, enter + **0.0.0.0/0**. Verify that **Require mutual TLS (mTLS)** + authentication is disabled. Click the **Create** button. - ![Create Autonomous AI Database form](./images/atp-security-mtls.png " ") + ![Create Autonomous AI Database form](./images/atp-security-mtls.png " ") -2. The ATP Database will enter the provisioning state. +5. The ATP Database will enter the provisioning state. ![Provisioning an Autonomous AI Database instance](./images/provisioning-atp.png " ") -3. Once the state changes to **Available**, the Autonomous Transaction Processing database is ready to use! +6. Once the state changes to **Available**, the Autonomous Transaction + Processing database is ready to use. ![Provisioning an Autonomous AI Database instance](./images/atp-detail-review.png " ") @@ -277,23 +242,28 @@ The application is built for Autonomous AI Database. Follow the steps to provisi The application environment has been created and zipped up for you in a downloadable package. -1. Return to the terminal connected to the VM. From the /home/opc directory, enter the following command in your terminal to download the application package to your virtual machine. +1. Return to the terminal connected to the VM. From the `/home/opc` + directory, enter the following command to download the application + package to your virtual machine. -``` + ```` wget https://c4u04.objectstorage.us-ashburn-1.oci.customer-oci.com/p/EcTjWk2IuZPZeNnD_fYMcgUhdNDIDA6rt9gaFj_WZMiL7VvxPBNMY60837hu5hga/n/c4u04/b/livelabsfiles/o/database/ai-app-build-local.zip -``` + ```` 2. Unzip the file. -``` + ```` unzip ai-app-build-local.zip -``` + ```` -Next we're going to generate an oci configuration file that will contain user credentials and other settings needed for interacting with Oracle Cloud. In order to prepare for this step you'll need to gather the user OCID, the tenancy OCID, and the tenancy region and store these in a text file. + Next, generate an OCI configuration file that will contain user + credentials and other settings needed for interacting with Oracle + Cloud. To prepare for this step, gather the user OCID, tenancy + OCID, and tenancy region, then store them in a text file. 3. Find the user OCID: Click the profile icon in the upper right corner of the OCI console and choose **User settings**. @@ -303,25 +273,28 @@ Next we're going to generate an oci configuration file that will contain user cr ![User OCID](./images/user-ocid.png " ") -5. Tenancy OCID: Click the profile icon in the upper right corner of the OCI console and choose **Tenancy:*your tenancy name*** +5. To find the tenancy OCID, click the profile icon in the upper right + corner of the OCI console and choose **Tenancy: _your tenancy + name_**. - ![User OCID](./images/your-tenancy-name.png " ") + ![User OCID](./images/your-tenancy-name.png " ") 6. Locate the tenancy OCID and click the **Copy** button to copy the OCID. Paste it into your text file. - ![User OCID](./images/your-tenancy-name-2.png " ") + ![User OCID](./images/your-tenancy-name-2.png " ") 7. Identify the home region of your tenancy located on the top bar of the console toward the right. Note that information in your text file. - ![User OCID](./images/region.png " ") + ![User OCID](./images/region.png " ") 8. With the above information handy, run the following command in the terminal. -``` + ```` oci setup config -``` + ```` + 9. Hit return to accept the default config file location of /home/opc/.oci/config 10. Enter your user OCID, tenancy OCID, and select your region from the list by using the corresponding number. @@ -332,17 +305,18 @@ Next we're going to generate an oci configuration file that will contain user cr 13. Press **Enter** to accept the default name of *oci_api_key*. -14. Enter *N/A* twice to eliminate the need for a passphrase. (Your output won't show up in the terminal screen.) +14. Enter *N/A* twice to eliminate the need for a passphrase. (Your + output won't show up in the terminal screen.) -Next you'll create an environment file for the application. + Next, you'll create an environment file for the application. 15. Create the .env file that will hold connection information for your application. -```` + ```` touch .env -```` + ```` 16. Use your favorite editor to open and edit the file. @@ -354,7 +328,7 @@ Next you'll create an environment file for the application. 17. The following information needs to be collected and inserted into the .env file. Copy the 9 lines below and paste them in the .env file. Follow the steps below to gather the required information and place it in the file. - ``` + ```` USERNAME="" DBPASSWORD="" @@ -366,7 +340,7 @@ Next you'll create an environment file for the application. TENANCY_OCID="" ENDPOINT=https://inference.generativeai.us-chicago-1.oci.oraclecloud.com - ``` + ```` 18. The database username should be 'admin'. Use the password that you assigned to the admin user. (Password1234!). Make sure all the information you enter into the file stays between the quotes. @@ -424,7 +398,8 @@ Next you'll create an environment file for the application. ```` - This will create a directory called loan_env that will contain your virtual environment. + This will create a directory called `loan_env` that will contain + your virtual environment. 2. Enable the firewall for the application port. Run the following commands: @@ -477,31 +452,6 @@ Next you'll create an environment file for the application. ```` - - 5. Activate the virtual environment. Enter the following command. ```` @@ -518,21 +468,6 @@ Next you'll create an environment file for the application. ```` - - 7. Install the required applications from the supplied requirements.txt file. ``` @@ -549,14 +484,14 @@ fpdf ```` -9. Install sqlcl +9. Install sqlcl. ```` sudo yum install sqlcl -y ```` -10. Reload the daemons and enable streamlit +10. Reload the daemons and enable Streamlit. ```` @@ -582,7 +517,8 @@ fpdf ```` -Streamlit is up and running. Press Control + C on your keyboard to escape. + Streamlit is up and running. Press **Control+C** on your keyboard + to exit the status view. ## Task 5: Launch the Application @@ -613,13 +549,17 @@ Streamlit is up and running. Press Control + C on your keyboard to escape. 4. Open a web browser. -5. Type in the IP address of the VM followed by :8501 into the incognito window.. You can obtain it from the OCI Console - VM details screen. +5. Type the IP address of the VM followed by `:8501` into the + incognito window. You can obtain it from the OCI Console VM details + screen. 6. Success! You should see the application start screen. ![Application start screen](./images/application-start-screen.png " ") -Congratulations, you have built and configured the Loan Management application using Oracle Cloud Insfrastructure, Oracle Autonomous AI Database, and Oracle GenAI! + Congratulations, you have built and configured the loan approval + application using Oracle Cloud Infrastructure, Oracle Autonomous AI + Database, and Oracle GenAI. ## Troubleshooting @@ -632,14 +572,17 @@ If you encounter any issues during the setup, here are a few common troubleshoot ```` pip install oci - ```` * **GenAI Access Issues**: Verify your user/group has the correct IAM policy applied. * **Virtual Environment Not Activating**: Ensure that you're using the correct command for your operating system. If the issue persists, try recreating the virtual environment. -* **Dependencies Installation Issues**: Double-check the requirements.txt file to ensure it contains the correct package names. If a specific package fails, you can try installing it manually with pip install . +* **Dependencies Installation Issues**: Double-check the + `requirements.txt` file to ensure it contains the correct package + names. If a specific package fails, you can try installing it + manually with `pip install your-package-name`. * **Database Connection Errors**: Ensure that the database credentials in the .env file are correct and that you have access to the Autonomous AI Database. @@ -668,4 +611,4 @@ You may now **proceed to the next lab**. ## Acknowledgements - **Created By/Date** - Linda Foinding -- **Last Updated By/Date** - Linda Foinding, July 2025 \ No newline at end of file +- **Last Updated By/Date** - Linda Foinding, July 2025 diff --git a/dev-ai-app-dev-finance-aiexperience/user-story/user-story.md b/dev-ai-app-dev-finance-aiexperience/user-story/user-story.md index 354755dc9..a2f8c76e2 100644 --- a/dev-ai-app-dev-finance-aiexperience/user-story/user-story.md +++ b/dev-ai-app-dev-finance-aiexperience/user-story/user-story.md @@ -103,17 +103,19 @@ In this first example, you will use the application to approve a customer with s ![James Smith Approved List](./images/james-smith-final.png =50%x*) -**Conclusion** + **Conclusion** -Once you select and save one of the 3 loans recommended by the AI: + Once you select and save one of the 3 loans recommended by the AI: -✅ The customer's loan status is updated. + ✅ The customer's loan status is updated. -✅ A finalized PDF decision document is generated. + ✅ A finalized PDF decision document is generated. -✅ The dashboard reflects the change in real-time — marking James as Approved. + ✅ The dashboard reflects the change in real-time — marking James + as Approved. -Congratulations, you have just approved your first customer loan! Proceed to the next task. + Congratulations, you have just approved your first customer loan! + Proceed to the next task. ## Task 3: Demo - Denying a customer with high risk In this example, you will navigate the application to review a customer and deny them as part of the exercise. The second user on your to-do list is James Woods. @@ -179,9 +181,10 @@ In this example, you will navigate the application to review a customer and deny ![James Woods Denied List](./images/woods-decision3.png =50%x*) -**Conclusion** + **Conclusion** -Congratulations, you have finished reviewing a customer with high financial risk! Proceed to the next task. + Congratulations, you have finished reviewing a customer with high + financial risk! Proceed to the next task. ## Task 4: Demo - Update customer details @@ -209,15 +212,17 @@ Lastly, let’s explore how the system uses JSON Duality Views to handle profile ![Customer Profile Updated](./images/anderson-65k.png) -**Conclusion** + **Conclusion** -Once the document is uploaded: + Once the document is uploaded: -✅ The system automatically detects the new income data. + ✅ The system automatically detects the new income data. -✅ Then their profile will be updated from $25,000 to $65,000. + ✅ Then their profile will be updated from $25,000 to $65,000. -✅ And thanks to JSON Transform and JSON Duality Views, only the relevant field is modified — leaving the rest of the profile UNTOUCHED. + ✅ And thanks to JSON Transform and JSON Duality Views, only the + relevant field is modified — leaving the rest of the profile + UNTOUCHED. ## Summary @@ -242,4 +247,4 @@ By combining these advanced tools, the application enables faster, smarter decis ## Acknowledgements * **Authors** - Linda Foinding, Francis Regalado * **Contributors** - Eddie Ambler, Ramona Magadan, Mark Nelson, Andy Tael, Anders Swanson, Rahul Tasker -* **Last Updated By/Date** - Linda Foinding, September 2025 \ No newline at end of file +* **Last Updated By/Date** - Linda Foinding, September 2025