Ë
    uPêjÒt  ã                  ó¼   — d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	 ddl
mZ ddlmZ ddlmZ ddlmZ erdd	lmZ dd
lmZ dd„Zdd„Zdd„Z G d„ dee«      Zy)aj  
Bedrock-specific RAG Ingestion implementation.

Bedrock Knowledge Bases handle embedding internally when files are ingested,
so this implementation uploads files to S3 and triggers ingestion jobs.

Supports two modes:
1. Use existing KB: Provide vector_store_id (KB ID)
2. Auto-create KB: Don't provide vector_store_id - creates all AWS resources automatically
é    )ÚannotationsN)ÚTYPE_CHECKINGÚAnyÚFinal)Úverbose_logger)Úget_aws_arn_prefix)Ú
BaseAWSLLM)ÚBaseRAGIngestion)ÚRouter)ÚRAGIngestOptionsc                ó    — | �t        | «      S dS )z#Cast config value to Optional[str].N)Ústr)Úvalues    úl/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/rag/ingestion/bedrock_ingestion.pyÚ_get_str_or_noner      s   € àÐ*Œ3ˆu‹:Ð4°Ð4ó    c                ó    — | €|S t        | «      S )z&Cast config value to int with default.)Úint)r   Údefaults     r   Ú_get_intr   "   s   € à€}ØˆÜˆu‹:Ðr   c                ó”   — d| v rC| j                  d«      d   }| j                  d«      }t        |«      dk\  r|d   }d|› d|› d|› �S | S )	aÑ  
    Normalize a caller ARN to the format required by OpenSearch data access policies.

    OpenSearch Serverless data access policies require:
    - IAM users: arn:aws:iam::account-id:user/user-name
    - IAM roles: arn:aws:iam::account-id:role/role-name

    But get_caller_identity() returns for assumed roles:
    - arn:aws:sts::account-id:assumed-role/role-name/session-name

    This function converts assumed-role ARNs to the proper IAM role ARN format.
    z:assumed-role/ú:é   ú/é   zarn:z:iam::z:role/)ÚsplitÚlen)Ú
caller_arnÚ
account_idÚ	partitionÚpartsÚ	role_names        r   Ú_normalize_principal_arnr#   )   sf   € ð ˜:Ñ%ð &×+Ñ+¨CÓ0°Ñ3ˆ	Ø!×'Ñ'¨Ó,ˆÜˆu‹:˜Š?Ø$ Q™xˆIØ˜)˜ F¨:¨,°f¸Y¸KÐHÐHØÐr   c                  ó¢   — e Zd ZdZ	 d	 	 	 dd„Zd„ Zd„ Zd„ Zdd„Zdd„Z	dd	„Z
dd
„Zdd„Zdd„Zdd„Z	 	 	 	 dd„Z	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zy)ÚBedrockRAGIngestionaŒ  
    Bedrock Knowledge Base RAG ingestion.

    Supports two modes:
    1. **Use existing KB**: Provide vector_store_id
    2. **Auto-create KB**: Don't provide vector_store_id - creates S3 bucket,
       OpenSearch Serverless collection, IAM role, KB, and data source automatically

    Optional config:
    - vector_store_id: Existing KB ID (if not provided, auto-creates)
    - s3_bucket: S3 bucket (auto-created if not provided)
    - embedding_model: Bedrock embedding model (default: amazon.titan-embed-text-v2:0)
    - wait_for_ingestion: Wait for completion (default: True)
    - ingestion_timeout: Max seconds to wait (default: 300)

    AWS Auth (uses BaseAWSLLM):
    - aws_access_key_id, aws_secret_access_key, aws_session_token
    - aws_region_name (default: us-west-2)
    - aws_role_name, aws_session_name, aws_profile_name
    - aws_web_identity_token, aws_sts_endpoint, aws_external_id
    Nc                ó¢  — t        j                  | ||¬«       t        j                  | «       | j                  j	                  d«      xs | j                  j	                  d«      | _        | j                  j	                  d«      | _        | j                  j	                  d«      | _        | j                  j	                  d«      r$t        | j                  j	                  d«      «      nd | _	        | j                  j	                  d«      xs d| _
        | j                  j	                  d	d
«      | _        t        | j                  j	                  d«      d«      | _        | j                  j	                  d«      }| j                  |rt        |«      nd ¬«      | _        d | _        d | _        | j                  xs d| _        d
| _        i | _        y )N)Úingest_optionsÚrouterÚvector_store_idÚknowledge_base_idÚdata_source_idÚ	s3_bucketÚ	s3_prefixÚembedding_modelzamazon.titan-embed-text-v2:0Úwait_for_ingestionFÚingestion_timeouti,  Úaws_region_name)r1   zdata/)r
   Ú__init__r	   Úvector_store_configÚgetr*   Ú_data_source_idÚ
_s3_bucketr   Ú
_s3_prefixr.   r/   r   r0   Ú)get_aws_region_name_for_non_llm_api_callsr1   r+   r,   r-   Ú_config_initializedÚ_created_resources)Úselfr'   r(   Ú_aws_regions       r   r2   zBedrockRAGIngestion.__init__X   sš  € ô
 	×!Ñ! $°~ÈfÕUÜ×Ñ˜DÔ!ð "&×!9Ñ!9×!=Ñ!=Ð>OÓ!Pò "
ÐTX×TlÑTl×TpÑTpØóU
ˆÔð
  $×7Ñ7×;Ñ;Ð<LÓMˆÔØ×2Ñ2×6Ñ6°{ÓCˆŒà>B×>VÑ>V×>ZÑ>ZÐ[fÔ>gŒC�×(Ñ(×,Ñ,¨[Ó9Ô:Ðmqð 	Œð  $×7Ñ7×;Ñ;Ð<MÓNÒpÐRpˆÔà"&×":Ñ":×">Ñ">Ð?SÐUZÓ"[ˆÔÜ&.¨t×/GÑ/G×/KÑ/KÐL_Ó/`ÐbeÓ&fˆÔð "×5Ñ5×9Ñ9Ð:KÓLˆØ#×MÑMÙ0;œC Ô,Àð  Nó  
ˆÔð
 +/ˆÔØ%)ˆŒØ"Ÿo™oÒ8°ˆŒØ#(ˆÔ ð 35ˆÕr   c              ƒ  ó°   K  — | j                   ry| j                  r| j                  «        d| _         y| j                  «       ƒ d{  –—†  d| _         y7 Œ­w)zHLazily initialize KB config - either detect from existing or create new.NT)r9   r*   Ú_auto_detect_configÚ%_create_knowledge_base_infrastructure)r;   s    r   Ú_ensure_config_initializedz.BedrockRAGIngestion._ensure_config_initialized   sR   è ø€ à×#Ò#Øà×!Ò!à×$Ñ$Ô&ð
 $(ˆÕ ð ×<Ñ<Ó>×>Ð>à#'ˆÕ ð ?ús   ‚AAÁAÁAc                ó¼  — t        j                  d| j                  «       | j                  d«      }|j	                  | j                  ¬«      }|j                  dg «      }|st        d| j                  › d�«      ‚| j                  r| j                  | _        n-|d   d   | _        t        j                  d	| j                  «       |j                  | j                  | j                  ¬
«      }|j                  di «      j                  di «      j                  di «      }|j                  dd«      }|rt| j                  xs |j                  d«      d   | _        t        j                  d| j                  «       |j                  dg «      }|r| j                  s|d   | _        yyy| j                  st        d| j                  › d�«      ‚| j                  | _        y)zFAuto-detect data source ID and S3 bucket from existing Knowledge Base.z2Auto-detecting data source and S3 bucket for KB=%súbedrock-agent©ÚknowledgeBaseIdÚdataSourceSummariesz)No data sources found for Knowledge Base zL. Please create a data source first or provide data_source_id and s3_bucket.r   ÚdataSourceIdzAuto-detected data source: %s©rD   rF   Ú
dataSourceÚdataSourceConfigurationÚs3ConfigurationÚ	bucketArnÚ r   éÿÿÿÿzAuto-detected S3 bucket: %sÚinclusionPrefixesz0Could not auto-detect S3 bucket for data source z%. Please provide s3_bucket in config.N)r   Údebugr*   Ú_get_boto3_clientÚlist_data_sourcesr4   Ú
ValueErrorr5   r+   ÚinfoÚget_data_sourcer6   r   r,   r7   r-   )r;   Úbedrock_agentÚds_responseÚdata_sourcesÚ
ds_detailsÚ	s3_configÚ
bucket_arnÚprefixess           r   r>   z'BedrockRAGIngestion._auto_detect_config�   sÍ  € ä×ÑÐQÐSW×SiÑSiÔjà#×5Ñ5°oÓFˆð +×<Ñ<ÈT×McÑMcÐ<ÓdˆØ)Ÿo™oÐ.CÀRÓHˆáÜØ;¸D×<RÑ<RÐ;Sð T]ð ]óð ð ×ÒØ"&×"6Ñ"6ˆDÕà".¨q¡/°.Ñ"AˆDÔÜ×ÑÐ ?À×ATÑATÔUð *×9Ñ9Ø ×2Ñ2Ø×,Ñ,ð :ó 
ˆ
ð
 —N‘N <°Ó4×8Ñ8Ð9RÐTVÓW×[Ñ[Ð\mÐoqÓrˆ	à%ŸM™M¨+°rÓ:ˆ
Ùà!Ÿ_™_ÒI°
×0@Ñ0@ÀÓ0EÀbÑ0IˆDŒNÜ×ÑÐ =¸t¿~¹~ÔNð (Ÿm™mÐ,?ÀÓDˆHÙ §¢Ø!)¨!¡�•ð !0ˆxð —?’?Ü ØFÀt×GZÑGZÐF[ð \:ð :óð ð "Ÿ_™_ˆD�Nr   c              ƒ  óÈ  K  — t        j                  d«       t        j                  «       j                  dd }| j
                  xs d|› �}| j                  d«      }|j                  «       }|d   }|d   }| j                  xs | j                  |«      | _
        | j                  |||«      ƒ d{  –—† \  }}| j                  |«      ƒ d{  –—†  | j                  |||«      ƒ d{  –—† }	| j                  ||	|«      ƒ d{  –—† | _        | j!                  |«      | _        t        j                  d| j                  | j"                  | j                  «       y7 Œ¨7 ŒŽ7 Œu7 Œ\­w)	z9Create all AWS resources needed for a new Knowledge Base.z5Creating new Bedrock Knowledge Base infrastructure...Né   úlitellm-kb-ÚstsÚAccountÚArnz8Created KB infrastructure: kb_id=%s, ds_id=%s, bucket=%s)r   rS   ÚuuidÚuuid4ÚhexÚingest_namerP   Úget_caller_identityr6   Ú_create_s3_bucketr,   Ú_create_opensearch_collectionÚ_create_opensearch_indexÚ_create_bedrock_roleÚ_create_knowledge_baser*   Ú_create_data_sourcer+   )
r;   Ú	unique_idÚkb_namer_   Úcaller_identityr   r   Úcollection_nameÚcollection_arnÚrole_arns
             r   r?   z9BedrockRAGIngestion._create_knowledge_base_infrastructure¾   s^  è ø€ ä×ÑÐSÔTô  Ÿ:™:›<×+Ñ+¨B¨QÐ/ˆ	Ø×)Ñ)ÒF¨{¸9¸+Ð-Fˆð ×+Ñ+¨EÓ2ˆØ!$×!8Ñ!8Ó!:ˆØ+¨IÑ6ˆ
Ø+¨EÑ2ˆ
ð Ÿ™ÒM¨D×,BÑ,BÀ9Ó,MˆŒð 15×0RÑ0RÐS\Ð^hÐjtÓ0u×*uÑ'ˆ˜ð ×+Ñ+¨OÓ<×<Ð<ð !%× 9Ñ 9¸)ÀZÐQ_Ó `×`ˆð (,×'BÑ'BÀ7ÈHÐVdÓ'e×!eˆÔð #×6Ñ6°wÓ?ˆÔä×ÑØFØ×"Ñ"Ø×ÑØ�N‰Nõ		
ð +vøð 	=øð aøð "fúsI   ‚B/E"Â1EÂ2E"ÃEÃE"Ã(EÃ)E"ÄE ÄAE"ÅE"ÅE"Å E"c                ó  — | j                  d«      }d|› �}t        j                  d|«       d|i}| j                  dk7  rd| j                  i|d<    |j                  d
i |¤Ž || j
                  d<   t        j                  d	|«       |S )z$Create S3 bucket for KB data source.Ús3r^   zCreating S3 bucket: %sÚBucketz	us-east-1ÚLocationConstraintÚCreateBucketConfigurationr,   zCreated S3 bucket: %s© )rP   r   rO   r1   Úcreate_bucketr:   rS   )r;   rm   rt   Úbucket_nameÚcreate_paramss        r   rg   z%BedrockRAGIngestion._create_s3_bucketå   s˜   € à×*Ñ*¨4Ó0ˆØ*¨9¨+Ð6ˆä×ÑÐ5°{ÔCà08¸+Ð/FˆØ×Ñ ;Ò.Ø:NÐPT×PdÑPdÐ9eˆMÐ5Ñ6àˆ×ÑÑ)˜=Ò)Ø/:ˆ×Ñ Ñ,ä×ÑÐ3°[ÔAØÐr   c              ƒ  ód  K  — | j                  d«      }d|› �}t        j                  d|«       |j                  |› d�dt	        j
                  dd|› �gdœgd	d
œ«      ¬«       |j                  |› d�dt	        j
                  dd|› �gdœdd|› �gdœgd	dœg«      ¬«       t        ||«      }t        j                  d||«       t        | j                  «      › d|› d�|g}t        t        |«      «      }|j                  |› d�dt	        j
                  dd|› d�gdgdœdd|› �gdgdœg|dœg«      ¬«       |j                  |d¬«      }|d   d   }	|| j                  d<   t        j                  d «       t        d!«      D ]D  }
|j                  |	g¬"«      }|d#   d$   d%   }|d&k(  r n*t!        j"                  d'«      ƒ d({  –—†  ŒF t%        d)«      ‚|d#   d$   d*   }t        j&                  d+|«       t        j                  d,«       t!        j"                  d!«      ƒ d({  –—†  ||fS 7 Œh7 Œ
­w)-z;Create OpenSearch Serverless collection for vector storage.Úopensearchserverlessr^   z-Creating OpenSearch Serverless collection: %sz-encÚ
encryptionÚ
collectionzcollection/)ÚResourceTypeÚResourceT)ÚRulesÚAWSOwnedKey)ÚnameÚtypeÚpolicyz-netÚnetworkÚ	dashboard)r‚   ÚAllowFromPubliczCaller ARN: %s, Normalized: %sziam::z:rootz-accessÚdataÚindexzindex/ú/*zaoss:*)r€   r�   Ú
Permission)r‚   Ú	PrincipalÚVECTORSEARCH)r„   r…   ÚcreateCollectionDetailÚidÚopensearch_collectionz1Waiting for OpenSearch collection to be active...é<   )ÚidsÚcollectionDetailsr   ÚstatusÚACTIVEé   Nz3OpenSearch collection did not become active in timeÚarnz!Created OpenSearch collection: %sz4Waiting for data access policy to propagate (60s)...)rP   r   rO   Úcreate_security_policyÚjsonÚdumpsr#   r   r1   ÚlistÚsetÚcreate_access_policyÚcreate_collectionr:   ÚrangeÚbatch_get_collectionÚasyncioÚsleepÚTimeoutErrorrS   )r;   rm   r   r   Úossrp   Únormalized_caller_arnÚ
principalsÚresponseÚcollection_idÚ_Ústatus_responser–   rq   s                 r   rh   z1BedrockRAGIngestion._create_opensearch_collectionö   së  è ø€ à×+Ñ+Ð,BÓCˆØ#.¨y¨kÐ!:ˆä×ÑÐLÈoÔ^ð 	×"Ñ"Ø#Ð$ DÐ)ØÜ—:‘:ð -9Ø+6°Ð6GÐ)HÐ(Iñðð $(ñó
ð 	#ô 	
ð" 	×"Ñ"Ø#Ð$ DÐ)ØÜ—:‘:ð
 1=Ø/:¸?Ð:KÐ-LÐ,Mñð
 1<Ø/:¸?Ð:KÐ-LÐ,Mñð	"ð ,0ñðóð 	#ô 	
ô2 (@À
ÈJÓ'WÐÜ×ÑÐ=¸zÐK`Ôaä+¨D×,@Ñ,@ÓAÐBÀ%È
À|ÐSXÐYÐ[pÐqˆ
äœ#˜j›/Ó*ˆ
à× Ñ Ø#Ð$ GÐ,ØÜ—:‘:ð
 18Ø/5°oÐ5FÀbÐ-IÐ,JØ/7¨jñð 1=Ø/:¸?Ð:KÐ-LÐ,MØ/7¨jñð"ð &0ñðóð 	!ô 	
ð2 ×/Ñ/Ø Øð 0ó 
ˆð  (Ð(@ÑAÀ$ÑGˆØ;Jˆ×ÑÐ 7Ñ8ô 	×ÑÐPÔQÜ�r“ò 	VˆAØ!×6Ñ6¸M¸?Ð6ÓKˆOØ$Ð%8Ñ9¸!Ñ<¸XÑFˆFØ˜Ò!ÙÜ—-‘- Ó"×"Ñ"ð	Vô ÐTÓUÐUà /Ð0CÑ DÀQÑ GÈÑ NˆÜ×ÑÐ?ÀÔQô 	×ÑÐSÔTÜ�m‰m˜BÓ×Ðà Ð.Ð.ð #øð 	 ús%   ‚GH0ÇH,ÇAH0È#H.È$	H0È.H0c           	   ƒ  ó8  K  — ddl m}m} ddlm} | j                  t        | j                  j                  d«      «      t        | j                  j                  d«      «      t        | j                  j                  d«      «      | j                  ¬«      }| j                  d«      }|j                  |g¬	«      }|d
   d   d   }|j                  dd«      }	 ||j                  |j                  | j                  d|j                  ¬«      }
 ||	ddœg|
dd|¬«      }d}ddddœidddddddœdœd d!d"œd#d id$œid%œ}d&}d'}d(}t!        |«      D ]7  }	 |j"                  j%                  ||¬)«       t'        j(                  d*|«        y( t7        d/|› d0|› �«      ‚# t*        $ rv}|}t-        |«      }d+|j/                  «       v sd,|j/                  «       v r:t'        j0                  d-|d.z   ||«       t3        j4                  |«      ƒ d({  –—†7   n‚ Y d(}~ŒÅd(}~ww xY w­w)1z>Create vector index in OpenSearch collection with retry logic.r   )Ú
OpenSearchÚRequestsHttpConnection)ÚAWS4AuthÚaws_access_key_idÚaws_secret_access_keyÚaws_session_token)r±   r²   r³   r1   r}   )Únamesr•   ÚcollectionEndpointzhttps://rL   Úaoss)Úsession_tokeni»  )ÚhostÚportT)ÚhostsÚ	http_authÚuse_sslÚverify_certsÚconnection_classúbedrock-kb-indexr‹   i   )Úknnzknn.algo_param.ef_searchÚ
propertiesÚ
knn_vectori   ÚfaissÚhnswÚl2)Úenginer„   Ú
space_type)r…   Ú	dimensionÚmethodÚtextF)r…   r‹   r…   )ú%bedrock-knowledge-base-default-vectorÚAMAZON_BEDROCK_METADATAÚAMAZON_BEDROCK_TEXT_CHUNK)ÚsettingsÚmappingsr]   é   N)r‹   ÚbodyzCreated OpenSearch index: %sÚauthorization_exceptionÚsecurity_exceptionzjOpenSearch index creation attempt %s/%s failed due to authorization. Waiting %ss for policy propagation...r   z(Failed to create OpenSearch index after zC attempts. Data access policy may not have propagated. Last error: )Úopensearchpyr®   r¯   Úrequests_aws4authr°   Úget_credentialsr   r3   r4   r1   rP   r¢   ÚreplaceÚ
access_keyÚ
secret_keyÚtokenr¡   ÚindicesÚcreater   rS   Ú	Exceptionr   ÚlowerÚwarningr£   r¤   ÚRuntimeError)r;   rp   r®   r¯   r°   Úcredentialsr¦   ÚcollectionsÚendpointr¸   ÚauthÚclientÚ
index_nameÚ
index_bodyÚmax_retriesÚretry_delayÚ
last_errorÚattemptÚeÚ	error_strs                       r   ri   z,BedrockRAGIngestion._create_opensearch_indexd  sn  è ø€ çCÝ.ð "×1Ñ1Ü.¨t×/GÑ/G×/KÑ/KÐL_Ó/`ÓaÜ"2°4×3KÑ3K×3OÑ3OÐPgÓ3hÓ"iÜ.¨t×/GÑ/G×/KÑ/KÐL_Ó/`ÓaØ ×0Ñ0ð	 2ó 
ˆð ×+Ñ+Ð,BÓCˆØ ×5Ñ5¸_Ð<MÐ5ÓNˆØ%Ð&9Ñ:¸1Ñ=Ð>RÑSˆØ×&Ñ& z°2Ó6ˆáØ×"Ñ"Ø×"Ñ"Ø× Ñ ØØ%×+Ñ+ô
ˆñ #Ø ¨#Ñ.Ð/ØØØØ3ô
ˆð /ˆ
à ¨$ÈCÑ"PÐQàà ,Ø%)à&-Ø$*Ø*.ñ#ñ>ð 9?ÈÑ/OØ28¸&Ð1Añðñ
ˆ
ð( ˆØˆØˆ
ä˜[Ó)ò 	ˆGðØ—‘×%Ñ%¨J¸ZÐ%ÔHÜ×#Ñ#Ð$BÀJÔOÙð		ô* Ø6°{°mð DGØGQÀlðTó
ð 	
øô! ò Ø�
Ü ›F�	Ø,°	·±Ó0AÑAÐEYÐ]f×]lÑ]lÓ]nÑEnÜ"×*Ñ*ð EØ !™Ø#Ø#ô	ô "Ÿ-™-¨Ó4×4Ò4ð ô 5ûðüs=   ‚EHÅ3FÆHÆ	HÆ!A$HÈHÈHÈHÈHÈHc              ƒ  ó2  K  — | j                  d«      }d|› �}t        j                  d|«       ddddidd	|id
t        | j                  «      › d| j                  › d|› d�idœdœgdœ}|j                  |t        j                  |«      ¬«      }|d   d   }|| j                  d<   dddgt        | j                  «      › d| j                  › d| j                  › �gdœddg|gdœdddgt        | j                  «      › d| j                  › �t        | j                  «      › d| j                  › d�gdœgdœ}	|j                  ||› d�t        j                  |	«      ¬«       t        j                  d«      ƒ d {  –—†  t        j                  d!|«       |S 7 Œ­w)"zCreate IAM role for Bedrock KB.Úiamzlitellm-bedrock-kb-zCreating IAM role: %sz
2012-10-17ÚAllowÚServicezbedrock.amazonaws.comzsts:AssumeRolezaws:SourceAccountzaws:SourceArnúbedrock:r   z:knowledge-base/*)ÚStringEqualsÚArnLike)ÚEffectrŽ   ÚActionÚ	Condition)ÚVersionÚ	Statement)ÚRoleNameÚAssumeRolePolicyDocumentÚRolera   Úiam_rolezbedrock:InvokeModelú::foundation-model/)rõ   rö   r�   zaoss:APIAccessAllzs3:GetObjectzs3:ListBucketús3:::rŒ   z-policy)rú   Ú
PolicyNameÚPolicyDocumenté
   NzCreated IAM role: %s)rP   r   rO   r   r1   Úcreate_roler›   rœ   r:   r.   r,   Úput_role_policyr£   r¤   rS   )
r;   rm   r   rq   rï   r"   Útrust_policyr©   rr   Úpermissions_policys
             r   rj   z(BedrockRAGIngestion._create_bedrock_roleº  s  è ø€ à×+Ñ+¨EÓ2ˆØ0°°Ð<ˆ	ä×ÑÐ4°iÔ@ð $ð &Ø"+Ð-DÐ!EØ.à)<¸jÐ(Ià+Ü#5°d×6JÑ6JÓ#KÐ"LÈHØ#'×#7Ñ#7Ð"8¸¸*¸ÐEVð!Xð$ñ"ñ	ðñ
ˆð( Ÿ/™/ØÜ%)§Z¡Z°Ó%=ð *ó 
ˆð # 6Ñ*¨5Ñ1ˆØ.7ˆ×Ñ 
Ñ+ð $ð &Ø4Ð5ä-¨d×.BÑ.BÓCÐDÀHØ×/Ñ/Ð0Ð0CÀD×DXÑDXÐCYð[ð!ñð &Ø2Ð3Ø!/Ð 0ñð &Ø-¨Ð?ä-¨d×.BÑ.BÓCÐDÀEÈ$Ï.É.ÐIYÐZÜ-¨d×.BÑ.BÓCÐDÀEÈ$Ï.É.ÐIYÐY[Ð\ð!ñðñ%
Ðð6 	×ÑØØ#˜ GÐ,ÜŸ:™:Ð&8Ó9ð 	ô 	
ô �m‰m˜BÓ×Ðä×ÑÐ2°HÔ=Øˆð 	 ús   ‚E6FÅ8FÅ9Fc              ƒ  ó>  K  — | j                  d«      }t        j                  d|«       |j                  ||ddt	        | j
                  «      › d| j
                  › d| j                  › �idœd|d	d
ddœddœdœ¬«      }|d   d   }|| j                  d<   t        j                  d«       t        d«      D ]@  }|j                  |¬«      }|d   d   }	|	dk(  r n*t        j                  d«      ƒ d{  –—†  ŒB t        d«      ‚t        j                  d|«       |S 7 Œ)­w)zCreate Bedrock Knowledge Base.rB   zCreating Knowledge Base: %sÚVECTORÚembeddingModelArnrò   rþ   )r…   Ú vectorKnowledgeBaseConfigurationÚOPENSEARCH_SERVERLESSrÌ   rÍ   rË   )ÚmetadataFieldÚ	textFieldÚvectorFieldr¿   )ÚcollectionArnÚfieldMappingÚvectorIndexName)r…   Ú!opensearchServerlessConfiguration)r„   ÚroleArnÚknowledgeBaseConfigurationÚstorageConfigurationÚknowledgeBaserD   Úknowledge_basez*Waiting for Knowledge Base to be active...é   rC   r–   r—   r   Nz,Knowledge Base did not become active in timezCreated Knowledge Base: %s)rP   r   rO   Úcreate_knowledge_baser   r1   r.   r:   r¡   Úget_knowledge_baser£   r¤   r¥   rS   )
r;   rn   rr   rq   rU   r©   Úkb_idr«   Ú	kb_statusr–   s
             r   rk   z*BedrockRAGIngestion._create_knowledge_base  s[  è ø€ à#×5Ñ5°oÓFˆä×ÑÐ:¸GÔDà'×=Ñ=ØØà à'Ü-¨d×.BÑ.BÓCÐDÀHØ×/Ñ/Ð0Ð0CÀD×DXÑDXÐCYð[ð5ñ(ð 0à%3à)BØ%@Ø'Nñ%ð
 (:ñ6ñ"ð >ó 
ˆð2   Ñ0Ð1BÑCˆØ49ˆ×ÑÐ 0Ñ1ô 	×ÑÐIÔJÜ�r“ò 	OˆAØ%×8Ñ8ÈÐ8ÓOˆIØ˜Ñ/°Ñ9ˆFØ˜Ò!ÙÜ—-‘- Ó"×"Ñ"ð	Oô ÐMÓNÐNä×ÑÐ8¸%Ô@Øˆð #ús   ‚C/DÃ1DÃ2*Dc                ój  — | j                  d«      }t        j                  d| j                  «       |j	                  | j                  |› d�dt        | j                  «      › d| j                  › �| j                  gdœdœ¬«      }|d	   d
   }|| j                  d<   t        j                  d|«       |S )z*Create Data Source for the Knowledge Base.rB   zCreating Data Source for KB: %sz
-s3-sourceÚS3rÿ   )rK   rN   )r…   rJ   )rD   r„   rI   rH   rF   Údata_sourcezCreated Data Source: %s)rP   r   rO   r*   Úcreate_data_sourcer   r1   r,   r-   r:   rS   )r;   rn   rU   r©   Úds_ids        r   rl   z'BedrockRAGIngestion._create_data_source4  sÁ   € à#×5Ñ5°oÓFˆä×ÑÐ>À×@VÑ@VÔWà'×:Ñ:Ø ×2Ñ2Ø�9˜JÐ'àä$6°t×7KÑ7KÓ$LÐ#MÈUÐSW×SaÑSaÐRbÐ!cØ*.¯.©.Ð)9ñ$ñ%ð ;ó 

ˆð   Ñ-¨nÑ=ˆØ16ˆ×Ñ Ñ.ä×ÑÐ5°uÔ=Øˆr   c                ó†  — 	 ddl }| j                  t        | j                  j                  d«      «      t        | j                  j                  d«      «      t        | j                  j                  d«      «      | j                  t        | j                  j                  d«      «      t        | j                  j                  d«      «      t        | j                  j                  d	«      «      t        | j                  j                  d
«      «      t        | j                  j                  d«      «      t        | j                  j                  d«      «      ¬«
      }|j                  |j                  |j                  |j                  | j                  ¬«      }|j                  |«      S # t        $ r t        d«      ‚w xY w)zCGet a boto3 client for the specified service using BaseAWSLLM auth.r   NzHboto3 is required for Bedrock ingestion. Install with: pip install boto3r±   r²   r³   Úaws_session_nameÚaws_profile_nameÚaws_role_nameÚaws_web_identity_tokenÚaws_sts_endpointÚaws_external_id)
r±   r²   r³   r1   r#  r$  r%  r&  r'  r(  )r±   r²   r³   Úregion_name)Úboto3ÚImportErrorrÖ   r   r3   r4   r1   ÚSessionrØ   rÙ   rÚ   rå   )r;   Úservice_namer*  rá   Úsessions        r   rP   z%BedrockRAGIngestion._get_boto3_clientK  s}  € ð	jÛð
 "×1Ñ1Ü.¨t×/GÑ/G×/KÑ/KÐL_Ó/`ÓaÜ"2°4×3KÑ3K×3OÑ3OÐPgÓ3hÓ"iÜ.¨t×/GÑ/G×/KÑ/KÐL_Ó/`ÓaØ ×0Ñ0Ü-¨d×.FÑ.F×.JÑ.JÐK]Ó.^Ó_Ü-¨d×.FÑ.F×.JÑ.JÐK]Ó.^Ó_Ü*¨4×+CÑ+C×+GÑ+GÈÓ+XÓYÜ#3°D×4LÑ4L×4PÑ4PÐQiÓ4jÓ#kÜ-¨d×.FÑ.F×.JÑ.JÐK]Ó.^Ó_Ü,¨T×-EÑ-E×-IÑ-IÐJ[Ó-\Ó]ð 2ó 
ˆð Ÿ™Ø)×4Ñ4Ø"-×"8Ñ"8Ø)×/Ñ/Ø×,Ñ,ð	 'ó 
ˆð �~‰~˜lÓ+Ð+øô3 ò 	jÜÐhÓiÐið	jús   ‚F+ Æ+G c              ƒ  ó   K  — y­w)z”
        Bedrock handles embedding internally - skip this step.

        Returns:
            None (Bedrock embeds when files are ingested)
        Nrx   )r;   Úchunkss     r   ÚembedzBedrockRAGIngestion.embedj  s   è ø€ ð ùs   ‚c              ƒ  óÌ  K  — | j                  «       ƒ d{  –—†  |r|s,t        j                  d«       t        | j                  «      dfS | j                  d«      }| j                  j                  d«      › d|› �}t        j                  d| j                  |«       |j                  | j                  |||xs d¬«       t        j                  d| j                  |«       | j                  d	«      }	t        j                  d
| j                  | j                  «       |	j                  | j                  | j                  ¬«      }
|
d   d   }t        j                  d|«       | j                  �rIddl}|j                  «       }|j                  «       |z
  | j                   k  �r|	j#                  | j                  | j                  |¬«      }|d   d   }t        j                  d||«       |dk(  r<|d   j%                  di «      }t        j                  d|j%                  dd«      «       nŒ|dk(  r,|d   j%                  dg «      }t        j&                  d|«       n[|dv rt)        j*                  d«      ƒ d{  –—†  nt        j                  d|«       n"|j                  «       |z
  | j                   k  r�Œ| j                  rt-        | j                  «      |fS d|fS 7 �ŒÉ7 Œh­w)aœ  
        Store content in Bedrock Knowledge Base.

        Bedrock workflow:
        1. Auto-detect data source and S3 bucket (if not provided)
        2. Upload file to S3 bucket
        3. Start ingestion job
        4. (Optional) Wait for ingestion to complete

        Args:
            file_content: Raw file bytes
            filename: Name of the file
            content_type: MIME type
            chunks: Ignored - Bedrock handles chunking
            embeddings: Ignored - Bedrock handles embedding
            existing_file_id: Existing provider file ID, unsupported for Bedrock

        Returns:
            Tuple of (knowledge_base_id, file_key)
        Nz:No file content or filename provided for Bedrock ingestionrt   r   zUploading file to s3://%s/%szapplication/octet-stream)ru   ÚKeyÚBodyÚContentTypezUploaded file to s3://%s/%srB   z'Starting ingestion job for KB=%s, DS=%srG   ÚingestionJobÚingestionJobIdzStarted ingestion job: %sr   )rD   rF   r7  r–   zIngestion job %s status: %sÚCOMPLETEÚ
statisticsz#Ingestion complete: %s docs indexedÚnumberOfNewDocumentsIndexedÚFAILEDÚfailureReasonszIngestion failed: %s)ÚSTARTINGÚIN_PROGRESSr   zUnknown ingestion status: %s)r@   r   rß   r   r*   rP   r-   ÚrstriprO   r,   Ú
put_objectrS   r+   Ústart_ingestion_jobr/   Útimer0   Úget_ingestion_jobr4   Úerrorr£   r¤   r   )r;   Úfile_contentÚfilenameÚcontent_typer0  Ú
embeddingsÚexisting_file_idÚ	s3_clientÚs3_keyrU   Úingestion_responseÚjob_idÚtime_moduleÚ
start_timeÚ
job_statusr–   ÚstatsÚfailure_reasonss                     r   ÚstorezBedrockRAGIngestion.storev  sÒ  è ø€ ð< ×-Ñ-Ó/×/Ð/á¡8Ü×"Ñ"Ð#_Ô`Ü# D×$:Ñ$:Ó;¸TÐAÐAð  ×1Ñ1°$Ó7ˆ	ØŸ>™>×0Ñ0°Ó5Ð6°a¸°zÐBˆä×ÑÐ;¸T¿^¹^ÈVÔTØ×ÑØ—>‘>ØØØ$ÒBÐ(Bð	 	ô 	
ô 	×ÑÐ9¸4¿>¹>È6ÔRð  $×5Ñ5°oÓFˆä×ÑÐFÈ×H^ÑH^Ð`d×`sÑ`sÔtØ$1×$EÑ$EØ ×2Ñ2Ø×,Ñ,ð %Fó %
Ðð +¨>Ñ:Ð;KÑLˆÜ×ÑÐ7¸Ô@ð ×"Ó"Û&à +× 0Ñ 0Ó 2ˆJØ×"Ñ"Ó$ zÑ1°D×4JÑ4JÓJØ*×<Ñ<Ø$(×$:Ñ$:Ø!%×!4Ñ!4Ø#)ð =ó �
ð
 $ NÑ3°HÑ=�Ü×$Ñ$Ð%BÀFÈFÔSà˜ZÒ'Ø& ~Ñ6×:Ñ:¸<ÈÓL�EÜ"×'Ñ'Ø=¸u¿y¹yÐIfÐhiÓ?jôð Ø˜xÒ'Ø&0°Ñ&@×&DÑ&DÐEUÐWYÓ&Z�OÜ"×(Ñ(Ð)?ÀÔQØØÐ:Ñ:Ü!Ÿ-™-¨Ó*×*Ñ*ä"×*Ñ*Ð+IÈ6ÔRØð/ ×"Ñ"Ó$ zÑ1°D×4JÑ4JÔJð2 /3×.DÒ.DŒs�4×)Ñ)Ó*ÐPVÐVÐVÈ$ÐPVÐVÐVðy 	0ùðn +ús(   ‚K$–K—I"K$É9K"É:<K$Ê8(K$Ë"K$)N)r'   r   r(   zRouter | None)rm   r   Úreturnr   )rm   r   r   r   r   r   rT  ztuple[str, str])rp   r   )rm   r   r   r   rq   r   rT  r   )rn   r   rr   r   rq   r   rT  r   )rn   r   rT  r   )r-  r   )r0  ú	list[str]rT  úlist[list[float]] | None)rE  zbytes | NonerF  ú
str | NonerG  rW  r0  rU  rH  rV  rI  rW  rT  ztuple[str | None, str | None])Ú__name__Ú
__module__Ú__qualname__Ú__doc__r2   r@   r>   r?   rg   rh   ri   rj   rk   rl   rP   r1  rS  rx   r   r   r%   r%   A   sÔ   „ ñð2 !%ð%5à(ð%5ð ó%5òN(ò/-òb%
óNó"l/ó\T
ólHóT.ó`ó.,ð>
àð
ð 
"ó
ð& (,ðZWà"ðZWð ðZWð !ð	ZWð
 ðZWð -ðZWð %ðZWð 
'ôZWr   r%   )r   r   rT  rW  )r   r   r   r   rT  r   )r   r   r   r   rT  r   )r[  Ú
__future__r   r£   r›   rb   Útypingr   r   r   Úlitellm._loggingr   Ú(litellm.litellm_core_utils.aws_partitionr   Ú!litellm.llms.bedrock.base_aws_llmr	   Ú$litellm.rag.ingestion.base_ingestionr
   Úlitellmr   Úlitellm.types.ragr   r   r   r#   r%   rx   r   r   ú<module>rd     sU   ðñ	õ #ã Û Û ß ,Ñ ,å +Ý GÝ 8Ý AáÝÝ2ó5ó
óô0O
WÐ*¨Jõ O
Wr   