Skip to content
Merged
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
25 changes: 25 additions & 0 deletions libraries/microsoft-agents-a365-notifications/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Changelog — microsoft-agents-a365-notifications

All notable changes to this package will be documented in this file.

## [2.0.0] - 2026-10-20

### Breaking Changes

- **`AgentLifecycleEvent.USERDELETED` value changed** — it is now
`"agenticuserdeleted"` (previously `"agenticuseridentitydeleted"`), so
`on_user_deleted()` handlers match the new event name. Update any code that
compares against the raw string value.

### Added

- New lifecycle events and handler decorators on `AgentNotification`:
- `USERUNDELETED` — `on_user_undeleted()`
- `USERUPDATED` — `on_user_updated()`
- `USERMANAGERUPDATED` — `on_user_manager_updated()`
- `USERENABLED` — `on_user_enabled()`
- `USERDISABLED` — `on_user_disabled()`

### Security

- Raised the minimum `PyJWT` version to `>= 2.14.0`.
99 changes: 64 additions & 35 deletions libraries/microsoft-agents-a365-observability-core/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,38 +2,10 @@

All notable changes to this package will be documented in this file.

## [Unreleased]

### Fixed

- **Agent 365 exporter's `GEN_AI_OPERATION_NAMES` allowlist now recognizes the
canonical lowercase operation names** (`chat`, `text_completion`,
`generate_content`) in addition to the existing aliases, since spans can now
legitimately report these values.
- **`AgentDetails.agent_type` and `InferenceCallDetails.responseModel`/cache
fields are appended at the end of their dataclasses** instead of being
inserted in the middle, preserving positional-argument compatibility for
existing callers.
- **Whitespace-only `model`/`responseModel` values are now normalized to
`None`** in `InferenceCallDetails.__post_init__`, preventing blank span
names/`gen_ai.request.model` attributes when a non-blank `responseModel` is
also supplied.
- **`AgentDetails.agent_type` now accepts `AgentType` enum members** — the
enum's `.value` is emitted on the span/baggage instead of the enum object,
which OpenTelemetry would otherwise silently drop.
## [2.0.0] - 2026-10-20

### Breaking Changes

- **Manual inference operation names and span-name prefixes now use canonical
OpenTelemetry values** — `Chat`, `TextCompletion`, and `GenerateContent`
become `chat`, `text_completion`, and `generate_content`, respectively.
For example, `Chat gpt-4` becomes `chat gpt-4`. Text-completion and
generate-content spans that were previously filtered out are now exported
to Agent 365.
- **`InferenceCallDetails` now validates model identity during construction** —
If both `model` and `responseModel` are missing, empty, or whitespace-only,
construction raises `ValueError`. Previously these values were accepted
without validation. This happens before an `InferenceScope` is created.
- **OBS exports always use `/observabilityService`** — The `use_s2s_endpoint`
option is deprecated and ignored, even when `False`. Exports no longer select
or fall back to `/observability`. Provide an app-only OBS token independently
Expand All @@ -45,14 +17,62 @@ All notable changes to this package will be documented in this file.
failures fail export without an HTTP request or delegated fallback. The
exporter invokes the resolver on every export batch/identity group, so
resolvers must cache the acquired token and refresh only near expiry.
- **Manual inference operation names and span-name prefixes now use canonical
OpenTelemetry values** — `Chat`, `TextCompletion`, and `GenerateContent`
become `chat`, `text_completion`, and `generate_content`, respectively.
For example, `Chat gpt-4` becomes `chat gpt-4`. The Agent 365 exporter
recognizes the canonical names (the legacy `Chat` value is still accepted),
so text-completion and generate-content spans that were previously filtered
out are now exported to Agent 365.
- **`InferenceCallDetails` now validates model identity during construction** —
`model` and `responseModel` are stripped and whitespace-only values are
treated as `None`. If both are missing, empty, or whitespace-only,
construction raises `ValueError`. Previously these values were accepted
without validation. This happens before an `InferenceScope` is created.
- **Message payloads serialize as a plain JSON array** — `gen_ai.input.messages`
and `gen_ai.output.messages` are now serialized per the OpenTelemetry GenAI
semantic conventions as `[{"role": ..., "parts": [...]}]` instead of the
`{"version": "0.1.0", "messages": [...]}` wrapper. The
`A365_MESSAGE_SCHEMA_VERSION` constant and the `version` field on
`InputMessages`/`OutputMessages` are removed, and `OutputMessage.finish_reason`
now defaults to `"stop"` instead of `None`.

### Added

- **`ApplyGuardrailScope`** for tracing security guardrail evaluations
(`apply_guardrail` operation), with supporting `GuardrailDetails`,
`GuardrailFinding`, `GuardrailDecisionType`, `GuardrailRiskSeverity`, and
`GuardrailTargetType` types and `microsoft.guardian.*` /
`microsoft.security.*` attribute constants. `apply_guardrail` spans are
exported to Agent 365.
- **`AgentDetails.agent_type`** and **`BaggageBuilder.agent_type()`** emit
`gen_ai.agent.type`. Both accept an `AgentType` enum member or a string;
enum members are emitted as their string `.value`. The new dataclass field is
appended after existing fields, preserving positional-argument compatibility.
- **`InferenceCallDetails.responseModel`**, **`cacheReadInputTokens`**, and
**`cacheWriteInputTokens`** emit `gen_ai.response.model`,
`gen_ai.usage.cache_read.input_tokens`, and
`gen_ai.usage.cache_write.input_tokens`. `model` is now optional when
`responseModel` is supplied. The new fields are appended after existing
fields, preserving positional-argument compatibility.
Comment thread
rbrighenti marked this conversation as resolved.
Resolved
- **`InferenceScope.record_cache_read_input_tokens()`** and
**`record_cache_write_input_tokens()`**.
- **`InferenceOperationType.canonical_name`** returns the canonical lowercase
OpenTelemetry operation name.

### Changed

- `InferenceScope` emits `server.port` as an integer instead of a string.

### Fixed

- Scopes and the Agent 365 exporter no longer raise `AttributeError` when the
tracer returns a `NonRecordingSpan` (for example, when the token resolver
returns `None` on the first turn); span context is read via
`get_span_context()`.

### Migration

- Update case-sensitive operation-name and span-name filters, dashboards, and
alerts to the canonical values above, or compare case-insensitively.
- Supply a non-blank `model` or `responseModel` when constructing
`InferenceCallDetails`; validate optional configuration before constructing
the telemetry object so missing model identity does not interrupt a request.
- Request the OBS resource `/.default` scope
(`api://9b975845-388f-4429-889e-eab1ef63949c/.default`) for the exporting
agent identity. Do not use delegated `Agent365.Observability.OtelWrite` tokens
Expand All @@ -61,8 +81,17 @@ All notable changes to this package will be documented in this file.
`idtyp` other than `app`; when `idtyp` is absent, accept only a non-empty
`roles` array or a non-empty `oid` equal to `sub`; verify `aud` is the OBS
resource and the token is not expired.
- Update case-sensitive operation-name and span-name filters, dashboards, and
alerts to the canonical values above, or compare case-insensitively.
- Supply a non-blank `model` or `responseModel` when constructing
`InferenceCallDetails`; validate optional configuration before constructing
the telemetry object so missing model identity does not interrupt a request.
- Update consumers that parse `gen_ai.input.messages` /
`gen_ai.output.messages` to expect a JSON array rather than a
`{version, messages}` object, and remove references to
`A365_MESSAGE_SCHEMA_VERSION`.

## [0.3.0]
## [1.0.0] - 2026-05-01

### Breaking Changes

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

All notable changes to this package will be documented in this file.

## [Unreleased]
## [2.0.0] - 2026-10-20

### Added

Expand All @@ -26,4 +26,17 @@ All notable changes to this package will be documented in this file.
tokens reports 150 instead of 100. Do not add cache-token counts to this
normalized total again. Batched generations retain aggregate `llm_output`
usage rather than replacing it with a single message's usage.
- **Depends on `langchain-core` instead of the `langchain` meta-package** — the
package no longer installs `langchain`. Install it separately if your
application needs it.

### Security

- Raised minimum versions: `langchain-core >= 1.3.3`, `langsmith >= 0.8.18`,
and `anyio >= 4.14.2`.

## [1.0.0] - 2026-05-01

### Changed

- Removed `set_execution_type()` function and all `ExecutionType` / `GEN_AI_EXECUTION_TYPE_KEY` usage.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,25 @@

All notable changes to this package will be documented in this file.

## [Unreleased]
## [2.0.0] - 2026-10-20

### Added

- Response spans now emit `gen_ai.usage.cache_read.input_tokens` from
`usage.input_tokens_details.cached_tokens`.

### Changed

- **Response model is emitted as `gen_ai.response.model`** — the model reported
on the OpenAI `Response` object was previously emitted as
`gen_ai.request.model`. Update dashboards and queries accordingly.

### Security

- Raised minimum versions: `mcp >= 1.28.1`, `anyio >= 4.14.2`, and
`python-multipart >= 0.0.30`.

## [1.0.0] - 2026-05-01

### Changed

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,14 @@

All notable changes to this package will be documented in this file.

## [Unreleased]
## [2.0.0] - 2026-10-20

### Security

- Raised minimum versions: `mcp >= 1.28.1`, `anyio >= 4.14.2`, and
`python-multipart >= 0.0.30`.

## [1.0.0] - 2026-05-01

### Changed

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

All notable changes to this package will be documented in this file.

## [Unreleased]
## [2.0.0] - 2026-10-20

### Breaking Changes

Expand All @@ -18,13 +18,25 @@ All notable changes to this package will be documented in this file.
logs one error and stores no token. It never calls `Authorization.exchange_token`
and never acquires a delegated OBS token.

### Changed

- The package now declares a direct dependency on
`microsoft-agents-a365-runtime`.

### Fixed

- Channel scope helpers now fall back to `channel_data.productContext` for the
sub-channel when the activity's `ChannelId` does not carry one.

### Migration

- Call and return `refresh_observability_token(agent_id, tenant_id, app_only_token_resolver)`
from the exporter `token_resolver`.
- Keep workload MCP/Graph/OBO authentication unchanged; only OBS export
authentication moves to app-only S2S.

## [1.0.0] - 2026-05-01

### Changed

- **`OutputLoggingMiddleware`** — Updated to use new scope APIs (`Request`, `SpanDetails`, `UserDetails`). Removed `TenantDetails` and `ExecutionType` dependencies. Middleware no longer gates on tenant presence.
Expand Down
2 changes: 1 addition & 1 deletion libraries/microsoft-agents-a365-runtime/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

All notable changes to this package will be documented in this file.

## [Unreleased]
## [2.0.0] - 2026-10-20

### Breaking Changes

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Changelog — microsoft-agents-a365-tooling-extensions-agentframework

All notable changes to this package will be documented in this file.

## [2.0.0] - 2026-10-20

### Security

- Raised minimum versions: `mcp >= 1.28.1`, `anyio >= 4.14.2`,
`python-multipart >= 0.0.30`, and `pyasn1 >= 0.6.4`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Changelog — microsoft-agents-a365-tooling-extensions-googleadk

All notable changes to this package will be documented in this file.

## [2.0.0] - 2026-10-20

### Security

- Requires `google-adk >= 1.28.1, < 2.0.0` to address CVE-2026-4810.
- Raised minimum versions: `mcp >= 1.28.1`, `anyio >= 4.14.2`,
`python-multipart >= 0.0.30`, and `pyasn1 >= 0.6.4`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Changelog — microsoft-agents-a365-tooling-extensions-openai

All notable changes to this package will be documented in this file.

## [2.0.0] - 2026-10-20

### Security

- Raised minimum versions: `mcp >= 1.28.1`, `anyio >= 4.14.2`, and
`python-multipart >= 0.0.30`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Changelog — microsoft-agents-a365-tooling-extensions-semantickernel

All notable changes to this package will be documented in this file.

## [2.0.0] - 2026-10-20

### Security

- Raised minimum versions: `mcp >= 1.28.1`, `anyio >= 4.14.2`, and
`python-multipart >= 0.0.30`.
17 changes: 11 additions & 6 deletions libraries/microsoft-agents-a365-tooling/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,13 @@ All notable changes to the `microsoft-agents-a365-tooling` package will be docum
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]
## [2.0.0] - 2026-10-20

### Security

- Raised the minimum `PyJWT` version to `>= 2.14.0`.

## [1.0.0] - 2026-05-01

### Added

Expand All @@ -17,6 +23,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Added `audience`, `scope`, `publisher`, and `headers` fields to `MCPServerConfig`
- Gateway discovery endpoint bumped to `/agents/v2/{id}/mcpServers`
- `_parse_gateway_server_config()` and `_parse_manifest_server_config()` merged into a single `_parse_server_config()` method — both gateway and manifest payloads share the same JSON field schema; the unified method maps `audience`, `scope`, and `publisher` fields from either source into `MCPServerConfig`
- Added `send_chat_history` method to `McpToolServerConfigurationService` for sending chat conversation history to the MCP platform for real-time threat protection analysis
- Added `ChatHistoryMessage` Pydantic model for representing individual messages in chat history
- Added `ChatMessageRequest` Pydantic model for the chat history API request payload
- Added `py.typed` marker for PEP 561 compliance, enabling type checker support

### Changed

Expand All @@ -30,8 +40,3 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **Backward compatible**: agents with V1 manifests (null audience or shared ATG AppId) work identically with the new SDK — no token exchange behaviour changes
- **Migration required for V2**: agents upgraded to V2 blueprint permissions (per-audience MCP servers) require this SDK version. Running a V2 blueprint with the old SDK will result in MCP tool auth failures (401/403)
- **Local dev token flow**: run `a365 develop get-token` before starting the agent locally; the CLI writes `BEARER_TOKEN` (shared fallback) and `BEARER_TOKEN_<MCP_SERVER_NAME_UPPER>` (per-server, keyed on the server's `mcpServerName` value uppercased) to the environment, which the SDK reads automatically during manifest-based discovery

- Added `send_chat_history` method to `McpToolServerConfigurationService` for sending chat conversation history to the MCP platform for real-time threat protection analysis
- Added `ChatHistoryMessage` Pydantic model for representing individual messages in chat history
- Added `ChatMessageRequest` Pydantic model for the chat history API request payload
- Added `py.typed` marker for PEP 561 compliance, enabling type checker support
Loading