1+ using  BotSharp . Abstraction . Files . Utilities ; 
12using  BotSharp . Abstraction . Instructs . Models ; 
23using  BotSharp . Abstraction . Instructs . Options ; 
34using  BotSharp . OpenAPI . ViewModels . Instructs ; 
@@ -17,6 +18,7 @@ public ImageGenerationController(IServiceProvider services, ILogger<InstructMode
1718        _logger  =  logger ; 
1819    } 
1920
21+     #region Image composition
2022    [ HttpPost ( "/instruct/image-composition" ) ] 
2123    public  async  Task < ImageGenerationViewModel >  ComposeImages ( [ FromBody ]  ImageCompositionRequest  request ) 
2224    { 
@@ -52,4 +54,275 @@ public async Task<ImageGenerationViewModel> ComposeImages([FromBody] ImageCompos
5254            return  imageViewModel ; 
5355        } 
5456    } 
57+     #endregion
58+ 
59+     #region Image generation
60+     [ HttpPost ( "/instruct/image-generation" ) ] 
61+     public  async  Task < ImageGenerationViewModel >  ImageGeneration ( [ FromBody ]  ImageGenerationRequest  request ) 
62+     { 
63+         var  state  =  _services . GetRequiredService < IConversationStateService > ( ) ; 
64+         request . States . ForEach ( x =>  state . SetState ( x . Key ,  x . Value ,  source :  StateSource . External ) ) ; 
65+         var  imageViewModel  =  new  ImageGenerationViewModel ( ) ; 
66+ 
67+         try 
68+         { 
69+             var  fileInstruct  =  _services . GetRequiredService < IFileInstructService > ( ) ; 
70+             var  message  =  await  fileInstruct . GenerateImage ( request . Text ,  new  InstructOptions 
71+             { 
72+                 Provider  =  request . Provider , 
73+                 Model  =  request . Model , 
74+                 AgentId  =  request . AgentId , 
75+                 TemplateName  =  request . TemplateName 
76+             } ) ; 
77+             imageViewModel . Content  =  message . Content ; 
78+             imageViewModel . Images  =  message . GeneratedImages ? . Select ( x =>  ImageViewModel . ToViewModel ( x ) )  ??  [ ] ; 
79+             return  imageViewModel ; 
80+         } 
81+         catch  ( Exception  ex ) 
82+         { 
83+             var  error  =  $ "Error in image generation. { ex . Message } "; 
84+             _logger . LogError ( ex ,  error ) ; 
85+             imageViewModel . Message  =  error ; 
86+             return  imageViewModel ; 
87+         } 
88+     } 
89+     #endregion
90+ 
91+     #region Image variation
92+     [ HttpPost ( "/instruct/image-variation" ) ] 
93+     public  async  Task < ImageGenerationViewModel >  ImageVariation ( [ FromBody ]  ImageVariationFileRequest  request ) 
94+     { 
95+         var  state  =  _services . GetRequiredService < IConversationStateService > ( ) ; 
96+         request . States . ForEach ( x =>  state . SetState ( x . Key ,  x . Value ,  source :  StateSource . External ) ) ; 
97+         var  imageViewModel  =  new  ImageGenerationViewModel ( ) ; 
98+ 
99+         try 
100+         { 
101+             if  ( request . File  ==  null ) 
102+             { 
103+                 return  new  ImageGenerationViewModel  {  Message  =  "Error! Cannot find an image!"  } ; 
104+             } 
105+ 
106+             var  fileInstruct  =  _services . GetRequiredService < IFileInstructService > ( ) ; 
107+             var  message  =  await  fileInstruct . VaryImage ( request . File ,  new  InstructOptions 
108+             { 
109+                 Provider  =  request . Provider , 
110+                 Model  =  request . Model , 
111+                 AgentId  =  request . AgentId , 
112+                 ImageConvertProvider  =  request . ImageConvertProvider 
113+             } ) ; 
114+ 
115+             imageViewModel . Content  =  message . Content ; 
116+             imageViewModel . Images  =  message . GeneratedImages ? . Select ( x =>  ImageViewModel . ToViewModel ( x ) )  ??  [ ] ; 
117+             return  imageViewModel ; 
118+         } 
119+         catch  ( Exception  ex ) 
120+         { 
121+             var  error  =  $ "Error in image variation. { ex . Message } "; 
122+             _logger . LogError ( ex ,  error ) ; 
123+             imageViewModel . Message  =  error ; 
124+             return  imageViewModel ; 
125+         } 
126+     } 
127+ 
128+     [ HttpPost ( "/instruct/image-variation/form" ) ] 
129+     public  async  Task < ImageGenerationViewModel >  ImageVariation ( IFormFile  file ,  [ FromForm ]  ImageVariationRequest  request ) 
130+     { 
131+         var  state  =  _services . GetRequiredService < IConversationStateService > ( ) ; 
132+         request ? . States ? . ForEach ( x =>  state . SetState ( x . Key ,  x . Value ,  source :  StateSource . External ) ) ; 
133+         var  imageViewModel  =  new  ImageGenerationViewModel ( ) ; 
134+ 
135+         try 
136+         { 
137+             var  fileInstruct  =  _services . GetRequiredService < IFileInstructService > ( ) ; 
138+             var  fileData  =  FileUtility . BuildFileDataFromFile ( file ) ; 
139+             var  message  =  await  fileInstruct . VaryImage ( new  InstructFileModel 
140+             { 
141+                 FileData  =  fileData , 
142+                 FileName  =  Path . GetFileNameWithoutExtension ( file . FileName ) , 
143+                 FileExtension  =  Path . GetExtension ( file . FileName ) 
144+             } , 
145+             new  InstructOptions 
146+             { 
147+                 Provider  =  request ? . Provider , 
148+                 Model  =  request ? . Model , 
149+                 AgentId  =  request ? . AgentId , 
150+                 ImageConvertProvider  =  request ? . ImageConvertProvider 
151+             } ) ; 
152+ 
153+             imageViewModel . Content  =  message . Content ; 
154+             imageViewModel . Images  =  message . GeneratedImages ? . Select ( x =>  ImageViewModel . ToViewModel ( x ) )  ??  [ ] ; 
155+             return  imageViewModel ; 
156+         } 
157+         catch  ( Exception  ex ) 
158+         { 
159+             var  error  =  $ "Error in image variation upload. { ex . Message } "; 
160+             _logger . LogError ( ex ,  error ) ; 
161+             imageViewModel . Message  =  error ; 
162+             return  imageViewModel ; 
163+         } 
164+     } 
165+     #endregion
166+ 
167+     #region Image edit
168+     [ HttpPost ( "/instruct/image-edit" ) ] 
169+     public  async  Task < ImageGenerationViewModel >  ImageEdit ( [ FromBody ]  ImageEditFileRequest  request ) 
170+     { 
171+         var  fileInstruct  =  _services . GetRequiredService < IFileInstructService > ( ) ; 
172+         var  state  =  _services . GetRequiredService < IConversationStateService > ( ) ; 
173+         request . States . ForEach ( x =>  state . SetState ( x . Key ,  x . Value ,  source :  StateSource . External ) ) ; 
174+         var  imageViewModel  =  new  ImageGenerationViewModel ( ) ; 
175+ 
176+         try 
177+         { 
178+             if  ( request . File  ==  null ) 
179+             { 
180+                 return  new  ImageGenerationViewModel  {  Message  =  "Error! Cannot find a valid image file!"  } ; 
181+             } 
182+             var  message  =  await  fileInstruct . EditImage ( request . Text ,  request . File ,  new  InstructOptions 
183+             { 
184+                 Provider  =  request . Provider , 
185+                 Model  =  request . Model , 
186+                 AgentId  =  request . AgentId , 
187+                 TemplateName  =  request . TemplateName , 
188+                 ImageConvertProvider  =  request . ImageConvertProvider 
189+             } ) ; 
190+             imageViewModel . Content  =  message . Content ; 
191+             imageViewModel . Images  =  message . GeneratedImages ? . Select ( x =>  ImageViewModel . ToViewModel ( x ) )  ??  [ ] ; 
192+             return  imageViewModel ; 
193+         } 
194+         catch  ( Exception  ex ) 
195+         { 
196+             var  error  =  $ "Error in image edit. { ex . Message } "; 
197+             _logger . LogError ( ex ,  error ) ; 
198+             imageViewModel . Message  =  error ; 
199+             return  imageViewModel ; 
200+         } 
201+     } 
202+ 
203+     [ HttpPost ( "/instruct/image-edit/form" ) ] 
204+     public  async  Task < ImageGenerationViewModel >  ImageEdit ( IFormFile  file ,  [ FromForm ]  ImageEditRequest  request ) 
205+     { 
206+         var  fileInstruct  =  _services . GetRequiredService < IFileInstructService > ( ) ; 
207+         var  state  =  _services . GetRequiredService < IConversationStateService > ( ) ; 
208+         request ? . States ? . ForEach ( x =>  state . SetState ( x . Key ,  x . Value ,  source :  StateSource . External ) ) ; 
209+         var  imageViewModel  =  new  ImageGenerationViewModel ( ) ; 
210+ 
211+         try 
212+         { 
213+             var  fileData  =  FileUtility . BuildFileDataFromFile ( file ) ; 
214+             var  message  =  await  fileInstruct . EditImage ( request ? . Text  ??  string . Empty ,  new  InstructFileModel 
215+             { 
216+                 FileData  =  fileData , 
217+                 FileName  =  Path . GetFileNameWithoutExtension ( file . FileName ) , 
218+                 FileExtension  =  Path . GetExtension ( file . FileName ) 
219+             } , 
220+             new  InstructOptions 
221+             { 
222+                 Provider  =  request ? . Provider , 
223+                 Model  =  request ? . Model , 
224+                 AgentId  =  request ? . AgentId , 
225+                 TemplateName  =  request ? . TemplateName , 
226+                 ImageConvertProvider  =  request ? . ImageConvertProvider 
227+             } ) ; 
228+ 
229+             imageViewModel . Content  =  message . Content ; 
230+             imageViewModel . Images  =  message . GeneratedImages ? . Select ( x =>  ImageViewModel . ToViewModel ( x ) )  ??  [ ] ; 
231+             return  imageViewModel ; 
232+         } 
233+         catch  ( Exception  ex ) 
234+         { 
235+             var  error  =  $ "Error in image edit upload. { ex . Message } "; 
236+             _logger . LogError ( ex ,  error ) ; 
237+             imageViewModel . Message  =  error ; 
238+             return  imageViewModel ; 
239+         } 
240+     } 
241+     #endregion
242+ 
243+     #region Image mask edit
244+     [ HttpPost ( "/instruct/image-mask-edit" ) ] 
245+     public  async  Task < ImageGenerationViewModel >  ImageMaskEdit ( [ FromBody ]  ImageMaskEditFileRequest  request ) 
246+     { 
247+         var  fileInstruct  =  _services . GetRequiredService < IFileInstructService > ( ) ; 
248+         var  state  =  _services . GetRequiredService < IConversationStateService > ( ) ; 
249+         request . States . ForEach ( x =>  state . SetState ( x . Key ,  x . Value ,  source :  StateSource . External ) ) ; 
250+         var  imageViewModel  =  new  ImageGenerationViewModel ( ) ; 
251+ 
252+         try 
253+         { 
254+             var  image  =  request . File ; 
255+             var  mask  =  request . Mask ; 
256+             if  ( image  ==  null  ||  mask  ==  null ) 
257+             { 
258+                 return  new  ImageGenerationViewModel  {  Message  =  "Error! Cannot find a valid image or mask!"  } ; 
259+             } 
260+             var  message  =  await  fileInstruct . EditImage ( request . Text ,  image ,  mask ,  new  InstructOptions 
261+             { 
262+                 Provider  =  request . Provider , 
263+                 Model  =  request . Model , 
264+                 AgentId  =  request . AgentId , 
265+                 TemplateName  =  request . TemplateName , 
266+                 ImageConvertProvider  =  request . ImageConvertProvider 
267+             } ) ; 
268+             imageViewModel . Content  =  message . Content ; 
269+             imageViewModel . Images  =  message . GeneratedImages ? . Select ( x =>  ImageViewModel . ToViewModel ( x ) )  ??  [ ] ; 
270+             return  imageViewModel ; 
271+         } 
272+         catch  ( Exception  ex ) 
273+         { 
274+             var  error  =  $ "Error in image mask edit. { ex . Message } "; 
275+             _logger . LogError ( ex ,  error ) ; 
276+             imageViewModel . Message  =  error ; 
277+             return  imageViewModel ; 
278+         } 
279+     } 
280+ 
281+     [ HttpPost ( "/instruct/image-mask-edit/form" ) ] 
282+     public  async  Task < ImageGenerationViewModel >  ImageMaskEdit ( IFormFile  image ,  IFormFile  mask ,  [ FromForm ]  ImageMaskEditRequest  request ) 
283+     { 
284+         var  fileInstruct  =  _services . GetRequiredService < IFileInstructService > ( ) ; 
285+         var  state  =  _services . GetRequiredService < IConversationStateService > ( ) ; 
286+         request ? . States ? . ForEach ( x =>  state . SetState ( x . Key ,  x . Value ,  source :  StateSource . External ) ) ; 
287+         var  imageViewModel  =  new  ImageGenerationViewModel ( ) ; 
288+ 
289+         try 
290+         { 
291+             var  imageData  =  FileUtility . BuildFileDataFromFile ( image ) ; 
292+             var  maskData  =  FileUtility . BuildFileDataFromFile ( mask ) ; 
293+             var  message  =  await  fileInstruct . EditImage ( request ? . Text  ??  string . Empty , 
294+                 new  InstructFileModel 
295+                 { 
296+                     FileData  =  imageData , 
297+                     FileName  =  Path . GetFileNameWithoutExtension ( image . FileName ) , 
298+                     FileExtension  =  Path . GetExtension ( image . FileName ) 
299+                 } , 
300+                 new  InstructFileModel 
301+                 { 
302+                     FileData  =  maskData , 
303+                     FileName  =  Path . GetFileNameWithoutExtension ( mask . FileName ) , 
304+                     FileExtension  =  Path . GetExtension ( mask . FileName ) 
305+                 } , 
306+                 new  InstructOptions 
307+                 { 
308+                     Provider  =  request ? . Provider , 
309+                     Model  =  request ? . Model , 
310+                     AgentId  =  request ? . AgentId , 
311+                     TemplateName  =  request ? . TemplateName , 
312+                     ImageConvertProvider  =  request ? . ImageConvertProvider 
313+                 } ) ; 
314+ 
315+             imageViewModel . Content  =  message . Content ; 
316+             imageViewModel . Images  =  message . GeneratedImages ? . Select ( x =>  ImageViewModel . ToViewModel ( x ) )  ??  [ ] ; 
317+             return  imageViewModel ; 
318+         } 
319+         catch  ( Exception  ex ) 
320+         { 
321+             var  error  =  $ "Error in image mask edit upload. { ex . Message } "; 
322+             _logger . LogError ( ex ,  error ) ; 
323+             imageViewModel . Message  =  error ; 
324+             return  imageViewModel ; 
325+         } 
326+     } 
327+     #endregion
55328} 
0 commit comments