Muistiinpano
Tämän sivun käyttö edellyttää valtuutusta. Voit yrittää kirjautua sisään tai vaihtaa hakemistoa.
Tämän sivun käyttö edellyttää valtuutusta. Voit yrittää vaihtaa hakemistoa.
Agent 365 -vientitoiminto tarvitsee todennukseen tunnuksen selvityksen telemetriaa vietäessä. Tämä oppaassa käsitellään Microsoft 365 -agenttien SDK:n avulla kehitettyjä agentteja. Oppaassa käsitellään sekä Agent 365:n käyttöönottamat agentit että mukautettujen moduulien agentit .NET-, Python- ja Node.js-ympäristöissä.
Lisätietoja Distro-asennuksesta, yleisistä määrityksistä ja muista kuin agenttien SDK-skenaarioista on kohdassa Microsoft OpenTelemetry Distro.
Yleiskatsaus
Käytössä on neljä todennusskenaariota, jotka määräytyvät agentin tyypin ja sen tavan mukaan, jolla agentti hankkii tunnuksia. Tunnusten hankinnassa voi olla käytössä OBO (On-Behalf-Of-vuo) tai S2S (palvelujen välinen). Valitse määritystä vastaava skenaario:
| Skenaario | Description |
|---|---|
| Agent 365:n käyttöönottamat OBO:n avulla | Distroon sisältyvä AgenticTokenCache käsittelee tunnusten hankinnan automaattisesti. Mukautettua selvitystä ei tarvita. Tämä on suositeltava menetelmää Agent 365:n käyttöönottamissa agenteissa. |
| Agent 365:n käyttöönottamat S2S:n avulla | Agentti hankkii tunnuksen agenttipohjaisen käyttäjätietoketjun avulla (getAgenticApplicationToken + Microsoftin todennuskirjastot (MSAL)). Tarvitaan mukautettu TokenResolver. Käytä tätä menetelmää, OBO ei ole saatavilla tai tarvitset vain sovellusten tunnuksia. |
| Mukautettu moduuli OBO:n avulla | Agentti hankkii käyttäjätunnuksen Azure Bot OAuthin kautta, vaikutusalueen havaittavuuden ohjelmointirajapinta. Tarvitaan mukautettu TokenResolver ja Azure Bot OAuth-yhteys. |
| Mukautettu moduuli S2S:n avulla | Agentti hankkii vain sovelluksen tunnuksen asiakasohjelman tunnistetietojen avulla. Tarvitaan mukautettu TokenResolver. Sovelluksen rekisteröinnin on oltava tavallinen (ei agenttipohjainen) sovellus. |
Agent 365:n käyttöönottamat OBO:n avulla
Agent 365:n käyttöönottamat agentit vastaanottavat Agent 365 -ympäristöstä pyyntöjä, joissa on agenttipohjaiset tunnistetiedot (agenticAppId, agenticUserId). OBO mahdollistaa sen, että Distroon sisältyvä AgenticTokenCache käsittelee tunnuksen hankinnan automaattisesti: mukautettua selvitystä ei tarvita.
Edellytykset
- Entra-sovelluksen rekisteröinti : palvelun päänimi (sovelluksen rekisteröinti) sekä asiakastunnus, asiakasohjelman salasana ja vuokraajan tunnus
-
Delegoidut ohjelmointirajapinnan oikeudet: lisää
Agent365.Observability.OtelWrite(delegoitu) ja myönnä järjestelmänvalvojan suostumus. Lisätietoja on kohdassa Oikeuden myöntäminen.
Asetukset
Agentti kutsuu kunkin vuoron aikana RegisterObservability-funktiota vuoron kontekstilla. Sisältyvä välimuisti käyttää käyttäjän AgenticUserAuthorization-käsittelijästä peräisin olevaa delegoitua tunnistetta OBO-vaihdon suorittamiseen. Tällä tavoin saadaan tunniste, jonka vaikutusalueen on Agent365.Observability.OtelWrite.
Täydelliset määritysohjeet, mukaan lukien paketit, määritys ja koodiesimerkit ovat kohdassa Agent Framework -sovellusten agenttipohjaisten tunnusten välimuisti.
Agent 365:n käyttöönottamat S2S:n avulla
Agent 365:n käyttöönottamat agentit voivat käyttää myös S2S (palvelujen välistä) -todennusta OBO:n sijaan. Agentti hankkii tunnuksen käyttämällä oman palvelun päänimen käyttäjätietoja kaksivaiheisessa agenttipohjaisessa käyttäjätietoketjussa:
-
getAgenticApplicationToken(tenantId, agentId): asiakasohjelman tunnistetiedot + organisaation ulkopuoliset hallitut käyttäjätiedot (FMI) -polku - MSAL
acquireTokenForClient, jossa sovelluksen tunniste onclientAssertionja laajuusapi://9b975845-388f-4429-889e-eab1ef63949c/.default
Muistiinpano
Ulkopuoliset hallitut käyttäjätiedot (FMI) on arkkitehtuuri, jossa hallitut käyttäjätiedot osallistuvat työkuorman tunnistetietojen yhdistämiseen yhdistettyjen käyttäjätietojen tunnistetietojen kautta, mikä mahdollistaa tunnusten vaihdon todennuksella, jossa ei käytetä salaista koodia ja joka perustuu käyttäjätietojen väliseen luottamussuhteeseen.
Mukautettu TokenResolver on annettava ja UseS2SEndpoint = true määritettävä.
Edellytykset
Entra-sovelluksen rekisteröinti : palvelun päänimi (sovelluksen rekisteröinti) sekä asiakastunnus, asiakasohjelman salasana ja vuokraajan tunnus
Sovelluksen ohjelmointirajapinnan oikeudet: lisää
Agent365.Observability.OtelWrite(Sovellus), myönnä järjestelmänvalvojan suostumus.Agent365.Observability.OtelWrite-sovellusrooli: Agentin palvelunpäänimessä on oltavaOtelWrite-rooli Agent365:n havaittavuusresurssissa määritettynä. Käytä Agent 365 CLI -sovellusta:a365 setup permissions bot --config-dir "<path-to-config-dir>"Muistiinpano
Rooli leviäminen voi kestää muutaman minuutin. Vientipäätepisteestä peräisen olevat alun 401- tai 403-virheet ovat odotettuja tässä vaiheessa.
Vaihe 1: Ympäristömääritykset
Seuraavat koodiesimerkit näyttävät, miten vaaditut yhteyksien, vuokraajan, asiakasohjelman tunnistetietojen ja havaittavuuden vientitoiminnon ympäristöasetukset määritetään ennen mukautetun S2S-työnkulun käyttöönottoa.
AgenticUserAuthorization-käsittelijää ei tarvita. S2S käyttää manuaalista agenttipohjaista käyttäjätietoketjua (get_agentic_application_token + MSAL acquire_token_for_client) havaittavuusresurssiin kohdennetun tunnuksen hakemiseen.
CONNECTIONSMAP__0__SERVICEURL=*
CONNECTIONSMAP__0__CONNECTION=SERVICE_CONNECTION
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID=<your-client-id>
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET=<your-client-secret>
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID=<your-tenant-id>
ENABLE_A365_OBSERVABILITY=true
ENABLE_A365_OBSERVABILITY_EXPORTER=true
Vaihe 2: Distron määrittäminen mukautetun tunnuksen selvityksen avulla
Seuraavat esimerkit näyttävät, miten Agent 365:n vienti otetaan käyttöön ja mukautettu TokenResolver rekisteröidään, jonka jälkeen vientitoiminto voi noutaa kunkin agentin ja vuokraajan S2S-tunnukset.
from microsoft.opentelemetry import use_microsoft_opentelemetry
_token_cache: dict[str, str] = {}
def token_resolver(agent_id: str, tenant_id: str) -> str | None:
return _token_cache.get(f"{agent_id}:{tenant_id}")
use_microsoft_opentelemetry(
enable_a365=True,
a365_token_resolver=token_resolver,
a365_use_s2s_endpoint=True,
a365_enable_observability_exporter=True,
)
Vaihe 3: S2S-tunnuksen hankkiminen ja välimuistiin tallentaminen
Hanki S2S-tunnus kussakin saapuvassa viestissä agenttipohjaisen käyttäjätietoketjun kautta ja tallenna se välimuistiin selvitystä varten.
import asyncio
from msal import ConfidentialClientApplication
from microsoft.opentelemetry.a365.core import BaggageBuilder, InvokeAgentScope, InvokeAgentScopeDetails, Request
OBSERVABILITY_S2S_SCOPE = "api://9b975845-388f-4429-889e-eab1ef63949c/.default"
async def get_agentic_s2s_token(connection, tenant_id: str, agent_id: str) -> str:
# Step 1: Get agentic application token (client_credentials + fmi_path)
app_token = await connection.get_agentic_application_token(tenant_id, agent_id)
if not app_token:
raise ValueError(f"Failed to get agentic app token for agent {agent_id}")
# Step 2: Exchange for observability-scoped token
cca = ConfidentialClientApplication(
client_id=agent_id,
authority=f"https://login.microsoftonline.com/{tenant_id}",
client_credential={"client_assertion": app_token},
)
result = await asyncio.to_thread(
lambda: cca.acquire_token_for_client(scopes=[OBSERVABILITY_S2S_SCOPE])
)
if not result or "access_token" not in result:
raise ValueError(f"Token acquisition failed: {result}")
return result["access_token"]
# In your message handler : use SDK helpers to get agent/tenant from the activity:
@AGENT_APP.activity("message")
async def on_message(context: TurnContext, _state: TurnState):
# get_agentic_instance_id reads from recipient (SDK convention)
agent_id = context.activity.get_agentic_instance_id()
tenant_id = context.activity.get_agentic_tenant_id()
# Acquire S2S token and cache BEFORE creating spans
connection = CONNECTION_MANAGER.get_connection("SERVICE_CONNECTION")
token = await get_agentic_s2s_token(connection, tenant_id, agent_id)
_token_cache[f"{agent_id}:{tenant_id}"] = token
# Wrap spans in BaggageBuilder so the exporter can resolve the token
request = Request(content=user_message, session_id=None)
with BaggageBuilder().tenant_id(tenant_id).agent_id(agent_id).build():
invoke_scope = InvokeAgentScope.start(request, InvokeAgentScopeDetails(), agent_details)
with invoke_scope:
invoke_scope.record_input_messages([user_message])
invoke_scope.record_output_messages([response])
Tärkeää
Manuaalinen kaksivaiheinen prosessi (get_agentic_application_token + MSAL acquire_token_for_client) on pakollinen S2S-menetelmässä.
AgenticUserAuthorization.get_token() palauttaa todennuksen, jonka vaikutusalue on 5a807f24-.../.default (Bot Framework) eikä havaittavuusresurssia api://9b975845-.../.default: S2S-päätepiste hylkää sen virheellä 401 InvalidAudience.
-
context.activity.get_agentic_instance_id()jaget_agentic_tenant_id()mahdollistavat agentin ja vuokraajan lukemiseen aktiviteetista (lukeerecipient-arvon SDK-käytännön mukaisesti). - Hanki S2S-tunnus ja tallenna se välimuistiin ennen span-ominaisuuksien luontia. Vientitoiminnon
BatchSpanProcessorsaattaa tyhjentyä, ennen kuin käsittelijä lopettaa: jos tunnusta ei ole vielä tallennettu välimuistiin, vienti epäonnistuu. - Paketoi kaikki A365-vaikutusalueet
BaggageBuilder-arvoon, jolloin vientitoiminto tietää, mihin agenttiin ja vuokraajaan tunnukset selvitetään. Ilman baggage-tietoja span-ominaisuudet jätetään ilmoittamatta pois ja ilmoitetaan, ettei vuokraajan tai agentin käyttäjätietoja sisältynyttä span-ominaisuutta löytynyt.
Mukautettu moduuli OBO:n avulla
Mukautetun moduulin agentit tavallisia sovellusrekisteröintejä Azure Bot OAuth -yhteyksissä agenttipohjaisen käyttäjätietoketjun sijaan. Kun OBO on käytössä agentissa, se saa käyttäjätunnuksen sellaisen Azure Bot OAuth -todennuksen kautta, jonka Bot Framework -tunnuspalvelu on jo kohdistanut A365:n havaittavuuden ohjelmointirajapintaan. Yksi getToken- tai GetTurnTokenAsync-kutsu palauttaa oikein kohdistetun tunnuksen, joten exchangeToken on tarpeeton.
Edellytykset
Entra-sovelluksen rekisteröintidelegoitujen ohjelmointirajapinnan oikeuksien avulla. Lisää Agent365.Observability.OtelWrite (delegoitu) ja myönnä järjestelmänvalvojan suostumus
Tärkeää
Tunnuksen välimuistissa on agentId ja se on vastattava sovelluksen rekisteröinnin asiakastunnusta eikä aktiviteetin agenticAppId-arvoa, jota ei mukautetun moduulin agenteissa. Viennin URL-osoitteessa on agentId ja ristiriita aiheuttaa HTTP 403 -virheen.
Vaihe 1: Ympäristön ja sovelluksen määritys
Seuraavat esimerkit näyttävät, miten sovellus ja suorituspalveluympäristö määritetään, mukaan lukien palveluyhteyden arvot, vuokraajan ja asiakasohjelman asetukset sekä pakolliset valtuutuksen yhdistämismääritykset.
# .env
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID=<your-client-id>
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET=<your-client-secret>
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID=<your-tenant-id>
CONNECTIONSMAP__0__CONNECTION=SERVICE_CONNECTION
CONNECTIONSMAP__0__SERVICEURL=*
# Auth handler config : TYPE is required, name is uppercased by load_configuration_from_env
AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__OBOCONNECTIONPROFILE__TYPE=UserAuthorization
AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__OBOCONNECTIONPROFILE__SETTINGS__AZUREBOTOAUTHCONNECTIONNAME=oboConnectionProfile
AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__OBOCONNECTIONPROFILE__SETTINGS__SCOPES=api://9b975845-388f-4429-889e-eab1ef63949c/Agent365.Observability.OtelWrite
ENABLE_A365_OBSERVABILITY=true
ENABLE_A365_OBSERVABILITY_EXPORTER=true
Tärkeää
load_configuration_from_env muuttaa kaikki ympäristömuuttujien avaimet isoiksi kirjaimiksi. Käsittelijän nimestä tulee OBOCONNECTIONPROFILE ja auth_handlers- ja get_token()-kutsuissa siihen on viitattava käyttämällä täsmälleen tätä kirjainkoko. Jos TYPE puuttuu, seurauksena on Auth handler ... not recognized or not configured suorituspalvelussa.
Vaihe 2: OBO:n Distro-määritys
Seuraavat esimerkit näyttävät, miten Agent 365:n vienti otetaan käyttöön, vientitoiminto pidetään OBO-päätepisteessä ja delegoidut tunnukset viennin aikana palauttava mukautettu TokenResolver rekisteröidään.
from microsoft.opentelemetry import use_microsoft_opentelemetry
_token_cache: dict[str, str] = {}
def token_resolver(agent_id: str, tenant_id: str) -> str | None:
return _token_cache.get(f"{agent_id}:{tenant_id}")
environ["ENABLE_A365_OBSERVABILITY_EXPORTER"] = "true"
use_microsoft_opentelemetry(
enable_a365=True,
a365_token_resolver=token_resolver,
a365_use_s2s_endpoint=False, # OBO uses /observability endpoint
a365_enable_observability_exporter=True,
)
Muistiinpano
OBO-tila edellyttää, että jwt_authorization_middleware on aiohttpApplication-arvossa (tarkistaa Bot Frameworkin kautta saapuvan JWT:n (JSON Web Token)). S2S/emulaattoripolku ei saa sisältää tätä väliohjelmistoa.
from microsoft_agents.hosting.aiohttp import jwt_authorization_middleware
app = Application(middlewares=[jwt_authorization_middleware])
Vaihe 3: OBO-tunnuksen hankkiminen
Seuraavat esimerkit näyttävät, miten delegoitua OBO-tunnusta pyydetään määritetystä Azure botti OAuth -yhteydestä ja miten sovelluksen asiakasohjelman ja vientitoiminnon vuokraaja tallentaa sen välimuistiin.
from microsoft_agents.hosting.core import (
AgentApplication, Authorization, MemoryStorage, TurnContext, TurnState,
)
from microsoft_agents.activity import load_configuration_from_env
from microsoft_agents.authentication.msal import MsalConnectionManager
from microsoft_agents.hosting.aiohttp import CloudAdapter
# Auth handlers are loaded from .env via load_configuration_from_env (see Environment config above)
agents_sdk_config = load_configuration_from_env(environ)
STORAGE = MemoryStorage()
CONNECTION_MANAGER = MsalConnectionManager(**agents_sdk_config)
ADAPTER = CloudAdapter(connection_manager=CONNECTION_MANAGER)
AUTHORIZATION = Authorization(STORAGE, CONNECTION_MANAGER, **agents_sdk_config)
AGENT_APP = AgentApplication[TurnState](
storage=STORAGE, adapter=ADAPTER, authorization=AUTHORIZATION, **agents_sdk_config,
)
CLIENT_ID = environ.get("CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID", "")
TENANT_ID = environ.get("CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID", "")
# Message handler : get_token returns a token already scoped to the observability API.
# The Azure Bot Token Service performs the OBO exchange internally based on the
# OAuth connection's configured scope. No manual MSAL exchange_token call is needed.
@AGENT_APP.activity("message", auth_handlers=["OBOCONNECTIONPROFILE"])
async def on_message(context: TurnContext, _state: TurnState):
token_response = await AGENT_APP.auth.get_token(context, "OBOCONNECTIONPROFILE")
# token_response.token has aud=<a365-observability-app-id>,
# scp=Agent365.Observability.OtelWrite
_token_cache[f"{CLIENT_ID}:{TENANT_ID}"] = token_response.token
Tärkeää
Azure-portaalin edellytys:oboConnectionProfile-nimisen Azure Bot OAuth -yhteyden vaikutusalueiden määrityksenä on oltava api://9b975845-388f-4429-889e-eab1ef63949c/Agent365.Observability.OtelWrite. Ilman tätä asetusta tunnuksen vaikutusalue on botin oma käyttäjäryhmä api://botid-... ja vienti epäonnistuu virheen HTTP 401 InvalidAudience vuoksi.
Muistiinpano
AGENT_APP.auth.get_token() palauttaa suoraan tunnuksen, jonka vaikutusalue on oikea; exchange_token()-kutsua ei siis tarvita. Bot Framework -tunnuspalvelu käsittelee OBO-vaihdon, kun OAuth-yhteyden vaikutusalue kohdistuu A365:n havaittavuusresurssiin.
Mukautettu moduuli S2S:n avulla
Mukautetun moduulin agentit voivat käyttää S2S-todennus (asiakasohjelman tunnistetiedot) vain sovellusta koskevan tunnuksen hankkimiseen käyttämällä palveluyhteyden tunnistetietoja. Tämä menetelmä käyttää tavallisia asiakasohjelman MSAL-tunnistetietoja; agentin käyttäjätietoketjua ei siis tarvita.
Edellytykset
-
Azure AD -sovelluksen rekisteröinti: Kyseessä on oltava mukautetun moduulin(tavallinen) sovellus. Agent 365:n käyttöönottamat sovellusrekisteröinnit eivät voi käyttää pelkkää
client_credentials-arvoa havaittavuusresurssissa (AADSTS82001). -
Sovelluksen oikeudet: lisää
Agent365.Observability.OtelWrite(Sovellus, ei delegoitu) ja myönnä järjestelmänvalvojan suostumus.
Tärkeää
Välimuistiin tallentamisessa käytetyn agentId-tunnuksen on oltava palveluyhteyden ClientId. Viennin URL-osoite on /observabilityService/tenants/{tenantId}/otlp/agents/{agentId}/traces: ristiriita aiheuttaa HTTP 403 -virheen.
Vaihe 1: Ympäristön ja sovelluksen määritys
Seuraavat esimerkit näyttävät, miten sovellus ja suorituspalveluympäristö määritetään, mukaan lukien palveluyhteyden arvot, vuokraajan ja asiakasohjelman asetukset sekä pakolliset valtuutuksen yhdistämismääritykset.
# .env
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID=<your-client-id>
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET=<your-client-secret>
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID=<your-tenant-id>
CONNECTIONSMAP__0__CONNECTION=SERVICE_CONNECTION
CONNECTIONSMAP__0__SERVICEURL=*
ENABLE_A365_OBSERVABILITY=true
ENABLE_A365_OBSERVABILITY_EXPORTER=true
Vaihe 2: S2S:n Distro-määritys
Seuraavat esimerkit näyttävät, miten Agent 365:n vienti otetaan käyttöön, vientitoiminto määritetään S2S-päätepisteessä ja tunnushaun viennin aikana suorittava mukautettu TokenResolver rekisteröidään.
from microsoft.opentelemetry import use_microsoft_opentelemetry
_token_cache: dict[str, str] = {}
def token_resolver(agent_id: str, tenant_id: str) -> str | None:
return _token_cache.get(f"{agent_id}:{tenant_id}")
use_microsoft_opentelemetry(
enable_a365=True,
a365_token_resolver=token_resolver,
a365_use_s2s_endpoint=True, # S2S uses /observabilityService endpoint
a365_enable_observability_exporter=True,
)
Vaihe 3: S2S-tunnuksen hankkiminen
Seuraavat esimerkit näyttävät, miten havaittavuusresurssin vain sovelluksen käyttöoikeustietuetta pyydetään käyttämällä palveluyhteyden tunnistetietoja sekä miten agentti ja vuokraaja tallentavat sen sitten välimuistiin vientitoiminta varten.
# Force agentId to ServiceConnection ClientId (custom engine agents have no agenticAppId)
agent_id = os.environ.get("CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID")
tenant_id = os.environ.get("CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID")
connection = CONNECTION_MANAGER.get_connection("SERVICE_CONNECTION")
token = await connection.get_access_token(
resource_url="https://login.microsoftonline.com",
scopes=["api://9b975845-388f-4429-889e-eab1ef63949c/.default"],
)
_token_cache[f"{agent_id}:{tenant_id}"] = token
Vaihe 4: baggage-tietojen määrittäminen span-vientiä varten
Agent365:n vientitoiminnossa edellyttää, että baggage (vuokraajan tunnus ja agentin tunnus) määritetään span-kontekstiin. Ilman sitä vientitoiminto jättää span-ominaisuuden ilmoittamatta pois ja tuloksen on viesti No spans with tenant/agent identity found..
from microsoft.opentelemetry.a365.core import BaggageBuilder, InvokeAgentScope
# Baggage must wrap the span as a context manager
with BaggageBuilder().tenant_id(tenant_id).agent_id(agent_id).build():
invoke_scope = InvokeAgentScope.start(request, InvokeAgentScopeDetails(), agent_details)
with invoke_scope:
invoke_scope.record_input_messages([user_message])
invoke_scope.record_output_messages([response])