| from operator import itemgetter |
| from typing import Any, Dict, Iterable, Tuple |
| import tiktoken |
| from langchain_core.runnables import RunnablePassthrough |
|
|
|
|
| def num_tokens_from_string(string: str, encoding_name: str = "cl100k_base") -> int: |
| encoding = tiktoken.get_encoding(encoding_name) |
| num_tokens = len(encoding.encode(string)) |
| return num_tokens |
|
|
|
|
| def pass_values(x): |
| if not isinstance(x, list): |
| x = [x] |
| return {k: itemgetter(k) for k in x} |
|
|
|
|
| def prepare_chain(chain,name): |
| chain = propagate_inputs(chain) |
| chain = rename_chain(chain,name) |
| return chain |
|
|
|
|
| def propagate_inputs(chain): |
| chain_with_values = { |
| "outputs": chain, |
| "inputs": RunnablePassthrough() |
| } | RunnablePassthrough() | flatten_dict |
| return chain_with_values |
|
|
| def rename_chain(chain,name): |
| return chain.with_config({"run_name":name}) |
|
|
|
|
| |
| def _flatten_dict( |
| nested_dict: Dict[str, Any], parent_key: str = "", sep: str = "_" |
| ) -> Iterable[Tuple[str, Any]]: |
| """ |
| Generator that yields flattened items from a nested dictionary for a flat dict. |
| |
| Parameters: |
| nested_dict (dict): The nested dictionary to flatten. |
| parent_key (str): The prefix to prepend to the keys of the flattened dict. |
| sep (str): The separator to use between the parent key and the key of the |
| flattened dictionary. |
| |
| Yields: |
| (str, any): A key-value pair from the flattened dictionary. |
| """ |
| for key, value in nested_dict.items(): |
| new_key = key |
| if isinstance(value, dict): |
| yield from _flatten_dict(value, new_key, sep) |
| else: |
| yield new_key, value |
|
|
|
|
| def flatten_dict( |
| nested_dict: Dict[str, Any], parent_key: str = "", sep: str = "_" |
| ) -> Dict[str, Any]: |
| """Flattens a nested dictionary into a flat dictionary. |
| |
| Parameters: |
| nested_dict (dict): The nested dictionary to flatten. |
| parent_key (str): The prefix to prepend to the keys of the flattened dict. |
| sep (str): The separator to use between the parent key and the key of the |
| flattened dictionary. |
| |
| Returns: |
| (dict): A flat dictionary. |
| |
| """ |
| flat_dict = {k: v for k, v in _flatten_dict(nested_dict, parent_key, sep)} |
| return flat_dict |
|
|
|
|
|
|
| async def log_event(info,name,config): |
| """Helper function that will run a dummy chain with the given info |
| The astream_event function will catch this chain and stream the dict info to the logger |
| """ |
| |
| chain = RunnablePassthrough().with_config(run_name=name) |
| _ = await chain.ainvoke(info,config) |