ONVIF Agentic Service - #809
Conversation
| <mediaobject> | ||
| <imageobject> | ||
| <?oxy_comment_start author="Ottavio Campana" timestamp="20260729T095751+0200" comment="Image to be redone from scratch"?> | ||
| <imagedata fileref="media/AI/stack_overview.svg" contentwidth="140mm" |
|
PR specifies a persistent HTTP GET /mcp carrying newline-delimited notifications. MCP 2026-07-28 explicitly removed the GET stream. Requests use POST; long-lived notifications use the SSE response to subscriptions/listen. Independent notifications/message events cannot simply be placed on a permanent GET stream. Official MCP Streamable HTTP specification. |
|
server/discover is incorrectly mandatory as the first call. A server must support it, but a modern client may call any operation directly and handle UnsupportedProtocolVersionError. The PR currently says the client shall call it first. |
@willysagefalk Do you have a reference for that? |
|
@ocampana-videotec Yes. The normative reference is the MCP 2026-07-28 specification, Discovery — When to Call: https://modelcontextprotocol.io/specification/2026-07-28/server/discover#when-to-call It states that calling The same section only recommends calling it first for a dual-era client over stdio, as a backward-compatibility probe. Since the ONVIF proposal uses HTTP POST, that stdio-specific recommendation does not apply. I therefore suggest replacing:
with something along these lines:
|
Corrected. |
|
@willysagefalk , following our conversation, I just added chapter 9 about metadata. As you can see it defines abstract concepts and for Observations and Provenance it proposes two specialization. SOSA/SSN was included to accommodate @DammnAI 's feedback in https://github.com/onvif/wg_AI/pull/9 , while the JLDS-based provenance is my proposal based on an already existing specification. If any member wants to model an Observation, they can simply propose a similar derivation. |
|
Thanks for adding the metadata chapter. I suggest that we now use this PR as the working integration point and complete the model here. I reviewed head The following changes are needed before the draft can become an implementable specification. Blocking implementation issues
Information-model changes requiring WG agreement
One editorial cleanup: the PR description should describe the minimum information model in vendor-neutral ONVIF terms. The abstract-class and specialization direction is useful. The main work now is to make the boundaries explicit and ensure the transport, JSON-LD, schema, and signature mechanisms can be implemented and tested consistently. |
|
Sorry @willysagefalk but we need to find a more efficient way to tackle the document, we cannot just copy&paste tons of lines from an LLM. For the future, we need IMHO to be shorter a more focused. Point 1: I will study it, it looks correct. Point 2: I have no idea right now. It's generated by the linkml tools... Point 3: I intentionally got rid of ecdsa-rdfc-2019 in order to point our specs to the ONVIF Security Baseline. Point 4: The yaml file is broken, I know it very weak, there is even a note in the AI.xml that that part will have to be removed and be put in the ai.yaml. We are simply too far now to allocate time to it. Point 5: what is the problem here? beyond a style issue, I really see no problem for the observation to be to top level container. Point 6: how is it defined in SOSA? We do not want to diverge. If this is not good enough, then we have a reason to ditch SOSA Point 7: this looks like point 5. What is the use case we are trying to solve? Point 8: I agree and in fact we are starting to work on Annex A. The problem is that before creating an example we must clarify how it will work. Therefore, the immediately actionable items are: 1, 3 and 6. |
|
I suggest extending the model with a neutral Assertion type alongside Observation, together with an ObjectObservation specialization: InformationEntity ObjectObservation represents an observation concerning one persistent PhysicalObject. It groups the Claims produced within that observation context and may include observed positions or other object-related information. Assertion is not an Observation. It expresses a proposition, relationship or conclusion and can reference Observations as supporting evidence. Statement and Claim are concrete specializations of Assertion. For example, in RE-ID: ObjectObservation A ObjectObservation B Re-identification Claim SOSAObservation remains available for SOSA interoperability, but it does not need to be the foundation of the ONVIF information model. ObjectObservation and SOSAObservation describe different aspects, so a sensor-based ObjectObservation may also be mapped to SOSA. |
|
@willysagefalk let's start clarifying the definition of the abstract classes involved in metadata streaming. Once we clarify them, we can specialize stuff like ObjectObservation, PhysicaObject and so on. My definitions:
I do have a few ideas I am working for for statement, but I do not have a clear understanding of the difference between Claim and Assertion. My idea is that, if we are talking about abstract classes, assertions, claims and statements are the same thing. If that's the case we could have To my eyes, InformationEntity is an empy container, it's just a waste of bandwidth. We do not need to wrap a rich container (Observation) with an empty conatiner (InformationEntitiy) From assertion we could derive a statement, and for the statement use the idea of the predicate we were discussing at the Budapest meeting. |
|
InformationEntity is not intended as a serialized wrapper around an Observation, so it adds no bandwidth. It is only the neutral abstract superclass that allows both Observations and Assertions to be top-level information types. An Observation represents an observation/perception context and may contain Assertions produced during that observation. An Assertion represents a proposition or conclusion and may reference one or more Observations as evidence. For example, a RE-ID Assertion that two observations concern the same physical object cannot naturally belong to only one of those observations. I agree that we should first settle these two abstract definitions. We can then clarify the precise distinction between Statement and Claim and add specializations such as ObjectObservation. |
|
I am still having difficulties to understand clearly the difference between an Assertion and an Observation I am good with "An Observation represents an observation/perception context and may contain Assertions produced during that observation". But then I see a logical problem in "An Assertion represents a proposition or conclusion and Why may? Observations may exist without Assertions, but in my understanding Assertions cannot exist outside of an Observation. It is a must, not a may in my opinion. Assertions without observation are, de facto, Observations. Do you agree on this? |
flowchart BT
O1["ObjectObservation O1"]
O2["ObjectObservation O2"]
O3["SpaceObservation O3"]
A2["Assertion A2"]
A3["Assertion A3"]
A1["Assertion A1"]
A2 -->|supportedBy| O1
A2 -->|supportedBy| O3
A3 -->|supportedBy| O3
A1 -->|derivedFrom| A2
A1 -->|derivedFrom| A3
A1 -->|supportedBy| O2
Graph validation checks |
|
An observation should reference an ObservedSpace, not directly use Location or GPSLocation. Location provides the semantic site context—such as building, floor, room or entrance—while ObservedSpace describes the actual observable area and its geometric extent. Relative timestamps should be added only if a common temporal reference model is defined. classDiagram
direction TB
class InformationItem {
<<Abstract>>
+URI id
+DateTime productionTime
}
class Observation {
<<Abstract>>
}
class ObjectObservation {
+URI observedObject
}
class SpaceObservation {
}
class ValidTime {
<<Abstract>>
}
class Instant {
+DateTime time
}
class Interval {
+DateTime startTime
+DateTime endTime
}
class Location {
+URI id
+string name
+string locationType
}
class ObservedSpace {
+URI id
+string name
+boolean mobile
+boolean derived
}
class SpatialRegion {
<<Abstract>>
+URI id
}
class CoordinateFrame {
+URI id
+string coordinateSystem
+string orientationFrame
+string originDescription
+string unit
}
InformationItem <|-- Observation
Observation <|-- ObjectObservation
Observation <|-- SpaceObservation
Observation "1" --> "1" ValidTime : observedTime
Observation "1" --> "1" ObservedSpace : observedSpace
ValidTime <|-- Instant
ValidTime <|-- Interval
Location "0..*" --> "0..1" Location : containedIn
ObservedSpace "0..*" --> "0..1" Location : locatedIn
ObservedSpace "1" --> "0..1" SpatialRegion : extent
SpatialRegion "1" --> "1" CoordinateFrame : expressedIn
|
| <section xml:id="sec_service_discovery"> | ||
| <title>Service Discovery</title> | ||
| <para>An ONVIF Device that supports the AI Service shall advertise the MCP service endpoint | ||
| URL through the ONVIF Core service discovery mechanism. In the ONVIF Core |
There was a problem hiding this comment.
I suggest enhancing WS-Discovery by including an additional endpoint for mcp, for example:
wsd:XAddrshttp://192.168.1.100:80/mcp</wsd:XAddrs>
This way, we can avoid making a GetServices call just to determine whether MCP is supported.
There was a problem hiding this comment.
Avoiding an additional GetServices request would be useful, but adding the MCP URL as another untyped XAddr would be ambiguous. XAddrs identifies transport addresses for the discovered target service, so the client could not reliably distinguish the Device Service endpoint from the MCP endpoint or depend on their ordering.
If we want this optimization, I think ONVIF should define an explicit WS-Discovery Type, Scope, or extension that advertises AI/MCP support and maps it to the MCP endpoint. Otherwise, GetServices should remain the authoritative and interoperable mechanism for obtaining the typed AI Service endpoint.
The example should also use https://, since the MCP endpoint is protected by TLS.
There was a problem hiding this comment.
Yes @willysagefalk, I agree with your observation. It would be better if we define a specific type, scope, or distinct tag for the MCP service rather than relying on XAddrs. That way, clients could reliably distinguish the MCP endpoint.
|
@willysagefalk we need to start splitting between orange e blue parts. To get to a draft of the service, we must define the orange ones and then the rest can be modelled in WG AI. So, please, let's focus on that and the fact that they have the right extension points so that WG AI can do its work. Then, if we can have al leat a blue item for every orange class it is much better, but not necessary About your points:
|
|
Thanks, Ottavio. I agree that we should now focus on the orange foundational classes and ensure that they provide the necessary extension points for WG AI. The blue classes should primarily be examples used to validate that the foundation works.
WG AI can later specialize this into
With this split, I think the orange foundation should cover:
|
|
Reorganized architecture after today's discussion with @willysagefalk classDiagram
class InformationItem {
<<Abstract>>
+float confidence
+Timestamp productionTime
+Provenance provenance
+Signature signature
+Extensible extensible
}
class InformationEnvelope {
+InformationItem[] items
+Signature signature
}
class Signature {
<<Abstract>>
+Extensible extensible
}
class JsonLDSignature
class Timestamp {
<<Abstract>>
+Extensible extensible
}
class ExactTimestamp {
+DateTime absoluteTime
+Extensible extensible
}
class RelativeTimestamp {
+DateTime baseTime
+Integer offsetMinutes
+Extensible extensible
}
class Provenance {
<<Abstract>>
+Extensible extensible
}
class Location {
<<Abstract>>
+Extensible extensible
}
class GPSLocation {
+float latitude
+float longitude
+float height
+Extensible extensible
}
class Observation {
<<Abstract>>
+Location observedSpace
}
class PeopleDetectionObservation {
+string input
+Procedure procedure
+string[] featureVector
+Extensible extensible
}
class Assertion {
<<Abstract>>
+InformationItem[] supportedBy
}
class ReidentificationAssertion {
+Procedure procedure
+Extensible extensible
}
class Procedure {
+string procedureModel
+string procedureVersion
+Extensible extensible
}
class Extensible {
<<Abstract>>
+VendorExtension[] vendorExtensions
}
class VendorExtension {
+string vendor_namespace
+string name
+Any value
}
%% Core Associations
InformationEnvelope "1" --> "1..*" InformationItem
InformationEnvelope "1" --> "0..1" Signature
InformationItem "1" --> "1" Timestamp
InformationItem "1" --> "1" Provenance
InformationItem "1" --> "0..1" Signature
Observation "1" --> "1" Location
Assertion "1" --> "1..*" InformationItem
PeopleDetectionObservation "1" --> "1" Procedure
ReidentificationAssertion "1" --> "1" Procedure
%% Extension Associations
Extensible "1" --> "0..*" VendorExtension
InformationItem "1" --> "0..1" Extensible
Timestamp "1" --> "0..1" Extensible
Provenance "1" --> "0..1" Extensible
Location "1" --> "0..1" Extensible
Procedure "1" --> "0..1" Extensible
Signature "1" --> "0..1" Extensible
%% Inheritance
InformationItem <|-- Observation
InformationItem <|-- Assertion
Timestamp <|-- ExactTimestamp
Timestamp <|-- RelativeTimestamp
Signature <|-- JsonLDSignature
Location <|-- GPSLocation
Observation <|-- PeopleDetectionObservation
Assertion <|-- ReidentificationAssertion
%% Styles: Orange Group
style InformationItem fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style InformationEnvelope fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Signature fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style JsonLDSignature fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Timestamp fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Provenance fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Location fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Observation fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Assertion fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Extensible fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style VendorExtension fill:#fff3e0,stroke:#f57c00,stroke-width:2px
%% Styles: Blue Group
style ExactTimestamp fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style RelativeTimestamp fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style GPSLocation fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style PeopleDetectionObservation fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style ReidentificationAssertion fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style Procedure fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
Items to be put in the AI Service to nurture the discussion classDiagram
class InformationItem {
<<Abstract>>
+float confidence
+Timestamp productionTime
+Provenance provenance
+Signature signature
+Extensible extensible
}
class InformationEnvelope {
+InformationItem[] items
+Signature signature
}
class Signature {
<<Abstract>>
+Extensible extensible
}
class JsonLDSignature
class Timestamp {
<<Abstract>>
+Extensible extensible
}
class Provenance {
<<Abstract>>
+Extensible extensible
}
class Location {
<<Abstract>>
+Extensible extensible
}
class Observation {
<<Abstract>>
+Location observedSpace
}
class Assertion {
<<Abstract>>
+InformationItem[] supportedBy
}
class Extensible {
<<Abstract>>
+VendorExtension[] vendorExtensions
}
class VendorExtension {
+string vendor_namespace
+string name
+Any value
}
%% Core Associations
InformationEnvelope "1" --> "1..*" InformationItem
InformationEnvelope "1" --> "0..1" Signature
InformationItem "1" --> "1" Timestamp
InformationItem "1" --> "1" Provenance
InformationItem "1" --> "0..1" Signature
Observation "1" --> "1" Location
Assertion "1" --> "1..*" InformationItem
%% Extension Associations
Extensible "1" --> "0..*" VendorExtension
InformationItem "1" --> "0..1" Extensible
Timestamp "1" --> "0..1" Extensible
Provenance "1" --> "0..1" Extensible
Location "1" --> "0..1" Extensible
Signature "1" --> "0..1" Extensible
%% Inheritance
InformationItem <|-- Observation
InformationItem <|-- Assertion
Signature <|-- JsonLDSignature
%% Styles: Orange Group
style InformationItem fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style InformationEnvelope fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Signature fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style JsonLDSignature fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Timestamp fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Provenance fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Location fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Observation fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Assertion fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Extensible fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style VendorExtension fill:#fff3e0,stroke:#f57c00,stroke-width:2px
|
|
Reorganized my UML also. We agreed on the core part of Ottavios post. classDiagram
class InformationEnvelope {
+EnvelopeId id
+Timestamp productionTime
+Provenance packagingProvenance
+InformationItem[] items
+Manifest manifest
+Signature envelopeSignature
+Extensible extensible
}
class Manifest {
+ItemDescriptor[] entries
+string canonicalizationMethod
+Extensible extensible
}
class ItemDescriptor {
+InformationItemRef item
+string itemType
+HashValue contentHash
}
class InformationItem {
<<Abstract>>
+ItemId id
+Timestamp productionTime
+Provenance provenance
+Signature itemSignature
+Extensible extensible
}
class InformationItemRef {
+ItemId id
+URI envelopeLocator
}
class Signature {
<<Abstract>>
+string signatureScheme
+VerificationMethodRef verificationMethod
+IRI targetId
+HashValue signedHash
+bytes signatureValue
+Extensible extensible
}
class Timestamp {
<<Abstract>>
+Extensible extensible
}
class Provenance {
<<Abstract>>
+ProducerRef producer
+Procedure procedure
+InformationItemRef[] inputs
+Extensible extensible
}
class Procedure {
<<Abstract>>
+IRI id
+string version
+Extensible extensible
}
class Location {
<<Abstract>>
+IRI id
+CoordinateFrameRef coordinateFrame
+Extensible extensible
}
class ObservationResult {
<<Abstract>>
+Extensible extensible
}
class Observation {
<<Abstract>>
+Timestamp observedTime
+Location observedSpace
+ObservationResult result
}
class Statement {
<<Abstract>>
+Extensible extensible
}
class Assertion {
<<Abstract>>
+float confidence
+Statement statement
+InformationItemRef[] basedOn
}
class Extensible {
+Extension[] extensions
}
class Extension {
+IRI type
+URI schema
+JsonValue value
}
class DataIntegrityProof {
+string cryptosuite
+string proofPurpose
+DateTime created
+string proofValue
}
class ExactTimestamp {
+DateTime absoluteTime
}
class RelativeTimestamp {
+ClockRef clock
+Integer offsetTicks
+Integer ticksPerSecond
}
class GPSLocation {
+float latitude
+float longitude
+float height
}
class ObservedSpaceLocation {
+ObservedSpaceRef observedSpace
}
class AIModelProcedure {
+ModelRef model
+string modelVersion
+Parameter[] parameters
}
class ObjectObservation {
+ObjectObservationResult result
}
class ObjectObservationResult {
+PhysicalObjectRef object
+Classification classification
+Geometry geometry
+float confidence
+Uncertainty uncertainty
+FeatureVectorRef featureVector
}
class SpaceObservation {
+SpaceObservationResult result
}
class SpaceObservationResult {
+IRI observedProperty
+JsonValue value
+float confidence
+Uncertainty uncertainty
}
class IdentityStatement {
+EntityRef subjectA
+IRI relationship
+EntityRef subjectB
}
class ReidentificationAssertion {
+IdentityStatement statement
+PhysicalObjectRef resolvedIdentity
}
%% Envelope containment and authenticity
InformationEnvelope "1" *-- "1..*" InformationItem : contains
InformationEnvelope "1" *-- "1" Manifest : describes
Manifest "1" *-- "1..*" ItemDescriptor : entries
ItemDescriptor "1" --> "1" InformationItemRef : identifies
InformationEnvelope "1" --> "1" Provenance : packaging provenance
InformationEnvelope "1" --> "0..1" Signature : envelope signature
InformationItem "1" --> "1" Provenance : item provenance
InformationItem "1" --> "0..1" Signature : item signature
%% Provenance and graph references
Provenance "1" --> "0..1" Procedure : used procedure
Provenance "1" --> "0..*" InformationItemRef : input references
Assertion "1" --> "1..*" InformationItemRef : based on
%% Observation and assertion structure
Observation "1" *-- "1" Timestamp : observed time
Observation "1" --> "1" Location : observed space
Observation "1" *-- "1" ObservationResult : result
Assertion "1" *-- "1" Statement : proposition
%% Extension mechanism
Extensible "1" *-- "0..*" Extension : extensions
%% Abstract inheritance
InformationItem <|-- Observation
InformationItem <|-- Assertion
Signature <|-- DataIntegrityProof
Timestamp <|-- ExactTimestamp
Timestamp <|-- RelativeTimestamp
Location <|-- GPSLocation
Location <|-- ObservedSpaceLocation
Procedure <|-- AIModelProcedure
ObservationResult <|-- ObjectObservationResult
ObservationResult <|-- SpaceObservationResult
Observation <|-- ObjectObservation
Observation <|-- SpaceObservation
Statement <|-- IdentityStatement
Assertion <|-- ReidentificationAssertion
%% Concrete specialization constraints
ObjectObservation "1" --> "1" ObjectObservationResult : result type
SpaceObservation "1" --> "1" SpaceObservationResult : result type
ReidentificationAssertion "1" --> "1" IdentityStatement : statement type
%% Orange foundational classes
style InformationEnvelope fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Manifest fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style ItemDescriptor fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style InformationItem fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style InformationItemRef fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Signature fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Timestamp fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Provenance fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Procedure fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Location fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style ObservationResult fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Observation fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Statement fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Assertion fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Extensible fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Extension fill:#fff3e0,stroke:#f57c00,stroke-width:2px
%% Blue concrete examples
style DataIntegrityProof fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style ExactTimestamp fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style RelativeTimestamp fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style GPSLocation fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style ObservedSpaceLocation fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style AIModelProcedure fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style ObjectObservation fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style ObjectObservationResult fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style SpaceObservation fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style SpaceObservationResult fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style IdentityStatement fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style ReidentificationAssertion fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
|
|
Quick question @willysagefalk , why did you add orange boxes? For me an orange box is a box to be defined in this PR and/or effort, while a blue box is to be defined by WG AI. Therefore:
Should me blue in my opinion. Remember the goal: we want to have a draft that we can share in Prague, without depriving WG AI of its working topics. |
|
Corrected blue/orange classDiagram
class InformationEnvelope {
+EnvelopeId id
+Timestamp productionTime
+Provenance packagingProvenance
+InformationItem[] items
+Manifest manifest
+Signature envelopeSignature
+Extensible extensible
}
class Manifest {
+ItemDescriptor[] entries
+string canonicalizationMethod
+Extensible extensible
}
class ItemDescriptor {
+InformationItemRef item
+string itemType
+HashValue contentHash
}
class InformationItem {
<<Abstract>>
+ItemId id
+Timestamp productionTime
+Provenance provenance
+Signature itemSignature
+Extensible extensible
}
class InformationItemRef {
+ItemId id
+URI envelopeLocator
}
class Signature {
<<Abstract>>
+string signatureScheme
+VerificationMethodRef verificationMethod
+IRI targetId
+HashValue signedHash
+bytes signatureValue
+Extensible extensible
}
class Timestamp {
<<Abstract>>
+Extensible extensible
}
class Provenance {
<<Abstract>>
+ProducerRef producer
+Procedure procedure
+InformationItemRef[] inputs
+Extensible extensible
}
class Procedure {
<<Abstract>>
+IRI id
+string version
+Extensible extensible
}
class Location {
<<Abstract>>
+IRI id
+CoordinateFrameRef coordinateFrame
+Extensible extensible
}
class ObservationResult {
<<Abstract>>
+Extensible extensible
}
class Observation {
<<Abstract>>
+Timestamp observedTime
+Location observedSpace
+ObservationResult result
}
class Statement {
<<Abstract>>
+Extensible extensible
}
class Assertion {
<<Abstract>>
+float confidence
+Statement statement
+InformationItemRef[] basedOn
}
class Extensible {
+Extension[] extensions
}
class Extension {
+IRI type
+URI schema
+JsonValue value
}
class DataIntegrityProof {
+string cryptosuite
+string proofPurpose
+DateTime created
+string proofValue
}
class ExactTimestamp {
+DateTime absoluteTime
}
class RelativeTimestamp {
+ClockRef clock
+Integer offsetTicks
+Integer ticksPerSecond
}
class GPSLocation {
+float latitude
+float longitude
+float height
}
class ObservedSpaceLocation {
+ObservedSpaceRef observedSpace
}
class AIModelProcedure {
+ModelRef model
+string modelVersion
+Parameter[] parameters
}
class ObjectObservation {
+ObjectObservationResult result
}
class ObjectObservationResult {
+PhysicalObjectRef object
+Classification classification
+Geometry geometry
+float confidence
+Uncertainty uncertainty
+FeatureVectorRef featureVector
}
class SpaceObservation {
+SpaceObservationResult result
}
class SpaceObservationResult {
+IRI observedProperty
+JsonValue value
+float confidence
+Uncertainty uncertainty
}
class IdentityStatement {
+EntityRef subjectA
+IRI relationship
+EntityRef subjectB
}
class ReidentificationAssertion {
+IdentityStatement statement
+PhysicalObjectRef resolvedIdentity
}
%% Envelope containment and authenticity
InformationEnvelope "1" *-- "1..*" InformationItem : contains
InformationEnvelope "1" *-- "1" Manifest : describes
Manifest "1" *-- "1..*" ItemDescriptor : entries
ItemDescriptor "1" --> "1" InformationItemRef : identifies
InformationEnvelope "1" --> "1" Provenance : packaging provenance
InformationEnvelope "1" --> "0..1" Signature : envelope signature
InformationItem "1" --> "1" Provenance : item provenance
InformationItem "1" --> "0..1" Signature : item signature
%% Provenance and graph references
Provenance "1" --> "0..1" Procedure : used procedure
Provenance "1" --> "0..*" InformationItemRef : input references
Assertion "1" --> "1..*" InformationItemRef : based on
%% Observation and assertion structure
Observation "1" *-- "1" Timestamp : observed time
Observation "1" --> "1" Location : observed space
Observation "1" *-- "1" ObservationResult : result
Assertion "1" *-- "1" Statement : proposition
%% Extension mechanism
Extensible "1" *-- "0..*" Extension : extensions
%% Abstract inheritance
InformationItem <|-- Observation
InformationItem <|-- Assertion
Signature <|-- DataIntegrityProof
Timestamp <|-- ExactTimestamp
Timestamp <|-- RelativeTimestamp
Location <|-- GPSLocation
Location <|-- ObservedSpaceLocation
Procedure <|-- AIModelProcedure
ObservationResult <|-- ObjectObservationResult
ObservationResult <|-- SpaceObservationResult
Observation <|-- ObjectObservation
Observation <|-- SpaceObservation
Statement <|-- IdentityStatement
Assertion <|-- ReidentificationAssertion
%% Concrete specialization constraints
ObjectObservation "1" --> "1" ObjectObservationResult : result type
SpaceObservation "1" --> "1" SpaceObservationResult : result type
ReidentificationAssertion "1" --> "1" IdentityStatement : statement type
%% Orange: foundation proposed for the Prague draft
style InformationEnvelope fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style InformationItem fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Signature fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Timestamp fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Provenance fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Procedure fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Location fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Observation fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Assertion fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Extensible fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style Extension fill:#fff3e0,stroke:#f57c00,stroke-width:2px
%% Blue: definitions and specializations for continued WG AI work
style Manifest fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style ItemDescriptor fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style InformationItemRef fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style Statement fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style ObservationResult fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style DataIntegrityProof fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style ExactTimestamp fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style RelativeTimestamp fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style GPSLocation fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style ObservedSpaceLocation fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style AIModelProcedure fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style ObjectObservation fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style ObjectObservationResult fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style SpaceObservation fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style SpaceObservationResult fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style IdentityStatement fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style ReidentificationAssertion fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
|
|
So @willysagefalk after you last change I think we have one last pending task before we focus on the document here and how it integrates with the rest of the ONVIF specs: how do we hand the work on the blue boxes over to WG AI with order? I expect the disucssion to be big, I think we should parition the blu boxes in multiple issues in the repo of WG AI. Do you have a proposal for splitting the discussion? PS: in your schema I think there is a weakness In your definition of So, first of all you have a conflict between the base class and the derived classes. Second, if you keep My proposal is to remove the generic |
|
Yes. I suggest one tracking issue preserving the agreed orange architecture, with four blue work items: 1. Observation and Assertion information modelDefine Observation and Assertion together because their semantics and graph relationships must be consistent. Scope includes:
2. Time, Space and TopologyDefine the shared temporal and spatial model used by Observations and Assertions. Scope includes:
3. InformationEnvelope, Authenticity and ProvenanceDefine how individual InformationItems and collections of items are bound, authenticated and traced to their origin. Scope includes:
4. SOSA/SSN InteroperabilityDefine SOSA as an optional interoperability mapping or specialization. Scope includes:
Suggested order
Each issue should identify its expected LinkML output, dependencies and at least one end-to-end example. The tracking issue can then show how the four work packages assemble into the complete WG AI information model. |
|
The foundation should define only AuthenticityProof. The WG shall evaluate at least an embedded W3C Data Integrity proof and a manifest-based proof. Data Integrity is suitable for independently protected JSON-LD items; a manifest-based profile is likely better for batched envelopes, extraction, provenance chains and multiple producers. |
I disagree on this, I see no value in having two mechanisms of the same thing, Verifiable Credential Data Integrity already exists and does not need to be invented from scratch. The manifest approach is chatter, not exsisting and most important, it is not clear what problem solves that Verifiable Credential Data Integrity does not. Anyway, as discussed in today's telco, I will open a work item in video enhancement. WG AI does not have the compenecy in cryptography that we need to discuss this |
Proposed AI information-model work itemsBased on the discussion, I propose dividing the information-model work into the following four work items. The common time concepts are included in the same work item as objects, observations, and assertions. 1. Objects, Observations, Assertions, and TimeDefine the core model for representing perceived objects, observations, and conclusions derived from observations. Scope
Expected output
This work item does not define spatial topology or authenticity mechanisms. 2. Space, Topology, and Coordinate SystemsDefine how physical and logical spaces are represented and how objects, observations, and assertions refer to them. Scope
Expected output
Temporal semantics are defined by Work Item 1 and should not be independently redefined here. 3. Information Envelopes, Provenance, and AuthenticityDefine how information items are packaged, attributed, transported, and protected. Scope
Expected output
This work item should distinguish provenance—where information came from—from authenticity—how its integrity and origin can be verified. 4. SOSA/SSN and External Semantic InteroperabilityDefine how the ONVIF information model interoperates with SOSA/SSN and other relevant semantic models without making those models mandatory for basic ONVIF implementations. Scope
Expected output
SOSA alignment should remain an interoperability layer. It should not prevent ONVIF from defining the concepts required by physical-security systems. |
|
Following the call of WG AI on Aug 12th, this draft PR was broken down into several parts, as listed in the top comment. This PR is still open, to accommodate @bsriramprasad 's feedback in #818 and to revert the changes on the Security service. Once these items are done, I think that we can let circulate the first draft at the F2F meeting in Prague, |
| required: true | ||
| description: Production timestamp of the information item. | ||
| provenance: | ||
| range: Provenance |
There was a problem hiding this comment.
To make the information item more useful we should instead link to a process. Every information item is created by some process. That process have have different types of provenance information such as things like version, dependencies, inputs etc.
Separately from this lineage information can be added to link this information item to other information items that it was derived_from.
There was a problem hiding this comment.
In my proposal, Provenance is abstract to allow modelling different "authors" of statements: for example it can be a process, a person or a device. I am open to deriving a ProcessProvenance
| description: >- | ||
| Abstract production-time descriptor for an InformationItem. | ||
| attributes: | ||
| extensible: |
There was a problem hiding this comment.
Can't we extend by subclassing or sending separate information items? Generic extension fields give no clear migration path to the standard.
There was a problem hiding this comment.
The extensible attribute for proprietary extensions is here just to automatically inherit it in real classes. Just to avoid having to repeat it in every class (and have the risk of forgetting it)
IQSIGHT high level commentsWe suggest to first align on the overall structure before looking at details. ScopeThis section defines some acronyms. It should contain what the spec covers.
Acronyms
Overview and ArchitectureSuggest to have one or two informative sections describing the overal concept RequirementsAs other ONVIF specs the specification should focus on device requirements. Section 8 Service Discovery and Data ExchangeAvoid requiring devices to support two schema representationsLooks like section 8.3.2 requires schema in LinkML and 8.3.4 in JSON schema. Prefer using only JSON on device level for maxmimum interoperability. Section 8.4.2 and 8.4.3We really like the analytics functionality. Making these functions mandatory for every Additionally the parameters of these functions should have some attention. Classical ONVIF APIsShouldn't we include here the proposal for mapping ONVIF functions the MCP? Metadata Event DeliveryThis section should be named Event or Message Delivery. 9 Authentication and AuthorizationDestinguish between MCP request authorization and message signing. 10 MetadataThis section defines events not metadata. 10.5.1.2 Proof fieldsHard to imagine how to maintain access to public keys of large distributed systems. |
|
I agree that we should align the scope, architecture and terminology before continuing with the detailed schemas and message flows. A few proposed conclusions:
The specification should clearly state that the Agentic Service complements existing ONVIF services. We should not redefine ONVIF Device or ONVIF Client as MCP-specific concepts. In the MCP sections, we can instead use the established terms MCP Server, MCP Client and MCP Host. “Metadata Event Delivery” should be renamed to “Event Delivery” or “Message Delivery”. The unused WSDL-MCP Bridge term should either be given a clear architectural role or removed.
The current background and architecture sections can be simplified into one or two informative sections showing how the Agentic Service relates to existing ONVIF services. Normative requirements should primarily apply to the service implementation. Client requirements should only be included where they are necessary for interoperability.
I agree that a device should not be required to expose both LinkML and JSON Schema. LinkML can remain the normative source model used by ONVIF, while JSON Schema, MCP inputSchema and the JSON-LD context are generated runtime artifacts exposed by the service. The schema identifier and JSON-LD context should remain separate.
I agree that the current three mandatory Skills are too restrictive. Generic MCP discovery should form the baseline. Analytics-specific tools should be conditional capabilities mandatory only when advertised and should align with the existing ONVIF analytics specifications.
This is an important part of the architecture. We should show two separate implementation paths: devices that expose the Agentic Service natively, and an ONVIF-to-MCP gateway that communicates with existing products through their current ONVIF APIs while exposing their capabilities as MCP tools and resources. This allows existing ONVIF products to participate without firmware changes.
These are separate concerns. JWT bearer tokens authorize individual MCP requests. InformationItem or InformationEnvelope signatures provide durable integrity and producer authenticity after information has been forwarded or stored. An access JWT cannot replace such a signature.
I suggest renaming this chapter to Information Model. Observation, Assertion, InformationItem, provenance and envelopes are information objects. They may be delivered as events, but they may also be retrieved, stored or referenced by other information objects. |
Initial draft pull request to gather feedback on the AI specs being written right now.
Current status
AI.xmlis been writtenSecurity.xmlTentative scheduling
Topics to be included
Work items generated during this discussion
I expect this PR to be used as a shared notepad about the specs begin developed. Once ready, this will be closed a new a formal PR will be created.