fix: remove hardcoded image model fallback
Don't silently swap to a different model when the user's selection is unknown. Pass whatever the user configured to OpenRouter and let the API error clearly. Fallback chain: caller hint → saved option → PRAUTOBLOGGER_DEFAULT_IMAGE_MODEL constant. Cost estimation for unknown models logs a warning and uses a conservative $0.05 estimate. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -30,28 +30,35 @@ class PRAutoBlogger_OpenRouter_Image_Pricing {
|
|||||||
'openai/gpt-5-image' => 0.08,
|
'openai/gpt-5-image' => 0.08,
|
||||||
];
|
];
|
||||||
|
|
||||||
/** @var string Default model when none is configured. */
|
|
||||||
public const DEFAULT_MODEL = 'google/gemini-2.5-flash-image';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resolve the model identifier from a hint, falling back to site option,
|
* Resolve the model identifier from a hint, falling back to site option,
|
||||||
* then to the hardcoded default.
|
* then to the PRAUTOBLOGGER_DEFAULT_IMAGE_MODEL constant.
|
||||||
|
*
|
||||||
|
* Never silently swaps to a different model — if the user picked something,
|
||||||
|
* we send it to OpenRouter and let the API error if it's invalid. That way
|
||||||
|
* the user sees a clear log message instead of getting billed for a model
|
||||||
|
* they didn't choose.
|
||||||
*
|
*
|
||||||
* @param string $hint Caller-supplied model identifier (may be empty).
|
* @param string $hint Caller-supplied model identifier (may be empty).
|
||||||
* @return string OpenRouter model id.
|
* @return string OpenRouter model id.
|
||||||
*/
|
*/
|
||||||
public function resolve_model( string $hint ): string {
|
public function resolve_model( string $hint ): string {
|
||||||
$hint = trim( $hint );
|
$hint = trim( $hint );
|
||||||
if ( '' === $hint ) {
|
if ( '' !== $hint ) {
|
||||||
$hint = (string) get_option( 'prautoblogger_image_model', self::DEFAULT_MODEL );
|
|
||||||
}
|
|
||||||
// Validate the model exists in our cost table; fall back to default.
|
|
||||||
if ( ! isset( self::COST_PER_IMAGE[ $hint ] ) ) {
|
|
||||||
return self::DEFAULT_MODEL;
|
|
||||||
}
|
|
||||||
return $hint;
|
return $hint;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$saved = trim( (string) get_option( 'prautoblogger_image_model', '' ) );
|
||||||
|
if ( '' !== $saved ) {
|
||||||
|
return $saved;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Last resort: use the constant from prautoblogger.php (admin can change it).
|
||||||
|
return defined( 'PRAUTOBLOGGER_DEFAULT_IMAGE_MODEL' )
|
||||||
|
? PRAUTOBLOGGER_DEFAULT_IMAGE_MODEL
|
||||||
|
: 'google/gemini-2.5-flash-image';
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Estimate USD cost for a single image at the given model.
|
* Estimate USD cost for a single image at the given model.
|
||||||
*
|
*
|
||||||
@@ -64,7 +71,16 @@ class PRAutoBlogger_OpenRouter_Image_Pricing {
|
|||||||
* @return float USD cost rounded to 6 decimals.
|
* @return float USD cost rounded to 6 decimals.
|
||||||
*/
|
*/
|
||||||
public function estimate_cost( int $width, int $height, string $model ): float {
|
public function estimate_cost( int $width, int $height, string $model ): float {
|
||||||
return round( self::COST_PER_IMAGE[ $model ] ?? self::COST_PER_IMAGE[ self::DEFAULT_MODEL ], 6 );
|
if ( isset( self::COST_PER_IMAGE[ $model ] ) ) {
|
||||||
|
return round( self::COST_PER_IMAGE[ $model ], 6 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unknown model — log it and use a conservative $0.05 estimate.
|
||||||
|
PRAutoBlogger_Logger::instance()->warning(
|
||||||
|
sprintf( 'No pricing data for image model "%s". Using $0.05 estimate.', $model ),
|
||||||
|
'openrouter-image'
|
||||||
|
);
|
||||||
|
return 0.05;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user