Create worker metrics manually for more control
diff --git a/inference/full-dev-setup.sh b/inference/full-dev-setup.sh
index 86741891da..4a6a10cada 100755
--- a/inference/full-dev-setup.sh
+++ b/inference/full-dev-setup.sh
@@ -16,9 +16,9 @@ fi
 # Creates a tmux window with splits for the individual services
 
 tmux new-session -d -s "inference-dev-setup"
-tmux send-keys "docker run --rm -it -p 5432:5432 -e POSTGRES_PASSWORD=postgres --name postgres postgres" C-m
+tmux send-keys "docker run --rm -it -p 5732:5432 -e POSTGRES_PASSWORD=postgres --name postgres postgres" C-m
 tmux split-window -h
-tmux send-keys "docker run --rm -it -p 6379:6379 --name redis redis" C-m
+tmux send-keys "docker run --rm -it -p 6779:6379 --name redis redis" C-m
 
 # only if model is not _lorem
 if [ "$MODEL_CONFIG_NAME" != "_lorem" ]; then
@@ -30,7 +30,7 @@ fi
 
 tmux split-window -h
 tmux send-keys "cd server" C-m
-tmux send-keys "LOGURU_LEVEL=$LOGLEVEL DEBUG_API_KEYS='0000,0001' ALLOW_DEBUG_AUTH=True uvicorn main:app" C-m
+tmux send-keys "LOGURU_LEVEL=$LOGLEVEL POSTGRES_PORT=5732 REDIS_PORT=6779 DEBUG_API_KEYS='0000,0001' ALLOW_DEBUG_AUTH=True uvicorn main:app" C-m
 tmux split-window -h
 tmux send-keys "cd text-client" C-m
 tmux send-keys "sleep 5" C-m
diff --git a/inference/server/oasst_inference_server/routes/workers.py b/inference/server/oasst_inference_server/routes/workers.py
index 28a4421d30..550e197a79 100644
--- a/inference/server/oasst_inference_server/routes/workers.py
+++ b/inference/server/oasst_inference_server/routes/workers.py
@@ -130,7 +130,8 @@ async def handle_worker(
 
         async def _update_session(metrics: inference.WorkerMetricsInfo):
             worker_session.requests_in_flight = len(work_request_map)
-            worker_session.metrics = metrics
+            if metrics:
+                worker_session.metrics = metrics
             await worker_utils.store_worker_session(worker_session)
 
         def _add_dequeue(ftrs: set):
diff --git a/inference/server/oasst_inference_server/settings.py b/inference/server/oasst_inference_server/settings.py
index 884fc08b68..366e0b4a3b 100644
--- a/inference/server/oasst_inference_server/settings.py
+++ b/inference/server/oasst_inference_server/settings.py
@@ -68,7 +68,7 @@ def debug_api_keys_list(self) -> list[str]:
     # we decided on letting the nextjs / website backend handle the token at first
     # and then proxy this information back to the inference server
     # in short: this should refer to the website, not to this server
-    auth_callback_root: str = "https://open-assistant.io/api/inference_auth"
+    auth_callback_root: str = "http://localhost:3000/api/inference_auth"
 
     allow_debug_auth: bool = False
 
diff --git a/inference/server/oasst_inference_server/worker_utils.py b/inference/server/oasst_inference_server/worker_utils.py
index 5c41da5244..2eeaba2d9a 100644
--- a/inference/server/oasst_inference_server/worker_utils.py
+++ b/inference/server/oasst_inference_server/worker_utils.py
@@ -95,7 +95,6 @@ async def receive_worker_info(
 
 
 async def store_worker_session(worker_session: WorkerSession):
-    logger.debug(f"Saving worker session {worker_session.id}")
     await deps.redis_client.set(f"worker_session:{worker_session.id}", worker_session.json())
 
 
diff --git a/inference/worker/__main__.py b/inference/worker/__main__.py
index c9d0c9a935..21bcd741bc 100644
--- a/inference/worker/__main__.py
+++ b/inference/worker/__main__.py
@@ -85,7 +85,12 @@ def main():
                                 )
                                 ftrs.append(ftr)
                             case "ping":
-                                utils.send_response(ws, inference.PongResponse(request_id=worker_request.id))
+                                utils.send_response(
+                                    ws,
+                                    inference.PongResponse(
+                                        request_id=worker_request.id, metrics=inference.WorkerMetricsInfo()
+                                    ),
+                                )
                             case "wrong_api_key":
                                 logger.error("Your API Key seems to be wrong, please check it!")
                                 raise RuntimeError("Your API Key seems to be wrong, please check it!")
diff --git a/inference/worker/work.py b/inference/worker/work.py
index 2bd26cfc42..b4454c0044 100644
--- a/inference/worker/work.py
+++ b/inference/worker/work.py
@@ -115,6 +115,7 @@ def handle_work_request(
                 inference.ErrorResponse(
                     request_id=work_request.id,
                     error=stream_response.error,
+                    metrics=inference.WorkerMetricsInfo(),
                 ),
             )
             raise RuntimeError(f"Error from inference server: {stream_response.error}")
@@ -151,6 +152,7 @@ def handle_work_request(
             request_id=work_request.id,
             text=stream_response.generated_text,
             finish_reason=stream_response.details.finish_reason,
+            metrics=inference.WorkerMetricsInfo(),
         ),
     )
     logger.debug("Work complete. Waiting for more work...")
diff --git a/oasst-shared/oasst_shared/schemas/inference.py b/oasst-shared/oasst_shared/schemas/inference.py
index 3419535086..636afff596 100644
--- a/oasst-shared/oasst_shared/schemas/inference.py
+++ b/oasst-shared/oasst_shared/schemas/inference.py
@@ -79,12 +79,14 @@ class GpuMetricsInfo(pydantic.BaseModel):
 
 
 class WorkerMetricsInfo(pydantic.BaseModel):
+    created_at: datetime
     cpu_usage: float
     mem_usage: float
     swap_usage: float
     gpus: list[GpuMetricsInfo] | None = None
 
     def __init__(self, **data):
+        data["created_at"] = datetime.utcnow()
         data["cpu_usage"] = psutil.cpu_percent()
         data["mem_usage"] = psutil.virtual_memory().percent
         data["swap_usage"] = psutil.swap_memory().percent
@@ -212,7 +214,7 @@ class WorkerResponseBase(pydantic.BaseModel):
 
 class PongResponse(WorkerResponseBase):
     response_type: Literal["pong"] = "pong"
-    metrics: WorkerMetricsInfo = pydantic.Field(default_factory=WorkerMetricsInfo)
+    metrics: WorkerMetricsInfo | None = None
 
 
 class TokenResponse(WorkerResponseBase):
@@ -226,7 +228,7 @@ class GeneratedTextResponse(WorkerResponseBase):
     response_type: Literal["generated_text"] = "generated_text"
     text: str
     finish_reason: Literal["length", "eos_token", "stop_sequence"]
-    metrics: WorkerMetricsInfo = pydantic.Field(default_factory=WorkerMetricsInfo)
+    metrics: WorkerMetricsInfo | None = None
 
 
 class InternalFinishedMessageResponse(WorkerResponseBase):
@@ -237,17 +239,18 @@ class InternalFinishedMessageResponse(WorkerResponseBase):
 class InternalErrorResponse(WorkerResponseBase):
     response_type: Literal["internal_error"] = "internal_error"
     error: str
+    message: MessageRead
 
 
 class ErrorResponse(WorkerResponseBase):
     response_type: Literal["error"] = "error"
-    metrics: WorkerMetricsInfo = pydantic.Field(default_factory=WorkerMetricsInfo)
+    metrics: WorkerMetricsInfo | None = None
     error: str
 
 
 class GeneralErrorResponse(WorkerResponseBase):
     response_type: Literal["general_error"] = "general_error"
-    metrics: WorkerMetricsInfo = pydantic.Field(default_factory=WorkerMetricsInfo)
+    metrics: WorkerMetricsInfo | None = None
     error: str
 
 
