Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
ca4c63d
Use CSS variables and redesign agent pages
pournasserian Mar 11, 2026
ad9a95e
Update 0-Agents/AgentsWebUI/Components/Pages/Agent14.razor
pournasserian Mar 11, 2026
0c6a4a5
Initial plan
Copilot Mar 11, 2026
5ecf839
Initial plan
Copilot Mar 11, 2026
b976cd9
Initial plan
Copilot Mar 11, 2026
1fe4341
Fix image path resolution using IWebHostEnvironment in Agent08.razor
Copilot Mar 11, 2026
60dbb2e
Scope global pre dark styling to .code-block class
Copilot Mar 11, 2026
6b2da16
Align API key config: support OpenRouter:ApiKey with OPEN_ROUTER_API_…
Copilot Mar 11, 2026
247dd72
Merge pull request #3 from pournasserian/copilot/sub-pr-1-again
pournasserian Mar 11, 2026
26a04de
Merge pull request #4 from pournasserian/copilot/sub-pr-1-another-one
pournasserian Mar 11, 2026
12784a3
Merge pull request #2 from pournasserian/copilot/sub-pr-1
pournasserian Mar 11, 2026
080ff1d
Initial plan
Copilot Mar 12, 2026
27b59fb
Initial plan
Copilot Mar 12, 2026
03318cb
Initial plan
Copilot Mar 12, 2026
9d42064
Add .btn-prompting CSS class and replace inline styles in prompting a…
Copilot Mar 12, 2026
9d608e9
Move hero icon font-size from inline style to CSS class with design t…
Copilot Mar 12, 2026
34266e1
Merge pull request #7 from pournasserian/copilot/sub-pr-1-another-one
pournasserian Mar 12, 2026
e8d79f8
Merge pull request #6 from pournasserian/copilot/sub-pr-1-again
pournasserian Mar 12, 2026
c18522a
Merge pull request #5 from pournasserian/copilot/sub-pr-1
pournasserian Mar 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions 0-Agents/AgentsWebUI/Components/Layout/MainLayout.razor.css
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,21 @@ main {
}

.sidebar {
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
background-image: linear-gradient(180deg, var(--color-sidebar-start, #052767) 0%, var(--color-sidebar-end, #3a0647) 70%);
}

.top-row {
background-color: #f7f7f7;
border-bottom: 1px solid #d6d5d5;
background-color: var(--color-surface-alt, #f7f7f7);
border-bottom: 1px solid var(--color-border, #d6d5d5);
justify-content: flex-end;
height: 3.5rem;
height: var(--toprow-height, 3.5rem);
display: flex;
align-items: center;
}

.top-row ::deep a, .top-row ::deep .btn-link {
white-space: nowrap;
margin-left: 1.5rem;
margin-left: var(--space-6, 1.5rem);
text-decoration: none;
}

Expand Down Expand Up @@ -52,7 +52,7 @@ main {
}

.sidebar {
width: 250px;
width: var(--sidebar-width, 250px);
height: 100vh;
position: sticky;
top: 0;
Expand Down
28 changes: 8 additions & 20 deletions 0-Agents/AgentsWebUI/Components/Layout/NavMenu.razor
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

@* 🚀 Basics *@
<div class="nav-item px-3">
<div class="nav-category-header" style="color: #0d6efd;">🚀 BASICS</div>
<div class="nav-category-header" style="color: var(--color-cat-basics);">🚀 BASICS</div>
<NavLink class="nav-link" href="agent01">Basic</NavLink>
<NavLink class="nav-link" href="agent02">Threads</NavLink>
<NavLink class="nav-link" href="agent05">Structured Output</NavLink>
Expand All @@ -30,7 +30,7 @@

@* 🔧 Functions & Tools *@
<div class="nav-item px-3">
<div class="nav-category-header" style="color: #198754;">🔧 FUNCTIONS &amp; TOOLS</div>
<div class="nav-category-header" style="color: var(--color-cat-functions);">🔧 FUNCTIONS &amp; TOOLS</div>
<NavLink class="nav-link" href="agent03">Functions/Tools</NavLink>
<NavLink class="nav-link" href="agent04">Function Approval</NavLink>
<NavLink class="nav-link" href="agent10">Agent as Function</NavLink>
Expand All @@ -41,7 +41,7 @@

@* 💾 Storage & Persistence *@
<div class="nav-item px-3">
<div class="nav-category-header" style="color: #087990;">💾 STORAGE &amp; PERSISTENCE</div>
<div class="nav-category-header" style="color: var(--color-cat-storage);">💾 STORAGE &amp; PERSISTENCE</div>
<NavLink class="nav-link" href="agent06">Persisted Conversation</NavLink>
<NavLink class="nav-link" href="agent07">Custom Thread Storage</NavLink>
<NavLink class="nav-link" href="agent11">Chat Reduction</NavLink>
Expand All @@ -51,7 +51,7 @@

@* 🌐 Multimodal & External *@
<div class="nav-item px-3">
<div class="nav-category-header" style="color: #6f42c1;">🌐 MULTIMODAL &amp; EXTERNAL</div>
<div class="nav-category-header" style="color: var(--color-cat-multimodal);">🌐 MULTIMODAL &amp; EXTERNAL</div>
<NavLink class="nav-link" href="agent08">Using Image</NavLink>
<NavLink class="nav-link" href="agent09">Using MCP Server</NavLink>
<NavLink class="nav-link" href="agent12">Background Responses</NavLink>
Expand All @@ -61,47 +61,35 @@

@* ⚡ Advanced Features *@
<div class="nav-item px-3">
<div class="nav-category-header" style="color: #fd7e14;">⚡ ADVANCED FEATURES</div>
<div class="nav-category-header" style="color: var(--color-cat-advanced);">⚡ ADVANCED FEATURES</div>
<NavLink class="nav-link" href="agent14">Middleware</NavLink>
<NavLink class="nav-link" href="agent15">Declarative Agent</NavLink>
<NavLink class="nav-link" href="agent16">Reasoning</NavLink>
</div>

<hr class="nav-divider" />
<div class="nav-category-header" style="color: #e83e8c;">
<span>🧠</span> PROMPTING STRATEGIES
</div>

@* 🧠 Prompting Strategies *@
<div class="nav-item px-3">
<div class="nav-category-header" style="color: var(--color-cat-prompting);">🧠 PROMPTING STRATEGIES</div>
<NavLink class="nav-link" href="agent17">
<span class="nav-icon">🔗</span> Chain-of-Thought
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="agent18">
<span class="nav-icon">🌳</span> Tree of Thoughts
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="agent19">
<span class="nav-icon">🕸️</span> Graph of Thoughts
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="agent20">
<span class="nav-icon">💻</span> Program of Thoughts
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="agent21">
<span class="nav-icon">⚡</span> ReAct
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="agent22">
<span class="nav-icon">🪞</span> Reflection
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="agent23">
<span class="nav-icon">✨</span> Self-Refine
</NavLink>
Expand Down
25 changes: 13 additions & 12 deletions 0-Agents/AgentsWebUI/Components/Layout/NavMenu.razor.css
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,13 @@
}

.top-row {
min-height: 3.5rem;
min-height: var(--toprow-height, 3.5rem);
background-color: rgba(0,0,0,0.4);
}

.navbar-brand {
font-size: 1.1rem;
font-size: var(--font-size-lg, 1.1rem);
font-weight: var(--font-weight-semibold, 600);
}

.bi {
Expand All @@ -47,23 +48,23 @@
}

.nav-item {
font-size: 0.9rem;
padding-bottom: 0.5rem;
font-size: var(--font-size-sm, 0.875rem);
padding-bottom: var(--space-2, 0.5rem);
}

.nav-item:first-of-type {
padding-top: 1rem;
padding-top: var(--space-4, 1rem);
}

.nav-item:last-of-type {
padding-bottom: 1rem;
padding-bottom: var(--space-4, 1rem);
}

.nav-item ::deep .nav-link {
color: #d7d7d7;
background: none;
border: none;
border-radius: 4px;
border-radius: var(--radius-md, 4px);
height: 3rem;
display: flex;
align-items: center;
Expand Down Expand Up @@ -99,20 +100,20 @@
display: block;

/* Allow sidebar to scroll for tall menus */
height: calc(100vh - 3.5rem);
height: calc(100vh - var(--toprow-height, 3.5rem));
overflow-y: auto;
}
}

/* ─── NavMenu Category Headers ─────────────────────────────────────────── */

.nav-category-header {
font-size: 0.7rem;
font-weight: 700;
font-size: var(--font-size-xs, 0.7rem);
font-weight: var(--font-weight-bold, 700);
letter-spacing: 0.08em;
text-transform: uppercase;
padding: 0.5rem 0 0.25rem 0;
/* colour is set inline per category */
padding: var(--space-2, 0.5rem) 0 var(--space-1, 0.25rem) 0;
/* color is set inline per category using CSS variable: style="color: var(--color-cat-*)" */
pointer-events: none;
user-select: none;
}
Expand Down
88 changes: 64 additions & 24 deletions 0-Agents/AgentsWebUI/Components/Pages/Agent01.razor
Original file line number Diff line number Diff line change
@@ -1,36 +1,76 @@
@page "/agent01"
@inject IConfiguration Configuration

<PageTitle>Agent 01</PageTitle>
<PageTitle>Agent 01 – Basic Agent</PageTitle>

<h1>Agent 01 - Basic Agent</h1>

<p>Demonstrates basic AI agent setup allowing users to configure instructions and messages, with Submit and Stream buttons for synchronous and real-time responses using OpenAI GPT-4.1-nano via OpenRouter.</p>

<div class="form-group mb-3">
<label>Instructions</label>
<InputTextArea @bind-Value="instructions" class="form-control"></InputTextArea>
</div>
<div class="form-group mb-3">
<label>Message</label>
<InputTextArea @bind-Value="message" class="form-control"></InputTextArea>
</div>
<div class="form-group mb-3">
<button type="submit" class="btn btn-primary" disabled="@isLoading" onclick="@OnSubmit">Submit</button>
<button type="submit" class="btn btn-primary" disabled="@isLoading" onclick="@OnSubmitStream">Stream</button>
<div class="page-header">
<h1 class="page-title">🤖 Agent 01 – Basic Agent</h1>
<p class="page-subtitle">Demonstrates basic AI agent setup allowing users to configure instructions and messages, with Submit and Stream buttons for synchronous and real-time responses using OpenAI GPT-4.1-nano via OpenRouter.</p>
</div>

@if (!string.IsNullOrEmpty(response))
{
<div class="agent-layout layout-4-8">

<!-- Left: Config Panel -->
<div>
<div class="mb-3 card">
<div class="card panel panel-config mb-4">
<div class="card-header">⚙️ Configuration</div>
<div class="card-body">
<h5 class="card-title">Response</h5>
<p class="card-text">@response</p>
<div class="mb-3">
<label class="form-label">Instructions</label>
<InputTextArea @bind-Value="instructions" class="form-control instructions-input"></InputTextArea>
</div>
<div class="mb-3">
<label class="form-label">Message</label>
<InputTextArea @bind-Value="message" class="form-control message-input"></InputTextArea>
</div>
<div class="d-flex gap-2 flex-wrap">
<button class="btn btn-primary" disabled="@isLoading" @onclick="OnSubmit">
@(isLoading ? "Running..." : "🚀 Submit")
</button>
<button class="btn btn-outline-primary" disabled="@isLoading" @onclick="OnSubmitStream">
@(isLoading ? "Streaming..." : "📡 Stream")
</button>
</div>
</div>
</div>
</div>
}

<!-- Right: Result Panel -->
<div>
@if (isLoading && string.IsNullOrEmpty(response))
{
<div class="card panel panel-result mb-4">
<div class="card-header">💬 Response</div>
<div class="card-body">
<p class="response-pending">
<span class="streaming-indicator" aria-label="Processing">
<span></span><span></span><span></span>
</span>
Waiting for response...
</p>
</div>
</div>
}
@if (!string.IsNullOrEmpty(response))
{
<div class="card panel panel-result mb-4">
<div class="card-header">
💬 Response
@if (isLoading)
{
<span class="streaming-indicator ms-2" aria-label="Streaming">
<span></span><span></span><span></span>
</span>
}
</div>
<div class="card-body">
<div class="response-text">@response</div>
</div>
</div>
}
</div>

</div>

@code {
private string message = "Tell me a long joke about a pirate. It should be at least two pargraphs.";
Expand All @@ -44,8 +84,8 @@

protected override Task OnInitializedAsync()
{
var apiKey = Configuration["OPEN_ROUTER_API_KEY"] ??
throw new InvalidOperationException("OPEN_ROUTER_API_KEY is not set in.");
var apiKey = Configuration["OpenRouter:ApiKey"] ?? Configuration["OPEN_ROUTER_API_KEY"] ??
throw new InvalidOperationException("OpenRouter:ApiKey (or OPEN_ROUTER_API_KEY) is not configured.");

var openAIClientOptions = new OpenAIClientOptions
{
Expand Down
Loading