Skip to content

Commit 2fc31d3

Browse files
committed
gif mime type for animated images
1 parent 20c802a commit 2fc31d3

File tree

4 files changed

+51
-34
lines changed

4 files changed

+51
-34
lines changed

expose.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ struct sd_generation_inputs
209209
struct sd_generation_outputs
210210
{
211211
int status = -1;
212+
int animated = 0;
212213
const char * data = "";
213214
};
214215

kcpp_sdui.embd

Lines changed: 18 additions & 18 deletions
Large diffs are not rendered by default.

koboldcpp.py

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ class sd_generation_inputs(ctypes.Structure):
322322

323323
class sd_generation_outputs(ctypes.Structure):
324324
_fields_ = [("status", ctypes.c_int),
325+
("animated", ctypes.c_int),
325326
("data", ctypes.c_char_p)]
326327

327328
class whisper_load_model_inputs(ctypes.Structure):
@@ -1862,9 +1863,11 @@ def sd_generate(genparams):
18621863
inputs.vid_req_avi = vid_req_avi
18631864
ret = handle.sd_generate(inputs)
18641865
outstr = ""
1866+
animated = False
18651867
if ret.status==1:
18661868
outstr = ret.data.decode("UTF-8","ignore")
1867-
return outstr
1869+
animated = True if ret.animated else False
1870+
return {"animated": animated, "data":outstr}
18681871

18691872

18701873
def whisper_load_model(model_filename):
@@ -4086,13 +4089,13 @@ def do_POST(self):
40864089
if (api_format == 4 or api_format == 3) and "stream" in genparams and genparams["stream"]:
40874090
sse_stream_flag = True
40884091

4089-
gen = asyncio.run(self.handle_request(genparams, api_format, sse_stream_flag))
4092+
gendat = asyncio.run(self.handle_request(genparams, api_format, sse_stream_flag))
40904093

40914094
try:
40924095
# Headers are already sent when streaming
40934096
if not sse_stream_flag:
40944097
self.send_response(200)
4095-
genresp = (json.dumps(gen).encode())
4098+
genresp = (json.dumps(gendat).encode())
40964099
self.send_header('content-length', str(len(genresp)))
40974100
self.end_headers(content_type='application/json')
40984101
self.wfile.write(genresp)
@@ -4104,7 +4107,7 @@ def do_POST(self):
41044107
self.end_headers(content_type='text/event-stream')
41054108
toolsdata_res = []
41064109
try:
4107-
toolsdata_res = gen['choices'][0]['message']['tool_calls']
4110+
toolsdata_res = gendat['choices'][0]['message']['tool_calls']
41084111
if toolsdata_res and len(toolsdata_res)>0:
41094112
toolsdata_res[0]["index"] = 0 # need to add an index for OWUI
41104113
except Exception:
@@ -4131,17 +4134,19 @@ def do_POST(self):
41314134
elif is_oai_imggen:
41324135
genparams = sd_oai_tranform_params(genparams)
41334136
gen = sd_generate(genparams)
4137+
gendat = gen["data"]
4138+
genanim = gen["animated"]
41344139
genresp = None
41354140
if is_comfyui_imggen:
4136-
if gen:
4137-
lastgeneratedcomfyimg = base64.b64decode(gen)
4141+
if gendat:
4142+
lastgeneratedcomfyimg = base64.b64decode(gendat)
41384143
else:
41394144
lastgeneratedcomfyimg = b''
41404145
genresp = (json.dumps({"prompt_id": "12345678-0000-0000-0000-000000000001","number": 0,"node_errors":{}}).encode())
41414146
elif is_oai_imggen:
4142-
genresp = (json.dumps({"created":int(time.time()),"data":[{"b64_json":gen}],"background":"opaque","output_format":"png","size":"1024x1024","quality":"medium"}).encode())
4147+
genresp = (json.dumps({"created":int(time.time()),"data":[{"b64_json":gendat}],"background":"opaque","output_format":"png","size":"1024x1024","quality":"medium"}).encode())
41434148
else:
4144-
genresp = (json.dumps({"images":[gen],"parameters":{},"info":""}).encode())
4149+
genresp = (json.dumps({"images":[gendat],"parameters":{},"info":"","animated":genanim}).encode())
41454150
self.send_response(200)
41464151
self.send_header('content-length', str(len(genresp)))
41474152
self.end_headers(content_type='application/json')
@@ -4153,8 +4158,8 @@ def do_POST(self):
41534158
return
41544159
elif is_transcribe:
41554160
try:
4156-
gen = whisper_generate(genparams)
4157-
genresp = (json.dumps({"text":gen}).encode())
4161+
gendat = whisper_generate(genparams)
4162+
genresp = (json.dumps({"text":gendat}).encode())
41584163
self.send_response(200)
41594164
self.send_header('content-length', str(len(genresp)))
41604165
self.end_headers(content_type='application/json')
@@ -4166,10 +4171,10 @@ def do_POST(self):
41664171
return
41674172
elif is_tts:
41684173
try:
4169-
gen = tts_generate(genparams)
4174+
gendat = tts_generate(genparams)
41704175
wav_data = b''
4171-
if gen:
4172-
wav_data = base64.b64decode(gen) # Decode the Base64 string into binary data
4176+
if gendat:
4177+
wav_data = base64.b64decode(gendat) # Decode the Base64 string into binary data
41734178
self.send_response(200)
41744179
self.send_header('content-length', str(len(wav_data))) # Set content length
41754180
self.send_header('Content-Disposition', 'attachment; filename="output.wav"')
@@ -4182,18 +4187,18 @@ def do_POST(self):
41824187
return
41834188
elif is_embeddings:
41844189
try:
4185-
gen = embeddings_generate(genparams)
4190+
gendat = embeddings_generate(genparams)
41864191
outdatas = []
41874192
odidx = 0
4188-
for od in gen["data"]:
4193+
for od in gendat["data"]:
41894194
if genparams.get("encoding_format", "")=="base64":
41904195
binary_data = struct.pack('<' + 'f' * len(od), *od)
41914196
b64_string = base64.b64encode(binary_data).decode('utf-8')
41924197
outdatas.append({"object":"embedding","index":odidx,"embedding":b64_string})
41934198
else:
41944199
outdatas.append({"object":"embedding","index":odidx,"embedding":od})
41954200
odidx += 1
4196-
genresp = (json.dumps({"object":"list","data":outdatas,"model":friendlyembeddingsmodelname,"usage":{"prompt_tokens":gen["count"],"total_tokens":gen["count"]}}).encode())
4201+
genresp = (json.dumps({"object":"list","data":outdatas,"model":friendlyembeddingsmodelname,"usage":{"prompt_tokens":gendat["count"],"total_tokens":gendat["count"]}}).encode())
41974202
self.send_response(200)
41984203
self.send_header('content-length', str(len(genresp)))
41994204
self.end_headers(content_type='application/json')

otherarch/sdcpp/sdtype_adapter.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,7 @@ sd_generation_outputs sdtype_generate(const sd_generation_inputs inputs)
499499
{
500500
printf("\nWarning: KCPP image generation not initialized!\n");
501501
output.data = "";
502+
output.animated = 0;
502503
output.status = 0;
503504
return output;
504505
}
@@ -653,6 +654,7 @@ sd_generation_outputs sdtype_generate(const sd_generation_inputs inputs)
653654
if (!resok) {
654655
printf("\nKCPP SD: resize extra image failed!\n");
655656
output.data = "";
657+
output.animated = 0;
656658
output.status = 0;
657659
return output;
658660
}
@@ -812,6 +814,7 @@ sd_generation_outputs sdtype_generate(const sd_generation_inputs inputs)
812814
if (params.width <= 0 || params.width % 64 != 0 || params.height <= 0 || params.height % 64 != 0) {
813815
printf("\nKCPP SD: bad request image dimensions!\n");
814816
output.data = "";
817+
output.animated = 0;
815818
output.status = 0;
816819
return output;
817820
}
@@ -827,12 +830,14 @@ sd_generation_outputs sdtype_generate(const sd_generation_inputs inputs)
827830
if (nx < 64 || ny < 64 || nx > 2048 || ny > 2048 || nc!= 3) {
828831
printf("\nKCPP SD: bad input image dimensions %d x %d!\n",nx,ny);
829832
output.data = "";
833+
output.animated = 0;
830834
output.status = 0;
831835
return output;
832836
}
833837
if (!input_image_buffer) {
834838
printf("\nKCPP SD: load image from memory failed!\n");
835839
output.data = "";
840+
output.animated = 0;
836841
output.status = 0;
837842
return output;
838843
}
@@ -846,6 +851,7 @@ sd_generation_outputs sdtype_generate(const sd_generation_inputs inputs)
846851
if (!resok) {
847852
printf("\nKCPP SD: resize image failed!\n");
848853
output.data = "";
854+
output.animated = 0;
849855
output.status = 0;
850856
return output;
851857
}
@@ -869,6 +875,7 @@ sd_generation_outputs sdtype_generate(const sd_generation_inputs inputs)
869875
if (!resok) {
870876
printf("\nKCPP SD: resize image failed!\n");
871877
output.data = "";
878+
output.animated = 0;
872879
output.status = 0;
873880
return output;
874881
}
@@ -924,10 +931,12 @@ sd_generation_outputs sdtype_generate(const sd_generation_inputs inputs)
924931
if (results == NULL) {
925932
printf("\nKCPP SD generate failed!\n");
926933
output.data = "";
934+
output.animated = 0;
927935
output.status = 0;
928936
return output;
929937
}
930938

939+
bool wasanim = false;
931940

932941
for (int i = 0; i < params.batch_count; i++) {
933942
if (results[i].data == NULL) {
@@ -944,6 +953,7 @@ sd_generation_outputs sdtype_generate(const sd_generation_inputs inputs)
944953
uint8_t * out_data = nullptr;
945954
size_t out_len = 0;
946955
int status = 0;
956+
wasanim = true;
947957

948958
if(vid_req_avi==1)
949959
{
@@ -1012,6 +1022,7 @@ sd_generation_outputs sdtype_generate(const sd_generation_inputs inputs)
10121022

10131023
free(results);
10141024
output.data = recent_data.c_str();
1025+
output.animated = (wasanim?1:0);
10151026
output.status = 1;
10161027
total_img_gens += 1;
10171028
return output;

0 commit comments

Comments
 (0)