Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 2 additions & 2 deletions _config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -122,9 +122,9 @@ assets:
env: # [development | production]

pwa:
enabled: true # The option for PWA feature (installable)
enabled: false # The option for PWA feature (installable)
cache:
enabled: true # The option for PWA offline cache
enabled: false # The option for PWA offline cache
# Paths defined here will be excluded from the PWA cache.
# Usually its value is the `baseurl` of another website that
# shares the same domain name as the current website.
Expand Down
11 changes: 10 additions & 1 deletion _data/authors.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,16 @@ jpad5:
email: jaypadimiti@microsoft.com # Optional
avatar: https://github.com/jaypadimiti.png # Optional: path to avatar image

hasharaf:
name: Hazim SharafelDin
email: Hazim.SharafelDin@microsoft.com # Optional
avatar: https://github.com/hasharaf.png # Optional: path to avatar image

chrisgarty:
name: Chris Garty
email: chris.garty@microsoft.com # Optional
avatar: https://github.com/chrisgarty.png # Optional: path to avatar image
kaul-vineet:
name: Vineet Kaul
email: vineetkaul@microsoft.com # Optional
avatar: https://github.com/kaul-vineet.png # Optional: path to avatar image
avatar: https://github.com/kaul-vineet.png # Optional: path to avatar image
3 changes: 2 additions & 1 deletion _data/origin/cors.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,9 @@ fontawesome:

# Algolia InstantSearch (replaces Simple Jekyll Search)
# Using algoliasearch@4 UMD build for browser compatibility
# Simple Jekyll Search loaded as fallback
search:
js: https://cdn.jsdelivr.net/npm/algoliasearch@4.24.0/dist/algoliasearch-lite.umd.js,https://cdn.jsdelivr.net/npm/instantsearch.js@4.74.2/dist/instantsearch.production.min.js
js: https://cdn.jsdelivr.net/npm/algoliasearch@4.24.0/dist/algoliasearch-lite.umd.js,https://cdn.jsdelivr.net/npm/instantsearch.js@4.74.2/dist/instantsearch.production.min.js,https://cdn.jsdelivr.net/npm/simple-jekyll-search@1.10.0/dest/simple-jekyll-search.min.js
css: https://cdn.jsdelivr.net/npm/instantsearch.css@8/themes/reset-min.css

mermaid:
Expand Down
107 changes: 23 additions & 84 deletions _includes/search-loader.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,91 +3,30 @@
Replaces Simple Jekyll Search with Algolia-powered search
-->

{% capture result_elem %}
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header>
<h2><a href="{url}">{title}</a></h2>
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
{categories}
{tags}
</div>
</header>
<p>{content}</p>
</article>
{% endcapture %}

{% capture not_found %}<p class="mt-5">{{ site.data.locales[include.lang].search.no_results }}</p>{% endcapture %}

<script>

function initializeAlgoliaSearch() {
const appId = '{{ site.algolia.application_id }}';
const apiKey = '{{ site.algolia.search_only_api_key }}';
const indexName = '{{ site.algolia.index_name }}';

if (typeof algoliasearch === 'undefined' || typeof instantsearch === 'undefined') {
setTimeout(initializeAlgoliaSearch, 100);
return;
}

if (!appId || !apiKey || !indexName) {
console.error('Algolia credentials missing');
return;
}

const searchClient = algoliasearch(appId, apiKey);
const search = instantsearch({
indexName: indexName,
searchClient: searchClient,
});

const renderSearchBox = (renderOptions, isFirstRender) => {
const { refine } = renderOptions;
if (isFirstRender) {
const input = document.getElementById('search-input');
if (input) {
input.addEventListener('input', (e) => {
refine(e.target.value);
});
}
}
};
const customSearchBox = instantsearch.connectors.connectSearchBox(renderSearchBox);

const renderHits = (renderOptions) => {
const { hits } = renderOptions;
const container = document.getElementById('search-results');
if (!container) return;

const baseUrl = '{{ site.baseurl }}';
container.innerHTML = hits.length
? hits.map(hit => `
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header>
<h2><a href="${baseUrl}${hit.url}">${instantsearch.highlight({ hit, attribute: 'title' })}</a></h2>
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${hit.categories && hit.categories.length ? `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${Array.isArray(hit.categories) ? hit.categories.join(', ') : hit.categories}</div>` : ''}
${hit.tags && hit.tags.length ? `<div><i class="fa fa-tag fa-fw"></i>${Array.isArray(hit.tags) ? hit.tags.join(', ') : hit.tags}</div>` : ''}
</div>
</header>
<p>${instantsearch.snippet({ hit, attribute: 'content' }) || instantsearch.snippet({ hit, attribute: 'excerpt' }) || hit.content || hit.excerpt || ''}</p>
</article>
`).join('')
: '{{ not_found | strip_newlines }}';
};
const customHits = instantsearch.connectors.connectHits(renderHits);

search.addWidgets([
customSearchBox({}),
customHits({}),
instantsearch.widgets.poweredBy({
container: '#algolia-poweredby',
theme: document.documentElement.getAttribute('data-mode') === 'dark' ? 'dark' : 'light'
})
]);

search.start();

const observer = new MutationObserver(() => {
const poweredBy = document.querySelector('#algolia-poweredby .ais-PoweredBy');
if (poweredBy) {
const isDark = document.documentElement.getAttribute('data-mode') === 'dark';
document.getElementById('algolia-poweredby').classList.toggle('dark-theme', isDark);
}
});
observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-mode'] });
}

if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initializeAlgoliaSearch);
} else {
initializeAlgoliaSearch();
}
window.searchConfig = {
appId: '{{ site.algolia.application_id }}',
apiKey: '{{ site.algolia.search_only_api_key }}',
indexName: '{{ site.algolia.index_name }}',
baseUrl: '{{ site.baseurl }}',
jsonUrl: "{{ '/assets/js/data/search.json' | relative_url }}",
resultTemplate: '{{ result_elem | strip_newlines }}',
noResultsText: '{{ not_found | strip_newlines }}'
};
</script>
<script defer src="{{ '/assets/js/search-loader.js' | relative_url }}"></script>
88 changes: 88 additions & 0 deletions _posts/2026-01-24-conversationid-users.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
---
layout: post
title: "How to Get Your Conversation ID When Chatting with Agents"
date: 2026-01-24 00:00:00 +0000
categories: [copilot-studio, generative-ai]
tags: [conversationid, troubleshooting, support, debugging]
description: A guide for end-users about how to get a Conversation ID to get help quickly with Copilot Studio agents in Microsoft 365 Copilot, Microsoft Teams, web chat, and other chat surfaces
author: chrisgarty
image:
path: /assets/posts/conversationID-users/conversation-id-cat-user.jpg
alt: "An end user with a cat avatar holds a receipt showing their Conversation ID"
no_bg: true
---

## TLDR: Getting a Conversation ID
- **Custom agents**: Use **`/debug conversationid`** command
- **Declarative agents**: Use **`/debug`** command

## Why are Conversation IDs important?

If you are chatting with an agent and something goes wrong, how do you point at the exact chat that had the problem? Enter the **Conversation ID** - your receipt for that specific chat session.

## What is a Conversation ID?

A Conversation ID is a unique identifier (GUID) that tracks a specific chat session with an agent. Think of it like a tracking number for a package that helps support teams, makers, and administrators locate and investigate exactly what happened during your interaction.

Example format: `0c4ebb21-3f74-4df4-b191-812aea31273d`

## Different agent types

In the Copilot Studio and Microsoft 365 Copilot ecosystem, there are two types of agents you might encounter and they have different mechanisms for retrieving a Conversation ID:

- **[Custom agents](https://learn.microsoft.com/microsoft-365-copilot/extensibility/overview-custom-engine-agent)** - Built using Copilot Studio with custom logic in topics, workflows, integrations, broad channel support, and a choice of models, as well as specific instructions and knowledge
- **[Declarative agents](https://learn.microsoft.com/microsoft-365-copilot/extensibility/overview-declarative-agent)** - Built in Agent Builder and Copilot Studio to extend Microsoft 365 Copilot with specific instructions, knowledge, and additional capabilities

## How to obtain your Conversation ID

### Custom agents

1. When chatting with an agent in M365 Copilot Chat, Teams, or another chat experience...
2. Type: **`/debug conversationid`**
3. The agent will show Conversation ID in the chat

#### M365 Copilot chat
![Custom agent in M365 Copilot chat displaying a Conversation ID](/assets/posts/conversationID-users/m365-copilot-debug-conversationid.png){: .shadow w="700" h="400"}
_Custom agent in M365 Copilot chat displaying a Conversation ID_

#### Teams chat
![Custom agent in Teams chat displaying a Conversation ID](/assets/posts/conversationID-users/microsoft-teams-debug-conversationid.png){: .shadow w="700" h="400"}
_Custom agent in Teams chat displaying a Conversation ID_

#### Custom web chat
![Custom agent in custom webchat displaying a Conversation ID](/assets/posts/conversationID-users/custom-webchat-debug-conversationid.png){: .shadow w="700" h="400"}
_Custom agent in custom webchat displaying a Conversation ID_

### Declarative agents

1. When chatting with an agent in M365 Copilot Chat...
2. Type: **`/debug`**
3. The agent will show a debugging card that includes the **Conversation ID**

#### M365 Copilot chat with declarative agent
![Declarative agent in M365 Copilot chat displaying a Conversation ID](/assets/posts/conversationID-users/declarative-agent-debug-conversationid.png){: .shadow w="700" h="400"}
_Declarative agent in M365 Copilot chat displaying a Conversation ID_

## What to send to your maker/admin (copy/paste)
Put this in the email/ticket/request:

- **Conversation ID:**
- **Where and when you used the agent:** (M365 Copilot / Teams / Website)
- **What you expected vs what happened:**

## Who can access conversation details?

Access to the full conversation content requires proper permissions:
- **Makers** can view conversations for agents they own
- **Admins** can access conversations based on their assigned roles (environment admin, platform admin, tenant admin, etc.)
- **Support staff** need appropriate data access permissions

## What's Next?

This guide focused on helping you, as a user, get your Conversation ID when you need support or want to track your interactions.

I'm planning future posts on Conversation IDs for maker and admin audiences:
- **For makers**: How to find and use Conversation IDs when building and debugging agents in Copilot Studio
- **For admins**: Using Conversation IDs for governance, compliance, and support in your organization

**Is this helpful?** Drop a comment below if you'd like to see these posts, or if there are other related topics you'd like covered!
56 changes: 56 additions & 0 deletions _posts/2026-01-26-meeting-transcript-analyzer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
---
layout: post
title: "VIDEO: Retrieve Meeting Transcripts in Copilot Studio & Block Focus Time"
date: 2026-01-26 9:00:00 +0100
categories: [copilot-studio, autonomous-agents, video]
tags: [microsoft-teams, outlook, meeting-transcripts, productivity, tutorial]
description: Watch an autonomous agent analyze your daily meeting transcripts and automatically block focus time for open action items.
author: giorgioughini
image:
path: /assets/posts/meeting-transcript-analyzer/header.png
alt: "Autonomous agent analyzing meeting transcripts visualization"
---

> **Heads up**: This is a **video-first** tutorial. The post provides the scenario context, but the real action is in the recording below.
{: .prompt-info }

We all face the same challenge: back-to-back meetings leave us with a pile of action items and no time to do them. By the time the day ends, we often forget half of what we promised to deliver.

This video demonstrates a powerful solution using an **autonomous agent in Copilot Studio**.

Instead of manually reviewing recordings or notes, I'll show you an agent designed to handle the post-meeting workload for you.

## The Scenario

In this video, we deploy an autonomous agent that runs automatically at the end of every working day. Its workflow is simple yet impactful:

1. **Retrieves Transcripts**: The agent fetches all Microsoft Teams meeting transcripts for the specific day.
2. **Analyzes Content**: It reviews each transcript to identify open points, action items, and clear takeaways.
3. **Determines Effort**: Using its intelligence, the agent estimates the effort required to complete each task.
4. **Takes Action**: If there are significant open points requiring deep work, the agent uses the **Outlook connector** to find available slots and block time in the user's calendar specifically for addressing those items.

Enjoy the video!

---

## Watch the demonstration

{% include embed/video.html
src='https://github.com/GiorgioUghini/WebVideos/releases/download/video-2-1.0.0/Meeting.Transcript.Analyzer.mp4'
poster='/assets/posts/meeting-transcript-analyzer/header-video.png'
title='Video: Autonomous Agent for Meeting Analysis and Calendar Management'
autoplay=false
loop=false
muted=false
%}

> Tip: Watch how the agent reasons over the transcript data to make scheduling decisions autonomously.
{: .prompt-tip }

---

## Why this matters

This example showcases the shift from simple chatbots to **autonomous agents** that can perform complex, multi-step workflows on your behalf. By integrating directly with Microsoft 365 data (Teams and Outlook), Copilot Studio enables you to build tools that not only answer questions but actively manage your workday.

If you enjoyed this practical look at autonomous agents, let me know directly or in the comments!
Loading