diff --git a/dev-ai-app-dev-gaming/app-architecture/app-architecture.md b/dev-ai-app-dev-gaming/app-architecture/app-architecture.md
new file mode 100644
index 000000000..aad4003ee
--- /dev/null
+++ b/dev-ai-app-dev-gaming/app-architecture/app-architecture.md
@@ -0,0 +1,72 @@
+# Architecture & Workshop Features
+
+## Introduction
+
+In this lab, you will explore the architecture behind the workshop that supports the tasks you will perform. We also have a closer look at all the features of the Oracle Database 23ai that were used to build the workshop and the demo application.
+
+Estimated Lab Time: 15 minutes
+
+## 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)**.
+
+
+
+### 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 runs two containers, including:
+
+ - Open-source Python library for the Healthcare Claim Approval Demo
+
+ - JupterLab as a browser-based development environment
+
+- The Application Subnet connects to the Oracle Services Network via the Service Gateway, enabling access to:
+
+ - Autonomous Database Serverless
+
+ - OCI Generative AI Services
+
+This architecture provides strong connectivity, scalability, and integration with Oracle cloud-native services to support efficient loan processing and approval.
+
+## Oracle Database 23ai features used in the demo app and in this workshop
+
+
+
+
+### **JSON Duality View**
+
+JSON Relational Duality in Oracle Database 23ai bridges the gap between relational and document data models. It gives developers the flexibility of JSON with the efficiency and power of relational storage. This eliminates 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 that should be highlighted is the ability to connect the database using Mongo DB syntax. This allows developers to interact with collections and documents using a familiar syntax.
+
+**Where is it used**: We implemented JSON Duality View in the demo app and in this workshop. All data you can view in the dashboard of the demo app is query from JSON Duality Views. In Lab 3, you learn how to interact with JSON Duality View using Oracle's Python driver. But you also learn how to use Oracle's Mongo API to query JSON Duality Views using Mongo DB syntax.
+
+### **AI Vector Search**
+
+Oracle AI Vector Search, a feature of Oracle Database 23ai, 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, returning more accurate, context-aware results. Developers can also add semantic search to new or existing applications with minimal effort. A **unique feature** of Oracle Database 23ai is its capability to host ONNX models and deploy them as a database function. This feature allows you to host ONNX models and deploy them as a database function, enabling seamless integration with Oracle Database 23ai.
+
+**Where is it used**: AI Vector Search is a key feature of the demo app and is also a topic in Lab 4 and Lab 5. In Lab 4, you use AI Vector Search to implement a RAG process, while in Lab 5, you specifically implement similarity search.
+
+### **Property Graph**
+
+Oracle Database 23ai supports property graphs, which model relationships using vertices and edges mapped to existing tables, external tables, materialized views, or synonyms. These graphs store metadata—not the actual data—which remains in the underlying objects. You use SQL/PGQ to query and interact with them.
+
+Property graphs simplify working with connected data, such as identifying influencers, predicting trends, or discovering relationships through pattern matching, by offering a more intuitive and efficient way to model and query complex networks.
+
+**Where is it used**: We implemented property graphs in the demo part of this workshop. Healthcare Claim Analysts can use it to identify potential alternative treatments for their patients.
+
+
+## Acknowledgements
+* **Authors** - Kamryn Vinson, Linda Foinding, Francis Regalado
+* **Contributors** - Eddie Ambler, Kevin Lazarz
+* **Last Updated By/Date** - Kamryn Vinson, April 2025
\ No newline at end of file
diff --git a/dev-ai-app-dev-gaming/app-architecture/images/logical.png b/dev-ai-app-dev-gaming/app-architecture/images/logical.png
new file mode 100644
index 000000000..ff693fa61
Binary files /dev/null and b/dev-ai-app-dev-gaming/app-architecture/images/logical.png differ
diff --git a/dev-ai-app-dev-gaming/app-architecture/images/physical-architecture.png b/dev-ai-app-dev-gaming/app-architecture/images/physical-architecture.png
new file mode 100644
index 000000000..402f3519b
Binary files /dev/null and b/dev-ai-app-dev-gaming/app-architecture/images/physical-architecture.png differ
diff --git a/dev-ai-app-dev-gaming/build/build.md b/dev-ai-app-dev-gaming/build/build.md
new file mode 100644
index 000000000..b0dc1eb13
--- /dev/null
+++ b/dev-ai-app-dev-gaming/build/build.md
@@ -0,0 +1,672 @@
+# Step by step: Implement RAG with Oracle Database 23ai
+
+## Introduction
+
+You’ll build an Esports Tournament Approval Tool powered by Oracle Database 23ai and OCI Generative AI. The app connects to player profiles and team rosters, evaluates tournament eligibility and rule compliance, and uses a large language model to draft approval recommendations with clear explanations. Leveraging Python skills from earlier labs, you’ll deploy a fully integrated AI solution that accelerates and strengthens tournament approval decisions.
+
+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 tournament approval application as seen in lab 1
+* Use OCI Generative AI to generate personalized product recommendations
+* Use Python to connect to an Oracle Database 23ai instance and run queries
+* Explore supplier data and extract relevant information
+
+### Prerequisites
+
+This lab assumes you have:
+
+* An Oracle Cloud account
+* Completed lab 1: Run the demo
+* Completed lab 2: Connect to the Development Environment
+
+## Task 1: Build the application in Jupyter Notebook
+>💡**Note**: Review Lab 2: Connect to the Development Environment for instructions on accessing JupyterLab.
+
+1. You should see a terminal pop up once you are logged in.
+
+ 
+
+
+2. Navigate to the `dbinit` directory by running the following command.
+
+ ```bash
+
+ cd dbinit
+
+ ```
+
+ 
+
+3. Copy and run the following command to create tables in the database. There will be a lot of output. You should see the following output once complete.
+
+ ```bash
+
+ ./shell_script.sh
+
+ ```
+
+ 
+
+ 
+
+## Task 2: Connect to Database
+
+2. Click the **+** sign on the top left to open the Launcher.
+
+ 
+
+3. Open a new notebook.
+
+ 
+
+1. Copy the following code block into an empty cell in your notebook. This code block imports the `oracledb` Python driver and other libraries.
+
+ ```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()
+
+ ```
+
+2. Run the code block to connect to the database.
+
+ 
+
+## Task 3: Pull player data from the database
+
+You will query player data from the `comm_dv` JSON duality view, which combines data from players and related tables. This task will:
+
+- **Define a Function**: Create a reusable function a to query the database by player ID, extracting the JSON data for a specific player.
+
+- **Use an Example**: Fetch data for player `1001` (Alice Nguyen) to demonstrate the process.
+
+- **Display the Results**: Format the retrieved data into a pandas DataFrame for a clear tabular view, highlighting key details such as player name, handle, tournament ID, team role, and risk level.
+
+1. Copy and paste the code below into the new notebook:
+
+ ```python
+
+ # Task 3: Fetch player JSON from gaming_dv + shared helpers
+
+ # Pull single player JSON document from DV
+ def fetch_player_gaming(player_id: int):
+ cursor.execute(
+ "SELECT data FROM gaming_dv WHERE JSON_VALUE(data,'$._id') = :pid",
+ {'pid': str(player_id)}
+ )
+ row = cursor.fetchone()
+ if not row:
+ return None
+ return json.loads(row[0]) if isinstance(row[0], str) else row[0]
+
+ # Load tournament requests into a DataFrame
+ def load_tournament_requests():
+ cursor.execute("""
+ SELECT request_id, tournament_id, team_mem_id, status, submitted_at
+ FROM GAM_TOURNAMENT_REQUESTS
+ """)
+ rows = cursor.fetchall()
+ cols = ["REQUEST_ID","TOURNAMENT_ID","TEAM_MEM_ID","STATUS","SUBMITTED_AT"]
+ return pd.DataFrame(rows, columns=cols) if rows else pd.DataFrame(columns=cols)
+
+ # Pull first request/recommendation/decision bundle
+ def extract_first_request_bundle_gaming(p_json):
+ p = p_json or {}
+ memberships = p.get("teamMemberships") or []
+ tm0 = memberships[0] if memberships else {}
+
+ requests = tm0.get("tournamentRequests") or []
+ req0 = requests[0] if requests else {}
+
+ rec = req0.get("recommendation") or {}
+ dec = rec.get("decision") or {}
+ return req0, rec, dec
+
+ # --- Let's select a Gaming player ---
+ selected_player_id = 1001 # Alice Nguyen
+ player_json = fetch_player_gaming(selected_player_id)
+ df_reqs = load_tournament_requests()
+
+ # Print summary of current case
+ if player_json:
+ req0, rec0, dec0 = extract_first_request_bundle_gaming(player_json)
+ print(f"Player: {player_json.get('firstName')} {player_json.get('lastName')} | Handle: {player_json.get('handle')} | Rank: {player_json.get('rank')}")
+ print(f"Request ID: {req0.get('requestId')} | Tournament: {req0.get('tournamentId')} | Status: {req0.get('status')}")
+ print(f"Recommendation: {rec0.get('recommendation')} | Explanation: {rec0.get('explanation')} | Risk: {rec0.get('riskLevel')}")
+ print(f"Decision: {dec0.get('finalDecision')} | Notes: {dec0.get('letterText')}")
+ else:
+ print("No player found.")
+
+
+ ```
+
+2. Click the "Run" button to execute the code.
+
+ 
+
+3. The output will display a DataFrame containing the player's details for the selected player ID.
+
+ 
+
+## Task 4: Generate Recommendations for the Player
+
+In a new cell, build a prompt using the player’s tournament request, proof of eligibility, and rulebook context. Retrieve compliance and risk data, then generate a decision from the recommendation: **Approve, Deny, Request Info**. Update the gaming tables accordingly and display the results..
+
+With player profiles in place, you will generate personalized tournament participation recommendations.
+
+Here’s what we’ll do:
+
+1. Copy and paste the code in a new cell:
+
+ ```python
+
+ # 🔹 Task 4: Simple Gaming recommendation using helpers from Task 3
+
+ # Map Numeric Score to Risk Label
+ def _risk_bucket(n):
+ try:
+ n = int(n)
+ except:
+ return "Medium"
+ if n <= 3: return "High"
+ if n <= 6: return "Medium"
+ if n <= 8: return "Low"
+ return "Very Low"
+
+ # Reuse outputs from Task 3 (Gaming)
+ req0, rec0, dec0 = extract_first_request_bundle_gaming(player_json or {})
+
+ # IDs we will persist back into db
+ request_id = (req0 or {}).get("requestId")
+ recommend_id = (rec0 or {}).get("recommendId")
+
+ # Build content blocks for our LLM
+ # Requests context
+ requests_block = "\n".join([
+ f"- Request {r.REQUEST_ID}: Status={r.STATUS}, Tournament={r.TOURNAMENT_ID}, Date={r.SUBMITTED_AT}"
+ for _, r in df_reqs.iterrows()
+ ]) or "None"
+
+ # Player profile
+ player_block = "\n".join([
+ f"- {k}: {v}"
+ for k, v in (player_json or {}).items() if k not in ["teamMemberships","_metadata"]
+ ]) or "None"
+
+ # Request details
+ req_block = "\n".join([f"- {k}: {v}" for k, v in (req0 or {}).items() if k != "recommendation"]) or "None"
+
+ # Recommendation details (if present)
+ rec_block = "\n".join([f"- {k}: {v}" for k, v in (rec0 or {}).items() if k != "decision"]) or "None"
+
+ prompt = f"""
+ You are a Tournament Review Advisor. Use ONLY this context.
+ Decide APPROVED / DENIED / REQUEST INFO. Prefer APPROVED or DENIED; use REQUEST INFO only if neither can be justified.
+
+ Requests:
+ {requests_block}
+
+ Player:
+ {player_block}
+
+ Tournament Request:
+ {req_block}
+
+ Recommendation:
+ {rec_block}
+
+ Decision rules:
+ - APPROVED if: request complies with rules and player/team is eligible.
+ - DENIED if: violates rulebook, invalid roster, or rank ineligible.
+ - REQUEST INFO only if key evidence (e.g. proof files) is missing/ambiguous.
+ - If no valid request plausibly matches, prefer DENIED over REQUEST INFO.
+
+ Return EXACTLY this layout (no extra text):
+ Suggested Action: APPROVED|DENIED|REQUEST INFO
+ Risk: N (Very Low|Low|Medium|High)
+ Rationale:
+ - one reason
+ - second reason
+ - third reason
+ NextSteps:
+ - step 1 (empty if Approved)
+ - step 2
+ - step 3
+ """
+
+ print("Generating AI recommendations …")
+ try:
+ genai_client = oci.generative_ai_inference.GenerativeAiInferenceClient(
+ config=oci.config.from_file(os.path.expanduser(os.getenv("OCI_CONFIG_PATH","~/.oci/config")), "DEFAULT"),
+ 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.0
+ ),
+ serving_mode=oci.generative_ai_inference.models.OnDemandServingMode(
+ model_id="meta.llama-3.2-90b-vision-instruct"
+ )
+ )
+ chat_resp = genai_client.chat(chat_detail)
+ recommendation_text = chat_resp.data.chat_response.choices[0].message.content[0].text
+ except Exception as e:
+ print(f"OCI GenAI error: {e}")
+ recommendation_text = ""
+
+ print("\n--- AI Recommendation ---\n", recommendation_text[:1000])
+
+ # Parse the simple block
+ act = re.search(r"Suggested\s*Action:\s*(APPROVED|DENIED|REQUEST INFO)\b", recommendation_text, re.I)
+ risk_num = re.search(r"Risk:\s*([0-9]+)", recommendation_text, re.I)
+ risk_lbl = re.search(r"Risk:\s*[0-9N]+\s*\((Very Low|Low|Medium|High)\)", recommendation_text, re.I)
+
+ action_norm = (act.group(1).upper() if act else "REQUEST INFO")
+ risk_n = risk_num.group(1) if risk_num else ("7" if action_norm == "APPROVED" else "5")
+ risk_l = (risk_lbl.group(1).title() if risk_lbl else _risk_bucket(risk_n))
+
+ # Map to dashboard vocab
+ table_status = "Approved" if action_norm == "APPROVED" else ("Denied" if action_norm == "DENIED" else "In Progress")
+
+ # update new values into the DB
+ try:
+ # Insert / Update GAM_RECOMMENDATION
+ cursor.execute("""
+ MERGE INTO GAM_RECOMMENDATION t
+ USING (SELECT :rid AS RECOMMEND_ID FROM dual) s
+ ON (t.RECOMMEND_ID = s.RECOMMEND_ID)
+ WHEN MATCHED THEN UPDATE SET
+ t.REQUEST_ID = :req_id,
+ t.RECOMMENDATION = :rec,
+ t.EXPLANATION = :exp,
+ t.RISK_LEVEL = :risk
+ WHEN NOT MATCHED THEN INSERT
+ (RECOMMEND_ID, REQUEST_ID, RECOMMENDATION, RULE_ID, EXPLANATION, RISK_LEVEL, GENERATED_DATE)
+ VALUES (:rid, :req_id, :rec, NULL, :exp, :risk, SYSDATE)
+ """, {
+ 'rid': recommend_id or 131001, # fallback ID
+ 'req_id': request_id,
+ 'rec': table_status,
+ 'exp': recommendation_text,
+ 'risk': risk_l
+ })
+
+ # Update GAM_TOURNAMENT_REQUESTS with STATUS
+ cursor.execute("""
+ UPDATE GAM_TOURNAMENT_REQUESTS
+ SET STATUS = :status
+ WHERE REQUEST_ID = :req_id
+ """, {'status': table_status.upper(), 'req_id': request_id})
+
+ connection.commit()
+ print(f"Stored recommendation -> {table_status} (risk={risk_l}); linked to GAM_TOURNAMENT_REQUESTS {request_id}.")
+ except Exception as e:
+ connection.rollback()
+ print("Failed to store recommendation:", e)
+
+
+ ```
+
+2. Click the "Run" button to execute the code. Note that this will take time to run.
+
+ 
+
+3. Review the output. In the demo, this is where you clicked the “Navigate to Decisions” button as the Tournament Administrator. You just used AI to generate tournament participation recommendations that would have taken hours of manual review—congratulations!
+
+ 
+
+>Note: Your result may be different. This is because of generative AI and the model's ability to generate new content based on your input. The output may contain different recommendations or suggestions.
+
+## Task 5: Chunk & Store Recommendations
+
+To handle follow-up questions, you will enhance the system with an AI Guru powered by Oracle 23ai’s Vector Search and Retrieval-Augmented Generation (RAG). The AI Guru will be able to answer questions about the tournament application and provide recommendations based on the data.
+
+Before answering questions, we need to prepare the data by vectoring the claims recommendations. This step:
+
+ - Stores Recommendations: Inserts the full recommendation text (from previous cell) as a single chunk if not already present.
+ - We delete prior chunks for this authorization.
+ - We use `VECTOR_CHUNKS` to split the recommendation text.
+ - The chunks will be inserted into `GAMING_CHUNK`
+ - We display a data frame summary to show the chunks.
+
+
+1. Copy the following code and run:
+
+ ```python
+
+ # 🔹 Task 5: Chunk & store AI recommendation, then SHOW the chunks (Gaming)
+
+ req_id = request_id # from Task 4
+ text_to_chunk = (recommendation_text or "").strip()
+ if not text_to_chunk:
+ text_to_chunk = f"SuggestedAction: {table_status}\nRationale: (empty model output)."
+
+ # 0) Clear old chunks for this request
+ cursor.execute("DELETE FROM GAMING_CHUNKS WHERE REQUEST_ID = :rid", {'rid': req_id})
+ connection.commit()
+
+ # 1) Chunk via VECTOR_CHUNKS
+ chunk_size = 25
+ overlap = 0
+
+ insert_chunks_sql = f"""
+ INSERT INTO GAMING_CHUNKS (CHUNK_ID, REQUEST_ID, CHUNK_TEXT)
+ SELECT c.chunk_offset, :rid, c.chunk_text
+ FROM (SELECT :txt AS c FROM dual) s,
+ VECTOR_CHUNKS(
+ dbms_vector_chain.utl_to_text(s.c)
+ BY words
+ MAX {int(chunk_size)}
+ OVERLAP {int(overlap)}
+ SPLIT BY sentence
+ LANGUAGE american
+ NORMALIZE all
+ ) c
+ """
+
+ inserted = 0
+ try:
+ cursor.execute(insert_chunks_sql, {'rid': req_id, 'txt': text_to_chunk})
+ inserted = cursor.rowcount or 0
+ connection.commit()
+ except oracledb.DatabaseError as e:
+ print(f"VECTOR_CHUNKS error, {e}")
+ inserted = 0
+
+ print(f"Stored {inserted} chunk(s) for REQUEST_ID={req_id}.")
+
+ # 2) Fetch & SHOW the chunks
+ cursor.execute("""
+ SELECT c.CHUNK_ID, c.CHUNK_TEXT
+ FROM GAMING_CHUNKS c
+ WHERE c.REQUEST_ID = :rid
+ ORDER BY c.CHUNK_ID
+ """, {'rid': req_id})
+ rows = cursor.fetchall()
+ cols = [c[0] for c in cursor.description]
+
+ # Build DataFrame
+ def _lob_to_str(v):
+ return v.read() if isinstance(v, oracledb.LOB) else v
+
+ items = []
+ for row in rows:
+ cid, ctext = row
+ 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")
+
+ # Display in notebook
+ display(df_chunks)
+
+ print(f"\nStored {inserted} chunk(s) for REQUEST_ID={req_id}.")
+
+
+ ```
+
+2. Click the "Run" button to execute the code.
+
+ 
+
+3. Review the output.
+
+ 
+
+## Task 6: Create Embeddings
+
+Now we must generate and store vector embeddings. This allows us to use Vector Search and RAG to enhance AI Guru's answers.
+
+In this step:
+
+ - **Generates Embeddings**: This is a new feature in Oracle Database 23ai that allows you to create embeddings directly within the database, eliminating the need for external tools or APIs. The `dbms_vector_chain.utl_to_embedding` function takes the recommendation text as input and returns an embedding vector.
+
+ - **Stores Embeddings**: We update `GAMING_CHUNK.CHUNK_VECTOR` by embedding each `CHUNK_TEXT` using `dbms_vector_chain.utl_to_embedding` with `DEMO_MODEL`. A short verification output is printed.
+
+1. Copy the following code into a new cell block:
+
+ ```python
+
+ # 🔹 Task 6: Create embeddings for GAMING_CHUNKS rows
+ req_id = request_id # from Task 4/5
+ vp = json.dumps({"provider": "database", "model": "DEMO_MODEL", "dimensions": 384})
+
+ # 1) Embed all chunks for this Gaming request
+ try:
+ cursor.execute(
+ """
+ UPDATE GAMING_CHUNKS c
+ SET c.CHUNK_VECTOR = dbms_vector_chain.utl_to_embedding(c.CHUNK_TEXT, JSON(:vp))
+ WHERE c.REQUEST_ID = :rid
+ """,
+ {"vp": vp, "rid": req_id}
+ )
+ updated = cursor.rowcount or 0
+ connection.commit()
+ print(f"Embedded vectors for {updated} chunk(s) (REQUEST_ID={req_id}).")
+ except oracledb.DatabaseError as e:
+ connection.rollback()
+ print("Embedding failed. Make sure DEMO_MODEL is loaded in Task 2.")
+ raise
+
+ # 2) Sanity check: how many rows have vectors now?
+ cursor.execute("""
+ SELECT COUNT(*)
+ FROM GAMING_CHUNKS c
+ WHERE c.REQUEST_ID = :rid
+ AND c.CHUNK_VECTOR IS NOT NULL
+ """, {"rid": req_id})
+ have_vec = cursor.fetchone()[0]
+
+ cursor.execute("""
+ SELECT COUNT(*)
+ FROM GAMING_CHUNKS c
+ WHERE c.REQUEST_ID = :rid
+ """, {"rid": req_id})
+ total_rows = cursor.fetchone()[0]
+
+ print(f"Vectors present: {have_vec}/{total_rows}")
+
+
+ ```
+
+2. Click the "Run" button to execute the code.
+
+ 
+
+3. Review the output.
+
+ 
+
+## Task 7: Implement RAG with Oracle Database 23ai's Vector Search
+
+Now that the recommendations are vectorized, we can process a user’s question:
+
+ ```Why was this tournament request approved```
+
+ - **Vectorizes the question**: Embeds the question using `DEMO_MODEL` via `dbms_vector_chain.utl_to_embedding`.
+ - **Performs AI Vector Search**: Finds the most relevant using similarity search over the stored chunks.
+ - **Use RAG**: Combines the player profile and relevant chunk information into a prompt for OCI Generative AI, producing a concise answer. Here you implement the RAG process.
+ - **Prints**: An answer is returned with citations from the LLM
+
+1. Copy the code and run:
+
+ ```python
+
+ # 🔹 Task 7: RAG — retrieve most relevant chunk(s) and answer a question (Gaming)
+
+ # Prep: Extract bundle from player_json (Gaming DV doc)
+ req0, rec0, dec0 = extract_first_request_bundle_gaming(player_json)
+
+ if not req0 or not req0.get("requestId"):
+ print("No tournament request found for this player.")
+ else:
+ # Question
+ question = "Why was this tournament request approved?"
+ print("Running vector search…")
+
+ # 1) Embed the question
+ vp = json.dumps({"provider": "database", "model": "DEMO_MODEL", "dimensions": 384})
+ cursor.execute(
+ "SELECT dbms_vector_chain.utl_to_embedding(:q, JSON(:vp)) FROM dual",
+ {"q": question, "vp": vp}
+ )
+ qvec = cursor.fetchone()[0]
+
+ # 2) Retrieve chunks from GAMING_CHUNKS for this request
+ cursor.execute(f"""
+ SELECT c.CHUNK_ID,
+ c.CHUNK_TEXT,
+ VECTOR_DISTANCE(c.CHUNK_VECTOR, :qv, COSINE) AS dist
+ FROM GAMING_CHUNKS c
+ WHERE c.REQUEST_ID = :rid
+ AND c.CHUNK_VECTOR IS NOT NULL
+ ORDER BY dist
+ FETCH FIRST 1 ROWS ONLY
+ """, {"rid": req0.get("requestId"), "qv": qvec})
+ rows = cursor.fetchall()
+
+ def _lob_to_str(v):
+ return v.read() if isinstance(v, oracledb.LOB) else v
+
+ retrieved = []
+ for cid, ctext, dist in rows:
+ txt = _lob_to_str(ctext) or ""
+ retrieved.append((cid, txt, float(dist)))
+
+ # 3) Build a compact RAG prompt
+ def _normalize_ws(s: str) -> str:
+ return re.sub(r"\s+", " ", s or "").strip()
+
+ context_lines = [f"[Chunk {cid}] {_normalize_ws(txt)}" for cid, txt, _ in retrieved]
+ context_block = "\n\n".join(context_lines)
+
+ player_name = f"{player_json.get('firstName','')} {player_json.get('lastName','')}".strip()
+ handle = player_json.get("handle", "")
+ rank = player_json.get("rank", "")
+ status = req0.get("status", "")
+
+ prompt = f"""[INST] <>You are an Esports Tournament AI advisor. Be precise, cite the chunk ids inline like [Chunk 2] when referring to specific facts.
+ Do not mention sources outside of the provided context. Respond in under 400 words.
+ ALWAYS respond as if you have the knowledge yourself.
+ Do NOT provide warnings, disclaimers, or exceed the specified response length.
+ <> [/INST]
+
+ Player: {player_name} (Handle: {handle}, Rank: {rank})
+ Tournament Request ID: {req0.get("requestId")}, Status={status}
+
+ Question: {question}
+
+ Context:
+ {context_block}
+
+ Return this format (plain text, no extra lines):
+ Decision: APPROVED|DENIED|REQUEST INFO
+ Why:
+ - reason 1 (cite [Chunk N])
+ - reason 2 (cite [Chunk N])
+ - reason 3 (cite [Chunk N])
+ Next:
+ - actionable step 1
+ - actionable step 2
+ - actionable step 3
+ """.strip()
+
+ # 4) Generate the final answer with OCI GenAI
+ print("\nGenerating final RAG answer…")
+ try:
+ genai_client = oci.generative_ai_inference.GenerativeAiInferenceClient(
+ config=oci.config.from_file(os.path.expanduser(os.getenv("OCI_CONFIG_PATH","~/.oci/config")), "DEFAULT"),
+ 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.0
+ ),
+ serving_mode=oci.generative_ai_inference.models.OnDemandServingMode(
+ model_id="meta.llama-3.2-90b-vision-instruct"
+ )
+ )
+ chat_resp = genai_client.chat(chat_detail)
+ rag_answer = chat_resp.data.chat_response.choices[0].message.content[0].text
+ except Exception as e:
+ print("Something is off...", e)
+ rag_answer = "[No AI answer generated]"
+
+ print("\n🤖 RAG Answer:\n", rag_answer)
+
+
+ ```
+
+2. Click the "Run" button to execute the code.
+
+ 
+
+3. Review the result.
+
+ >*Note:* Your result may be different due to non-deterministic character of generative AI.
+
+ 
+
+## Conclusion
+Congratulations! You implemented a RAG process in Oracle Database 23ai using Python.
+
+to summarize:
+
+* Connected with oracledb
+* Retrieved a player profile via a JSON duality view
+* Generated a grid interconnection recommendation using OCI GenAI
+* Chunked and embedded both recommendations and document text
+* Performed vector search and produced a RAG answer grounded in retrieved chunks (with chunk IDs printed for traceability)
+
+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 Database 23ai Documentation](https://docs.oracle.com/en/database/oracle/oracle-database/23/)
+
+## Acknowledgements
+* **Authors** - Ley Sylvester
+* **Contributors** - Kevin Lazarz, Hanna Rakhsha, Francis Regalado, Uma Kumar
\ No newline at end of file
diff --git a/dev-ai-app-dev-gaming/build/build_backup.md b/dev-ai-app-dev-gaming/build/build_backup.md
new file mode 100644
index 000000000..13779cd9f
--- /dev/null
+++ b/dev-ai-app-dev-gaming/build/build_backup.md
@@ -0,0 +1,148 @@
+# Code Snippets and Highlights for Building the Application
+
+## Introduction
+
+In this lab, you will learn how to **build a generative AI-powered loan recommendation system using Oracle Database and OCI Generative AI**. This application will act as a flexible template that can be adapted to a wide range of use cases. Oracle Database 23Ai will function as the vector data, where you'll store important context for the model to use when generating responses. This approach allows you to create a robust system that retrieves relevant data and combines it with the power of generative AI to deliver accurate, up-to-date answers based on your specific business needs.
+
+Estimated Time: 20 minutes
+
+### Objectives
+
+By the end of this hands-on session, you will have established a connection to an Oracle Database, fetched and explored customer data, processed relevant information, and utilized a Large Language Model (LLM) to generate personalized loan recommendations based on detailed customer profiles. This system integrates cutting-edge AI capabilities with robust database technology to deliver tailored financial solutions.
+
+Throughout this section we will be leveraging a Jupyter Notebook to explore building parts of the application. If you are unfamiliar with notebooks here are a few tips to get started:
+
+• Instructions and code will be mixed together, each having their own blocks. You can use the run button on the code to see it execute. If you accidentally hit run on any instructions it will just move to the next block so don't worry.
+• When running a code block it will switch from either a [ ] or a [1] (a number inside) to a [*]. When you see the one with a * that means its running. Wait till it switches to a number before moving on.
+• If you see any warnings, don't worry, they are probably just letting you know that things are changing, depreciating and you should look at updating to the latest standards. You don't need to do anything.
+
+
+### Prerequisites
+
+This lab assumes you have:
+* An Oracle Cloud account
+
+## Task 1: Login to Jupyter
+
+This task will have you login to the Jupyter environment and run specific notebooks for this lab.
+
+1. If you have already logged into the Jupyter environment skip to step 5, otherwise open "View Login Info" section of your workshop.
+
+2. Copy the Jupyter Notebook Password and click the Jupyter Notebook URL.
+
+3. Paste the Jupyter Notebook password you copied in the previous step into the password field.
+
+4. After a successful login, you will see the Jupyter Notebook's landing page.
+
+
+## Task 2: Launch the Application
+
+1. Select the **Launcher** tab and open the **terminal**
+
+ 
+
+2. Copy the ./run.sh command and paste it into the terminal.
+
+ ````bash
+ $
+ ./run.sh
+
+ ````
+
+The following section includes a hands-on exercise for building parts of the application using a Jupyter notebook.
+You will also be able to review important parts of the python code below.
+
+
+3. Click the URL displayed in the terminal to launch the SeerEquities Loan Management application.
+
+ 
+
+4. Enter in a username and click **Login**.
+
+ 
+
+## Task 3: How to Connect to the Database
+
+**Code Highlight: Connect to the Database**
+
+This section sets up a secure connection to an Oracle database by importing necessary libraries and loading environment variables from a .env file. The get\_db\_connection function retrieves the database username, password, and connection string, then uses the oracledb library to establish a connection.
+
+ 
+
+## Task 4 Build a GenAI application with Oracle AI Vector Search
+
+**About Oracle AI Vector Search**
+
+Oracle AI Vector Search is a feature of Oracle Database 23ai that enables efficient searching of AI-generated vectors stored in the database. It supports fast search using various indexing strategies and can handle massive amounts of vector data. This makes it possible for Large Language Models (LLMs) to query private business data using a natural language interface, helping them provide more accurate and relevant results. Additionally, AI Vector Search allows developers to easily add semantic search capabilities to both new and existing applications.
+
+**Code Highlight: Onnx Model**
+
+1. First, we load an ONNX machine learning model, which we use for generating vector embeddings in our app. It starts by checking if the model already exists in the database; if not, it creates a directory, downloads the model file from object storage, and uses dbms\_vector to load it, replacing any old version if needed.
+
+ 
+
+**Code Highlight: Prompt for the AI**
+
+2. Next, we craft a detailed prompt for our RAG—system, directing the AI to step into the shoes of a Loan Approver, relying solely on the data we feed it. It’s tasked with analyzing an applicant’s financial profile against our loan portfolio and business rules, focusing on just the provided context, ignoring any prior knowledge, which ensures our loan suggestions are relevant, without relying on external or outdated information.
+
+ 
+
+**Code Highlight: Communicating with GenAI**
+
+**About Generative artificial intelligence (AI)**
+
+Generative AI excels at creating text responses based on large language models (LLMs) where the AI is trained on a massive number of data points. The generated text is often easy to read and provides detailed responses that are broadly applicable to the questions asked of the software, often called prompts.
+
+3. Now, this is how we communicate with OCI’s Generative AI service by pulling in configuration details like the compartment ID and endpoint from environment variables and a config file. The code sets up the structure for a chat request, embedding our prompt into a user message, enabling AI loan recommendations within the app.
+
+ 
+
+**Code Highlight: Embed the Question and Vector Search**
+
+4. Finally, we dive into AI vector search. First, we generates an embedding for a user’s question using Oracle’s dbms\_vector\_chain and our DEMO\_MODEL. Then, it performs an AI vector search in the LOAN_CHUNK table, comparing stored recommendations vector embeddings to the question’s embedding with cosine distance, and pulls back the most relevant text chunk, with a limit of one row.
+
+ 
+
+## Task 5 How to incorporate Property Graph into the application
+
+**About Property Graph**
+
+In Oracle Database 23ai we can create property graphs inside the database. These property graphs allow us to map the vertices and edges to new or existing tables, external tables, materialized views or synonyms to these objects inside the database. The property graphs are stored as metadata inside the database meaning they don't store the actual data. Rather, the data is still stored in the underlying objects and we use the SQL/PQG syntax to interact with the property graphs.
+
+Property graphs make the process of working with interconnected data, like identifying influencers in a social network, predicting trends and customer behavior, discovering relationships based on pattern matching and more by providing a more natural and efficient way to model and query them.
+
+**Code Highlight: Graph Query**
+
+1. Here, we define a query for our LOANS_GRAPH property graph, which connects clients to their loan applications and potential loan options via a customer ID. It extracts critical details—like credit scores, debt-to-income ratios, and loan types—by traversing the graph’s vertices and edges.
+
+ 
+
+**Code Highlight: Creating The Property Graph**
+
+2. The graph structure enables complex queries and visualizations in the app, supporting decision-making by mapping interconnections between customer data and loan options. This SQL block creates our loans\_graph property graph , setting up vertices for clients, loan applications, and mock loan data with all their key properties. It also defines edges—like client\_to\_application and CLIENTS\_TO\_LOAN to link these entities, establishing relationships that we can query and explore.
+
+ 
+
+## Task 6 How to incorporate JSON Transform into the application
+
+**About JSON Duality View**
+
+JSON Relational Duality is a landmark capability in Oracle Database 23ai, providing game-changing flexibility and simplicity for Oracle Database developers. This feature overcomes the historical challenges developers have faced when building applications using the relational or document models.
+
+JSON Relational Duality helps to converge the benefits of both document and relational worlds. Developers now get the flexibility and data access benefits of the JSON document model, plus the storage efficiency and power of the relational model. The new feature enabling this functionality is JSON Relational Duality View
+
+**Code Highlight: JSON Transform**
+
+This section dynamically updates customer data in our clients\_dv table by building a flexible JSON\_TRANSFORM query based on a list of transformation statements. It constructs the query by joining those statements—like setting new field values—then applies them to the JSON data for a specific customer, identified by their ID, as long as a loan application exists."
+
+
+
+
+## Learn More
+
+* [Oracle Database 23ai Documentation](https://docs.oracle.com/en/database/oracle/oracle-database/23/)
+
+## Acknowledgements
+* **Authors** - Linda Foinding, Francis Regalado
+* **Contributors** - Kamryn Vinson, Otis Barr, Eddie Ambler, Kevin Lazarz
+* **Last Updated By/Date** - Linda Foinding, April 2025
diff --git a/dev-ai-app-dev-gaming/build/files/starter-file.sql b/dev-ai-app-dev-gaming/build/files/starter-file.sql
new file mode 100644
index 000000000..9d7e762e8
--- /dev/null
+++ b/dev-ai-app-dev-gaming/build/files/starter-file.sql
@@ -0,0 +1,101 @@
+/* NOTE: Files cannot contain empty lines (line breaks) */
+/* Specify the base URL that you copied from your files in OCI Object Storage in the define base_URL line below*/
+/* change idthydc0kinr to your real namespace. The name is case-sensitive. */
+/* change ADWCLab to your real bucket name. The name is case-sensitive. */
+/* change us-phoenix-1 to your real region name. The name is case-sensitive. */
+/* you can find these values on the OCI Console .. Storage .. Object Storage screen */
+set define on
+define base_URL='https://objectstorage.us-phoenix-1.oraclecloud.com/n/idthydc0kinr/b/ADWCLab/o'
+/* copy Channels table */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'CHANNELS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/chan_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+/* copy Countries table */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'COUNTRIES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/coun_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+/* Copy customers */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'CUSTOMERS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/cust1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SUPPLEMENTARY_DEMOGRAPHICS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/dem1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SALES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/dmsal_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'PRODUCTS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/prod1v3.dat',
+ format => json_object('delimiter' value '|', 'quote' value '^', 'ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'PROMOTIONS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/prom1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SALES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/sale1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'TIMES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/time_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'COSTS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/costs.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true')
+ );
+end;
+/
diff --git a/dev-ai-app-dev-gaming/build/images/23ai.png b/dev-ai-app-dev-gaming/build/images/23ai.png
new file mode 100644
index 000000000..c9d91565d
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/23ai.png differ
diff --git "a/dev-ai-app-dev-gaming/build/images/Screenshot 2025-09-26 at 11.46.48\342\200\257AM.png" "b/dev-ai-app-dev-gaming/build/images/Screenshot 2025-09-26 at 11.46.48\342\200\257AM.png"
new file mode 100644
index 000000000..c696dc570
Binary files /dev/null and "b/dev-ai-app-dev-gaming/build/images/Screenshot 2025-09-26 at 11.46.48\342\200\257AM.png" differ
diff --git a/dev-ai-app-dev-gaming/build/images/access.png b/dev-ai-app-dev-gaming/build/images/access.png
new file mode 100644
index 000000000..67d0f079c
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/access.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/adb-available.png b/dev-ai-app-dev-gaming/build/images/adb-available.png
new file mode 100644
index 000000000..83c42c2f8
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/adb-available.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/ai-recommendation.png b/dev-ai-app-dev-gaming/build/images/ai-recommendation.png
new file mode 100644
index 000000000..b3e397a8d
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/ai-recommendation.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/ai-recommendations.png b/dev-ai-app-dev-gaming/build/images/ai-recommendations.png
new file mode 100644
index 000000000..394535199
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/ai-recommendations.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/app-home.png b/dev-ai-app-dev-gaming/build/images/app-home.png
new file mode 100644
index 000000000..9892728e1
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/app-home.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/ask-questions.png b/dev-ai-app-dev-gaming/build/images/ask-questions.png
new file mode 100644
index 000000000..99bf9deb6
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/ask-questions.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/atp.png b/dev-ai-app-dev-gaming/build/images/atp.png
new file mode 100644
index 000000000..09736ee76
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/atp.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/chunks-created.png b/dev-ai-app-dev-gaming/build/images/chunks-created.png
new file mode 100644
index 000000000..d295ef9be
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/chunks-created.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/click-streamlit.png b/dev-ai-app-dev-gaming/build/images/click-streamlit.png
new file mode 100644
index 000000000..33010d468
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/click-streamlit.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/click-url.png b/dev-ai-app-dev-gaming/build/images/click-url.png
new file mode 100644
index 000000000..d01516965
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/click-url.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/code-highlight-1.png b/dev-ai-app-dev-gaming/build/images/code-highlight-1.png
new file mode 100644
index 000000000..6ba9b90b8
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/code-highlight-1.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/code-highlight-2.png b/dev-ai-app-dev-gaming/build/images/code-highlight-2.png
new file mode 100644
index 000000000..01a6ccbdf
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/code-highlight-2.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/code-highlight-3.png b/dev-ai-app-dev-gaming/build/images/code-highlight-3.png
new file mode 100644
index 000000000..7d8a46504
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/code-highlight-3.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/code-highlight-4.png b/dev-ai-app-dev-gaming/build/images/code-highlight-4.png
new file mode 100644
index 000000000..21af6948c
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/code-highlight-4.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/code-highlight-5.png b/dev-ai-app-dev-gaming/build/images/code-highlight-5.png
new file mode 100644
index 000000000..ac81e25d9
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/code-highlight-5.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/code-highlight-6.png b/dev-ai-app-dev-gaming/build/images/code-highlight-6.png
new file mode 100644
index 000000000..bff8b9b5e
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/code-highlight-6.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/code-highlight-7.png b/dev-ai-app-dev-gaming/build/images/code-highlight-7.png
new file mode 100644
index 000000000..327343eb8
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/code-highlight-7.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/code-highlight-8.png b/dev-ai-app-dev-gaming/build/images/code-highlight-8.png
new file mode 100644
index 000000000..0c94f1b5a
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/code-highlight-8.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/connect-to-db.png b/dev-ai-app-dev-gaming/build/images/connect-to-db.png
new file mode 100644
index 000000000..1dfbf76c2
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/connect-to-db.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/connectto-db.png b/dev-ai-app-dev-gaming/build/images/connectto-db.png
new file mode 100644
index 000000000..c87b8650b
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/connectto-db.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/create-adb.png b/dev-ai-app-dev-gaming/build/images/create-adb.png
new file mode 100644
index 000000000..224b16bc2
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/create-adb.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/create-adb2.png b/dev-ai-app-dev-gaming/build/images/create-adb2.png
new file mode 100644
index 000000000..20fe1a66e
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/create-adb2.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/create-chunks.png b/dev-ai-app-dev-gaming/build/images/create-chunks.png
new file mode 100644
index 000000000..f06a04400
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/create-chunks.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/create-tables.png b/dev-ai-app-dev-gaming/build/images/create-tables.png
new file mode 100644
index 000000000..d0961e04e
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/create-tables.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/create-user-profile.png b/dev-ai-app-dev-gaming/build/images/create-user-profile.png
new file mode 100644
index 000000000..6448fa970
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/create-user-profile.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/create-vector.png b/dev-ai-app-dev-gaming/build/images/create-vector.png
new file mode 100644
index 000000000..c2932afab
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/create-vector.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/dbinit.png b/dev-ai-app-dev-gaming/build/images/dbinit.png
new file mode 100644
index 000000000..20b3bb2c2
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/dbinit.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/demo-db.png b/dev-ai-app-dev-gaming/build/images/demo-db.png
new file mode 100644
index 000000000..b7bad922b
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/demo-db.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/dev-env.png b/dev-ai-app-dev-gaming/build/images/dev-env.png
new file mode 100644
index 000000000..7f65f8193
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/dev-env.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/fetch-customer.png b/dev-ai-app-dev-gaming/build/images/fetch-customer.png
new file mode 100644
index 000000000..e26559026
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/fetch-customer.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/fetch-patient-data.png b/dev-ai-app-dev-gaming/build/images/fetch-patient-data.png
new file mode 100644
index 000000000..2c3881c7b
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/fetch-patient-data.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/generate-embeddings.png b/dev-ai-app-dev-gaming/build/images/generate-embeddings.png
new file mode 100644
index 000000000..7b9176056
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/generate-embeddings.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/generate-recommendation.png b/dev-ai-app-dev-gaming/build/images/generate-recommendation.png
new file mode 100644
index 000000000..01b802a62
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/generate-recommendation.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/generate-recommendations.png b/dev-ai-app-dev-gaming/build/images/generate-recommendations.png
new file mode 100644
index 000000000..e73860708
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/generate-recommendations.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/jupyter-login.png b/dev-ai-app-dev-gaming/build/images/jupyter-login.png
new file mode 100644
index 000000000..c3ba1fde6
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/jupyter-login.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/jupyter-notebook.png b/dev-ai-app-dev-gaming/build/images/jupyter-notebook.png
new file mode 100644
index 000000000..23e7200ce
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/jupyter-notebook.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/launcher.png b/dev-ai-app-dev-gaming/build/images/launcher.png
new file mode 100644
index 000000000..81e4151c5
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/launcher.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/loan-recommendation.png b/dev-ai-app-dev-gaming/build/images/loan-recommendation.png
new file mode 100644
index 000000000..7839029aa
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/loan-recommendation.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/logical.png b/dev-ai-app-dev-gaming/build/images/logical.png
new file mode 100644
index 000000000..465a4d554
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/logical.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/login.png b/dev-ai-app-dev-gaming/build/images/login.png
new file mode 100644
index 000000000..93ca6436b
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/login.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/open-launcher.png b/dev-ai-app-dev-gaming/build/images/open-launcher.png
new file mode 100644
index 000000000..9b2b6ebdb
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/open-launcher.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/open-new-notebook.png b/dev-ai-app-dev-gaming/build/images/open-new-notebook.png
new file mode 100644
index 000000000..3749eb039
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/open-new-notebook.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/open-notebook.png b/dev-ai-app-dev-gaming/build/images/open-notebook.png
new file mode 100644
index 000000000..76c241f56
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/open-notebook.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/open-terminal.png b/dev-ai-app-dev-gaming/build/images/open-terminal.png
new file mode 100644
index 000000000..208f97dde
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/open-terminal.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/oracle-database.png b/dev-ai-app-dev-gaming/build/images/oracle-database.png
new file mode 100644
index 000000000..642d0dbfc
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/oracle-database.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/password.png b/dev-ai-app-dev-gaming/build/images/password.png
new file mode 100644
index 000000000..e770db461
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/password.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/patient-data.png b/dev-ai-app-dev-gaming/build/images/patient-data.png
new file mode 100644
index 000000000..69bea4b13
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/patient-data.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/physical.png b/dev-ai-app-dev-gaming/build/images/physical.png
new file mode 100644
index 000000000..a9183a5a3
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/physical.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/profile-updated.png b/dev-ai-app-dev-gaming/build/images/profile-updated.png
new file mode 100644
index 000000000..8e6b8110a
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/profile-updated.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/provisioning.png b/dev-ai-app-dev-gaming/build/images/provisioning.png
new file mode 100644
index 000000000..a04507757
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/provisioning.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/rag.png b/dev-ai-app-dev-gaming/build/images/rag.png
new file mode 100644
index 000000000..511160fb2
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/rag.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/run-script.png b/dev-ai-app-dev-gaming/build/images/run-script.png
new file mode 100644
index 000000000..1892833f1
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/run-script.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/shell-script.png b/dev-ai-app-dev-gaming/build/images/shell-script.png
new file mode 100644
index 000000000..a1069bc45
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/shell-script.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/start-demo.png b/dev-ai-app-dev-gaming/build/images/start-demo.png
new file mode 100644
index 000000000..904ada64a
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/start-demo.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/terminal.png b/dev-ai-app-dev-gaming/build/images/terminal.png
new file mode 100644
index 000000000..8636461a9
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/terminal.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/upload-document.png b/dev-ai-app-dev-gaming/build/images/upload-document.png
new file mode 100644
index 000000000..38555ba70
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/upload-document.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/user-profile-created.png b/dev-ai-app-dev-gaming/build/images/user-profile-created.png
new file mode 100644
index 000000000..ae4674153
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/user-profile-created.png differ
diff --git a/dev-ai-app-dev-gaming/build/images/workshop_notebook.png b/dev-ai-app-dev-gaming/build/images/workshop_notebook.png
new file mode 100644
index 000000000..f3706f232
Binary files /dev/null and b/dev-ai-app-dev-gaming/build/images/workshop_notebook.png differ
diff --git a/dev-ai-app-dev-gaming/cloud-login/cloud-login.md b/dev-ai-app-dev-gaming/cloud-login/cloud-login.md
new file mode 100644
index 000000000..2601085f5
--- /dev/null
+++ b/dev-ai-app-dev-gaming/cloud-login/cloud-login.md
@@ -0,0 +1,51 @@
+# Get started
+
+## Introduction
+
+In this lab, we will show you where you can find the login information and how to log in to the **SeerHoldings Healthcare Management application**.
+
+Estimated Time: 5 minutes
+
+### Objectives
+
+- Log-in to the application
+- Locate your LiveLabs Sandbox reservations
+
+## Task 1: View Login Information
+
+Right above the workshop instructions you can find two information:
+
+a. **View Login Info:** You can find credentials and other information to access the LiveLabs Sandbox
+
+b. **Time Remaining:** This shows you the remaining time before your access to the LiveLabs Sandbox expires. Please note: You may be able to extend the reservation time.
+
+
+
+## Task 2: Login to the Demo
+
+1. To access the demo environment, click **View Login Info** in the top left corner of the page. Click the **Start the Demo** link.
+
+ 
+
+2. Enter in a username, select the **Claims Officer** role, and click **Login**.
+
+ 
+
+3. Welcome to the SeerHoldings Healthcare Management application! Congratulations, you are now connected to the demo environment. You can now execute the different tasks and steps for the LiveLabs workshop.
+
+ 
+
+
+## Task 3: Find your LiveLabs Sandbox reservations
+
+If you close your browser, and you want to launch your workshop again, open [livelabs.oracle.com](https://livelabs.oracle.com), login using your Oracle account, and click on **My Reservations**. You can find here a complete history of all LiveLabs workshops you signed up for. Click on **Launch Workshop** to start a workshop with an existing LiveLabs Sandbox environment.
+
+
+
+You may now **proceed to the next lab**.
+
+## Acknowledgements
+
+- **Created By/Date** - Kamryn Vinson
+- **Contributor** - Linda Foinding
+- **Last Updated By/Date** - Linda Foinding, April 2025
\ No newline at end of file
diff --git a/dev-ai-app-dev-gaming/cloud-login/images/app-home.png b/dev-ai-app-dev-gaming/cloud-login/images/app-home.png
new file mode 100644
index 000000000..6cf6ab118
Binary files /dev/null and b/dev-ai-app-dev-gaming/cloud-login/images/app-home.png differ
diff --git a/dev-ai-app-dev-gaming/cloud-login/images/click-url.png b/dev-ai-app-dev-gaming/cloud-login/images/click-url.png
new file mode 100644
index 000000000..d01516965
Binary files /dev/null and b/dev-ai-app-dev-gaming/cloud-login/images/click-url.png differ
diff --git a/dev-ai-app-dev-gaming/cloud-login/images/demo-env.png b/dev-ai-app-dev-gaming/cloud-login/images/demo-env.png
new file mode 100644
index 000000000..3d5401336
Binary files /dev/null and b/dev-ai-app-dev-gaming/cloud-login/images/demo-env.png differ
diff --git a/dev-ai-app-dev-gaming/cloud-login/images/dev-env.png b/dev-ai-app-dev-gaming/cloud-login/images/dev-env.png
new file mode 100644
index 000000000..7f65f8193
Binary files /dev/null and b/dev-ai-app-dev-gaming/cloud-login/images/dev-env.png differ
diff --git a/dev-ai-app-dev-gaming/cloud-login/images/ll-reservations.png b/dev-ai-app-dev-gaming/cloud-login/images/ll-reservations.png
new file mode 100644
index 000000000..2e7150140
Binary files /dev/null and b/dev-ai-app-dev-gaming/cloud-login/images/ll-reservations.png differ
diff --git a/dev-ai-app-dev-gaming/cloud-login/images/login.png b/dev-ai-app-dev-gaming/cloud-login/images/login.png
new file mode 100644
index 000000000..0acc1ff72
Binary files /dev/null and b/dev-ai-app-dev-gaming/cloud-login/images/login.png differ
diff --git a/dev-ai-app-dev-gaming/cloud-login/images/start-demo.png b/dev-ai-app-dev-gaming/cloud-login/images/start-demo.png
new file mode 100644
index 000000000..2be9a0f28
Binary files /dev/null and b/dev-ai-app-dev-gaming/cloud-login/images/start-demo.png differ
diff --git a/dev-ai-app-dev-gaming/cloud-login/images/view-login-info.png b/dev-ai-app-dev-gaming/cloud-login/images/view-login-info.png
new file mode 100644
index 000000000..2bcf29e82
Binary files /dev/null and b/dev-ai-app-dev-gaming/cloud-login/images/view-login-info.png differ
diff --git a/dev-ai-app-dev-gaming/connect-to-env/connect-to-env.md b/dev-ai-app-dev-gaming/connect-to-env/connect-to-env.md
new file mode 100644
index 000000000..54b040ab1
--- /dev/null
+++ b/dev-ai-app-dev-gaming/connect-to-env/connect-to-env.md
@@ -0,0 +1,58 @@
+# Connect to the Development Environment
+
+## Introduction
+
+In this lab, you'll learn how to access the web-based Jupyter Lab development environment, where you can write and run Python code directly in your browser. You'll log in, create notebooks, and get ready to start coding in a hands-on environment.
+
+Estimated Time: 5 minutes
+
+### Objective
+
+* Login to JupyterLab
+
+## 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.
+
+ 
+
+2. Paste in the Development IDE Login Password that you copied in the previous step. Click **Login**.
+
+ 
+
+3. Click the blue "+". This will open the Launcher.
+
+ 
+
+## 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. Navigation is fast and intuitive, with breadcrumbs and context menus that surface relevant actions. Users can right-click files to access options like duplicate, shutdown kernel, or open with a specific editor.
+
+ **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, enabling command-line operations within the JupyterLab environment. These two tools form the core of most workflows, supporting both interactive analysis and system-level tasks from a single interface.
+
+ 
+
+## Task 3: Get familiar with Jupyter Notebooks
+
+You will use a Jupyter Notebook in JupyterLab to build and test the loan recommendation system. If you are new to notebooks, the following tips will help you get started and work smoothly.
+
+1. **Executing Code Blocks**: You can run code in two simple ways: press **Shift+Enter** to execute and move to the next cell, or click the **Play/Execute** button in the menu bar at the top of this tab. Both methods work interchangeably.
+
+2. **Block Types**: Instructions and code are separated into **their own blocks**. Instructions are in markdown (like this cell), while code is in executable Python blocks. If you accidentally run an instruction block, it’ll just skip to the next cell—no harm done!
+
+3. **Running Indicators**: When you run a code block, its label changes from `[ ]` (empty) or `[1]` (a number) to `[*]`. The asterisk (`*`) means it’s processing. Wait until it switches back to a number (e.g., `[2]`) before moving on, ensuring the operation is complete.
+
+4. **Output & Warnings**: Below each code cell, output appears after execution. This can include results, visualizations, or messages. Warnings may show up—these are usually informational, such as notices about deprecated features. Unless an error halts execution, users can continue without making changes. If you see a error, review the code for any issues and make changes accordingly and try executing the cell again.
+
+ 
+
+## Conclusion
+
+In this lab you logged into the **IDE Development Environment** for Jupyter Labs. You reviewed different elements from the environment like **File Browser** and **Launcher**. Lastly, you were introduced to concepts to allow you to get started running code smoothly like **executing code blocks** and **outputs and warnings**.
+
+## Acknowledgements
+* **Author** - Kamryn Vinson
+* **Contributors** - Linda Foinding, Francis Regalado, Kevin Lazarz
+* **Last Updated By/Date** - Uma Kumar, August 2025
diff --git a/dev-ai-app-dev-gaming/connect-to-env/files/starter-file.sql b/dev-ai-app-dev-gaming/connect-to-env/files/starter-file.sql
new file mode 100644
index 000000000..9d7e762e8
--- /dev/null
+++ b/dev-ai-app-dev-gaming/connect-to-env/files/starter-file.sql
@@ -0,0 +1,101 @@
+/* NOTE: Files cannot contain empty lines (line breaks) */
+/* Specify the base URL that you copied from your files in OCI Object Storage in the define base_URL line below*/
+/* change idthydc0kinr to your real namespace. The name is case-sensitive. */
+/* change ADWCLab to your real bucket name. The name is case-sensitive. */
+/* change us-phoenix-1 to your real region name. The name is case-sensitive. */
+/* you can find these values on the OCI Console .. Storage .. Object Storage screen */
+set define on
+define base_URL='https://objectstorage.us-phoenix-1.oraclecloud.com/n/idthydc0kinr/b/ADWCLab/o'
+/* copy Channels table */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'CHANNELS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/chan_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+/* copy Countries table */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'COUNTRIES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/coun_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+/* Copy customers */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'CUSTOMERS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/cust1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SUPPLEMENTARY_DEMOGRAPHICS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/dem1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SALES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/dmsal_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'PRODUCTS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/prod1v3.dat',
+ format => json_object('delimiter' value '|', 'quote' value '^', 'ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'PROMOTIONS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/prom1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SALES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/sale1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'TIMES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/time_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'COSTS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/costs.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true')
+ );
+end;
+/
diff --git a/dev-ai-app-dev-gaming/connect-to-env/images/block.png b/dev-ai-app-dev-gaming/connect-to-env/images/block.png
new file mode 100644
index 000000000..4f7f68297
Binary files /dev/null and b/dev-ai-app-dev-gaming/connect-to-env/images/block.png differ
diff --git a/dev-ai-app-dev-gaming/connect-to-env/images/dev-env.png b/dev-ai-app-dev-gaming/connect-to-env/images/dev-env.png
new file mode 100644
index 000000000..1e0837ad7
Binary files /dev/null and b/dev-ai-app-dev-gaming/connect-to-env/images/dev-env.png differ
diff --git a/dev-ai-app-dev-gaming/connect-to-env/images/jupyter-login.png b/dev-ai-app-dev-gaming/connect-to-env/images/jupyter-login.png
new file mode 100644
index 000000000..c3ba1fde6
Binary files /dev/null and b/dev-ai-app-dev-gaming/connect-to-env/images/jupyter-login.png differ
diff --git a/dev-ai-app-dev-gaming/connect-to-env/images/jupyter.png b/dev-ai-app-dev-gaming/connect-to-env/images/jupyter.png
new file mode 100644
index 000000000..29b0703dc
Binary files /dev/null and b/dev-ai-app-dev-gaming/connect-to-env/images/jupyter.png differ
diff --git a/dev-ai-app-dev-gaming/connect-to-env/images/launcher.png b/dev-ai-app-dev-gaming/connect-to-env/images/launcher.png
new file mode 100644
index 000000000..81e4151c5
Binary files /dev/null and b/dev-ai-app-dev-gaming/connect-to-env/images/launcher.png differ
diff --git a/dev-ai-app-dev-gaming/introduction/images/vectors-diagram.png b/dev-ai-app-dev-gaming/introduction/images/vectors-diagram.png
new file mode 100644
index 000000000..0156e2d8f
Binary files /dev/null and b/dev-ai-app-dev-gaming/introduction/images/vectors-diagram.png differ
diff --git a/dev-ai-app-dev-gaming/introduction/introduction.md b/dev-ai-app-dev-gaming/introduction/introduction.md
new file mode 100644
index 000000000..20274766e
--- /dev/null
+++ b/dev-ai-app-dev-gaming/introduction/introduction.md
@@ -0,0 +1,77 @@
+# Introduction
+
+## About this Workshop
+
+**Data is more than an asset—it’s the engine behind every smart decision, risk calculation and growth strategy. From real-time decision-making to risk management and innovation, success hinges on how well you harness it.**
+
+SeerGroup is a global conglomerate with multiple divisions. Each division buried in transactions, documents, and customer data. Their challenge is always the same: **decisions take too long** because data is scattered across silos and systems.
+
+This workshop shows how SeerGroup tackles that problem with Oracle Database 23ai + OCI Generative AI. By **keeping data in one place**, they cut out fragile integrations and give analysts, engineers, and managers a **single platform** for smarter approvals, faster investigations, and clearer customer answers.
+
+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.
+
+
+✅ **Start with the demo! (Lab 1)**
+
+Step into SeerGroup’s Gaming division as a Tournament Organizer. You’ll use an AI-powered tournament bracket app built on Oracle Database 23ai to:
+
+* Process sign-up requests with AI Vector Search, Graph analytics, and RAG
+
+* See how Generative AI seeds balanced brackets using match history, player skill, and risk scores in seconds
+
+* Approve, deny, or pend sign-ups with AI-generated explanations and direct messages
+
+* Update tournament brackets using JSON Duality Views, ensuring tournament and player data stays consistent
+
+This story shows how Seer Gaming uses Oracle Database 23ai and OCI Generative AI to speed up sign-ups, balance brackets, and deliver consistent player experiences—all within a single converged database.
+
+✅ **What’s next (Labs 2–5)**
+
+After the demo, you’ll switch roles to developer. In the next labs you’ll connect to Oracle Database 23ai, 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 industries can move from siloed processes to intelligent, AI-driven applications—all on one platform.
+
+* **Lab 2 – Connect to your environment**
+Log in to the JupyterLab IDE where you’ll write Python and run your code.
+
+* **Lab 3 – Build the data foundation**
+Use Python with Oracle Database 23ai to create tables, shape them into JSON Duality Views, and interact with them using both SQL and MongoDB-style syntax—laying the groundwork for AI workflows across SeerGroup.
+
+* **Lab 4 – Implement RAG**
+Construct a working AI application. Pull customer and grid data, generate recommendations with OCI Generative AI, chunk and vectorize the results, and answer follow-up questions using Vector Search + RAG.
+
+* **Lab 5 – Extend with MCP tools**
+Wire Oracle Database 23ai and OCI Generative AI into reusable MCP tools. Call them from notebooks, chain them together into workflows, and even register your own tool for SeerGroup’s finance, retail, healthcare, or energy teams.
+
+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 Database 23ai
+
+* 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 a LiveLabs Sandbox reservation.
+
+* Basic knowledge of Python.
+
+* Basic knowledge of Oracle Database, i.e., how to run queries.
+
+## Learn More
+
+* [Oracle Database 23ai Documentation](https://docs.oracle.com/en/database/oracle/oracle-database/23/)
+
+## Acknowledgements
+* **Authors** - Ley Sylvester
+* **Contributors** - Kevin Lazarz, Linda Foinding, Faaris Chaudhry
+* **Last Updated By/Date** - Faaris Chaudhry, September 2025
\ No newline at end of file
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/adb-ocid.png b/dev-ai-app-dev-gaming/local-tenancy/images/adb-ocid.png
new file mode 100644
index 000000000..63130cb3a
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/adb-ocid.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/adb-provisioned.png b/dev-ai-app-dev-gaming/local-tenancy/images/adb-provisioned.png
new file mode 100644
index 000000000..4eff376aa
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/adb-provisioned.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/adb-provisioning.png b/dev-ai-app-dev-gaming/local-tenancy/images/adb-provisioning.png
new file mode 100644
index 000000000..d8a36adb9
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/adb-provisioning.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/adb-workload-type.png b/dev-ai-app-dev-gaming/local-tenancy/images/adb-workload-type.png
new file mode 100644
index 000000000..7257da637
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/adb-workload-type.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/add-key.png b/dev-ai-app-dev-gaming/local-tenancy/images/add-key.png
new file mode 100644
index 000000000..d5941c3fb
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/add-key.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/begin-oci-menu.png b/dev-ai-app-dev-gaming/local-tenancy/images/begin-oci-menu.png
new file mode 100644
index 000000000..36b2feaf1
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/begin-oci-menu.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/chicago-region.png b/dev-ai-app-dev-gaming/local-tenancy/images/chicago-region.png
new file mode 100644
index 000000000..853d9d958
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/chicago-region.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/click-add-api-key.png b/dev-ai-app-dev-gaming/local-tenancy/images/click-add-api-key.png
new file mode 100644
index 000000000..7b1cbd842
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/click-add-api-key.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/click-generative-ai.png b/dev-ai-app-dev-gaming/local-tenancy/images/click-generative-ai.png
new file mode 100644
index 000000000..8ae6b4de4
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/click-generative-ai.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/compartment-name.png b/dev-ai-app-dev-gaming/local-tenancy/images/compartment-name.png
new file mode 100644
index 000000000..b69068773
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/compartment-name.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/compartment.png b/dev-ai-app-dev-gaming/local-tenancy/images/compartment.png
new file mode 100644
index 000000000..6704dfbd1
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/compartment.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/compartments.png b/dev-ai-app-dev-gaming/local-tenancy/images/compartments.png
new file mode 100644
index 000000000..42f4cbb40
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/compartments.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/configure-db.png b/dev-ai-app-dev-gaming/local-tenancy/images/configure-db.png
new file mode 100644
index 000000000..827a8b3d6
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/configure-db.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/connection-string.png b/dev-ai-app-dev-gaming/local-tenancy/images/connection-string.png
new file mode 100644
index 000000000..e79c085d1
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/connection-string.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/contact-email-field.png b/dev-ai-app-dev-gaming/local-tenancy/images/contact-email-field.png
new file mode 100644
index 000000000..4bfdcaba0
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/contact-email-field.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/copy-ocid.png b/dev-ai-app-dev-gaming/local-tenancy/images/copy-ocid.png
new file mode 100644
index 000000000..df42d94f5
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/copy-ocid.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/create-adb-button.png b/dev-ai-app-dev-gaming/local-tenancy/images/create-adb-button.png
new file mode 100644
index 000000000..5237ae7b9
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/create-adb-button.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/create-adb.png b/dev-ai-app-dev-gaming/local-tenancy/images/create-adb.png
new file mode 100644
index 000000000..70fdd2a97
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/create-adb.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/create-admin.png b/dev-ai-app-dev-gaming/local-tenancy/images/create-admin.png
new file mode 100644
index 000000000..77952a527
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/create-admin.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/create-policy.png b/dev-ai-app-dev-gaming/local-tenancy/images/create-policy.png
new file mode 100644
index 000000000..9a1f03bcb
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/create-policy.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/db-connection.png b/dev-ai-app-dev-gaming/local-tenancy/images/db-connection.png
new file mode 100644
index 000000000..8063844f2
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/db-connection.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/deployment-type-serverless.png b/dev-ai-app-dev-gaming/local-tenancy/images/deployment-type-serverless.png
new file mode 100644
index 000000000..553b8fdbf
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/deployment-type-serverless.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/env-credentials.png b/dev-ai-app-dev-gaming/local-tenancy/images/env-credentials.png
new file mode 100644
index 000000000..d5b75f66b
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/env-credentials.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/folder.png b/dev-ai-app-dev-gaming/local-tenancy/images/folder.png
new file mode 100644
index 000000000..e59dfdc11
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/folder.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/key-preview.png b/dev-ai-app-dev-gaming/local-tenancy/images/key-preview.png
new file mode 100644
index 000000000..f21e0af6d
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/key-preview.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/license.png b/dev-ai-app-dev-gaming/local-tenancy/images/license.png
new file mode 100644
index 000000000..b3a6acf9a
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/license.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/network-access.png b/dev-ai-app-dev-gaming/local-tenancy/images/network-access.png
new file mode 100644
index 000000000..19a9fd6a0
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/network-access.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/policies.png b/dev-ai-app-dev-gaming/local-tenancy/images/policies.png
new file mode 100644
index 000000000..f86a6ad58
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/policies.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/policy-info.png b/dev-ai-app-dev-gaming/local-tenancy/images/policy-info.png
new file mode 100644
index 000000000..d32f14a40
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/policy-info.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/policy.png b/dev-ai-app-dev-gaming/local-tenancy/images/policy.png
new file mode 100644
index 000000000..177659095
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/policy.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/private-key.png b/dev-ai-app-dev-gaming/local-tenancy/images/private-key.png
new file mode 100644
index 000000000..f3a7f4557
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/private-key.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/python-version-installed.png b/dev-ai-app-dev-gaming/local-tenancy/images/python-version-installed.png
new file mode 100644
index 000000000..ad73c3267
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/python-version-installed.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/python-version.png b/dev-ai-app-dev-gaming/local-tenancy/images/python-version.png
new file mode 100644
index 000000000..2dadcbaed
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/python-version.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/requirements.png b/dev-ai-app-dev-gaming/local-tenancy/images/requirements.png
new file mode 100644
index 000000000..5300ee500
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/requirements.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/select-atp.png b/dev-ai-app-dev-gaming/local-tenancy/images/select-atp.png
new file mode 100644
index 000000000..ba3960f93
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/select-atp.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/select-compartment.png b/dev-ai-app-dev-gaming/local-tenancy/images/select-compartment.png
new file mode 100644
index 000000000..202c7df5d
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/select-compartment.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/select-your-adb.png b/dev-ai-app-dev-gaming/local-tenancy/images/select-your-adb.png
new file mode 100644
index 000000000..5efaa65d1
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/select-your-adb.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/show-editor.png b/dev-ai-app-dev-gaming/local-tenancy/images/show-editor.png
new file mode 100644
index 000000000..f086a15fb
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/show-editor.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/tokens-keys.png b/dev-ai-app-dev-gaming/local-tenancy/images/tokens-keys.png
new file mode 100644
index 000000000..0e240715a
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/tokens-keys.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/images/virtual-environment.png b/dev-ai-app-dev-gaming/local-tenancy/images/virtual-environment.png
new file mode 100644
index 000000000..ce13f4032
Binary files /dev/null and b/dev-ai-app-dev-gaming/local-tenancy/images/virtual-environment.png differ
diff --git a/dev-ai-app-dev-gaming/local-tenancy/local-tenancy.md b/dev-ai-app-dev-gaming/local-tenancy/local-tenancy.md
new file mode 100644
index 000000000..b007c9347
--- /dev/null
+++ b/dev-ai-app-dev-gaming/local-tenancy/local-tenancy.md
@@ -0,0 +1,433 @@
+# How-to Run Application Locally
+
+## Introduction
+
+In this section, you will learn how to run the Seer Equities Loan Approval application locally. This guide is designed to walk you through the complete setup process—from provisioning required services to installing dependencies and launching the application on your local machine.
+
+The document is structured to help you meet all prerequisites, configure both the Autonomous 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 locally for development and testing, this step-by-step guide will ensure a smooth setup experience.
+
+Estimated Time: 20 minutes
+
+### Objectives
+
+By the end of this section, you will be able to:
+
+- Provision and connect to an Autonomous 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 local development and testing purposes. For production deployment, additional configuration and security hardening will be required.
+
+Let’s get started!
+
+
+## Task 1: Provision an Autonomous Database
+
+Before you can run the application, you need to provision an **Autonomous Database** and obtain the following connection details:
+
+* **Username**
+
+* **Password**
+
+* **Database Connection String (DB Connection)**
+
+1. Click the navigation menu in the upper left to show top level navigation choices.
+
+ 
+
+3. Click **Oracle Database** -> **Autonomous Database**.
+
+ 
+
+4. Click **Create Autonomous Database** to start the instance creation process.
+
+ 
+
+5. This brings up the **Create Autonomous Database** screen where you will specify the configuration of the instance. Provide basic information for the autonomous database:
+
+ **Display Name** - Enter a memorable name for the database for display purposes. For this lab, we used **SeerEquites**.
+ **Database Name** - Use letters and numbers only, starting with a letter. Maximum length is 14 characters. (Underscores not initially supported.) For this lab, we used **SeerEquites**.
+ **Compartment** - Select a compartment for the database from the drop-down list. In the example below, **LiveLabs-Demo** was created ahead of time and chosen.
+
+ 
+
+6. Choose a workload type. Select the workload type for your database. For this lab, we chose **Transaction Processing** as the workload type.
+
+ 
+
+7. Configure the database:
+
+ **Choose database version** - Select a database version from the available versions.
+ **Compute auto scaling** - Enable this option.
+
+ 
+8. Create administrator credentials. **We will need the DB Username and Password for our .env file later. Take note of these credentials.**
+
+ **Password** and **Confirm Password** - Specify the password for ADMIN user of the service instance. The password must meet the following requirements:
+ 1) The password must be between 12 and 30 characters long and must include at least one uppercase letter, one lowercase letter, and one numeric character.
+ 2) The password cannot contain the username.
+ 3) The password cannot contain the double quote (") character.
+ 4) The password must be different from the last 4 passwords used.
+ 5) The password must not be the same password that is set less than 24 hours ago.
+ 6) Re-enter the password to confirm it. Make a note of this password.
+
+ 
+
+9. Choose network access:
+
+ For this lab, accept the default, **Secure access from everywhere**.
+ If you want to allow traffic only from the IP addresses and VCNs you specify where access to the database from all public IPs or VCNs is blocked, select **Secure access from allowed IPs and VCNs only**.
+ If you want to restrict access to a private endpoint within an OCI VCN, select **Private endpoint access only**.
+ If the **Require mutual TLS (mTLS) authentication** option is selected, mTLS will be required to authenticate connections to your Autonomous Database. TLS connections allows Oracle Data Provider for .NET to connect to your Autonomous Database without a wallet. See the [documentation for network options](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/support-tls-mtls-authentication.html#GUID-3F3F1FA4-DD7D-4211-A1D3-A74ED35C0AF5) for options to allow TLS, or to require only mutual TLS (mTLS) authentication.
+
+ 
+
+10. Click **Create**.
+
+ 
+
+11. Your instance will begin provisioning. In a few minutes the state will turn from Provisioning to Available. At this point, your Autonomous Transaction Processing database is ready to use! Have a look at your instance's details here including its name, database version, CPU count and storage size.
+
+ 
+ Provisioning an Autonomous Database instance.
+
+ 
+ Autonomous Database instance successfully provisioned.
+
+## Task 2: Unzip the Code
+
+1. Unzip the application code to a directory of your choice on your local machine:
+
+
+ [**Application Code**] (https://objectstorage.us-ashburn-1.oraclecloud.com/p/fiiLFGXKlmgrZKSwKQkD2Wc7mf5b8OsPUmIsw4rNUPcbBO31Za8T1NNoGAf0l4_S/n/c4u04/b/livelabsfiles/o/developer-library/pages.zip)
+
+
+2. Navigate to the folder where the code is located.
+
+ cd /path/to/your/unzipped/code
+ 
+
+
+## Task 3: Install Python 3.9 or Higher
+
+To run the application, Python version 3.9 or higher is required. Follow the steps below to ensure Python is installed on your machine.
+
+1. Run the following command to check which version of Python is installed.
+
+ ````
+
+ python3 --version
+
+ ````
+ 
+
+2. If Python 3.9+ is not installed, download and install Python 3.9 or higher from the [**official website**](https://www.python.org/downloads/).
+
+ 
+
+## Task 4: Setting Up the Local Environment
+
+1. Create a Virtual Environment. It is recommended to create a virtual environment to isolate the dependencies. In your terminal, run the following command to create a virtual environment:
+
+
+ ````
+
+ python3 -m venv venv
+
+ ````
+
+ This will create a directory called venv that contains your virtual environment.
+
+
+2. Enable the Virtual Environment. Once the virtual environment is created, activate it using the following commands based on your operating system:
+
+ On macOS/Linux:
+
+ ````
+
+ source venv/bin/activate
+
+ ````
+
+ On Windows:
+
+ ````
+
+ .\\venv\\Scripts\\activate
+
+ ````
+
+ After activation, your terminal should show (venv) at the beginning of the line, indicating that the virtual environment is active.
+ 
+
+3. Install Streamlit and Dependencies. The application has a set of required dependencies that need to be installed. You can install them using the requirements.txt file.
+
+ Run the following commands to install all dependencies:
+
+ ````
+
+ pip install oci
+
+ ````
+
+ ````
+
+ pip install streamlit
+
+ ````
+
+ ````
+
+ pip freeze > requirements.txt
+
+ pip install -r requirements.txt
+
+ touch .env
+
+ vi .env
+ **Compartments**.
+
+ 
+
+10. Select your compartment.
+
+ 
+
+11. Copy your compartment OCID. Place the compartment OCID into your .env file.
+
+ 
+
+12. Paste this in as your endpoint url in the .env file:
+
+ ````
+
+ https://inference.generativeai.us-chicago-1.oci.oraclecloud.com
+ **Autonomous Database**.
+
+ 
+
+14. Select your Autonomous Database.
+
+ 
+
+15. Copy your Autonomous Database OCID. Paste it into your .env file.
+
+ 
+
+ You should now have all of the credentials for your .env file filled in.
+
+ 
+
+## Task 5: Setting Up OCI Generative AI Service
+
+1. Click **User Settings** -> **Tokens and Keys**.
+
+ 
+
+2. Click **Add API Key**.
+
+ 
+
+3. Choose **Generate API Key Pair**. Click **Download private key**.
+
+ 
+
+4. After downloading the private key. Click **Add**.
+
+ 
+
+5. Note the Fingerprint, Tenancy OCID, and User OCID from the page.
+
+ 
+
+6. Navigate back to your terminal and paste the following command in to create a config directory.
+
+ ````
+
+ mkdir -p ~/.oci
+
+ touch config
+
+ vi config
+ 💡Note: Replace all placeholders with your actual OCI credentials and key file path except region, which must be us-chicago.
+
+ ````
+
+ [DEFAULT]
+ user=[ocid1.user.oc1..exampleuniqueID]
+ fingerprint=[xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx]
+ key_file= [key_file=~/.oci/oci_api_key.pem]
+ tenancy=[ocid1.tenancy.oc1..exampleuniqueID]
+ region= us-chicago-1
+
+ allow any-user to manage generative-ai-family in compartment [compartment_name]
+ Replace [compartment\_name] with the name of your compartment.
+
+ 
+
+14. Click **Create**.
+
+ 
+
+OCI Generative AI is a fully managed service available via API to seamlessly integrate language models into a wide range of use cases, including writing assistance, summarization, analysis, and chat. You can quickly integrate OCI Generative AI with Autonomous Database to apply AI models to your data.
+
+15. Make sure you are in the US Midwest(Chicago) region:
+
+ 
+
+16. From the Console, open the Navigation menu and click **Analytics & AI**. Click **Generative AI**.
+
+ 
+
+## Task 6: Run the Application
+
+1. Now that everything is set up, you can start the application by running the following command:
+
+ ````
+
+ streamlit run 1-introduction.py
+
+ pip install oci
+ .
+
+* **Database Connection Errors**: Ensure that the database credentials in the .env file are correct and that you have access to the Autonomous 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 configurations 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**.
+
+## Acknowledgements
+
+- **Created By/Date** - Linda Foinding, Kevin Lazarz
+- **Contributor** - Kamryn Vinson
+- **Last Updated By/Date** - Kamryn Vinson, May 2025
\ No newline at end of file
diff --git a/dev-ai-app-dev-gaming/user-story/files/starter-file.sql b/dev-ai-app-dev-gaming/user-story/files/starter-file.sql
new file mode 100644
index 000000000..9d7e762e8
--- /dev/null
+++ b/dev-ai-app-dev-gaming/user-story/files/starter-file.sql
@@ -0,0 +1,101 @@
+/* NOTE: Files cannot contain empty lines (line breaks) */
+/* Specify the base URL that you copied from your files in OCI Object Storage in the define base_URL line below*/
+/* change idthydc0kinr to your real namespace. The name is case-sensitive. */
+/* change ADWCLab to your real bucket name. The name is case-sensitive. */
+/* change us-phoenix-1 to your real region name. The name is case-sensitive. */
+/* you can find these values on the OCI Console .. Storage .. Object Storage screen */
+set define on
+define base_URL='https://objectstorage.us-phoenix-1.oraclecloud.com/n/idthydc0kinr/b/ADWCLab/o'
+/* copy Channels table */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'CHANNELS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/chan_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+/* copy Countries table */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'COUNTRIES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/coun_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+/* Copy customers */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'CUSTOMERS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/cust1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SUPPLEMENTARY_DEMOGRAPHICS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/dem1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SALES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/dmsal_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'PRODUCTS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/prod1v3.dat',
+ format => json_object('delimiter' value '|', 'quote' value '^', 'ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'PROMOTIONS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/prom1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SALES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/sale1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'TIMES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/time_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'COSTS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/costs.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true')
+ );
+end;
+/
diff --git a/dev-ai-app-dev-gaming/user-story/images/Cathy-in-progress.png b/dev-ai-app-dev-gaming/user-story/images/Cathy-in-progress.png
new file mode 100644
index 000000000..2d686a590
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/Cathy-in-progress.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/Cathy-return-dashboard.png b/dev-ai-app-dev-gaming/user-story/images/Cathy-return-dashboard.png
new file mode 100644
index 000000000..a032c5182
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/Cathy-return-dashboard.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/app-home.png b/dev-ai-app-dev-gaming/user-story/images/app-home.png
new file mode 100644
index 000000000..94678e7ad
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/app-home.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/cathy-lee-chatbot.png b/dev-ai-app-dev-gaming/user-story/images/cathy-lee-chatbot.png
new file mode 100644
index 000000000..952ee74b3
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/cathy-lee-chatbot.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/cathy-lee-decision.png b/dev-ai-app-dev-gaming/user-story/images/cathy-lee-decision.png
new file mode 100644
index 000000000..010cb771c
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/cathy-lee-decision.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/cathy-lee-decisions.png b/dev-ai-app-dev-gaming/user-story/images/cathy-lee-decisions.png
new file mode 100644
index 000000000..4a4a565a4
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/cathy-lee-decisions.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/cathy-lee-details.png b/dev-ai-app-dev-gaming/user-story/images/cathy-lee-details.png
new file mode 100644
index 000000000..bf639541c
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/cathy-lee-details.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/cathy-lee-download.png b/dev-ai-app-dev-gaming/user-story/images/cathy-lee-download.png
new file mode 100644
index 000000000..ced06f9b6
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/cathy-lee-download.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/cathy-lee-generate-pdf.png b/dev-ai-app-dev-gaming/user-story/images/cathy-lee-generate-pdf.png
new file mode 100644
index 000000000..00d2e341e
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/cathy-lee-generate-pdf.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/cathy-lee-save.png b/dev-ai-app-dev-gaming/user-story/images/cathy-lee-save.png
new file mode 100644
index 000000000..18c94be63
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/cathy-lee-save.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/cathy-lee-select.png b/dev-ai-app-dev-gaming/user-story/images/cathy-lee-select.png
new file mode 100644
index 000000000..0f3b1025d
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/cathy-lee-select.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/cathy-lee.png b/dev-ai-app-dev-gaming/user-story/images/cathy-lee.png
new file mode 100644
index 000000000..427e2f9bc
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/cathy-lee.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/code-highlight-1.png b/dev-ai-app-dev-gaming/user-story/images/code-highlight-1.png
new file mode 100644
index 000000000..decd21130
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/code-highlight-1.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/expand-graph.png b/dev-ai-app-dev-gaming/user-story/images/expand-graph.png
new file mode 100644
index 000000000..c8cb6fb7f
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/expand-graph.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/frank-johnson-ai.png b/dev-ai-app-dev-gaming/user-story/images/frank-johnson-ai.png
new file mode 100644
index 000000000..2475f94d7
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/frank-johnson-ai.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/frank-johnson-decision.png b/dev-ai-app-dev-gaming/user-story/images/frank-johnson-decision.png
new file mode 100644
index 000000000..b8616e8d5
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/frank-johnson-decision.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/frank-johnson-deny.png b/dev-ai-app-dev-gaming/user-story/images/frank-johnson-deny.png
new file mode 100644
index 000000000..070dcedc9
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/frank-johnson-deny.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/frank-johnson-deny2.png b/dev-ai-app-dev-gaming/user-story/images/frank-johnson-deny2.png
new file mode 100644
index 000000000..bed4f366c
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/frank-johnson-deny2.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/frank-johnson-download.png b/dev-ai-app-dev-gaming/user-story/images/frank-johnson-download.png
new file mode 100644
index 000000000..7c2347d0d
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/frank-johnson-download.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/frank-johnson-pdf.png b/dev-ai-app-dev-gaming/user-story/images/frank-johnson-pdf.png
new file mode 100644
index 000000000..bb9944a68
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/frank-johnson-pdf.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/frank-johnson.png b/dev-ai-app-dev-gaming/user-story/images/frank-johnson.png
new file mode 100644
index 000000000..0f59b9b85
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/frank-johnson.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/grace.png b/dev-ai-app-dev-gaming/user-story/images/grace.png
new file mode 100644
index 000000000..497a2b614
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/grace.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/johnson-denied-list.png b/dev-ai-app-dev-gaming/user-story/images/johnson-denied-list.png
new file mode 100644
index 000000000..a3fac52f5
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/johnson-denied-list.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/johnson-tournament-dashboard.png b/dev-ai-app-dev-gaming/user-story/images/johnson-tournament-dashboard.png
new file mode 100644
index 000000000..3b4a47892
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/johnson-tournament-dashboard.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/login.png b/dev-ai-app-dev-gaming/user-story/images/login.png
new file mode 100644
index 000000000..266d4b235
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/login.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/open-cathy-lee-pdf.png b/dev-ai-app-dev-gaming/user-story/images/open-cathy-lee-pdf.png
new file mode 100644
index 000000000..fb3cd1b2a
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/open-cathy-lee-pdf.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/open-frank-johnson-pdf.png b/dev-ai-app-dev-gaming/user-story/images/open-frank-johnson-pdf.png
new file mode 100644
index 000000000..e616221e9
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/open-frank-johnson-pdf.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/process-selected-pdf.png b/dev-ai-app-dev-gaming/user-story/images/process-selected-pdf.png
new file mode 100644
index 000000000..f3e97d922
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/process-selected-pdf.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/profile-updated.png b/dev-ai-app-dev-gaming/user-story/images/profile-updated.png
new file mode 100644
index 000000000..6467c09a1
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/profile-updated.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/sample1.png b/dev-ai-app-dev-gaming/user-story/images/sample1.png
new file mode 100644
index 000000000..2d9ad4738
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/sample1.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/sample2.png b/dev-ai-app-dev-gaming/user-story/images/sample2.png
new file mode 100644
index 000000000..145c9d39c
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/sample2.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/start-demo.png b/dev-ai-app-dev-gaming/user-story/images/start-demo.png
new file mode 100644
index 000000000..708660e79
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/start-demo.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/images/upload-document.png b/dev-ai-app-dev-gaming/user-story/images/upload-document.png
new file mode 100644
index 000000000..9ed8ba592
Binary files /dev/null and b/dev-ai-app-dev-gaming/user-story/images/upload-document.png differ
diff --git a/dev-ai-app-dev-gaming/user-story/user-story.md b/dev-ai-app-dev-gaming/user-story/user-story.md
new file mode 100644
index 000000000..803eab4de
--- /dev/null
+++ b/dev-ai-app-dev-gaming/user-story/user-story.md
@@ -0,0 +1,231 @@
+# Run the Demo
+
+## Introduction
+
+In this lab, you’ll step into the shoes of a **Tournament Organizer** using an AI powered bracket management app built on Oracle Database 23ai. See how Generative AI, Vector Search, and Graph Analytics reduce review times by automating bracket seeding, rule adherence, and player skill checks - all inside one converged database, with zero data shuffling.
+
+**Disclaimer**: Please note that your results may vary. The information provided is generated by OCI Generative AI services, and your outcomes may differ from those presented.
+
+Estimated Lab Time: 30 minutes
+
+### Objectives
+
+In this lab, you will:
+
+* Review how the Seer Gaming bracket management app incorporates the use of AI Vector Search, Graph analytics, and other converged database features, all 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. To access the demo environment, click **View Login Info** in the top left corner of the page. Click the **Start the Demo** link.
+
+ 
+
+2. Welcome to Seer Holdings! Select **Gaming** as Industry and **Approval Officer** as role. Enter in a username and click **Login**.
+
+ 
+
+3. Welcome to the Seer Gaming bracket management application! Congratulations, you are now connected to the demo environment. You can now execute the different tasks for this Lab.
+
+ 
+
+## Task 2: Demo - Player with medium risk level
+
+In this first example, you will use the application to authorize a sign-up for a player with a medium risk score. Select the first user on your to-do list Cathy Lee.
+
+1. On the Dashboard page, from the pending review list, select the review button for **Cathy Lee**.
+
+ 
+
+2. Opening Cathy Lee’s profile shows her tournament request details — including name, email, request status, team role, and risk level.
+
+ 
+
+3. At the bottom of Cathy Lee’s profile, you’ll find **AI Guru** — a virtual Tournament Officer who guides players and staff through each step of the AI-powered approval portal. AI Guru demonstrates how to upload rank proofs and player data, explains how AI Vector Search compares requests to past tournament cases, and translates risk scores into clear language. Its friendly tips humanize concepts like graph-based team eligibility analysis and RAG-generated rule explanations, helping users of any technical level confidently approve, pend, or deny a tournament request..
+
+ **Copy** the question below into the AI chatbot and press **Enter**. What does AI Guru say?
+
+ ```text
+
+ Has this player submitted similar tournament requests before?
+
+ ```
+
+ 
+
+>💡 In Oracle Database 23ai, **AI Vector Search** allows you to combine your business data with a Large Language Model (LLM) to reduce hallucinations and get accurate answers from your data.
+
+4. Select the **Navigate To Decisions** button.
+
+ 
+
+ After navigating to the decisions page, the AI evaluation runs in the background. Using AI Vector Search, it semantically compares the content against thousands of historical tournament records—identifying patterns that suggest either legitimate claims or potential abuse. At the same time, Graph Analytics examines the player’s prior behavior, highlighting unusual tournament frequency or links to high-risk product categories. For each case, the system assigns a risk score ranging from Low to Very High and generates a clear recommendation—such as “Approved – consistent with player profile” or “Request More Info – insufficient documentation.”
+
+5. In the **Select Your Desired Option Option** section, the approval probability and decision are displayed. Once a decision is made, the analyst finalizes the tournament. A professionally formatted PDF letter is automatically generated, summarizing the outcome and rationale. The player receives an email moments later, clearly stating whether their tournament was approved, denied, or needs more information—along with an explanation grounded in policy and precedent.
+
+ 
+
+6. Select the AI-recommended decision. In this example, that is **Request Info**.
+
+ >Please note that your results may vary. The information provided is generated by OCI Generative AI services, and your outcomes may differ from those presented.
+
+ 
+
+7. Set the final tournament status to **Request Info**, then click **Confirm Decision** to complete the process.
+
+ The tournament status has been updated to 'Request Info' and saved to the player profile.
+
+ 
+
+8. Click the **Download Decision as PDF** button.
+
+ 
+
+9. Click **Download PDF**
+
+ 
+
+10. Display the message the player would see by opening the downloaded PDF.
+
+ 
+
+11. Click the **Return to Dashboard** button to navigate back to the Dashboard. Expand **View In Progress Players**. We can see that Cathy Lee has been removed from the **Pending Players** list and has been added to the **In Progress Players**.
+
+ 
+
+**Task Summary**
+
+Once you select and save one of the 3 tournament options recommended by the AI:
+
+✅ The player's tournament status is updated.
+
+✅ A finalized PDF decision document is generated.
+
+✅ The dashboard reflects the change in real-time — marking Cathy as In Progress.
+
+Congratulations, you have just processed your first player's request! Proceed to the next task.
+
+## Task 3: Demo - Denying a Player
+In this example, you will navigate the application to review a player and deny them as part of the exercise. The first user on your to-do list is Frank Johnson.
+
+1. On the Dashboard page, from the pending review list, select the Review Button for **Frank Johnson**.
+
+ 
+
+2. Opening Frank Johnson’s profile displays his tournament request details. Within seconds, the AI generates recommendations. In this case, the system evaluates a less favorable profile and highlights key risk factors.
+
+ This player has:
+
+ * A **Diamond** rank that conflicts with Rookie-bracket rules
+ * A tournament request history showing **2 prior denials**
+ * Proof submission flagged as **missing or invalid**
+
+ The AI evaluates the profile and suggests requesting more information. However, after reviewing the flagged issues, the tournament officer denies the request, citing the clear explanations for why the player was placed in the pending category.
+
+ 
+
+3. Select the **Navigate to Decisions** button.
+
+ 
+
+>⁉️ **What are two reasons that the AI decided to pend this request?**
+
+4. Expand **Interactive Graph: Tournament Requests & Decisions** to view the graph.
+
+ 
+
+ On the decision page, the tournament approval can use **Interactive Graph: Tournament Requests & Decisions** to explore relationships in tournament authorization scenarios. Built with **Oracle Graph**, this feature visually maps decisions and highlights important features of the request like the player loyalty status and tournament reason.
+
+
+>💡 In Oracle Database 23ai, **Property Graph** allows you to treat your data like a network of connected points, where each point (called a node) and each link (called an edge) has its own details or properties. This setup helps you run graph analytics, to find important connections or patterns, directly within the database.
+
+5. The tournament status is set to **Request Info**. Click the drop down button and select **Denied**, then click the **Confirm Decision** button.
+
+ The tournament status has been updated to 'Denied' and saved to the player profile.
+
+ 
+
+6. Press the **Download Decision as PDF** button to save the AI responses and proceed to the final tournament authorization.
+
+ 
+
+7. Click the **Download PDF** button.
+
+ 
+
+8. Display the message the player would see by opening the downloaded PDF.
+
+ 
+
+9. Click the **Return to Dashboard** button to navigate back to the Dashboard. Expand **View Denied Players**. You will see that Frank Johnson has been moved from the **Pending Player** list to the **Denied Players** list.
+
+ 
+
+**Conclusion**
+
+Congratulations, you have finished reviewing a player with risk! Proceed to the next task.
+
+## Task 4: Demo - Update player details
+
+Lastly, let’s explore how the system uses JSON Duality Views to handle profile updates. In this task, you will edit a player’s details. In this example, the player was asked to submit updated proof of carrier tracking.
+
+1. On the Dashboard page, from the **Pending Players** list, select the review button for **Grace O'Brien**.
+
+ 
+
+2. We will upload a document to update the item's tournament condition. On the Player Details page, click the **Upload Document** button.
+
+ 
+
+3. The PDF file has been loaded. Click the **Process PDF** button.
+
+ 
+
+>💡 **JSON Duality Views** in 23ai let's you update unstructured data in an easy, high-level format while automatically handling the technical details behind the scenes. This makes it faster and simpler to work with messy data and connect it to structured systems.
+
+4. The player profile has been updated.
+
+ 
+
+5. Navigate to the player decisions page and notice that the information has been updated. Thanks to JSON Transform and JSON Duality Views, only the relevant field is modified — leaving the rest of the profile UNTOUCHED.
+
+
+**Task Summary**
+
+Once the document is uploaded:
+
+✅ The system automatically detects the new item condition data.
+
+✅ Then their profile will be updated for the tournament description.
+
+✅ And thanks to JSON Transform and JSON Duality Views, only the relevant field is modified — leaving the rest of the profile UNTOUCHED.
+
+## Conclusion
+
+In conclusion our Tournament Authorization App was able to leverage Oracle database 23ai technologies such as **AI Vector Search, Property Graph and JSON Duality Views** to:
+
+✅ Automate profile evaluations
+
+✅ Provide AI-driven tournament recommendations by using an RAG model powered by a Oracle Database 23ai's AI Vector Search and OCI Generative AI service
+
+✅ Enable seamless profile updates with JSON Duality Views
+
+✅ And empower tournament analysts with actionable insights through Operational Property Graphs
+
+By combining these advanced tools, the application enables faster, smarter decisions and delivers clear guidance on how Players can improve their eligibility.
+
+**Next:** How about learning how the application was implemented in Python? Continue with the next labs and start developing!
+
+## Learn More
+
+* [Oracle Database 23ai Documentation](https://docs.oracle.com/en/database/oracle/oracle-database/23/)
+
+## Acknowledgements
+* **Authors** - Linda Foinding, Francis Regalado, Ley Sylvester
+* **Contributors** - Kevin Lazarz, Hanna Rakhsha, Ley Sylvester, Uma Kumar, Faaris Chaudhry
+* **Last Updated By/Date** - Faaris Chaudhry, September 2025
\ No newline at end of file
diff --git a/dev-ai-app-dev-gaming/workshops/sandbox/index.html b/dev-ai-app-dev-gaming/workshops/sandbox/index.html
new file mode 100644
index 000000000..aebbdda4a
--- /dev/null
+++ b/dev-ai-app-dev-gaming/workshops/sandbox/index.html
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
diff --git a/dev-ai-app-dev-gaming/workshops/sandbox/manifest.json b/dev-ai-app-dev-gaming/workshops/sandbox/manifest.json
new file mode 100644
index 000000000..46c0993f0
--- /dev/null
+++ b/dev-ai-app-dev-gaming/workshops/sandbox/manifest.json
@@ -0,0 +1,41 @@
+{
+ "workshoptitle": "Build a GenAI App on Oracle Database 23ai – Gaming 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": "../../connect-to-env/connect-to-env.md"
+ },
+ {
+ "title": "Lab 3: Coding Basics on Oracle Database 23ai",
+ "description": "Some coding examples",
+ "filename": "https://oracle-livelabs.github.io/developer/dev-ai-app-dev-retail/codingbasics/codingbasics.md"
+ },
+ {
+ "title": "Lab 4: Step by Step - Implement RAG with Oracle Database 23ai",
+ "description": "This is a step-by-step guide showcasing how the demo instance is navigated",
+ "filename": "../../build/build.md"
+ },
+ {
+ "title": "Lab 5: Interact with Oracle Database 23ai through an MCP Server",
+ "description": "This is a step-by-step guide showcasing how the demo instance is navigated",
+ "filename": "https://oracle-livelabs.github.io/developer/dev-ai-app-dev-retail/mcp/mcp.md"
+ },
+ {
+ "title": "Need Help?",
+ "description": "Solutions to Common Problems and Directions for Receiving Live Help",
+ "filename": "https://oracle-livelabs.github.io/common/labs/need-help/need-help-freetier.md"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/dev-ai-app-dev-gaming/workshops/tenancy/index.html b/dev-ai-app-dev-gaming/workshops/tenancy/index.html
new file mode 100644
index 000000000..aebbdda4a
--- /dev/null
+++ b/dev-ai-app-dev-gaming/workshops/tenancy/index.html
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+ Oracle LiveLabs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Oracle LiveLabs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev-ai-app-dev-gaming/workshops/tenancy/manifest.json b/dev-ai-app-dev-gaming/workshops/tenancy/manifest.json
new file mode 100644
index 000000000..1c09880b1
--- /dev/null
+++ b/dev-ai-app-dev-gaming/workshops/tenancy/manifest.json
@@ -0,0 +1,96 @@
+{
+ "workshoptitle": "Build a GenAI App on Oracle Database 23ai – Healthcare 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": "../../connect-to-env/connect-to-env.md"
+ },
+ {
+ "title": "Lab 3: Start coding with Oracle Database 23ai",
+ "description": "Some coding examples",
+ "filename": "../../codingbasics/codingbasics.md"
+ },
+ {
+ "title": "Lab 4: Step by Step - Implement RAG with Oracle Database 23ai",
+ "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 Database 23ai",
+ "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://oracle-livelabs.github.io/common/labs/need-help/need-help-freetier.md"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/dev-ai-app-dev-life_sciences/app-architecture/app-architecture.md b/dev-ai-app-dev-life_sciences/app-architecture/app-architecture.md
new file mode 100644
index 000000000..aad4003ee
--- /dev/null
+++ b/dev-ai-app-dev-life_sciences/app-architecture/app-architecture.md
@@ -0,0 +1,72 @@
+# Architecture & Workshop Features
+
+## Introduction
+
+In this lab, you will explore the architecture behind the workshop that supports the tasks you will perform. We also have a closer look at all the features of the Oracle Database 23ai that were used to build the workshop and the demo application.
+
+Estimated Lab Time: 15 minutes
+
+## 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)**.
+
+
+
+### 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 runs two containers, including:
+
+ - Open-source Python library for the Healthcare Claim Approval Demo
+
+ - JupterLab as a browser-based development environment
+
+- The Application Subnet connects to the Oracle Services Network via the Service Gateway, enabling access to:
+
+ - Autonomous Database Serverless
+
+ - OCI Generative AI Services
+
+This architecture provides strong connectivity, scalability, and integration with Oracle cloud-native services to support efficient loan processing and approval.
+
+## Oracle Database 23ai features used in the demo app and in this workshop
+
+
+
+
+### **JSON Duality View**
+
+JSON Relational Duality in Oracle Database 23ai bridges the gap between relational and document data models. It gives developers the flexibility of JSON with the efficiency and power of relational storage. This eliminates 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 that should be highlighted is the ability to connect the database using Mongo DB syntax. This allows developers to interact with collections and documents using a familiar syntax.
+
+**Where is it used**: We implemented JSON Duality View in the demo app and in this workshop. All data you can view in the dashboard of the demo app is query from JSON Duality Views. In Lab 3, you learn how to interact with JSON Duality View using Oracle's Python driver. But you also learn how to use Oracle's Mongo API to query JSON Duality Views using Mongo DB syntax.
+
+### **AI Vector Search**
+
+Oracle AI Vector Search, a feature of Oracle Database 23ai, 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, returning more accurate, context-aware results. Developers can also add semantic search to new or existing applications with minimal effort. A **unique feature** of Oracle Database 23ai is its capability to host ONNX models and deploy them as a database function. This feature allows you to host ONNX models and deploy them as a database function, enabling seamless integration with Oracle Database 23ai.
+
+**Where is it used**: AI Vector Search is a key feature of the demo app and is also a topic in Lab 4 and Lab 5. In Lab 4, you use AI Vector Search to implement a RAG process, while in Lab 5, you specifically implement similarity search.
+
+### **Property Graph**
+
+Oracle Database 23ai supports property graphs, which model relationships using vertices and edges mapped to existing tables, external tables, materialized views, or synonyms. These graphs store metadata—not the actual data—which remains in the underlying objects. You use SQL/PGQ to query and interact with them.
+
+Property graphs simplify working with connected data, such as identifying influencers, predicting trends, or discovering relationships through pattern matching, by offering a more intuitive and efficient way to model and query complex networks.
+
+**Where is it used**: We implemented property graphs in the demo part of this workshop. Healthcare Claim Analysts can use it to identify potential alternative treatments for their patients.
+
+
+## Acknowledgements
+* **Authors** - Kamryn Vinson, Linda Foinding, Francis Regalado
+* **Contributors** - Eddie Ambler, Kevin Lazarz
+* **Last Updated By/Date** - Kamryn Vinson, April 2025
\ No newline at end of file
diff --git a/dev-ai-app-dev-life_sciences/app-architecture/images/logical.png b/dev-ai-app-dev-life_sciences/app-architecture/images/logical.png
new file mode 100644
index 000000000..ff693fa61
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/app-architecture/images/logical.png differ
diff --git a/dev-ai-app-dev-life_sciences/app-architecture/images/physical-architecture.png b/dev-ai-app-dev-life_sciences/app-architecture/images/physical-architecture.png
new file mode 100644
index 000000000..402f3519b
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/app-architecture/images/physical-architecture.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/build.md b/dev-ai-app-dev-life_sciences/build/build.md
new file mode 100644
index 000000000..851fb8c8e
--- /dev/null
+++ b/dev-ai-app-dev-life_sciences/build/build.md
@@ -0,0 +1,713 @@
+# Step by step: Implement RAG with Oracle Database 23ai
+
+## Introduction
+
+Here you’ll construct a State & Local Government service request assessment tool powered by Oracle Database 23ai and OCI Generative AI. Connect to citizen requests and city infrastructure data, analyze service priority and policy compliance, and use an LLM to draft resolution recommendations with regulatory references. Leveraging Python from prior labs, you’ll deploy a fully integrated AI app that accelerates public works service decisions.
+
+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 service approval application as seen in lab 1
+* Use OCI Generative AI to generate personalized product recommendations
+* Use Python to connect to an Oracle Database 23ai instance and run queries
+* Explore supplier data and extract relevant information
+
+### Prerequisites
+
+This lab assumes you have:
+
+* An Oracle Cloud account
+* Completed lab 1: Run the demo
+* Completed lab 2: Connect to the Development Environment
+
+## Task 1: Build the application in Jupyter Notebook
+>💡**Note**: Review Lab 2: Connect to the Development Environment for instructions on accessing JupyterLab.
+
+1. You should see a terminal pop up once you are logged in.
+
+ 
+
+
+2. Navigate to the `dbinit` directory by running the following command.
+
+ ```bash
+
+ cd dbinit
+
+ ```
+
+ 
+
+3. Copy and run the following command to create tables in the database. There will be a lot of output. You should see the following output once complete.
+
+ ```bash
+
+ ./shell_script.sh
+
+ ```
+
+ 
+
+ 
+
+## Task 2: Connect to Database
+
+2. Click the **+** sign on the top left to open the Launcher.
+
+ 
+
+3. Open a new notebook.
+
+ 
+
+1. Copy the following code block into an empty cell in your notebook. This code block imports the `oracledb` Python driver and other libraries.
+
+ ```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()
+
+ ```
+
+2. Run the code block to connect to the database.
+
+ 
+
+## Task 3: Pull patient data from the database
+
+You will query patient data from the `lsc_patients_dv` JSON duality view, which combines data from PATIENTS and related tables. This task will:
+
+- **Define a Function**: Create a reusable function a to query the database by patient ID, extracting the JSON data for a specific patient.
+
+- **Use an Example**: Fetch data for patient `2001` (John Miller) to demonstrate the process.
+
+- **Display the Results**: Format the retrieved data into a pandas DataFrame for a clear tabular view, highlighting key details such as patient name, email, request type, and severity.
+
+1. Copy and paste the code below into the new notebook:
+
+ ```python
+
+ # Task 3: Fetch patient JSON from lsc_patients_dv + shared helpers
+
+ # Pull single patient JSON document from DV
+ def fetch_patient_life(patient_id: int):
+ cursor.execute(
+ "SELECT data FROM lsc_patients_dv WHERE JSON_VALUE(data,'$._id') = :pid",
+ {'pid': str(patient_id)}
+ )
+ row = cursor.fetchone()
+ if not row:
+ return None
+ return json.loads(row[0]) if isinstance(row[0], str) else row[0]
+
+ # Load clinical requests into a DataFrame
+ def load_clinical_requests():
+ cursor.execute("""
+ SELECT request_id, patient_id, request_date, status, request_type
+ FROM LSC_REQUESTS
+ """)
+ rows = cursor.fetchall()
+ cols = ["REQUEST_ID","PATIENT_ID","REQUEST_DATE","STATUS","REQUEST_TYPE"]
+ return pd.DataFrame(rows, columns=cols) if rows else pd.DataFrame(columns=cols)
+
+ # Pull first request/recommendation/decision bundle
+ def extract_first_request_bundle_life(p_json):
+ p = p_json or {}
+ requests = p.get("requests") or []
+ req0 = requests[0] if requests else {}
+ rec = req0.get("recommendation") or {}
+ dec = rec.get("decision") or {}
+ return req0, rec, dec
+
+ # --- Let's select a Life Sciences patient ---
+ selected_patient_id = 2001 # John Miller
+ pat_json = fetch_patient_life(selected_patient_id)
+ df_reqs = load_clinical_requests()
+
+ # Print summary of current case
+ if pat_json:
+ req0, rec0, dec0 = extract_first_request_bundle_life(pat_json)
+ print(f"Patient: {pat_json.get('firstName')} {pat_json.get('lastName')} | Gender: {pat_json.get('gender')} | Physician: {pat_json.get('physician',{}).get('lastName')}")
+ print(f"Request ID: {req0.get('requestId')} | Type: {req0.get('requestType')} | Status: {req0.get('status')}")
+ print(f"Recommendation: {rec0.get('recommendation')} | Explanation: {rec0.get('explanation')}")
+ print(f"Decision: {dec0.get('finalDecision')} | Notes: {dec0.get('decisionText')}")
+ else:
+ print("No patient found.")
+
+
+ ```
+
+2. Click the "Run" button to execute the code.
+
+ 
+
+3. The output will display a DataFrame containing the patient details for the selected patient ID.
+
+ 
+
+## Task 4: Generate Recommendations for the patients/Supplier
+
+In a new cell, build a prompt using the patient’s request, uploaded supporting documents, and Operational Property Graph analysis. Retrieve compliance policy rules and risk indicators, then generate a decision from the recommendation: **Approved, Denied, Request Info, or Pending Review**. Call OCI Generative AI as the provider, using the model meta.llama-3.2-90b-vision-instruct to recommend a public works service decision, update the State & Local Government tables, and display the results.
+
+With patient profiles in place, you will use OCI Generative AI to generate personalized service request recommendations.
+
+Here’s what we’ll do:
+
+1. Copy and paste the code in a new cell:
+
+ ```python
+
+ # 🔹 Task 4: Simple Life Sciences recommendation using helpers from Task 3
+
+ # Map Numeric Score to Risk Label
+ def _risk_bucket(n):
+ try:
+ n = int(n)
+ except:
+ return "Medium"
+ if n <= 3: return "High"
+ if n <= 6: return "Medium"
+ if n <= 8: return "Low"
+ return "Very Low"
+
+ # Reuse outputs from Task 3 (Life Sciences)
+ req0, rec0, dec0 = extract_first_request_bundle_life(pat_json or {})
+
+ # IDs we will persist back into db
+ request_id = (req0 or {}).get("requestId")
+ recommend_id = (rec0 or {}).get("recommendId")
+
+ # Build content blocks for our LLM
+ # Requests to help the model
+ requests_block = "\n".join([
+ f"- Request {r.REQUEST_ID}: Type={r.REQUEST_TYPE}, Status={r.STATUS}, Date={r.REQUEST_DATE}"
+ for _, r in df_reqs.iterrows()
+ ]) or "None"
+
+ # Patient demographics
+ pat_block = "\n".join([
+ f"- {k}: {v}"
+ for k, v in (pat_json or {}).items() if k not in ["requests","_metadata","notes","labResults"]
+ ]) or "None"
+
+ # Request details
+ req_block = "\n".join([f"- {k}: {v}" for k, v in (req0 or {}).items() if k != "recommendation"]) or "None"
+
+ # Recommendation details (if present)
+ rec_block = "\n".join([f"- {k}: {v}" for k, v in (rec0 or {}).items() if k != "decision"]) or "None"
+
+ prompt = f"""
+ You are a Clinical Trial Decision Advisor. Use ONLY this context.
+ Decide APPROVED / DENIED / REQUEST INFO. Prefer APPROVED or DENIED; use REQUEST INFO only if neither can be justified.
+
+ Clinical Requests:
+ {requests_block}
+
+ Patient:
+ {pat_block}
+
+ Request:
+ {req_block}
+
+ Recommendation:
+ {rec_block}
+
+ Decision rules:
+ - APPROVED if: request complies with protocol AND evidence supports safety.
+ - DENIED if: unsafe, protocol violation, or invalid.
+ - REQUEST INFO only if key clinical data is missing/ambiguous.
+ - If no valid request plausibly matches, prefer DENIED over REQUEST INFO.
+
+ Return EXACTLY this layout (no extra text):
+ Suggested Action: APPROVED|DENIED|REQUEST INFO
+ Risk: N (Very Low|Low|Medium|High)
+ Rationale:
+ - one reason
+ - second reason
+ - third reason
+ NextSteps:
+ - step 1 (empty if Approved)
+ - step 2
+ - step 3
+ """
+
+ print("Generating AI recommendations …")
+ try:
+ genai_client = oci.generative_ai_inference.GenerativeAiInferenceClient(
+ config=oci.config.from_file(os.path.expanduser(os.getenv("OCI_CONFIG_PATH","~/.oci/config")), "DEFAULT"),
+ 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.0
+ ),
+ serving_mode=oci.generative_ai_inference.models.OnDemandServingMode(
+ model_id="meta.llama-3.2-90b-vision-instruct"
+ )
+ )
+ chat_resp = genai_client.chat(chat_detail)
+ recommendation_text = chat_resp.data.chat_response.choices[0].message.content[0].text
+ except Exception as e:
+ print(f"OCI GenAI error: {e}")
+ recommendation_text = ""
+
+ print("\n--- AI Recommendation ---\n", recommendation_text[:1000])
+
+ # Parse the simple block
+ act = re.search(r"Suggested\s*Action:\s*(APPROVED|DENIED|REQUEST INFO)\b", recommendation_text, re.I)
+ risk_num = re.search(r"Risk:\s*([0-9]+)", recommendation_text, re.I)
+ risk_lbl = re.search(r"Risk:\s*[0-9N]+\s*\((Very Low|Low|Medium|High)\)", recommendation_text, re.I)
+
+ action_norm = (act.group(1).upper() if act else "REQUEST INFO")
+ risk_n = risk_num.group(1) if risk_num else ("7" if action_norm == "APPROVED" else "5")
+ risk_l = (risk_lbl.group(1).title() if risk_lbl else _risk_bucket(risk_n))
+
+ # Map to dashboard vocab
+ table_status = "Approved" if action_norm == "APPROVED" else ("Denied" if action_norm == "DENIED" else "In Progress")
+
+ # update new values into the DB
+ try:
+ # Insert / Update LSC_RECOMMENDATION
+ cursor.execute("""
+ MERGE INTO LSC_RECOMMENDATION t
+ USING (SELECT :rid AS RECOMMEND_ID FROM dual) s
+ ON (t.RECOMMEND_ID = s.RECOMMEND_ID)
+ WHEN MATCHED THEN UPDATE SET
+ t.REQUEST_ID = :req_id,
+ t.RECOMMENDATION = :rec,
+ t.EXPLANATION = :exp,
+ t.SAFETY_LEVEL = t.SAFETY_LEVEL
+ WHEN NOT MATCHED THEN INSERT
+ (RECOMMEND_ID, REQUEST_ID, RECOMMENDATION, SAFETY_LEVEL, EXPLANATION)
+ VALUES (:rid, :req_id, :rec, 'Medium', :exp)
+ """, {
+ 'rid': recommend_id or 81001, # stable fallback ID
+ 'req_id': request_id,
+ 'rec': table_status,
+ 'exp': recommendation_text
+ })
+
+ # Update LSC_REQUESTS with STATUS
+ cursor.execute("""
+ UPDATE LSC_REQUESTS
+ SET STATUS = :status
+ WHERE REQUEST_ID = :req_id
+ """, {'status': table_status.upper(), 'req_id': request_id})
+
+ connection.commit()
+ print(f"Stored recommendation -> {table_status} (risk={risk_l}); linked to LSC_REQUESTS {request_id}.")
+ except Exception as e:
+ connection.rollback()
+ print("Failed to store recommendation:", e)
+
+
+ ```
+
+2. Click the "Run" button to execute the code. Note that this will take time to run.
+
+ 
+
+3. Review the output. In the demo, this is where you selected the “Navigate to Decisions” button as the Clinical Reviewer. You just used AI to generate service activation recommendations that would have taken hours to complete manually—congratulations!
+
+ 
+
+>Note: Your result may be different. This is because of generative AI and the model's ability to generate new content based on your input. The output may contain different recommendations or suggestions.
+
+## Task 5: Chunk & Store Recommendations
+
+To handle follow-up questions, you will enhance the system with an AI Guru powered by Oracle 23ai’s Vector Search and Retrieval-Augmented Generation (RAG). The AI Guru will be able to answer questions about the grid interconnection application and provide recommendations based on the data.
+
+Before answering questions, we need to prepare the data by vectoring the claims recommendations. This step:
+
+ - Stores Recommendations: Inserts the full recommendation text (from previous cell) as a single chunk if not already present.
+ - We delete prior chunks for this authorization.
+ - We use `VECTOR_CHUNKS` to split the recommendation text.
+ - The chunks will be inserted into `LSC_VECTOR_CHUNK`
+ - We display a data frame summary to show the chunks.
+
+
+1. Copy the following code and run:
+
+ ```python
+
+ # 🔹 Task 5: Chunk & store AI recommendation, then SHOW the chunks (Life Sciences)
+
+ req_id = request_id # from Task 4
+ text_to_chunk = (recommendation_text or "").strip()
+ if not text_to_chunk:
+ text_to_chunk = f"SuggestedAction: {table_status}\nRationale: (empty model output)."
+
+ # 0) Find a DOC_ID for this request (attach chunks to it)
+ cursor.execute("""
+ SELECT DOC_ID
+ FROM LSC_DOCUMENTS
+ WHERE PATIENT_ID = (
+ SELECT PATIENT_ID FROM LSC_REQUESTS WHERE REQUEST_ID = :rid
+ )
+ ORDER BY DOC_ID DESC FETCH FIRST 1 ROWS ONLY
+ """, {'rid': req_id})
+ doc_row = cursor.fetchone()
+ doc_id = doc_row[0] if doc_row else None
+
+ # 1) Clear old chunks
+ if doc_id:
+ cursor.execute("DELETE FROM LSC_VECTOR_CHUNK WHERE DOC_ID = :docid", {'docid': doc_id})
+ connection.commit()
+
+ # 2) Chunk via VECTOR_CHUNKS
+ chunk_size = 25
+ overlap = 0
+
+ insert_chunks_sql = f"""
+ INSERT INTO LSC_VECTOR_CHUNK (DOC_ID, CHUNK_ID, CHUNK_TEXT)
+ SELECT :docid, c.chunk_offset, c.chunk_text
+ FROM (SELECT :txt AS c FROM dual) s,
+ VECTOR_CHUNKS(
+ dbms_vector_chain.utl_to_text(s.c)
+ BY words
+ MAX {int(chunk_size)}
+ OVERLAP {int(overlap)}
+ SPLIT BY sentence
+ LANGUAGE american
+ NORMALIZE all
+ ) c
+ """
+
+ inserted = 0
+ try:
+ if doc_id:
+ cursor.execute(insert_chunks_sql, {'docid': doc_id, 'txt': text_to_chunk})
+ inserted = cursor.rowcount or 0
+ connection.commit()
+ else:
+ print(f"No document found for REQUEST_ID={req_id}, skipping chunk insert.")
+ except oracledb.DatabaseError as e:
+ print(f"VECTOR_CHUNKS error, {e}")
+ inserted = 0
+
+ print(f"Stored {inserted} chunk(s) for REQUEST_ID={req_id}.")
+
+ # 3) Fetch & SHOW the chunks
+ cursor.execute("""
+ SELECT c.CHUNK_ID AS CHUNK_ID, c.CHUNK_TEXT AS CHUNK_TEXT
+ FROM LSC_VECTOR_CHUNK c
+ JOIN LSC_DOCUMENTS d ON c.DOC_ID = d.DOC_ID
+ WHERE d.PATIENT_ID = (
+ SELECT PATIENT_ID FROM LSC_REQUESTS WHERE REQUEST_ID = :rid
+ )
+ ORDER BY c.CHUNK_ID
+ """, {'rid': req_id})
+ rows = cursor.fetchall()
+ cols = [c[0] for c in cursor.description]
+
+ # Build DataFrame
+ def _lob_to_str(v):
+ return v.read() if isinstance(v, oracledb.LOB) else v
+
+ items = []
+ for row in rows:
+ cid, ctext = row
+ 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")
+
+ # Display in notebook
+ display(df_chunks)
+
+ print(f"\nStored {inserted} chunk(s) for REQUEST_ID={req_id}.")
+
+
+ ```
+
+2. Click the "Run" button to execute the code.
+
+ 
+
+3. Review the output.
+
+ 
+
+## Task 6: Create Embeddings
+
+Now we must generate and store vector embeddings. This allows us to use Vector Search and RAG to enhance AI Guru's answers.
+
+In this step:
+
+ - **Generates Embeddings**: This is a new feature in Oracle Database 23ai that allows you to create embeddings directly within the database, eliminating the need for external tools or APIs. The `dbms_vector_chain.utl_to_embedding` function takes the recommendation text as input and returns an embedding vector.
+
+ - **Stores Embeddings**: We update `SLG_CHUNK.CHUNK_VECTOR` by embedding each `CHUNK_TEXT` using `dbms_vector_chain.utl_to_embedding` with `DEMO_MODEL`. A short verification output is printed.
+
+1. Copy the following code into a new cell block:
+
+ ```python
+
+ # 🔹 Task 6: Create embeddings for LSC_VECTOR_CHUNK rows
+ req_id = request_id # from Task 4/5
+ vp = json.dumps({"provider": "database", "model": "DEMO_MODEL", "dimensions": 384})
+
+ # 1) Embed all chunks for this Life Sciences request (via PATIENT_ID → DOC_ID)
+ try:
+ cursor.execute(
+ """
+ UPDATE LSC_VECTOR_CHUNK c
+ SET c.CHUNK_VECTOR = dbms_vector_chain.utl_to_embedding(c.CHUNK_TEXT, JSON(:vp))
+ WHERE c.DOC_ID IN (
+ SELECT d.DOC_ID
+ FROM LSC_DOCUMENTS d
+ WHERE d.PATIENT_ID = (
+ SELECT r.PATIENT_ID
+ FROM LSC_REQUESTS r
+ WHERE r.REQUEST_ID = :rid
+ )
+ )
+ """,
+ {"vp": vp, "rid": req_id}
+ )
+ updated = cursor.rowcount or 0
+ connection.commit()
+ print(f"Embedded vectors for {updated} chunk(s) (REQUEST_ID={req_id}).")
+ except oracledb.DatabaseError as e:
+ connection.rollback()
+ print("Embedding failed. Make sure DEMO_MODEL is loaded in Task 2.")
+ raise
+
+ # 2) Sanity check: how many rows have vectors now?
+ cursor.execute("""
+ SELECT COUNT(*)
+ FROM LSC_VECTOR_CHUNK c
+ JOIN LSC_DOCUMENTS d ON c.DOC_ID = d.DOC_ID
+ WHERE d.PATIENT_ID = (
+ SELECT r.PATIENT_ID FROM LSC_REQUESTS r WHERE r.REQUEST_ID = :rid
+ )
+ AND c.CHUNK_VECTOR IS NOT NULL
+ """, {"rid": req_id})
+ have_vec = cursor.fetchone()[0]
+
+ cursor.execute("""
+ SELECT COUNT(*)
+ FROM LSC_VECTOR_CHUNK c
+ JOIN LSC_DOCUMENTS d ON c.DOC_ID = d.DOC_ID
+ WHERE d.PATIENT_ID = (
+ SELECT r.PATIENT_ID FROM LSC_REQUESTS r WHERE r.REQUEST_ID = :rid
+ )
+ """, {"rid": req_id})
+ total_rows = cursor.fetchone()[0]
+
+ print(f"Vectors present: {have_vec}/{total_rows}")
+
+
+ ```
+
+2. Click the "Run" button to execute the code.
+
+ 
+
+3. Review the output.
+
+ 
+
+## Task 7: Implement RAG with Oracle Database 23ai's Vector Search
+
+Now that the recommendations are vectorized, we can process a user’s question:
+
+ ```Why was this clinical request approved?```
+
+ - **Vectorizes the question**: Embeds the question using `DEMO_MODEL` via `dbms_vector_chain.utl_to_embedding`.
+ - **Performs AI Vector Search**: Finds the most relevant using similarity search over the stored chunks.
+ - **Use RAG**: Combines the patient profile and relevant chunk information into a prompt for OCI Generative AI, producing a concise answer. Here you implement the RAG process.
+ - **Prints**: An answer is returned with citations from the LLM
+
+1. Copy the code and run:
+
+ ```python
+
+ # 🔹 Helper: extract first life sciences bundle (requests → recommendation → decision)
+ def extract_first_request_bundle_life(pat_json):
+ c = pat_json or {}
+ requests = c.get("requests") or []
+ req0 = requests[0] if requests else {}
+
+ rec0 = req0.get("recommendation") or {}
+ dec0 = rec0.get("decision") or {}
+
+ return req0, rec0, dec0
+
+
+ # Task 7: RAG — retrieve most relevant chunk(s) and answer a question (Life Sciences)
+
+ # 🔹 Prep: Extract a consistent bundle from pat_json
+ req0, rec_block, dec_block = extract_first_request_bundle_life(pat_json)
+
+ # 0) Question (edit as needed)
+ question = "Why was this clinical request approved?"
+ print("Running vector search…")
+
+ # 1) Embed the question with the same model used earlier
+ vp = json.dumps({"provider": "database", "model": "DEMO_MODEL", "dimensions": 384})
+ cursor.execute(
+ "SELECT dbms_vector_chain.utl_to_embedding(:q, JSON(:vp)) FROM dual",
+ {"q": question, "vp": vp}
+ )
+ qvec = cursor.fetchone()[0]
+
+ # 2) Retrieve chunks from LSC_VECTOR_CHUNK for this request's patient
+ cursor.execute(f"""
+ SELECT c.CHUNK_ID,
+ c.CHUNK_TEXT,
+ VECTOR_DISTANCE(c.CHUNK_VECTOR, :qv, COSINE) AS dist
+ FROM LSC_VECTOR_CHUNK c
+ JOIN LSC_DOCUMENTS d ON c.DOC_ID = d.DOC_ID
+ WHERE d.PATIENT_ID = (
+ SELECT r.PATIENT_ID FROM LSC_REQUESTS r WHERE r.REQUEST_ID = :rid
+ )
+ AND c.CHUNK_VECTOR IS NOT NULL
+ ORDER BY dist
+ FETCH FIRST 1 ROWS ONLY
+ """, {"rid": req0.get("requestId"), "qv": qvec})
+ rows = cursor.fetchall()
+
+ def _lob_to_str(v):
+ return v.read() if isinstance(v, oracledb.LOB) else v
+
+ retrieved = []
+ for cid, ctext, dist in rows:
+ txt = _lob_to_str(ctext) or ""
+ retrieved.append((cid, txt, float(dist)))
+
+
+ # 3) Build a compact RAG prompt
+ def _normalize_ws(s: str) -> str:
+ return re.sub(r"\s+", " ", s or "").strip()
+
+ context_lines = [f"[Chunk {cid}] {_normalize_ws(txt)}" for cid, txt, _ in retrieved]
+ context_block = "\n\n".join(context_lines)
+
+ patient_name = f"{pat_json.get('firstName','')} {pat_json.get('lastName','')}".strip()
+ physician = f"{pat_json.get('physician',{}).get('firstName','')} {pat_json.get('physician',{}).get('lastName','')}".strip()
+ req_type = req0.get("requestType", "")
+ status = req0.get("status", "")
+
+ prompt = f"""[INST] <>You are a Clinical Trial AI Reviewer. Be precise, cite the chunk ids inline like [Chunk 2] when referring to specific facts.
+ Do not mention sources outside of the provided context. Respond in under 400 words.
+ ALWAYS respond as if you have the knowledge yourself.
+ Do NOT provide warnings, disclaimers, or exceed the specified response length.
+ <> [/INST]
+
+ Patient: {patient_name}, Physician={physician}
+ Request: {req_type}, Status={status}
+
+ Question: {question}
+
+ Context:
+ {context_block}
+
+ Return this format (plain text, no extra lines):
+ Decision: APPROVED|DENIED|REQUEST INFO
+ Why:
+ - reason 1 (cite [Chunk N])
+ - reason 2 (cite [Chunk N])
+ - reason 3 (cite [Chunk N])
+ Next:
+ - actionable step 1
+ - actionable step 2
+ - actionable step 3
+ """.strip()
+
+ # 4) Generate the final answer with OCI GenAI
+ print("\nGenerating final RAG answer…")
+ try:
+ genai_client = oci.generative_ai_inference.GenerativeAiInferenceClient(
+ config=oci.config.from_file(os.path.expanduser(os.getenv("OCI_CONFIG_PATH","~/.oci/config")), "DEFAULT"),
+ 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.0
+ ),
+ serving_mode=oci.generative_ai_inference.models.OnDemandServingMode(
+ model_id="meta.llama-3.2-90b-vision-instruct"
+ )
+ )
+ chat_resp = genai_client.chat(chat_detail)
+ rag_answer = chat_resp.data.chat_response.choices[0].message.content[0].text
+ except Exception as e:
+ print("Something is off...", e)
+ rag_answer = "[No AI answer generated]"
+
+ print("\n🤖 RAG Answer:\n", rag_answer)
+
+
+ ```
+
+2. Click the "Run" button to execute the code.
+
+ 
+
+3. Review the result.
+
+ >*Note:* Your result may be different due to non-deterministic character of generative AI.
+
+ 
+
+## Conclusion
+Congratulations! You implemented a RAG process in Oracle Database 23ai using Python.
+
+to summarize:
+
+* Connected with oracledb
+* Retrieved a patient profile via a JSON duality view
+* Generated a clinical review recommendation using OCI GenAI
+* Chunked and embedded both recommendations and document text
+* Performed vector search and produced a RAG answer grounded in retrieved chunks (with chunk IDs printed for traceability)
+
+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 Database 23ai Documentation](https://docs.oracle.com/en/database/oracle/oracle-database/23/)
+
+## Acknowledgements
+* **Authors** - Ley Sylvester
+* **Contributors** - Kevin Lazarz, Hanna Rakhsha, Francis Regalado, Uma Kumar
\ No newline at end of file
diff --git a/dev-ai-app-dev-life_sciences/build/build_backup.md b/dev-ai-app-dev-life_sciences/build/build_backup.md
new file mode 100644
index 000000000..13779cd9f
--- /dev/null
+++ b/dev-ai-app-dev-life_sciences/build/build_backup.md
@@ -0,0 +1,148 @@
+# Code Snippets and Highlights for Building the Application
+
+## Introduction
+
+In this lab, you will learn how to **build a generative AI-powered loan recommendation system using Oracle Database and OCI Generative AI**. This application will act as a flexible template that can be adapted to a wide range of use cases. Oracle Database 23Ai will function as the vector data, where you'll store important context for the model to use when generating responses. This approach allows you to create a robust system that retrieves relevant data and combines it with the power of generative AI to deliver accurate, up-to-date answers based on your specific business needs.
+
+Estimated Time: 20 minutes
+
+### Objectives
+
+By the end of this hands-on session, you will have established a connection to an Oracle Database, fetched and explored customer data, processed relevant information, and utilized a Large Language Model (LLM) to generate personalized loan recommendations based on detailed customer profiles. This system integrates cutting-edge AI capabilities with robust database technology to deliver tailored financial solutions.
+
+Throughout this section we will be leveraging a Jupyter Notebook to explore building parts of the application. If you are unfamiliar with notebooks here are a few tips to get started:
+
+• Instructions and code will be mixed together, each having their own blocks. You can use the run button on the code to see it execute. If you accidentally hit run on any instructions it will just move to the next block so don't worry.
+• When running a code block it will switch from either a [ ] or a [1] (a number inside) to a [*]. When you see the one with a * that means its running. Wait till it switches to a number before moving on.
+• If you see any warnings, don't worry, they are probably just letting you know that things are changing, depreciating and you should look at updating to the latest standards. You don't need to do anything.
+
+
+### Prerequisites
+
+This lab assumes you have:
+* An Oracle Cloud account
+
+## Task 1: Login to Jupyter
+
+This task will have you login to the Jupyter environment and run specific notebooks for this lab.
+
+1. If you have already logged into the Jupyter environment skip to step 5, otherwise open "View Login Info" section of your workshop.
+
+2. Copy the Jupyter Notebook Password and click the Jupyter Notebook URL.
+
+3. Paste the Jupyter Notebook password you copied in the previous step into the password field.
+
+4. After a successful login, you will see the Jupyter Notebook's landing page.
+
+
+## Task 2: Launch the Application
+
+1. Select the **Launcher** tab and open the **terminal**
+
+ 
+
+2. Copy the ./run.sh command and paste it into the terminal.
+
+ ````bash
+ $
+ ./run.sh
+
+ ````
+
+The following section includes a hands-on exercise for building parts of the application using a Jupyter notebook.
+You will also be able to review important parts of the python code below.
+
+
+3. Click the URL displayed in the terminal to launch the SeerEquities Loan Management application.
+
+ 
+
+4. Enter in a username and click **Login**.
+
+ 
+
+## Task 3: How to Connect to the Database
+
+**Code Highlight: Connect to the Database**
+
+This section sets up a secure connection to an Oracle database by importing necessary libraries and loading environment variables from a .env file. The get\_db\_connection function retrieves the database username, password, and connection string, then uses the oracledb library to establish a connection.
+
+ 
+
+## Task 4 Build a GenAI application with Oracle AI Vector Search
+
+**About Oracle AI Vector Search**
+
+Oracle AI Vector Search is a feature of Oracle Database 23ai that enables efficient searching of AI-generated vectors stored in the database. It supports fast search using various indexing strategies and can handle massive amounts of vector data. This makes it possible for Large Language Models (LLMs) to query private business data using a natural language interface, helping them provide more accurate and relevant results. Additionally, AI Vector Search allows developers to easily add semantic search capabilities to both new and existing applications.
+
+**Code Highlight: Onnx Model**
+
+1. First, we load an ONNX machine learning model, which we use for generating vector embeddings in our app. It starts by checking if the model already exists in the database; if not, it creates a directory, downloads the model file from object storage, and uses dbms\_vector to load it, replacing any old version if needed.
+
+ 
+
+**Code Highlight: Prompt for the AI**
+
+2. Next, we craft a detailed prompt for our RAG—system, directing the AI to step into the shoes of a Loan Approver, relying solely on the data we feed it. It’s tasked with analyzing an applicant’s financial profile against our loan portfolio and business rules, focusing on just the provided context, ignoring any prior knowledge, which ensures our loan suggestions are relevant, without relying on external or outdated information.
+
+ 
+
+**Code Highlight: Communicating with GenAI**
+
+**About Generative artificial intelligence (AI)**
+
+Generative AI excels at creating text responses based on large language models (LLMs) where the AI is trained on a massive number of data points. The generated text is often easy to read and provides detailed responses that are broadly applicable to the questions asked of the software, often called prompts.
+
+3. Now, this is how we communicate with OCI’s Generative AI service by pulling in configuration details like the compartment ID and endpoint from environment variables and a config file. The code sets up the structure for a chat request, embedding our prompt into a user message, enabling AI loan recommendations within the app.
+
+ 
+
+**Code Highlight: Embed the Question and Vector Search**
+
+4. Finally, we dive into AI vector search. First, we generates an embedding for a user’s question using Oracle’s dbms\_vector\_chain and our DEMO\_MODEL. Then, it performs an AI vector search in the LOAN_CHUNK table, comparing stored recommendations vector embeddings to the question’s embedding with cosine distance, and pulls back the most relevant text chunk, with a limit of one row.
+
+ 
+
+## Task 5 How to incorporate Property Graph into the application
+
+**About Property Graph**
+
+In Oracle Database 23ai we can create property graphs inside the database. These property graphs allow us to map the vertices and edges to new or existing tables, external tables, materialized views or synonyms to these objects inside the database. The property graphs are stored as metadata inside the database meaning they don't store the actual data. Rather, the data is still stored in the underlying objects and we use the SQL/PQG syntax to interact with the property graphs.
+
+Property graphs make the process of working with interconnected data, like identifying influencers in a social network, predicting trends and customer behavior, discovering relationships based on pattern matching and more by providing a more natural and efficient way to model and query them.
+
+**Code Highlight: Graph Query**
+
+1. Here, we define a query for our LOANS_GRAPH property graph, which connects clients to their loan applications and potential loan options via a customer ID. It extracts critical details—like credit scores, debt-to-income ratios, and loan types—by traversing the graph’s vertices and edges.
+
+ 
+
+**Code Highlight: Creating The Property Graph**
+
+2. The graph structure enables complex queries and visualizations in the app, supporting decision-making by mapping interconnections between customer data and loan options. This SQL block creates our loans\_graph property graph , setting up vertices for clients, loan applications, and mock loan data with all their key properties. It also defines edges—like client\_to\_application and CLIENTS\_TO\_LOAN to link these entities, establishing relationships that we can query and explore.
+
+ 
+
+## Task 6 How to incorporate JSON Transform into the application
+
+**About JSON Duality View**
+
+JSON Relational Duality is a landmark capability in Oracle Database 23ai, providing game-changing flexibility and simplicity for Oracle Database developers. This feature overcomes the historical challenges developers have faced when building applications using the relational or document models.
+
+JSON Relational Duality helps to converge the benefits of both document and relational worlds. Developers now get the flexibility and data access benefits of the JSON document model, plus the storage efficiency and power of the relational model. The new feature enabling this functionality is JSON Relational Duality View
+
+**Code Highlight: JSON Transform**
+
+This section dynamically updates customer data in our clients\_dv table by building a flexible JSON\_TRANSFORM query based on a list of transformation statements. It constructs the query by joining those statements—like setting new field values—then applies them to the JSON data for a specific customer, identified by their ID, as long as a loan application exists."
+
+
+
+
+## Learn More
+
+* [Oracle Database 23ai Documentation](https://docs.oracle.com/en/database/oracle/oracle-database/23/)
+
+## Acknowledgements
+* **Authors** - Linda Foinding, Francis Regalado
+* **Contributors** - Kamryn Vinson, Otis Barr, Eddie Ambler, Kevin Lazarz
+* **Last Updated By/Date** - Linda Foinding, April 2025
diff --git a/dev-ai-app-dev-life_sciences/build/files/starter-file.sql b/dev-ai-app-dev-life_sciences/build/files/starter-file.sql
new file mode 100644
index 000000000..9d7e762e8
--- /dev/null
+++ b/dev-ai-app-dev-life_sciences/build/files/starter-file.sql
@@ -0,0 +1,101 @@
+/* NOTE: Files cannot contain empty lines (line breaks) */
+/* Specify the base URL that you copied from your files in OCI Object Storage in the define base_URL line below*/
+/* change idthydc0kinr to your real namespace. The name is case-sensitive. */
+/* change ADWCLab to your real bucket name. The name is case-sensitive. */
+/* change us-phoenix-1 to your real region name. The name is case-sensitive. */
+/* you can find these values on the OCI Console .. Storage .. Object Storage screen */
+set define on
+define base_URL='https://objectstorage.us-phoenix-1.oraclecloud.com/n/idthydc0kinr/b/ADWCLab/o'
+/* copy Channels table */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'CHANNELS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/chan_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+/* copy Countries table */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'COUNTRIES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/coun_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+/* Copy customers */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'CUSTOMERS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/cust1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SUPPLEMENTARY_DEMOGRAPHICS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/dem1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SALES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/dmsal_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'PRODUCTS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/prod1v3.dat',
+ format => json_object('delimiter' value '|', 'quote' value '^', 'ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'PROMOTIONS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/prom1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SALES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/sale1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'TIMES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/time_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'COSTS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/costs.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true')
+ );
+end;
+/
diff --git a/dev-ai-app-dev-life_sciences/build/images/23ai.png b/dev-ai-app-dev-life_sciences/build/images/23ai.png
new file mode 100644
index 000000000..c9d91565d
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/23ai.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/access.png b/dev-ai-app-dev-life_sciences/build/images/access.png
new file mode 100644
index 000000000..67d0f079c
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/access.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/adb-available.png b/dev-ai-app-dev-life_sciences/build/images/adb-available.png
new file mode 100644
index 000000000..83c42c2f8
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/adb-available.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/ai-recommendation.png b/dev-ai-app-dev-life_sciences/build/images/ai-recommendation.png
new file mode 100644
index 000000000..40f870fc3
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/ai-recommendation.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/app-home.png b/dev-ai-app-dev-life_sciences/build/images/app-home.png
new file mode 100644
index 000000000..9892728e1
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/app-home.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/ask-questions.png b/dev-ai-app-dev-life_sciences/build/images/ask-questions.png
new file mode 100644
index 000000000..06880d047
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/ask-questions.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/atp.png b/dev-ai-app-dev-life_sciences/build/images/atp.png
new file mode 100644
index 000000000..09736ee76
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/atp.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/chunks-created.png b/dev-ai-app-dev-life_sciences/build/images/chunks-created.png
new file mode 100644
index 000000000..2aa59febd
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/chunks-created.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/click-streamlit.png b/dev-ai-app-dev-life_sciences/build/images/click-streamlit.png
new file mode 100644
index 000000000..33010d468
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/click-streamlit.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/click-url.png b/dev-ai-app-dev-life_sciences/build/images/click-url.png
new file mode 100644
index 000000000..d01516965
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/click-url.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/code-highlight-1.png b/dev-ai-app-dev-life_sciences/build/images/code-highlight-1.png
new file mode 100644
index 000000000..6ba9b90b8
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/code-highlight-1.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/code-highlight-2.png b/dev-ai-app-dev-life_sciences/build/images/code-highlight-2.png
new file mode 100644
index 000000000..01a6ccbdf
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/code-highlight-2.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/code-highlight-3.png b/dev-ai-app-dev-life_sciences/build/images/code-highlight-3.png
new file mode 100644
index 000000000..7d8a46504
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/code-highlight-3.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/code-highlight-4.png b/dev-ai-app-dev-life_sciences/build/images/code-highlight-4.png
new file mode 100644
index 000000000..21af6948c
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/code-highlight-4.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/code-highlight-5.png b/dev-ai-app-dev-life_sciences/build/images/code-highlight-5.png
new file mode 100644
index 000000000..ac81e25d9
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/code-highlight-5.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/code-highlight-6.png b/dev-ai-app-dev-life_sciences/build/images/code-highlight-6.png
new file mode 100644
index 000000000..bff8b9b5e
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/code-highlight-6.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/code-highlight-7.png b/dev-ai-app-dev-life_sciences/build/images/code-highlight-7.png
new file mode 100644
index 000000000..327343eb8
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/code-highlight-7.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/code-highlight-8.png b/dev-ai-app-dev-life_sciences/build/images/code-highlight-8.png
new file mode 100644
index 000000000..0c94f1b5a
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/code-highlight-8.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/connect-to-db.png b/dev-ai-app-dev-life_sciences/build/images/connect-to-db.png
new file mode 100644
index 000000000..1dfbf76c2
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/connect-to-db.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/connectto-db.png b/dev-ai-app-dev-life_sciences/build/images/connectto-db.png
new file mode 100644
index 000000000..c87b8650b
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/connectto-db.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/create-adb.png b/dev-ai-app-dev-life_sciences/build/images/create-adb.png
new file mode 100644
index 000000000..224b16bc2
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/create-adb.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/create-adb2.png b/dev-ai-app-dev-life_sciences/build/images/create-adb2.png
new file mode 100644
index 000000000..20fe1a66e
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/create-adb2.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/create-chunks.png b/dev-ai-app-dev-life_sciences/build/images/create-chunks.png
new file mode 100644
index 000000000..973691b0c
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/create-chunks.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/create-tables.png b/dev-ai-app-dev-life_sciences/build/images/create-tables.png
new file mode 100644
index 000000000..d0961e04e
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/create-tables.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/create-user-profile.png b/dev-ai-app-dev-life_sciences/build/images/create-user-profile.png
new file mode 100644
index 000000000..fc2dca098
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/create-user-profile.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/create-vector.png b/dev-ai-app-dev-life_sciences/build/images/create-vector.png
new file mode 100644
index 000000000..c59e6d79a
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/create-vector.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/dbinit.png b/dev-ai-app-dev-life_sciences/build/images/dbinit.png
new file mode 100644
index 000000000..20b3bb2c2
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/dbinit.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/demo-db.png b/dev-ai-app-dev-life_sciences/build/images/demo-db.png
new file mode 100644
index 000000000..b7bad922b
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/demo-db.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/dev-env.png b/dev-ai-app-dev-life_sciences/build/images/dev-env.png
new file mode 100644
index 000000000..7f65f8193
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/dev-env.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/fetch-customer.png b/dev-ai-app-dev-life_sciences/build/images/fetch-customer.png
new file mode 100644
index 000000000..e26559026
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/fetch-customer.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/fetch-patient-data.png b/dev-ai-app-dev-life_sciences/build/images/fetch-patient-data.png
new file mode 100644
index 000000000..2c3881c7b
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/fetch-patient-data.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/generate-embeddings.png b/dev-ai-app-dev-life_sciences/build/images/generate-embeddings.png
new file mode 100644
index 000000000..a1eb3fbbb
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/generate-embeddings.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/generate-recommendation.png b/dev-ai-app-dev-life_sciences/build/images/generate-recommendation.png
new file mode 100644
index 000000000..01b802a62
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/generate-recommendation.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/generate-recommendations.png b/dev-ai-app-dev-life_sciences/build/images/generate-recommendations.png
new file mode 100644
index 000000000..ad90e8e8c
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/generate-recommendations.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/jupyter-login.png b/dev-ai-app-dev-life_sciences/build/images/jupyter-login.png
new file mode 100644
index 000000000..c3ba1fde6
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/jupyter-login.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/jupyter-notebook.png b/dev-ai-app-dev-life_sciences/build/images/jupyter-notebook.png
new file mode 100644
index 000000000..23e7200ce
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/jupyter-notebook.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/launcher.png b/dev-ai-app-dev-life_sciences/build/images/launcher.png
new file mode 100644
index 000000000..81e4151c5
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/launcher.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/loan-recommendation.png b/dev-ai-app-dev-life_sciences/build/images/loan-recommendation.png
new file mode 100644
index 000000000..7839029aa
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/loan-recommendation.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/logical.png b/dev-ai-app-dev-life_sciences/build/images/logical.png
new file mode 100644
index 000000000..465a4d554
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/logical.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/login.png b/dev-ai-app-dev-life_sciences/build/images/login.png
new file mode 100644
index 000000000..93ca6436b
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/login.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/open-launcher.png b/dev-ai-app-dev-life_sciences/build/images/open-launcher.png
new file mode 100644
index 000000000..9b2b6ebdb
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/open-launcher.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/open-new-notebook.png b/dev-ai-app-dev-life_sciences/build/images/open-new-notebook.png
new file mode 100644
index 000000000..3749eb039
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/open-new-notebook.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/open-notebook.png b/dev-ai-app-dev-life_sciences/build/images/open-notebook.png
new file mode 100644
index 000000000..76c241f56
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/open-notebook.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/open-terminal.png b/dev-ai-app-dev-life_sciences/build/images/open-terminal.png
new file mode 100644
index 000000000..208f97dde
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/open-terminal.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/oracle-database.png b/dev-ai-app-dev-life_sciences/build/images/oracle-database.png
new file mode 100644
index 000000000..642d0dbfc
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/oracle-database.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/password.png b/dev-ai-app-dev-life_sciences/build/images/password.png
new file mode 100644
index 000000000..e770db461
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/password.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/patient-data.png b/dev-ai-app-dev-life_sciences/build/images/patient-data.png
new file mode 100644
index 000000000..69bea4b13
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/patient-data.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/physical.png b/dev-ai-app-dev-life_sciences/build/images/physical.png
new file mode 100644
index 000000000..a9183a5a3
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/physical.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/profile-updated.png b/dev-ai-app-dev-life_sciences/build/images/profile-updated.png
new file mode 100644
index 000000000..04e976554
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/profile-updated.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/provisioning.png b/dev-ai-app-dev-life_sciences/build/images/provisioning.png
new file mode 100644
index 000000000..a04507757
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/provisioning.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/rag.png b/dev-ai-app-dev-life_sciences/build/images/rag.png
new file mode 100644
index 000000000..8b2081f7e
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/rag.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/run-script.png b/dev-ai-app-dev-life_sciences/build/images/run-script.png
new file mode 100644
index 000000000..1892833f1
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/run-script.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/shell-script.png b/dev-ai-app-dev-life_sciences/build/images/shell-script.png
new file mode 100644
index 000000000..a1069bc45
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/shell-script.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/start-demo.png b/dev-ai-app-dev-life_sciences/build/images/start-demo.png
new file mode 100644
index 000000000..904ada64a
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/start-demo.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/terminal.png b/dev-ai-app-dev-life_sciences/build/images/terminal.png
new file mode 100644
index 000000000..8636461a9
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/terminal.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/upload-document.png b/dev-ai-app-dev-life_sciences/build/images/upload-document.png
new file mode 100644
index 000000000..c2bd4a8d7
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/upload-document.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/user-profile-created.png b/dev-ai-app-dev-life_sciences/build/images/user-profile-created.png
new file mode 100644
index 000000000..585728a25
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/user-profile-created.png differ
diff --git a/dev-ai-app-dev-life_sciences/build/images/workshop_notebook.png b/dev-ai-app-dev-life_sciences/build/images/workshop_notebook.png
new file mode 100644
index 000000000..f3706f232
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/build/images/workshop_notebook.png differ
diff --git a/dev-ai-app-dev-life_sciences/cloud-login/cloud-login.md b/dev-ai-app-dev-life_sciences/cloud-login/cloud-login.md
new file mode 100644
index 000000000..2601085f5
--- /dev/null
+++ b/dev-ai-app-dev-life_sciences/cloud-login/cloud-login.md
@@ -0,0 +1,51 @@
+# Get started
+
+## Introduction
+
+In this lab, we will show you where you can find the login information and how to log in to the **SeerHoldings Healthcare Management application**.
+
+Estimated Time: 5 minutes
+
+### Objectives
+
+- Log-in to the application
+- Locate your LiveLabs Sandbox reservations
+
+## Task 1: View Login Information
+
+Right above the workshop instructions you can find two information:
+
+a. **View Login Info:** You can find credentials and other information to access the LiveLabs Sandbox
+
+b. **Time Remaining:** This shows you the remaining time before your access to the LiveLabs Sandbox expires. Please note: You may be able to extend the reservation time.
+
+
+
+## Task 2: Login to the Demo
+
+1. To access the demo environment, click **View Login Info** in the top left corner of the page. Click the **Start the Demo** link.
+
+ 
+
+2. Enter in a username, select the **Claims Officer** role, and click **Login**.
+
+ 
+
+3. Welcome to the SeerHoldings Healthcare Management application! Congratulations, you are now connected to the demo environment. You can now execute the different tasks and steps for the LiveLabs workshop.
+
+ 
+
+
+## Task 3: Find your LiveLabs Sandbox reservations
+
+If you close your browser, and you want to launch your workshop again, open [livelabs.oracle.com](https://livelabs.oracle.com), login using your Oracle account, and click on **My Reservations**. You can find here a complete history of all LiveLabs workshops you signed up for. Click on **Launch Workshop** to start a workshop with an existing LiveLabs Sandbox environment.
+
+
+
+You may now **proceed to the next lab**.
+
+## Acknowledgements
+
+- **Created By/Date** - Kamryn Vinson
+- **Contributor** - Linda Foinding
+- **Last Updated By/Date** - Linda Foinding, April 2025
\ No newline at end of file
diff --git a/dev-ai-app-dev-life_sciences/cloud-login/images/app-home.png b/dev-ai-app-dev-life_sciences/cloud-login/images/app-home.png
new file mode 100644
index 000000000..6cf6ab118
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/cloud-login/images/app-home.png differ
diff --git a/dev-ai-app-dev-life_sciences/cloud-login/images/click-url.png b/dev-ai-app-dev-life_sciences/cloud-login/images/click-url.png
new file mode 100644
index 000000000..d01516965
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/cloud-login/images/click-url.png differ
diff --git a/dev-ai-app-dev-life_sciences/cloud-login/images/demo-env.png b/dev-ai-app-dev-life_sciences/cloud-login/images/demo-env.png
new file mode 100644
index 000000000..3d5401336
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/cloud-login/images/demo-env.png differ
diff --git a/dev-ai-app-dev-life_sciences/cloud-login/images/dev-env.png b/dev-ai-app-dev-life_sciences/cloud-login/images/dev-env.png
new file mode 100644
index 000000000..7f65f8193
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/cloud-login/images/dev-env.png differ
diff --git a/dev-ai-app-dev-life_sciences/cloud-login/images/ll-reservations.png b/dev-ai-app-dev-life_sciences/cloud-login/images/ll-reservations.png
new file mode 100644
index 000000000..2e7150140
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/cloud-login/images/ll-reservations.png differ
diff --git a/dev-ai-app-dev-life_sciences/cloud-login/images/login.png b/dev-ai-app-dev-life_sciences/cloud-login/images/login.png
new file mode 100644
index 000000000..0acc1ff72
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/cloud-login/images/login.png differ
diff --git a/dev-ai-app-dev-life_sciences/cloud-login/images/start-demo.png b/dev-ai-app-dev-life_sciences/cloud-login/images/start-demo.png
new file mode 100644
index 000000000..2be9a0f28
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/cloud-login/images/start-demo.png differ
diff --git a/dev-ai-app-dev-life_sciences/cloud-login/images/view-login-info.png b/dev-ai-app-dev-life_sciences/cloud-login/images/view-login-info.png
new file mode 100644
index 000000000..2bcf29e82
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/cloud-login/images/view-login-info.png differ
diff --git a/dev-ai-app-dev-life_sciences/connect-to-env/connect-to-env.md b/dev-ai-app-dev-life_sciences/connect-to-env/connect-to-env.md
new file mode 100644
index 000000000..54b040ab1
--- /dev/null
+++ b/dev-ai-app-dev-life_sciences/connect-to-env/connect-to-env.md
@@ -0,0 +1,58 @@
+# Connect to the Development Environment
+
+## Introduction
+
+In this lab, you'll learn how to access the web-based Jupyter Lab development environment, where you can write and run Python code directly in your browser. You'll log in, create notebooks, and get ready to start coding in a hands-on environment.
+
+Estimated Time: 5 minutes
+
+### Objective
+
+* Login to JupyterLab
+
+## 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.
+
+ 
+
+2. Paste in the Development IDE Login Password that you copied in the previous step. Click **Login**.
+
+ 
+
+3. Click the blue "+". This will open the Launcher.
+
+ 
+
+## 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. Navigation is fast and intuitive, with breadcrumbs and context menus that surface relevant actions. Users can right-click files to access options like duplicate, shutdown kernel, or open with a specific editor.
+
+ **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, enabling command-line operations within the JupyterLab environment. These two tools form the core of most workflows, supporting both interactive analysis and system-level tasks from a single interface.
+
+ 
+
+## Task 3: Get familiar with Jupyter Notebooks
+
+You will use a Jupyter Notebook in JupyterLab to build and test the loan recommendation system. If you are new to notebooks, the following tips will help you get started and work smoothly.
+
+1. **Executing Code Blocks**: You can run code in two simple ways: press **Shift+Enter** to execute and move to the next cell, or click the **Play/Execute** button in the menu bar at the top of this tab. Both methods work interchangeably.
+
+2. **Block Types**: Instructions and code are separated into **their own blocks**. Instructions are in markdown (like this cell), while code is in executable Python blocks. If you accidentally run an instruction block, it’ll just skip to the next cell—no harm done!
+
+3. **Running Indicators**: When you run a code block, its label changes from `[ ]` (empty) or `[1]` (a number) to `[*]`. The asterisk (`*`) means it’s processing. Wait until it switches back to a number (e.g., `[2]`) before moving on, ensuring the operation is complete.
+
+4. **Output & Warnings**: Below each code cell, output appears after execution. This can include results, visualizations, or messages. Warnings may show up—these are usually informational, such as notices about deprecated features. Unless an error halts execution, users can continue without making changes. If you see a error, review the code for any issues and make changes accordingly and try executing the cell again.
+
+ 
+
+## Conclusion
+
+In this lab you logged into the **IDE Development Environment** for Jupyter Labs. You reviewed different elements from the environment like **File Browser** and **Launcher**. Lastly, you were introduced to concepts to allow you to get started running code smoothly like **executing code blocks** and **outputs and warnings**.
+
+## Acknowledgements
+* **Author** - Kamryn Vinson
+* **Contributors** - Linda Foinding, Francis Regalado, Kevin Lazarz
+* **Last Updated By/Date** - Uma Kumar, August 2025
diff --git a/dev-ai-app-dev-life_sciences/connect-to-env/files/starter-file.sql b/dev-ai-app-dev-life_sciences/connect-to-env/files/starter-file.sql
new file mode 100644
index 000000000..9d7e762e8
--- /dev/null
+++ b/dev-ai-app-dev-life_sciences/connect-to-env/files/starter-file.sql
@@ -0,0 +1,101 @@
+/* NOTE: Files cannot contain empty lines (line breaks) */
+/* Specify the base URL that you copied from your files in OCI Object Storage in the define base_URL line below*/
+/* change idthydc0kinr to your real namespace. The name is case-sensitive. */
+/* change ADWCLab to your real bucket name. The name is case-sensitive. */
+/* change us-phoenix-1 to your real region name. The name is case-sensitive. */
+/* you can find these values on the OCI Console .. Storage .. Object Storage screen */
+set define on
+define base_URL='https://objectstorage.us-phoenix-1.oraclecloud.com/n/idthydc0kinr/b/ADWCLab/o'
+/* copy Channels table */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'CHANNELS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/chan_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+/* copy Countries table */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'COUNTRIES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/coun_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+/* Copy customers */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'CUSTOMERS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/cust1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SUPPLEMENTARY_DEMOGRAPHICS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/dem1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SALES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/dmsal_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'PRODUCTS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/prod1v3.dat',
+ format => json_object('delimiter' value '|', 'quote' value '^', 'ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'PROMOTIONS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/prom1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SALES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/sale1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'TIMES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/time_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'COSTS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/costs.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true')
+ );
+end;
+/
diff --git a/dev-ai-app-dev-life_sciences/connect-to-env/images/block.png b/dev-ai-app-dev-life_sciences/connect-to-env/images/block.png
new file mode 100644
index 000000000..4f7f68297
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/connect-to-env/images/block.png differ
diff --git a/dev-ai-app-dev-life_sciences/connect-to-env/images/dev-env.png b/dev-ai-app-dev-life_sciences/connect-to-env/images/dev-env.png
new file mode 100644
index 000000000..1e0837ad7
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/connect-to-env/images/dev-env.png differ
diff --git a/dev-ai-app-dev-life_sciences/connect-to-env/images/jupyter-login.png b/dev-ai-app-dev-life_sciences/connect-to-env/images/jupyter-login.png
new file mode 100644
index 000000000..c3ba1fde6
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/connect-to-env/images/jupyter-login.png differ
diff --git a/dev-ai-app-dev-life_sciences/connect-to-env/images/jupyter.png b/dev-ai-app-dev-life_sciences/connect-to-env/images/jupyter.png
new file mode 100644
index 000000000..29b0703dc
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/connect-to-env/images/jupyter.png differ
diff --git a/dev-ai-app-dev-life_sciences/connect-to-env/images/launcher.png b/dev-ai-app-dev-life_sciences/connect-to-env/images/launcher.png
new file mode 100644
index 000000000..81e4151c5
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/connect-to-env/images/launcher.png differ
diff --git a/dev-ai-app-dev-life_sciences/introduction/images/vectors-diagram.png b/dev-ai-app-dev-life_sciences/introduction/images/vectors-diagram.png
new file mode 100644
index 000000000..0156e2d8f
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/introduction/images/vectors-diagram.png differ
diff --git a/dev-ai-app-dev-life_sciences/introduction/introduction.md b/dev-ai-app-dev-life_sciences/introduction/introduction.md
new file mode 100644
index 000000000..7fe5f2be0
--- /dev/null
+++ b/dev-ai-app-dev-life_sciences/introduction/introduction.md
@@ -0,0 +1,77 @@
+# Introduction
+
+## About this Workshop
+
+**Data is more than an asset—it’s the engine behind every smart decision, risk calculation and growth strategy. From real-time decision-making to risk management and innovation, success hinges on how well you harness it.**
+
+SeerGroup is a global conglomerate with multiple divisions. Each division buried in transactions, documents, and customer data. Their challenge is always the same: **decisions take too long** because data is scattered across silos and systems.
+
+This workshop shows how SeerGroup tackles that problem with Oracle Database 23ai + OCI Generative AI. By **keeping data in one place**, they cut out fragile integrations and give analysts, engineers, and managers a **single platform** for smarter approvals, faster investigations, and clearer customer answers.
+
+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.
+
+
+✅ **Start with the demo! (Lab 1)**
+
+Step into SeerGroup’s Life Sciences division as a Clinical Reviewer. You’ll use an AI-powered trial oversight app built on Oracle Database 23ai to:
+
+Review clinical trial requests — such as safety reviews, lab results, and physician notes — using AI Vector Search, Graph Analytics, and RAG
+
+See how Generative AI evaluates protocols, prior cases, and patient data — turning lengthy board reviews into instant recommendations
+
+Approve, deny, or pend requests with AI-generated risk scores, clear explanations, and auto-generated decision letters
+
+Update citizen profiles and service records using JSON Duality Views, keeping data consistent across departments
+
+This story shows how Seer Life Sciences uses Oracle Database 23ai and OCI Generative AI to accelerate trial oversight, strengthen patient safety monitoring, and reduce review bottlenecks — all while keeping sensitive data inside a unified, trusted database platform.
+
+
+✅ **What’s next (Labs 2–5)**
+
+After the demo, you’ll switch roles to developer. In the next labs you’ll connect to Oracle Database 23ai, 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 industries can move from siloed processes to intelligent, AI-driven applications—all on one platform.
+
+* **Lab 2 – Connect to your environment**
+Log in to the JupyterLab IDE where you’ll write Python and run your code.
+
+* **Lab 3 – Build the data foundation**
+Use Python with Oracle Database 23ai to create tables, shape them into JSON Duality Views, and interact with them using both SQL and MongoDB-style syntax—laying the groundwork for AI workflows across SeerGroup.
+
+* **Lab 4 – Implement RAG**
+Construct a working AI application. Pull customer and grid data, generate recommendations with OCI Generative AI, chunk and vectorize the results, and answer follow-up questions using Vector Search + RAG.
+
+* **Lab 5 – Extend with MCP tools**
+Wire Oracle Database 23ai and OCI Generative AI into reusable MCP tools. Call them from notebooks, chain them together into workflows, and even register your own tool for SeerGroup’s finance, retail, healthcare, or energy teams.
+
+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 Database 23ai
+
+* 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 a LiveLabs Sandbox reservation.
+
+* Basic knowledge of Python.
+
+* Basic knowledge of Oracle Database, i.e., how to run queries.
+
+## Learn More
+
+* [Oracle Database 23ai Documentation](https://docs.oracle.com/en/database/oracle/oracle-database/23/)
+
+## Acknowledgements
+* **Authors** - Ley Sylvester
+* **Contributors** - Kevin Lazarz, Linda Foinding, Francis Regalado
\ No newline at end of file
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/adb-ocid.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/adb-ocid.png
new file mode 100644
index 000000000..63130cb3a
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/adb-ocid.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/adb-provisioned.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/adb-provisioned.png
new file mode 100644
index 000000000..4eff376aa
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/adb-provisioned.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/adb-provisioning.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/adb-provisioning.png
new file mode 100644
index 000000000..d8a36adb9
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/adb-provisioning.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/adb-workload-type.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/adb-workload-type.png
new file mode 100644
index 000000000..7257da637
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/adb-workload-type.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/add-key.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/add-key.png
new file mode 100644
index 000000000..d5941c3fb
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/add-key.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/begin-oci-menu.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/begin-oci-menu.png
new file mode 100644
index 000000000..36b2feaf1
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/begin-oci-menu.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/chicago-region.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/chicago-region.png
new file mode 100644
index 000000000..853d9d958
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/chicago-region.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/click-add-api-key.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/click-add-api-key.png
new file mode 100644
index 000000000..7b1cbd842
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/click-add-api-key.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/click-generative-ai.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/click-generative-ai.png
new file mode 100644
index 000000000..8ae6b4de4
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/click-generative-ai.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/compartment-name.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/compartment-name.png
new file mode 100644
index 000000000..b69068773
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/compartment-name.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/compartment.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/compartment.png
new file mode 100644
index 000000000..6704dfbd1
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/compartment.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/compartments.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/compartments.png
new file mode 100644
index 000000000..42f4cbb40
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/compartments.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/configure-db.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/configure-db.png
new file mode 100644
index 000000000..827a8b3d6
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/configure-db.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/connection-string.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/connection-string.png
new file mode 100644
index 000000000..e79c085d1
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/connection-string.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/contact-email-field.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/contact-email-field.png
new file mode 100644
index 000000000..4bfdcaba0
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/contact-email-field.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/copy-ocid.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/copy-ocid.png
new file mode 100644
index 000000000..df42d94f5
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/copy-ocid.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/create-adb-button.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/create-adb-button.png
new file mode 100644
index 000000000..5237ae7b9
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/create-adb-button.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/create-adb.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/create-adb.png
new file mode 100644
index 000000000..70fdd2a97
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/create-adb.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/create-admin.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/create-admin.png
new file mode 100644
index 000000000..77952a527
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/create-admin.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/create-policy.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/create-policy.png
new file mode 100644
index 000000000..9a1f03bcb
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/create-policy.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/db-connection.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/db-connection.png
new file mode 100644
index 000000000..8063844f2
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/db-connection.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/deployment-type-serverless.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/deployment-type-serverless.png
new file mode 100644
index 000000000..553b8fdbf
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/deployment-type-serverless.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/env-credentials.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/env-credentials.png
new file mode 100644
index 000000000..d5b75f66b
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/env-credentials.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/folder.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/folder.png
new file mode 100644
index 000000000..e59dfdc11
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/folder.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/key-preview.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/key-preview.png
new file mode 100644
index 000000000..f21e0af6d
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/key-preview.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/license.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/license.png
new file mode 100644
index 000000000..b3a6acf9a
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/license.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/network-access.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/network-access.png
new file mode 100644
index 000000000..19a9fd6a0
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/network-access.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/policies.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/policies.png
new file mode 100644
index 000000000..f86a6ad58
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/policies.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/policy-info.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/policy-info.png
new file mode 100644
index 000000000..d32f14a40
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/policy-info.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/policy.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/policy.png
new file mode 100644
index 000000000..177659095
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/policy.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/private-key.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/private-key.png
new file mode 100644
index 000000000..f3a7f4557
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/private-key.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/python-version-installed.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/python-version-installed.png
new file mode 100644
index 000000000..ad73c3267
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/python-version-installed.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/python-version.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/python-version.png
new file mode 100644
index 000000000..2dadcbaed
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/python-version.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/requirements.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/requirements.png
new file mode 100644
index 000000000..5300ee500
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/requirements.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/select-atp.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/select-atp.png
new file mode 100644
index 000000000..ba3960f93
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/select-atp.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/select-compartment.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/select-compartment.png
new file mode 100644
index 000000000..202c7df5d
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/select-compartment.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/select-your-adb.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/select-your-adb.png
new file mode 100644
index 000000000..5efaa65d1
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/select-your-adb.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/show-editor.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/show-editor.png
new file mode 100644
index 000000000..f086a15fb
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/show-editor.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/tokens-keys.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/tokens-keys.png
new file mode 100644
index 000000000..0e240715a
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/tokens-keys.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/images/virtual-environment.png b/dev-ai-app-dev-life_sciences/local-tenancy/images/virtual-environment.png
new file mode 100644
index 000000000..ce13f4032
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/local-tenancy/images/virtual-environment.png differ
diff --git a/dev-ai-app-dev-life_sciences/local-tenancy/local-tenancy.md b/dev-ai-app-dev-life_sciences/local-tenancy/local-tenancy.md
new file mode 100644
index 000000000..b007c9347
--- /dev/null
+++ b/dev-ai-app-dev-life_sciences/local-tenancy/local-tenancy.md
@@ -0,0 +1,433 @@
+# How-to Run Application Locally
+
+## Introduction
+
+In this section, you will learn how to run the Seer Equities Loan Approval application locally. This guide is designed to walk you through the complete setup process—from provisioning required services to installing dependencies and launching the application on your local machine.
+
+The document is structured to help you meet all prerequisites, configure both the Autonomous 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 locally for development and testing, this step-by-step guide will ensure a smooth setup experience.
+
+Estimated Time: 20 minutes
+
+### Objectives
+
+By the end of this section, you will be able to:
+
+- Provision and connect to an Autonomous 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 local development and testing purposes. For production deployment, additional configuration and security hardening will be required.
+
+Let’s get started!
+
+
+## Task 1: Provision an Autonomous Database
+
+Before you can run the application, you need to provision an **Autonomous Database** and obtain the following connection details:
+
+* **Username**
+
+* **Password**
+
+* **Database Connection String (DB Connection)**
+
+1. Click the navigation menu in the upper left to show top level navigation choices.
+
+ 
+
+3. Click **Oracle Database** -> **Autonomous Database**.
+
+ 
+
+4. Click **Create Autonomous Database** to start the instance creation process.
+
+ 
+
+5. This brings up the **Create Autonomous Database** screen where you will specify the configuration of the instance. Provide basic information for the autonomous database:
+
+ **Display Name** - Enter a memorable name for the database for display purposes. For this lab, we used **SeerEquites**.
+ **Database Name** - Use letters and numbers only, starting with a letter. Maximum length is 14 characters. (Underscores not initially supported.) For this lab, we used **SeerEquites**.
+ **Compartment** - Select a compartment for the database from the drop-down list. In the example below, **LiveLabs-Demo** was created ahead of time and chosen.
+
+ 
+
+6. Choose a workload type. Select the workload type for your database. For this lab, we chose **Transaction Processing** as the workload type.
+
+ 
+
+7. Configure the database:
+
+ **Choose database version** - Select a database version from the available versions.
+ **Compute auto scaling** - Enable this option.
+
+ 
+8. Create administrator credentials. **We will need the DB Username and Password for our .env file later. Take note of these credentials.**
+
+ **Password** and **Confirm Password** - Specify the password for ADMIN user of the service instance. The password must meet the following requirements:
+ 1) The password must be between 12 and 30 characters long and must include at least one uppercase letter, one lowercase letter, and one numeric character.
+ 2) The password cannot contain the username.
+ 3) The password cannot contain the double quote (") character.
+ 4) The password must be different from the last 4 passwords used.
+ 5) The password must not be the same password that is set less than 24 hours ago.
+ 6) Re-enter the password to confirm it. Make a note of this password.
+
+ 
+
+9. Choose network access:
+
+ For this lab, accept the default, **Secure access from everywhere**.
+ If you want to allow traffic only from the IP addresses and VCNs you specify where access to the database from all public IPs or VCNs is blocked, select **Secure access from allowed IPs and VCNs only**.
+ If you want to restrict access to a private endpoint within an OCI VCN, select **Private endpoint access only**.
+ If the **Require mutual TLS (mTLS) authentication** option is selected, mTLS will be required to authenticate connections to your Autonomous Database. TLS connections allows Oracle Data Provider for .NET to connect to your Autonomous Database without a wallet. See the [documentation for network options](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/support-tls-mtls-authentication.html#GUID-3F3F1FA4-DD7D-4211-A1D3-A74ED35C0AF5) for options to allow TLS, or to require only mutual TLS (mTLS) authentication.
+
+ 
+
+10. Click **Create**.
+
+ 
+
+11. Your instance will begin provisioning. In a few minutes the state will turn from Provisioning to Available. At this point, your Autonomous Transaction Processing database is ready to use! Have a look at your instance's details here including its name, database version, CPU count and storage size.
+
+ 
+ Provisioning an Autonomous Database instance.
+
+ 
+ Autonomous Database instance successfully provisioned.
+
+## Task 2: Unzip the Code
+
+1. Unzip the application code to a directory of your choice on your local machine:
+
+
+ [**Application Code**] (https://objectstorage.us-ashburn-1.oraclecloud.com/p/fiiLFGXKlmgrZKSwKQkD2Wc7mf5b8OsPUmIsw4rNUPcbBO31Za8T1NNoGAf0l4_S/n/c4u04/b/livelabsfiles/o/developer-library/pages.zip)
+
+
+2. Navigate to the folder where the code is located.
+
+ cd /path/to/your/unzipped/code
+ 
+
+
+## Task 3: Install Python 3.9 or Higher
+
+To run the application, Python version 3.9 or higher is required. Follow the steps below to ensure Python is installed on your machine.
+
+1. Run the following command to check which version of Python is installed.
+
+ ````
+
+ python3 --version
+
+ ````
+ 
+
+2. If Python 3.9+ is not installed, download and install Python 3.9 or higher from the [**official website**](https://www.python.org/downloads/).
+
+ 
+
+## Task 4: Setting Up the Local Environment
+
+1. Create a Virtual Environment. It is recommended to create a virtual environment to isolate the dependencies. In your terminal, run the following command to create a virtual environment:
+
+
+ ````
+
+ python3 -m venv venv
+
+ ````
+
+ This will create a directory called venv that contains your virtual environment.
+
+
+2. Enable the Virtual Environment. Once the virtual environment is created, activate it using the following commands based on your operating system:
+
+ On macOS/Linux:
+
+ ````
+
+ source venv/bin/activate
+
+ ````
+
+ On Windows:
+
+ ````
+
+ .\\venv\\Scripts\\activate
+
+ ````
+
+ After activation, your terminal should show (venv) at the beginning of the line, indicating that the virtual environment is active.
+ 
+
+3. Install Streamlit and Dependencies. The application has a set of required dependencies that need to be installed. You can install them using the requirements.txt file.
+
+ Run the following commands to install all dependencies:
+
+ ````
+
+ pip install oci
+
+ ````
+
+ ````
+
+ pip install streamlit
+
+ ````
+
+ ````
+
+ pip freeze > requirements.txt
+
+ pip install -r requirements.txt
+
+ touch .env
+
+ vi .env
+ **Compartments**.
+
+ 
+
+10. Select your compartment.
+
+ 
+
+11. Copy your compartment OCID. Place the compartment OCID into your .env file.
+
+ 
+
+12. Paste this in as your endpoint url in the .env file:
+
+ ````
+
+ https://inference.generativeai.us-chicago-1.oci.oraclecloud.com
+ **Autonomous Database**.
+
+ 
+
+14. Select your Autonomous Database.
+
+ 
+
+15. Copy your Autonomous Database OCID. Paste it into your .env file.
+
+ 
+
+ You should now have all of the credentials for your .env file filled in.
+
+ 
+
+## Task 5: Setting Up OCI Generative AI Service
+
+1. Click **User Settings** -> **Tokens and Keys**.
+
+ 
+
+2. Click **Add API Key**.
+
+ 
+
+3. Choose **Generate API Key Pair**. Click **Download private key**.
+
+ 
+
+4. After downloading the private key. Click **Add**.
+
+ 
+
+5. Note the Fingerprint, Tenancy OCID, and User OCID from the page.
+
+ 
+
+6. Navigate back to your terminal and paste the following command in to create a config directory.
+
+ ````
+
+ mkdir -p ~/.oci
+
+ touch config
+
+ vi config
+ 💡Note: Replace all placeholders with your actual OCI credentials and key file path except region, which must be us-chicago.
+
+ ````
+
+ [DEFAULT]
+ user=[ocid1.user.oc1..exampleuniqueID]
+ fingerprint=[xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx]
+ key_file= [key_file=~/.oci/oci_api_key.pem]
+ tenancy=[ocid1.tenancy.oc1..exampleuniqueID]
+ region= us-chicago-1
+
+ allow any-user to manage generative-ai-family in compartment [compartment_name]
+ Replace [compartment\_name] with the name of your compartment.
+
+ 
+
+14. Click **Create**.
+
+ 
+
+OCI Generative AI is a fully managed service available via API to seamlessly integrate language models into a wide range of use cases, including writing assistance, summarization, analysis, and chat. You can quickly integrate OCI Generative AI with Autonomous Database to apply AI models to your data.
+
+15. Make sure you are in the US Midwest(Chicago) region:
+
+ 
+
+16. From the Console, open the Navigation menu and click **Analytics & AI**. Click **Generative AI**.
+
+ 
+
+## Task 6: Run the Application
+
+1. Now that everything is set up, you can start the application by running the following command:
+
+ ````
+
+ streamlit run 1-introduction.py
+
+ pip install oci
+ .
+
+* **Database Connection Errors**: Ensure that the database credentials in the .env file are correct and that you have access to the Autonomous 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 configurations 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**.
+
+## Acknowledgements
+
+- **Created By/Date** - Linda Foinding, Kevin Lazarz
+- **Contributor** - Kamryn Vinson
+- **Last Updated By/Date** - Kamryn Vinson, May 2025
\ No newline at end of file
diff --git a/dev-ai-app-dev-life_sciences/user-story/files/starter-file.sql b/dev-ai-app-dev-life_sciences/user-story/files/starter-file.sql
new file mode 100644
index 000000000..9d7e762e8
--- /dev/null
+++ b/dev-ai-app-dev-life_sciences/user-story/files/starter-file.sql
@@ -0,0 +1,101 @@
+/* NOTE: Files cannot contain empty lines (line breaks) */
+/* Specify the base URL that you copied from your files in OCI Object Storage in the define base_URL line below*/
+/* change idthydc0kinr to your real namespace. The name is case-sensitive. */
+/* change ADWCLab to your real bucket name. The name is case-sensitive. */
+/* change us-phoenix-1 to your real region name. The name is case-sensitive. */
+/* you can find these values on the OCI Console .. Storage .. Object Storage screen */
+set define on
+define base_URL='https://objectstorage.us-phoenix-1.oraclecloud.com/n/idthydc0kinr/b/ADWCLab/o'
+/* copy Channels table */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'CHANNELS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/chan_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+/* copy Countries table */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'COUNTRIES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/coun_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+/* Copy customers */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'CUSTOMERS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/cust1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SUPPLEMENTARY_DEMOGRAPHICS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/dem1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SALES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/dmsal_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'PRODUCTS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/prod1v3.dat',
+ format => json_object('delimiter' value '|', 'quote' value '^', 'ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'PROMOTIONS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/prom1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SALES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/sale1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'TIMES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/time_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'COSTS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/costs.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true')
+ );
+end;
+/
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/Liam-approved-list.png b/dev-ai-app-dev-life_sciences/user-story/images/Liam-approved-list.png
new file mode 100644
index 000000000..ddc2aa35c
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/Liam-approved-list.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/Liam-download-pdf.png b/dev-ai-app-dev-life_sciences/user-story/images/Liam-download-pdf.png
new file mode 100644
index 000000000..053ca6a5c
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/Liam-download-pdf.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/Olivia-download.png b/dev-ai-app-dev-life_sciences/user-story/images/Olivia-download.png
new file mode 100644
index 000000000..01edf7a43
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/Olivia-download.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/Olivia-progress-list.png b/dev-ai-app-dev-life_sciences/user-story/images/Olivia-progress-list.png
new file mode 100644
index 000000000..cbf17a6a9
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/Olivia-progress-list.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/Oliviawill-confirm.png b/dev-ai-app-dev-life_sciences/user-story/images/Oliviawill-confirm.png
new file mode 100644
index 000000000..e539fb013
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/Oliviawill-confirm.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/Oliviawill-decision.png b/dev-ai-app-dev-life_sciences/user-story/images/Oliviawill-decision.png
new file mode 100644
index 000000000..ee0fb44b8
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/Oliviawill-decision.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/Oliviawill-graph.png b/dev-ai-app-dev-life_sciences/user-story/images/Oliviawill-graph.png
new file mode 100644
index 000000000..ddd524f93
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/Oliviawill-graph.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/Oliviawill-pdf.png b/dev-ai-app-dev-life_sciences/user-story/images/Oliviawill-pdf.png
new file mode 100644
index 000000000..8ce1a4064
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/Oliviawill-pdf.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/Oliviawill-save.png b/dev-ai-app-dev-life_sciences/user-story/images/Oliviawill-save.png
new file mode 100644
index 000000000..9ae6b50aa
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/Oliviawill-save.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/Oliviawill.png b/dev-ai-app-dev-life_sciences/user-story/images/Oliviawill.png
new file mode 100644
index 000000000..6b5b0ec42
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/Oliviawill.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/Oliviawills-ai.png b/dev-ai-app-dev-life_sciences/user-story/images/Oliviawills-ai.png
new file mode 100644
index 000000000..037f3125b
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/Oliviawills-ai.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/app-home.png b/dev-ai-app-dev-life_sciences/user-story/images/app-home.png
new file mode 100644
index 000000000..932edfb1a
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/app-home.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/avataylor.png b/dev-ai-app-dev-life_sciences/user-story/images/avataylor.png
new file mode 100644
index 000000000..2538027ca
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/avataylor.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/code-highlight-1.png b/dev-ai-app-dev-life_sciences/user-story/images/code-highlight-1.png
new file mode 100644
index 000000000..decd21130
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/code-highlight-1.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/liam-download.png b/dev-ai-app-dev-life_sciences/user-story/images/liam-download.png
new file mode 100644
index 000000000..c3400d5a5
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/liam-download.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/liam-recommendation.png b/dev-ai-app-dev-life_sciences/user-story/images/liam-recommendation.png
new file mode 100644
index 000000000..ce38f33b3
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/liam-recommendation.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/liam-return-dashboard.png b/dev-ai-app-dev-life_sciences/user-story/images/liam-return-dashboard.png
new file mode 100644
index 000000000..f6a3f410e
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/liam-return-dashboard.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/liam-save-status.png b/dev-ai-app-dev-life_sciences/user-story/images/liam-save-status.png
new file mode 100644
index 000000000..65cf2b658
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/liam-save-status.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/liam-select-option.png b/dev-ai-app-dev-life_sciences/user-story/images/liam-select-option.png
new file mode 100644
index 000000000..4cba697a3
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/liam-select-option.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/liamchen-Decision.png b/dev-ai-app-dev-life_sciences/user-story/images/liamchen-Decision.png
new file mode 100644
index 000000000..645239a68
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/liamchen-Decision.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/liamchen-chatbot.png b/dev-ai-app-dev-life_sciences/user-story/images/liamchen-chatbot.png
new file mode 100644
index 000000000..22199062b
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/liamchen-chatbot.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/liamchen.png b/dev-ai-app-dev-life_sciences/user-story/images/liamchen.png
new file mode 100644
index 000000000..df6ae1816
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/liamchen.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/liamchenAI.png b/dev-ai-app-dev-life_sciences/user-story/images/liamchenAI.png
new file mode 100644
index 000000000..983ecea36
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/liamchenAI.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/login.png b/dev-ai-app-dev-life_sciences/user-story/images/login.png
new file mode 100644
index 000000000..05566d502
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/login.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/open-Liam-pdf.png b/dev-ai-app-dev-life_sciences/user-story/images/open-Liam-pdf.png
new file mode 100644
index 000000000..905153931
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/open-Liam-pdf.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/open-Olivia-pdf.png b/dev-ai-app-dev-life_sciences/user-story/images/open-Olivia-pdf.png
new file mode 100644
index 000000000..9915f0ebd
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/open-Olivia-pdf.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/profile-updated.png b/dev-ai-app-dev-life_sciences/user-story/images/profile-updated.png
new file mode 100644
index 000000000..a5693d4af
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/profile-updated.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/sample1.png b/dev-ai-app-dev-life_sciences/user-story/images/sample1.png
new file mode 100644
index 000000000..2d9ad4738
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/sample1.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/sample2.png b/dev-ai-app-dev-life_sciences/user-story/images/sample2.png
new file mode 100644
index 000000000..145c9d39c
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/sample2.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/start-demo.png b/dev-ai-app-dev-life_sciences/user-story/images/start-demo.png
new file mode 100644
index 000000000..708660e79
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/start-demo.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/images/upload-document.png b/dev-ai-app-dev-life_sciences/user-story/images/upload-document.png
new file mode 100644
index 000000000..28e092deb
Binary files /dev/null and b/dev-ai-app-dev-life_sciences/user-story/images/upload-document.png differ
diff --git a/dev-ai-app-dev-life_sciences/user-story/user-story.md b/dev-ai-app-dev-life_sciences/user-story/user-story.md
new file mode 100644
index 000000000..5ff738d89
--- /dev/null
+++ b/dev-ai-app-dev-life_sciences/user-story/user-story.md
@@ -0,0 +1,233 @@
+# Run the Demo
+
+## Introduction
+
+Act as a Clinical Reviewer using an AI-powered trial safety platform running on Oracle Database 23ai. Discover how Generative AI, Vector Search, Graph Analytics, and JSON Duality Views instantly analyze clinical requests, lab results, physician notes, and supporting documents—replacing weeks of manual review with automated, data-in-place insights.
+
+**Disclaimer**: Please note that your results may vary. The information provided is generated by OCI Generative AI services, and your outcomes may differ from those presented.
+
+Estimated Lab Time: 30 minutes
+
+### Objectives
+
+In this lab, you will:
+
+* Review how the Seer Sciences Clinical Review app incorporates the use of JSON Duality Views, Graph Analytics, and other converged database features, all 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. To access the demo environment, click **View Login Info** in the top left corner of the page. Click the **Start the Demo** link.
+
+ 
+
+2. Select **Life Sciences** under Industry and **Approval Officer** under Role. Enter in a username and click **Login**.
+
+ 
+
+3. Welcome to the Seer Sciences application! Congratulations, you are now connected to the demo environment. You can now execute the different tasks for this Lab.
+
+ 
+
+## Task 2: Demo – Deny a Patient's Request
+
+In this first example, you will use the application to review a Clinical Trial Safety Review request. The system evaluates patient records, lab results, physician notes, and protocol rules, then provides an AI-generated recommendation for patient safety actions. The first patient on your to-do list is Liam Chen.
+
+1. On the Dashboard page, from the pending review list, select the review button for **Liam Chen**.
+
+ 
+
+2. Opening Liam Chen’s profile reveals his clinical request details—patient name, email, request ID, physician, request type, and current status. You will also be able to see the AI-powered analysis of the case, including a comprehensive evaluation and the top 3 safety recommendations with approval probability.
+
+ 
+
+3. At the bottom of Liam Chen’s profile, you will find the **AI Guru**—a chatbot built on Oracle Database 23ai and Vector search. When prompted, the system uses **RAG** to generate a response. It converts the question and energy data into embeddings, performs a similarity search, and then uses the **GenAI service** to turn the enriched context into a clear, natural language answer. If the patient calls with a question, you can quickly enter it into the AI Guru to generate a relevant response.
+
+
+ **Copy** the question below into the AI chatbot and press **Enter**. What does the AI Guru respond?
+
+ ```text
+
+ Why was this not approved?
+
+ ```
+
+ 
+
+>💡 In Oracle Database 23ai, **AI Vector Search** allows you to combine your business data with a Large Language Model (LLM) to reduce hallucinations and get accurate answers from your data.
+
+4. Select the **Navigate To Patient Decisions** button.
+
+ 
+
+ After navigating to the decisions page, the AI evaluation runs in the background. Clinical trial documents containing details such as lab results, physician notes, adverse event reports, and deviation logs are stored in Oracle Database 23ai and modeled with JSON Duality Views. These documents are vectorized and searched using AI Vector Search to identify semantically relevant prior cases and protocol criteria. The results are passed to OCI Generative AI, which uses retrieval-augmented generation (RAG) to generate a natural-language explanation, formatted for both internal safety board review and external regulatory communication.
+
+5. In the **Select Your Desired Option** section, the available options are displayed. If more data is needed, the reviewer can upload documents, add missing information, and trigger a re-evaluation. The system dynamically adjusts the recommendation, and generates a decision letter sent directly to the patient.
+
+ 
+
+6. Select the AI-recommended authorization decision. In this example, that is **Denied**.
+
+ >Please note that your results may vary. The information provided is generated by OCI Generative AI services, and your outcomes may differ from those presented.
+
+ 
+
+7. Set the final authorization status to **Denied**, then click **Confirm Decision** to complete the process.
+
+ The authorization status has been updated to 'Denied' and saved to the patient's profile.
+
+ 
+
+8. Click the **Download Decision as PDF** button.
+
+ 
+
+9. Click **Download PDF**
+
+ 
+
+10. Display the message the patient would see by opening the downloaded PDF.
+
+ 
+
+11. Click the **Return to Dashboard** button to navigate back to the Dashboard.
+
+ 
+
+12. Expand **View Denied Patients**. We can see that Liam Chen has been removed from the Pending Patients list and has been added to the Denied Patients list.
+
+ 
+
+**Task Summary**
+
+Once you select and save one of the 3 desired options recommended by the AI:
+
+✅ The patient's service request is updated.
+
+✅ A finalized PDF decision document is generated.
+
+✅ The dashboard reflects the change in real-time — marking Liam as Denied.
+
+Congratulations, you have just made a decision on your first patient review request! Proceed to the next task.
+
+## Task 3: Demo - Approve a Patient's request
+In this example, you will navigate the application to review a patient and approve them as part of the exercise. The next user on your to-do list is Olivia Wilson.
+
+1. On the Dashboard page, from the pending review list, select the review button for **Olivia Wilson**.
+
+ 
+
+2. Opening Olivia Wilson’s profile displays her clinical trial request details. Within a few seconds, the AI automatically generates a suggested action. In this case, the system evaluates the request and assigns it a low safety-risk rating, with explanations outlining the key clinical factors.
+
+ This patient has:
+
+ * A recent **safety review request** submitted by the physician
+ * Supporting **lab and symptom reports uploaded** to the trial system
+ * A compliance check that matches study protocol rules, making the request **eligible for approval**
+
+ The AI evaluates the profile and suggests next steps. In this case, it recommends approving the request, noting that the clinical evidence supports safe continuation in the trial.
+
+ 
+
+3. Select the **Navigate to Patient Decisions** button.
+
+ 
+
+>⁉️ **Why did AI approve this request?**
+
+4. Expand **Interactive Graph: Patient Requests & Decisions** to view the graph.
+
+ On the decision page, the clinical reviewer can use **Interactive Graph: Patient Requests & Decisions** how different elements of a trial case connect. Powered by **Oracle Graph**, this feature visually maps the review process and highlights key aspects such as physician notes, lab results, adverse events, and supporting documents.
+ 
+
+ This graph shows how Olivia Wilson’s clinical trial request connects across the workflow and is flagged with a Low safety-risk rating and pending board review. Instead of hidden backend validations, the Operational Property Graph makes the reasoning visual by linking the patient, lab results, physician notes, adverse events, AI recommendation, and board decision in one view. Clinical reviewers can instantly see why the system recommends approval, helping build confidence and transparency in the review process.
+
+>💡 In Oracle Database 23ai, **Property Graph** allows you to treat your data like a network of connected points, where each point (called a node) and each link (called an edge) has its own details or properties. This setup helps you run graph analytics, to find important connections or patterns, directly within the database.
+
+
+5. On the decisions page you can view the AI recommendation for Olivia Wilson. It shows the suggested action, comprehensive evaluation, and recommendations explanations.
+
+ 
+
+6. The authorization status is set to **Approved**. Click the **Confirm Decision** button.
+
+ The authorization status has been updated to 'Approved' and saved to the patient profile.
+
+ 
+
+7. Press the **Download Decision PDF** button to save the AI responses and proceed to the final authorization disposition.
+
+ 
+
+8. Click the **Download PDF** button.
+
+ 
+
+9. Display the message the patient would see by opening the downloaded PDF.
+
+ 
+
+10. Click **Return to Dashboard** button. Expand **View Approved Patients**. You will see that Olivia Wilson has been moved from the **Pending Patients** list to the **Approved** list.
+
+ 
+
+**Task Summary**
+
+Congratulations, you have finished approving a patient! Proceed to the next task.
+
+## Task 4: Demo - Update patient details
+
+Lastly, let’s explore how the system uses JSON Duality Views to handle profile updates. In this task, you will edit a patient’s clinical profile. In this example, Ava Taylor was asked to submit updated clinical documents, such as lab reports or physician notes.
+
+1. On the Dashboard page, from the **In Progress Patients** list, select the review button for **Ava Taylor**.
+
+ 
+
+2. We will upload a document to update patient's service note. On the Patient Details page, click the **Upload Document** button. The PDF file has been loaded. Then click the **Process PDF** button
+
+ 
+
+>💡 **JSON Duality Views** in 23ai let's you update unstructured data in an easy, high-level format while automatically handling the technical details behind the scenes. This makes it faster and simpler to work with messy data and connect it to structured systems.
+
+4. The patient profile has been updated.
+
+ 
+
+**Task Summary**
+
+Once the document is uploaded:
+
+✅ The system automatically detects the new data.
+
+✅ The profile will be updated with clinical review documentation.
+
+✅ Thanks to JSON Transform and JSON Duality Views, only the relevant field is modified — leaving the rest of the profile UNTOUCHED.
+
+## Conclusion
+
+In conclusion our Service Request Approval App was able to leverage Oracle database 23ai technologies such as **AI Vector Search, Property Graph and JSON Duality Views** to:
+
+✅ Automate profile evaluations
+
+✅ Provide AI-driven recommendations by using a RAG model powered by a Oracle Database 23ai's AI Vector Search and OCI Generative AI service
+
+✅ Enable seamless profile updates with JSON Duality Views
+
+✅ Leverage Operational Property Graphs to equip public works officers with actionable insights
+
+By combining these advanced tools, the application enables faster, smarter decisions and delivers clear guidance on how patients can improve their eligibility.
+
+**Next:** How about learning how the application was implemented in Python? Continue with the next labs and start developing!
+
+## Learn More
+
+* [Oracle Database 23ai Documentation](https://docs.oracle.com/en/database/oracle/oracle-database/23/)
+
+## Acknowledgements
+* **Authors** - Ley Sylvester
+* **Contributors** - Kevin Lazarz, Francis Regalado, Hanna Rakhsha, Uma Kumar
\ No newline at end of file
diff --git a/dev-ai-app-dev-life_sciences/workshops/sandbox/index.html b/dev-ai-app-dev-life_sciences/workshops/sandbox/index.html
new file mode 100644
index 000000000..aebbdda4a
--- /dev/null
+++ b/dev-ai-app-dev-life_sciences/workshops/sandbox/index.html
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+ Oracle LiveLabs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Oracle LiveLabs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev-ai-app-dev-life_sciences/workshops/sandbox/manifest.json b/dev-ai-app-dev-life_sciences/workshops/sandbox/manifest.json
new file mode 100644
index 000000000..2cb8ef27e
--- /dev/null
+++ b/dev-ai-app-dev-life_sciences/workshops/sandbox/manifest.json
@@ -0,0 +1,41 @@
+{
+ "workshoptitle": "Build a GenAI App on Oracle Database 23ai – Life Sciences 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": "../../connect-to-env/connect-to-env.md"
+ },
+ {
+ "title": "Lab 3: Coding Basics on Oracle Database 23ai",
+ "description": "Some coding examples",
+ "filename": "https://oracle-livelabs.github.io/developer/dev-ai-app-dev-retail/codingbasics/codingbasics.md"
+ },
+ {
+ "title": "Lab 4: Step by Step - Implement RAG with Oracle Database 23ai",
+ "description": "This is a step-by-step guide showcasing how the demo instance is navigated",
+ "filename": "../../build/build.md"
+ },
+ {
+ "title": "Lab 5: Interact with Oracle Database 23ai through an MCP Server",
+ "description": "This is a step-by-step guide showcasing how the demo instance is navigated",
+ "filename": "https://oracle-livelabs.github.io/developer/dev-ai-app-dev-retail/mcp/mcp.md"
+ },
+ {
+ "title": "Need Help?",
+ "description": "Solutions to Common Problems and Directions for Receiving Live Help",
+ "filename": "https://oracle-livelabs.github.io/common/labs/need-help/need-help-freetier.md"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/dev-ai-app-dev-life_sciences/workshops/tenancy/index.html b/dev-ai-app-dev-life_sciences/workshops/tenancy/index.html
new file mode 100644
index 000000000..aebbdda4a
--- /dev/null
+++ b/dev-ai-app-dev-life_sciences/workshops/tenancy/index.html
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+ Oracle LiveLabs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Oracle LiveLabs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev-ai-app-dev-life_sciences/workshops/tenancy/manifest.json b/dev-ai-app-dev-life_sciences/workshops/tenancy/manifest.json
new file mode 100644
index 000000000..1c09880b1
--- /dev/null
+++ b/dev-ai-app-dev-life_sciences/workshops/tenancy/manifest.json
@@ -0,0 +1,96 @@
+{
+ "workshoptitle": "Build a GenAI App on Oracle Database 23ai – Healthcare 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": "../../connect-to-env/connect-to-env.md"
+ },
+ {
+ "title": "Lab 3: Start coding with Oracle Database 23ai",
+ "description": "Some coding examples",
+ "filename": "../../codingbasics/codingbasics.md"
+ },
+ {
+ "title": "Lab 4: Step by Step - Implement RAG with Oracle Database 23ai",
+ "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 Database 23ai",
+ "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://oracle-livelabs.github.io/common/labs/need-help/need-help-freetier.md"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/dev-ai-app-dev-state/build/build.md b/dev-ai-app-dev-state/build/build.md
index ace04c029..1311d66e0 100644
--- a/dev-ai-app-dev-state/build/build.md
+++ b/dev-ai-app-dev-state/build/build.md
@@ -333,11 +333,11 @@ Here’s what we’ll do:
2. Click the "Run" button to execute the code. Note that this will take time to run.
- 
+ 
3. Review the output. In the demo, this is where you selected the “Navigate to Decisions” button as the Public Works Officer. You just used AI to generate service activation recommendations that would have taken hours to complete manually—congratulations!
- 
+ 
>Note: Your result may be different. This is because of generative AI and the model's ability to generate new content based on your input. The output may contain different recommendations or suggestions.
diff --git a/dev-ai-app-dev-state/introduction/introduction.md b/dev-ai-app-dev-state/introduction/introduction.md
index ee20ae958..c10f52b26 100644
--- a/dev-ai-app-dev-state/introduction/introduction.md
+++ b/dev-ai-app-dev-state/introduction/introduction.md
@@ -13,7 +13,7 @@ You’ll see how SeerGroup’s teams can move from manual, fragmented workflows
✅ **Start with the demo! (Lab 1)**
-Step into SeerGroup’s Public Services division as a Public Works Officer. You’ll use an AI-powered citizen services app built on Oracle Database 23ai to:
+Step into SeerGroup’s State and Local Gov division as a Public Works Officer. You’ll use an AI-powered citizen services app built on Oracle Database 23ai to:
Review service requests—such as permit applications or maintenance reports—using AI Vector Search, Graph analytics, and RAG
@@ -25,6 +25,7 @@ Update citizen profiles and service records using JSON Duality Views, keeping da
This story shows how SeerGov uses Oracle Database 23ai and OCI Generative AI to streamline service delivery, improve policy compliance, and cut request backlogs—all without moving data across siloed agency systems.
+
✅ **What’s next (Labs 2–5)**
After the demo, you’ll switch roles to developer. In the next labs you’ll connect to Oracle Database 23ai, 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 industries can move from siloed processes to intelligent, AI-driven applications—all on one platform.
diff --git a/dev-ai-app-dev-telecommunication/user-story/user-story.md b/dev-ai-app-dev-telecommunication/user-story/user-story.md
index 2946c081b..f37a04677 100644
--- a/dev-ai-app-dev-telecommunication/user-story/user-story.md
+++ b/dev-ai-app-dev-telecommunication/user-story/user-story.md
@@ -138,7 +138,7 @@ In this example, you will navigate the application to review a customer and requ

->⁉️ **What are two reasons that the AI requested more information for this request?** ⁉️
+>⁉️ **What are two reasons that the AI requested more information for this request?**
4. Expand **Interactive Graph: Service Requests, Risk & Policy** to view the graph.
diff --git a/dev-ai-app-dev-transportation/app-architecture/app-architecture.md b/dev-ai-app-dev-transportation/app-architecture/app-architecture.md
new file mode 100644
index 000000000..aad4003ee
--- /dev/null
+++ b/dev-ai-app-dev-transportation/app-architecture/app-architecture.md
@@ -0,0 +1,72 @@
+# Architecture & Workshop Features
+
+## Introduction
+
+In this lab, you will explore the architecture behind the workshop that supports the tasks you will perform. We also have a closer look at all the features of the Oracle Database 23ai that were used to build the workshop and the demo application.
+
+Estimated Lab Time: 15 minutes
+
+## 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)**.
+
+
+
+### 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 runs two containers, including:
+
+ - Open-source Python library for the Healthcare Claim Approval Demo
+
+ - JupterLab as a browser-based development environment
+
+- The Application Subnet connects to the Oracle Services Network via the Service Gateway, enabling access to:
+
+ - Autonomous Database Serverless
+
+ - OCI Generative AI Services
+
+This architecture provides strong connectivity, scalability, and integration with Oracle cloud-native services to support efficient loan processing and approval.
+
+## Oracle Database 23ai features used in the demo app and in this workshop
+
+
+
+
+### **JSON Duality View**
+
+JSON Relational Duality in Oracle Database 23ai bridges the gap between relational and document data models. It gives developers the flexibility of JSON with the efficiency and power of relational storage. This eliminates 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 that should be highlighted is the ability to connect the database using Mongo DB syntax. This allows developers to interact with collections and documents using a familiar syntax.
+
+**Where is it used**: We implemented JSON Duality View in the demo app and in this workshop. All data you can view in the dashboard of the demo app is query from JSON Duality Views. In Lab 3, you learn how to interact with JSON Duality View using Oracle's Python driver. But you also learn how to use Oracle's Mongo API to query JSON Duality Views using Mongo DB syntax.
+
+### **AI Vector Search**
+
+Oracle AI Vector Search, a feature of Oracle Database 23ai, 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, returning more accurate, context-aware results. Developers can also add semantic search to new or existing applications with minimal effort. A **unique feature** of Oracle Database 23ai is its capability to host ONNX models and deploy them as a database function. This feature allows you to host ONNX models and deploy them as a database function, enabling seamless integration with Oracle Database 23ai.
+
+**Where is it used**: AI Vector Search is a key feature of the demo app and is also a topic in Lab 4 and Lab 5. In Lab 4, you use AI Vector Search to implement a RAG process, while in Lab 5, you specifically implement similarity search.
+
+### **Property Graph**
+
+Oracle Database 23ai supports property graphs, which model relationships using vertices and edges mapped to existing tables, external tables, materialized views, or synonyms. These graphs store metadata—not the actual data—which remains in the underlying objects. You use SQL/PGQ to query and interact with them.
+
+Property graphs simplify working with connected data, such as identifying influencers, predicting trends, or discovering relationships through pattern matching, by offering a more intuitive and efficient way to model and query complex networks.
+
+**Where is it used**: We implemented property graphs in the demo part of this workshop. Healthcare Claim Analysts can use it to identify potential alternative treatments for their patients.
+
+
+## Acknowledgements
+* **Authors** - Kamryn Vinson, Linda Foinding, Francis Regalado
+* **Contributors** - Eddie Ambler, Kevin Lazarz
+* **Last Updated By/Date** - Kamryn Vinson, April 2025
\ No newline at end of file
diff --git a/dev-ai-app-dev-transportation/app-architecture/images/logical.png b/dev-ai-app-dev-transportation/app-architecture/images/logical.png
new file mode 100644
index 000000000..ff693fa61
Binary files /dev/null and b/dev-ai-app-dev-transportation/app-architecture/images/logical.png differ
diff --git a/dev-ai-app-dev-transportation/app-architecture/images/physical-architecture.png b/dev-ai-app-dev-transportation/app-architecture/images/physical-architecture.png
new file mode 100644
index 000000000..402f3519b
Binary files /dev/null and b/dev-ai-app-dev-transportation/app-architecture/images/physical-architecture.png differ
diff --git a/dev-ai-app-dev-transportation/build/build.md b/dev-ai-app-dev-transportation/build/build.md
new file mode 100644
index 000000000..daf4a44f1
--- /dev/null
+++ b/dev-ai-app-dev-transportation/build/build.md
@@ -0,0 +1,716 @@
+# Step by step: Implement RAG with Oracle Database 23ai
+
+## Introduction
+
+You’ll build an Esports Tournament Approval Tool powered by Oracle Database 23ai and OCI Generative AI. The app connects to player profiles and team rosters, evaluates tournament eligibility and rule compliance, and uses a large language model to draft approval recommendations with clear explanations. Leveraging Python skills from earlier labs, you’ll deploy a fully integrated AI solution that accelerates and strengthens tournament approval decisions.
+
+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 tournament approval application as seen in lab 1
+* Use OCI Generative AI to generate personalized product recommendations
+* Use Python to connect to an Oracle Database 23ai instance and run queries
+* Explore supplier data and extract relevant information
+
+### Prerequisites
+
+This lab assumes you have:
+
+* An Oracle Cloud account
+* Completed lab 1: Run the demo
+* Completed lab 2: Connect to the Development Environment
+
+## Task 1: Build the application in Jupyter Notebook
+>💡**Note**: Review Lab 2: Connect to the Development Environment for instructions on accessing JupyterLab.
+
+1. You should see a terminal pop up once you are logged in.
+
+ 
+
+
+2. Navigate to the `dbinit` directory by running the following command.
+
+ ```bash
+
+ cd dbinit
+
+ ```
+
+ 
+
+3. Copy and run the following command to create tables in the database. There will be a lot of output. You should see the following output once complete.
+
+ ```bash
+
+ ./shell_script.sh
+
+ ```
+
+ 
+
+ 
+
+## Task 2: Connect to Database
+
+2. Click the **+** sign on the top left to open the Launcher.
+
+ 
+
+3. Open a new notebook.
+
+ 
+
+1. Copy the following code block into an empty cell in your notebook. This code block imports the `oracledb` Python driver and other libraries.
+
+ ```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()
+
+ ```
+
+2. Run the code block to connect to the database.
+
+ 
+
+## Task 3: Pull shipper data from the database
+
+You will query shipper data from the `transportation_dv` JSON duality view, which combines data from shipper and related tables. This task will:
+
+- **Define a Function**: Create a reusable function a to query the database by shipper ID, extracting the JSON data for a specific shipper.
+
+- **Use an Example**: Fetch data for shipper `2002` (Betty Green) to demonstrate the process.
+
+- **Display the Results**: Format the retrieved data into a pandas DataFrame for a clear tabular view, highlighting key details such as shipper name, company, request ID, priority, temperature requirement, stop type, and risk level.
+
+1. Copy and paste the code below into the new notebook:
+
+ ```python
+
+ # Task 3: Fetch shipper's JSON from transportation_dv + shared helpers
+
+ # Pull single shipper JSON documents from DV
+ def fetch_shipper(shipper_id: int):
+ cursor.execute(
+ "SELECT data FROM transportation_dv WHERE JSON_VALUE(data,'$._id') = :sid",
+ {'sid': str(shipper_id)}
+ )
+ row = cursor.fetchone()
+ if not row:
+ return None
+ return json.loads(row[0]) if isinstance(row[0], str) else row[0]
+
+ # Load route candidates into a DataFrame
+ def load_route_candidates():
+ cursor.execute("SELECT route_id, stop_id, distance_mi, duration_min, feasibility_score, risk_level FROM TRN_ROUTE_CANDIDATES")
+ rows = cursor.fetchall()
+ cols = ["ROUTE_ID","STOP_ID","DISTANCE_MI","DURATION_MIN","FEASIBILITY_SCORE","RISK_LEVEL"]
+ return pd.DataFrame(rows, columns=cols) if rows else pd.DataFrame(columns=cols)
+
+ # Pull first stop/route/request bundle
+ def extract_first_shipment_bundle(s_json):
+ s = s_json or {}
+ stops = s.get("stops") or []
+ stop0 = stops[0] if stops else {}
+ routes = stop0.get("routes") or []
+ route0 = routes[0] if routes else {}
+ requests = route0.get("shipmentRequests") or []
+ req0 = requests[0] if requests else {}
+ rec0 = req0.get("recommendation", {}) or {}
+ return stop0, route0, req0, rec0
+
+ # --- Let's select a shipper ---
+ selected_shipper_id = 2002
+ shipper_json = fetch_shipper(selected_shipper_id)
+ df_routes = load_route_candidates()
+
+ # Print summary of current case
+ if shipper_json:
+ stop0, route0, req0, _ = extract_first_shipment_bundle(shipper_json)
+ print(f"Shipper: {shipper_json.get('firstName')} {shipper_json.get('lastName')} | Company: {shipper_json.get('company')}")
+ print(f"Stop Type: {stop0.get('stopType')} | Stop ID: {stop0.get('stopId')}")
+ print(f"Route Distance: {route0.get('distanceMi')} mi | Duration: {route0.get('durationMin')} min")
+ print(f"Shipment Request: Priority {req0.get('priority')} | Temp: {req0.get('tempRequirement')} | Request ID: {req0.get('requestId')}")
+ else:
+ print("No shipper found.")
+
+
+ ```
+
+2. Click the "Run" button to execute the code.
+
+ 
+
+3. The output will display a DataFrame containing the shipper's details for the selected shipper ID.
+
+ 
+
+## Task 4: Generate Recommendations for the Player
+
+In a new cell, build a prompt using the shipper’s shipment request, route details, and compliance context. Retrieve feasibility and risk data, then generate a decision from the recommendation: **Approve, Deny, Request Info**. Update the transportation tables accordingly and display the results.
+
+With shipper profiles in place, you will generate personalized shipment routing recommendations.
+
+Here’s what we’ll do:
+
+1. Copy and paste the code in a new cell:
+
+ ```python
+
+
+ # Task 4: Simple shipment recommendation using helpers from Task 3
+
+ # Map Numeric Score
+ def _risk_bucket(n):
+ try:
+ n = int(n)
+ except:
+ return "Medium"
+ if n <= 3: return "High"
+ if n <= 6: return "Medium"
+ if n <= 8: return "Low"
+ return "Very Low"
+
+ # Reuse outputs from Task 3
+ stop0, route0, ship_req, rec_block = extract_first_shipment_bundle(shipper_json or {})
+
+ # IDs we will persist back into db
+ request_id = (ship_req or {}).get("requestId")
+ recommend_id = (rec_block or {}).get("recId")
+
+ # Build content blocks for our LLM
+ # Route candidates list to help the model
+ routes_block = "\n".join([
+ f"- Route {r.ROUTE_ID}: {r.DISTANCE_MI} mi, {r.DURATION_MIN} min, Risk={r.RISK_LEVEL}, Feas={r.FEASIBILITY_SCORE}"
+ for _, r in df_routes.iterrows()
+ ]) or "None"
+
+ # Shipper demographics
+ shipper_block = "\n".join([
+ f"- {k}: {v}"
+ for k, v in (shipper_json or {}).items() if k not in ["stops","_metadata"]
+ ]) or "None"
+
+ # Stop details
+ stop_block = "\n".join([f"- {k}: {v}" for k, v in (stop0 or {}).items() if k != "routes"]) or "None"
+
+ # Route details
+ route_block = "\n".join([f"- {k}: {v}" for k, v in (route0 or {}).items() if k != "shipmentRequests"]) or "None"
+
+ # Shipment request basics
+ req_block = "\n".join([f"- {k}: {v}" for k, v in (ship_req or {}).items() if k != "recommendation"]) or "None"
+
+ prompt = f"""
+ You are a Transportation Logistics assistant. Use ONLY this context.
+ Decide APPROVE / DENY / REQUEST INFO. Prefer APPROVE or DENY; use REQUEST INFO only if neither can be justified.
+
+ Routes:
+ {routes_block}
+
+ Shipper:
+ {shipper_block}
+
+ Stop:
+ {stop_block}
+
+ Route:
+ {route_block}
+
+ Shipment Request:
+ {req_block}
+
+ Decision rules:
+ - APPROVE if: feasible route exists AND shipper docs align AND risk ≥ 7.
+ - DENY if: infeasible route OR risk ≤ 3 OR clear violation (e.g., HOS exceeded).
+ - REQUEST INFO only if key evidence is missing/ambiguous.
+ - If no feasible route plausibly matches, prefer DENY over REQUEST INFO.
+
+ Return EXACTLY this layout (no extra text):
+ SuggestedAction: APPROVE|DENY|REQUEST INFO
+ Risk: N (Very Low|Low|Medium|High)
+ Rationale:
+ - one reason
+ - second reason
+ - third reason
+ NextSteps:
+ - step 1 (empty if Approved)
+ - step 2
+ - step 3
+ """
+
+ print("Generating AI recommendations …")
+ try:
+ # OCI GenAi clients config
+ genai_client = oci.generative_ai_inference.GenerativeAiInferenceClient(
+ config=oci.config.from_file(os.path.expanduser(os.getenv("OCI_CONFIG_PATH","~/.oci/config")), "DEFAULT"),
+ 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.0
+ ),
+ serving_mode=oci.generative_ai_inference.models.OnDemandServingMode(
+ model_id="meta.llama-3.2-90b-vision-instruct" # Same model
+ )
+ )
+ chat_resp = genai_client.chat(chat_detail)
+ recommendation_text = chat_resp.data.chat_response.choices[0].message.content[0].text
+ except Exception as e:
+ print(f"OCI GenAI error: {e}")
+
+ print("\n--- AI Recommendation ---\n", recommendation_text[:1000])
+
+ # Parse the simple block
+ act = re.search(r"SuggestedAction:\s*(APPROVE|DENY|REQUEST INFO)\b", recommendation_text, re.I)
+ risk_num = re.search(r"Risk:\s*([0-9]+)", recommendation_text, re.I)
+ risk_lbl = re.search(r"Risk:\s*[0-9N]+\s*\((Very Low|Low|Medium|High)\)", recommendation_text, re.I)
+
+ action_norm = (act.group(1).upper() if act else "REQUEST INFO")
+ risk_n = risk_num.group(1) if risk_num else ("7" if action_norm == "APPROVE" else "5")
+ risk_l = (risk_lbl.group(1).title() if risk_lbl else _risk_bucket(risk_n))
+
+ # Map to dashboard vocab
+ table_status = "Approved" if action_norm == "APPROVE" else ("Denied" if action_norm == "DENY" else "In Progress")
+
+ # update new values into the DB
+ try:
+ # Insert / Update TRN_RECOMMENDATION
+ cursor.execute("""
+ MERGE INTO TRN_RECOMMENDATION t
+ USING (SELECT :rid AS RECOMMEND_ID FROM dual) s
+ ON (t.RECOMMEND_ID = s.RECOMMEND_ID)
+ WHEN MATCHED THEN UPDATE SET
+ t.ROUTE_ID = :route_id,
+ t.RECOMMENDATION = :rec,
+ t.EXPLANATION = :exp,
+ t.RISK_LEVEL = :risk,
+ t.GENERATED_DATE = SYSDATE
+ WHEN NOT MATCHED THEN INSERT
+ (RECOMMEND_ID, ROUTE_ID, RECOMMENDATION, EXPLANATION, RISK_LEVEL, GENERATED_DATE)
+ VALUES (:rid, :route_id, :rec, :exp, :risk, SYSDATE)
+ """, {
+ 'rid': recommend_id or 90001, # stable ID
+ 'route_id': (route0 or {}).get("routeId"),
+ 'rec': table_status,
+ 'exp': recommendation_text,
+ 'risk': risk_l
+ })
+
+ # Link the request to this recommendation and set REQUEST_STATUS for dashboards
+ cursor.execute("""
+ UPDATE TRN_REQUESTS
+ SET RECOMMEND_ID = :rid,
+ REQUEST_STATUS = :final_dec
+ WHERE REQUEST_ID = :req_id
+ """, {'rid': recommend_id or 90001, 'final_dec': table_status, 'req_id': request_id})
+
+ connection.commit()
+
+ print(f"Stored recommendation -> {table_status} (risk={risk_l}); linked to TRN_REQUESTS {request_id}.")
+ except Exception as e:
+ connection.rollback()
+ print("Failed to store recommendation:", e)
+
+ ```
+
+2. Click the "Run" button to execute the code. Note that this will take time to run.
+
+ 
+
+3. Review the output. In the demo, this is where you selected the “Navigate to Decisions” button as the Logistics Dispatcher. You just used AI to generate shipment recommendations that would have taken hours to complete manually—congratulations!
+
+ 
+
+>Note: Your result may be different. This is because of generative AI and the model's ability to generate new content based on your input. The output may contain different recommendations or suggestions.
+
+## Task 5: Chunk & Store Recommendations
+
+To handle follow-up questions, you will enhance the system with an AI Guru powered by Oracle 23ai’s Vector Search and Retrieval-Augmented Generation (RAG). The AI Guru will be able to answer questions about the grid interconnection application and provide recommendations based on the data.
+
+Before answering questions, we need to prepare the data by vectoring the claims recommendations. This step:
+
+ - Stores Recommendations: Inserts the full recommendation text (from previous cell) as a single chunk if not already present.
+ - We delete prior chunks for this authorization.
+ - We use `VECTOR_CHUNKS` to split the recommendation text.
+ - The chunks will be inserted into `TRN_CHUNK`
+ - We display a data frame summary to show the chunks.
+
+
+1. Copy the following code and run:
+
+ ```python
+
+ # Task 5: Chunk & store AI recommendation, then SHOW the chunks
+
+ req_id = request_id # from Task 4
+ text_to_chunk = (recommendation_text or "").strip()
+ if not text_to_chunk:
+ text_to_chunk = f"SuggestedAction: {table_status}\nRationale: (empty model output)."
+
+ # 0) Find a DOC_ID for this request (attach chunks to it)
+ cursor.execute("""
+ SELECT DOC_ID
+ FROM TRN_DOCUMENTS
+ WHERE REQUEST_ID = :rid
+ ORDER BY UPLOADED_AT DESC FETCH FIRST 1 ROWS ONLY
+ """, {'rid': req_id})
+ doc_row = cursor.fetchone()
+ doc_id = doc_row[0] if doc_row else None
+
+ # 1) Clear old chunks
+ if doc_id:
+ cursor.execute("DELETE FROM TRN_CHUNKS WHERE DOC_ID = :docid", {'docid': doc_id})
+ connection.commit()
+
+ # 2) Chunk via VECTOR_CHUNKS
+ chunk_size = 25
+ overlap = 0
+
+ insert_chunks_sql = f"""
+ INSERT INTO TRN_CHUNKS (DOC_ID, SOURCE_TYPE, CHUNK_ID, CHUNK_TEXT)
+ SELECT :docid, 'AI_REC', c.chunk_offset, c.chunk_text
+ FROM (SELECT :txt AS c FROM dual) s,
+ VECTOR_CHUNKS(
+ dbms_vector_chain.utl_to_text(s.c)
+ BY words
+ MAX {int(chunk_size)}
+ OVERLAP {int(overlap)}
+ SPLIT BY sentence
+ LANGUAGE american
+ NORMALIZE all
+ ) c
+ """
+
+ inserted = 0
+ try:
+ if doc_id:
+ cursor.execute(insert_chunks_sql, {'docid': doc_id, 'txt': text_to_chunk})
+ inserted = cursor.rowcount or 0
+ connection.commit()
+ else:
+ print(f"No document found for REQUEST_ID={req_id}, skipping chunk insert.")
+ except oracledb.DatabaseError as e:
+ print(f"VECTOR_CHUNKS error, {e}")
+ inserted = 0
+
+ print(f"Stored {inserted} chunk(s) for REQUEST_ID={req_id}.")
+
+ # 3) Fetch & SHOW the chunks
+ cursor.execute("""
+ SELECT c.CHUNK_ID, c.CHUNK_TEXT
+ FROM TRN_CHUNKS c
+ JOIN TRN_DOCUMENTS d ON c.DOC_ID = d.DOC_ID
+ WHERE d.REQUEST_ID = :rid
+ ORDER BY c.CHUNK_ID
+ """, {'rid': req_id})
+ rows = cursor.fetchall()
+
+ # Build summary DataFrame
+ 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")
+
+ # Display in notebook
+ display(df_chunks)
+
+ print(f"\nStored {inserted} chunk(s) for REQUEST_ID={req_id}.")
+
+
+ ```
+
+2. Click the "Run" button to execute the code.
+
+ 
+
+3. Review the output.
+
+ 
+
+## Task 6: Create Embeddings
+
+Now we must generate and store vector embeddings. This allows us to use Vector Search and RAG to enhance AI Guru's answers.
+
+In this step:
+
+ - **Generates Embeddings**: This is a new feature in Oracle Database 23ai that allows you to create embeddings directly within the database, eliminating the need for external tools or APIs. The `dbms_vector_chain.utl_to_embedding` function takes the recommendation text as input and returns an embedding vector.
+
+ - **Stores Embeddings**: We update `TRN_CHUNK.CHUNK_VECTOR` by embedding each `CHUNK_TEXT` using `dbms_vector_chain.utl_to_embedding` with `DEMO_MODEL`. A short verification output is printed.
+
+1. Copy the following code into a new cell block:
+
+ ```python
+
+
+ # Task 6: Create embeddings for TRN_CHUNKS rows
+ req_id = request_id # from Task 4/5
+ vp = json.dumps({"provider": "database", "model": "DEMO_MODEL", "dimensions": 384})
+
+ # 1) Embed all chunks for this shipment request (via DOC_IDs)
+ try:
+ cursor.execute(
+ """
+ UPDATE TRN_CHUNKS c
+ SET c.CHUNK_VECTOR = dbms_vector_chain.utl_to_embedding(c.CHUNK_TEXT, JSON(:vp))
+ WHERE c.DOC_ID IN (
+ SELECT d.DOC_ID
+ FROM TRN_DOCUMENTS d
+ WHERE d.REQUEST_ID = :rid
+ )
+ """,
+ {"vp": vp, "rid": req_id}
+ )
+ updated = cursor.rowcount or 0
+ connection.commit()
+ print(f"Embedded vectors for {updated} chunk(s) (REQUEST_ID={req_id}).")
+ except oracledb.DatabaseError as e:
+ connection.rollback()
+ print("Embedding failed. Make sure DEMO_MODEL is loaded in Task 2.")
+ raise
+
+ # 2) Sanity check: how many rows have vectors now?
+ cursor.execute("""
+ SELECT COUNT(*)
+ FROM TRN_CHUNKS c
+ JOIN TRN_DOCUMENTS d ON c.DOC_ID = d.DOC_ID
+ WHERE d.REQUEST_ID = :rid
+ AND c.CHUNK_VECTOR IS NOT NULL
+ """, {"rid": req_id})
+ have_vec = cursor.fetchone()[0]
+
+ cursor.execute("""
+ SELECT COUNT(*)
+ FROM TRN_CHUNKS c
+ JOIN TRN_DOCUMENTS d ON c.DOC_ID = d.DOC_ID
+ WHERE d.REQUEST_ID = :rid
+ """, {"rid": req_id})
+ total_rows = cursor.fetchone()[0]
+
+ print(f"Vectors present: {have_vec}/{total_rows}")
+
+
+ ```
+
+2. Click the "Run" button to execute the code.
+
+ 
+
+3. Review the output.
+
+ 
+
+## Task 7: Implement RAG with Oracle Database 23ai's Vector Search
+
+Now that the recommendations are vectorized, we can process a user’s question:
+
+ ```Why was this shipment approved?```
+
+ - **Vectorizes the question**: Embeds the question using `DEMO_MODEL` via `dbms_vector_chain.utl_to_embedding`.
+ - **Performs AI Vector Search**: Finds the most relevant using similarity search over the stored chunks.
+ - **Use RAG**: Combines the shipper's profile and relevant chunk information into a prompt for OCI Generative AI, producing a concise answer. Here you implement the RAG process.
+ - **Prints**: An answer is returned with citations from the LLM
+
+1. Copy the code and run:
+
+ ```python
+
+ # 🔹 Task 7: RAG — retrieve most relevant chunk(s) and answer a question (Gaming)
+ # 🔹 Helper: extract first shipment bundle (stops → routes → requests → rec/dec)
+ def extract_first_shipment_bundle(shipper_json):
+ p = shipper_json or {}
+ stops = p.get("stops") or []
+ stop0 = stops[0] if stops else {}
+
+ routes = stop0.get("routes") or []
+ route0 = routes[0] if routes else {}
+
+ requests = route0.get("shipmentRequests") or []
+ req0 = requests[0] if requests else {}
+
+ rec0 = req0.get("recommendation", {}) or {}
+ dec0 = req0.get("decision", {}) or {}
+
+ return stop0, route0, req0, rec0, dec0
+
+
+ # Task 7: RAG — retrieve most relevant chunk(s) and answer a question
+
+ # 🔹 Prep: Extract a consistent bundle from shipper_json (from Task 4)
+ stop0, route0, shipment_req, rec_block, dec_block = extract_first_shipment_bundle(shipper_json)
+
+ # 0) Question (edit as needed)
+ question = "Why was this shipment approved?"
+ print("Running vector search…")
+
+ # 1) Embed the question with the same model used in Task 6
+ vp = json.dumps({"provider": "database", "model": "DEMO_MODEL", "dimensions": 384})
+ cursor.execute(
+ "SELECT dbms_vector_chain.utl_to_embedding(:q, JSON(:vp)) FROM dual",
+ {"q": question, "vp": vp}
+ )
+ qvec = cursor.fetchone()[0]
+
+ # 2) Retrieve chunks from TRN_CHUNKS for this shipment request
+ cursor.execute(f"""
+ SELECT c.CHUNK_ID,
+ c.CHUNK_TEXT,
+ VECTOR_DISTANCE(c.CHUNK_VECTOR, :qv, COSINE) AS dist
+ FROM TRN_CHUNKS c
+ JOIN TRN_DOCUMENTS d ON c.DOC_ID = d.DOC_ID
+ WHERE d.REQUEST_ID = :rid
+ AND c.CHUNK_VECTOR IS NOT NULL
+ ORDER BY dist
+ FETCH FIRST 1 ROWS ONLY
+ """, {"rid": shipment_req.get("requestId"), "qv": qvec})
+ rows = cursor.fetchall()
+
+ def _lob_to_str(v):
+ return v.read() if isinstance(v, oracledb.LOB) else v
+
+ retrieved = []
+ for cid, ctext, dist in rows:
+ txt = _lob_to_str(ctext) or ""
+ retrieved.append((cid, txt, float(dist)))
+
+
+ # 3) Build a compact RAG prompt
+ def _normalize_ws(s: str) -> str:
+ return re.sub(r"\s+", " ", s or "").strip()
+
+ context_lines = [f"[Chunk {cid}] {_normalize_ws(txt)}" for cid, txt, _ in retrieved]
+ context_block = "\n\n".join(context_lines)
+
+ shipper_name = f"{shipper_json.get('firstName','')} {shipper_json.get('lastName','')}".strip()
+ company_name = shipper_json.get("company", "")
+ priority = shipment_req.get("priority", "")
+ temp_req = shipment_req.get("tempRequirement", "")
+ stop_type = stop0.get("stopType", "")
+
+ prompt = f"""[INST] <>You are a Transportation Logistics AI. Be precise, cite the chunk ids inline like [Chunk 2] when referring to specific facts.
+ Do not mention sources outside of the provided context. Respond in under 400 words.
+ ALWAYS respond as if you have the knowledge yourself.
+ Do NOT provide warnings, disclaimers, or exceed the specified response length.
+ <> [/INST]
+
+ Shipper: {shipper_name} ({company_name})
+ Shipment: Priority={priority}, TempRequirement={temp_req}, StopType={stop_type}
+
+ Question: {question}
+
+ Context:
+ {context_block}
+
+ Return this format (plain text, no extra lines):
+ Decision: APPROVED|DENIED|REQUEST INFO
+ Why:
+ - reason 1 (cite [Chunk N])
+ - reason 2 (cite [Chunk N])
+ - reason 3 (cite [Chunk N])
+ Next:
+ - actionable step 1
+ - actionable step 2
+ - actionable step 3
+ """.strip()
+
+ # 4) Generate the final answer with OCI GenAI
+ print("\nGenerating final RAG answer…")
+ try:
+ genai_client = oci.generative_ai_inference.GenerativeAiInferenceClient(
+ config=oci.config.from_file(os.path.expanduser(os.getenv("OCI_CONFIG_PATH","~/.oci/config")), "DEFAULT"),
+ 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.0
+ ),
+ serving_mode=oci.generative_ai_inference.models.OnDemandServingMode(
+ model_id="meta.llama-3.2-90b-vision-instruct"
+ )
+ )
+ chat_resp = genai_client.chat(chat_detail)
+ rag_answer = chat_resp.data.chat_response.choices[0].message.content[0].text
+ except Exception as e:
+ print("Something is off...", e)
+ rag_answer = "[No AI answer generated]"
+
+ print("\n🤖 RAG Answer:\n", rag_answer)
+
+
+ ```
+
+2. Click the "Run" button to execute the code.
+
+ 
+
+3. Review the result.
+
+ >*Note:* Your result may be different due to non-deterministic character of generative AI.
+
+ 
+
+## Conclusion
+Congratulations! You implemented a RAG process in Oracle Database 23ai using Python.
+
+to summarize:
+
+* Connected with oracledb
+* Retrieved a shipper's profile via a JSON duality view
+* Generated a grid interconnection recommendation using OCI GenAI
+* Chunked and embedded both recommendations and document text
+* Performed vector search and produced a RAG answer grounded in retrieved chunks (with chunk IDs printed for traceability)
+
+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 Database 23ai Documentation](https://docs.oracle.com/en/database/oracle/oracle-database/23/)
+
+## Acknowledgements
+* **Authors** - Ley Sylvester
+* **Contributors** - Kevin Lazarz, Hanna Rakhsha, Francis Regalado, Uma Kumar
\ No newline at end of file
diff --git a/dev-ai-app-dev-transportation/build/files/starter-file.sql b/dev-ai-app-dev-transportation/build/files/starter-file.sql
new file mode 100644
index 000000000..9d7e762e8
--- /dev/null
+++ b/dev-ai-app-dev-transportation/build/files/starter-file.sql
@@ -0,0 +1,101 @@
+/* NOTE: Files cannot contain empty lines (line breaks) */
+/* Specify the base URL that you copied from your files in OCI Object Storage in the define base_URL line below*/
+/* change idthydc0kinr to your real namespace. The name is case-sensitive. */
+/* change ADWCLab to your real bucket name. The name is case-sensitive. */
+/* change us-phoenix-1 to your real region name. The name is case-sensitive. */
+/* you can find these values on the OCI Console .. Storage .. Object Storage screen */
+set define on
+define base_URL='https://objectstorage.us-phoenix-1.oraclecloud.com/n/idthydc0kinr/b/ADWCLab/o'
+/* copy Channels table */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'CHANNELS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/chan_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+/* copy Countries table */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'COUNTRIES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/coun_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+/* Copy customers */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'CUSTOMERS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/cust1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SUPPLEMENTARY_DEMOGRAPHICS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/dem1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SALES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/dmsal_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'PRODUCTS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/prod1v3.dat',
+ format => json_object('delimiter' value '|', 'quote' value '^', 'ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'PROMOTIONS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/prom1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SALES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/sale1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'TIMES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/time_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'COSTS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/costs.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true')
+ );
+end;
+/
diff --git a/dev-ai-app-dev-transportation/build/images/23ai.png b/dev-ai-app-dev-transportation/build/images/23ai.png
new file mode 100644
index 000000000..c9d91565d
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/23ai.png differ
diff --git "a/dev-ai-app-dev-transportation/build/images/Screenshot 2025-09-26 at 11.46.48\342\200\257AM.png" "b/dev-ai-app-dev-transportation/build/images/Screenshot 2025-09-26 at 11.46.48\342\200\257AM.png"
new file mode 100644
index 000000000..c696dc570
Binary files /dev/null and "b/dev-ai-app-dev-transportation/build/images/Screenshot 2025-09-26 at 11.46.48\342\200\257AM.png" differ
diff --git a/dev-ai-app-dev-transportation/build/images/access.png b/dev-ai-app-dev-transportation/build/images/access.png
new file mode 100644
index 000000000..67d0f079c
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/access.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/adb-available.png b/dev-ai-app-dev-transportation/build/images/adb-available.png
new file mode 100644
index 000000000..83c42c2f8
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/adb-available.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/ai-recommendation.png b/dev-ai-app-dev-transportation/build/images/ai-recommendation.png
new file mode 100644
index 000000000..1a3d11e4e
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/ai-recommendation.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/ai-recommendations.png b/dev-ai-app-dev-transportation/build/images/ai-recommendations.png
new file mode 100644
index 000000000..394535199
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/ai-recommendations.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/app-home.png b/dev-ai-app-dev-transportation/build/images/app-home.png
new file mode 100644
index 000000000..9892728e1
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/app-home.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/ask-questions.png b/dev-ai-app-dev-transportation/build/images/ask-questions.png
new file mode 100644
index 000000000..15a417e81
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/ask-questions.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/atp.png b/dev-ai-app-dev-transportation/build/images/atp.png
new file mode 100644
index 000000000..09736ee76
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/atp.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/chunks-created.png b/dev-ai-app-dev-transportation/build/images/chunks-created.png
new file mode 100644
index 000000000..4854a1fda
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/chunks-created.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/click-streamlit.png b/dev-ai-app-dev-transportation/build/images/click-streamlit.png
new file mode 100644
index 000000000..33010d468
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/click-streamlit.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/click-url.png b/dev-ai-app-dev-transportation/build/images/click-url.png
new file mode 100644
index 000000000..d01516965
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/click-url.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/code-highlight-1.png b/dev-ai-app-dev-transportation/build/images/code-highlight-1.png
new file mode 100644
index 000000000..6ba9b90b8
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/code-highlight-1.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/code-highlight-2.png b/dev-ai-app-dev-transportation/build/images/code-highlight-2.png
new file mode 100644
index 000000000..01a6ccbdf
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/code-highlight-2.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/code-highlight-3.png b/dev-ai-app-dev-transportation/build/images/code-highlight-3.png
new file mode 100644
index 000000000..7d8a46504
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/code-highlight-3.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/code-highlight-4.png b/dev-ai-app-dev-transportation/build/images/code-highlight-4.png
new file mode 100644
index 000000000..21af6948c
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/code-highlight-4.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/code-highlight-5.png b/dev-ai-app-dev-transportation/build/images/code-highlight-5.png
new file mode 100644
index 000000000..ac81e25d9
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/code-highlight-5.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/code-highlight-6.png b/dev-ai-app-dev-transportation/build/images/code-highlight-6.png
new file mode 100644
index 000000000..bff8b9b5e
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/code-highlight-6.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/code-highlight-7.png b/dev-ai-app-dev-transportation/build/images/code-highlight-7.png
new file mode 100644
index 000000000..327343eb8
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/code-highlight-7.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/code-highlight-8.png b/dev-ai-app-dev-transportation/build/images/code-highlight-8.png
new file mode 100644
index 000000000..0c94f1b5a
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/code-highlight-8.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/connect-to-db.png b/dev-ai-app-dev-transportation/build/images/connect-to-db.png
new file mode 100644
index 000000000..1dfbf76c2
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/connect-to-db.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/connectto-db.png b/dev-ai-app-dev-transportation/build/images/connectto-db.png
new file mode 100644
index 000000000..c87b8650b
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/connectto-db.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/create-adb.png b/dev-ai-app-dev-transportation/build/images/create-adb.png
new file mode 100644
index 000000000..224b16bc2
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/create-adb.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/create-adb2.png b/dev-ai-app-dev-transportation/build/images/create-adb2.png
new file mode 100644
index 000000000..20fe1a66e
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/create-adb2.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/create-chunks.png b/dev-ai-app-dev-transportation/build/images/create-chunks.png
new file mode 100644
index 000000000..c1d69bec5
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/create-chunks.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/create-tables.png b/dev-ai-app-dev-transportation/build/images/create-tables.png
new file mode 100644
index 000000000..d0961e04e
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/create-tables.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/create-user-profile.png b/dev-ai-app-dev-transportation/build/images/create-user-profile.png
new file mode 100644
index 000000000..0130e9662
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/create-user-profile.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/create-vector.png b/dev-ai-app-dev-transportation/build/images/create-vector.png
new file mode 100644
index 000000000..e45c59ad8
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/create-vector.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/dbinit.png b/dev-ai-app-dev-transportation/build/images/dbinit.png
new file mode 100644
index 000000000..20b3bb2c2
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/dbinit.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/demo-db.png b/dev-ai-app-dev-transportation/build/images/demo-db.png
new file mode 100644
index 000000000..b7bad922b
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/demo-db.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/dev-env.png b/dev-ai-app-dev-transportation/build/images/dev-env.png
new file mode 100644
index 000000000..7f65f8193
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/dev-env.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/fetch-customer.png b/dev-ai-app-dev-transportation/build/images/fetch-customer.png
new file mode 100644
index 000000000..e26559026
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/fetch-customer.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/fetch-patient-data.png b/dev-ai-app-dev-transportation/build/images/fetch-patient-data.png
new file mode 100644
index 000000000..2c3881c7b
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/fetch-patient-data.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/generate-embeddings.png b/dev-ai-app-dev-transportation/build/images/generate-embeddings.png
new file mode 100644
index 000000000..738ea684c
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/generate-embeddings.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/generate-recommendation.png b/dev-ai-app-dev-transportation/build/images/generate-recommendation.png
new file mode 100644
index 000000000..01b802a62
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/generate-recommendation.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/generate-recommendations.png b/dev-ai-app-dev-transportation/build/images/generate-recommendations.png
new file mode 100644
index 000000000..3642a6ae8
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/generate-recommendations.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/jupyter-login.png b/dev-ai-app-dev-transportation/build/images/jupyter-login.png
new file mode 100644
index 000000000..c3ba1fde6
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/jupyter-login.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/jupyter-notebook.png b/dev-ai-app-dev-transportation/build/images/jupyter-notebook.png
new file mode 100644
index 000000000..23e7200ce
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/jupyter-notebook.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/launcher.png b/dev-ai-app-dev-transportation/build/images/launcher.png
new file mode 100644
index 000000000..81e4151c5
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/launcher.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/loan-recommendation.png b/dev-ai-app-dev-transportation/build/images/loan-recommendation.png
new file mode 100644
index 000000000..7839029aa
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/loan-recommendation.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/logical.png b/dev-ai-app-dev-transportation/build/images/logical.png
new file mode 100644
index 000000000..465a4d554
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/logical.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/login.png b/dev-ai-app-dev-transportation/build/images/login.png
new file mode 100644
index 000000000..93ca6436b
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/login.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/open-launcher.png b/dev-ai-app-dev-transportation/build/images/open-launcher.png
new file mode 100644
index 000000000..9b2b6ebdb
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/open-launcher.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/open-new-notebook.png b/dev-ai-app-dev-transportation/build/images/open-new-notebook.png
new file mode 100644
index 000000000..3749eb039
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/open-new-notebook.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/open-notebook.png b/dev-ai-app-dev-transportation/build/images/open-notebook.png
new file mode 100644
index 000000000..76c241f56
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/open-notebook.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/open-terminal.png b/dev-ai-app-dev-transportation/build/images/open-terminal.png
new file mode 100644
index 000000000..208f97dde
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/open-terminal.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/oracle-database.png b/dev-ai-app-dev-transportation/build/images/oracle-database.png
new file mode 100644
index 000000000..642d0dbfc
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/oracle-database.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/password.png b/dev-ai-app-dev-transportation/build/images/password.png
new file mode 100644
index 000000000..e770db461
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/password.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/patient-data.png b/dev-ai-app-dev-transportation/build/images/patient-data.png
new file mode 100644
index 000000000..69bea4b13
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/patient-data.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/physical.png b/dev-ai-app-dev-transportation/build/images/physical.png
new file mode 100644
index 000000000..a9183a5a3
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/physical.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/profile-updated.png b/dev-ai-app-dev-transportation/build/images/profile-updated.png
new file mode 100644
index 000000000..8e6b8110a
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/profile-updated.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/provisioning.png b/dev-ai-app-dev-transportation/build/images/provisioning.png
new file mode 100644
index 000000000..a04507757
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/provisioning.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/rag.png b/dev-ai-app-dev-transportation/build/images/rag.png
new file mode 100644
index 000000000..c363e0b5a
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/rag.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/run-script.png b/dev-ai-app-dev-transportation/build/images/run-script.png
new file mode 100644
index 000000000..1892833f1
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/run-script.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/shell-script.png b/dev-ai-app-dev-transportation/build/images/shell-script.png
new file mode 100644
index 000000000..a1069bc45
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/shell-script.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/start-demo.png b/dev-ai-app-dev-transportation/build/images/start-demo.png
new file mode 100644
index 000000000..904ada64a
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/start-demo.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/terminal.png b/dev-ai-app-dev-transportation/build/images/terminal.png
new file mode 100644
index 000000000..8636461a9
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/terminal.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/upload-document.png b/dev-ai-app-dev-transportation/build/images/upload-document.png
new file mode 100644
index 000000000..38555ba70
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/upload-document.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/user-profile-created.png b/dev-ai-app-dev-transportation/build/images/user-profile-created.png
new file mode 100644
index 000000000..d2a7054c2
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/user-profile-created.png differ
diff --git a/dev-ai-app-dev-transportation/build/images/workshop_notebook.png b/dev-ai-app-dev-transportation/build/images/workshop_notebook.png
new file mode 100644
index 000000000..f3706f232
Binary files /dev/null and b/dev-ai-app-dev-transportation/build/images/workshop_notebook.png differ
diff --git a/dev-ai-app-dev-transportation/cloud-login/cloud-login.md b/dev-ai-app-dev-transportation/cloud-login/cloud-login.md
new file mode 100644
index 000000000..2601085f5
--- /dev/null
+++ b/dev-ai-app-dev-transportation/cloud-login/cloud-login.md
@@ -0,0 +1,51 @@
+# Get started
+
+## Introduction
+
+In this lab, we will show you where you can find the login information and how to log in to the **SeerHoldings Healthcare Management application**.
+
+Estimated Time: 5 minutes
+
+### Objectives
+
+- Log-in to the application
+- Locate your LiveLabs Sandbox reservations
+
+## Task 1: View Login Information
+
+Right above the workshop instructions you can find two information:
+
+a. **View Login Info:** You can find credentials and other information to access the LiveLabs Sandbox
+
+b. **Time Remaining:** This shows you the remaining time before your access to the LiveLabs Sandbox expires. Please note: You may be able to extend the reservation time.
+
+
+
+## Task 2: Login to the Demo
+
+1. To access the demo environment, click **View Login Info** in the top left corner of the page. Click the **Start the Demo** link.
+
+ 
+
+2. Enter in a username, select the **Claims Officer** role, and click **Login**.
+
+ 
+
+3. Welcome to the SeerHoldings Healthcare Management application! Congratulations, you are now connected to the demo environment. You can now execute the different tasks and steps for the LiveLabs workshop.
+
+ 
+
+
+## Task 3: Find your LiveLabs Sandbox reservations
+
+If you close your browser, and you want to launch your workshop again, open [livelabs.oracle.com](https://livelabs.oracle.com), login using your Oracle account, and click on **My Reservations**. You can find here a complete history of all LiveLabs workshops you signed up for. Click on **Launch Workshop** to start a workshop with an existing LiveLabs Sandbox environment.
+
+
+
+You may now **proceed to the next lab**.
+
+## Acknowledgements
+
+- **Created By/Date** - Kamryn Vinson
+- **Contributor** - Linda Foinding
+- **Last Updated By/Date** - Linda Foinding, April 2025
\ No newline at end of file
diff --git a/dev-ai-app-dev-transportation/cloud-login/images/app-home.png b/dev-ai-app-dev-transportation/cloud-login/images/app-home.png
new file mode 100644
index 000000000..6cf6ab118
Binary files /dev/null and b/dev-ai-app-dev-transportation/cloud-login/images/app-home.png differ
diff --git a/dev-ai-app-dev-transportation/cloud-login/images/click-url.png b/dev-ai-app-dev-transportation/cloud-login/images/click-url.png
new file mode 100644
index 000000000..d01516965
Binary files /dev/null and b/dev-ai-app-dev-transportation/cloud-login/images/click-url.png differ
diff --git a/dev-ai-app-dev-transportation/cloud-login/images/demo-env.png b/dev-ai-app-dev-transportation/cloud-login/images/demo-env.png
new file mode 100644
index 000000000..3d5401336
Binary files /dev/null and b/dev-ai-app-dev-transportation/cloud-login/images/demo-env.png differ
diff --git a/dev-ai-app-dev-transportation/cloud-login/images/dev-env.png b/dev-ai-app-dev-transportation/cloud-login/images/dev-env.png
new file mode 100644
index 000000000..7f65f8193
Binary files /dev/null and b/dev-ai-app-dev-transportation/cloud-login/images/dev-env.png differ
diff --git a/dev-ai-app-dev-transportation/cloud-login/images/ll-reservations.png b/dev-ai-app-dev-transportation/cloud-login/images/ll-reservations.png
new file mode 100644
index 000000000..2e7150140
Binary files /dev/null and b/dev-ai-app-dev-transportation/cloud-login/images/ll-reservations.png differ
diff --git a/dev-ai-app-dev-transportation/cloud-login/images/login.png b/dev-ai-app-dev-transportation/cloud-login/images/login.png
new file mode 100644
index 000000000..0acc1ff72
Binary files /dev/null and b/dev-ai-app-dev-transportation/cloud-login/images/login.png differ
diff --git a/dev-ai-app-dev-transportation/cloud-login/images/start-demo.png b/dev-ai-app-dev-transportation/cloud-login/images/start-demo.png
new file mode 100644
index 000000000..2be9a0f28
Binary files /dev/null and b/dev-ai-app-dev-transportation/cloud-login/images/start-demo.png differ
diff --git a/dev-ai-app-dev-transportation/cloud-login/images/view-login-info.png b/dev-ai-app-dev-transportation/cloud-login/images/view-login-info.png
new file mode 100644
index 000000000..2bcf29e82
Binary files /dev/null and b/dev-ai-app-dev-transportation/cloud-login/images/view-login-info.png differ
diff --git a/dev-ai-app-dev-transportation/connect-to-env/connect-to-env.md b/dev-ai-app-dev-transportation/connect-to-env/connect-to-env.md
new file mode 100644
index 000000000..54b040ab1
--- /dev/null
+++ b/dev-ai-app-dev-transportation/connect-to-env/connect-to-env.md
@@ -0,0 +1,58 @@
+# Connect to the Development Environment
+
+## Introduction
+
+In this lab, you'll learn how to access the web-based Jupyter Lab development environment, where you can write and run Python code directly in your browser. You'll log in, create notebooks, and get ready to start coding in a hands-on environment.
+
+Estimated Time: 5 minutes
+
+### Objective
+
+* Login to JupyterLab
+
+## 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.
+
+ 
+
+2. Paste in the Development IDE Login Password that you copied in the previous step. Click **Login**.
+
+ 
+
+3. Click the blue "+". This will open the Launcher.
+
+ 
+
+## 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. Navigation is fast and intuitive, with breadcrumbs and context menus that surface relevant actions. Users can right-click files to access options like duplicate, shutdown kernel, or open with a specific editor.
+
+ **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, enabling command-line operations within the JupyterLab environment. These two tools form the core of most workflows, supporting both interactive analysis and system-level tasks from a single interface.
+
+ 
+
+## Task 3: Get familiar with Jupyter Notebooks
+
+You will use a Jupyter Notebook in JupyterLab to build and test the loan recommendation system. If you are new to notebooks, the following tips will help you get started and work smoothly.
+
+1. **Executing Code Blocks**: You can run code in two simple ways: press **Shift+Enter** to execute and move to the next cell, or click the **Play/Execute** button in the menu bar at the top of this tab. Both methods work interchangeably.
+
+2. **Block Types**: Instructions and code are separated into **their own blocks**. Instructions are in markdown (like this cell), while code is in executable Python blocks. If you accidentally run an instruction block, it’ll just skip to the next cell—no harm done!
+
+3. **Running Indicators**: When you run a code block, its label changes from `[ ]` (empty) or `[1]` (a number) to `[*]`. The asterisk (`*`) means it’s processing. Wait until it switches back to a number (e.g., `[2]`) before moving on, ensuring the operation is complete.
+
+4. **Output & Warnings**: Below each code cell, output appears after execution. This can include results, visualizations, or messages. Warnings may show up—these are usually informational, such as notices about deprecated features. Unless an error halts execution, users can continue without making changes. If you see a error, review the code for any issues and make changes accordingly and try executing the cell again.
+
+ 
+
+## Conclusion
+
+In this lab you logged into the **IDE Development Environment** for Jupyter Labs. You reviewed different elements from the environment like **File Browser** and **Launcher**. Lastly, you were introduced to concepts to allow you to get started running code smoothly like **executing code blocks** and **outputs and warnings**.
+
+## Acknowledgements
+* **Author** - Kamryn Vinson
+* **Contributors** - Linda Foinding, Francis Regalado, Kevin Lazarz
+* **Last Updated By/Date** - Uma Kumar, August 2025
diff --git a/dev-ai-app-dev-transportation/connect-to-env/files/starter-file.sql b/dev-ai-app-dev-transportation/connect-to-env/files/starter-file.sql
new file mode 100644
index 000000000..9d7e762e8
--- /dev/null
+++ b/dev-ai-app-dev-transportation/connect-to-env/files/starter-file.sql
@@ -0,0 +1,101 @@
+/* NOTE: Files cannot contain empty lines (line breaks) */
+/* Specify the base URL that you copied from your files in OCI Object Storage in the define base_URL line below*/
+/* change idthydc0kinr to your real namespace. The name is case-sensitive. */
+/* change ADWCLab to your real bucket name. The name is case-sensitive. */
+/* change us-phoenix-1 to your real region name. The name is case-sensitive. */
+/* you can find these values on the OCI Console .. Storage .. Object Storage screen */
+set define on
+define base_URL='https://objectstorage.us-phoenix-1.oraclecloud.com/n/idthydc0kinr/b/ADWCLab/o'
+/* copy Channels table */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'CHANNELS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/chan_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+/* copy Countries table */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'COUNTRIES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/coun_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+/* Copy customers */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'CUSTOMERS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/cust1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SUPPLEMENTARY_DEMOGRAPHICS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/dem1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SALES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/dmsal_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'PRODUCTS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/prod1v3.dat',
+ format => json_object('delimiter' value '|', 'quote' value '^', 'ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'PROMOTIONS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/prom1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SALES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/sale1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'TIMES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/time_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'COSTS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/costs.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true')
+ );
+end;
+/
diff --git a/dev-ai-app-dev-transportation/connect-to-env/images/block.png b/dev-ai-app-dev-transportation/connect-to-env/images/block.png
new file mode 100644
index 000000000..4f7f68297
Binary files /dev/null and b/dev-ai-app-dev-transportation/connect-to-env/images/block.png differ
diff --git a/dev-ai-app-dev-transportation/connect-to-env/images/dev-env.png b/dev-ai-app-dev-transportation/connect-to-env/images/dev-env.png
new file mode 100644
index 000000000..1e0837ad7
Binary files /dev/null and b/dev-ai-app-dev-transportation/connect-to-env/images/dev-env.png differ
diff --git a/dev-ai-app-dev-transportation/connect-to-env/images/jupyter-login.png b/dev-ai-app-dev-transportation/connect-to-env/images/jupyter-login.png
new file mode 100644
index 000000000..c3ba1fde6
Binary files /dev/null and b/dev-ai-app-dev-transportation/connect-to-env/images/jupyter-login.png differ
diff --git a/dev-ai-app-dev-transportation/connect-to-env/images/jupyter.png b/dev-ai-app-dev-transportation/connect-to-env/images/jupyter.png
new file mode 100644
index 000000000..29b0703dc
Binary files /dev/null and b/dev-ai-app-dev-transportation/connect-to-env/images/jupyter.png differ
diff --git a/dev-ai-app-dev-transportation/connect-to-env/images/launcher.png b/dev-ai-app-dev-transportation/connect-to-env/images/launcher.png
new file mode 100644
index 000000000..81e4151c5
Binary files /dev/null and b/dev-ai-app-dev-transportation/connect-to-env/images/launcher.png differ
diff --git a/dev-ai-app-dev-transportation/introduction/images/vectors-diagram.png b/dev-ai-app-dev-transportation/introduction/images/vectors-diagram.png
new file mode 100644
index 000000000..0156e2d8f
Binary files /dev/null and b/dev-ai-app-dev-transportation/introduction/images/vectors-diagram.png differ
diff --git a/dev-ai-app-dev-transportation/introduction/introduction.md b/dev-ai-app-dev-transportation/introduction/introduction.md
new file mode 100644
index 000000000..8aff1e5ab
--- /dev/null
+++ b/dev-ai-app-dev-transportation/introduction/introduction.md
@@ -0,0 +1,98 @@
+# Introduction
+
+## About this Workshop
+
+**Data is more than an asset—it’s the engine behind every smart decision, risk calculation and growth strategy. From real-time decision-making to risk management and innovation, success hinges on how well you harness it.**
+
+Generative AI and Oracle Database 23ai makes it possible to unlock deeper insights, faster—directly within your database.
+
+This hands-on lab introduces you to Generative AI and Vector Search in Oracle Database 23ai, allowing you to build real applications using multiple types of data - no setup required. You'll connect to the database using Python and the Mongo API, run queries, create JSON Duality Views, and implement AI Vector Search and retrieval-augmented generation (RAG). Explore guided use cases or experiment freely in a browser-based development environment.
+
+
+You will:
+ * Use **native Vector Search** to query and analyze structured data, documents, and images—without moving data across platforms.
+
+ * Combine your **enterprise data with large language models (LLMs)** using Retrieval-Augmented Generation (RAG) to answer natural language questions with context-aware accuracy.
+
+ * Automate real-world transportation workflows, like transportation load approvals, by **embedding and querying unstructured data** in real time.
+
+By the end of this workshop, you’ll understand how Oracle Database 23ai helps transportation organizations:
+
+ * ✅ Accelerate time-to-insight with centralized, AI-ready data
+
+ * ✅ Build intelligent apps without specialized AI infrastructure
+
+ * ✅ Drive data-driven decisions with consistent, governed access
+
+
+**Start building where your data already lives—with Oracle Database 23ai.**
+
+**Your next breakthrough is just a lab away!**
+
+
+#### ➡️ **Start with the demo! (Lab 1)**
+
+Check out the demo to see how Generative AI and Vector Search in the database, can operate against multiple types of data—empowering you to build real applications and make faster, smarter decisions. The best part? **No setup required**—just start with Lab 1 and follow the guide. You can explore guided use cases or experiment on your own using the demo application:
+
+ * ✅ Login as an LoadLoad-Planning Coordinator
+
+ * ✅ Review customers that have been recommended by the system to be approved or denied for a transportation load
+
+ * ✅ Upload information to a customer's profile
+
+#### ➡️ **Start coding! (Labs 2-4)**
+
+Lab 2 describes how to get access to our browser-based development environment. Make sure to check it out before continuing to Lab 3 and 4, where you will get hands-on and start interacting with Python with Oracle Database 23ai:
+
+ * ✅ Connect to the database using Python
+
+ * ✅ Run SQL queries with Python
+
+ * ✅ Create JSON Duality Views
+
+ * ✅ Connect to the database using a Mongo API driver
+
+ * ✅ Use the Mongo API to query and update data
+
+ * ✅ Implement AI Vector Search
+
+ * ✅ Implement retrieval-augmented generation (RAG) using Oracle Database 23ai
+
+#### ➡️ **Start experimenting! (Lab 5)**
+
+You can also experiment with the code in your own environment. The workshop environment is flexible and allows you try out different things: Start building your own version of the load approval application!
+
+ * ✅ Vectorize historical routes, weight limits, driver records, and customer windows.
+
+ * ✅ Verify the data was vectorized
+
+ * ✅ Implement a similarity search
+
+### Objectives
+
+* Learn how Oracle Database 23ai capabilities can be used to automate and enhance the transportation load approval process
+
+* Start coding with Python and Oracle's Python driver `oracledb`
+
+* Learn how to implement and interact with Oracle Database 23ai's new features using Python
+
+* Implement a working example of retrieval-augmented generation (RAG) using Oracle Database 23ai
+
+### Prerequisites
+
+This lab assumes you have:
+
+* An Oracle account to submit your a LiveLabs Sandbox reservation.
+
+* Basic knowledge of Python.
+
+* Basic knowledge of Oracle Database, i.e., how to run queries.
+
+## Learn More
+
+* [Oracle Database 23ai Documentation](https://docs.oracle.com/en/database/oracle/oracle-database/23/)
+
+## Acknowledgements
+* **Authors** - Ley Sylvester
+* **Contributors** - Kevin Lazarz, Linda Foinding, Noah Paul
+* **Last Updated By/Date** - Uma Kumar, August 2025
\ No newline at end of file
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/adb-ocid.png b/dev-ai-app-dev-transportation/local-tenancy/images/adb-ocid.png
new file mode 100644
index 000000000..63130cb3a
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/adb-ocid.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/adb-provisioned.png b/dev-ai-app-dev-transportation/local-tenancy/images/adb-provisioned.png
new file mode 100644
index 000000000..4eff376aa
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/adb-provisioned.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/adb-provisioning.png b/dev-ai-app-dev-transportation/local-tenancy/images/adb-provisioning.png
new file mode 100644
index 000000000..d8a36adb9
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/adb-provisioning.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/adb-workload-type.png b/dev-ai-app-dev-transportation/local-tenancy/images/adb-workload-type.png
new file mode 100644
index 000000000..7257da637
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/adb-workload-type.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/add-key.png b/dev-ai-app-dev-transportation/local-tenancy/images/add-key.png
new file mode 100644
index 000000000..d5941c3fb
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/add-key.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/begin-oci-menu.png b/dev-ai-app-dev-transportation/local-tenancy/images/begin-oci-menu.png
new file mode 100644
index 000000000..36b2feaf1
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/begin-oci-menu.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/chicago-region.png b/dev-ai-app-dev-transportation/local-tenancy/images/chicago-region.png
new file mode 100644
index 000000000..853d9d958
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/chicago-region.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/click-add-api-key.png b/dev-ai-app-dev-transportation/local-tenancy/images/click-add-api-key.png
new file mode 100644
index 000000000..7b1cbd842
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/click-add-api-key.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/click-generative-ai.png b/dev-ai-app-dev-transportation/local-tenancy/images/click-generative-ai.png
new file mode 100644
index 000000000..8ae6b4de4
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/click-generative-ai.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/compartment-name.png b/dev-ai-app-dev-transportation/local-tenancy/images/compartment-name.png
new file mode 100644
index 000000000..b69068773
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/compartment-name.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/compartment.png b/dev-ai-app-dev-transportation/local-tenancy/images/compartment.png
new file mode 100644
index 000000000..6704dfbd1
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/compartment.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/compartments.png b/dev-ai-app-dev-transportation/local-tenancy/images/compartments.png
new file mode 100644
index 000000000..42f4cbb40
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/compartments.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/configure-db.png b/dev-ai-app-dev-transportation/local-tenancy/images/configure-db.png
new file mode 100644
index 000000000..827a8b3d6
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/configure-db.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/connection-string.png b/dev-ai-app-dev-transportation/local-tenancy/images/connection-string.png
new file mode 100644
index 000000000..e79c085d1
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/connection-string.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/contact-email-field.png b/dev-ai-app-dev-transportation/local-tenancy/images/contact-email-field.png
new file mode 100644
index 000000000..4bfdcaba0
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/contact-email-field.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/copy-ocid.png b/dev-ai-app-dev-transportation/local-tenancy/images/copy-ocid.png
new file mode 100644
index 000000000..df42d94f5
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/copy-ocid.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/create-adb-button.png b/dev-ai-app-dev-transportation/local-tenancy/images/create-adb-button.png
new file mode 100644
index 000000000..5237ae7b9
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/create-adb-button.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/create-adb.png b/dev-ai-app-dev-transportation/local-tenancy/images/create-adb.png
new file mode 100644
index 000000000..70fdd2a97
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/create-adb.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/create-admin.png b/dev-ai-app-dev-transportation/local-tenancy/images/create-admin.png
new file mode 100644
index 000000000..77952a527
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/create-admin.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/create-policy.png b/dev-ai-app-dev-transportation/local-tenancy/images/create-policy.png
new file mode 100644
index 000000000..9a1f03bcb
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/create-policy.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/db-connection.png b/dev-ai-app-dev-transportation/local-tenancy/images/db-connection.png
new file mode 100644
index 000000000..8063844f2
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/db-connection.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/deployment-type-serverless.png b/dev-ai-app-dev-transportation/local-tenancy/images/deployment-type-serverless.png
new file mode 100644
index 000000000..553b8fdbf
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/deployment-type-serverless.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/env-credentials.png b/dev-ai-app-dev-transportation/local-tenancy/images/env-credentials.png
new file mode 100644
index 000000000..d5b75f66b
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/env-credentials.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/folder.png b/dev-ai-app-dev-transportation/local-tenancy/images/folder.png
new file mode 100644
index 000000000..e59dfdc11
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/folder.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/key-preview.png b/dev-ai-app-dev-transportation/local-tenancy/images/key-preview.png
new file mode 100644
index 000000000..f21e0af6d
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/key-preview.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/license.png b/dev-ai-app-dev-transportation/local-tenancy/images/license.png
new file mode 100644
index 000000000..b3a6acf9a
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/license.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/network-access.png b/dev-ai-app-dev-transportation/local-tenancy/images/network-access.png
new file mode 100644
index 000000000..19a9fd6a0
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/network-access.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/policies.png b/dev-ai-app-dev-transportation/local-tenancy/images/policies.png
new file mode 100644
index 000000000..f86a6ad58
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/policies.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/policy-info.png b/dev-ai-app-dev-transportation/local-tenancy/images/policy-info.png
new file mode 100644
index 000000000..d32f14a40
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/policy-info.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/policy.png b/dev-ai-app-dev-transportation/local-tenancy/images/policy.png
new file mode 100644
index 000000000..177659095
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/policy.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/private-key.png b/dev-ai-app-dev-transportation/local-tenancy/images/private-key.png
new file mode 100644
index 000000000..f3a7f4557
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/private-key.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/python-version-installed.png b/dev-ai-app-dev-transportation/local-tenancy/images/python-version-installed.png
new file mode 100644
index 000000000..ad73c3267
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/python-version-installed.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/python-version.png b/dev-ai-app-dev-transportation/local-tenancy/images/python-version.png
new file mode 100644
index 000000000..2dadcbaed
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/python-version.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/requirements.png b/dev-ai-app-dev-transportation/local-tenancy/images/requirements.png
new file mode 100644
index 000000000..5300ee500
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/requirements.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/select-atp.png b/dev-ai-app-dev-transportation/local-tenancy/images/select-atp.png
new file mode 100644
index 000000000..ba3960f93
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/select-atp.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/select-compartment.png b/dev-ai-app-dev-transportation/local-tenancy/images/select-compartment.png
new file mode 100644
index 000000000..202c7df5d
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/select-compartment.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/select-your-adb.png b/dev-ai-app-dev-transportation/local-tenancy/images/select-your-adb.png
new file mode 100644
index 000000000..5efaa65d1
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/select-your-adb.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/show-editor.png b/dev-ai-app-dev-transportation/local-tenancy/images/show-editor.png
new file mode 100644
index 000000000..f086a15fb
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/show-editor.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/tokens-keys.png b/dev-ai-app-dev-transportation/local-tenancy/images/tokens-keys.png
new file mode 100644
index 000000000..0e240715a
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/tokens-keys.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/images/virtual-environment.png b/dev-ai-app-dev-transportation/local-tenancy/images/virtual-environment.png
new file mode 100644
index 000000000..ce13f4032
Binary files /dev/null and b/dev-ai-app-dev-transportation/local-tenancy/images/virtual-environment.png differ
diff --git a/dev-ai-app-dev-transportation/local-tenancy/local-tenancy.md b/dev-ai-app-dev-transportation/local-tenancy/local-tenancy.md
new file mode 100644
index 000000000..b007c9347
--- /dev/null
+++ b/dev-ai-app-dev-transportation/local-tenancy/local-tenancy.md
@@ -0,0 +1,433 @@
+# How-to Run Application Locally
+
+## Introduction
+
+In this section, you will learn how to run the Seer Equities Loan Approval application locally. This guide is designed to walk you through the complete setup process—from provisioning required services to installing dependencies and launching the application on your local machine.
+
+The document is structured to help you meet all prerequisites, configure both the Autonomous 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 locally for development and testing, this step-by-step guide will ensure a smooth setup experience.
+
+Estimated Time: 20 minutes
+
+### Objectives
+
+By the end of this section, you will be able to:
+
+- Provision and connect to an Autonomous 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 local development and testing purposes. For production deployment, additional configuration and security hardening will be required.
+
+Let’s get started!
+
+
+## Task 1: Provision an Autonomous Database
+
+Before you can run the application, you need to provision an **Autonomous Database** and obtain the following connection details:
+
+* **Username**
+
+* **Password**
+
+* **Database Connection String (DB Connection)**
+
+1. Click the navigation menu in the upper left to show top level navigation choices.
+
+ 
+
+3. Click **Oracle Database** -> **Autonomous Database**.
+
+ 
+
+4. Click **Create Autonomous Database** to start the instance creation process.
+
+ 
+
+5. This brings up the **Create Autonomous Database** screen where you will specify the configuration of the instance. Provide basic information for the autonomous database:
+
+ **Display Name** - Enter a memorable name for the database for display purposes. For this lab, we used **SeerEquites**.
+ **Database Name** - Use letters and numbers only, starting with a letter. Maximum length is 14 characters. (Underscores not initially supported.) For this lab, we used **SeerEquites**.
+ **Compartment** - Select a compartment for the database from the drop-down list. In the example below, **LiveLabs-Demo** was created ahead of time and chosen.
+
+ 
+
+6. Choose a workload type. Select the workload type for your database. For this lab, we chose **Transaction Processing** as the workload type.
+
+ 
+
+7. Configure the database:
+
+ **Choose database version** - Select a database version from the available versions.
+ **Compute auto scaling** - Enable this option.
+
+ 
+8. Create administrator credentials. **We will need the DB Username and Password for our .env file later. Take note of these credentials.**
+
+ **Password** and **Confirm Password** - Specify the password for ADMIN user of the service instance. The password must meet the following requirements:
+ 1) The password must be between 12 and 30 characters long and must include at least one uppercase letter, one lowercase letter, and one numeric character.
+ 2) The password cannot contain the username.
+ 3) The password cannot contain the double quote (") character.
+ 4) The password must be different from the last 4 passwords used.
+ 5) The password must not be the same password that is set less than 24 hours ago.
+ 6) Re-enter the password to confirm it. Make a note of this password.
+
+ 
+
+9. Choose network access:
+
+ For this lab, accept the default, **Secure access from everywhere**.
+ If you want to allow traffic only from the IP addresses and VCNs you specify where access to the database from all public IPs or VCNs is blocked, select **Secure access from allowed IPs and VCNs only**.
+ If you want to restrict access to a private endpoint within an OCI VCN, select **Private endpoint access only**.
+ If the **Require mutual TLS (mTLS) authentication** option is selected, mTLS will be required to authenticate connections to your Autonomous Database. TLS connections allows Oracle Data Provider for .NET to connect to your Autonomous Database without a wallet. See the [documentation for network options](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/support-tls-mtls-authentication.html#GUID-3F3F1FA4-DD7D-4211-A1D3-A74ED35C0AF5) for options to allow TLS, or to require only mutual TLS (mTLS) authentication.
+
+ 
+
+10. Click **Create**.
+
+ 
+
+11. Your instance will begin provisioning. In a few minutes the state will turn from Provisioning to Available. At this point, your Autonomous Transaction Processing database is ready to use! Have a look at your instance's details here including its name, database version, CPU count and storage size.
+
+ 
+ Provisioning an Autonomous Database instance.
+
+ 
+ Autonomous Database instance successfully provisioned.
+
+## Task 2: Unzip the Code
+
+1. Unzip the application code to a directory of your choice on your local machine:
+
+
+ [**Application Code**] (https://objectstorage.us-ashburn-1.oraclecloud.com/p/fiiLFGXKlmgrZKSwKQkD2Wc7mf5b8OsPUmIsw4rNUPcbBO31Za8T1NNoGAf0l4_S/n/c4u04/b/livelabsfiles/o/developer-library/pages.zip)
+
+
+2. Navigate to the folder where the code is located.
+
+ cd /path/to/your/unzipped/code
+ 
+
+
+## Task 3: Install Python 3.9 or Higher
+
+To run the application, Python version 3.9 or higher is required. Follow the steps below to ensure Python is installed on your machine.
+
+1. Run the following command to check which version of Python is installed.
+
+ ````
+
+ python3 --version
+
+ ````
+ 
+
+2. If Python 3.9+ is not installed, download and install Python 3.9 or higher from the [**official website**](https://www.python.org/downloads/).
+
+ 
+
+## Task 4: Setting Up the Local Environment
+
+1. Create a Virtual Environment. It is recommended to create a virtual environment to isolate the dependencies. In your terminal, run the following command to create a virtual environment:
+
+
+ ````
+
+ python3 -m venv venv
+
+ ````
+
+ This will create a directory called venv that contains your virtual environment.
+
+
+2. Enable the Virtual Environment. Once the virtual environment is created, activate it using the following commands based on your operating system:
+
+ On macOS/Linux:
+
+ ````
+
+ source venv/bin/activate
+
+ ````
+
+ On Windows:
+
+ ````
+
+ .\\venv\\Scripts\\activate
+
+ ````
+
+ After activation, your terminal should show (venv) at the beginning of the line, indicating that the virtual environment is active.
+ 
+
+3. Install Streamlit and Dependencies. The application has a set of required dependencies that need to be installed. You can install them using the requirements.txt file.
+
+ Run the following commands to install all dependencies:
+
+ ````
+
+ pip install oci
+
+ ````
+
+ ````
+
+ pip install streamlit
+
+ ````
+
+ ````
+
+ pip freeze > requirements.txt
+
+ pip install -r requirements.txt
+
+ touch .env
+
+ vi .env
+ **Compartments**.
+
+ 
+
+10. Select your compartment.
+
+ 
+
+11. Copy your compartment OCID. Place the compartment OCID into your .env file.
+
+ 
+
+12. Paste this in as your endpoint url in the .env file:
+
+ ````
+
+ https://inference.generativeai.us-chicago-1.oci.oraclecloud.com
+ **Autonomous Database**.
+
+ 
+
+14. Select your Autonomous Database.
+
+ 
+
+15. Copy your Autonomous Database OCID. Paste it into your .env file.
+
+ 
+
+ You should now have all of the credentials for your .env file filled in.
+
+ 
+
+## Task 5: Setting Up OCI Generative AI Service
+
+1. Click **User Settings** -> **Tokens and Keys**.
+
+ 
+
+2. Click **Add API Key**.
+
+ 
+
+3. Choose **Generate API Key Pair**. Click **Download private key**.
+
+ 
+
+4. After downloading the private key. Click **Add**.
+
+ 
+
+5. Note the Fingerprint, Tenancy OCID, and User OCID from the page.
+
+ 
+
+6. Navigate back to your terminal and paste the following command in to create a config directory.
+
+ ````
+
+ mkdir -p ~/.oci
+
+ touch config
+
+ vi config
+ 💡Note: Replace all placeholders with your actual OCI credentials and key file path except region, which must be us-chicago.
+
+ ````
+
+ [DEFAULT]
+ user=[ocid1.user.oc1..exampleuniqueID]
+ fingerprint=[xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx]
+ key_file= [key_file=~/.oci/oci_api_key.pem]
+ tenancy=[ocid1.tenancy.oc1..exampleuniqueID]
+ region= us-chicago-1
+
+ allow any-user to manage generative-ai-family in compartment [compartment_name]
+ Replace [compartment\_name] with the name of your compartment.
+
+ 
+
+14. Click **Create**.
+
+ 
+
+OCI Generative AI is a fully managed service available via API to seamlessly integrate language models into a wide range of use cases, including writing assistance, summarization, analysis, and chat. You can quickly integrate OCI Generative AI with Autonomous Database to apply AI models to your data.
+
+15. Make sure you are in the US Midwest(Chicago) region:
+
+ 
+
+16. From the Console, open the Navigation menu and click **Analytics & AI**. Click **Generative AI**.
+
+ 
+
+## Task 6: Run the Application
+
+1. Now that everything is set up, you can start the application by running the following command:
+
+ ````
+
+ streamlit run 1-introduction.py
+
+ pip install oci
+ .
+
+* **Database Connection Errors**: Ensure that the database credentials in the .env file are correct and that you have access to the Autonomous 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 configurations 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**.
+
+## Acknowledgements
+
+- **Created By/Date** - Linda Foinding, Kevin Lazarz
+- **Contributor** - Kamryn Vinson
+- **Last Updated By/Date** - Kamryn Vinson, May 2025
\ No newline at end of file
diff --git a/dev-ai-app-dev-transportation/user-story/files/starter-file.sql b/dev-ai-app-dev-transportation/user-story/files/starter-file.sql
new file mode 100644
index 000000000..9d7e762e8
--- /dev/null
+++ b/dev-ai-app-dev-transportation/user-story/files/starter-file.sql
@@ -0,0 +1,101 @@
+/* NOTE: Files cannot contain empty lines (line breaks) */
+/* Specify the base URL that you copied from your files in OCI Object Storage in the define base_URL line below*/
+/* change idthydc0kinr to your real namespace. The name is case-sensitive. */
+/* change ADWCLab to your real bucket name. The name is case-sensitive. */
+/* change us-phoenix-1 to your real region name. The name is case-sensitive. */
+/* you can find these values on the OCI Console .. Storage .. Object Storage screen */
+set define on
+define base_URL='https://objectstorage.us-phoenix-1.oraclecloud.com/n/idthydc0kinr/b/ADWCLab/o'
+/* copy Channels table */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'CHANNELS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/chan_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+/* copy Countries table */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'COUNTRIES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/coun_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+/* Copy customers */
+begin
+ dbms_cloud.copy_data(
+ table_name =>'CUSTOMERS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/cust1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SUPPLEMENTARY_DEMOGRAPHICS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/dem1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SALES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/dmsal_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'PRODUCTS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/prod1v3.dat',
+ format => json_object('delimiter' value '|', 'quote' value '^', 'ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'PROMOTIONS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/prom1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'SALES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/sale1v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'TIMES',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/time_v3.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
+ );
+end;
+/
+begin
+ dbms_cloud.copy_data(
+ table_name =>'COSTS',
+ credential_name =>'OBJ_STORE_CRED',
+ file_uri_list =>'&base_URL/costs.dat',
+ format => json_object('ignoremissingcolumns' value 'true', 'dateformat' value 'YYYY-MM-DD', 'blankasnull' value 'true')
+ );
+end;
+/
diff --git a/dev-ai-app-dev-transportation/user-story/images/app-home.png b/dev-ai-app-dev-transportation/user-story/images/app-home.png
new file mode 100644
index 000000000..484e6d68d
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/app-home.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/code-highlight-1.png b/dev-ai-app-dev-transportation/user-story/images/code-highlight-1.png
new file mode 100644
index 000000000..decd21130
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/code-highlight-1.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/diana-approved-list.png b/dev-ai-app-dev-transportation/user-story/images/diana-approved-list.png
new file mode 100644
index 000000000..9a34c1125
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/diana-approved-list.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/diana-download-pdf.png b/dev-ai-app-dev-transportation/user-story/images/diana-download-pdf.png
new file mode 100644
index 000000000..3b5c22d26
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/diana-download-pdf.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/diana-save-status.png b/dev-ai-app-dev-transportation/user-story/images/diana-save-status.png
new file mode 100644
index 000000000..3c14e6654
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/diana-save-status.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/diana-select-option.png b/dev-ai-app-dev-transportation/user-story/images/diana-select-option.png
new file mode 100644
index 000000000..b1c00a64c
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/diana-select-option.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/diana-young-ai.png b/dev-ai-app-dev-transportation/user-story/images/diana-young-ai.png
new file mode 100644
index 000000000..c1432d563
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/diana-young-ai.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/diana-young-chatbot.png b/dev-ai-app-dev-transportation/user-story/images/diana-young-chatbot.png
new file mode 100644
index 000000000..cf26585f0
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/diana-young-chatbot.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/diana-young-decision.png b/dev-ai-app-dev-transportation/user-story/images/diana-young-decision.png
new file mode 100644
index 000000000..6c771498f
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/diana-young-decision.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/diana-young-download.png b/dev-ai-app-dev-transportation/user-story/images/diana-young-download.png
new file mode 100644
index 000000000..7bbbdd19d
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/diana-young-download.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/diana-young-recommendation.png b/dev-ai-app-dev-transportation/user-story/images/diana-young-recommendation.png
new file mode 100644
index 000000000..9382e57f0
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/diana-young-recommendation.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/diana-young.png b/dev-ai-app-dev-transportation/user-story/images/diana-young.png
new file mode 100644
index 000000000..6b50b1dca
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/diana-young.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/evan-scott.png b/dev-ai-app-dev-transportation/user-story/images/evan-scott.png
new file mode 100644
index 000000000..bb05644ef
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/evan-scott.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/expand-graph.png b/dev-ai-app-dev-transportation/user-story/images/expand-graph.png
new file mode 100644
index 000000000..5ec8ba768
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/expand-graph.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/george-baker-ai.png b/dev-ai-app-dev-transportation/user-story/images/george-baker-ai.png
new file mode 100644
index 000000000..459a4911b
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/george-baker-ai.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/george-baker-confirm.png b/dev-ai-app-dev-transportation/user-story/images/george-baker-confirm.png
new file mode 100644
index 000000000..9e70dc5bf
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/george-baker-confirm.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/george-baker-decision.png b/dev-ai-app-dev-transportation/user-story/images/george-baker-decision.png
new file mode 100644
index 000000000..bb966d191
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/george-baker-decision.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/george-baker-graph.png b/dev-ai-app-dev-transportation/user-story/images/george-baker-graph.png
new file mode 100644
index 000000000..70dfb4625
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/george-baker-graph.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/george-baker-save.png b/dev-ai-app-dev-transportation/user-story/images/george-baker-save.png
new file mode 100644
index 000000000..cebddc825
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/george-baker-save.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/george-baker.png b/dev-ai-app-dev-transportation/user-story/images/george-baker.png
new file mode 100644
index 000000000..7bee4c9df
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/george-baker.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/george-denied-list.png b/dev-ai-app-dev-transportation/user-story/images/george-denied-list.png
new file mode 100644
index 000000000..1531d2879
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/george-denied-list.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/george-download.png b/dev-ai-app-dev-transportation/user-story/images/george-download.png
new file mode 100644
index 000000000..b11b7037d
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/george-download.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/login.png b/dev-ai-app-dev-transportation/user-story/images/login.png
new file mode 100644
index 000000000..b608b3154
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/login.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/open-diana-pdf.png b/dev-ai-app-dev-transportation/user-story/images/open-diana-pdf.png
new file mode 100644
index 000000000..b567f840a
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/open-diana-pdf.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/open-george-pdf.png b/dev-ai-app-dev-transportation/user-story/images/open-george-pdf.png
new file mode 100644
index 000000000..255e3d54b
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/open-george-pdf.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/process-selected-pdf.png b/dev-ai-app-dev-transportation/user-story/images/process-selected-pdf.png
new file mode 100644
index 000000000..f3e97d922
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/process-selected-pdf.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/profile-updated.png b/dev-ai-app-dev-transportation/user-story/images/profile-updated.png
new file mode 100644
index 000000000..ac2920422
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/profile-updated.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/sample1.png b/dev-ai-app-dev-transportation/user-story/images/sample1.png
new file mode 100644
index 000000000..2d9ad4738
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/sample1.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/sample2.png b/dev-ai-app-dev-transportation/user-story/images/sample2.png
new file mode 100644
index 000000000..145c9d39c
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/sample2.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/start-demo.png b/dev-ai-app-dev-transportation/user-story/images/start-demo.png
new file mode 100644
index 000000000..708660e79
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/start-demo.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/images/upload-document.png b/dev-ai-app-dev-transportation/user-story/images/upload-document.png
new file mode 100644
index 000000000..0c2079450
Binary files /dev/null and b/dev-ai-app-dev-transportation/user-story/images/upload-document.png differ
diff --git a/dev-ai-app-dev-transportation/user-story/user-story.md b/dev-ai-app-dev-transportation/user-story/user-story.md
new file mode 100644
index 000000000..2aa8005c4
--- /dev/null
+++ b/dev-ai-app-dev-transportation/user-story/user-story.md
@@ -0,0 +1,231 @@
+# Run the Demo
+
+## Introduction
+
+Step into the role of a Load Planning Coordinator using an AI-driven dashboard built on Oracle Database 23ai. See how Generative AI, Vector Search, Graph Analytics, and JSON Duality Views automate weight checks, route feasibility, and driver-hour compliance, all in one data store without ETL.
+
+**Disclaimer**: Please note that your results may vary. The information provided is generated by OCI Generative AI services, and your outcomes may differ from those presented.
+
+Estimated Lab Time: 30 minutes
+
+### Objectives
+
+In this lab, you will:
+
+* Review how the Seer Transportation Load Approval app incorporates the use of JSON Duality Views, Graph analytics, and other converged database features, all 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. To access the demo environment, click **View Login Info** in the top left corner of the page. Click the **Start the Demo** link.
+
+ 
+
+2. Select **Transportation** under Industry and **Approval Officer** under Role. Enter in a username and click **Login**.
+
+ 
+
+3. Welcome to the Seer Transportation Load Approval application! Congratulations, you are now connected to the demo environment. You can now execute the different tasks for this Lab.
+
+ 
+
+## Task 2: Demo - Approving a Shipper with a low risk Route Feasibility Rating score
+
+In this first example, you will use the application to approve a shipper with a low risk route feasibility score. The first user on your to-do list is Diana Young from FreightMax.
+
+1. On the Dashboard page, from the pending review list, select the review button for **Diana Young**.
+
+ 
+
+2. Opening Diana Young’s profile reveals her transportation load approval request details—name, email, shipper ID, request ID, and transportation status. You will also be able to see detailed AI analysis on the shipper consisting of a comprehensive evaluation, and top 3 requests with approval probability.
+
+ 
+
+3. At the bottom of Diana Young’s profile, you will find the **AI Guru**—a chatbot built on Oracle Database 23ai and Vector search. When prompted, the system uses **RAG** to generate a response. It converts the question and energy data into embeddings, performs a similarity search, and then uses the **GenAI service** to turn the enriched context into a clear, natural language answer. If the shipper calls with a question, you can quickly enter it into the AI Guru to generate a relevant response.
+
+
+ **Copy** the question below into the AI chatbot and press **Enter**. What does the AI Guru respond?
+
+ ```text
+
+ Why was this request approved?
+
+ ```
+
+ 
+
+>💡 In Oracle Database 23ai, **AI Vector Search** allows you to combine your business data with a Large Language Model (LLM) to reduce hallucinations and get accurate answers from your data.
+
+4. Select the **Navigate To Shipper Decisions** button.
+
+ 
+
+ After navigating to the decisions page, the AI evaluation runs in the background. Transportation documents containing feeder information such as trailer capacity, driving hours, and route restrictions are stored in Oracle Database 23ai and modeled with JSON Duality Views. These documents are vectorized and searched using AI Vector Search to identify semantically relevant prior requests and compliance criteria. The results are passed to OCI Generative AI, which uses retrieval-augmented generation (RAG) to generate a natural-language explanation, formatted for both internal review and external communication.
+
+5. In the **Select Your Desired Option** section, the available options are displayed. If more data is needed, the reviewer can upload documents, add missing information, and trigger a re-evaluation. The system dynamically adjusts the recommendation, and generates a decision letter sent directly to the shipper.
+
+ 
+
+6. Select the AI-recommended authorization decision. In this example, that is **Approved**.
+
+ >Please note that your results may vary. The information provided is generated by OCI Generative AI services, and your outcomes may differ from those presented.
+
+ 
+
+7. Set the final authorization status to **Approved**, then click **Confirm Decision** to complete the process.
+
+ The authorization status has been updated to 'Approved' and saved to the shipper profile.
+
+ 
+
+8. Click the **Download Decision as PDF** button.
+
+ 
+
+9. Click **Download PDF**
+
+ 
+
+10. Display the message the shipper would see by opening the downloaded PDF.
+
+ 
+
+11. Click the **Return to Dashboard** button to navigate back to the Dashboard. Expand **View Approved Shippers**. We can see that Diana Young has been removed from the Pending Shippers list and has been added to the Approved Shippers list.
+
+ 
+
+**Task Summary**
+
+Once you select and save one of the 3 desired options recommended by the AI:
+
+✅ The shipper's load approval request is updated.
+
+✅ A finalized PDF decision document is generated.
+
+✅ The dashboard reflects the change in real-time — marking Diana as Approved.
+
+Congratulations, you have just approved your first shipper load! Proceed to the next task.
+
+## Task 3: Demo - Deny a shipper request
+In this example, you will navigate the application to review a customer and deny them as part of the exercise. The next user on your to-do list is George Baker.
+
+1. On the Dashboard page, from the pending review list, select the review button for **George Baker**.
+
+ 
+
+2. Opening George Baker’s profile displays his shipper history details. Within a few seconds, the AI automatically generates a suggested action. In this case, the system evaluates the profile and assigns it to “high risk” with explanations outlining key risk factors.
+
+ This shipper has:
+
+ * A route with a **road closure**
+ * A route with **a trip duration that exceeds their hours of service**
+ * A route with **significant traffic delays**
+
+ The AI evaluates the profile and suggests next steps. In this case, it recommends denying the request and also provides clear explanations on why the recommendation is to deny the request.
+
+ 
+
+3. Select the **Navigate to Shipper Decisions** button.
+
+ 
+
+>⁉️ **What are two reasons that the AI denied this request?**
+
+4. Expand **Interactive Graph: Shipment Requests & Routing** to view the graph.
+
+ 
+
+ On the decision page, the load approval coordinator can use **Interactive Graph: Shipment Request & Routing** to explore route paths in load approval scenarios. Built with **Oracle Graph**, this feature visually maps decisions and highlights important features of the request like the route analysis and compliance rules.
+
+ 
+
+>💡 In Oracle Database 23ai, **Property Graph** allows you to treat your data like a network of connected points, where each point (called a node) and each link (called an edge) has its own details or properties. This setup helps you run graph analytics, to find important connections or patterns, directly within the database.
+
+
+5. On the decisions page you can view the AI recommendation for George Baker. It shows the suggested action, comprehensive evaluation, and recommendations explanations.
+
+ 
+
+6. The authorization status is set to **REquest Info**. Click the dropdown and select **Denied**, then select **Confirm Decision** button.
+
+ The authorization status has been updated to 'Deny' and saved to the shipper profile.
+
+ 
+
+7. Press the **Download Decision PDF** button to save the AI responses and proceed to the final authorization disposition.
+
+ 
+
+8. Click the **Download PDF** button.
+
+ 
+
+9. Display the message the shipper would see by opening the downloaded PDF.
+
+ 
+
+10. Click the **Return to Dashboard** button to navigate back to the Dashboard. Expand **View Denied Shipper**. You will see that George Baker has been moved from the **Pending Shpippers** list to the **Denied Shippers** list.
+
+ 
+
+**Task Summary**
+
+Congratulations, you have finished reviewing a shipper that requires study! Proceed to the next task.
+
+## Task 4: Demo - Update shipper details
+
+Lastly, let’s explore how the system uses JSON Duality Views to handle profile updates. In this task, you will edit a shipper's details. In this example, the shipper was asked to submit updated lab results.
+
+1. On the Dashboard page, from the **Pending Shippers** list, select the review button for **Evan Scott**.
+
+ 
+
+2. We will upload a document to update the shipper's information. On the Shipper Details page, click the **Upload Document** button. The PDF file has been loaded. Then click the **Process PDF** button
+
+ 
+
+>💡 **JSON Duality Views** in 23ai let's you update unstructured data in an easy, high-level format while automatically handling the technical details behind the scenes. This makes it faster and simpler to work with messy data and connect it to structured systems.
+
+4. The shipper profile has been updated.
+
+ 
+
+**Task Summary**
+
+Once the document is uploaded:
+
+✅ The system automatically detects the new compliance data.
+
+✅ The profile will be updated with compliance documentation.
+
+✅ Thanks to JSON Transform and JSON Duality Views, only the relevant field is modified — leaving the rest of the profile UNTOUCHED.
+
+## Conclusion
+
+In conclusion our Transportation Load Approval App was able to leverage Oracle database 23ai technologies such as **AI Vector Search, Property Graph and JSON Duality Views** to:
+
+✅ Automate profile evaluations
+
+✅ Provide AI-driven transportation recommendations by using a RAG model powered by a Oracle Database 23ai's AI Vector Search and OCI Generative AI service
+
+✅ Enable seamless profile updates with JSON Duality Views
+
+✅ And empower transportation load approval coordinators with actionable insights through Operational Property Graphs
+
+By combining these advanced tools, the application enables faster, smarter decisions and delivers clear guidance on how shippers can improve their eligibility.
+
+**Next:** How about learning how the application was implemented in Python? Continue with the next labs and start developing!
+
+## Learn More
+
+* [Oracle Database 23ai Documentation](https://docs.oracle.com/en/database/oracle/oracle-database/23/)
+
+## Acknowledgements
+* **Authors** - Ley Sylvester
+* **Contributors** - Kevin Lazarz, Francis Regalado, Hanna Rakhsha, Noah Paul
+* **Last Updated By/Date** - Uma Kumar, September 2025
\ No newline at end of file
diff --git a/dev-ai-app-dev-transportation/workshops/sandbox/index.html b/dev-ai-app-dev-transportation/workshops/sandbox/index.html
new file mode 100644
index 000000000..aebbdda4a
--- /dev/null
+++ b/dev-ai-app-dev-transportation/workshops/sandbox/index.html
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+ Oracle LiveLabs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Oracle LiveLabs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev-ai-app-dev-transportation/workshops/sandbox/manifest.json b/dev-ai-app-dev-transportation/workshops/sandbox/manifest.json
new file mode 100644
index 000000000..e0efd3b00
--- /dev/null
+++ b/dev-ai-app-dev-transportation/workshops/sandbox/manifest.json
@@ -0,0 +1,41 @@
+{
+ "workshoptitle": "Build a GenAI App on Oracle Database 23ai – Transportation 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": "../../connect-to-env/connect-to-env.md"
+ },
+ {
+ "title": "Lab 3: Coding Basics on Oracle Database 23ai",
+ "description": "Some coding examples",
+ "filename": "https://oracle-livelabs.github.io/developer/dev-ai-app-dev-retail/codingbasics/codingbasics.md"
+ },
+ {
+ "title": "Lab 4: Step by Step - Implement RAG with Oracle Database 23ai",
+ "description": "This is a step-by-step guide showcasing how the demo instance is navigated",
+ "filename": "../../build/build.md"
+ },
+ {
+ "title": "Lab 5: Interact with Oracle Database 23ai through an MCP Server",
+ "description": "This is a step-by-step guide showcasing how the demo instance is navigated",
+ "filename": "https://oracle-livelabs.github.io/developer/dev-ai-app-dev-retail/mcp/mcp.md"
+ },
+ {
+ "title": "Need Help?",
+ "description": "Solutions to Common Problems and Directions for Receiving Live Help",
+ "filename": "https://oracle-livelabs.github.io/common/labs/need-help/need-help-freetier.md"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/dev-ai-app-dev-transportation/workshops/tenancy/index.html b/dev-ai-app-dev-transportation/workshops/tenancy/index.html
new file mode 100644
index 000000000..aebbdda4a
--- /dev/null
+++ b/dev-ai-app-dev-transportation/workshops/tenancy/index.html
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+ Oracle LiveLabs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Oracle LiveLabs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev-ai-app-dev-transportation/workshops/tenancy/manifest.json b/dev-ai-app-dev-transportation/workshops/tenancy/manifest.json
new file mode 100644
index 000000000..1c09880b1
--- /dev/null
+++ b/dev-ai-app-dev-transportation/workshops/tenancy/manifest.json
@@ -0,0 +1,96 @@
+{
+ "workshoptitle": "Build a GenAI App on Oracle Database 23ai – Healthcare 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": "../../connect-to-env/connect-to-env.md"
+ },
+ {
+ "title": "Lab 3: Start coding with Oracle Database 23ai",
+ "description": "Some coding examples",
+ "filename": "../../codingbasics/codingbasics.md"
+ },
+ {
+ "title": "Lab 4: Step by Step - Implement RAG with Oracle Database 23ai",
+ "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 Database 23ai",
+ "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://oracle-livelabs.github.io/common/labs/need-help/need-help-freetier.md"
+ }
+ ]
+}
\ No newline at end of file