o
    Õ‚ýiI<  ã                   @   s¢   U d Z ddlmZmZ ddlmZ ddlZddlm	Z	 dZ
eed< dZeedf ed< dZeeee df ed	< dZeeee df ed
< ddd„Zddd„ZdS )u©   consolidated migration

Revision ID: consolidated_001
Revises:
Create Date: 2026-04-23 00:00:00+08:00

åˆå¹¶æ‰€æœ‰åŽ†å²è¿ç§»è„šæœ¬ï¼ˆfce73aea7a0b â†’ j5k6l7m8n9o0ï¼‰
é    )ÚSequenceÚUnion)ÚopN)Ú
postgresqlÚconsolidated_001ÚrevisionÚdown_revisionÚbranch_labelsÚ
depends_onÚreturnc            2         sn
  ddl m}  ddlm}m}m}m}m}m}m	}m
}m}	m}
m}m}m}m}m}m}m}m}m}m} ddlm} zddlm} W n	 tyI   Y nw zddlm}m}m}m } W n	 tya   Y nw | j!j"t# $¡ d ddl%m&} t# $¡ }||ƒ}| '¡ }d	|vrWt# (d	t)j*d
t) +¡ ddt)j*dt)j,ddddt)j*dt)j,ddddt)j*dt)j,ddddt)j*dt)j,ddddt)j*dt) -¡ ddt)j*dt)j,ddddt)j*dt.j/t) -¡ dddt)j*dt) +¡ ddt)j*dt) 0¡ ddt)j*dt) 0¡ ddt)j*dt) 1¡ dddt)j*dt) 0¡ ddt)j*dt) +¡ ddt)j*d t)j,ddddt)j*d!t)j,ddddt)j*d"t)j,ddddt)j*d#t) +¡ ddt) 2d
¡t) 3d¡t)j4d#gd$gd%d&¡ t# 5d'd	dg¡ d(d)„ | 6d*¡D ƒ}d+t)j*d+t) ,d¡ddfd,t)j*d,t) ,d¡ddfd-t)j*d-t) ,d¡ddfd.t)j*d.t.j/t) -¡ dddfd/t)j*d/t) 1¡ ddfd0t)j*d0t) ,d¡ddfd1t)j*d1t.j/t) -¡ dddffD ]\} }!| |vrÍt#j7d*|!d2d3 q¼d4d)„ | 6d5¡D ƒ}"d6t)j*d6t) ,d¡ddfd7t)j*d7t) +¡ ddfd8t)j*d8t) +¡ ddfd9t)j*d9t) 1¡ ddfd:t)j*d:t) 1¡ ddfd;t)j*d;t) +¡ ddfd1t)j*d1t.j/t) -¡ dddffD ]\} }!| |"vr>t#j7d5|!d2d3 q-t# 8d<¡ t# 8d=¡ t# 8d>¡ t# 8d?¡ t# 8d@¡ t# 8dA¡ t# 8dB¡ t# 8dC¡ t# 8dD¡ t# 8dE¡ t# 8dF¡ t# 8dG¡ t# 8dH¡ t# 8dI¡ dJd)„ | 6dK¡D ƒ}#dL|#vr¤t# 7dKt)j*dLt) 1¡ ddMdN¡ dO|#vr×t# 7dKt)j*dOt) +¡ dd¡ t#j9dPdKd5dOgd
gd d2dQ t# 5dRdKdOg¡ dS|#v r×t# 8dT¡ dS|#v rât# :dKdS¡ t# $¡ }$|$ 8t) ;dU¡¡}%|% <¡ D ]+}&|&\}'‰ }(‡ fdVdW„|(D ƒ})|)r|$ 8t) ;dX¡ˆ |)dYœ¡ |$ 8t) ;dZ¡d[|)i¡ qòd\d)„ | 6d]¡D ƒ}*d^t)j*d^t) ,d_¡ddfd`t)j*d`t) 1¡ daddbfdct)j*dct) ,dd¡ddfdet)j*det) ,d_¡ddfdft)j*dft) ,d_¡ddfdgt)j*dgt) ,d¡ddfdht)j*dht) ,d_¡ddfdit)j*dit) ,d_¡ddfdjt)j*djt) -¡ ddfdkt)j*dkt) ,d_¡ddfdlt)j*dlt) ,dd¡ddfdmt)j*dmt) =¡ ddfg}+|+D ]\} }!| |*vrÉt# 7d]|!¡ qºdnd)„ | >d]¡D ƒ},dod^gfdpd`gfdqdggfdrdkgffD ]\}-}.|-|,vr÷t# 5|-d]|.¡ qçdsd)„ | 6dt¡D ƒ}/dgt)j*dgt) ,d¡ddfdht)j*dht) ,d_¡ddfdit)j*dit) ,du¡ddfdvt)j*dvt) 1¡ daddbfdwt)j*dwt) 1¡ daddbfdxt)j*dxt) +¡ ddfdyt)j*dyt) +¡ ddfdzt)j*dzt) +¡ ddfd{t)j*d{t) ?¡ ddfd|t)j*d|t) ?¡ ddfd}t)j*d}t) ?¡ ddfdlt)j*dlt) ,dd¡ddfd~t)j*d~t) /¡ ddfdt)j*dt) +¡ t)j@d€dd‚ddfdƒt)j*dƒt) /¡ ddfd„t)j*d„t) 1¡ ddadNfd…t)j*d…t) /¡ ddfd†t)j*d†t) A¡ ddfd‡t)j*d‡t) ,dˆ¡ddfd‰t)j*d‰t) +¡ ddŠdNfg}0|0D ]\} }!| |/vrt# 7dt|!¡ qòd‹d)„ | >dt¡D ƒ}1dŒdggfddhgfdŽdvgfddwgfdd‡gffD ]\}-}.|-|1vr3t# 5|-dt|.¡ q#d S )‘Nr   ©ÚBase)ÚTenantÚUserÚRoleÚMenuÚUserRoleÚRoleMenuÚModelProviderÚModelÚAgentÚChatMessageÚKnowledgeBaseÚKnowledgeCategoryÚKnowledgeTagÚKnowledgeDocumentÚDocumentTagÚDocumentVectorÚDocumentVersionÚKnowledgeQAÚAuditLogÚPermissionAuditLog)Ú
CasbinRule)ÚRolePermission)ÚTagCategoryÚTagAutoRuleÚKnowledgeMetadataFieldÚDocumentMetadataValue©Úbind)ÚinspectÚlocal_modelsÚidF)ÚnullableÚnameéÿ   )ÚlengthÚ
identifierÚ
model_typeé2   TÚ
base_modelÚ
model_pathÚstatusÚconfig)Úastext_typeÚ	tenant_idÚ
created_atÚ
updated_atÚ
is_deleted)r-   ÚdefaultÚ
deleted_atÚ
deleted_byÚ
asset_kindÚruntime_kindÚsource_kindÚpublished_model_idz	models.idÚ)fk_local_models_published_model_id_models©r.   Úix_local_models_tenant_idc                 S   ó   h | ]}|d  ’qS rE   © ©Ú.0ÚcrH   rH   ú]/lsinfo/ai/hellotax_ai/base_platform/alembic/versions/20260423_0000_consolidated_migration.pyÚ	<setcomp>K   ó    zupgrade.<locals>.<setcomp>Úmodel_providersÚprovider_kindÚprotocolÚ	auth_typeÚcapabilitiesÚis_localÚhealthcheck_pathÚextra_configÚpublic)Úschemac                 S   rG   rE   rH   rI   rH   rH   rL   rM   Y   rN   ÚmodelsÚremote_model_idÚcontext_lengthÚmax_output_tokensÚsupports_streamÚsupports_toolsÚpriorityzZUPDATE public.model_providers SET provider_kind = 'public_api' WHERE provider_kind IS NULLzWUPDATE public.model_providers SET protocol = 'openai_compatible' WHERE protocol IS NULLzUPDATE public.model_providers SET auth_type = CASE WHEN api_key IS NULL OR api_key = '' THEN 'none' ELSE 'bearer' END WHERE auth_type IS NULLzVUPDATE public.model_providers SET capabilities = '[]'::json WHERE capabilities IS NULLzIUPDATE public.model_providers SET is_local = false WHERE is_local IS NULLzMUPDATE public.models SET remote_model_id = code WHERE remote_model_id IS NULLzMUPDATE public.models SET supports_stream = true WHERE supports_stream IS NULLzLUPDATE public.models SET supports_tools = false WHERE supports_tools IS NULLz>UPDATE public.models SET priority = 100 WHERE priority IS NULLz€UPDATE local_models SET asset_kind = CASE WHEN model_type = 'lora' THEN 'adapter' ELSE 'full_model' END WHERE asset_kind IS NULLzKUPDATE local_models SET runtime_kind = 'generic' WHERE runtime_kind IS NULLzJUPDATE local_models SET source_kind = 'imported' WHERE source_kind IS NULLuv  
        INSERT INTO public.model_providers (name, description, configured, default_base_url, api_key, base_url, priority, enabled,
            provider_kind, protocol, auth_type, capabilities, is_local, healthcheck_path, extra_config, created_at, updated_at, is_deleted)
        SELECT 'æœ¬åœ° MLX', 'Local MLX provider', true, 'http://127.0.0.1:8010', NULL, 'http://127.0.0.1:8010', 50, true,
               'local_mlx', 'openai_compatible', 'none', '["chat", "embedding", "rerank"]'::json, true, '/health', NULL, NOW(), NOW(), false
        WHERE NOT EXISTS (SELECT 1 FROM public.model_providers WHERE name = 'æœ¬åœ° MLX')
    a^  
        INSERT INTO public.model_providers (name, description, configured, default_base_url, api_key, base_url, priority, enabled,
            provider_kind, protocol, auth_type, capabilities, is_local, healthcheck_path, extra_config, created_at, updated_at, is_deleted)
        SELECT 'ECS A100', 'Self-hosted ECS model provider', false, NULL, NULL, NULL, 60, true,
               'self_hosted', 'openai_compatible', 'bearer', '["chat", "embedding", "rerank"]'::json, false, '/health', NULL, NOW(), NOW(), false
        WHERE NOT EXISTS (SELECT 1 FROM public.model_providers WHERE name = 'ECS A100')
    c                 S   rG   rE   rH   rI   rH   rH   rL   rM   …   rN   ÚagentsÚuse_rerankerÚtrue)r-   Úserver_defaultÚmodel_idÚfk_agents_model_id_models)Úsource_schemaÚreferent_schemaÚix_agents_model_idÚorchestrator_modela   
                UPDATE agents SET model_id = models.id
                FROM public.models
                WHERE agents.model_id IS NULL
                  AND (agents.orchestrator_model = models.name OR agents.orchestrator_model = models.code)
            z™
        SELECT name, MIN(id) as keep_id, ARRAY_AGG(id ORDER BY id) as all_ids
        FROM public.model_providers GROUP BY name HAVING COUNT(*) > 1
    c                    s   g | ]}|ˆ kr|‘qS rH   rH   ©rJ   Úi©Úkeep_idrH   rL   Ú
<listcomp>Ÿ   s    zupgrade.<locals>.<listcomp>zEUPDATE public.models SET provider_id = :k WHERE provider_id = ANY(:r))ÚkÚrz5DELETE FROM public.model_providers WHERE id = ANY(:r)rp   c                 S   rG   rE   rH   rI   rH   rH   rL   rM   §   rN   Údocument_vectorsÚparent_chunk_idéd   Ú	is_parentÚfalse)rc   r-   Úchunk_levelé   Úprev_chunk_idÚnext_chunk_idÚdoc_typeÚ
doc_numberÚissuing_authorityÚ
referencesÚchunk_idÚ
doc_statusÚissue_date_intc                 S   rG   rE   rH   rj   rH   rH   rL   rM   º   rN   Ú#ix_document_vectors_parent_chunk_idÚix_document_vectors_is_parentÚix_document_vectors_doc_typeÚix_document_vectors_chunk_idc                 S   rG   rE   rH   rI   rH   rH   rL   rM   Å   rN   Úknowledge_documentséÈ   Úenable_parent_childÚenable_reference_extractionÚwindow_sizeÚdoc_number_yearÚdoc_number_serialÚ
issue_dateÚeffective_dateÚexpire_dateÚsupersedes_doc_idsÚsuperseded_by_doc_idzknowledge_documents.idzSET NULL)ÚondeleteÚtax_type_tagsÚhas_attachmentÚattachment_typesÚparse_quality_scoreÚcontent_hashé@   Úversion_numberÚ1c                 S   rG   rE   rH   rj   rH   rH   rL   rM   á   rN   Úix_knowledge_documents_doc_typeÚ!ix_knowledge_documents_doc_numberÚ*ix_knowledge_documents_enable_parent_childÚ2ix_knowledge_documents_enable_reference_extractionÚ#ix_knowledge_documents_content_hash)BÚapp.db.baser   Ú
app.modelsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   Úapp.models.casbin_ruler"   Úapp.models.role_permissionr#   ÚImportErrorÚapp.models.data_modelr$   r%   r&   r'   ÚmetadataÚ
create_allr   Úget_bindÚ
sqlalchemyr*   Úget_table_namesÚcreate_tableÚsaÚColumnÚIntegerÚStringÚTextr   ÚJSONÚDateTimeÚBooleanÚPrimaryKeyConstraintÚUniqueConstraintÚForeignKeyConstraintÚcreate_indexÚget_columnsÚ
add_columnÚexecuteÚcreate_foreign_keyÚdrop_columnÚtextÚfetchallÚ
BigIntegerÚget_indexesÚDateÚ
ForeignKeyÚFloat)2r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r*   r)   Ú	inspectorÚexisting_tablesÚ
mp_columnsÚcolÚcoldefÚ	m_columnsÚ	a_columnsÚconnÚresultÚrowr.   Úall_idsÚ
remove_idsÚ
dv_columnsÚdv_new_colsÚ
dv_indexesÚidxÚcolsÚ
kd_columnsÚkd_new_colsÚ
kd_indexesrH   rl   rL   Úupgrade   s^  Xÿÿ
ÿëù
	€ù
	€













	

ÿ



ÿÿ€ô
€ü
€ÿë
€û
€ør×   c                  C   s"   ddl m}  | jjt ¡ d d S )Nr   r   r(   )rŸ   r   r¥   Údrop_allr   r§   r   rH   rH   rL   Ú	downgradeí   s   rÙ   )r   N)Ú__doc__Útypingr   r   Úalembicr   r¨   r«   Úsqlalchemy.dialectsr   r   ÚstrÚ__annotations__r   r	   r
   r×   rÙ   rH   rH   rH   rL   Ú<module>   s    
 Z