aiagents4pharma 1.8.3__py3-none-any.whl → 1.9.0__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.
- aiagents4pharma/configs/talk2biomodels/agents/t2b_agent/default.yaml +3 -1
- aiagents4pharma/talk2biomodels/__init__.py +1 -1
- aiagents4pharma/talk2biomodels/states/state_talk2biomodels.py +1 -1
- aiagents4pharma/talk2biomodels/tests/test_langgraph.py +71 -20
- aiagents4pharma/talk2biomodels/tools/ask_question.py +16 -7
- aiagents4pharma/talk2biomodels/tools/custom_plotter.py +20 -14
- aiagents4pharma/talk2biomodels/tools/get_modelinfo.py +6 -6
- aiagents4pharma/talk2biomodels/tools/simulate_model.py +26 -12
- {aiagents4pharma-1.8.3.dist-info → aiagents4pharma-1.9.0.dist-info}/METADATA +1 -1
- {aiagents4pharma-1.8.3.dist-info → aiagents4pharma-1.9.0.dist-info}/RECORD +13 -13
- {aiagents4pharma-1.8.3.dist-info → aiagents4pharma-1.9.0.dist-info}/LICENSE +0 -0
- {aiagents4pharma-1.8.3.dist-info → aiagents4pharma-1.9.0.dist-info}/WHEEL +0 -0
- {aiagents4pharma-1.8.3.dist-info → aiagents4pharma-1.9.0.dist-info}/top_level.txt +0 -0
@@ -20,5 +20,5 @@ class Talk2Biomodels(AgentState):
|
|
20
20
|
# the operator for the sbml_file_path field.
|
21
21
|
# https://langchain-ai.github.io/langgraph/troubleshooting/errors/INVALID_CONCURRENT_GRAPH_UPDATE/
|
22
22
|
sbml_file_path: Annotated[list, operator.add]
|
23
|
-
dic_simulated_data: dict
|
23
|
+
dic_simulated_data: Annotated[list[dict], operator.add]
|
24
24
|
llm_model: str
|
@@ -1,7 +1,8 @@
|
|
1
1
|
'''
|
2
|
-
Test cases
|
2
|
+
Test cases for Talk2Biomodels.
|
3
3
|
'''
|
4
4
|
|
5
|
+
import pandas as pd
|
5
6
|
from langchain_core.messages import HumanMessage, ToolMessage
|
6
7
|
from ..agents.t2b_agent import get_app
|
7
8
|
|
@@ -13,7 +14,8 @@ def test_get_modelinfo_tool():
|
|
13
14
|
app = get_app(unique_id)
|
14
15
|
config = {"configurable": {"thread_id": unique_id}}
|
15
16
|
# Update state
|
16
|
-
app.update_state(config,
|
17
|
+
app.update_state(config,
|
18
|
+
{"sbml_file_path": ["aiagents4pharma/talk2biomodels/tests/BIOMD0000000449_url.xml"]})
|
17
19
|
prompt = "Extract all relevant information from the uploaded model."
|
18
20
|
# Test the tool get_modelinfo
|
19
21
|
response = app.invoke(
|
@@ -56,26 +58,70 @@ def test_ask_question_tool():
|
|
56
58
|
|
57
59
|
##########################################
|
58
60
|
# Test ask_question tool when simulation
|
59
|
-
# results are not available
|
61
|
+
# results are not available i.e. the
|
62
|
+
# simulation has not been run. In this
|
63
|
+
# case, the tool should return an error
|
60
64
|
##########################################
|
61
65
|
# Update state
|
62
66
|
app.update_state(config, {"llm_model": "gpt-4o-mini"})
|
67
|
+
# Define the prompt
|
63
68
|
prompt = "Call the ask_question tool to answer the "
|
64
69
|
prompt += "question: What is the concentration of CRP "
|
65
|
-
prompt += "in serum at 1000 hours?"
|
66
|
-
|
67
|
-
#
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
#
|
74
|
-
|
70
|
+
prompt += "in serum at 1000 hours? The simulation name "
|
71
|
+
prompt += "is `simulation_name`."
|
72
|
+
# Invoke the tool
|
73
|
+
app.invoke(
|
74
|
+
{"messages": [HumanMessage(content=prompt)]},
|
75
|
+
config=config
|
76
|
+
)
|
77
|
+
# Get the messages from the current state
|
78
|
+
# and reverse the order
|
79
|
+
current_state = app.get_state(config)
|
80
|
+
reversed_messages = current_state.values["messages"][::-1]
|
81
|
+
# Loop through the reversed messages until a
|
82
|
+
# ToolMessage is found.
|
83
|
+
for msg in reversed_messages:
|
84
|
+
# Assert that the message is a ToolMessage
|
85
|
+
# and its status is "error"
|
86
|
+
if isinstance(msg, ToolMessage):
|
87
|
+
assert msg.status == "error"
|
75
88
|
|
76
89
|
def test_simulate_model_tool():
|
77
90
|
'''
|
78
|
-
Test the simulate_model tool
|
91
|
+
Test the simulate_model tool when simulating
|
92
|
+
multiple models.
|
93
|
+
'''
|
94
|
+
unique_id = 123
|
95
|
+
app = get_app(unique_id)
|
96
|
+
config = {"configurable": {"thread_id": unique_id}}
|
97
|
+
app.update_state(config, {"llm_model": "gpt-4o-mini"})
|
98
|
+
# Upload a model to the state
|
99
|
+
app.update_state(config,
|
100
|
+
{"sbml_file_path": ["aiagents4pharma/talk2biomodels/tests/BIOMD0000000449_url.xml"]})
|
101
|
+
prompt = "Simulate models 64 and the uploaded model"
|
102
|
+
# Invoke the agent
|
103
|
+
app.invoke(
|
104
|
+
{"messages": [HumanMessage(content=prompt)]},
|
105
|
+
config=config
|
106
|
+
)
|
107
|
+
current_state = app.get_state(config)
|
108
|
+
dic_simulated_data = current_state.values["dic_simulated_data"]
|
109
|
+
# Check if the dic_simulated_data is a list
|
110
|
+
assert isinstance(dic_simulated_data, list)
|
111
|
+
# Check if the length of the dic_simulated_data is 2
|
112
|
+
assert len(dic_simulated_data) == 2
|
113
|
+
# Check if the source of the first model is 64
|
114
|
+
assert dic_simulated_data[0]['source'] == 64
|
115
|
+
# Check if the source of the second model is upload
|
116
|
+
assert dic_simulated_data[1]['source'] == "upload"
|
117
|
+
# Check if the data of the first model contains
|
118
|
+
assert '1,3-bisphosphoglycerate' in dic_simulated_data[0]['data']
|
119
|
+
# Check if the data of the second model contains
|
120
|
+
assert 'mTORC2' in dic_simulated_data[1]['data']
|
121
|
+
|
122
|
+
def test_integration():
|
123
|
+
'''
|
124
|
+
Test the integration of the tools.
|
79
125
|
'''
|
80
126
|
unique_id = 123
|
81
127
|
app = get_app(unique_id)
|
@@ -138,9 +184,9 @@ def test_simulate_model_tool():
|
|
138
184
|
reversed_messages = current_state.values["messages"][::-1]
|
139
185
|
# Loop through the reversed messages
|
140
186
|
# until a ToolMessage is found.
|
141
|
-
|
142
|
-
|
143
|
-
|
187
|
+
expected_header = ['Time', 'CRP[serum]', 'CRPExtracellular']
|
188
|
+
expected_header += ['CRP Suppression (%)', 'CRP (% of baseline)']
|
189
|
+
expected_header += ['CRP[liver]']
|
144
190
|
predicted_artifact = []
|
145
191
|
for msg in reversed_messages:
|
146
192
|
if isinstance(msg, ToolMessage):
|
@@ -150,9 +196,14 @@ def test_simulate_model_tool():
|
|
150
196
|
if msg.name == "custom_plotter":
|
151
197
|
predicted_artifact = msg.artifact
|
152
198
|
break
|
153
|
-
#
|
154
|
-
#
|
155
|
-
|
199
|
+
# Convert the artifact into a pandas dataframe
|
200
|
+
# for easy comparison
|
201
|
+
df = pd.DataFrame(predicted_artifact)
|
202
|
+
# Extract the headers from the dataframe
|
203
|
+
predicted_header = df.columns.tolist()
|
204
|
+
# Check if the header is in the expected_header
|
205
|
+
# assert expected_header in predicted_artifact
|
206
|
+
assert set(expected_header).issubset(set(predicted_header))
|
156
207
|
##########################################
|
157
208
|
# Test custom_plotter tool when the
|
158
209
|
# simulation results are available but
|
@@ -23,6 +23,8 @@ class AskQuestionInput(BaseModel):
|
|
23
23
|
Input schema for the AskQuestion tool.
|
24
24
|
"""
|
25
25
|
question: str = Field(description="question about the simulation results")
|
26
|
+
simulation_name: str = Field(description="""Name assigned to the simulation
|
27
|
+
when the tool simulate_model was invoked.""")
|
26
28
|
state: Annotated[dict, InjectedState]
|
27
29
|
|
28
30
|
# Note: It's important that every field has type hints.
|
@@ -39,6 +41,7 @@ class AskQuestionTool(BaseTool):
|
|
39
41
|
|
40
42
|
def _run(self,
|
41
43
|
question: str,
|
44
|
+
simulation_name: str,
|
42
45
|
state: Annotated[dict, InjectedState]) -> str:
|
43
46
|
"""
|
44
47
|
Run the tool.
|
@@ -46,18 +49,24 @@ class AskQuestionTool(BaseTool):
|
|
46
49
|
Args:
|
47
50
|
question (str): The question to ask about the simulation results.
|
48
51
|
state (dict): The state of the graph.
|
49
|
-
|
52
|
+
simulation_name (str): The name assigned to the simulation.
|
50
53
|
|
51
54
|
Returns:
|
52
55
|
str: The answer to the question.
|
53
56
|
"""
|
54
57
|
logger.log(logging.INFO,
|
55
|
-
"Calling ask_question tool %s", question)
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
58
|
+
"Calling ask_question tool %s, %s", question, simulation_name)
|
59
|
+
dic_simulated_data = {}
|
60
|
+
for data in state["dic_simulated_data"]:
|
61
|
+
for key in data:
|
62
|
+
if key not in dic_simulated_data:
|
63
|
+
dic_simulated_data[key] = []
|
64
|
+
dic_simulated_data[key] += [data[key]]
|
65
|
+
# print (dic_simulated_data)
|
66
|
+
df_simulated_data = pd.DataFrame.from_dict(dic_simulated_data)
|
67
|
+
df = pd.DataFrame(
|
68
|
+
df_simulated_data[df_simulated_data['name'] == simulation_name]['data'].iloc[0]
|
69
|
+
)
|
61
70
|
prompt_content = None
|
62
71
|
# if run_manager and 'prompt' in run_manager.metadata:
|
63
72
|
# prompt_content = run_manager.metadata['prompt']
|
@@ -6,14 +6,11 @@ Tool for plotting a custom figure.
|
|
6
6
|
|
7
7
|
import logging
|
8
8
|
from typing import Type, List, TypedDict, Annotated, Tuple, Union, Literal
|
9
|
-
from typing import Type, List, TypedDict, Annotated, Tuple, Union, Literal
|
10
9
|
from pydantic import BaseModel, Field
|
11
10
|
import pandas as pd
|
12
|
-
import pandas as pd
|
13
11
|
from langchain_openai import ChatOpenAI
|
14
12
|
from langchain_core.tools import BaseTool
|
15
13
|
from langgraph.prebuilt import InjectedState
|
16
|
-
from langgraph.prebuilt import InjectedState
|
17
14
|
|
18
15
|
# Initialize logger
|
19
16
|
logging.basicConfig(level=logging.INFO)
|
@@ -24,7 +21,7 @@ class CustomPlotterInput(BaseModel):
|
|
24
21
|
Input schema for the PlotImage tool.
|
25
22
|
"""
|
26
23
|
question: str = Field(description="Description of the plot")
|
27
|
-
|
24
|
+
simulation_name: str = Field(description="Name assigned to the simulation")
|
28
25
|
state: Annotated[dict, InjectedState]
|
29
26
|
|
30
27
|
# Note: It's important that every field has type hints.
|
@@ -41,10 +38,10 @@ class CustomPlotterTool(BaseTool):
|
|
41
38
|
description: str = "A tool to make custom plots of the simulation results"
|
42
39
|
args_schema: Type[BaseModel] = CustomPlotterInput
|
43
40
|
response_format: str = "content_and_artifact"
|
44
|
-
response_format: str = "content_and_artifact"
|
45
41
|
|
46
42
|
def _run(self,
|
47
43
|
question: str,
|
44
|
+
simulation_name: str,
|
48
45
|
state: Annotated[dict, InjectedState]
|
49
46
|
) -> Tuple[str, Union[None, List[str]]]:
|
50
47
|
"""
|
@@ -53,17 +50,24 @@ class CustomPlotterTool(BaseTool):
|
|
53
50
|
Args:
|
54
51
|
question (str): The question about the custom plot.
|
55
52
|
state (dict): The state of the graph.
|
56
|
-
question (str): The question about the custom plot.
|
57
|
-
state (dict): The state of the graph.
|
58
53
|
|
59
54
|
Returns:
|
60
55
|
str: The answer to the question
|
61
56
|
"""
|
62
57
|
logger.log(logging.INFO, "Calling custom_plotter tool %s", question)
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
58
|
+
dic_simulated_data = {}
|
59
|
+
for data in state["dic_simulated_data"]:
|
60
|
+
for key in data:
|
61
|
+
if key not in dic_simulated_data:
|
62
|
+
dic_simulated_data[key] = []
|
63
|
+
dic_simulated_data[key] += [data[key]]
|
64
|
+
# Create a pandas dataframe from the dictionary
|
65
|
+
df = pd.DataFrame.from_dict(dic_simulated_data)
|
66
|
+
# Get the simulated data for the current tool call
|
67
|
+
df = pd.DataFrame(
|
68
|
+
df[df['name'] == simulation_name]['data'].iloc[0]
|
69
|
+
)
|
70
|
+
# df = pd.DataFrame.from_dict(state['dic_simulated_data'])
|
67
71
|
species_names = df.columns.tolist()
|
68
72
|
# Exclude the time column
|
69
73
|
species_names.remove('Time')
|
@@ -76,7 +80,8 @@ class CustomPlotterTool(BaseTool):
|
|
76
80
|
A list of species based on user question.
|
77
81
|
"""
|
78
82
|
relevant_species: Union[None, List[Literal[*species_names]]] = Field(
|
79
|
-
description="List of species based on user question.
|
83
|
+
description="""List of species based on user question.
|
84
|
+
If no relevant species are found, it will be None.""")
|
80
85
|
# Create an instance of the LLM model
|
81
86
|
llm = ChatOpenAI(model=state['llm_model'], temperature=0)
|
82
87
|
llm_with_structured_output = llm.with_structured_output(CustomHeader)
|
@@ -90,5 +95,6 @@ class CustomPlotterTool(BaseTool):
|
|
90
95
|
logger.info("Extracted species: %s", extracted_species)
|
91
96
|
if len(extracted_species) == 0:
|
92
97
|
return "No species found in the simulation results that matches the user prompt.", None
|
93
|
-
|
94
|
-
|
98
|
+
# Include the time column
|
99
|
+
extracted_species.insert(0, 'Time')
|
100
|
+
return f"Custom plot {simulation_name}", df[extracted_species].to_dict(orient='records')
|
@@ -25,12 +25,12 @@ class RequestedModelInfo:
|
|
25
25
|
"""
|
26
26
|
Dataclass for storing the requested model information.
|
27
27
|
"""
|
28
|
-
species: bool = Field(description="Get species from the model.")
|
29
|
-
parameters: bool = Field(description="Get parameters from the model.")
|
30
|
-
compartments: bool = Field(description="Get compartments from the model.")
|
31
|
-
units: bool = Field(description="Get units from the model.")
|
32
|
-
description: bool = Field(description="Get description from the model.")
|
33
|
-
name: bool = Field(description="Get name from the model.")
|
28
|
+
species: bool = Field(description="Get species from the model.", default=False)
|
29
|
+
parameters: bool = Field(description="Get parameters from the model.", default=False)
|
30
|
+
compartments: bool = Field(description="Get compartments from the model.", default=False)
|
31
|
+
units: bool = Field(description="Get units from the model.", default=False)
|
32
|
+
description: bool = Field(description="Get description from the model.", default=False)
|
33
|
+
name: bool = Field(description="Get name from the model.", default=False)
|
34
34
|
|
35
35
|
class GetModelInfoInput(BaseModel):
|
36
36
|
"""
|
@@ -52,10 +52,10 @@ class TimeSpeciesNameConcentration:
|
|
52
52
|
class RecurringData:
|
53
53
|
"""
|
54
54
|
Dataclass for storing the species and time data
|
55
|
-
on
|
55
|
+
on reocurring basis.
|
56
56
|
"""
|
57
57
|
data: List[TimeSpeciesNameConcentration] = Field(
|
58
|
-
description="species and time data on
|
58
|
+
description="species and time data on reocurring basis",
|
59
59
|
default=None)
|
60
60
|
|
61
61
|
@dataclass
|
@@ -68,12 +68,15 @@ class ArgumentData:
|
|
68
68
|
description="species name and initial concentration data",
|
69
69
|
default=None)
|
70
70
|
recurring_data: RecurringData = Field(
|
71
|
-
description="species and time data on
|
71
|
+
description="species and time data on reocurring basis",
|
72
72
|
default=None)
|
73
|
+
simulation_name: str = Field(
|
74
|
+
description="""An AI assigned `_` separated name of
|
75
|
+
the simulation based on human query""")
|
73
76
|
|
74
77
|
def add_rec_events(model_object, recurring_data):
|
75
78
|
"""
|
76
|
-
Add
|
79
|
+
Add reocurring events to the model.
|
77
80
|
"""
|
78
81
|
for row in recurring_data.data:
|
79
82
|
tp, sn, sc = row.time, row.species_name, row.species_concentration
|
@@ -86,9 +89,12 @@ class SimulateModelInput(BaseModel):
|
|
86
89
|
"""
|
87
90
|
Input schema for the SimulateModel tool.
|
88
91
|
"""
|
89
|
-
sys_bio_model: ModelData = Field(description="model data",
|
90
|
-
|
91
|
-
|
92
|
+
sys_bio_model: ModelData = Field(description="model data",
|
93
|
+
default=None)
|
94
|
+
arg_data: ArgumentData = Field(description=
|
95
|
+
"""time, species, and reocurring data
|
96
|
+
as well as the simulation name""",
|
97
|
+
default=None)
|
92
98
|
tool_call_id: Annotated[str, InjectedToolCallId]
|
93
99
|
state: Annotated[dict, InjectedState]
|
94
100
|
|
@@ -153,12 +159,20 @@ class SimulateModelTool(BaseTool):
|
|
153
159
|
interval=interval
|
154
160
|
)
|
155
161
|
|
162
|
+
dic_simulated_data = {
|
163
|
+
'name': arg_data.simulation_name,
|
164
|
+
'source': sys_bio_model.biomodel_id if sys_bio_model.biomodel_id else 'upload',
|
165
|
+
'tool_call_id': tool_call_id,
|
166
|
+
'data': df.to_dict()
|
167
|
+
}
|
168
|
+
|
156
169
|
# Prepare the dictionary of updated state for the model
|
157
170
|
dic_updated_state_for_model = {}
|
158
171
|
for key, value in {
|
159
|
-
|
160
|
-
|
161
|
-
|
172
|
+
"model_id": [sys_bio_model.biomodel_id],
|
173
|
+
"sbml_file_path": [sbml_file_path],
|
174
|
+
"dic_simulated_data": [dic_simulated_data],
|
175
|
+
}.items():
|
162
176
|
if value:
|
163
177
|
dic_updated_state_for_model[key] = value
|
164
178
|
|
@@ -166,11 +180,11 @@ class SimulateModelTool(BaseTool):
|
|
166
180
|
return Command(
|
167
181
|
update=dic_updated_state_for_model|{
|
168
182
|
# update the state keys
|
169
|
-
"dic_simulated_data": df.to_dict(),
|
183
|
+
# "dic_simulated_data": df.to_dict(),
|
170
184
|
# update the message history
|
171
185
|
"messages": [
|
172
186
|
ToolMessage(
|
173
|
-
content="Simulation results
|
187
|
+
content=f"Simulation results of {arg_data.simulation_name}",
|
174
188
|
tool_call_id=tool_call_id
|
175
189
|
)
|
176
190
|
],
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: aiagents4pharma
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.9.0
|
4
4
|
Summary: AI Agents for drug discovery, drug development, and other pharmaceutical R&D
|
5
5
|
Classifier: Programming Language :: Python :: 3
|
6
6
|
Classifier: License :: OSI Approved :: MIT License
|
@@ -4,26 +4,26 @@ aiagents4pharma/configs/config.yaml,sha256=8y8uG6Dzx4-9jyb6hZ8r4lOJz5gA_sQhCiSCg
|
|
4
4
|
aiagents4pharma/configs/talk2biomodels/__init__.py,sha256=5ah__-8XyRblwT0U1ByRigNjt_GyCheu7zce4aM-eZE,68
|
5
5
|
aiagents4pharma/configs/talk2biomodels/agents/__init__.py,sha256=_ZoG8snICK2bidWtc2KOGs738LWg9_r66V9mOMnEb-E,71
|
6
6
|
aiagents4pharma/configs/talk2biomodels/agents/t2b_agent/__init__.py,sha256=-fAORvyFmG2iSvFOFDixmt9OTQRR58y89uhhu2EgbA8,46
|
7
|
-
aiagents4pharma/configs/talk2biomodels/agents/t2b_agent/default.yaml,sha256
|
8
|
-
aiagents4pharma/talk2biomodels/__init__.py,sha256=
|
7
|
+
aiagents4pharma/configs/talk2biomodels/agents/t2b_agent/default.yaml,sha256=yD7qZCneaM-JE5PdZjDmDoTRUdsFrzeCKZsBx1b-f20,293
|
8
|
+
aiagents4pharma/talk2biomodels/__init__.py,sha256=qUw3qXrENqSCLIKSLy_qtNPwPDTb1wdZ8fZispcHb3g,141
|
9
9
|
aiagents4pharma/talk2biomodels/agents/__init__.py,sha256=sn5-fREjMdEvb-OUan3iOqrgYGjplNx3J8hYOaW0Po8,128
|
10
10
|
aiagents4pharma/talk2biomodels/agents/t2b_agent.py,sha256=nVWxHR-QMZDqDwxvDga_CvLo7LHP5cWCDl6lXCMcRO0,3264
|
11
11
|
aiagents4pharma/talk2biomodels/models/__init__.py,sha256=5fTHHm3PVloYPNKXbgNlcPgv3-u28ZquxGydFYDfhJA,122
|
12
12
|
aiagents4pharma/talk2biomodels/models/basico_model.py,sha256=js7ORLwbJPaIsko5oRToMMCh4l8LsN292OIvFzTfvRg,4946
|
13
13
|
aiagents4pharma/talk2biomodels/models/sys_bio_model.py,sha256=ylpPba2SA8kl68q3k1kJbiUdRYplPHykyslTQLDZ19I,1995
|
14
14
|
aiagents4pharma/talk2biomodels/states/__init__.py,sha256=YLg1-N0D9qyRRLRqwqfLCLAqZYDtMVZTfI8Y0b_4tbA,139
|
15
|
-
aiagents4pharma/talk2biomodels/states/state_talk2biomodels.py,sha256=
|
15
|
+
aiagents4pharma/talk2biomodels/states/state_talk2biomodels.py,sha256=iob7q5Kpy6aWDLCiFsp4NNVYYXNdDU3vU50PmxyvBsU,792
|
16
16
|
aiagents4pharma/talk2biomodels/tests/__init__.py,sha256=Jbw5tJxSrjGoaK5IX3pJWDCNzhrVQ10lkYq2oQ_KQD8,45
|
17
17
|
aiagents4pharma/talk2biomodels/tests/test_basico_model.py,sha256=uqhbojcA4RRTDRUAF9B9DzKCo3OOIOWMDK8IViG0gsM,2038
|
18
|
-
aiagents4pharma/talk2biomodels/tests/test_langgraph.py,sha256=
|
18
|
+
aiagents4pharma/talk2biomodels/tests/test_langgraph.py,sha256=GyqsUpcWgjuRb15DpGvLg-FZ8g3_cf0TwVcaCPp_vO0,9456
|
19
19
|
aiagents4pharma/talk2biomodels/tests/test_sys_bio_model.py,sha256=nA6bRT16627mw8qzrv7cHM9AByHb9F0kxAuwOpE-avA,1961
|
20
20
|
aiagents4pharma/talk2biomodels/tools/__init__.py,sha256=8hAT6z1OO8N9HRylh6fwoqyjYlGdpkngkElBNqH40Zo,237
|
21
|
-
aiagents4pharma/talk2biomodels/tools/ask_question.py,sha256=
|
22
|
-
aiagents4pharma/talk2biomodels/tools/custom_plotter.py,sha256=
|
23
|
-
aiagents4pharma/talk2biomodels/tools/get_modelinfo.py,sha256=
|
21
|
+
aiagents4pharma/talk2biomodels/tools/ask_question.py,sha256=uxCQ4ON8--D0ACPvT14t6x_aqm9LP6woBA4GM7bPXc4,3061
|
22
|
+
aiagents4pharma/talk2biomodels/tools/custom_plotter.py,sha256=HWwKTX3o4dk0GcRVTO2hPrFSu98mtJ4TKC_hbHXOe1c,4018
|
23
|
+
aiagents4pharma/talk2biomodels/tools/get_modelinfo.py,sha256=68KmeEpgvgaDQM9airOWVy4fGT33rG10RlXhps5W6C0,5279
|
24
24
|
aiagents4pharma/talk2biomodels/tools/load_biomodel.py,sha256=pyVzLQoMnuJYEwsjeOlqcUrbU1F1Z-pNlgkhFaoKpy0,689
|
25
25
|
aiagents4pharma/talk2biomodels/tools/search_models.py,sha256=Iq2ddofOOfZYtAurCISq3bAq5rbwB3l_rL1lgEFyFCI,2653
|
26
|
-
aiagents4pharma/talk2biomodels/tools/simulate_model.py,sha256=
|
26
|
+
aiagents4pharma/talk2biomodels/tools/simulate_model.py,sha256=1HVoI5SkktvpOmTnAG8hxrhpoxpg_he-bb5ZJ_UllI4,6833
|
27
27
|
aiagents4pharma/talk2cells/__init__.py,sha256=zmOP5RAhabgKIQP-W4P4qKME2tG3fhAXM3MeO5_H8kE,120
|
28
28
|
aiagents4pharma/talk2cells/agents/__init__.py,sha256=38nK2a_lEFRjO3qD6Fo9a3983ZCYat6hmJKWY61y2Mo,128
|
29
29
|
aiagents4pharma/talk2cells/agents/scp_agent.py,sha256=gDMfhUNWHa_XWOqm1Ql6yLAdI_7bnIk5sRYn43H2sYk,3090
|
@@ -55,8 +55,8 @@ aiagents4pharma/talk2knowledgegraphs/utils/embeddings/__init__.py,sha256=xRb0x7S
|
|
55
55
|
aiagents4pharma/talk2knowledgegraphs/utils/embeddings/embeddings.py,sha256=1nGznrAj-xT0xuSMBGz2dOujJ7M_IwSR84njxtxsy9A,2523
|
56
56
|
aiagents4pharma/talk2knowledgegraphs/utils/embeddings/huggingface.py,sha256=2vi_elf6EgzfagFAO5QnL3a_aXZyN7B1EBziu44MTfM,3806
|
57
57
|
aiagents4pharma/talk2knowledgegraphs/utils/embeddings/sentence_transformer.py,sha256=36iKlisOpMtGR5xfTAlSHXWvPqVC_Jbezod8kbBBMVg,2136
|
58
|
-
aiagents4pharma-1.
|
59
|
-
aiagents4pharma-1.
|
60
|
-
aiagents4pharma-1.
|
61
|
-
aiagents4pharma-1.
|
62
|
-
aiagents4pharma-1.
|
58
|
+
aiagents4pharma-1.9.0.dist-info/LICENSE,sha256=IcIbyB1Hyk5ZDah03VNQvJkbNk2hkBCDqQ8qtnCvB4Q,1077
|
59
|
+
aiagents4pharma-1.9.0.dist-info/METADATA,sha256=c8KtNUIWjkl_hwW4ebu9SlAXiG7BWPX5CoMeC2T4Jb8,7988
|
60
|
+
aiagents4pharma-1.9.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
61
|
+
aiagents4pharma-1.9.0.dist-info/top_level.txt,sha256=-AH8rMmrSnJtq7HaAObS78UU-cTCwvX660dSxeM7a0A,16
|
62
|
+
aiagents4pharma-1.9.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|