PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 3.6.0
AI Engine – The Chatbot, AI Framework & MCP for WordPress v3.6.0
3.6.0 3.5.9 3.5.8 3.5.7 3.5.6 3.5.5 3.5.4 3.5.3 3.5.2 3.5.1 3.5.0 3.4.9 3.4.8 3.4.7 0.2.1 1.6.91 0.2.2 1.6.92 0.2.3 1.6.93 0.2.4 1.6.94 0.2.5 1.6.95 0.2.6 1.6.96 0.2.7 1.6.97 0.2.8 1.6.98 0.2.9 1.6.99 0.3.0 1.7.0 0.3.1 1.7.1 0.3.2 1.7.2 0.3.3 1.7.3 0.3.4 1.7.4 0.3.5 1.7.5 0.3.6 1.7.6 0.4.0 1.7.7 0.4.1 1.7.8 0.4.2 1.7.9 0.4.3 1.8.0 0.4.4 1.8.1 0.4.5 1.8.2 0.4.6 1.8.3 0.4.7 1.8.4 0.4.8 1.8.5 0.4.9 1.8.6 0.5.0 1.8.7 0.5.1 1.8.8 0.5.2 1.8.9 0.5.3 1.9.0 0.5.4 1.9.1 0.5.5 1.9.2 0.5.6 1.9.3 0.5.7 1.9.4 0.5.8 1.9.5 0.5.9 1.9.6 0.6.0 1.9.7 0.6.1 1.9.8 0.6.2 1.9.81 0.6.3 1.9.82 0.6.4 1.9.83 0.6.5 1.9.84 0.6.6 1.9.85 0.6.7 1.9.86 0.6.8 1.9.87 0.6.9 1.9.88 0.7.0 1.9.89 0.7.1 1.9.90 0.7.2 1.9.91 0.7.3 1.9.92 0.7.4 1.9.93 0.7.5 1.9.94 0.7.6 1.9.95 0.7.7 1.9.96 0.7.8 1.9.97 0.7.9 1.9.98 0.8.0 1.9.99 0.8.1 2.0.0 0.8.2 2.0.1 0.8.3 2.0.2 0.8.4 2.0.3 0.8.5 2.0.4 0.8.6 2.0.5 0.8.7 2.0.6 0.8.8 2.0.7 0.8.9 2.0.8 0.9.0 2.0.9 0.9.2 2.1.0 0.9.3 2.1.1 0.9.4 2.1.2 0.9.5 2.1.3 0.9.6 2.1.4 0.9.7 2.1.5 0.9.8 2.1.6 0.9.81 2.1.7 0.9.82 2.1.8 0.9.83 2.1.9 0.9.84 2.2.0 0.9.85 2.2.1 0.9.86 2.2.2 0.9.87 2.2.3 0.9.88 2.2.4 0.9.89 2.2.5 0.9.9 2.2.51 0.9.91 2.2.52 0.9.92 2.2.53 0.9.93 2.2.54 0.9.94 2.2.56 0.9.95 2.2.57 0.9.96 2.2.6 0.9.97 2.2.60 0.9.98 2.2.61 0.9.99 2.2.62 1.0.0 2.2.63 1.0.01 2.2.70 1.0.1 2.2.80 1.0.2 2.2.81 1.0.3 2.2.90 1.0.4 2.2.91 1.0.5 2.2.92 1.0.6 2.2.93 1.0.7 2.2.94 1.0.8 2.2.95 1.0.9 2.3.0 1.1.0 2.3.1 1.1.1 2.3.2 1.1.2 2.3.3 1.1.3 2.3.4 1.1.4 2.3.5 1.1.5 2.3.6 1.1.6 2.3.7 1.1.7 2.3.8 1.1.8 2.3.9 1.1.9 2.4.0 1.2.0 2.4.1 1.2.1 2.4.2 1.2.2 2.4.3 1.2.21 2.4.4 1.2.3 2.4.5 1.2.30 2.4.6 1.3.0 2.4.7 1.3.1 2.4.8 1.3.2 2.4.9 1.3.3 2.5.0 1.3.31 2.5.1 1.3.32 2.5.2 1.3.33 2.5.3 1.3.34 2.5.4 1.3.35 2.5.5 1.3.36 2.5.6 1.3.37 2.5.7 1.3.38 2.5.8 1.3.39 2.5.9 1.3.40 2.6.0 1.3.41 2.6.1 1.3.42 2.6.2 1.3.43 2.6.3 1.3.44 2.6.5 1.3.45 2.6.6 1.3.46 2.6.7 1.3.47 2.6.8 1.3.48 2.6.9 1.3.49 2.7.0 1.3.50 2.7.1 1.3.51 2.7.2 1.3.52 2.7.3 1.3.53 2.7.4 1.3.54 2.7.5 1.3.56 2.7.6 1.3.57 2.7.7 1.3.58 2.7.8 1.3.59 2.7.9 1.3.60 2.8.0 1.3.61 2.8.1 1.3.62 2.8.2 1.3.63 2.8.3 1.3.64 2.8.4 1.3.65 2.8.5 1.3.66 2.8.6 1.3.67 2.8.7 1.3.68 2.8.8 1.3.69 2.8.9 1.3.70 2.9.0 1.3.71 2.9.1 1.3.72 2.9.2 1.3.73 2.9.3 1.3.74 2.9.4 1.3.75 2.9.5 1.3.76 2.9.6 1.3.77 2.9.7 1.3.78 2.9.8 1.3.79 2.9.9 1.3.80 3.0.0 1.3.81 3.0.1 1.3.82 3.0.2 1.3.83 3.0.3 1.3.84 3.0.4 1.3.85 3.0.5 1.3.86 3.0.6 1.3.87 3.0.7 1.3.88 3.0.8 1.3.89 3.0.9 1.3.90 3.1.0 1.3.91 3.1.1 1.3.92 3.1.2 1.3.93 3.1.3 1.3.94 3.1.4 1.3.95 3.1.5 1.3.96 3.1.6 1.3.97 3.1.7 1.3.98 3.1.8 1.3.99 3.1.9 1.4.0 3.2.0 1.4.1 3.2.1 1.4.2 3.2.2 1.4.3 3.2.3 1.4.4 3.2.4 1.4.5 3.2.5 1.4.6 3.2.6 1.4.7 3.2.7 1.4.8 3.2.8 1.4.9 3.2.9 1.5.0 3.3.0 1.5.1 3.3.1 1.5.2 3.3.2 1.5.3 3.3.3 1.5.4 3.3.4 1.5.5 3.3.5 1.5.6 3.3.6 1.5.7 3.3.7 1.5.8 3.3.8 1.5.9 3.3.9 1.6.0 3.4.0 1.6.1 3.4.1 1.6.2 3.4.2 1.6.3 3.4.3 1.6.5 3.4.4 1.6.51 3.4.5 1.6.52 3.4.6 1.6.53 1.6.54 1.6.55 1.6.56 1.6.57 1.6.58 1.6.59 1.6.60 1.6.61 1.6.62 1.6.63 1.6.64 1.6.65 1.6.66 1.6.67 1.6.68 trunk 1.6.69 0.0.1 1.6.70 0.0.2 1.6.71 0.0.3 1.6.72 0.0.4 1.6.73 0.0.5 1.6.74 0.0.6 1.6.75 0.0.7 1.6.76 0.0.8 1.6.77 0.0.9 1.6.78 0.1.0 1.6.79 0.1.1 1.6.81 0.1.2 1.6.82 0.1.3 1.6.83 0.1.4 1.6.84 0.1.5 1.6.85 0.1.6 1.6.86 0.1.7 1.6.87 0.1.8 1.6.88 0.1.9 1.6.89 0.2.0 1.6.90
ai-engine / labs / wpai-gateway-image-model.php
ai-engine / labs Last commit date
mcp-core.php 1 day ago mcp-oauth.php 1 month ago mcp-rest.php 3 weeks ago mcp.conf 1 year ago mcp.js 8 months ago mcp.md 8 months ago mcp.php 1 week ago wpai-connectors.php 2 months ago wpai-gateway-availability.php 2 months ago wpai-gateway-directory.php 2 months ago wpai-gateway-image-model.php 2 months ago wpai-gateway-model.php 2 months ago wpai-gateway-providers.php 2 months ago wpai-gateway.php 2 months ago
wpai-gateway-image-model.php
137 lines
1 <?php
2 /**
3 * ImageGenerationModel for the AI Engine gateway.
4 *
5 * Routes AiClient image prompts through `Meow_MWAI_Query_Image` and wraps the
6 * resulting image URLs as `File` parts on a `ModelMessage` inside a
7 * `GenerativeAiResult`.
8 */
9
10 use WordPress\AiClient\Common\Exception\RuntimeException;
11 use WordPress\AiClient\Files\DTO\File;
12 use WordPress\AiClient\Messages\DTO\Message;
13 use WordPress\AiClient\Messages\DTO\MessagePart;
14 use WordPress\AiClient\Messages\DTO\ModelMessage;
15 use WordPress\AiClient\Providers\DTO\ProviderMetadata;
16 use WordPress\AiClient\Providers\Models\Contracts\ModelInterface;
17 use WordPress\AiClient\Providers\Models\DTO\ModelConfig;
18 use WordPress\AiClient\Providers\Models\DTO\ModelMetadata;
19 use WordPress\AiClient\Providers\Models\ImageGeneration\Contracts\ImageGenerationModelInterface;
20 use WordPress\AiClient\Results\DTO\Candidate;
21 use WordPress\AiClient\Results\DTO\GenerativeAiResult;
22 use WordPress\AiClient\Results\DTO\TokenUsage;
23 use WordPress\AiClient\Results\Enums\FinishReasonEnum;
24
25 class Meow_MWAI_Labs_WPAI_Gateway_ImageModel implements ModelInterface, ImageGenerationModelInterface {
26
27 private ModelMetadata $modelMetadata;
28 private ProviderMetadata $providerMetadata;
29 private ModelConfig $config;
30
31 public function __construct( ModelMetadata $modelMetadata, ProviderMetadata $providerMetadata ) {
32 $this->modelMetadata = $modelMetadata;
33 $this->providerMetadata = $providerMetadata;
34 $this->config = new ModelConfig();
35 }
36
37 public function metadata(): ModelMetadata { return $this->modelMetadata; }
38 public function providerMetadata(): ProviderMetadata { return $this->providerMetadata; }
39 public function setConfig( ModelConfig $config ): void { $this->config = $config; }
40 public function getConfig(): ModelConfig { return $this->config; }
41
42 public function generateImageResult( array $prompt ): GenerativeAiResult {
43 $core = Meow_MWAI_Labs_WPAI_Gateway::$core;
44 if ( ! $core ) {
45 throw new RuntimeException( 'AI Engine core unavailable.' );
46 }
47
48 $model_id = $this->modelMetadata->getId();
49 $env = $this->resolve_env_for_model( $core, $model_id );
50 if ( ! $env ) {
51 throw new RuntimeException( sprintf(
52 'No AI Engine environment is configured for model "%s".',
53 $model_id
54 ) );
55 }
56
57 // Collapse all text parts across the prompt into a single image prompt.
58 $text = '';
59 foreach ( $prompt as $msg ) {
60 if ( ! $msg instanceof Message ) { continue; }
61 foreach ( $msg->getParts() as $part ) {
62 if ( $part instanceof MessagePart && $part->getType()->isText() ) {
63 $text .= (string) $part->getText();
64 }
65 }
66 }
67 if ( $text === '' ) {
68 throw new RuntimeException( 'Empty image prompt.' );
69 }
70
71 $query = new Meow_MWAI_Query_Image( $text );
72 $query->set_scope( 'wp-ai-client' );
73 $query->set_env_id( $env['id'] );
74 $query->set_model( $model_id );
75
76 $reply = $core->run_query( $query );
77
78 // AI Engine places generated images in $reply->results as a list of URLs.
79 // Fall back to $reply->result if results is empty.
80 $urls = [];
81 if ( ! empty( $reply->results ) && is_array( $reply->results ) ) {
82 foreach ( $reply->results as $u ) {
83 if ( is_string( $u ) && $u !== '' ) {
84 $urls[] = $u;
85 }
86 }
87 }
88 if ( empty( $urls ) && ! empty( $reply->result ) ) {
89 $urls[] = (string) $reply->result;
90 }
91 if ( empty( $urls ) ) {
92 throw new RuntimeException( 'Image generation returned no URLs.' );
93 }
94
95 $candidates = [];
96 foreach ( $urls as $url ) {
97 $file = new File( $url );
98 $part = new MessagePart( $file );
99 $message = new ModelMessage( [ $part ] );
100 $candidates[] = new Candidate( $message, FinishReasonEnum::stop() );
101 }
102
103 $tokens = new TokenUsage( 0, 0, 0 );
104 $id = (string) ( $reply->id ?? uniqid( 'mwai-img-', true ) );
105 return new GenerativeAiResult(
106 $id,
107 $candidates,
108 $tokens,
109 $this->providerMetadata,
110 $this->modelMetadata
111 );
112 }
113
114 private function resolve_env_for_model( $core, string $model_id ): ?array {
115 $options = $core->get_all_options();
116 $engines = $options['ai_engines'] ?? [];
117 $engine_type_for_model = null;
118 foreach ( $engines as $engine ) {
119 foreach ( $engine['models'] ?? [] as $m ) {
120 if ( ( $m['model'] ?? '' ) === $model_id ) {
121 $engine_type_for_model = $engine['type'] ?? null;
122 break 2;
123 }
124 }
125 }
126 if ( ! $engine_type_for_model ) {
127 return null;
128 }
129 foreach ( $options['ai_envs'] ?? [] as $env ) {
130 if ( ( $env['type'] ?? '' ) === $engine_type_for_model ) {
131 return $env;
132 }
133 }
134 return null;
135 }
136 }
137