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
Original file line number Diff line number Diff line change
Expand Up @@ -13,29 +13,27 @@ filtering or aggregation logic needs the full port and provenance contracts belo
4. Declare inputs/outputs with the same `BlackboardKey<T>` objects used by `ProcessNode`. Never guess or duplicate key strings with inconsistent types.
5. Provide a complete `NodeDefinition`: category, description, typed ports, configuration fields/defaults/ranges, model capability/reference field where relevant, biz applicability, override policy, and parallel safety.
6. Register constructor and Definition together. A registered production node must appear automatically in `alg_pipeline_tool catalog`; never modify a Web list, skill table, or hand-maintained secondary Catalog.
7. Validate configuration in `Init` as a defensive runtime boundary even though static validation runs first. Return errors; do not throw across framework boundaries.
7. Init requires a valid `ValidatedNodePlan` and consumes its `normalized_config`. Keep semantic/runtime checks, but do not repeat schema normalization. Return errors; do not throw across framework boundaries.
8. Add focused GoogleTest coverage for the affected configuration, port failures, outputs, provenance, concurrency declaration, Catalog visibility, and valid composition. Extend an existing suite when it already owns the contract.

Use existing implementations in `src/common_nodes/`, the `src/custom_nodes/` authoring guide, and matching
`tests/unit/nodes/test_*_node.cpp` suites as current templates. Use
`tests/integration/pipeline/test_pipeline_catalog_validator.cpp` for Catalog/Validator integration;
do not copy implementations into documentation.

RFC-0044 config contract: reuse `ValidateAndNormalizeFields` from `contracts` in defensive
initialization, using the same field list as the Definition. `ModelBoundNode` already does this
before model binding. Keep cross-field semantic checks in a shared local helper; do not call
PipelineValidator from a Node. Report processing failures through `Fail` / `Require`.
The Validator normalizes initial fields once. Node initialization checks the Plan's structure
and shares local semantic rules with preflight; do not call PipelineValidator from a Node.
Report processing failures through `Fail` / `Require`.

For complex Node parameters, optionally use `nodes/node_config_parser.h` with an ordinary
parameter struct and a local semantic parser; `PromptGuidedLlmNode` is the compiled example.
Use the parser's `Fields()` in the Definition. `Parse` reuses field validation/defaults;
`ParseNormalized` directly consumes the object already normalized by the Validator or
`ModelBoundNode`, without another normalization or JSON serialization. Preflight and Init
`ParseNormalized` directly consumes the object already normalized by the Validator, without another normalization or JSON serialization. Preflight and Init
run the same semantic rule separately; Process uses the stored parameters. Keep simple
Nodes on the existing direct-reading path and do not introduce a configuration Pipeline Node.

For initial configuration plus runtime Control, use the [Control starter](../../../../dev_support/node_authoring/starter_control_node.cpp):
share field normalization and a local semantic parser, build the replacement before publishing it,
normalize incoming Control updates and share a local semantic parser with Init, build the replacement before publishing it,
and read a consistent configuration snapshot per request. Use `NodeInitContext::Fail` for an
initialization reason; Pipeline adds the instance ID. Follow the [Control guide](../../../../doc/dev_guide/first_control.md)
for schema limits, targeted payloads and the existing Operator/Demo path. Complex algorithms stay
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ does not imply payload compatibility. Follow [the boundary and carrier distincti

Start with [business onboarding](../../../../doc/dev_guide/business_onboarding.md) to select the requested
integration path. Reuse the converters when the external contract is unchanged. Adding a production
binding to the current shared SDK requires matching input and output converters registered with `transport = "operator"`.
binding to the current shared SDK requires matching input and output converters and an explicit IoBinding registration.
For new Operator host types, also register ValueType capacity, initialization and release.
Register ValueTypes and named single-object output allocators through
`adapter/operator_value_type.h`. Keep queue depth out of their callbacks. For multiple outputs
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ vendor runtime integration, or batch scheduling behavior.
- Implement Models against `include/engine/model_interface.h` and neutral sessions from `backend_interface.h`. Put semantic implementations under `src/engine/models/<model>/` and register a complete `ModelDefinition` through `REGISTER_MODEL_WITH_DEFINITION`.
- Implement Backends through `IInferenceBackend`, keep vendor headers/resources under `src/engine/backends/<backend>/`, and register a complete `BackendDefinition` through `REGISTER_BACKEND_WITH_DEFINITION`.
- Definitions declare capability/protocol, concurrency, description, and every supported config field/default/range. PipelineValidator validates these typed fields before planning; a concrete Backend may additionally consume one explicitly declared vendor run-config field when its SDK owns that configuration format. Catalog visibility follows registration without Web or skill edits.
- BackendLoadSpec requires an explicit execution protocol; runtime session checks still verify the actual protocol. Batch policy belongs to the session, not IModel.
- QwenCausalLmModel selects ChatML through its model type; there is no configurable template selector.
- Fixed-batch Model paths call `FixedBatchExecutor::Execute` so padding, dummy removal, and `(req_id, sub_id)` provenance remain consistent.
- Validate model paths/configuration and translate exceptions into framework errors. Vendor types must not escape the concrete Backend.
- Keep loaded Model/Backend sessions session-scoped and lifecycle-safe. Test failed construction/load, protocol and capability mismatch, concurrency compatibility, shape/batch boundaries, padding, and provenance.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@

Use this reference only for Core scheduling, lifecycle, validation, typed Blackboard contracts, or session resources. Configuration-only workflows belong to `pipeline-composer` and must not modify Core.

- `PipelineValidator` is the side-effect-free preflight used by CLI, Web, Skills, and `Pipeline::Build`. Add a rule once here; never create a UI approximation.
- `PipelineValidator` is the side-effect-free preflight used by CLI, Web, Skills, before `Pipeline::BuildFromPlan`. Add a rule once here; never create a UI approximation.
- Validation must happen before model loading or node initialization and return stable codes, JSON Pointer paths, related nodes/ports, suggestions, topological order, and wavefront layers where possible.
- Pipeline consumes only `ValidatedPipelinePlan`; JSON parsing and field normalization belong to the Validator. There is one strict validation path, including test fixtures.
- Runtime parsing and all composition tools are fail-closed and require explicit `id + depends_on`; do not add an implicit sequential path or a compatibility converter.
- Detect registry conflicts, unknown fields/types/ranges, model references/capabilities, self/ordinary cycles, duplicate dependencies, missing producers, duplicate producers, Adapter ingress/egress closure, and parallel write/safety conflicts.
- Define reusable typed keys with `BlackboardKey<T>` and use the same Key in node code and port Definitions. Request data remains in `AlgContext`; shared immutable/model resources remain in `SessionContext`.
Expand Down
21 changes: 0 additions & 21 deletions .github/workflows/adapter-io-review-workspace.yml

This file was deleted.

2 changes: 0 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,5 @@ add_subdirectory(src/tools)
include(CTest)
if(BUILD_TESTING)
include(cmake_ext/GoogleTest.cmake)
option(LLM_EDGEFLOW_SHARDED_TEST_RUNNERS
"Build PCH-enabled sharded Google Test runners" ON)
add_subdirectory(tests)
endif()
9 changes: 3 additions & 6 deletions CMakePresets.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@
"ENABLE_WHISPERCPP": "ON",
"ENABLE_KITELLM": "OFF",
"CMAKE_BUILD_TYPE": "Release",
"ENABLE_REAL_MODEL_TESTS": "OFF",
"LLM_EDGEFLOW_SHARDED_TEST_RUNNERS": "ON"
"ENABLE_REAL_MODEL_TESTS": "OFF"
},
"vendor": {
"llm-edgeflow/selection": {
Expand All @@ -34,8 +33,7 @@
"ENABLE_WHISPERCPP": "OFF",
"ENABLE_KITELLM": "ON",
"CMAKE_BUILD_TYPE": "Release",
"ENABLE_REAL_MODEL_TESTS": "OFF",
"LLM_EDGEFLOW_SHARDED_TEST_RUNNERS": "ON"
"ENABLE_REAL_MODEL_TESTS": "OFF"
},
"vendor": {
"llm-edgeflow/selection": {
Expand All @@ -56,8 +54,7 @@
"ENABLE_WHISPERCPP": "OFF",
"ENABLE_KITELLM": "OFF",
"CMAKE_BUILD_TYPE": "Release",
"ENABLE_REAL_MODEL_TESTS": "OFF",
"LLM_EDGEFLOW_SHARDED_TEST_RUNNERS": "ON"
"ENABLE_REAL_MODEL_TESTS": "OFF"
},
"vendor": {
"llm-edgeflow/selection": {
Expand Down
Loading
Loading