You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2026/08/14 05:05:03 UTC
(skywalking-query-protocol) branch master updated: genai: typed condition fields and source-aware span addressing (#164)
This is an automated email from the ASF dual-hosted git repository.
wu-sheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking-query-protocol.git
The following commit(s) were added to refs/heads/master by this push:
new 7026430 genai: typed condition fields and source-aware span addressing (#164)
7026430 is described below
commit 7026430e34a328d518f9dbeb77fb953c294a1224
Author: 吴晟 Wu Sheng <wu...@foxmail.com>
AuthorDate: Fri Aug 14 13:04:57 2026 +0800
genai: typed condition fields and source-aware span addressing (#164)
Follow-up to #163, from reviewing the OAP implementation in
apache/skywalking#13943. No OAP submodule pointer references #163 yet,
so these changes are free of client impact.
- Remove `tags` and `GenAIEvaluationRecordTag`. A tag condition exists to
filter key-values the protocol cannot enumerate; this record persists no
user-supplied attribute. `Log` returns `tags` and `LogQueryCondition`
filters them, whereas `GenAIEvaluationRecord` has no `tags` field at all,
so the condition filtered something the API never returns.
- Add `GenAITraceRef` / `GenAITraceRefType`. GenAI evaluation accepts native,
OTLP and Zipkin traces. Native span ids are a segment-local int index;
OTLP and Zipkin ids are 16 hex characters. `spanIndex` is named for what
it is - an index, not an identifier. Scoped to GenAI: `spanId: Int`
elsewhere is correctly scoped to native addressing and is unchanged.
- Split the value slots into `scoreValue` / `booleanValue` / `stringValue`
so `valueType` genuinely discriminates. BOOLEAN previously shared
`scoreValue`, so score-range filters spanned both types.
- Drop `spanType`: `SpanEvaluationType` has one value, so there is nothing
to query and nothing to display.
- Document entity scope and layer on the id fields - provider is a service
and model is its instance, both VIRTUAL_GENAI, while `serviceId` is a
normal agent-detected service.
Scores remain `Long` on the ppm scale; SkyWalking does not carry
Float/Double in stored or transported values.
---
gen-ai-evaluation-record.graphqls | 89 +++++++++++++++++++++++++++------------
1 file changed, 63 insertions(+), 26 deletions(-)
diff --git a/gen-ai-evaluation-record.graphqls b/gen-ai-evaluation-record.graphqls
index 91ef0a2..56729d0 100644
--- a/gen-ai-evaluation-record.graphqls
+++ b/gen-ai-evaluation-record.graphqls
@@ -21,28 +21,59 @@ type GenAIEvaluationRecords {
debuggingTrace: DebuggingTrace
}
+# The addressing scheme of the span an evaluation was produced from.
+enum GenAITraceRefType {
+ # SkyWalking native: trace + segment + segment-local span index.
+ SKYWALKING_NATIVE
+ # OTLP / Zipkin: trace + globally unique hex span id. No segment concept.
+ OTLP
+}
+
+# Points at the span an evaluation was produced from, in whichever addressing scheme
+# its source used. GenAI evaluation accepts SkyWalking native, OTLP and Zipkin traces,
+# and a single span-id type cannot describe all of them.
+type GenAITraceRef {
+ type: GenAITraceRefType!
+ traceId: String!
+ # SKYWALKING_NATIVE only. The segment carrying the span.
+ segmentId: String
+ # SKYWALKING_NATIVE only. Segment-local index (0, 1, 2 ...), NOT an identifier.
+ # Unique only in combination with segmentId.
+ spanIndex: Int
+ # OTLP / Zipkin only. 16 lowercase hex characters, globally unique within the trace.
+ spanId: String
+}
+
type GenAIEvaluationRecord {
- traceId: String
+ traceRef: GenAITraceRef!
+
+ # The application service that issued the GenAI call. SERVICE scope, a normal
+ # (agent-detected) service - its layer is whatever the agent reports.
serviceId: String
serviceName: String
+ # The GenAI provider. SERVICE scope, Layer.VIRTUAL_GENAI (conjectured).
+ # The same entity as GenAIProviderAccess.
providerId: String
providerName: String
+ # The model. SERVICE_INSTANCE scope under the provider service, Layer.VIRTUAL_GENAI.
+ # The same entity as GenAIModelAccess.
modelId: String
modelName: String
+
operationName: String
- # The value type determines which field contains the evaluation value.
- # SCORE and BOOLEAN use scoreValue; STRING and JSON use value.
- valueType: GenAIEvaluationValueType
- # Numeric value stored in evaNumberValue using the 1,000,000 scale. It is populated for SCORE and BOOLEAN.
- scoreValue: Long
- # String or JSON value stored in evalStringValue. It is populated for STRING and JSON.
- value: String
- segmentId: String
- spanId: String
- spanType: String
taskName: String
- evaluationLevel: String
+ # Determines which of the three value fields below is populated.
+ valueType: GenAIEvaluationValueType!
+ # Populated when valueType = SCORE. Carried on the 1,000,000 ppm scale as stored;
+ # divide by 1,000,000 to display the original 0.0-1.0 score.
+ scoreValue: Long
+ # Populated when valueType = BOOLEAN.
+ booleanValue: Boolean
+ # Populated when valueType = STRING or JSON. Parse according to valueType.
+ stringValue: String
+ # The judge's explanation. Populated for every task, whatever the value type.
reason: String
+ evaluationLevel: String
judgeModel: String
evaluationTime: Long
}
@@ -59,33 +90,39 @@ enum GenAIEvaluationValueType {
JSON
}
-input GenAIEvaluationRecordTag {
- key: String!
- value: String
-}
-
input GenAIEvaluationRecordQueryCondition {
- serviceId: ID
+ # The GenAI provider, a VIRTUAL_GENAI service.
providerId: ID
+ # The model, a VIRTUAL_GENAI service instance under the provider.
modelId: ID
- # Filter value_type first when selecting a specific evaluation kind.
+ # The application service that issued the GenAI call.
+ serviceId: ID
+
+ taskName: String
+ # Filter valueType first when selecting a specific evaluation kind.
valueType: GenAIEvaluationValueType
- # Bounds for evaNumberValue, used only with the SCORE value type. Values use the 1,000,000 scale.
+ # Bounds for scoreValue on the 1,000,000 ppm scale, as stored.
+ # Only meaningful when valueType = SCORE.
minScore: Long
maxScore: Long
- # Boolean value to match. This is only used when valueType is BOOLEAN.
+ # Boolean value to match. Only meaningful when valueType = BOOLEAN.
booleanValue: Boolean
- sortBy: GenAIEvaluationRecordSortBy
- taskName: String
evaluationLevel: String
judgeModel: String
- relatedTrace: TraceScopeCondition
+
+ # [Required] queryDuration is required in most queries, the only exception
+ # is when relatedTrace is used.
queryDuration: Duration
+ # Scopes to a SkyWalking native trace, segment and span. OTLP / Zipkin evaluations
+ # are scoped by traceId only - their span ids are not addressable through this
+ # native-oriented condition.
+ relatedTrace: TraceScopeCondition
+
paging: Pagination!
- tags: [GenAIEvaluationRecordTag!]
+ sortBy: GenAIEvaluationRecordSortBy
queryOrder: Order
}
extend type Query {
queryGenAIEvaluationRecord(condition: GenAIEvaluationRecordQueryCondition, debug: Boolean): GenAIEvaluationRecords
-}
\ No newline at end of file
+}