Learning component tools
This page specifies the four tools that search learning components, return one exact
component, and traverse the supports relationship in both directions.
A learning component is model-generated content decomposed from a published standards
framework item. It is never source-asserted curriculum. Components are kept separate
from standards at every level, so these tools never return a standards node, and
search_standards never returns a component.
What a learning component carries
| Present | Absent |
|---|---|
description |
caseIdentifierUUID / caseIdentifierURI |
tags |
gradeLevel |
identityKey |
statementCode |
author, provider, license, attributionStatement |
statementType |
Grade, code, and statement taxonomy belong to published standards. They are recovered by
following the component's supports relationships, which every tool on this page does
for you.
identityKey is build-relative, not a citable identity. Two components with the same
identityKey and generator version are the same component; components built under
different dedup scopes are not comparable.
search_learning_components
Searches components with package-governed modes and checksum-protected pagination.
Modes
| Mode | Matches | Availability |
|---|---|---|
learning_component_text |
Normalized description tokens or a contiguous phrase | Package textSearch capability |
learning_component_tag |
One controlled tag, matched whole | Always implemented |
learning_component_supported_code_exact |
Exact statement code of a supported standard | Profile code coverage |
learning_component_supported_code_prefix |
Delimiter-bounded code prefix of a supported standard | Profile code coverage plus prefix support |
Check get_capabilities.packages[].implementedLearningComponentSearchModes before using
a supported-code mode. See Framework and capability tools.
Request fields
Package selection is identical to search_standards, because these fields describe the
package rather than the node.
| Field | Type | Default / bound | Meaning |
|---|---|---|---|
cursor |
string or null | null | Opaque continuation cursor |
frameworkIds |
array[string] | empty; max 64 | Framework family filters |
jurisdictions |
array[string] | empty; max 64 | Jurisdiction filters |
languages |
array[string] | empty; max 64 | Language-tag filters |
limit |
integer | 25; 1-100 | Maximum hits on one page |
mode |
enum | required | One of the four modes above |
query |
string | required | Text, tag, or code query |
snapshotIds |
array[string] | empty; max 64 | Exact snapshot filters |
subjects |
array[string] | empty; max 64 | Source subject filters |
match is required for learning_component_text only, and takes the same
tokens/exact_phrase shape as search_standards.
No facet filters
There is no normalizedGrades, statementTypes, or localGradeLabels field. A
component has no facets of its own, and a component supporting standards in several
grades has no single grade to filter on.
{
"request": {
"mode": "learning_component_tag",
"query": "fractions",
"jurisdictions": ["Ghana"],
"limit": 25
}
}
Result fields
The result contains effectiveScope, page, and selectedPackages, the identities of
the packages searched. The page states mode, which is the retrieval method of every
hit, and epistemicStatus: retrieval_candidate once.
Each hit in page.hits reports:
node, the component'snodeId,description, andtags; its identity key, attribution, licence, and hierarchy placements are oneget_learning_componentcall away;graphPackageId, the package the component belongs to, whose full identity is inselectedPackages;score,matchedFields, andmatchedTerms;matchedCodes, thenodeIdandstatementCodeof each supported standard whose code satisfied the query, present only for the supported-code modes; andsupportedStandards, every standard the component supports.
Each entry in supportedStandards carries nodeId, statementCode, description,
gradeLevels, and supportConfidence; a matchedCodes entry points at one of them by
nodeId. Grade and description are projected from the supported standard, not stored
on the component, so a component supporting standards in several grades reports each
grade against the standard that declares it, and an uncoded standard is readable
without a get_standard call:
"supportedStandards": [
{"nodeId": "76fe...", "statementCode": "B5.2.3.1.3", "description": "...", "gradeLevels": ["5"], "supportConfidence": 0.97},
{"nodeId": "53d8...", "statementCode": "B6.2.3.1.3", "description": "...", "gradeLevels": ["6"], "supportConfidence": 0.97}
]
This is why the tool needs no grade filter: every hit already states the grades it serves, so a caller narrows client-side from one response rather than one call per hit.
supportedStandards is always complete, including standards that carry no statement
code. A component supporting a coded and an uncoded standard reports both, so a bridge
is never flattened into a single-standard result.
Reading a bridge
When supportedStandards is longer than matchedCodes, the component also serves
standards your query did not match, frequently in another grade; the text result
marks the standards that did match matched. Of 230 components in the Ghana
mathematics package, 37 support more than one standard and 34 of those span more
than one grade.
Mode semantics
Text mode matches exact normalized tokens. It performs no stemming, lemmatization, fuzzy
matching, or synonym expansion, so fractions does not match fraction.
Tag mode matches a whole normalized facet value. Partial words do not match, and
compatibility-equivalent forms such as cm² and cm2 normalize to one key.
Supported-code modes match against the standards' codes, then return the components supporting those standards. Components attach to the codes the pipeline decomposed, so an exact query against a parent content standard returns nothing when only its children carry components. Use the prefix mode for that question.
A zero-match page establishes only that this exact query did not match. It does not establish that no component covers the concept.
get_learning_component
Returns one exact component by node identifier, with the hierarchy placement of every standard it supports.
Request fields
| Field | Type | Default | Meaning |
|---|---|---|---|
ancestorDepth |
integer | 16; 0-64 | Maximum hierarchy depth walked per supported standard |
frameworkId |
string | required | Framework family ID |
graphType |
enum | academic_standards |
Graph domain to select |
nodeId |
string | required | Exact learning-component node identifier |
snapshotId |
string or null | null | Exact snapshot or unique-current routing |
Components take a node identifier only. They carry no CASE identity, so there is no CASE UUID or URI form.
Result
package identifies the package the record comes from and carries its rights:
packageIdentity and rights. The package's counts, capabilities, and profile facets
are reported by get_framework and get_capabilities; build metadata and the artifact
table are in the package_manifest resource. The same holds for every tool on this page.
node, package, sourceMetadata, and placements. Each placement gives the
supported standard's nodeId, statementCode, description, gradeLevels,
supportConfidence, and hierarchyPaths: every root path from the framework root down
to the standard. Each step carries the node's nodeId, statementCode, and
description. A standard with more than one parent sits on more than one root path, and
each path is reported separately. The text result prints each path as labels, with the
statement code standing for a coded node, followed by its node IDs in the same order:
Mathematics Curriculum for Primary Schools (Basic 4 - 6) > BASIC 5 >
Strand 2. ALGEBRA > Sub-Strand 3: Variables and Equations > B5.2.3.1 > B5.2.3.1.3
The steps are labels and identifiers, not embedded node records, which keeps a
multi-standard component small enough to read; any ancestor is one get_standard call
away.
get_learning_component_context
Returns one component together with the complete source record of every standard it supports — statement type, grade levels, description, and support confidence.
Takes the same request fields as get_learning_component. Use it to traverse from
generated content back to the published curriculum it was decomposed from.
get_learning_components_for_standard
Returns every component supporting one exact standard. This is the other direction of the same edge.
Request fields
| Field | Type | Default | Meaning |
|---|---|---|---|
frameworkId |
string | required | Framework family ID |
graphType |
enum | academic_standards |
Graph domain to select |
identifier |
object | required | Node ID, CASE UUID, or CASE URI |
snapshotId |
string or null | null | Exact snapshot or unique-current routing |
The standard accepts all three identifier forms, because a published standard does have CASE identity.
{
"request": {
"frameworkId": "ghana-nacca-primary-mathematics-basic-4-6",
"identifier": {
"identifierType": "case_identifier_uuid",
"caseIdentifierUuid": "<uuid>"
}
}
}
Result
standard, components, package, and sourceMetadata. Each component reports
supportedStandards — every standard it supports, not only the requested one — so a
component shared across grades is visible as such.
The text result names the standard's statement type and normalized statement type, so
an empty result can be read correctly: a grouping node, or a statement type the pipeline
never decomposed (compare supportedStatementTypes in get_framework_statistics),
legitimately has no components. Standard wording is printed whole; nothing in the
learning-component text output is truncated.
The text also prints what a client needs to cite and open the evidence, even if it reads only text:
- once, for the standard:
Standard URIandStandard learning components URI; - for each component:
Support relationship ID(the storedsupportsrelationship),Support relationship URI,Direction(component -> standard),Component URIand, when the package declares detailed provenance,Component provenance URI.
For example, for Nigeria node e399b510-48bb-58ee-abda-61460a5a853b the one component
20507dfe-4d56-575c-b7ea-33b1f9072300 is supported through relationship
5f89e75a-70c5-5260-b325-31fcba940574. Read any of these URIs with read_evidence or as
a native resource. If package rights deny a resource family, the line says
not readable under package rights instead of being left out. The structured result and
resource links are unchanged.
Traversal directions
search_learning_components ─┐
├─> get_learning_component ──> placements
get_learning_components_for_standard (labelled paths)
▲ │
│ └─> get_learning_component_context
│ │
└────── supports edge ─────────┘
search_* is the entry point, get_* lands on one node, and *_context traverses.
The two directional tools are the two ends of the supports relationship: teaching
workflows read standard to components; grade and bridge analysis reads component to
standards.
Common errors
| Error code | Typical cause |
|---|---|
learning_component_not_found |
Identifier is unavailable or selects another node kind |
capability_unavailable |
Selected package does not implement the requested mode |
invalid_cursor |
Cursor is malformed, stale, or bound to a different request |
framework_not_found |
Framework or snapshot selector is unavailable |
ambiguous_framework |
Unique-current routing cannot select exactly one snapshot |
A cursor from search_standards is never valid for search_learning_components; the
two tools use disjoint mode values and separate cursor bindings.
See Errors, cursors, and limits for boundary behavior.
Next: Comparison tool