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:
AdaptKerasBlockis a lightweight stateless helper. Eachinfer()call builds a fresh model, sooperation="predict"checks architecture and shape compatibility but does not reuse weights from a previousoperation="train"call.AdaptKerasMCPBlockis the production-oriented path for train-then-predict workflows. It uses SQLite metadata plusModelLifecycleweight persistence, sofit,predict,evaluate,export, andloadoperate on named models.- Advanced users can call
backend_capabilitiesplus 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 |