pycityagent 2.0.0a37__tar.gz → 2.0.0a39__tar.gz

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.
Files changed (76) hide show
  1. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/PKG-INFO +1 -1
  2. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/simulation/agentgroup.py +33 -4
  3. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/simulation/simulation.py +10 -3
  4. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/simulation/storage/pg.py +44 -23
  5. pycityagent-2.0.0a39/pycityagent/utils/__init__.py +11 -0
  6. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/utils/pg_query.py +12 -0
  7. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pyproject.toml +1 -1
  8. pycityagent-2.0.0a37/pycityagent/utils/__init__.py +0 -7
  9. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/README.md +0 -0
  10. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/__init__.py +0 -0
  11. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/agent.py +0 -0
  12. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/economy/__init__.py +0 -0
  13. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/economy/econ_client.py +0 -0
  14. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/__init__.py +0 -0
  15. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/interact/__init__.py +0 -0
  16. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/interact/interact.py +0 -0
  17. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/message/__init__.py +0 -0
  18. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/sence/__init__.py +0 -0
  19. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/sence/static.py +0 -0
  20. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/sidecar/__init__.py +0 -0
  21. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/sidecar/sidecarv2.py +0 -0
  22. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/sim/__init__.py +0 -0
  23. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/sim/aoi_service.py +0 -0
  24. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/sim/client.py +0 -0
  25. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/sim/clock_service.py +0 -0
  26. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/sim/economy_services.py +0 -0
  27. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/sim/lane_service.py +0 -0
  28. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/sim/light_service.py +0 -0
  29. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/sim/person_service.py +0 -0
  30. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/sim/road_service.py +0 -0
  31. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/sim/sim_env.py +0 -0
  32. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/sim/social_service.py +0 -0
  33. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/simulator.py +0 -0
  34. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/utils/__init__.py +0 -0
  35. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/utils/base64.py +0 -0
  36. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/utils/const.py +0 -0
  37. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/utils/geojson.py +0 -0
  38. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/utils/grpc.py +0 -0
  39. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/utils/map_utils.py +0 -0
  40. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/utils/port.py +0 -0
  41. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/environment/utils/protobuf.py +0 -0
  42. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/llm/__init__.py +0 -0
  43. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/llm/embeddings.py +0 -0
  44. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/llm/llm.py +0 -0
  45. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/llm/llmconfig.py +0 -0
  46. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/llm/utils.py +0 -0
  47. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/memory/__init__.py +0 -0
  48. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/memory/const.py +0 -0
  49. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/memory/faiss_query.py +0 -0
  50. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/memory/memory.py +0 -0
  51. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/memory/memory_base.py +0 -0
  52. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/memory/profile.py +0 -0
  53. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/memory/self_define.py +0 -0
  54. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/memory/state.py +0 -0
  55. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/memory/utils.py +0 -0
  56. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/message/__init__.py +0 -0
  57. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/message/messager.py +0 -0
  58. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/metrics/__init__.py +0 -0
  59. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/metrics/mlflow_client.py +0 -0
  60. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/metrics/utils/const.py +0 -0
  61. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/simulation/__init__.py +0 -0
  62. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/survey/__init__.py +0 -0
  63. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/survey/manager.py +0 -0
  64. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/survey/models.py +0 -0
  65. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/utils/avro_schema.py +0 -0
  66. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/utils/decorators.py +0 -0
  67. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/utils/parsers/__init__.py +0 -0
  68. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/utils/parsers/code_block_parser.py +0 -0
  69. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/utils/parsers/json_parser.py +0 -0
  70. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/utils/parsers/parser_base.py +0 -0
  71. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/utils/survey_util.py +0 -0
  72. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/workflow/__init__.py +0 -0
  73. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/workflow/block.py +0 -0
  74. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/workflow/prompt.py +0 -0
  75. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/workflow/tool.py +0 -0
  76. {pycityagent-2.0.0a37 → pycityagent-2.0.0a39}/pycityagent/workflow/trigger.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pycityagent
3
- Version: 2.0.0a37
3
+ Version: 2.0.0a39
4
4
  Summary: LLM-based城市环境agent构建库
5
5
  License: MIT
6
6
  Author: Yuwei Yan
@@ -199,11 +199,40 @@ class AgentGroup:
199
199
  profile = profile[0]
200
200
  profile["id"] = agent._uuid
201
201
  profiles.append(
202
- (agent._uuid, profile.get("name", ""), json.dumps(profile))
202
+ (
203
+ agent._uuid,
204
+ profile.get("name", ""),
205
+ json.dumps(
206
+ {
207
+ k: v
208
+ for k, v in profile.items()
209
+ if k not in {"id", "name"}
210
+ }
211
+ ),
212
+ )
203
213
  )
204
- await self._pgsql_writer.async_write_profile.remote( # type:ignore
205
- profiles
206
- )
214
+ else:
215
+ profiles: list[Any] = []
216
+ for agent in self.agents:
217
+ profile = await agent.memory._profile.export()
218
+ profile = profile[0]
219
+ profile["id"] = agent._uuid
220
+ profiles.append(
221
+ (
222
+ agent._uuid,
223
+ profile.get("name", ""),
224
+ json.dumps(
225
+ {
226
+ k: v
227
+ for k, v in profile.items()
228
+ if k not in {"id", "name"}
229
+ }
230
+ ),
231
+ )
232
+ )
233
+ await self._pgsql_writer.async_write_profile.remote( # type:ignore
234
+ profiles
235
+ )
207
236
  self.initialized = True
208
237
  logger.debug(f"-----AgentGroup {self._uuid} initialized")
209
238
 
@@ -20,10 +20,11 @@ from mosstool.map._map_util.const import AOI_START_ID
20
20
  from ..agent import Agent, InstitutionAgent
21
21
  from ..environment.simulator import Simulator
22
22
  from ..llm import SimpleEmbedding
23
- from ..memory import FaissQuery, Memory
23
+ from ..memory import Memory
24
24
  from ..message.messager import Messager
25
25
  from ..metrics import init_mlflow_connection
26
26
  from ..survey import Survey
27
+ from ..utils import TO_UPDATE_EXP_INFO_KEYS_AND_TYPES
27
28
  from .agentgroup import AgentGroup
28
29
  from .storage.pg import PgWriter, create_pg_tables
29
30
 
@@ -96,7 +97,11 @@ class AgentSimulation:
96
97
  logger.warning("PostgreSQL is not enabled, NO POSTGRESQL DATABASE STORAGE")
97
98
  self._pgsql_dsn = ""
98
99
  else:
99
- self._pgsql_dsn = _pgsql_config["data_source_name"]
100
+ self._pgsql_dsn = (
101
+ _pgsql_config["data_source_name"]
102
+ if "data_source_name" in _pgsql_config
103
+ else _pgsql_config["dsn"]
104
+ )
100
105
 
101
106
  # 添加实验信息相关的属性
102
107
  self._exp_created_time = datetime.now(timezone.utc)
@@ -535,7 +540,9 @@ class AgentSimulation:
535
540
  try:
536
541
  if self.enable_pgsql:
537
542
  worker: ray.ObjectRef = self._pgsql_writers[0] # type:ignore
538
- pg_exp_info = {k: v for k, v in self._exp_info.items()}
543
+ pg_exp_info = {
544
+ k: self._exp_info[k] for (k, _) in TO_UPDATE_EXP_INFO_KEYS_AND_TYPES
545
+ }
539
546
  pg_exp_info["created_at"] = self._exp_created_time
540
547
  pg_exp_info["updated_at"] = self._exp_updated_time
541
548
  await worker.async_update_exp_info.remote( # type:ignore
@@ -1,4 +1,5 @@
1
1
  import asyncio
2
+ import logging
2
3
  from collections import defaultdict
3
4
  from typing import Any
4
5
 
@@ -8,7 +9,9 @@ import ray
8
9
  from psycopg.rows import dict_row
9
10
 
10
11
  from ...utils.decorators import lock_decorator
11
- from ...utils.pg_query import PGSQL_DICT
12
+ from ...utils.pg_query import PGSQL_DICT, TO_UPDATE_EXP_INFO_KEYS_AND_TYPES
13
+
14
+ logger = logging.getLogger("pg")
12
15
 
13
16
 
14
17
  def create_pg_tables(exp_id: str, dsn: str):
@@ -27,10 +30,15 @@ def create_pg_tables(exp_id: str, dsn: str):
27
30
  if not table_type == "experiment":
28
31
  # delete table
29
32
  cur.execute(f"DROP TABLE IF EXISTS {table_name}") # type:ignore
33
+ logger.debug(
34
+ f"table:{table_name} sql: DROP TABLE IF EXISTS {table_name}"
35
+ )
30
36
  conn.commit()
31
37
  # create table
32
38
  for _exec_str in exec_strs:
33
- cur.execute(_exec_str.format(table_name=table_name))
39
+ exec_str = _exec_str.format(table_name=table_name)
40
+ cur.execute(exec_str)
41
+ logger.debug(f"table:{table_name} sql: {exec_str}")
34
42
  conn.commit()
35
43
 
36
44
 
@@ -50,6 +58,7 @@ class PgWriter:
50
58
  copy_sql = psycopg.sql.SQL(
51
59
  "COPY {} (id, day, t, type, speaker, content, created_at) FROM STDIN"
52
60
  ).format(psycopg.sql.Identifier(table_name))
61
+ _rows: list[Any] = []
53
62
  async with aconn.cursor() as cur:
54
63
  async with cur.copy(copy_sql) as copy:
55
64
  for row in rows:
@@ -58,6 +67,8 @@ class PgWriter:
58
67
  for (_type, r) in zip(_tuple_types, row)
59
68
  ]
60
69
  await copy.write_row(_row)
70
+ _rows.append(_row)
71
+ logger.debug(f"table:{table_name} sql: {copy_sql} values: {_rows}")
61
72
 
62
73
  # @lock_decorator
63
74
  async def async_write_status(self, rows: list[tuple]):
@@ -67,6 +78,7 @@ class PgWriter:
67
78
  copy_sql = psycopg.sql.SQL(
68
79
  "COPY {} (id, day, t, lng, lat, parent_id, action, status, created_at) FROM STDIN"
69
80
  ).format(psycopg.sql.Identifier(table_name))
81
+ _rows: list[Any] = []
70
82
  async with aconn.cursor() as cur:
71
83
  async with cur.copy(copy_sql) as copy:
72
84
  for row in rows:
@@ -75,6 +87,8 @@ class PgWriter:
75
87
  for (_type, r) in zip(_tuple_types, row)
76
88
  ]
77
89
  await copy.write_row(_row)
90
+ _rows.append(_row)
91
+ logger.debug(f"table:{table_name} sql: {copy_sql} values: {_rows}")
78
92
 
79
93
  # @lock_decorator
80
94
  async def async_write_profile(self, rows: list[tuple]):
@@ -84,6 +98,7 @@ class PgWriter:
84
98
  copy_sql = psycopg.sql.SQL("COPY {} (id, name, profile) FROM STDIN").format(
85
99
  psycopg.sql.Identifier(table_name)
86
100
  )
101
+ _rows: list[Any] = []
87
102
  async with aconn.cursor() as cur:
88
103
  async with cur.copy(copy_sql) as copy:
89
104
  for row in rows:
@@ -92,6 +107,8 @@ class PgWriter:
92
107
  for (_type, r) in zip(_tuple_types, row)
93
108
  ]
94
109
  await copy.write_row(_row)
110
+ _rows.append(_row)
111
+ logger.debug(f"table:{table_name} sql: {copy_sql} values: {_rows}")
95
112
 
96
113
  # @lock_decorator
97
114
  async def async_write_survey(self, rows: list[tuple]):
@@ -101,6 +118,7 @@ class PgWriter:
101
118
  copy_sql = psycopg.sql.SQL(
102
119
  "COPY {} (id, day, t, survey_id, result, created_at) FROM STDIN"
103
120
  ).format(psycopg.sql.Identifier(table_name))
121
+ _rows: list[Any] = []
104
122
  async with aconn.cursor() as cur:
105
123
  async with cur.copy(copy_sql) as copy:
106
124
  for row in rows:
@@ -109,51 +127,54 @@ class PgWriter:
109
127
  for (_type, r) in zip(_tuple_types, row)
110
128
  ]
111
129
  await copy.write_row(_row)
130
+ _rows.append(_row)
131
+ logger.debug(f"table:{table_name} sql: {copy_sql} values: {_rows}")
112
132
 
113
133
  # @lock_decorator
114
134
  async def async_update_exp_info(self, exp_info: dict[str, Any]):
115
135
  # timestamp不做类型转换
116
- TO_UPDATE_EXP_INFO_KEYS_AND_TYPES = [
117
- ("id", None),
118
- ("name", str),
119
- ("num_day", int),
120
- ("status", int),
121
- ("cur_day", int),
122
- ("cur_t", float),
123
- ("config", str),
124
- ("error", str),
125
- ("created_at", None),
126
- ("updated_at", None),
127
- ]
128
136
  table_name = f"socialcity_experiment"
129
137
  async with await psycopg.AsyncConnection.connect(self._dsn) as aconn:
130
- async with aconn.cursor(row_factory=dict_row) as cur:
131
- await cur.execute("SELECT * FROM {table_name} WHERE id=%s".format(table_name = table_name),(self.exp_id,))# type:ignore
132
- record_exists = await cur.fetchall()
133
- print("record_exists",record_exists)
138
+ async with aconn.cursor(row_factory=dict_row) as cur:
139
+ exec_str = "SELECT * FROM {table_name} WHERE id=%s".format(
140
+ table_name=table_name
141
+ ), (self.exp_id,)
142
+ await cur.execute(exec_str) # type:ignore
143
+ logger.debug(f"table:{table_name} sql: {exec_str}")
144
+ record_exists = await cur.fetchall()
134
145
  if record_exists:
135
146
  # UPDATE
136
147
  columns = ", ".join(
137
148
  f"{key} = %s" for key, _ in TO_UPDATE_EXP_INFO_KEYS_AND_TYPES
138
149
  )
139
150
  update_sql = psycopg.sql.SQL(
140
- f"UPDATE {{}} SET {columns} WHERE id='{self.exp_id}'" # type:ignore
151
+ f"UPDATE {{}} SET {columns} WHERE id='{self.exp_id}'" # type:ignore
141
152
  ).format(psycopg.sql.Identifier(table_name))
142
153
  params = [
143
154
  _type(exp_info[key]) if _type is not None else exp_info[key]
144
155
  for key, _type in TO_UPDATE_EXP_INFO_KEYS_AND_TYPES
145
- ]# + [self.exp_id]
156
+ ]
157
+ logger.debug(
158
+ f"table:{table_name} sql: {update_sql} values: {params}"
159
+ )
146
160
  await cur.execute(update_sql, params)
147
161
  else:
148
162
  # INSERT
149
- keys = ", ".join(key for key, _ in TO_UPDATE_EXP_INFO_KEYS_AND_TYPES)
150
- placeholders = ", ".join(["%s"] * len(TO_UPDATE_EXP_INFO_KEYS_AND_TYPES))
163
+ keys = ", ".join(
164
+ key for key, _ in TO_UPDATE_EXP_INFO_KEYS_AND_TYPES
165
+ )
166
+ placeholders = ", ".join(
167
+ ["%s"] * len(TO_UPDATE_EXP_INFO_KEYS_AND_TYPES)
168
+ )
151
169
  insert_sql = psycopg.sql.SQL(
152
- f"INSERT INTO {{}} ({keys}) VALUES ({placeholders})" # type:ignore
170
+ f"INSERT INTO {{}} ({keys}) VALUES ({placeholders})" # type:ignore
153
171
  ).format(psycopg.sql.Identifier(table_name))
154
172
  params = [
155
173
  _type(exp_info[key]) if _type is not None else exp_info[key]
156
174
  for key, _type in TO_UPDATE_EXP_INFO_KEYS_AND_TYPES
157
175
  ]
176
+ logger.debug(
177
+ f"table:{table_name} sql: {insert_sql} values: {params}"
178
+ )
158
179
  await cur.execute(insert_sql, params)
159
180
  await aconn.commit()
@@ -0,0 +1,11 @@
1
+ from .avro_schema import (DIALOG_SCHEMA, INSTITUTION_STATUS_SCHEMA,
2
+ PROFILE_SCHEMA, STATUS_SCHEMA, SURVEY_SCHEMA)
3
+ from .pg_query import PGSQL_DICT, TO_UPDATE_EXP_INFO_KEYS_AND_TYPES
4
+ from .survey_util import process_survey_for_llm
5
+
6
+ __all__ = [
7
+ "PROFILE_SCHEMA", "DIALOG_SCHEMA", "STATUS_SCHEMA", "SURVEY_SCHEMA", "INSTITUTION_STATUS_SCHEMA",
8
+ "process_survey_for_llm",
9
+ "TO_UPDATE_EXP_INFO_KEYS_AND_TYPES",
10
+ "PGSQL_DICT",
11
+ ]
@@ -78,3 +78,15 @@ PGSQL_DICT: dict[str, list[Any]] = {
78
78
  "CREATE INDEX {table_name}_day_t_idx ON {table_name} (day,t)",
79
79
  ],
80
80
  }
81
+ TO_UPDATE_EXP_INFO_KEYS_AND_TYPES: list[tuple[str, Any]] = [
82
+ ("id", None),
83
+ ("name", str),
84
+ ("num_day", int),
85
+ ("status", int),
86
+ ("cur_day", int),
87
+ ("cur_t", float),
88
+ ("config", str),
89
+ ("error", str),
90
+ ("created_at", None),
91
+ ("updated_at", None),
92
+ ]
@@ -3,7 +3,7 @@ in-project = true
3
3
 
4
4
  [tool.poetry]
5
5
  name = "pycityagent"
6
- version = "2.0.0a37"
6
+ version = "2.0.0a39"
7
7
  description = "LLM-based城市环境agent构建库"
8
8
  authors = ["Yuwei Yan <pinkgranite86@gmail.com>","Junbo Yan <yanjb20thu@gmali.com>"]
9
9
  license = "MIT"
@@ -1,7 +0,0 @@
1
- from .avro_schema import PROFILE_SCHEMA, DIALOG_SCHEMA, STATUS_SCHEMA, SURVEY_SCHEMA, INSTITUTION_STATUS_SCHEMA
2
- from .survey_util import process_survey_for_llm
3
-
4
- __all__ = [
5
- "PROFILE_SCHEMA", "DIALOG_SCHEMA", "STATUS_SCHEMA", "SURVEY_SCHEMA", "INSTITUTION_STATUS_SCHEMA",
6
- "process_survey_for_llm"
7
- ]
File without changes