aiagents4pharma 1.24.0__py3-none-any.whl → 1.25.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.
@@ -7,4 +7,5 @@ from . import (
7
7
  talk2cells,
8
8
  talk2scholars,
9
9
  talk2knowledgegraphs,
10
+ talk2aiagents4pharma
10
11
  )
@@ -0,0 +1,6 @@
1
+ '''
2
+ This file is used to import the models and tools.
3
+ '''
4
+ from . import agents
5
+ from . import states
6
+ from . import configs
@@ -0,0 +1,5 @@
1
+ '''
2
+ This file is used to import all the modules in the package.
3
+ '''
4
+ # import everything from the module
5
+ from . import main_agent
@@ -0,0 +1,52 @@
1
+ #/usr/bin/env python3
2
+
3
+ '''
4
+ This is the main agent file for the AIAgents4Pharma.
5
+ '''
6
+
7
+ import logging
8
+ import hydra
9
+ from langgraph_supervisor import create_supervisor
10
+ from langchain_openai import ChatOpenAI
11
+ from langchain_core.language_models.chat_models import BaseChatModel
12
+ from langgraph.checkpoint.memory import MemorySaver
13
+ from ...talk2biomodels.agents.t2b_agent import get_app as get_app_t2b
14
+ from ...talk2knowledgegraphs.agents.t2kg_agent import get_app as get_app_t2kg
15
+ from ..states.state_talk2aiagents4pharma import Talk2AIAgents4Pharma
16
+
17
+ # Initialize logger
18
+ logging.basicConfig(level=logging.INFO)
19
+ logger = logging.getLogger(__name__)
20
+
21
+ def get_app(uniq_id,
22
+ llm_model: BaseChatModel = ChatOpenAI(model='gpt-4o-mini', temperature=0)):
23
+ '''
24
+ This function returns the langraph app.
25
+ '''
26
+ # Load hydra configuration
27
+ logger.log(logging.INFO, "Launching AIAgents4Pharma_Agent with thread_id %s", uniq_id)
28
+ with hydra.initialize(version_base=None, config_path="../configs"):
29
+ cfg = hydra.compose(config_name='config',
30
+ overrides=['agents/main_agent=default'])
31
+ cfg = cfg.agents.main_agent
32
+ logger.log(logging.INFO, "System_prompt of T2AA4P: %s", cfg.system_prompt)
33
+ # Create supervisor workflow
34
+ workflow = create_supervisor(
35
+ [
36
+ get_app_t2b(uniq_id, llm_model), # Talk2BioModels
37
+ get_app_t2kg(uniq_id, llm_model) # Talk2KnowledgeGraphs
38
+ ],
39
+ model=llm_model,
40
+ state_schema=Talk2AIAgents4Pharma,
41
+ # Full history is needed to extract
42
+ # the tool artifacts
43
+ output_mode="full_history",
44
+ add_handoff_back_messages=False,
45
+ prompt=cfg.system_prompt
46
+ )
47
+
48
+ # Compile and run
49
+ app = workflow.compile(checkpointer=MemorySaver(),
50
+ name="AIAgents4Pharma_Agent")
51
+
52
+ return app
@@ -0,0 +1,5 @@
1
+ '''
2
+ Import all the modules in the package
3
+ '''
4
+
5
+ from . import agents
@@ -0,0 +1,5 @@
1
+ '''
2
+ Import all the modules in the package
3
+ '''
4
+
5
+ from . import main_agent
@@ -0,0 +1,12 @@
1
+ _target_: agents.main_agent.get_app
2
+ system_prompt: >
3
+ You are Talk2AIAgents4Pharma agent.
4
+ You are managing a team of the following 2 agents:
5
+
6
+ 1. Talk2Biomodels (T2B) agent: This agent can operate
7
+ on mathematical models of biological systems. This
8
+ agent can also query an uploaded document/pdf/article.
9
+
10
+ 2. Talk2KnowledgeGraphs (T2KG) agent: This agent can
11
+ reason over a knowledge graph of biological entities
12
+ and their relationships.
@@ -0,0 +1,3 @@
1
+ defaults:
2
+ - _self_
3
+ - agents/main_agent: default
@@ -0,0 +1,4 @@
1
+ '''
2
+ This file is used to import all the models in the package.
3
+ '''
4
+ from . import state_talk2aiagents4pharma
@@ -0,0 +1,16 @@
1
+ """
2
+ This is the state file for the Talk2AIAgents4Pharma agent.
3
+ """
4
+
5
+ from ...talk2biomodels.states.state_talk2biomodels import Talk2Biomodels
6
+ from ...talk2knowledgegraphs.states.state_talk2knowledgegraphs import Talk2KnowledgeGraphs
7
+
8
+ class Talk2AIAgents4Pharma(Talk2Biomodels,
9
+ Talk2KnowledgeGraphs):
10
+ """
11
+ The state for the Talk2AIAgents4Pharma agent.
12
+
13
+ This class inherits from the classes:
14
+ 1. Talk2Biomodels
15
+ 2. Talk2KnowledgeGraphs
16
+ """
@@ -0,0 +1,3 @@
1
+ '''
2
+ This module contains the test cases.
3
+ '''
@@ -0,0 +1,111 @@
1
+ '''
2
+ Test Talk2AIAgents4Pharma supervisor agent.
3
+ '''
4
+
5
+ import pytest
6
+ from langchain_core.messages import HumanMessage
7
+ from langchain_openai import ChatOpenAI, OpenAIEmbeddings
8
+ from ..agents.main_agent import get_app
9
+
10
+ # Define the data path for the test files of Talk2KnowledgeGraphs agent
11
+ DATA_PATH = "aiagents4pharma/talk2knowledgegraphs/tests/files"
12
+
13
+ @pytest.fixture(name="input_dict")
14
+ def input_dict_fixture():
15
+ """
16
+ Input dictionary fixture for Talk2AIAgents4Pharma agent,
17
+ which is partly inherited from the Talk2KnowledgeGraphs agent.
18
+ """
19
+ input_dict = {
20
+ "topk_nodes": 3,
21
+ "topk_edges": 3,
22
+ "uploaded_files": [],
23
+ "dic_source_graph": [
24
+ {
25
+ "name": "PrimeKG",
26
+ "kg_pyg_path": f"{DATA_PATH}/primekg_ibd_pyg_graph.pkl",
27
+ "kg_text_path": f"{DATA_PATH}/primekg_ibd_text_graph.pkl",
28
+ }
29
+ ],
30
+ "dic_extracted_graph": []
31
+ }
32
+
33
+ return input_dict
34
+
35
+ def test_main_agent_invokes_t2kg(input_dict):
36
+ """
37
+ In the following test, we will ask the main agent (supervisor)
38
+ to list drugs that target the gene Interleukin-6. We will check
39
+ if the Talk2KnowledgeGraphs agent is invoked. We will do so by
40
+ checking the state of the Talk2AIAgents4Pharma agent, which is
41
+ partly inherited from the Talk2KnowledgeGraphs agent
42
+
43
+ Args:
44
+ input_dict: Input dictionary
45
+ """
46
+ # Prepare LLM and embedding model
47
+ input_dict["llm_model"] = ChatOpenAI(model="gpt-4o-mini", temperature=0.0)
48
+ input_dict["embedding_model"] = OpenAIEmbeddings(model="text-embedding-3-small")
49
+
50
+ # Setup the app
51
+ unique_id = 12345
52
+ app = get_app(unique_id, llm_model=input_dict["llm_model"])
53
+ config = {"configurable": {"thread_id": unique_id}}
54
+ # Update state
55
+ app.update_state(
56
+ config,
57
+ input_dict,
58
+ )
59
+ prompt = "List drugs that target the gene Interleukin-6"
60
+
61
+ # Invoke the agent
62
+ response = app.invoke({"messages": [HumanMessage(content=prompt)]}, config=config)
63
+
64
+ # Check assistant message
65
+ assistant_msg = response["messages"][-1].content
66
+ assert isinstance(assistant_msg, str)
67
+
68
+ # Check extracted subgraph dictionary
69
+ current_state = app.get_state(config)
70
+ dic_extracted_graph = current_state.values["dic_extracted_graph"][0]
71
+ assert isinstance(dic_extracted_graph, dict)
72
+ assert dic_extracted_graph["graph_source"] == "PrimeKG"
73
+ assert dic_extracted_graph["topk_nodes"] == 3
74
+ assert dic_extracted_graph["topk_edges"] == 3
75
+ assert isinstance(dic_extracted_graph["graph_dict"], dict)
76
+ assert len(dic_extracted_graph["graph_dict"]["nodes"]) > 0
77
+ assert len(dic_extracted_graph["graph_dict"]["edges"]) > 0
78
+ assert isinstance(dic_extracted_graph["graph_text"], str)
79
+ # Check summarized subgraph
80
+ assert isinstance(dic_extracted_graph["graph_summary"], str)
81
+
82
+ def test_main_agent_invokes_t2b():
83
+ '''
84
+ In the following test, we will ask the main agent (supervisor)
85
+ to simulate a model. And we will check if the Talk2BioModels
86
+ agent is invoked. We will do so by checking the state of the
87
+ Talk2AIAgents4Pharma agent, which is partly inherited from the
88
+ Talk2BioModels agent.
89
+ '''
90
+ unique_id = 123
91
+ app = get_app(unique_id)
92
+ config = {"configurable": {"thread_id": unique_id}}
93
+ prompt = "Simulate model 64"
94
+ # Invoke the agent
95
+ app.invoke(
96
+ {"messages": [HumanMessage(content=prompt)]},
97
+ config=config
98
+ )
99
+ # Get the state of the Talk2AIAgents4Pharma agent
100
+ current_state = app.get_state(config)
101
+ # Check if the dic_simulated_data is in the state
102
+ dic_simulated_data = current_state.values["dic_simulated_data"]
103
+ # Check if the dic_simulated_data is a list
104
+ assert isinstance(dic_simulated_data, list)
105
+ # Check if the length of the dic_simulated_data is 1
106
+ assert len(dic_simulated_data) == 1
107
+ # Check if the source of the model is 64
108
+ assert dic_simulated_data[0]['source'] == 64
109
+ # Check if the data of the model contains
110
+ # '1,3-bisphosphoglycerate'
111
+ assert '1,3-bisphosphoglycerate' in dic_simulated_data[0]['data']
@@ -87,7 +87,8 @@ def get_app(uniq_id,
87
87
  # meaning you can use it as you would any other runnable.
88
88
  # Note that we're (optionally) passing the memory
89
89
  # when compiling the graph
90
- app = workflow.compile(checkpointer=checkpointer)
90
+ app = workflow.compile(checkpointer=checkpointer,
91
+ name="T2B_Agent")
91
92
  logger.log(logging.INFO,
92
93
  "Compiled the graph with thread_id %s and llm_model %s",
93
94
  uniq_id,
@@ -76,7 +76,8 @@ def get_app(uniq_id, llm_model: BaseChatModel=ChatOllama(model='llama3.2:1b', te
76
76
  # meaning you can use it as you would any other runnable.
77
77
  # Note that we're (optionally) passing the memory
78
78
  # when compiling the graph
79
- app = workflow.compile(checkpointer=checkpointer)
79
+ app = workflow.compile(checkpointer=checkpointer,
80
+ name="T2KG_Agent")
80
81
  logger.log(logging.INFO,
81
82
  "Compiled the graph with thread_id %s and llm_model %s",
82
83
  uniq_id,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: aiagents4pharma
3
- Version: 1.24.0
3
+ Version: 1.25.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
@@ -23,7 +23,7 @@ Requires-Dist: langchain-experimental==0.3.3
23
23
  Requires-Dist: langchain-nvidia-ai-endpoints==0.3.9
24
24
  Requires-Dist: langchain-openai==0.2.5
25
25
  Requires-Dist: langchain_ollama==0.2.3
26
- Requires-Dist: langgraph==0.2.66
26
+ Requires-Dist: langgraph_supervisor==0.0.4
27
27
  Requires-Dist: matplotlib==3.9.2
28
28
  Requires-Dist: openai==1.59.4
29
29
  Requires-Dist: ollama==0.4.7
@@ -83,6 +83,7 @@ Our toolkit currently consists of the following agents:
83
83
  - **Talk2KnowledgeGraphs** _(v1 in progress)_: Access and explore complex biological knowledge graphs for insightful data connections.
84
84
  - **Talk2Scholars** _(v1 in progress)_: Get recommendations for articles related to your choice. Download, query, and write/retrieve them to your reference manager (currently supporting Zotero).
85
85
  - **Talk2Cells** _(v1 in progress)_: Query and analyze sequencing data with ease.
86
+ - **Talk2AIAgents4Pharma** _(v1 in progress)_: Converse with all the agents above (currently supports T2B and T2KG)
86
87
 
87
88
  ![AIAgents4Pharma](docs/assets/AIAgents4Pharma.png)
88
89
 
@@ -104,49 +105,47 @@ Check out the tutorials on each agent for detailed instrcutions.
104
105
 
105
106
  _Both `Talk2Biomodels` and `Talk2Scholars` are now available on Docker Hub._
106
107
 
107
- #### **Running Talk2Biomodels**
108
+ 1. **Pull the Docker images**
108
109
 
109
- 1. **Pull the Docker image**
110
110
  ```bash
111
111
  docker pull virtualpatientengine/talk2biomodels
112
112
  ```
113
- 2. **Run the container**
113
+
114
+ ```bash
115
+ docker pull virtualpatientengine/talk2scholars
116
+ ```
117
+
118
+ 2. **Run the containers**
119
+
114
120
  ```bash
115
121
  docker run -d \
122
+ --name talk2biomodels \
116
123
  -e OPENAI_API_KEY=<your_openai_api_key> \
117
124
  -e NVIDIA_API_KEY=<your_nvidia_api_key> \
118
125
  -p 8501:8501 \
119
126
  virtualpatientengine/talk2biomodels
120
127
  ```
121
- 3. **Access the Web App**
122
- Open your browser and go to:
123
- ```
124
- http://localhost:8501
125
- ```
126
- _You can create a free account at NVIDIA and apply for their
127
- free credits [here](https://build.nvidia.com/explore/discover)._
128
-
129
- #### **Running Talk2Scholars**
130
128
 
131
- 1. **Pull the Docker image**
132
- ```bash
133
- docker pull virtualpatientengine/talk2scholars
134
- ```
135
- 2. **Run the container**
136
129
  ```bash
137
130
  docker run -d \
131
+ --name talk2scholars \
138
132
  -e OPENAI_API_KEY=<your_openai_api_key> \
139
133
  -e ZOTERO_API_KEY=<your_zotero_api_key> \
140
134
  -e ZOTERO_USER_ID=<your_zotero_user_id> \
141
135
  -p 8501:8501 \
142
136
  virtualpatientengine/talk2scholars
143
137
  ```
138
+
144
139
  3. **Access the Web App**
145
- Open your browser and go to:
140
+ Open your browser and go to:
141
+
146
142
  ```
147
143
  http://localhost:8501
148
144
  ```
149
145
 
146
+ _You can create a free account at NVIDIA and apply for their
147
+ free credits [here](https://build.nvidia.com/explore/discover)._
148
+
150
149
  #### **Notes**
151
150
 
152
151
  - Ensure you **replace `<your_openai_api_key>`, `<your_nvidia_api_key>`, `<your_zotero_api_key>`, and `<your_zotero_user_id>`** with your actual credentials.
@@ -192,10 +191,10 @@ _Both `Talk2Biomodels` and `Talk2Scholars` are now available on Docker Hub._
192
191
  ```
193
192
 
194
193
  _Please note that this will create a new tracing project in your Langsmith
195
- account with the name `T2X-xxxx`, where `X` can be `B` (Biomodels), `S` (Scholars),
196
- `KG` (KnowledgeGraphs), or `C` (Cells). If you skip the previous step, it will
197
- default to the name `default`. `xxxx` will be the 4-digit ID created for the
198
- session._
194
+ account with the name `T2X-xxxx`, where `X` can be `AA4P` (Main Agent),
195
+ `B` (Biomodels), `S` (Scholars), `KG` (KnowledgeGraphs), or `C` (Cells).
196
+ If you skip the previous step, it will default to the name `default`.
197
+ `xxxx` will be the 4-digit ID created for the session._
199
198
 
200
199
  6. **Launch the app:**
201
200
  ```bash
@@ -1,7 +1,18 @@
1
- aiagents4pharma/__init__.py,sha256=Ua9fqYW5gV1SZ0nOyOMd4T3wTlBui1-mrlJzFUQLFgY,161
1
+ aiagents4pharma/__init__.py,sha256=7xnvthMuxYurECWvyb0_yaPJ18SsqvmkKPTCxgbQlNQ,186
2
+ aiagents4pharma/talk2aiagents4pharma/__init__.py,sha256=KOPe8cZ-ROQ6EGn8FeejRFUPokayKRMTgiXFyOpZGoA,122
3
+ aiagents4pharma/talk2aiagents4pharma/agents/__init__.py,sha256=Cc1RitlLGzJ5d_dCSUdguZH417nlJux1qVCVS2M9t30,129
4
+ aiagents4pharma/talk2aiagents4pharma/agents/main_agent.py,sha256=oVHYFXHmwq8y6e41JvmRYDXvCjItqY7setpcC2U2y6Q,1870
5
+ aiagents4pharma/talk2aiagents4pharma/configs/__init__.py,sha256=5ah__-8XyRblwT0U1ByRigNjt_GyCheu7zce4aM-eZE,68
6
+ aiagents4pharma/talk2aiagents4pharma/configs/config.yaml,sha256=VnbMbVSYfCh68cHZ0JLu00UjOUmapejN3EsN3lnBXtU,51
7
+ aiagents4pharma/talk2aiagents4pharma/configs/agents/__init__.py,sha256=zrJcq-4m0YUKfSlRGC8KzBmEooaASKuL_Y75yDp-ZoA,72
8
+ aiagents4pharma/talk2aiagents4pharma/configs/agents/main_agent/default.yaml,sha256=CRi4t2VGYfDouDYb6id5_qLm-6hLkp5WHCZJwsJlYM0,455
9
+ aiagents4pharma/talk2aiagents4pharma/states/__init__.py,sha256=3wSvCpM29oqvVjhbhabm7FNm9Zt0rHO5tEn63YW6doc,108
10
+ aiagents4pharma/talk2aiagents4pharma/states/state_talk2aiagents4pharma.py,sha256=NxujEBDKubvpV9UG7ERTDRB6psr0XnObCNHyztLAhgo,485
11
+ aiagents4pharma/talk2aiagents4pharma/tests/__init__.py,sha256=Jbw5tJxSrjGoaK5IX3pJWDCNzhrVQ10lkYq2oQ_KQD8,45
12
+ aiagents4pharma/talk2aiagents4pharma/tests/test_main_agent.py,sha256=H8jcSZlzyt0wkijF_hgX8p63moXejbdP_W2xrWGTu3g,4122
2
13
  aiagents4pharma/talk2biomodels/__init__.py,sha256=1cq1HX2xoi_a0nDPuXYoSTrnL26OHQBW3zXNwwwjFO0,181
3
14
  aiagents4pharma/talk2biomodels/agents/__init__.py,sha256=sn5-fREjMdEvb-OUan3iOqrgYGjplNx3J8hYOaW0Po8,128
4
- aiagents4pharma/talk2biomodels/agents/t2b_agent.py,sha256=bbktkTinp5VHHmAZEs1yMPN3Bu7rnyxRq2Cb7xVe8Gw,3477
15
+ aiagents4pharma/talk2biomodels/agents/t2b_agent.py,sha256=1NxSQbh5wbDpnap4mHwzSIjjHP1xakE2d1Pg5bHtDrE,3522
5
16
  aiagents4pharma/talk2biomodels/api/__init__.py,sha256=_GmDQqDLYpsUPUeE1nBNlT5AI9oTXIcqgOfNfvmonqA,123
6
17
  aiagents4pharma/talk2biomodels/api/kegg.py,sha256=QzYDAfJ16E7tbHGxP8ZNWRizMkMRS_HJuucueXEC1Gg,2943
7
18
  aiagents4pharma/talk2biomodels/api/ols.py,sha256=qq0Qy-gJDxanQW-HfCChDsTQsY1M41ua8hMlTnfuzrA,2202
@@ -62,7 +73,7 @@ aiagents4pharma/talk2cells/tools/scp_agent/display_studies.py,sha256=6q59gh_NQai
62
73
  aiagents4pharma/talk2cells/tools/scp_agent/search_studies.py,sha256=MLe-twtFnOu-P8P9diYq7jvHBHbWFRRCZLcfpUzqPMg,2806
63
74
  aiagents4pharma/talk2knowledgegraphs/__init__.py,sha256=Z0Eo7LTiKk0STsr8VI7wkCLq7PHrK1vYlH4I1hSNLiA,165
64
75
  aiagents4pharma/talk2knowledgegraphs/agents/__init__.py,sha256=iOAzuy_8A03tQDFtSBhC9dldUo62z5gfxcVtXAdLOJs,92
65
- aiagents4pharma/talk2knowledgegraphs/agents/t2kg_agent.py,sha256=j6MA1LB28mqpb6ZEmNLGcvDZvOnlGbJB9r7VXyEGask,3079
76
+ aiagents4pharma/talk2knowledgegraphs/agents/t2kg_agent.py,sha256=GdogSyTJa0LlSWPqDWdO41EXcS-PThatblPWpuHih-M,3125
66
77
  aiagents4pharma/talk2knowledgegraphs/configs/__init__.py,sha256=4_DVdpahaJ55yPl0aZotlFA_MYWLFF2cubWyKtBVI_Q,126
67
78
  aiagents4pharma/talk2knowledgegraphs/configs/config.yaml,sha256=bag4w3JCSqaojG37MTksy3ZehAPe3qoVzjIN2uh3nrc,229
68
79
  aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/__init__.py,sha256=-fAORvyFmG2iSvFOFDixmt9OTQRR58y89uhhu2EgbA8,46
@@ -175,8 +186,8 @@ aiagents4pharma/talk2scholars/tools/s2/search.py,sha256=i5KMFJWK31CjYtVT1McJpLzg
175
186
  aiagents4pharma/talk2scholars/tools/s2/single_paper_rec.py,sha256=7PoZfcstxDThWX6NYOgxN_9M_nwgMPAALch8OmjraVY,5568
176
187
  aiagents4pharma/talk2scholars/tools/zotero/__init__.py,sha256=1UW4r5ECvAwYpo1Fjf7lQPO--M8I85baYCHocFOAq4M,53
177
188
  aiagents4pharma/talk2scholars/tools/zotero/zotero_read.py,sha256=NJ65fAJ4u2Zq15uvEajVOhI4QnNvyqA6FHPaEDqvMw0,4321
178
- aiagents4pharma-1.24.0.dist-info/LICENSE,sha256=IcIbyB1Hyk5ZDah03VNQvJkbNk2hkBCDqQ8qtnCvB4Q,1077
179
- aiagents4pharma-1.24.0.dist-info/METADATA,sha256=N3OSAZ9173G-Lh37d02tKfhqeCoQ8Q6yj8MtbNet0IM,9474
180
- aiagents4pharma-1.24.0.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
181
- aiagents4pharma-1.24.0.dist-info/top_level.txt,sha256=-AH8rMmrSnJtq7HaAObS78UU-cTCwvX660dSxeM7a0A,16
182
- aiagents4pharma-1.24.0.dist-info/RECORD,,
189
+ aiagents4pharma-1.25.0.dist-info/LICENSE,sha256=IcIbyB1Hyk5ZDah03VNQvJkbNk2hkBCDqQ8qtnCvB4Q,1077
190
+ aiagents4pharma-1.25.0.dist-info/METADATA,sha256=GcI8CTr7TUVIlC35PVwhhBi-5LEn6bTd2r3FVhtHCC4,9469
191
+ aiagents4pharma-1.25.0.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
192
+ aiagents4pharma-1.25.0.dist-info/top_level.txt,sha256=-AH8rMmrSnJtq7HaAObS78UU-cTCwvX660dSxeM7a0A,16
193
+ aiagents4pharma-1.25.0.dist-info/RECORD,,