lionagi 0.0.111__py3-none-any.whl → 0.0.113__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lionagi/__init__.py +7 -2
- lionagi/bridge/__init__.py +7 -0
- lionagi/bridge/langchain.py +131 -0
- lionagi/bridge/llama_index.py +157 -0
- lionagi/configs/__init__.py +7 -0
- lionagi/configs/oai_configs.py +49 -0
- lionagi/configs/openrouter_config.py +49 -0
- lionagi/core/__init__.py +15 -0
- lionagi/{session/conversation.py → core/conversations.py} +10 -17
- lionagi/core/flows.py +1 -0
- lionagi/core/instruction_sets.py +1 -0
- lionagi/{session/message.py → core/messages.py} +5 -5
- lionagi/core/sessions.py +262 -0
- lionagi/datastore/__init__.py +1 -0
- lionagi/datastore/chroma.py +1 -0
- lionagi/datastore/deeplake.py +1 -0
- lionagi/datastore/elasticsearch.py +1 -0
- lionagi/datastore/lantern.py +1 -0
- lionagi/datastore/pinecone.py +1 -0
- lionagi/datastore/postgres.py +1 -0
- lionagi/datastore/qdrant.py +1 -0
- lionagi/loader/__init__.py +12 -0
- lionagi/loader/chunker.py +157 -0
- lionagi/loader/reader.py +124 -0
- lionagi/objs/__init__.py +7 -0
- lionagi/objs/messenger.py +163 -0
- lionagi/objs/tool_registry.py +247 -0
- lionagi/schema/__init__.py +11 -0
- lionagi/schema/base_condition.py +1 -0
- lionagi/schema/base_schema.py +239 -0
- lionagi/schema/base_tool.py +9 -0
- lionagi/schema/data_logger.py +94 -0
- lionagi/services/__init__.py +14 -0
- lionagi/services/anthropic.py +1 -0
- lionagi/services/anyscale.py +0 -0
- lionagi/services/azure.py +1 -0
- lionagi/{api/oai_service.py → services/base_api_service.py} +74 -148
- lionagi/services/bedrock.py +0 -0
- lionagi/services/chatcompletion.py +48 -0
- lionagi/services/everlyai.py +0 -0
- lionagi/services/gemini.py +0 -0
- lionagi/services/gpt4all.py +0 -0
- lionagi/services/huggingface.py +0 -0
- lionagi/services/litellm.py +1 -0
- lionagi/services/localai.py +0 -0
- lionagi/services/mistralai.py +0 -0
- lionagi/services/oai.py +34 -0
- lionagi/services/ollama.py +1 -0
- lionagi/services/openllm.py +0 -0
- lionagi/services/openrouter.py +32 -0
- lionagi/services/perplexity.py +0 -0
- lionagi/services/predibase.py +0 -0
- lionagi/services/rungpt.py +0 -0
- lionagi/services/service_objs.py +282 -0
- lionagi/services/vllm.py +0 -0
- lionagi/services/xinference.py +0 -0
- lionagi/structure/__init__.py +7 -0
- lionagi/structure/relationship.py +128 -0
- lionagi/structure/structure.py +160 -0
- lionagi/tests/__init__.py +0 -0
- lionagi/tests/test_flatten_util.py +426 -0
- lionagi/tools/__init__.py +0 -0
- lionagi/tools/coder.py +1 -0
- lionagi/tools/planner.py +1 -0
- lionagi/tools/prompter.py +1 -0
- lionagi/tools/sandbox.py +1 -0
- lionagi/tools/scorer.py +1 -0
- lionagi/tools/summarizer.py +1 -0
- lionagi/tools/validator.py +1 -0
- lionagi/utils/__init__.py +46 -8
- lionagi/utils/api_util.py +63 -416
- lionagi/utils/call_util.py +347 -0
- lionagi/utils/flat_util.py +540 -0
- lionagi/utils/io_util.py +102 -0
- lionagi/utils/load_utils.py +190 -0
- lionagi/utils/sys_util.py +85 -660
- lionagi/utils/tool_util.py +82 -199
- lionagi/utils/type_util.py +81 -0
- lionagi/version.py +1 -1
- {lionagi-0.0.111.dist-info → lionagi-0.0.113.dist-info}/METADATA +44 -15
- lionagi-0.0.113.dist-info/RECORD +84 -0
- lionagi/api/__init__.py +0 -8
- lionagi/api/oai_config.py +0 -16
- lionagi/session/__init__.py +0 -7
- lionagi/session/session.py +0 -380
- lionagi/utils/doc_util.py +0 -331
- lionagi/utils/log_util.py +0 -86
- lionagi-0.0.111.dist-info/RECORD +0 -20
- {lionagi-0.0.111.dist-info → lionagi-0.0.113.dist-info}/LICENSE +0 -0
- {lionagi-0.0.111.dist-info → lionagi-0.0.113.dist-info}/WHEEL +0 -0
- {lionagi-0.0.111.dist-info → lionagi-0.0.113.dist-info}/top_level.txt +0 -0
lionagi/__init__.py
CHANGED
@@ -16,9 +16,14 @@ Copyright 2023 HaiyangLi <ocean@lionagi.ai>
|
|
16
16
|
|
17
17
|
import logging
|
18
18
|
from .version import __version__
|
19
|
-
|
19
|
+
|
20
20
|
from .utils import *
|
21
|
-
from .
|
21
|
+
from .schema import *
|
22
|
+
from .structure import *
|
23
|
+
from .core import *
|
24
|
+
from .objs import *
|
25
|
+
# from .datastore import *
|
26
|
+
# from .structure import *
|
22
27
|
|
23
28
|
|
24
29
|
logger = logging.getLogger(__name__)
|
@@ -0,0 +1,131 @@
|
|
1
|
+
from typing import Union, Callable, List, Dict, Any
|
2
|
+
from ..schema.base_schema import T, DataNode
|
3
|
+
from ..utils.sys_util import change_dict_key
|
4
|
+
|
5
|
+
|
6
|
+
def from_langchain(lc_doc: Any) -> T:
|
7
|
+
"""
|
8
|
+
Converts a langchain document into a DataNode object.
|
9
|
+
|
10
|
+
Parameters:
|
11
|
+
lc_doc (Any): The langchain document to be converted.
|
12
|
+
|
13
|
+
Returns:
|
14
|
+
DataNode: A DataNode object created from the langchain document.
|
15
|
+
"""
|
16
|
+
info_json = lc_doc.to_json()
|
17
|
+
info_node = {'lc_id': info_json['id']}
|
18
|
+
info_node = {**info_node, **info_json['kwargs']}
|
19
|
+
return DataNode(**info_node)
|
20
|
+
|
21
|
+
def to_langchain_document(datanode: T, **kwargs: Any) -> Any:
|
22
|
+
"""
|
23
|
+
Converts a DataNode into a langchain Document.
|
24
|
+
|
25
|
+
Parameters:
|
26
|
+
datanode (DataNode): The DataNode to be converted.
|
27
|
+
|
28
|
+
**kwargs: Additional keyword arguments to be included in the Document.
|
29
|
+
|
30
|
+
Returns:
|
31
|
+
Any: A langchain Document created from the DataNode.
|
32
|
+
"""
|
33
|
+
from langchain.schema import Document
|
34
|
+
|
35
|
+
dnode = datanode.to_dict()
|
36
|
+
change_dict_key(dnode, old_key='content', new_key='page_content')
|
37
|
+
change_dict_key(dnode, old_key='lc_id', new_key='id_')
|
38
|
+
dnode = {**dnode, **kwargs}
|
39
|
+
return Document(**dnode)
|
40
|
+
|
41
|
+
def langchain_loader(loader: Union[str, Callable],
|
42
|
+
loader_args: List[Any] = [],
|
43
|
+
loader_kwargs: Dict[str, Any] = {}) -> Any:
|
44
|
+
"""
|
45
|
+
Loads data using a specified langchain loader.
|
46
|
+
|
47
|
+
Parameters:
|
48
|
+
loader (Union[str, Callable]): The name of the loader function or the loader function itself.
|
49
|
+
|
50
|
+
loader_args (List[Any]): Positional arguments to pass to the loader function.
|
51
|
+
|
52
|
+
loader_kwargs (Dict[str, Any]): Keyword arguments to pass to the loader function.
|
53
|
+
|
54
|
+
Returns:
|
55
|
+
Any: The data loaded by the loader function.
|
56
|
+
|
57
|
+
Raises:
|
58
|
+
ValueError: If the specified loader is invalid or if the loader fails to load data.
|
59
|
+
"""
|
60
|
+
import langchain.document_loaders as document_loaders
|
61
|
+
|
62
|
+
try:
|
63
|
+
if isinstance(loader, str):
|
64
|
+
loader = getattr(document_loaders, loader)
|
65
|
+
else:
|
66
|
+
loader = loader
|
67
|
+
except Exception as e:
|
68
|
+
raise ValueError(f'Invalid loader: {loader}. Error: {e}')
|
69
|
+
|
70
|
+
try:
|
71
|
+
loader_obj = loader(*loader_args, **loader_kwargs)
|
72
|
+
data = loader_obj.load()
|
73
|
+
return data
|
74
|
+
except Exception as e:
|
75
|
+
raise ValueError(f'Failed to load. Error: {e}')
|
76
|
+
|
77
|
+
def langchain_text_splitter(data: Union[str, List],
|
78
|
+
splitter: Union[str, Callable],
|
79
|
+
splitter_args: List[Any] = [],
|
80
|
+
splitter_kwargs: Dict[str, Any] = {}) -> List[str]:
|
81
|
+
|
82
|
+
import langchain.text_splitter as text_splitter
|
83
|
+
|
84
|
+
try:
|
85
|
+
if isinstance(splitter, str):
|
86
|
+
splitter = getattr(text_splitter, splitter)
|
87
|
+
else:
|
88
|
+
splitter = splitter
|
89
|
+
except Exception as e:
|
90
|
+
raise ValueError(f'Invalid text splitter: {splitter}. Error: {e}')
|
91
|
+
|
92
|
+
try:
|
93
|
+
splitter_obj = splitter(*splitter_args, **splitter_kwargs)
|
94
|
+
if isinstance(data, str):
|
95
|
+
chunk = splitter_obj.split_text(data)
|
96
|
+
else:
|
97
|
+
chunk = splitter_obj.split_documents(data)
|
98
|
+
return chunk
|
99
|
+
except Exception as e:
|
100
|
+
raise ValueError(f'Failed to split. Error: {e}')
|
101
|
+
|
102
|
+
# def langchain_code_splitter(doc: str,
|
103
|
+
# language: str,
|
104
|
+
# splitter_args: List[Any] = [],
|
105
|
+
# splitter_kwargs: Dict[str, Any] = {}) -> List[Any]:
|
106
|
+
# """
|
107
|
+
# Splits code into smaller chunks using a RecursiveCharacterTextSplitter specific to a language.
|
108
|
+
#
|
109
|
+
# Parameters:
|
110
|
+
# doc (str): The code document to be split.
|
111
|
+
# language (str): The programming language of the code.
|
112
|
+
# splitter_args (List[Any]): Positional arguments to pass to the splitter.
|
113
|
+
# splitter_kwargs (Dict[str, Any]): Keyword arguments to pass to the splitter.
|
114
|
+
#
|
115
|
+
# Returns:
|
116
|
+
# List[Any]: A list of Documents, each representing a chunk of the original code.
|
117
|
+
#
|
118
|
+
# Raises:
|
119
|
+
# ValueError: If the splitter fails to split the code document.
|
120
|
+
# """
|
121
|
+
# from langchain.text_splitter import RecursiveCharacterTextSplitter
|
122
|
+
#
|
123
|
+
# try:
|
124
|
+
# splitter = RecursiveCharacterTextSplitter.from_language(
|
125
|
+
# language=language, *splitter_args, **splitter_kwargs
|
126
|
+
# )
|
127
|
+
# docs = splitter.create_documents([doc])
|
128
|
+
# return docs
|
129
|
+
# except Exception as e:
|
130
|
+
# raise ValueError(f'Failed to split. Error: {e}')
|
131
|
+
#
|
@@ -0,0 +1,157 @@
|
|
1
|
+
from typing import Union, Callable, List, Any, Dict
|
2
|
+
from ..schema.base_schema import DataNode, T
|
3
|
+
from ..utils.sys_util import change_dict_key
|
4
|
+
|
5
|
+
|
6
|
+
def from_llama_index(llama_node: Any, **kwargs: Any) -> T:
|
7
|
+
"""
|
8
|
+
Converts a Llama Index node into a DataNode object.
|
9
|
+
|
10
|
+
Parameters:
|
11
|
+
llama_node (Any): The Llama Index node to be converted.
|
12
|
+
|
13
|
+
**kwargs: Additional keyword arguments for JSON serialization.
|
14
|
+
|
15
|
+
Returns:
|
16
|
+
DataNode: A DataNode object created from the Llama Index node.
|
17
|
+
"""
|
18
|
+
llama_dict = llama_node.to_dict(**kwargs)
|
19
|
+
return DataNode.from_dict(llama_dict)
|
20
|
+
|
21
|
+
def to_llama_index_textnode(datanode: T, **kwargs: Any) -> Any:
|
22
|
+
"""
|
23
|
+
Converts a DataNode into a Llama Index TextNode.
|
24
|
+
|
25
|
+
Parameters:
|
26
|
+
datanode (DataNode): The DataNode to be converted.
|
27
|
+
|
28
|
+
**kwargs: Additional keyword arguments to be included in the TextNode.
|
29
|
+
|
30
|
+
Returns:
|
31
|
+
TextNode: A Llama Index TextNode created from the DataNode.
|
32
|
+
"""
|
33
|
+
# to llama_index textnode
|
34
|
+
from llama_index.schema import TextNode
|
35
|
+
|
36
|
+
dnode = datanode.to_dict()
|
37
|
+
change_dict_key(dnode, old_key='content', new_key='text')
|
38
|
+
change_dict_key(dnode, old_key='node_id', new_key='id_')
|
39
|
+
|
40
|
+
dnode = {**dnode, **kwargs}
|
41
|
+
return TextNode.from_dict(dnode)
|
42
|
+
|
43
|
+
def get_llama_reader(reader: Union[str, Callable]) -> Callable:
|
44
|
+
"""
|
45
|
+
Gets a Llama Index reader function.
|
46
|
+
|
47
|
+
Parameters:
|
48
|
+
reader (Union[str, Callable]): The name of the reader function or the reader function itself.
|
49
|
+
|
50
|
+
Returns:
|
51
|
+
Callable: The Llama Index reader function.
|
52
|
+
|
53
|
+
Raises:
|
54
|
+
ValueError: If the specified reader is invalid.
|
55
|
+
"""
|
56
|
+
try:
|
57
|
+
if isinstance(reader, str):
|
58
|
+
if reader == 'SimpleDirectoryReader':
|
59
|
+
from llama_index import SimpleDirectoryReader
|
60
|
+
return SimpleDirectoryReader
|
61
|
+
else:
|
62
|
+
from llama_index import download_loader
|
63
|
+
return download_loader(reader)
|
64
|
+
else:
|
65
|
+
return reader
|
66
|
+
except Exception as e:
|
67
|
+
raise ValueError(f'Invalid reader: {reader}, Error: {e}')
|
68
|
+
|
69
|
+
def llama_index_reader(reader: Union[str, Callable],
|
70
|
+
reader_args: List[Any] = [],
|
71
|
+
reader_kwargs: Dict[str, Any] = {},
|
72
|
+
load_data_args: List[Any] = [],
|
73
|
+
load_data_kwargs: Dict[str, Any] = {}) -> List[Any]:
|
74
|
+
"""
|
75
|
+
Loads documents using a specified Llama Index reader.
|
76
|
+
|
77
|
+
Parameters:
|
78
|
+
reader (Union[str, Callable]): The name of the reader function or the reader function itself.
|
79
|
+
|
80
|
+
reader_args (List[Any]): Positional arguments to pass to the reader function.
|
81
|
+
|
82
|
+
reader_kwargs (Dict[str, Any]): Keyword arguments to pass to the reader function.
|
83
|
+
|
84
|
+
load_data_args (List[Any]): Positional arguments for the load_data method.
|
85
|
+
|
86
|
+
load_data_kwargs (Dict[str, Any]): Keyword arguments for the load_data method.
|
87
|
+
|
88
|
+
Returns:
|
89
|
+
List[Any]: A list of documents loaded by the reader.
|
90
|
+
|
91
|
+
Raises:
|
92
|
+
ValueError: If the specified reader is invalid or if the reader fails to load documents.
|
93
|
+
"""
|
94
|
+
reader = get_llama_reader(reader)
|
95
|
+
|
96
|
+
try:
|
97
|
+
loader = reader(*reader_args, **reader_kwargs)
|
98
|
+
documents = loader.load_data(*load_data_args, **load_data_kwargs)
|
99
|
+
return documents
|
100
|
+
|
101
|
+
except Exception as e:
|
102
|
+
raise ValueError(f'Failed to read. Error: {e}')
|
103
|
+
|
104
|
+
def get_llama_parser(parser: Union[str, Callable]) -> Callable:
|
105
|
+
import llama_index.node_parser as node_parser
|
106
|
+
import llama_index.text_splitter as text_splitter
|
107
|
+
|
108
|
+
try:
|
109
|
+
return getattr(node_parser, parser)
|
110
|
+
except Exception as e1:
|
111
|
+
try:
|
112
|
+
if isinstance(parser, str):
|
113
|
+
return getattr(text_splitter, parser)
|
114
|
+
else:
|
115
|
+
return parser
|
116
|
+
except Exception as e2:
|
117
|
+
raise ValueError(f'Invalid node parser: {parser}. Error: {e1}, {e2}')
|
118
|
+
|
119
|
+
|
120
|
+
def llama_index_node_parser(documents: List[Any],
|
121
|
+
parser: Union[str, Callable],
|
122
|
+
parser_args: List[Any] = [],
|
123
|
+
parser_kwargs: Dict[str, Any] = {},
|
124
|
+
parsing_kwargs: Dict[str, Any] = {}) -> List[Any]:
|
125
|
+
"""
|
126
|
+
Parses documents into nodes using a specified Llama Index node parser.
|
127
|
+
|
128
|
+
Parameters:
|
129
|
+
documents (List[Any]): The documents to parse.
|
130
|
+
|
131
|
+
parser (Union[str, Callable]): The name of the parser function or the parser function itself.
|
132
|
+
|
133
|
+
parser_args (List[Any]): Positional arguments to pass to the parser function.
|
134
|
+
|
135
|
+
parser_kwargs (Dict[str, Any]): Keyword arguments to pass to the parser function.
|
136
|
+
|
137
|
+
Returns:
|
138
|
+
List[Any]: A list of nodes parsed from the documents.
|
139
|
+
|
140
|
+
Raises:
|
141
|
+
ValueError: If the specified parser is invalid or if the parser fails to parse the documents.
|
142
|
+
"""
|
143
|
+
parser = get_llama_parser(parser)
|
144
|
+
|
145
|
+
try:
|
146
|
+
parser_obj = parser(*parser_args, **parser_kwargs)
|
147
|
+
nodes = parser_obj.get_nodes_from_documents(documents, **parsing_kwargs)
|
148
|
+
return nodes
|
149
|
+
|
150
|
+
except Exception as e1:
|
151
|
+
try:
|
152
|
+
parser_obj = parser.from_defaults(*parser_args, **parser_kwargs)
|
153
|
+
nodes = parser_obj.get_nodes_from_documents(documents, **parsing_kwargs)
|
154
|
+
return nodes
|
155
|
+
except Exception as e2:
|
156
|
+
raise ValueError(f'Failed to parse. Error: {e1}, {e2}')
|
157
|
+
|
@@ -0,0 +1,49 @@
|
|
1
|
+
oai_chat_llmconfig = {
|
2
|
+
"model": "gpt-4-1106-preview",
|
3
|
+
"frequency_penalty": 0,
|
4
|
+
"max_tokens": None,
|
5
|
+
"n": 1,
|
6
|
+
"presence_penalty": 0,
|
7
|
+
"response_format": {"type": "text"},
|
8
|
+
"seed": None,
|
9
|
+
"stop": None,
|
10
|
+
"stream": False,
|
11
|
+
"temperature": 0.7,
|
12
|
+
"top_p": 1,
|
13
|
+
"tools": None,
|
14
|
+
"tool_choice": "none",
|
15
|
+
"user": None
|
16
|
+
}
|
17
|
+
|
18
|
+
oai_chat_schema = {
|
19
|
+
"required" : ["model", "frequency_penalty", "n", "presence_penalty", "response_format", "temperature", "top_p"],
|
20
|
+
"optional": ["seed", "stop", "stream", "tools", "tool_choice", "user", "max_tokens"],
|
21
|
+
"input": "messages",
|
22
|
+
"config": oai_chat_llmconfig
|
23
|
+
}
|
24
|
+
|
25
|
+
oai_finetune_llmconfig = {
|
26
|
+
"model": "gpt-3.5-turbo",
|
27
|
+
"hyperparameters": {
|
28
|
+
"batch_size": "auto",
|
29
|
+
"learning_rate_multiplier": "auto",
|
30
|
+
"n_epochs": "auto"
|
31
|
+
},
|
32
|
+
"suffix": None,
|
33
|
+
"training_file": None,
|
34
|
+
}
|
35
|
+
|
36
|
+
oai_finetune_schema = {
|
37
|
+
"required" : ["model", "training_file"],
|
38
|
+
"optional": ["hyperparameters", "suffix", "validate_file"],
|
39
|
+
"input": ["training_file"],
|
40
|
+
"config": oai_finetune_llmconfig
|
41
|
+
}
|
42
|
+
|
43
|
+
|
44
|
+
oai_schema = {
|
45
|
+
|
46
|
+
"chat": oai_chat_schema,
|
47
|
+
"finetune": oai_finetune_schema
|
48
|
+
|
49
|
+
}
|
@@ -0,0 +1,49 @@
|
|
1
|
+
openrouter_chat_llmconfig = {
|
2
|
+
"model": "gpt-4-1106-preview",
|
3
|
+
"frequency_penalty": 0,
|
4
|
+
"max_tokens": None,
|
5
|
+
"n": 1,
|
6
|
+
"presence_penalty": 0,
|
7
|
+
"response_format": {"type": "text"},
|
8
|
+
"seed": None,
|
9
|
+
"stop": None,
|
10
|
+
"stream": False,
|
11
|
+
"temperature": 0.7,
|
12
|
+
"top_p": 1,
|
13
|
+
"tools": None,
|
14
|
+
"tool_choice": "none",
|
15
|
+
"user": None
|
16
|
+
}
|
17
|
+
|
18
|
+
openrouter_chat_schema = {
|
19
|
+
"required" : ["model", "frequency_penalty", "n", "presence_penalty", "response_format", "temperature", "top_p"],
|
20
|
+
"optional": ["seed", "stop", "stream", "tools", "tool_choice", "user", "max_tokens"],
|
21
|
+
"input": "messages",
|
22
|
+
"config": openrouter_chat_llmconfig
|
23
|
+
}
|
24
|
+
|
25
|
+
openrouter_finetune_llmconfig = {
|
26
|
+
"model": "gpt-3.5-turbo",
|
27
|
+
"hyperparameters": {
|
28
|
+
"batch_size": "auto",
|
29
|
+
"learning_rate_multiplier": "auto",
|
30
|
+
"n_epochs": "auto"
|
31
|
+
},
|
32
|
+
"suffix": None,
|
33
|
+
"training_file": None,
|
34
|
+
}
|
35
|
+
|
36
|
+
openrouter_finetune_schema = {
|
37
|
+
"required" : ["model", "training_file"],
|
38
|
+
"optional": ["hyperparameters", "suffix", "validate_file"],
|
39
|
+
"input": ["training_file"],
|
40
|
+
"config": openrouter_finetune_llmconfig
|
41
|
+
}
|
42
|
+
|
43
|
+
|
44
|
+
openrouter_schema = {
|
45
|
+
|
46
|
+
"chat": openrouter_chat_schema,
|
47
|
+
"finetune": openrouter_finetune_schema
|
48
|
+
|
49
|
+
}
|
lionagi/core/__init__.py
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# from .messages import Response, Instruction, System
|
2
|
+
from .conversations import Conversation
|
3
|
+
from .sessions import Session
|
4
|
+
|
5
|
+
# from .instruction_sets import InstructionSet
|
6
|
+
# from .flows.flow import Flow
|
7
|
+
|
8
|
+
|
9
|
+
__all__ = [
|
10
|
+
# "Response",
|
11
|
+
# "Instruction",
|
12
|
+
# "System",
|
13
|
+
"Conversation",
|
14
|
+
"Session", #"Flow", "InstructionSet"
|
15
|
+
]
|
@@ -1,4 +1,4 @@
|
|
1
|
-
from .
|
1
|
+
from .messages import Message
|
2
2
|
|
3
3
|
|
4
4
|
class Conversation:
|
@@ -9,22 +9,21 @@ class Conversation:
|
|
9
9
|
user instructions, and assistant responses.
|
10
10
|
|
11
11
|
Attributes:
|
12
|
-
response_counts (int):
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
msg (Message):
|
17
|
-
An instance of the Message class for creating messages.
|
18
|
-
responses (list):
|
19
|
-
A list to store assistant responses in the conversation.
|
12
|
+
response_counts (int): The count of assistant responses in the conversation.
|
13
|
+
messages (list): A list to store messages in the conversation.
|
14
|
+
msg (Message): An instance of the Message class for creating messages.
|
15
|
+
responses (list): A list to store assistant responses in the conversation.
|
20
16
|
|
21
17
|
Methods:
|
22
18
|
initiate_conversation(system, instruction, context=None, name=None):
|
23
19
|
Initiate a conversation with a system setting and user instruction.
|
20
|
+
|
24
21
|
add_messages(system, instruction, context=None, response=None, tool=None, name=None):
|
25
22
|
Add messages to the conversation, including system setting, user instruction, and assistant response.
|
23
|
+
|
26
24
|
change_system(system):
|
27
25
|
Change the system setting in the conversation.
|
26
|
+
|
28
27
|
keep_last_n_exchanges(n: int):
|
29
28
|
Keep the last n exchanges in the conversation.
|
30
29
|
"""
|
@@ -48,11 +47,8 @@ class Conversation:
|
|
48
47
|
|
49
48
|
Parameters:
|
50
49
|
system (str): The system setting for the conversation.
|
51
|
-
|
52
50
|
instruction (str): The user instruction to initiate the conversation.
|
53
|
-
|
54
51
|
context (dict): Additional context for the conversation. Default is None.
|
55
|
-
|
56
52
|
name (str): The name associated with the user. Default is None.
|
57
53
|
"""
|
58
54
|
self.messages, self.responses = [], []
|
@@ -66,13 +62,10 @@ class Conversation:
|
|
66
62
|
|
67
63
|
Parameters:
|
68
64
|
system (str): The system setting for the message. Default is None.
|
69
|
-
|
70
65
|
instruction (str): The instruction content for the message. Default is None.
|
71
|
-
|
72
66
|
context (dict): Additional context for the message. Default is None.
|
73
|
-
|
74
67
|
response (dict): The response content for the message. Default is None.
|
75
|
-
|
68
|
+
tool (dict): The tool information for the message. Default is None.
|
76
69
|
name (str): The name associated with the message. Default is None.
|
77
70
|
"""
|
78
71
|
msg = self.msg(system=system, instruction=instruction, context=context,
|
@@ -101,5 +94,5 @@ class Conversation:
|
|
101
94
|
]
|
102
95
|
if len(response_indices) >= n:
|
103
96
|
first_index_to_keep = response_indices[-n] + 1
|
104
|
-
self.messages = self.
|
97
|
+
self.messages = [self.system] + self.messages[first_index_to_keep:]
|
105
98
|
|
lionagi/core/flows.py
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# represents structured sessions
|
@@ -0,0 +1 @@
|
|
1
|
+
# dynamically structured preconfigured instructions
|
@@ -1,7 +1,7 @@
|
|
1
1
|
from datetime import datetime
|
2
2
|
import json
|
3
|
-
from ..utils
|
4
|
-
from ..
|
3
|
+
from ..utils import create_id, lcall
|
4
|
+
from ..schema import DataLogger
|
5
5
|
|
6
6
|
|
7
7
|
class Message:
|
@@ -61,7 +61,7 @@ class Message:
|
|
61
61
|
|
62
62
|
name (str): The name associated with the message. Default is None.
|
63
63
|
"""
|
64
|
-
if sum(
|
64
|
+
if sum(lcall([system, instruction, response], bool)) > 1:
|
65
65
|
raise ValueError("Error: Message cannot have more than one role.")
|
66
66
|
|
67
67
|
else:
|
@@ -145,7 +145,7 @@ class Message:
|
|
145
145
|
context=context, response=response, name=name)
|
146
146
|
return self.to_json()
|
147
147
|
|
148
|
-
def to_csv(self,
|
148
|
+
def to_csv(self, filename=None,dir=None, verbose=True, timestamp=True, dir_exist_ok=True, file_exist_ok=False):
|
149
149
|
"""
|
150
150
|
Save the message to a CSV file.
|
151
151
|
|
@@ -162,5 +162,5 @@ class Message:
|
|
162
162
|
|
163
163
|
file_exist_ok (bool): Whether to allow the file to exist. Default is False.
|
164
164
|
"""
|
165
|
-
self._logger.to_csv(dir,
|
165
|
+
self._logger.to_csv(filename,dir=dir, verbose=verbose, timestamp=timestamp, dir_exist_ok=dir_exist_ok, file_exist_ok=file_exist_ok)
|
166
166
|
|