Skip to content

Commit d9c4ffb

Browse files
authored
Merge pull request #417 from Pipelex/release/v0.14.3
Release/v0.14.3
2 parents 3f0621a + b36ec60 commit d9c4ffb

19 files changed

Lines changed: 285 additions & 394 deletions

File tree

File renamed without changes.

.pipelex/inference/backends/blackboxai.toml

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,18 @@ inputs = ["text", "images"]
7878
outputs = ["text", "structured"]
7979
costs = { input = 15.00, output = 75.00 }
8080

81-
[claude-sonnet-4]
81+
[claude-4-sonnet]
8282
model_id = "blackboxai/anthropic/claude-sonnet-4"
8383
inputs = ["text", "images"]
8484
outputs = ["text", "structured"]
8585
costs = { input = 3.00, output = 15.00 }
8686

87+
["claude-4.5-sonnet"]
88+
model_id = "blackboxai/anthropic/claude-sonnet-4.5"
89+
inputs = ["text", "images"]
90+
outputs = ["text", "structured"]
91+
costs = { input = 0.28, output = 1.10 }
92+
8793
# --- Google Models ------------------------------------------------------------
8894
["gemini-2.5-flash"]
8995
model_id = "blackboxai/google/gemini-2.5-flash"
@@ -179,3 +185,47 @@ inputs = ["text"]
179185
outputs = ["text", "structured"]
180186
costs = { input = 0.00, output = 0.00 }
181187

188+
189+
################################################################################
190+
# IMAGE GENERATION MODELS
191+
################################################################################
192+
193+
[flux-pro]
194+
model_type = "img_gen"
195+
sdk = "openai_alt_img_gen"
196+
model_id = "blackboxai/black-forest-labs/flux-pro"
197+
inputs = ["text"]
198+
outputs = ["image"]
199+
costs = { input = 0.0, output = 0.04 }
200+
201+
["flux-pro/v1.1"]
202+
model_type = "img_gen"
203+
sdk = "openai_alt_img_gen"
204+
model_id = "blackboxai/black-forest-labs/flux-1.1-pro"
205+
inputs = ["text"]
206+
outputs = ["image"]
207+
costs = { input = 0.0, output = 0.04 }
208+
209+
["flux-pro/v1.1-ultra"]
210+
model_type = "img_gen"
211+
sdk = "openai_alt_img_gen"
212+
model_id = "blackboxai/black-forest-labs/flux-1.1-pro-ultra"
213+
inputs = ["text"]
214+
outputs = ["image"]
215+
costs = { input = 0.0, output = 0.06 }
216+
217+
["fast-lightning-sdxl"]
218+
model_type = "img_gen"
219+
sdk = "openai_alt_img_gen"
220+
model_id = "blackboxai/bytedance/sdxl-lightning-4step"
221+
inputs = ["text"]
222+
outputs = ["image"]
223+
costs = { input = 0.0, output = 0.0014 }
224+
225+
[nano-banana]
226+
model_type = "img_gen"
227+
sdk = "openai_alt_img_gen"
228+
model_id = "blackboxai/google/nano-banana"
229+
inputs = ["text"]
230+
outputs = ["image"]
231+
costs = { input = 0.0, output = 0.039 }

.pipelex/inference/deck/base_deck.toml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818

1919
[aliases]
2020
base-claude = "claude-4.5-sonnet"
21-
base-gpt = "gpt-5"
21+
base-gpt = "gpt-4o"
2222
base-gemini = "gemini-2.5-flash"
2323
base-mistral = "mistral-medium"
2424

25-
best-gpt = "gpt-5"
25+
best-gpt = "gpt-4o"
2626
best-claude = "claude-4.1-opus"
2727
best-gemini = "gemini-2.5-pro"
2828
best-mistral = "mistral-medium"
@@ -40,14 +40,14 @@ smart_llm = [
4040
"claude-4.5-sonnet",
4141
"claude-4.1-opus",
4242
"claude-4-sonnet",
43-
"gpt-5",
4443
"gemini-2.5-pro",
44+
"gpt-5",
4545
]
4646
llm_for_large_codebase = ["gemini-2.5-pro", "claude-4.5-sonnet", "gpt-5"]
4747

4848
# Image generation aliases
49-
base-img-gen = "flux-pro/v1.1"
50-
best-img-gen = "flux-pro/v1.1-ultra"
49+
base-img-gen = "flux-pro/v1.1-ultra"
50+
best-img-gen = "nano-banana"
5151
fast-img-gen = "fast-lightning-sdxl"
5252

5353
####################################################################################################

.pipelex/inference/routing_profiles.toml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,16 @@ default = "pipelex_inference"
3535
"claude-*" = "pipelex_inference"
3636
"grok-*" = "pipelex_inference"
3737
"gemini-*" = "pipelex_inference"
38-
"*-sdxl" = "fal"
39-
"flux-*" = "fal"
38+
"*-sdxl" = "blackboxai"
39+
"flux-*" = "blackboxai"
40+
"nano-banana" = "blackboxai"
4041
"gpt-image-1" = "openai"
4142
"mistral-ocr" = "mistral"
4243

44+
[profiles.all_blackboxai]
45+
description = "Use BlackBoxAI backend for all its supported models"
46+
default = "blackboxai"
47+
4348
[profiles.all_bedrock]
4449
description = "Use Bedrock backend for all its supported models"
4550
default = "bedrock"

CHANGELOG.md

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,32 @@
11
# Changelog
22

3+
## [v0.14.3] - 2025-10-29
4+
5+
### Added
6+
- Image generation models via BlackBoxAI backend: `flux-pro`, `flux-pro/v1.1`, `flux-pro/v1.1-ultra` (Black Forest Labs), `fast-lightning-sdxl` (ByteDance), and `nano-banana` (Google). Implemented using new `openai_alt_img_gen` SDK worker with chat completion-style API.
7+
- Language model: `claude-4.5-sonnet` (Anthropic) via BlackBoxAI backend.
8+
- Routing profile: `all_blackboxai` profile routes all supported model requests to BlackBoxAI backend.
9+
10+
### Changed
11+
- Model aliases in `base_deck.toml`: `base-img-gen``flux-pro/v1.1-ultra`, `best-img-gen``nano-banana`, `llm_for_large_codebase` now includes `claude-4.5-sonnet`.
12+
- Configuration file: `BLACKBOX_RULES.md` renamed to `.blackboxrules`.
13+
14+
### Fixed
15+
- Image generation schema: `ImgGenJobParams.seed` field now explicitly defined with `default=None`.
16+
- CLI bundle validation: `pipelex validate` command now accepts bundle path (`.plx` file) which are in the package and already loaded and performs dry run on all pipes in the bundle.
17+
18+
319
## [v0.14.2] - 2025-10-29
420

521
### Chaged
6-
722
- Improved pipe builder.
823

924
### Added
10-
1125
- CLI to generate inputs JSON.
1226

1327
## [v0.14.1] - 2025-10-27
1428

1529
### Added
16-
1730
- Tutorial GIF on the README.md file.
1831

1932
## [v0.14.0] - 2025-10-27

pipelex/cli/commands/validate_cmd.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

33
import asyncio
4+
from pathlib import Path
45
from typing import TYPE_CHECKING, Annotated
56

67
import click
@@ -15,15 +16,17 @@
1516
from pipelex.builder.builder_validation import validate_dry_run_bundle_blueprint
1617
from pipelex.core.interpreter import PipelexInterpreter
1718
from pipelex.exceptions import LibraryLoadingError, PipeInputError
18-
from pipelex.hub import get_pipes, get_required_pipe, get_telemetry_manager
19+
from pipelex.hub import get_library_manager, get_pipes, get_required_pipe, get_telemetry_manager
1920
from pipelex.pipe_run.dry_run import dry_run_pipe, dry_run_pipes
2021
from pipelex.pipelex import Pipelex
2122
from pipelex.system.runtime import IntegrationMode
2223
from pipelex.system.telemetry.events import EventName, EventProperty
2324
from pipelex.tools.misc.package_utils import get_package_version
2425

2526
if TYPE_CHECKING:
27+
from pipelex.core.pipes.pipe_abstract import PipeAbstract
2628
from pipelex.core.validation_errors import ValidationErrorDetailsProtocol
29+
2730
console = Console()
2831

2932
COMMAND = "validate"
@@ -118,6 +121,19 @@ def validate_cmd(
118121

119122
async def validate_pipe(pipe_code: str | None = None, bundle_path: str | None = None):
120123
if bundle_path:
124+
absolute_bundle_path = str(Path(bundle_path).resolve())
125+
if absolute_bundle_path in get_library_manager().get_loaded_plx_paths():
126+
bundle_blueprint = PipelexInterpreter.load_bundle_blueprint(bundle_path=bundle_path)
127+
if not bundle_blueprint.pipe:
128+
typer.secho(f"Failed to validate bundle '{bundle_path}': no pipes found in bundle", fg=typer.colors.RED, err=True)
129+
raise typer.Exit(1)
130+
pipe_codes = list(bundle_blueprint.pipe.keys())
131+
pipes: list[PipeAbstract] = []
132+
for the_pipe_code in pipe_codes:
133+
pipes.append(get_required_pipe(pipe_code=the_pipe_code))
134+
await dry_run_pipes(pipes=pipes, raise_on_failure=True)
135+
typer.secho(f"✅ Successfully validated all pipes in bundle '{bundle_path}'", fg=typer.colors.GREEN)
136+
return
121137
# When validating a bundle, load_pipe_from_bundle validates ALL pipes in the bundle
122138
try:
123139
bundle_blueprint = PipelexInterpreter.load_bundle_blueprint(bundle_path=bundle_path)

pipelex/cogt/img_gen/img_gen_job_components.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class ImgGenJobParams(BaseModel):
4646
safety_tolerance: int | None = Field(default=None, ge=1, le=6)
4747
is_raw: bool
4848
output_format: OutputFormat = Field(strict=False)
49-
seed: int | None = Field(None, ge=0)
49+
seed: int | None = Field(default=None, ge=0)
5050

5151

5252
class ImgGenJobParamsDefaults(ConfigModel):

pipelex/cogt/img_gen/img_gen_worker_factory.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,23 @@ def make_img_gen_worker(
7070
inference_model=inference_model,
7171
reporting_delegate=reporting_delegate,
7272
)
73+
case "openai_alt_img_gen":
74+
from pipelex.plugins.openai.openai_factory import OpenAIFactory # noqa: PLC0415
75+
from pipelex.plugins.openai.openai_img_gen_alt_worker import OpenAIImgGenAlternativeWorker # noqa: PLC0415
76+
77+
img_gen_sdk_instance = plugin_sdk_registry.get_sdk_instance(plugin=plugin) or plugin_sdk_registry.set_sdk_instance(
78+
plugin=plugin,
79+
sdk_instance=OpenAIFactory.make_openai_client(
80+
plugin=plugin,
81+
backend=backend,
82+
),
83+
)
84+
85+
img_gen_worker = OpenAIImgGenAlternativeWorker(
86+
sdk_instance=img_gen_sdk_instance,
87+
inference_model=inference_model,
88+
reporting_delegate=reporting_delegate,
89+
)
7390
case _:
7491
msg = f"Plugin '{plugin}' is not supported for image generation"
7592
raise NotImplementedError(msg)

pipelex/kit/configs/inference/backends/blackboxai.toml

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,18 @@ inputs = ["text", "images"]
7878
outputs = ["text", "structured"]
7979
costs = { input = 15.00, output = 75.00 }
8080

81-
[claude-sonnet-4]
81+
[claude-4-sonnet]
8282
model_id = "blackboxai/anthropic/claude-sonnet-4"
8383
inputs = ["text", "images"]
8484
outputs = ["text", "structured"]
8585
costs = { input = 3.00, output = 15.00 }
8686

87+
["claude-4.5-sonnet"]
88+
model_id = "blackboxai/anthropic/claude-sonnet-4.5"
89+
inputs = ["text", "images"]
90+
outputs = ["text", "structured"]
91+
costs = { input = 0.28, output = 1.10 }
92+
8793
# --- Google Models ------------------------------------------------------------
8894
["gemini-2.5-flash"]
8995
model_id = "blackboxai/google/gemini-2.5-flash"
@@ -179,3 +185,47 @@ inputs = ["text"]
179185
outputs = ["text", "structured"]
180186
costs = { input = 0.00, output = 0.00 }
181187

188+
189+
################################################################################
190+
# IMAGE GENERATION MODELS
191+
################################################################################
192+
193+
[flux-pro]
194+
model_type = "img_gen"
195+
sdk = "openai_alt_img_gen"
196+
model_id = "blackboxai/black-forest-labs/flux-pro"
197+
inputs = ["text"]
198+
outputs = ["image"]
199+
costs = { input = 0.0, output = 0.04 }
200+
201+
["flux-pro/v1.1"]
202+
model_type = "img_gen"
203+
sdk = "openai_alt_img_gen"
204+
model_id = "blackboxai/black-forest-labs/flux-1.1-pro"
205+
inputs = ["text"]
206+
outputs = ["image"]
207+
costs = { input = 0.0, output = 0.04 }
208+
209+
["flux-pro/v1.1-ultra"]
210+
model_type = "img_gen"
211+
sdk = "openai_alt_img_gen"
212+
model_id = "blackboxai/black-forest-labs/flux-1.1-pro-ultra"
213+
inputs = ["text"]
214+
outputs = ["image"]
215+
costs = { input = 0.0, output = 0.06 }
216+
217+
["fast-lightning-sdxl"]
218+
model_type = "img_gen"
219+
sdk = "openai_alt_img_gen"
220+
model_id = "blackboxai/bytedance/sdxl-lightning-4step"
221+
inputs = ["text"]
222+
outputs = ["image"]
223+
costs = { input = 0.0, output = 0.0014 }
224+
225+
[nano-banana]
226+
model_type = "img_gen"
227+
sdk = "openai_alt_img_gen"
228+
model_id = "blackboxai/google/nano-banana"
229+
inputs = ["text"]
230+
outputs = ["image"]
231+
costs = { input = 0.0, output = 0.039 }

pipelex/kit/configs/inference/deck/base_deck.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818

1919
[aliases]
2020
base-claude = "claude-4.5-sonnet"
21-
base-gpt = "gpt-5"
21+
base-gpt = "gpt-4o"
2222
base-gemini = "gemini-2.5-flash"
2323
base-mistral = "mistral-medium"
2424

25-
best-gpt = "gpt-5"
25+
best-gpt = "gpt-4o"
2626
best-claude = "claude-4.1-opus"
2727
best-gemini = "gemini-2.5-pro"
2828
best-mistral = "mistral-medium"
@@ -40,8 +40,8 @@ smart_llm = [
4040
"claude-4.5-sonnet",
4141
"claude-4.1-opus",
4242
"claude-4-sonnet",
43-
"gpt-5",
4443
"gemini-2.5-pro",
44+
"gpt-4o",
4545
]
4646
llm_for_large_codebase = ["gemini-2.5-pro", "claude-4.5-sonnet", "gpt-5"]
4747

0 commit comments

Comments
 (0)