Skip to content

Adapt Keras

Adapt Keras — mvp.adapt_keras

Cluster: ML & Optimisation | Type: component | MCP Tools: 35

Overview

Keras deep-learning component for building, training, evaluating, and exporting Sequential or Functional API neural networks. Layers are specified as a list of LayerConfig objects (Dense, Conv2D, LSTM, Dropout, Flatten); the component infers input shape from the data, attaches the appropriate output layer for classification or regression, compiles with the requested optimizer and loss, and returns per-epoch training history. Missing Keras/backend dependencies are surfaced as loud degradation (ok=false, degraded=true, stable error_code, install guidance), not cosmetic success.

There are two entry points with different persistence behavior:

  • AdaptKerasBlock is a lightweight stateless helper. Each infer() call builds a fresh model, so operation="predict" checks architecture and shape compatibility but does not reuse weights from a previous operation="train" call.
  • AdaptKerasMCPBlock is the production-oriented path for train-then-predict workflows. It uses SQLite metadata plus ModelLifecycle weight persistence, so fit, predict, evaluate, export, and load operate on named models.
  • Advanced users can call backend_capabilities plus explicit native operations (native_model_define, native_compile, native_fit, native_evaluate, native_predict, native_export, native_load). These operations are config-based, allowlisted, resource-limited, path-sandboxed, audited, and do not execute arbitrary Python or unsafe deserialization.

When to use:

  • Building or smoke-testing a custom neural network on tabular or sequential data from within a pipeline step
  • Evaluating a deep-learning approach alongside scikit-learn baselines for model selection
  • Running predictions with a previously trained named model via AdaptKerasMCPBlock
  • Prototyping LSTM or convolutional architectures without writing boilerplate Keras code

Example:

from mvp.adapt_keras import AdaptKerasBlock, KerasInput, LayerConfig

block = AdaptKerasBlock(name="keras")
result = block.infer(KerasInput(
    operation="train",
    layers=[LayerConfig(layer_type="dense", units=32, activation="relu"),
            LayerConfig(layer_type="dropout", dropout_rate=0.2)],
    X=[[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]],
    y=[0, 1, 0],
    epochs=10,
    n_classes=2,
))
# result.value.final_accuracy → training accuracy; result.value.history → per-epoch metrics

For a real train-then-predict workflow, use the MCP block with a stable model name:

from mvp.adapt_keras.keras_mcp.keras_block import AdaptKerasMCPBlock
from mvp.adapt_keras.keras_mcp.schema import MCPKerasInput

block = AdaptKerasMCPBlock(db_path="keras.sqlite")

block.infer(MCPKerasInput(
    op="model_define",
    name="churn_mlp",
    arch_json='{"layers":[{"layer_type":"dense","units":32,"activation":"relu"}]}',
))

block.infer(MCPKerasInput(
    op="fit",
    name="churn_mlp",
    X_json="[[0.1,0.2],[0.3,0.4],[0.5,0.6]]",
    y_json="[0,1,0]",
    epochs=10,
))

predicted = block.infer(MCPKerasInput(
    op="predict",
    name="churn_mlp",
    X_json="[[0.2,0.3]]",
))

Works well with: adapt_pytorch, adapt_sklearn, align_evals

Public API

AdaptKerasBlock(AIBlock[KerasInput, KerasOutput, None])

Keras model builder and trainer.

Field Type Default
name str 'adapt_keras'
resource_bounds ResourceBounds \| None None
usage ResourceUsage field(default_factory=ResourceUsage)

Methods:

infer(data: KerasInput) -> Result[KerasOutput]

capability_plan(op: str, params: dict) -> CapabilityResolution

heavy_dependency_status() -> list[dict]

LayerConfig(BaseModel)

Configuration for a single Keras layer.

Field Type Default
layer_type str 'dense'
units int 64
activation str 'relu'
dropout_rate float 0.0
filters int 32
kernel_size int 3

KerasInput(BaseModel)

Input to AdaptKerasBlock.

Field Type Default
operation Literal['build', 'train', 'predict'] 'build'
layers list[LayerConfig] Field(default_factory=list)
optimizer str 'adam'
loss str 'sparse_categorical_crossentropy'
metrics list[str] Field(default_factory=lambda: ['accuracy'])
epochs int 5
batch_size int 32
X list[list[float]] Field(default_factory=list)
y list[float \| int] Field(default_factory=list)
input_shape list[int] Field(default_factory=list)
n_classes int 2
task Literal['classification', 'regression'] 'classification'
api_type Literal['sequential', 'functional'] 'sequential'
arch_json str '{}'

KerasOutput(BaseModel)

Output from AdaptKerasBlock.

Field Type Default
operation str required
model_summary str required
history dict[str, list[float]] Field(default_factory=dict)
final_loss float 0.0
final_accuracy float 0.0
predictions list[float] Field(default_factory=list)
n_parameters int 0
backend str 'keras'
degraded bool False
degradation_reason str ''
ok bool True
error_code str ''
fallback_used bool False
missing_dependencies list[str] Field(default_factory=list)
unsupported_capabilities list[str] Field(default_factory=list)
warnings list[str] Field(default_factory=list)
completion_state str 'qualified-draft'
warning_card dict Field(default_factory=dict)
evidence dict Field(default_factory=dict)

AdaptKerasMCPBlock(AIBlock[MCPKerasInput, MCPKerasOutput, dict])

Full-featured Keras block with SQLite persistence and ModelLifecycle.

Field Type Default
name str 'adapt_keras_mcp'
db_path str ':memory:'
exports_dir str ''
weights_dir str ''
resource_bounds ResourceBounds \| None None
usage ResourceUsage field(default_factory=ResourceUsage)
state dict field(default_factory=lambda: {'models': {}, 'datasets': {}})

Methods:

infer(data: MCPKerasInput) -> Result[MCPKerasOutput]

MCPKerasInput(BaseModel)

Field Type Default
op Literal['model_define', 'model_list', 'model_info', 'model_delete', 'model_clone', 'fit', 'evaluate', 'tune', 'transfer_learn', 'predict', 'predict_proba', 'embed', 'export', 'export_tflite', 'load', 'preprocess', 'dataset_register', 'dataset_list', 'backend_switch', 'get_info', 'backend_capabilities', 'native_model_define', 'native_compile', 'native_fit', 'native_evaluate', 'native_predict', 'native_export', 'native_load', 'recommend', 'auto', 'list_patterns'] required
brief str ''
name str ''
arch_json str '{}'
api_type Literal['sequential', 'functional'] 'sequential'
task Literal['classification', 'regression'] 'classification'
dataset_name str ''
X_json str '[]'
y_json str '[]'
callbacks_json str '[]'
epochs int 10
batch_size int 32
optimizer str 'adam'
loss str 'sparse_categorical_crossentropy'
metrics_json str '["accuracy"]'
validation_split float 0.0
export_format str 'savedmodel'
export_path str ''
layer_name str ''
tune_budget int 10
search_space_json str '{}'
backbone str ''
freeze_layers int -1
preprocess_op str 'normalize'
new_name str ''
backend str ''
limit int 20
notes str ''
n_classes int 0
native_config_json str '{}'
compile_config_json str '{}'
fit_config_json str '{}'

MCPKerasOutput(BaseModel)

Field Type Default
op str required
ok bool True
name str ''
backend str ''
message str ''
summary str ''
models list[dict[str, Any]] Field(default_factory=list)
datasets list[dict[str, Any]] Field(default_factory=list)
exports list[dict[str, Any]] Field(default_factory=list)
history dict[str, list[float]] Field(default_factory=dict)
final_loss float 0.0
final_accuracy float 0.0
predictions list[Any] Field(default_factory=list)
probabilities list[list[float]] Field(default_factory=list)
embeddings list[list[float]] Field(default_factory=list)
n_parameters int 0
count int 0
metadata dict[str, Any] Field(default_factory=dict)
tune_results list[dict[str, Any]] Field(default_factory=list)
export_path str ''
degraded bool False
degradation_reason str ''
error_code str ''
fallback_used bool False
missing_dependencies list[str] Field(default_factory=list)
unsupported_capabilities list[str] Field(default_factory=list)
warnings list[str] Field(default_factory=list)
completion_state str 'qualified-draft'
warning_card dict[str, Any] Field(default_factory=dict)
evidence dict[str, Any] Field(default_factory=dict)

KerasStore

Sync SQLite store with 4 tables for Keras metadata.

Constructor:

Parameter Type Default
db_path str ':memory:'

Methods:

upsert_model(name: str, arch: dict, api_type: str, backend: str, n_parameters: int) -> int

get_model(name: str) -> dict[str, Any] | None

list_models(limit: int = 50) -> list[dict[str, Any]]

delete_model(name: str) -> bool

upsert_experiment(name: str, model_name: str, dataset_name: str, history: dict, final_loss: float, final_accuracy: float, epochs: int, backend: str, notes: str) -> int

get_experiment(name: str) -> dict[str, Any] | None

list_experiments(model_name: str = '', limit: int = 50) -> list[dict[str, Any]]

upsert_dataset(name: str, X: list, y: list, shape: list) -> int

get_dataset(name: str) -> dict[str, Any] | None

list_datasets(limit: int = 50) -> list[dict[str, Any]]

delete_dataset(name: str) -> bool

upsert_export(name: str, model_name: str, fmt: str, path: str) -> int

get_export(name: str) -> dict[str, Any] | None

list_exports(limit: int = 50) -> list[dict[str, Any]]

count_all() -> dict[str, int]

MCP Tools

Operation Source
model_define keras_mcp
model_list keras_mcp
model_info keras_mcp
model_delete keras_mcp
model_clone keras_mcp
fit keras_mcp
evaluate keras_mcp
tune keras_mcp
transfer_learn keras_mcp
predict keras_mcp
predict_proba keras_mcp
embed keras_mcp
export keras_mcp
export_tflite keras_mcp
load keras_mcp
preprocess keras_mcp
dataset_register keras_mcp
dataset_list keras_mcp
backend_switch keras_mcp
get_info keras_mcp
backend_capabilities keras_mcp
native_model_define keras_mcp
native_compile keras_mcp
native_fit keras_mcp
native_evaluate keras_mcp
native_predict keras_mcp
native_export keras_mcp
native_load keras_mcp
recommend keras_mcp
auto keras_mcp
list_patterns keras_mcp
sequential keras_mcp
functional keras_mcp
classification keras_mcp
regression keras_mcp