a
    dg&                     @  s  d Z ddlmZ ddlmZmZmZmZmZm	Z	 ddl
mZ ddlmZmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z"m#Z# G dd dee$ Z%G dd de%Z&ddddddZ'G dd de#Z(dS )z#Vector SQL Database Chain Retriever    )annotations)AnyDictListOptionalSequenceUnion)LLMChain)PROMPTSQL_PROMPTS)QUERY_CHECKER)SQLDatabase)CallbackManagerForChainRun)
Embeddings)BaseLanguageModel)BaseOutputParser)BasePromptTemplate)PromptTemplate)
ConfigDict)INTERMEDIATE_STEPS_KEYSQLDatabaseChainc                   @  sl   e Zd ZU dZded< dZded< eddZedd	d
dZ	e
ddddd dddZdddddZdS )VectorSQLOutputParserzOutput Parser for Vector SQL.

    1. finds for `NeuralArray()` and replace it with the embedding
    2. finds for `DISTANCE()` and replace it with the distance name in backend SQL
    r   modeldistancestrdistance_func_nameT)Zarbitrary_types_allowedreturnc                 C  s   dS )NZvector_sql_parser selfr   r   s/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_experimental/sql/vector_sql.py_type&   s    zVectorSQLOutputParser._typer   )r   r   kwargsr   c                 K  s   | f ||d|S )N)r   r   r   )clsr   r   r#   r   r   r!   from_embeddings*   s    z%VectorSQLOutputParser.from_embeddingstextr   c           	      C  s   |  }|d}|}|dkr||dtd d  }|d| td d }|d |d }| j|}ddtt| d }|d| j	||| |}|d	 d
kr|d d	 }|S )NzNeuralArray(r   )   [,]ZDISTANCE;)
stripfindlenr   Zembed_queryjoinmapr   replacer   )	r    r'   startZ_sql_str_complZ_matchedendentityZvecsZvecs_strr   r   r!   parse0   s    
zVectorSQLOutputParser.parseN)r   )__name__
__module____qualname____doc____annotations__r   r   Zmodel_configpropertyr"   classmethodr%   r8   r   r   r   r!   r      s   
 r   c                      s:   e Zd ZdZeddddZddd fddZ  ZS )	 VectorSQLRetrieveAllOutputParserz\Parser based on VectorSQLOutputParser.
    It also modifies the SQL to get all columns.
    r   r   c                 C  s   dS )NZvector_sql_retrieve_all_parserr   r   r   r   r!   r"   G   s    z&VectorSQLRetrieveAllOutputParser._typer&   c                   s\   |  }| d}|dkrP| d}|||td d |d  d}t |S )NZSELECTr   ZFROMr)   *)r/   upperr0   r4   r1   superr8   )r    r'   r5   r6   	__class__r   r!   r8   K   s    $z&VectorSQLRetrieveAllOutputParser.parse)r9   r:   r;   r<   r>   r"   r8   __classcell__r   r   rD   r!   r@   B   s   r@   r   r   zSequence[Dict[str, Any]])dbcmdr   c                 C  s    | j |dd}t|tsJ |S )zGet result from SQL Database.all)fetch)Z_execute
isinstancer   )rG   rH   resultr   r   r!   get_result_from_sqldbT   s    rM   c                	   @  sj   e Zd ZU dZded< dZded< ddd	dd
ddZeddddZe	ddddddd dddZ
dS )VectorSQLDatabaseChaina  Chain for interacting with Vector SQL Database.

    Example:
        .. code-block:: python

            from langchain_experimental.sql import SQLDatabaseChain
            from langchain_community.llms import OpenAI, SQLDatabase, OpenAIEmbeddings
            db = SQLDatabase(...)
            db_chain = VectorSQLDatabaseChain.from_llm(OpenAI(), db, OpenAIEmbeddings())

    *Security note*: Make sure that the database connection uses credentials
        that are narrowly-scoped to only include the permissions this chain needs.
        Failure to do so may result in data corruption or loss, since this chain may
        attempt commands like `DROP TABLE` or `INSERT` if appropriately prompted.
        The best way to guard against such negative outcomes is to (as appropriate)
        limit the permissions granted to the credentials used with this chain.
        This issue shows an example negative outcome if these steps are not taken:
        https://github.com/langchain-ai/langchain/issues/5923
    r   sql_cmd_parserFboolnative_formatNzDict[str, Any]z$Optional[CallbackManagerForChainRun])inputsrun_managerr   c              
   C  s  |p
t  }|| j  d}|j|| jd |d}| jj|d}|t| j	| jj
|dgd}g }z|| | jjf d| i|}	| j|	}
| jr| j|
iW S | js|j|	d| jd	 ||	 |d
|	i t| j|
}|t| n| jpttddgd}t| jj|| jjd}|	| jj
d}|jf d| i|}| j|}|| |j|d| jd	 |d
|i t| j|}|t| |}	|}
|jd| jd |jt|d| jd	 | jr|}np|jd| jd ||	 d| d7 }||d< || | jjf d| i| }|| |j|d| jd	 | j|i}| jr`||t< |W S  ty } z||_ |W Y d }~n
d }~0 0 d S )Nz

SQLQuery:)verbosetable_names_to_use)Ztable_namesz
SQLResult:)inputtop_kdialect
table_infostop	callbacksgreen)colorrT   sql_cmdqueryrX   )templateZinput_variables)llmpromptoutput_parser)r_   rX   z
SQLResult: yellowz
Answer:rV   )!r   Zget_noop_managerZ	input_keyZon_textrT   getdatabaseZget_table_infor   rW   rX   append	llm_chainZpredictZ	get_childrO   r8   Z
return_sqlZ
output_keyZuse_query_checkerrM   query_checker_promptr   r   r	   ra   rc   Zreturn_directr/   Zreturn_intermediate_stepsr   	Exceptionintermediate_steps)r    rR   rS   Z_run_managerZ
input_textrU   rY   Z
llm_inputsrk   Zllm_outr^   rL   ri   Zquery_checker_chainZquery_checker_inputsZchecked_llm_outZchecked_sql_commandZfinal_resultZchain_resultexcr   r   r!   _callv   s    








zVectorSQLDatabaseChain._callr   r   c                 C  s   dS )NZvector_sql_database_chainr   r   r   r   r!   _chain_type   s    z"VectorSQLDatabaseChain._chain_typer   r   zOptional[BasePromptTemplate]zOptional[VectorSQLOutputParser]r   )ra   rG   rb   rO   r#   r   c                 K  s@   |sJ d|pt |jt}t||d}| f |||d|S )Nz7`sql_cmd_parser` must be set in VectorSQLDatabaseChain.)ra   rb   )rh   rf   rO   )r   re   rX   r
   r	   )r$   ra   rG   rb   rO   r#   rh   r   r   r!   from_llm   s    	zVectorSQLDatabaseChain.from_llm)N)NN)r9   r:   r;   r<   r=   rQ   rm   r>   rn   r?   ro   r   r   r   r!   rN   \   s   
 `  rN   N))r<   
__future__r   typingr   r   r   r   r   r   Zlangchain.chains.llmr	   Z$langchain.chains.sql_database.promptr
   r   Z-langchain_community.tools.sql_database.promptr   Z*langchain_community.utilities.sql_databaser   Z langchain_core.callbacks.managerr   Zlangchain_core.embeddingsr   Zlangchain_core.language_modelsr   Zlangchain_core.output_parsersr   Zlangchain_core.promptsr   Zlangchain_core.prompts.promptr   Zpydanticr   Zlangchain_experimental.sql.baser   r   r   r   r@   rM   rN   r   r   r   r!   <module>   s$    ,