Skip to content

Commit efc73d0

Browse files
authored
Merge pull request #393 from BaiMoHan/main
feat: enhance JobHistoryInfo with Task Details and Compatibility Improvements
2 parents 90bc3b6 + b254d03 commit efc73d0

File tree

4 files changed

+61
-14
lines changed

4 files changed

+61
-14
lines changed

fooocusapi/models/common/response.py

+3
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ class JobHistoryInfo(BaseModel):
6161
job history info
6262
"""
6363
job_id: str
64+
in_queue_mills: int
65+
start_mills: int
66+
finish_mills: int
6467
is_finished: bool = False
6568

6669

fooocusapi/routes/query.py

+10-4
Original file line numberDiff line numberDiff line change
@@ -89,15 +89,21 @@ def get_history(job_id: str = None, page: int = 0, page_size: int = 20):
8989
queue = [
9090
JobHistoryInfo(
9191
job_id=item.job_id,
92-
is_finished=item.is_finished
93-
) for item in worker_queue.queue
92+
is_finished=item.is_finished,
93+
in_queue_mills=item.in_queue_mills,
94+
start_mills=item.start_mills,
95+
finish_mills=item.finish_mills,
96+
) for item in worker_queue.queue if not job_id or item.job_id == job_id
9497
]
9598
if not args.persistent:
9699
history = [
97100
JobHistoryInfo(
98101
job_id=item.job_id,
99-
is_finished=item.is_finished
100-
) for item in worker_queue.history
102+
is_finished=item.is_finished,
103+
in_queue_mills=item.in_queue_mills,
104+
start_mills=item.start_mills,
105+
finish_mills=item.finish_mills,
106+
) for item in worker_queue.history if not job_id or item.job_id == job_id
101107
]
102108
return JobHistoryResponse(history=history, queue=queue)
103109

fooocusapi/sql_client.py

+41-7
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
"""
22
SQLite client for Fooocus API
33
"""
4+
import logging
45
import os
56
import time
67
import platform
78
from datetime import datetime
89
from typing import Optional
910
import copy
1011

11-
from sqlalchemy import Integer, Float, VARCHAR, Boolean, JSON, Text, create_engine
12+
from sqlalchemy import Integer, Float, VARCHAR, Boolean, JSON, Text, create_engine, text
1213
from sqlalchemy.orm import declarative_base, Session, Mapped, mapped_column
1314

1415

@@ -38,6 +39,9 @@ class GenerateRecord(Base):
3839

3940
task_id: Mapped[str] = mapped_column(VARCHAR(255), nullable=False, primary_key=True)
4041
task_type: Mapped[str] = mapped_column(Text, nullable=False)
42+
task_in_queue_mills: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
43+
task_start_mills: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
44+
task_finish_mills: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
4145
result_url: Mapped[str] = mapped_column(Text, nullable=True)
4246
finish_reason: Mapped[str] = mapped_column(Text, nullable=True)
4347
date_time: Mapped[int] = mapped_column(Integer, nullable=False)
@@ -75,7 +79,8 @@ class GenerateRecord(Base):
7579

7680
def __repr__(self) -> str:
7781
return f"GenerateRecord(task_id={self.task_id!r}, task_type={self.task_type!r}, \
78-
result_url={self.result_url!r}, finish_reason={self.finish_reason!r}, date_time={self.date_time!r}, \
82+
task_in_queue_mills={self.task_in_queue_mills!r}, task_start_mills={self.task_start_mills!r}, \
83+
result_url={self.result_url!r}, finish_reason={self.finish_reason!r}, date_time={self.date_time!r}, task_finish_mills={self.task_finish_mills!r}, \
7984
prompt={self.prompt!r}, negative_prompt={self.negative_prompt!r}, style_selections={self.style_selections!r}, performance_selection={self.performance_selection!r}, \
8085
aspect_ratios_selection={self.aspect_ratios_selection!r}, base_model_name={self.base_model_name!r}, \
8186
refiner_model_name={self.refiner_model_name!r}, refiner_switch={self.refiner_switch!r}, loras={self.loras!r}, \
@@ -118,6 +123,9 @@ def convert_to_dict_list(obj_list: list[object]) -> list[dict]:
118123
task_info = {
119124
"task_id": obj.task_id,
120125
"task_type": obj.task_type,
126+
"task_in_queue_mills": obj.task_in_queue_mills,
127+
"task_start_mills": obj.task_start_mills,
128+
"task_finish_mills": obj.task_finish_mills,
121129
"result_url": obj.result_url,
122130
"finish_reason": obj.finish_reason,
123131
"date_time": datetime.fromtimestamp(obj.date_time).strftime(
@@ -126,6 +134,9 @@ def convert_to_dict_list(obj_list: list[object]) -> list[dict]:
126134
}
127135
del dict_obj["task_id"]
128136
del dict_obj["task_type"]
137+
del dict_obj['task_in_queue_mills']
138+
del dict_obj['task_start_mills']
139+
del dict_obj['task_finish_mills']
129140
del dict_obj["result_url"]
130141
del dict_obj["finish_reason"]
131142
del dict_obj["date_time"]
@@ -144,6 +155,30 @@ def __init__(self, uri: str):
144155
# 'mysql+pymysql://{username}:{password}@{host}:{port}/{database}'
145156
self.engine = create_engine(uri)
146157
self.session = Session(self.engine)
158+
self.add_columns_if_not_exists()
159+
160+
def add_columns_if_not_exists(self):
161+
"""
162+
Add new columns but keep old data. This function runs automatically.
163+
"""
164+
table_name = GenerateRecord.__tablename__
165+
# Check if the table exists
166+
result = self.session.execute(
167+
text(f"SELECT name FROM sqlite_master WHERE type='table' AND name='{table_name}';"))
168+
if not result.fetchone():
169+
return
170+
171+
result = self.session.execute(text(f"PRAGMA table_info({table_name});"))
172+
columns = [row[1] for row in result.fetchall()]
173+
try:
174+
if 'task_in_queue_mills' not in columns:
175+
self.session.execute(text(f"ALTER TABLE {table_name} ADD COLUMN task_in_queue_mills INTEGER DEFAULT 0;"))
176+
if 'task_start_mills' not in columns:
177+
self.session.execute(text(f"ALTER TABLE {table_name} ADD COLUMN task_start_mills INTEGER DEFAULT 0;"))
178+
if 'task_finish_mills' not in columns:
179+
self.session.execute(text(f"ALTER TABLE {table_name} ADD COLUMN task_finish_mills INTEGER DEFAULT 0;"))
180+
except Exception as e:
181+
logging.error(f"add new columns failed {e}")
147182

148183
def store_history(self, record: dict) -> None:
149184
"""
@@ -220,14 +255,13 @@ def req_to_dict(req: dict) -> dict:
220255

221256

222257
def add_history(
223-
params: dict, task_type: str, task_id: str, result_url: str, finish_reason: str
258+
params: dict, task_info: dict, result_url: str, finish_reason: str
224259
) -> None:
225260
"""
226261
Store history to database
227262
Args:
228263
params:
229-
task_type:
230-
task_id:
264+
task_info:
231265
result_url:
232266
finish_reason:
233267
@@ -237,8 +271,8 @@ def add_history(
237271
adv = copy.deepcopy(params["advanced_params"])
238272
params["advanced_params"] = adv.__dict__
239273
params["date_time"] = int(time.time())
240-
params["task_type"] = task_type
241-
params["task_id"] = task_id
274+
for k, v in task_info.items():
275+
params[k] = v
242276
params["result_url"] = result_url
243277
params["finish_reason"] = finish_reason
244278

fooocusapi/task_queue.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -268,11 +268,15 @@ def finish_task(self, job_id: str):
268268
# save history to database
269269
if self.persistent:
270270
from fooocusapi.sql_client import add_history
271-
272271
add_history(
273272
params=task.req_param.to_dict(),
274-
task_type=task.task_type.value,
275-
task_id=task.job_id,
273+
task_info=dict(
274+
task_type=task.task_type.value,
275+
task_id=task.job_id,
276+
task_in_queue_mills=task.in_queue_mills,
277+
task_start_mills=task.start_mills,
278+
task_finish_mills=task.finish_mills,
279+
),
276280
result_url=",".join([job["url"] for job in data["job_result"]]),
277281
finish_reason=task.task_result[0].finish_reason.value,
278282
)

0 commit comments

Comments
 (0)