
    '/j`                         d Z ddlZddlZddlZddlmZ ddlmZ ddlZddl	m
Z
  ej                  ej                  d        ej                  d      Zd	ed
efdZ G d d      ZdefdZd Zedk(  r e        yy)u   
Phase 3 — Verify: 核对迁移结果.

对比 manifest.json（源）和 v0.25.6 API（目标）：
  1. KB 数量
  2. 每个 KB 的文档数量
  3. 解析状态分布
  4. 差异清单

Usage:
    python verify_migration.py -c config.yaml
    N)defaultdict)Path)YAMLz'%(asctime)s [%(levelname)s] %(message)s)levelformatverifypathreturnc                     t        dd      }t        |       5 }|j                  |      cd d d        S # 1 sw Y   y xY w)NsafeT)typpure)r   openload)r	   yamlfs      verify_migration.pyload_configr      s7    F&D	d qyy|  s   4=c                   &    e Zd ZddZd Zd Zd Zy)
RAGFlowAPIc                     |j                  d       d| _        t        j                         | _        d| | j                  j
                  d<   || _        y )N/z/api/v1zBearer Authorization)rstripbaserequestsSessionsheaderstimeout)selfbase_urlapi_keyr    s       r   __init__zRAGFlowAPI.__init__#   sJ    s+,G4	!!#,3G9*='    c                     |j                         }|j                  d      dk7  r t        | d|j                  d|             |S )Ncoder   : message)jsongetRuntimeError)r!   respactionds       r   _okzRAGFlowAPI._ok)   sD    IIK55=A&AEE)Q,?+@ABBr%   c                     | j                   j                  | j                   dddd| j                        }| j	                  |d      d   S )Nz	/datasets   i  page	page_sizeparamsr    listdata)r   r+   r   r    r0   )r!   rs     r   list_datasetszRAGFlowAPI.list_datasets/   sK    FFJJ$))I.'(t<dll  Txx6"6**r%   c                    g d}}	 | j                   j                  | j                   d| d|dd| j                        }| j	                  |d      d   j                  d	g       }|j                  |       t        |      dk  r	 |S |dz  })
Nr2   z
/datasets/z
/documentsd   r3   r6   r8   r9   docs)r   r+   r   r    r0   extendlen)r!   
dataset_idr>   r4   r:   batchs         r   list_documentszRAGFlowAPI.list_documents4   s    d

dii[
:,jI+/c"BDLL  ZAHHQ'/33FB?EKK5zC AID r%   N)<   )__name__
__module____qualname__r$   r0   r;   rC    r%   r   r   r   "   s    +

r%   r   cfgc                 X   t        | d         }t        |dz  d      5 }t        j                  |      }d d d        t	        | d   d   | d   d         }|j                         D ci c]  }|d   |
 }}g }d	\  }}	t        t              }
D ]  }|d
   }t        |d         }||z  }|j                  |      }|s|j                  ||dddf       E|j                  |d         }t        |      }|	|z  }	|D ]  }|
|j                  dd      xx   dz  cc<   ! ||z
  }|dk(  rdnd|d}|j                  |||||f        t                t        d       t        d       t        d       t        dt        |       dt        |              t        d| d|	 d||	k(  rdnd d       t        d       t        |
j                               D ]E  \  }}ddddd d!j                  |d"      }d#d$ij                  ||      }t        d%| d&| d'|        G t        d(d)d*d&d+d,d&d-d,d&d.d,       t        d/d0        |D ]A  \  }}}}}t        |      d1k  r|d d1 n|d d2 d3z   }t        d/| d&|d4d&|d5d&|d5d&|d6
       C t        d7d d7       y # 1 sw Y   gxY wc c}w )8Ntemp_dirzmanifest.jsonzutf-8)encodingtargetr"   r#   name)r   r   kb_namefilesr   u
   ❌ 缺失idrunUNKNOWNr2   u   ✅u   ❌ z+dzF======================================================================u5     RAGFlow v0.17.2 → v0.25.6  Migration Verificationu     KBs:      源=u	   , 目标=u     Documents: 源=z (u   ❌)u   
  解析状态:u   ⚠️u   ⏳u   🔄)DONEFAILCANCEL0RUNNINGu   ❓rX   PENDINGz     r(   z
  zKB Namez<32su   源z>5su   目标u   差异z  u   ──────────────────────────────────────────────────      u   …z<30sz>5dz>+5d
)r   r   r*   r   r   r;   r   intr@   r+   appendrC   printsorteditems)rI   rK   r   manifestapir/   tgt_kbsrows	src_total	tgt_totalstatus_summaryentryrO   src_ntgt_dstgt_docstgt_ndiffflagr   niconlabelrN   srctgts                             r   rR   rR   A   s3   C
O$H 
h(7	;  q99Q<  S]:.Hi0H
IC%(%6%6%89qy!|9G9 DIy%0%5N 9	"E'N#U	W%KK%A|<=%%fTl3HU	 	9A155	23q83	9 u}	ud2Y'7WeUD$78'9, 
G	(O	
AB	(O	S]O9S\N
CD	i[	) = I-e59< = 
~++-. *1uuY_`ddefhmni $$Q*TF!E7"QC()*
 
D4 %Ahs^1XcN
KL	Bzl
&* G"c3dIOtCRycrU1B4&$tAc#YaCy$tEFG 
Bxj
o   
 :s   J'J'J$c                      t        j                         } | j                  ddd       | j                         }t	        t        |j                               y )Nz-cz--configT)required)argparseArgumentParseradd_argument
parse_argsrR   r   config)pargss     r   mainr      s>    !ANN4dN3<<>DDKK !r%   __main__)__doc__ry   r*   loggingcollectionsr   pathlibr   r   ruamel.yamlr   basicConfigINFO	getLoggerlogstrdictr   r   rR   r   rE   rH   r%   r   <module>r      s       #      ',,/X Yg!c d  >;T ;|" zF r%   