moficica app.py

This commit is contained in:
DFFM-maker 2025-12-25 19:00:13 +01:00
parent 276c509a32
commit 073d3dad1e
6 changed files with 439 additions and 441 deletions

View File

@ -1,310 +0,0 @@
VAR Internal
Idecon FB_IDECON_Client False False
Enable BOOL True False False
MsgFilter UINT 17 False False
fbTcpConnect SktTCPConnect False False
fbSocketSend SktTCPSend False False
fbSocketRcv SktTCPRcv False False
fbClose SktClose False False
Config _sSOCKET_ADDRESS (PortNo := 50000, IpAdr := '172.16.224.200') False False
SocketID_Int _sSOCKET False False
tmpIpAddress STRING[256] False False
tmpPort UINT False False
Connected BOOL False False
bConnectDone BOOL False False
bConnectBusy BOOL False False
bConnectError BOOL False False
wConnectErrorID WORD False False
bSendDone BOOL False False
bSendBusy BOOL False False
bSendError BOOL False False
wSendErrorID WORD False False
bRcvDone BOOL False False
bRcvBusy BOOL False False
bRcvError BOOL False False
wRcvErrorID WORD False False
RxChunk ARRAY[0..511] OF BYTE False False
RxChunkLen UINT False False
RxChunkValid BOOL False False
RcvTimeout UINT 50 False False
TxConsumed BOOL False False
prevTxOutValid BOOL False False
sendTrigger BOOL False False
Command STRING[255] False False
CommandTrigger BOOL False False
prevCommandTrigger BOOL False False
tonPollingSTATSV TON False False
tonPollingSTATP TON False False
prevPollSVQ BOOL False False
prevPollPQ BOOL False False
pollResetSV BOOL False False
pollResetP BOOL False False
prevLastMessage STRING[512] False False
newMsg BOOL False False
newWeightMsg BOOL False False
prevWeightMsg BOOL False False
totalRejected DINT False False
TxChunk ARRAY[0..511] OF BYTE False False
TxChunkLen UINT False False
iTx UINT False False
TxBuffer ARRAY[0..511] OF BYTE False False
tmpWeightData Idecon_WeightData False False
tmpStatPData Idecon_StatPData False False
rTrigRcv R_TRIG False False
bExecuteRcv BOOL False False
iRcvState INT False False
END VAR
VAR External
G_Idecon_Config False
G_System_Error False
G_ProgressiveID False
G_OPCUA_Idecon False
G_Idecon_StatP False
G_Idecon_LastWeight False
G_Idecon_LastSTATSV False
G_Idecon_WorkMode False
G_Idecon_BatchCode False
G_Idecon_ProductionOrder False
END VAR
// ---------- Program ProcessIdecon---------------//
IF NOT Enable THEN
Connected := FALSE;
RxChunkLen := 0;
RxChunkValid := FALSE;
TxConsumed := FALSE;
Command := '';
CommandTrigger := FALSE;
prevCommandTrigger := FALSE;
prevTxOutValid := FALSE;
pollResetSV := FALSE;
pollResetP := FALSE;
END_IF;
tmpIpAddress := Config.IpAdr;
tmpPort := Config.PortNo;
fbTcpConnect(
Execute := (Enable AND NOT Connected),
DstAdr := tmpIpAddress, // Passiamo la variabile semplice (FIX per "Member of structure")
DstTcpPort := tmpPort, // Passiamo la variabile semplice
SrcTcpPort := 0, // (Opzionale) 0 = Assegnazione automatica porta locale
Socket => SocketID_Int,
Done => bConnectDone,
Busy => bConnectBusy,
Error => bConnectError,
ErrorID => wConnectErrorID
);
IF bConnectDone THEN
Connected := TRUE;
END_IF;
IF bConnectError THEN
Connected := FALSE;
END_IF;
// ---------------------------------------------------------
// MACCHINA A STATI "INFINITY LOOP" (Per lettura continua)
// ---------------------------------------------------------
CASE iRcvState OF
0: // STATO IDLE: Pronti a ricevere?
// Se siamo connessi e il blocco non è occupato o in errore...
IF Connected AND NOT bRcvBusy AND NOT bRcvError THEN
bExecuteRcv := TRUE; // ALZA IL FRONTE DI SALITA
iRcvState := 10; // Passa in attesa
END_IF;
10: // STATO WAIT: Aspetta i dati
IF bRcvDone THEN
// Dati ricevuti! Andiamo a resettare
iRcvState := 20;
ELSIF bRcvError OR NOT Connected THEN
// Se cade la connessione o c'è errore socket
iRcvState := 99;
END_IF;
20: // STATO RESET (FONDAMENTALE PER LEGGERE IL SUCCESSIVO)
bExecuteRcv := FALSE; // Abbassa Execute
// Aspettiamo che il blocco confermi di essersi spento (Done deve tornare False)
// Senza questo check, il riarmo è troppo veloce e fallisce!
IF NOT bRcvDone AND NOT bRcvBusy THEN
iRcvState := 0; // Torna all'inizio per leggere il prossimo
END_IF;
99: // STATO ERRORE
bExecuteRcv := FALSE;
// Se l'errore sparisce o la connessione cade, resetta la macchina
IF NOT bRcvError THEN
iRcvState := 0;
END_IF;
END_CASE;
// --- Chiamata al Blocco (Fuori dal CASE) ---
fbSocketRcv(
Execute := bExecuteRcv,
Socket := SocketID_Int,
TimeOut := 1, //RcvTimeout, // Assicurati sia basso (es. 10 o 50 ms)
Size := UINT#512,
RcvDat := RxChunk[0],
Done => bRcvDone,
Busy => bRcvBusy,
Error => bRcvError,
ErrorID => wRcvErrorID,
RcvSize => RxChunkLen
);
rTrigRcv(CLK := bRcvDone);
RxChunkValid := rTrigRcv.Q AND (RxChunkLen > 0);
// Gestione disconnessione su errore grave
IF bRcvError THEN
Connected := FALSE;
iRcvState := 99;
END_IF;
tonPollingSTATSV(IN := (Enable AND Connected AND NOT pollResetSV), PT := T#2S);
tonPollingSTATP(IN := (Enable AND Connected AND NOT pollResetP), PT := T#5S);
pollResetSV := FALSE;
pollResetP := FALSE;
CommandTrigger := FALSE;
IF tonPollingSTATSV.Q AND NOT prevPollSVQ THEN
Command := 'STATSV';
CommandTrigger := TRUE;
pollResetSV := TRUE;
ELSIF tonPollingSTATP.Q AND NOT prevPollPQ THEN
Command := 'STATREQ';
CommandTrigger := TRUE;
pollResetP := TRUE;
END_IF;
prevPollSVQ := tonPollingSTATSV.Q;
prevPollPQ := tonPollingSTATP.Q;
Idecon(
Enable := Enable,
MsgFilter := MsgFilter,
RxIn := RxChunk,
RxInLen := RxChunkLen,
RxInValid := RxChunkValid,
TxConsumed := TxConsumed,
Command := Command,
CommandTrigger := CommandTrigger
);
tmpWeightData := Idecon.Weight;
tmpStatPData := Idecon.StatP;
// Gestione Messaggi
newMsg := (Idecon.LastMessage <> prevLastMessage);
prevLastMessage := Idecon.LastMessage;
newWeightMsg := newMsg AND IDECON_StartsWith(Idecon.LastMessage, 'WEIGHT=');
IF newWeightMsg AND NOT prevWeightMsg THEN
G_ProgressiveID := G_ProgressiveID + 1;
END_IF;
prevWeightMsg := newWeightMsg;
G_Idecon_LastSTATSV := Idecon.LastSTATSV;
IF tmpWeightData.Valid THEN
G_Idecon_LastWeight.DateTimeText := tmpWeightData.DateTimeText;
G_Idecon_LastWeight.ProductionOrder := tmpWeightData.ProductionOrder;
G_Idecon_LastWeight.BatchCode := tmpWeightData.BatchCode;
G_Idecon_LastWeight.RecipeName := tmpWeightData.RecipeName;
G_Idecon_LastWeight.LineCode := tmpWeightData.LineCode;
G_Idecon_LastWeight.SerialNumber := tmpWeightData.SerialNumber;
G_Idecon_LastWeight.WeightMg := tmpWeightData.WeightMg;
G_Idecon_LastWeight.DeltaToNominalMg:= tmpWeightData.DeltaToNominalMg;
G_Idecon_LastWeight.Classification := tmpWeightData.Classification;
G_Idecon_LastWeight.Valid := TRUE;
END_IF;
// --- E anche qui usiamo tmpStatPData ---
IF tmpStatPData.Valid THEN
G_Idecon_StatP.TotalProducts := tmpStatPData.TotalProducts;
G_Idecon_StatP.TotalAccepted := tmpStatPData.TotalAccepted;
G_Idecon_StatP.RejectedMinus := tmpStatPData.RejectedMinus;
G_Idecon_StatP.RejectedMinusMinus := tmpStatPData.RejectedMinusMinus;
G_Idecon_StatP.RejectedPlus := tmpStatPData.RejectedPlus;
G_Idecon_StatP.RejectedPlusPlus := tmpStatPData.RejectedPlusPlus;
G_Idecon_StatP.CannotBeWeighed := tmpStatPData.CannotBeWeighed;
G_Idecon_StatP.MetalCategory := tmpStatPData.MetalCategory;
G_Idecon_StatP.Valid := TRUE;
END_IF;
G_System_Error := bConnectError OR bSendError OR bRcvError OR Idecon.Error;
IF G_Idecon_StatP.Valid AND (G_Idecon_StatP.TotalProducts >= G_Idecon_StatP.TotalAccepted) THEN
totalRejected := G_Idecon_StatP.TotalProducts - G_Idecon_StatP.TotalAccepted;
ELSE
totalRejected := 0;
END_IF;
// OPC UA Mapping
G_OPCUA_Idecon.Connected := Connected;
G_OPCUA_Idecon.WorkMode := G_Idecon_WorkMode;
G_OPCUA_Idecon.LastSTATSV := G_Idecon_LastSTATSV;
G_OPCUA_Idecon.BatchCode := G_Idecon_BatchCode;
G_OPCUA_Idecon.ProductionOrder := G_Idecon_ProductionOrder;
G_OPCUA_Idecon.Error := G_System_Error;
G_OPCUA_Idecon.ErrorId := UINT_TO_UDINT(WORD_TO_UINT(wConnectErrorID));
G_OPCUA_Idecon.LastWeight.ProgressiveId := G_ProgressiveID;
G_OPCUA_Idecon.LastWeight.TimestampText := G_Idecon_LastWeight.DateTimeText;
G_OPCUA_Idecon.LastWeight.ProductionOrder := G_Idecon_LastWeight.ProductionOrder;
G_OPCUA_Idecon.LastWeight.BatchCode := G_Idecon_LastWeight.BatchCode;
G_OPCUA_Idecon.LastWeight.RecipeName := G_Idecon_LastWeight.RecipeName;
G_OPCUA_Idecon.LastWeight.LineCode := G_Idecon_LastWeight.LineCode;
G_OPCUA_Idecon.LastWeight.SerialNumber := G_Idecon_LastWeight.SerialNumber;
G_OPCUA_Idecon.LastWeight.Weight_g := DINT_TO_LREAL(G_Idecon_LastWeight.WeightMg) / LREAL#1000.0;
G_OPCUA_Idecon.LastWeight.Delta_g := DINT_TO_LREAL(G_Idecon_LastWeight.DeltaToNominalMg) / LREAL#1000.0;
G_OPCUA_Idecon.LastWeight.Classification := G_Idecon_LastWeight.Classification;
G_OPCUA_Idecon.LastWeight.Expelled := FALSE;
G_OPCUA_Idecon.LastWeight.Valid := G_Idecon_LastWeight.Valid;
G_OPCUA_Idecon.Stats.TotalProducts := G_Idecon_StatP.TotalProducts;
G_OPCUA_Idecon.Stats.TotalAccepted := G_Idecon_StatP.TotalAccepted;
G_OPCUA_Idecon.Stats.TotalRejected := totalRejected;
G_OPCUA_Idecon.Stats.RejectedPlusPlus := G_Idecon_StatP.RejectedPlusPlus;
G_OPCUA_Idecon.Stats.CannotBeWeighed := G_Idecon_StatP.CannotBeWeighed;
G_OPCUA_Idecon.Stats.MetalCategory := G_Idecon_StatP.MetalCategory;
G_OPCUA_Idecon.Stats.Valid := G_Idecon_StatP.Valid;
// Invio Socket
sendTrigger := (Idecon.TxOutValid AND NOT prevTxOutValid);
prevTxOutValid := Idecon.TxOutValid;
IF sendTrigger THEN
// Copiamo i dati dall'output dell'FB al buffer LOCALE
// Questo evita l'errore "Member of function block instance variable"
TxBuffer := Idecon.TxOut;
END_IF;
fbSocketSend(
Execute := (Enable AND Connected AND sendTrigger),
Socket := SocketID_Int,
SendDat := TxBuffer[0], // --- CORREZIONE 2: Usa buffer locale ---
Size := Idecon.TxOutLen,
Done => bSendDone,
Busy => bSendBusy,
Error => bSendError,
ErrorID => wSendErrorID
);
TxConsumed := bSendDone;
IF bSendError THEN
Connected := FALSE;
END_IF;
fbClose(
Execute := (Enable AND NOT Connected),
Socket := SocketID_Int
);

View File

@ -0,0 +1,109 @@
chainlit-app-1 | 2025-12-25 17:32:55 - INFO - chainlit - Your app is available at http://0.0.0.0:8000
chainlit-app-1 | 2025-12-25 17:36:13 - WARNING - chainlit - Translation file for it-IT not found. Using parent translation it.
chainlit-app-1 | 2025-12-25 17:36:13 - WARNING - chainlit - Translated markdown file for it-IT not found. Defaulting to chainlit.md.
chainlit-app-1 | 2025-12-25 17:36:13 - INFO - chainlit - Missing custom logo. Falling back to default logo.
chainlit-app-1 | 2025-12-25 17:39:46 - WARNING - chainlit - Translation file for it-IT not found. Using parent translation it.
chainlit-app-1 | 2025-12-25 17:39:47 - WARNING - chainlit - Translation file for it-IT not found. Using parent translation it.
chainlit-app-1 | 2025-12-25 17:39:47 - WARNING - chainlit - Translated markdown file for it-IT not found. Defaulting to chainlit.md.
chainlit-app-1 | 2025-12-25 17:39:51 - WARNING - chainlit - Translation file for it-IT not found. Using parent translation it.
chainlit-app-1 | 2025-12-25 17:39:56 - INFO - httpx - HTTP Request: POST http://192.168.1.243:11434/api/chat "HTTP/1.1 200 OK"
qdrant-1 | _ _
qdrant-1 | __ _ __| |_ __ __ _ _ __ | |_
qdrant-1 | / _` |/ _` | '__/ _` | '_ \| __|
qdrant-1 | | (_| | (_| | | | (_| | | | | |_
qdrant-1 | \__, |\__,_|_| \__,_|_| |_|\__|
qdrant-1 | |_|
qdrant-1 |
qdrant-1 | Access web UI at https://ui.qdrant.tech/?v=v1.0.0
qdrant-1 |
qdrant-1 | [2025-12-25T16:38:00.816Z INFO storage::content_manager::consensus::persistent] Initializing new raft state at ./storage/raft_state
qdrant-1 | [2025-12-25T16:38:00.861Z INFO qdrant] Distributed mode disabled
qdrant-1 | [2025-12-25T16:38:00.861Z INFO qdrant] Telemetry reporting enabled, id: e6113e43-627c-471d-8374-0f1b61799d76
qdrant-1 | [2025-12-25T16:38:00.872Z INFO qdrant::tonic] Qdrant gRPC listening on 6334
qdrant-1 | [2025-12-25T16:38:00.890Z INFO actix_server::builder] Starting 3 workers
qdrant-1 | [2025-12-25T16:38:00.890Z INFO actix_server::server] Actix runtime found; starting in Actix runtime
qdrant-1 | [2025-12-25T16:39:02.504Z INFO actix_server::server] SIGTERM received; starting graceful shutdown
qdrant-1 | [2025-12-25T16:39:02.505Z INFO actix_server::worker] Shutting down idle worker
qdrant-1 | [2025-12-25T16:39:02.508Z INFO actix_server::accept] Accept thread stopped
qdrant-1 | [2025-12-25T16:39:02.508Z INFO actix_server::worker] Shutting down idle worker
qdrant-1 | [2025-12-25T16:39:02.508Z INFO actix_server::worker] Shutting down idle worker
qdrant-1 | _ _
qdrant-1 | __ _ __| |_ __ __ _ _ __ | |_
qdrant-1 | / _` |/ _` | '__/ _` | '_ \| __|
qdrant-1 | | (_| | (_| | | | (_| | | | | |_
qdrant-1 | \__, |\__,_|_| \__,_|_| |_|\__|
qdrant-1 | |_|
qdrant-1 |
qdrant-1 | Access web UI at https://ui.qdrant.tech/?v=v1.0.0
qdrant-1 |
qdrant-1 | [2025-12-25T16:43:53.592Z INFO storage::content_manager::consensus::persistent] Loading raft state from ./storage/raft_state
qdrant-1 | [2025-12-25T16:43:53.612Z INFO qdrant] Distributed mode disabled
qdrant-1 | [2025-12-25T16:43:53.612Z INFO qdrant] Telemetry reporting enabled, id: 2a83356a-9770-47d3-a0bd-638f75769522
qdrant-1 | [2025-12-25T16:43:53.615Z INFO qdrant::tonic] Qdrant gRPC listening on 6334
qdrant-1 | [2025-12-25T16:43:53.616Z INFO actix_server::builder] Starting 3 workers
qdrant-1 | [2025-12-25T16:43:53.617Z INFO actix_server::server] Actix runtime found; starting in Actix runtime
qdrant-1 | [2025-12-25T16:56:42.005Z INFO actix_server::server] SIGTERM received; starting graceful shutdown
qdrant-1 | [2025-12-25T16:56:42.006Z INFO actix_server::worker] Shutting down idle worker
qdrant-1 | [2025-12-25T16:56:42.006Z INFO actix_server::worker] Shutting down idle worker
qdrant-1 | [2025-12-25T16:56:42.007Z INFO actix_server::worker] Shutting down idle worker
qdrant-1 | [2025-12-25T16:56:42.007Z INFO actix_server::accept] Accept thread stopped
qdrant-1 | _ _
qdrant-1 | __ _ __| |_ __ __ _ _ __ | |_
qdrant-1 | / _` |/ _` | '__/ _` | '_ \| __|
qdrant-1 | | (_| | (_| | | | (_| | | | | |_
qdrant-1 | \__, |\__,_|_| \__,_|_| |_|\__|
qdrant-1 | |_|
qdrant-1 |
qdrant-1 | Access web UI at https://ui.qdrant.tech/?v=v1.0.0
qdrant-1 |
qdrant-1 | [2025-12-25T16:56:52.790Z INFO storage::content_manager::consensus::persistent] Loading raft state from ./storage/raft_state
qdrant-1 | [2025-12-25T16:56:52.796Z INFO qdrant] Distributed mode disabled
qdrant-1 | [2025-12-25T16:56:52.796Z INFO qdrant] Telemetry reporting enabled, id: f821b8ea-9ee5-497e-a172-dfebf253f7b1
qdrant-1 | [2025-12-25T16:56:52.797Z INFO qdrant::tonic] Qdrant gRPC listening on 6334
qdrant-1 | [2025-12-25T16:56:52.798Z INFO actix_server::builder] Starting 3 workers
qdrant-1 | [2025-12-25T16:56:52.798Z INFO actix_server::server] Actix runtime found; starting in Actix runtime
postgres-1 |
postgres-1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
postgres-1 |
postgres-1 | 2025-12-25 16:38:01.071 UTC [1] LOG: starting PostgreSQL 18.1 (Debian 18.1-1.pgdg13+2) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit
postgres-1 | 2025-12-25 16:38:01.072 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
postgres-1 | 2025-12-25 16:38:01.072 UTC [1] LOG: listening on IPv6 address "::", port 5432
postgres-1 | 2025-12-25 16:38:01.093 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres-1 | 2025-12-25 16:38:01.126 UTC [32] LOG: database system was shut down at 2025-12-25 14:34:55 UTC
postgres-1 | 2025-12-25 16:38:01.155 UTC [1] LOG: database system is ready to accept connections
postgres-1 | 2025-12-25 16:39:02.495 UTC [1] LOG: received fast shutdown request
postgres-1 | 2025-12-25 16:39:02.505 UTC [1] LOG: aborting any active transactions
postgres-1 | 2025-12-25 16:39:02.521 UTC [1] LOG: background worker "logical replication launcher" (PID 35) exited with exit code 1
postgres-1 | 2025-12-25 16:39:02.521 UTC [30] LOG: shutting down
postgres-1 | 2025-12-25 16:39:02.533 UTC [30] LOG: checkpoint starting: shutdown immediate
postgres-1 | 2025-12-25 16:39:02.601 UTC [30] LOG: checkpoint complete: wrote 0 buffers (0.0%), wrote 3 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.019 s, sync=0.009 s, total=0.079 s; sync files=2, longest=0.005 s, average=0.005 s; distance=0 kB, estimate=0 kB; lsn=0/1BEF980, redo lsn=0/1BEF980
postgres-1 | 2025-12-25 16:39:02.644 UTC [1] LOG: database system is shut down
postgres-1 |
postgres-1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
postgres-1 |
postgres-1 | 2025-12-25 16:43:53.946 UTC [1] LOG: starting PostgreSQL 18.1 (Debian 18.1-1.pgdg13+2) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit
postgres-1 | 2025-12-25 16:43:53.947 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
postgres-1 | 2025-12-25 16:43:53.947 UTC [1] LOG: listening on IPv6 address "::", port 5432
postgres-1 | 2025-12-25 16:43:53.965 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres-1 | 2025-12-25 16:43:53.990 UTC [32] LOG: database system was shut down at 2025-12-25 16:39:02 UTC
postgres-1 | 2025-12-25 16:43:54.013 UTC [1] LOG: database system is ready to accept connections
postgres-1 | 2025-12-25 16:48:54.089 UTC [30] LOG: checkpoint starting: time
postgres-1 | 2025-12-25 16:48:54.175 UTC [30] LOG: checkpoint complete: wrote 0 buffers (0.0%), wrote 3 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.036 s, sync=0.009 s, total=0.088 s; sync files=2, longest=0.005 s, average=0.005 s; distance=0 kB, estimate=0 kB; lsn=0/1BEFA88, redo lsn=0/1BEFA30
postgres-1 | 2025-12-25 16:56:42.002 UTC [1] LOG: received fast shutdown request
postgres-1 | 2025-12-25 16:56:42.018 UTC [1] LOG: aborting any active transactions
postgres-1 | 2025-12-25 16:56:42.026 UTC [1] LOG: background worker "logical replication launcher" (PID 35) exited with exit code 1
postgres-1 | 2025-12-25 16:56:42.030 UTC [30] LOG: shutting down
postgres-1 | 2025-12-25 16:56:42.039 UTC [30] LOG: checkpoint starting: shutdown immediate
postgres-1 | 2025-12-25 16:56:42.086 UTC [30] LOG: checkpoint complete: wrote 0 buffers (0.0%), wrote 0 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.004 s, sync=0.001 s, total=0.057 s; sync files=0, longest=0.000 s, average=0.000 s; distance=0 kB, estimate=0 kB; lsn=0/1BEFB38, redo lsn=0/1BEFB38
postgres-1 | 2025-12-25 16:56:42.131 UTC [1] LOG: database system is shut down
postgres-1 |
postgres-1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
postgres-1 |
postgres-1 | 2025-12-25 16:56:43.530 UTC [1] LOG: starting PostgreSQL 18.1 (Debian 18.1-1.pgdg13+2) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit
postgres-1 | 2025-12-25 16:56:43.532 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
postgres-1 | 2025-12-25 16:56:43.532 UTC [1] LOG: listening on IPv6 address "::", port 5432
postgres-1 | 2025-12-25 16:56:43.552 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres-1 | 2025-12-25 16:56:43.585 UTC [32] LOG: database system was shut down at 2025-12-25 16:56:42 UTC
postgres-1 | 2025-12-25 16:56:43.616 UTC [1] LOG: database system is ready to accept connections
postgres-1 | 2025-12-25 17:01:43.645 UTC [30] LOG: checkpoint starting: time
postgres-1 | 2025-12-25 17:01:43.712 UTC [30] LOG: checkpoint complete: wrote 0 buffers (0.0%), wrote 3 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.019 s, sync=0.009 s, total=0.068 s; sync files=2, longest=0.005 s, average=0.005 s; distance=0 kB, estimate=0 kB; lsn=0/1BEFC40, redo lsn=0/1BEFBE8

View File

@ -0,0 +1,109 @@
chainlit-app-1 | 2025-12-25 17:32:55 - INFO - chainlit - Your app is available at http://0.0.0.0:8000
chainlit-app-1 | 2025-12-25 17:36:13 - WARNING - chainlit - Translation file for it-IT not found. Using parent translation it.
chainlit-app-1 | 2025-12-25 17:36:13 - WARNING - chainlit - Translated markdown file for it-IT not found. Defaulting to chainlit.md.
chainlit-app-1 | 2025-12-25 17:36:13 - INFO - chainlit - Missing custom logo. Falling back to default logo.
chainlit-app-1 | 2025-12-25 17:39:46 - WARNING - chainlit - Translation file for it-IT not found. Using parent translation it.
chainlit-app-1 | 2025-12-25 17:39:47 - WARNING - chainlit - Translation file for it-IT not found. Using parent translation it.
chainlit-app-1 | 2025-12-25 17:39:47 - WARNING - chainlit - Translated markdown file for it-IT not found. Defaulting to chainlit.md.
chainlit-app-1 | 2025-12-25 17:39:51 - WARNING - chainlit - Translation file for it-IT not found. Using parent translation it.
chainlit-app-1 | 2025-12-25 17:39:56 - INFO - httpx - HTTP Request: POST http://192.168.1.243:11434/api/chat "HTTP/1.1 200 OK"
qdrant-1 | _ _
qdrant-1 | __ _ __| |_ __ __ _ _ __ | |_
qdrant-1 | / _` |/ _` | '__/ _` | '_ \| __|
qdrant-1 | | (_| | (_| | | | (_| | | | | |_
qdrant-1 | \__, |\__,_|_| \__,_|_| |_|\__|
qdrant-1 | |_|
qdrant-1 |
qdrant-1 | Access web UI at https://ui.qdrant.tech/?v=v1.0.0
qdrant-1 |
qdrant-1 | [2025-12-25T16:38:00.816Z INFO storage::content_manager::consensus::persistent] Initializing new raft state at ./storage/raft_state
qdrant-1 | [2025-12-25T16:38:00.861Z INFO qdrant] Distributed mode disabled
qdrant-1 | [2025-12-25T16:38:00.861Z INFO qdrant] Telemetry reporting enabled, id: e6113e43-627c-471d-8374-0f1b61799d76
qdrant-1 | [2025-12-25T16:38:00.872Z INFO qdrant::tonic] Qdrant gRPC listening on 6334
qdrant-1 | [2025-12-25T16:38:00.890Z INFO actix_server::builder] Starting 3 workers
qdrant-1 | [2025-12-25T16:38:00.890Z INFO actix_server::server] Actix runtime found; starting in Actix runtime
qdrant-1 | [2025-12-25T16:39:02.504Z INFO actix_server::server] SIGTERM received; starting graceful shutdown
qdrant-1 | [2025-12-25T16:39:02.505Z INFO actix_server::worker] Shutting down idle worker
qdrant-1 | [2025-12-25T16:39:02.508Z INFO actix_server::accept] Accept thread stopped
qdrant-1 | [2025-12-25T16:39:02.508Z INFO actix_server::worker] Shutting down idle worker
qdrant-1 | [2025-12-25T16:39:02.508Z INFO actix_server::worker] Shutting down idle worker
qdrant-1 | _ _
qdrant-1 | __ _ __| |_ __ __ _ _ __ | |_
qdrant-1 | / _` |/ _` | '__/ _` | '_ \| __|
qdrant-1 | | (_| | (_| | | | (_| | | | | |_
qdrant-1 | \__, |\__,_|_| \__,_|_| |_|\__|
qdrant-1 | |_|
qdrant-1 |
qdrant-1 | Access web UI at https://ui.qdrant.tech/?v=v1.0.0
qdrant-1 |
qdrant-1 | [2025-12-25T16:43:53.592Z INFO storage::content_manager::consensus::persistent] Loading raft state from ./storage/raft_state
qdrant-1 | [2025-12-25T16:43:53.612Z INFO qdrant] Distributed mode disabled
qdrant-1 | [2025-12-25T16:43:53.612Z INFO qdrant] Telemetry reporting enabled, id: 2a83356a-9770-47d3-a0bd-638f75769522
qdrant-1 | [2025-12-25T16:43:53.615Z INFO qdrant::tonic] Qdrant gRPC listening on 6334
qdrant-1 | [2025-12-25T16:43:53.616Z INFO actix_server::builder] Starting 3 workers
qdrant-1 | [2025-12-25T16:43:53.617Z INFO actix_server::server] Actix runtime found; starting in Actix runtime
qdrant-1 | [2025-12-25T16:56:42.005Z INFO actix_server::server] SIGTERM received; starting graceful shutdown
qdrant-1 | [2025-12-25T16:56:42.006Z INFO actix_server::worker] Shutting down idle worker
qdrant-1 | [2025-12-25T16:56:42.006Z INFO actix_server::worker] Shutting down idle worker
qdrant-1 | [2025-12-25T16:56:42.007Z INFO actix_server::worker] Shutting down idle worker
qdrant-1 | [2025-12-25T16:56:42.007Z INFO actix_server::accept] Accept thread stopped
qdrant-1 | _ _
qdrant-1 | __ _ __| |_ __ __ _ _ __ | |_
qdrant-1 | / _` |/ _` | '__/ _` | '_ \| __|
qdrant-1 | | (_| | (_| | | | (_| | | | | |_
qdrant-1 | \__, |\__,_|_| \__,_|_| |_|\__|
qdrant-1 | |_|
qdrant-1 |
qdrant-1 | Access web UI at https://ui.qdrant.tech/?v=v1.0.0
qdrant-1 |
qdrant-1 | [2025-12-25T16:56:52.790Z INFO storage::content_manager::consensus::persistent] Loading raft state from ./storage/raft_state
qdrant-1 | [2025-12-25T16:56:52.796Z INFO qdrant] Distributed mode disabled
qdrant-1 | [2025-12-25T16:56:52.796Z INFO qdrant] Telemetry reporting enabled, id: f821b8ea-9ee5-497e-a172-dfebf253f7b1
qdrant-1 | [2025-12-25T16:56:52.797Z INFO qdrant::tonic] Qdrant gRPC listening on 6334
qdrant-1 | [2025-12-25T16:56:52.798Z INFO actix_server::builder] Starting 3 workers
qdrant-1 | [2025-12-25T16:56:52.798Z INFO actix_server::server] Actix runtime found; starting in Actix runtime
postgres-1 |
postgres-1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
postgres-1 |
postgres-1 | 2025-12-25 16:38:01.071 UTC [1] LOG: starting PostgreSQL 18.1 (Debian 18.1-1.pgdg13+2) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit
postgres-1 | 2025-12-25 16:38:01.072 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
postgres-1 | 2025-12-25 16:38:01.072 UTC [1] LOG: listening on IPv6 address "::", port 5432
postgres-1 | 2025-12-25 16:38:01.093 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres-1 | 2025-12-25 16:38:01.126 UTC [32] LOG: database system was shut down at 2025-12-25 14:34:55 UTC
postgres-1 | 2025-12-25 16:38:01.155 UTC [1] LOG: database system is ready to accept connections
postgres-1 | 2025-12-25 16:39:02.495 UTC [1] LOG: received fast shutdown request
postgres-1 | 2025-12-25 16:39:02.505 UTC [1] LOG: aborting any active transactions
postgres-1 | 2025-12-25 16:39:02.521 UTC [1] LOG: background worker "logical replication launcher" (PID 35) exited with exit code 1
postgres-1 | 2025-12-25 16:39:02.521 UTC [30] LOG: shutting down
postgres-1 | 2025-12-25 16:39:02.533 UTC [30] LOG: checkpoint starting: shutdown immediate
postgres-1 | 2025-12-25 16:39:02.601 UTC [30] LOG: checkpoint complete: wrote 0 buffers (0.0%), wrote 3 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.019 s, sync=0.009 s, total=0.079 s; sync files=2, longest=0.005 s, average=0.005 s; distance=0 kB, estimate=0 kB; lsn=0/1BEF980, redo lsn=0/1BEF980
postgres-1 | 2025-12-25 16:39:02.644 UTC [1] LOG: database system is shut down
postgres-1 |
postgres-1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
postgres-1 |
postgres-1 | 2025-12-25 16:43:53.946 UTC [1] LOG: starting PostgreSQL 18.1 (Debian 18.1-1.pgdg13+2) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit
postgres-1 | 2025-12-25 16:43:53.947 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
postgres-1 | 2025-12-25 16:43:53.947 UTC [1] LOG: listening on IPv6 address "::", port 5432
postgres-1 | 2025-12-25 16:43:53.965 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres-1 | 2025-12-25 16:43:53.990 UTC [32] LOG: database system was shut down at 2025-12-25 16:39:02 UTC
postgres-1 | 2025-12-25 16:43:54.013 UTC [1] LOG: database system is ready to accept connections
postgres-1 | 2025-12-25 16:48:54.089 UTC [30] LOG: checkpoint starting: time
postgres-1 | 2025-12-25 16:48:54.175 UTC [30] LOG: checkpoint complete: wrote 0 buffers (0.0%), wrote 3 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.036 s, sync=0.009 s, total=0.088 s; sync files=2, longest=0.005 s, average=0.005 s; distance=0 kB, estimate=0 kB; lsn=0/1BEFA88, redo lsn=0/1BEFA30
postgres-1 | 2025-12-25 16:56:42.002 UTC [1] LOG: received fast shutdown request
postgres-1 | 2025-12-25 16:56:42.018 UTC [1] LOG: aborting any active transactions
postgres-1 | 2025-12-25 16:56:42.026 UTC [1] LOG: background worker "logical replication launcher" (PID 35) exited with exit code 1
postgres-1 | 2025-12-25 16:56:42.030 UTC [30] LOG: shutting down
postgres-1 | 2025-12-25 16:56:42.039 UTC [30] LOG: checkpoint starting: shutdown immediate
postgres-1 | 2025-12-25 16:56:42.086 UTC [30] LOG: checkpoint complete: wrote 0 buffers (0.0%), wrote 0 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.004 s, sync=0.001 s, total=0.057 s; sync files=0, longest=0.000 s, average=0.000 s; distance=0 kB, estimate=0 kB; lsn=0/1BEFB38, redo lsn=0/1BEFB38
postgres-1 | 2025-12-25 16:56:42.131 UTC [1] LOG: database system is shut down
postgres-1 |
postgres-1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
postgres-1 |
postgres-1 | 2025-12-25 16:56:43.530 UTC [1] LOG: starting PostgreSQL 18.1 (Debian 18.1-1.pgdg13+2) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit
postgres-1 | 2025-12-25 16:56:43.532 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
postgres-1 | 2025-12-25 16:56:43.532 UTC [1] LOG: listening on IPv6 address "::", port 5432
postgres-1 | 2025-12-25 16:56:43.552 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres-1 | 2025-12-25 16:56:43.585 UTC [32] LOG: database system was shut down at 2025-12-25 16:56:42 UTC
postgres-1 | 2025-12-25 16:56:43.616 UTC [1] LOG: database system is ready to accept connections
postgres-1 | 2025-12-25 17:01:43.645 UTC [30] LOG: checkpoint starting: time
postgres-1 | 2025-12-25 17:01:43.712 UTC [30] LOG: checkpoint complete: wrote 0 buffers (0.0%), wrote 3 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.019 s, sync=0.009 s, total=0.068 s; sync files=2, longest=0.005 s, average=0.005 s; distance=0 kB, estimate=0 kB; lsn=0/1BEFC40, redo lsn=0/1BEFBE8

Binary file not shown.

233
app.py
View File

@ -4,178 +4,159 @@ import re
from datetime import datetime from datetime import datetime
import shutil import shutil
import uuid import uuid
from qdrant_client import QdrantClient import ollama
from qdrant_client.http.models import PointStruct from qdrant_client import QdrantClient, models
# Define user roles mapping # --- CONFIGURAZIONE ---
USER_ROLES = { USER_ROLES = {
'moglie@esempio.com': 'business', 'moglie@esempio.com': 'business',
'ingegnere@esempio.com': 'engineering', 'ingegnere@esempio.com': 'engineering',
'architetto@esempio.com': 'architecture', 'architetto@esempio.com': 'architecture',
'admin@esempio.com': 'admin' 'admin@esempio.com': 'admin'
} }
# Define the path for workspaces
WORKSPACES_DIR = "./workspaces" WORKSPACES_DIR = "./workspaces"
# URL Config
OLLAMA_URL = os.getenv('OLLAMA_API_BASE', 'http://192.168.1.243:11434')
QDRANT_URL = "http://qdrant:6333" # Nome del servizio nel docker-compose
# Client Globali
aclient = ollama.AsyncClient(host=OLLAMA_URL) # Per la chat (veloce)
# Client sincrono per embedding (più stabile per operazioni batch)
embed_client = ollama.Client(host=OLLAMA_URL)
# --- FUNZIONI UTILITY ---
def create_workspace(user_role): def create_workspace(user_role):
workspace_path = os.path.join(WORKSPACES_DIR, user_role) path = os.path.join(WORKSPACES_DIR, user_role)
if not os.path.exists(workspace_path): os.makedirs(path, exist_ok=True)
os.makedirs(workspace_path)
def save_code_to_file(code, user_role): def save_code_to_file(code, user_role):
timestamp = datetime.now().strftime("%Y%m%d%H%M%S") timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
file_name = f"code_{timestamp}.py" file_name = f"code_{timestamp}.py"
file_path = os.path.join(WORKSPACES_DIR, user_role, file_name) file_path = os.path.join(WORKSPACES_DIR, user_role, file_name)
with open(file_path, "w", encoding="utf-8") as file:
with open(file_path, "w") as file:
file.write(code) file.write(code)
return file_path return file_path
def limit_history(history): def get_qdrant_client():
if len(history) > 20: return QdrantClient(url=QDRANT_URL)
history = history[-20:]
return history
async def connect_to_qdrant():
client = QdrantClient("http://qdrant:6333")
collection_name = "documents"
def ensure_collection(client):
try: try:
client.get_collection(collection_name) client.get_collection("documents")
except Exception as e: except:
client.create_collection( client.create_collection(
collection_name=collection_name, collection_name="documents",
vectors_config={"size": 768, "distance": "Cosine"} vectors_config=models.VectorParams(size=768, distance=models.Distance.COSINE)
) )
return client def get_embeddings(text):
# Taglia il testo se troppo lungo per evitare errori (max safe context)
async def get_embeddings(text): text = text[:8000]
import ollama response = embed_client.embed(model='nomic-embed-text', input=text)
# Costruisci l'URL completo: http://IP:PORT # Gestisce diversi formati di risposta delle versioni Ollama
# È meglio usare la stessa logica usata nella funzione message (OLLAMA_API_BASE)
host_url = os.getenv('OLLAMA_API_BASE', 'http://192.168.1.243:11434')
# Inizializza il client passando SOLO l'host completo
client = ollama.Client(host=host_url)
# Aggiungi il controllo lunghezza per evitare crash su testi lunghi
if len(text) > 12000:
text = text[:12000]
response = client.embed(model='nomic-embed-text', input=text)
# Gestione compatibilità versioni
if 'embeddings' in response: if 'embeddings' in response:
return response['embeddings'][0] return response['embeddings'][0]
return response['embedding'] return response['embedding']
# --- LOGICA CHAT ---
@cl.on_chat_start @cl.on_chat_start
async def chat_start(): async def chat_start():
# Set the user's email to a hardcoded value for testing purposes user_email = "admin@esempio.com" # In prod, prendilo dagli header/auth
user_email = "admin@esempio.com"
# Determine the user's role based on the email
user_role = USER_ROLES.get(user_email, 'guest') user_role = USER_ROLES.get(user_email, 'guest')
# Create workspace directory if it doesn't exist
create_workspace(user_role) create_workspace(user_role)
# Initialize history in the session
cl.user_session.set("history", []) cl.user_session.set("history", [])
# Set the user's role in the session
cl.user_session.set("role", user_role) cl.user_session.set("role", user_role)
# Send a welcome message based on the user's role # Inizializza Qdrant all'avvio
if user_role == 'admin': try:
await cl.Message(content="Welcome, Admin!").send() q_client = get_qdrant_client()
elif user_role == 'engineering': ensure_collection(q_client)
await cl.Message(content="Welcome, Engineer!").send() status_msg = "✅ System ready. Qdrant connected."
elif user_role == 'business': except Exception as e:
await cl.Message(content="Welcome, Business User!").send() status_msg = f"⚠️ System ready, but Qdrant error: {e}"
elif user_role == 'architecture':
await cl.Message(content="Welcome, Architect!").send() await cl.Message(content=f"Welcome {user_role}! {status_msg}").send()
else:
await cl.Message(content="Welcome, Guest!").send()
@cl.on_message @cl.on_message
async def message(message): async def message(message: cl.Message):
# Retrieve the user's role from the session
user_role = cl.user_session.get("role", 'guest') user_role = cl.user_session.get("role", 'guest')
if not user_role:
await cl.Message(content="User role not found").send()
return
# Initialize the Ollama client using the environment variable
ollama_api_base = os.getenv('OLLAMA_API_BASE', 'http://192.168.1.243:11434')
try:
import ollama
client = ollama.Client(ollama_api_base)
# Retrieve the history from the session and limit it
history = cl.user_session.get("history", []) history = cl.user_session.get("history", [])
history = limit_history(history)
# Append the new user message to the history # 1. GESTIONE FILE CARICATI (RAG)
history.append({"role": "user", "content": message.content})
# Check if there are any elements in the message
if message.elements: if message.elements:
processing_msg = cl.Message(content="⚙️ Elaborazione file in corso...")
await processing_msg.send()
q_client = get_qdrant_client()
uploaded_files = [] uploaded_files = []
for element in message.elements: for element in message.elements:
try: # Salva su disco
# Save the content of the file dest_path = os.path.join(WORKSPACES_DIR, user_role, element.name)
temp_file_path = element.path shutil.copyfile(element.path, dest_path)
destination_file_path = os.path.join(WORKSPACES_DIR, user_role, element.name)
with open(temp_file_path, 'rb') as src, open(destination_file_path, 'wb') as dst:
shutil.copyfileobj(src, dst)
uploaded_files.append(element.name) uploaded_files.append(element.name)
except Exception as e:
await cl.Message(content=f"Error saving {element.name}: {e}").send()
if uploaded_files: # Se è testo, indicizza su Qdrant
await cl.Message(content=f"Files uploaded and saved: {', '.join(uploaded_files)}").send() if element.name.endswith('.txt') or element.name.endswith('.md') or element.name.endswith('.py'):
try:
# Call the model and get the response with open(dest_path, 'r', encoding='utf-8') as f:
response = client.chat(model='qwen2.5-coder:7b', messages=history)
# Extract code blocks from the AI response
code_blocks = re.findall(r"```python(.*?)```", response['message']['content'], re.DOTALL)
elements = []
if code_blocks:
for code in code_blocks:
file_path = save_code_to_file(code, user_role)
elements.append(cl.File(name=os.path.basename(file_path), path=file_path))
# Append the AI response to the history
history.append({"role": "assistant", "content": response['message']['content']})
# Save the updated history in the session
cl.user_session.set("history", history)
# Handle text files and index them in Qdrant
for element in message.elements:
if element.name.endswith('.txt'):
with open(element.path, 'r') as f:
content = f.read() content = f.read()
embeddings = await get_embeddings(content) vector = get_embeddings(content)
qdrant_client = await connect_to_qdrant() point_id = str(uuid.uuid4())
point_id = uuid.uuid4() q_client.upsert(
point = PointStruct(id=point_id, vector=embeddings, payload={"file_name": element.name}) collection_name="documents",
qdrant_client.upsert(collection_name="documents", points=[point]) points=[models.PointStruct(
id=point_id,
await cl.Message(content=f"Documento indicizzato con successo su Qdrant.").send() vector=vector,
payload={"filename": element.name, "text": content[:500]} # Salviamo un'anteprima
# Send the final message including both text and files )]
await cl.Message(content=response['message']['content'], elements=elements).send() )
except Exception as e: except Exception as e:
await cl.Message(content=f"Error: {e}").send() await cl.Message(content=f"❌ Errore indicizzazione {element.name}: {e}").send()
await processing_msg.remove()
await cl.Message(content=f"📂 File salvati e indicizzati: {', '.join(uploaded_files)}").send()
# 2. AGGIORNA STORIA E CHAT
history.append({"role": "user", "content": message.content})
msg = cl.Message(content="")
await msg.send()
full_response = ""
# Streaming della risposta
try:
async for part in await aclient.chat(model='qwen2.5-coder:7b', messages=history, stream=True):
token = part['message']['content']
full_response += token
await msg.stream_token(token)
await msg.update()
# 3. ESTRAZIONE CODICE (Salvataggio automatico)
code_blocks = re.findall(r"```python(.*?)```", full_response, re.DOTALL)
if code_blocks:
files_generated = []
for code in code_blocks:
code = code.strip()
if code:
path = save_code_to_file(code, user_role)
files_generated.append(cl.File(name=os.path.basename(path), path=path))
if files_generated:
await cl.Message(content="💾 Ho estratto il codice per te:", elements=files_generated).send()
# Aggiorna storia
history.append({"role": "assistant", "content": full_response})
cl.user_session.set("history", history)
except Exception as e:
await cl.Message(content=f"❌ Errore generazione AI: {e}").send()

109
workspaces/admin/error.txt Normal file
View File

@ -0,0 +1,109 @@
chainlit-app-1 | 2025-12-25 17:32:55 - INFO - chainlit - Your app is available at http://0.0.0.0:8000
chainlit-app-1 | 2025-12-25 17:36:13 - WARNING - chainlit - Translation file for it-IT not found. Using parent translation it.
chainlit-app-1 | 2025-12-25 17:36:13 - WARNING - chainlit - Translated markdown file for it-IT not found. Defaulting to chainlit.md.
chainlit-app-1 | 2025-12-25 17:36:13 - INFO - chainlit - Missing custom logo. Falling back to default logo.
chainlit-app-1 | 2025-12-25 17:39:46 - WARNING - chainlit - Translation file for it-IT not found. Using parent translation it.
chainlit-app-1 | 2025-12-25 17:39:47 - WARNING - chainlit - Translation file for it-IT not found. Using parent translation it.
chainlit-app-1 | 2025-12-25 17:39:47 - WARNING - chainlit - Translated markdown file for it-IT not found. Defaulting to chainlit.md.
chainlit-app-1 | 2025-12-25 17:39:51 - WARNING - chainlit - Translation file for it-IT not found. Using parent translation it.
chainlit-app-1 | 2025-12-25 17:39:56 - INFO - httpx - HTTP Request: POST http://192.168.1.243:11434/api/chat "HTTP/1.1 200 OK"
qdrant-1 | _ _
qdrant-1 | __ _ __| |_ __ __ _ _ __ | |_
qdrant-1 | / _` |/ _` | '__/ _` | '_ \| __|
qdrant-1 | | (_| | (_| | | | (_| | | | | |_
qdrant-1 | \__, |\__,_|_| \__,_|_| |_|\__|
qdrant-1 | |_|
qdrant-1 |
qdrant-1 | Access web UI at https://ui.qdrant.tech/?v=v1.0.0
qdrant-1 |
qdrant-1 | [2025-12-25T16:38:00.816Z INFO storage::content_manager::consensus::persistent] Initializing new raft state at ./storage/raft_state
qdrant-1 | [2025-12-25T16:38:00.861Z INFO qdrant] Distributed mode disabled
qdrant-1 | [2025-12-25T16:38:00.861Z INFO qdrant] Telemetry reporting enabled, id: e6113e43-627c-471d-8374-0f1b61799d76
qdrant-1 | [2025-12-25T16:38:00.872Z INFO qdrant::tonic] Qdrant gRPC listening on 6334
qdrant-1 | [2025-12-25T16:38:00.890Z INFO actix_server::builder] Starting 3 workers
qdrant-1 | [2025-12-25T16:38:00.890Z INFO actix_server::server] Actix runtime found; starting in Actix runtime
qdrant-1 | [2025-12-25T16:39:02.504Z INFO actix_server::server] SIGTERM received; starting graceful shutdown
qdrant-1 | [2025-12-25T16:39:02.505Z INFO actix_server::worker] Shutting down idle worker
qdrant-1 | [2025-12-25T16:39:02.508Z INFO actix_server::accept] Accept thread stopped
qdrant-1 | [2025-12-25T16:39:02.508Z INFO actix_server::worker] Shutting down idle worker
qdrant-1 | [2025-12-25T16:39:02.508Z INFO actix_server::worker] Shutting down idle worker
qdrant-1 | _ _
qdrant-1 | __ _ __| |_ __ __ _ _ __ | |_
qdrant-1 | / _` |/ _` | '__/ _` | '_ \| __|
qdrant-1 | | (_| | (_| | | | (_| | | | | |_
qdrant-1 | \__, |\__,_|_| \__,_|_| |_|\__|
qdrant-1 | |_|
qdrant-1 |
qdrant-1 | Access web UI at https://ui.qdrant.tech/?v=v1.0.0
qdrant-1 |
qdrant-1 | [2025-12-25T16:43:53.592Z INFO storage::content_manager::consensus::persistent] Loading raft state from ./storage/raft_state
qdrant-1 | [2025-12-25T16:43:53.612Z INFO qdrant] Distributed mode disabled
qdrant-1 | [2025-12-25T16:43:53.612Z INFO qdrant] Telemetry reporting enabled, id: 2a83356a-9770-47d3-a0bd-638f75769522
qdrant-1 | [2025-12-25T16:43:53.615Z INFO qdrant::tonic] Qdrant gRPC listening on 6334
qdrant-1 | [2025-12-25T16:43:53.616Z INFO actix_server::builder] Starting 3 workers
qdrant-1 | [2025-12-25T16:43:53.617Z INFO actix_server::server] Actix runtime found; starting in Actix runtime
qdrant-1 | [2025-12-25T16:56:42.005Z INFO actix_server::server] SIGTERM received; starting graceful shutdown
qdrant-1 | [2025-12-25T16:56:42.006Z INFO actix_server::worker] Shutting down idle worker
qdrant-1 | [2025-12-25T16:56:42.006Z INFO actix_server::worker] Shutting down idle worker
qdrant-1 | [2025-12-25T16:56:42.007Z INFO actix_server::worker] Shutting down idle worker
qdrant-1 | [2025-12-25T16:56:42.007Z INFO actix_server::accept] Accept thread stopped
qdrant-1 | _ _
qdrant-1 | __ _ __| |_ __ __ _ _ __ | |_
qdrant-1 | / _` |/ _` | '__/ _` | '_ \| __|
qdrant-1 | | (_| | (_| | | | (_| | | | | |_
qdrant-1 | \__, |\__,_|_| \__,_|_| |_|\__|
qdrant-1 | |_|
qdrant-1 |
qdrant-1 | Access web UI at https://ui.qdrant.tech/?v=v1.0.0
qdrant-1 |
qdrant-1 | [2025-12-25T16:56:52.790Z INFO storage::content_manager::consensus::persistent] Loading raft state from ./storage/raft_state
qdrant-1 | [2025-12-25T16:56:52.796Z INFO qdrant] Distributed mode disabled
qdrant-1 | [2025-12-25T16:56:52.796Z INFO qdrant] Telemetry reporting enabled, id: f821b8ea-9ee5-497e-a172-dfebf253f7b1
qdrant-1 | [2025-12-25T16:56:52.797Z INFO qdrant::tonic] Qdrant gRPC listening on 6334
qdrant-1 | [2025-12-25T16:56:52.798Z INFO actix_server::builder] Starting 3 workers
qdrant-1 | [2025-12-25T16:56:52.798Z INFO actix_server::server] Actix runtime found; starting in Actix runtime
postgres-1 |
postgres-1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
postgres-1 |
postgres-1 | 2025-12-25 16:38:01.071 UTC [1] LOG: starting PostgreSQL 18.1 (Debian 18.1-1.pgdg13+2) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit
postgres-1 | 2025-12-25 16:38:01.072 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
postgres-1 | 2025-12-25 16:38:01.072 UTC [1] LOG: listening on IPv6 address "::", port 5432
postgres-1 | 2025-12-25 16:38:01.093 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres-1 | 2025-12-25 16:38:01.126 UTC [32] LOG: database system was shut down at 2025-12-25 14:34:55 UTC
postgres-1 | 2025-12-25 16:38:01.155 UTC [1] LOG: database system is ready to accept connections
postgres-1 | 2025-12-25 16:39:02.495 UTC [1] LOG: received fast shutdown request
postgres-1 | 2025-12-25 16:39:02.505 UTC [1] LOG: aborting any active transactions
postgres-1 | 2025-12-25 16:39:02.521 UTC [1] LOG: background worker "logical replication launcher" (PID 35) exited with exit code 1
postgres-1 | 2025-12-25 16:39:02.521 UTC [30] LOG: shutting down
postgres-1 | 2025-12-25 16:39:02.533 UTC [30] LOG: checkpoint starting: shutdown immediate
postgres-1 | 2025-12-25 16:39:02.601 UTC [30] LOG: checkpoint complete: wrote 0 buffers (0.0%), wrote 3 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.019 s, sync=0.009 s, total=0.079 s; sync files=2, longest=0.005 s, average=0.005 s; distance=0 kB, estimate=0 kB; lsn=0/1BEF980, redo lsn=0/1BEF980
postgres-1 | 2025-12-25 16:39:02.644 UTC [1] LOG: database system is shut down
postgres-1 |
postgres-1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
postgres-1 |
postgres-1 | 2025-12-25 16:43:53.946 UTC [1] LOG: starting PostgreSQL 18.1 (Debian 18.1-1.pgdg13+2) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit
postgres-1 | 2025-12-25 16:43:53.947 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
postgres-1 | 2025-12-25 16:43:53.947 UTC [1] LOG: listening on IPv6 address "::", port 5432
postgres-1 | 2025-12-25 16:43:53.965 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres-1 | 2025-12-25 16:43:53.990 UTC [32] LOG: database system was shut down at 2025-12-25 16:39:02 UTC
postgres-1 | 2025-12-25 16:43:54.013 UTC [1] LOG: database system is ready to accept connections
postgres-1 | 2025-12-25 16:48:54.089 UTC [30] LOG: checkpoint starting: time
postgres-1 | 2025-12-25 16:48:54.175 UTC [30] LOG: checkpoint complete: wrote 0 buffers (0.0%), wrote 3 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.036 s, sync=0.009 s, total=0.088 s; sync files=2, longest=0.005 s, average=0.005 s; distance=0 kB, estimate=0 kB; lsn=0/1BEFA88, redo lsn=0/1BEFA30
postgres-1 | 2025-12-25 16:56:42.002 UTC [1] LOG: received fast shutdown request
postgres-1 | 2025-12-25 16:56:42.018 UTC [1] LOG: aborting any active transactions
postgres-1 | 2025-12-25 16:56:42.026 UTC [1] LOG: background worker "logical replication launcher" (PID 35) exited with exit code 1
postgres-1 | 2025-12-25 16:56:42.030 UTC [30] LOG: shutting down
postgres-1 | 2025-12-25 16:56:42.039 UTC [30] LOG: checkpoint starting: shutdown immediate
postgres-1 | 2025-12-25 16:56:42.086 UTC [30] LOG: checkpoint complete: wrote 0 buffers (0.0%), wrote 0 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.004 s, sync=0.001 s, total=0.057 s; sync files=0, longest=0.000 s, average=0.000 s; distance=0 kB, estimate=0 kB; lsn=0/1BEFB38, redo lsn=0/1BEFB38
postgres-1 | 2025-12-25 16:56:42.131 UTC [1] LOG: database system is shut down
postgres-1 |
postgres-1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
postgres-1 |
postgres-1 | 2025-12-25 16:56:43.530 UTC [1] LOG: starting PostgreSQL 18.1 (Debian 18.1-1.pgdg13+2) on x86_64-pc-linux-gnu, compiled by gcc (Debian 14.2.0-19) 14.2.0, 64-bit
postgres-1 | 2025-12-25 16:56:43.532 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
postgres-1 | 2025-12-25 16:56:43.532 UTC [1] LOG: listening on IPv6 address "::", port 5432
postgres-1 | 2025-12-25 16:56:43.552 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres-1 | 2025-12-25 16:56:43.585 UTC [32] LOG: database system was shut down at 2025-12-25 16:56:42 UTC
postgres-1 | 2025-12-25 16:56:43.616 UTC [1] LOG: database system is ready to accept connections
postgres-1 | 2025-12-25 17:01:43.645 UTC [30] LOG: checkpoint starting: time
postgres-1 | 2025-12-25 17:01:43.712 UTC [30] LOG: checkpoint complete: wrote 0 buffers (0.0%), wrote 3 SLRU buffers; 0 WAL file(s) added, 0 removed, 0 recycled; write=0.019 s, sync=0.009 s, total=0.068 s; sync files=2, longest=0.005 s, average=0.005 s; distance=0 kB, estimate=0 kB; lsn=0/1BEFC40, redo lsn=0/1BEFBE8