|
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) |