langroid 0.10.0__py3-none-any.whl → 0.10.2__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.
- langroid/agent/base.py +57 -45
- langroid/agent/chat_agent.py +10 -1
- langroid/agent/special/lance_rag/critic_agent.py +1 -0
- langroid/agent/special/lance_rag/lance_rag_task.py +2 -0
- langroid/agent/special/lance_rag/query_planner_agent.py +1 -0
- langroid/agent/task.py +1 -4
- langroid/agent/tool_message.py +11 -0
- langroid/parsing/code_parser.py +2 -0
- {langroid-0.10.0.dist-info → langroid-0.10.2.dist-info}/METADATA +4 -1
- {langroid-0.10.0.dist-info → langroid-0.10.2.dist-info}/RECORD +13 -13
- pyproject.toml +4 -3
- {langroid-0.10.0.dist-info → langroid-0.10.2.dist-info}/LICENSE +0 -0
- {langroid-0.10.0.dist-info → langroid-0.10.2.dist-info}/WHEEL +0 -0
langroid/agent/base.py
CHANGED
@@ -150,7 +150,6 @@ class Agent(ABC):
|
|
150
150
|
show_start_response=noop_fn,
|
151
151
|
)
|
152
152
|
Agent.init_state(self)
|
153
|
-
self.init_state()
|
154
153
|
|
155
154
|
def init_state(self) -> None:
|
156
155
|
"""Initialize all state vars. Called by Task.run() if restart is True"""
|
@@ -1069,9 +1068,12 @@ class Agent(ABC):
|
|
1069
1068
|
return None
|
1070
1069
|
if len(tools) == 0:
|
1071
1070
|
fallback_result = self.handle_message_fallback(msg)
|
1072
|
-
if fallback_result is
|
1073
|
-
return
|
1074
|
-
return
|
1071
|
+
if fallback_result is None:
|
1072
|
+
return None
|
1073
|
+
return self._process_handle_message_result(
|
1074
|
+
fallback_result,
|
1075
|
+
chat_doc=msg if isinstance(msg, ChatDocument) else None,
|
1076
|
+
)
|
1075
1077
|
has_ids = all([t.id != "" for t in tools])
|
1076
1078
|
chat_doc = msg if isinstance(msg, ChatDocument) else None
|
1077
1079
|
|
@@ -1162,9 +1164,7 @@ class Agent(ABC):
|
|
1162
1164
|
final = "\n\n".join(str_results)
|
1163
1165
|
return final
|
1164
1166
|
|
1165
|
-
def handle_message_fallback(
|
1166
|
-
self, msg: str | ChatDocument
|
1167
|
-
) -> str | ChatDocument | None:
|
1167
|
+
def handle_message_fallback(self, msg: str | ChatDocument) -> Any:
|
1168
1168
|
"""
|
1169
1169
|
Fallback method for the "no-tools" scenario.
|
1170
1170
|
This method can be overridden by subclasses, e.g.,
|
@@ -1174,8 +1174,7 @@ class Agent(ABC):
|
|
1174
1174
|
Args:
|
1175
1175
|
msg (str | ChatDocument): The input msg to handle
|
1176
1176
|
Returns:
|
1177
|
-
|
1178
|
-
be handled by LLM
|
1177
|
+
Any: The result of the handler method
|
1179
1178
|
"""
|
1180
1179
|
return None
|
1181
1180
|
|
@@ -1261,6 +1260,52 @@ class Agent(ABC):
|
|
1261
1260
|
raise ve
|
1262
1261
|
return message
|
1263
1262
|
|
1263
|
+
def _process_handle_message_result(
|
1264
|
+
self,
|
1265
|
+
msg: Any,
|
1266
|
+
orig_tool_name: str | None = None,
|
1267
|
+
chat_doc: Optional[ChatDocument] = None,
|
1268
|
+
) -> None | str | ChatDocument:
|
1269
|
+
"""
|
1270
|
+
Process result of agent_response or tool handler, or handle_message_fallback.
|
1271
|
+
"""
|
1272
|
+
if isinstance(msg, ToolMessage):
|
1273
|
+
# result is a ToolMessage, so...
|
1274
|
+
result_tool_name = msg.default_value("request")
|
1275
|
+
if result_tool_name in self.llm_tools_handled and (
|
1276
|
+
orig_tool_name is None or orig_tool_name != result_tool_name
|
1277
|
+
):
|
1278
|
+
# TODO: do we need to remove the tool message from the chat_doc?
|
1279
|
+
# if (chat_doc is not None and
|
1280
|
+
# msg in chat_doc.tool_messages):
|
1281
|
+
# chat_doc.tool_messages.remove(msg)
|
1282
|
+
# if we can handle it, do so
|
1283
|
+
result = self.handle_tool_message(msg, chat_doc=chat_doc)
|
1284
|
+
else:
|
1285
|
+
# else wrap it in an agent response and return it so
|
1286
|
+
# orchestrator can find a respondent
|
1287
|
+
result = self.create_agent_response(tool_messages=[msg])
|
1288
|
+
elif isinstance(msg, (ChatDocument, str)):
|
1289
|
+
result = msg
|
1290
|
+
elif isinstance(msg, BaseModel):
|
1291
|
+
result = msg.json()
|
1292
|
+
else:
|
1293
|
+
# last resort: use json.dumps() or str() to make it a str
|
1294
|
+
try:
|
1295
|
+
result = json.dumps(msg)
|
1296
|
+
except Exception:
|
1297
|
+
try:
|
1298
|
+
result = str(msg)
|
1299
|
+
except Exception as e:
|
1300
|
+
logger.error(
|
1301
|
+
f"""
|
1302
|
+
Error converting msg handler result to str: {e}",
|
1303
|
+
""",
|
1304
|
+
exc_info=True,
|
1305
|
+
)
|
1306
|
+
result = None
|
1307
|
+
return result
|
1308
|
+
|
1264
1309
|
def handle_tool_message(
|
1265
1310
|
self,
|
1266
1311
|
tool: ToolMessage,
|
@@ -1290,42 +1335,9 @@ class Agent(ABC):
|
|
1290
1335
|
maybe_result = handler_method(tool, chat_doc=chat_doc)
|
1291
1336
|
else:
|
1292
1337
|
maybe_result = handler_method(tool)
|
1293
|
-
|
1294
|
-
|
1295
|
-
|
1296
|
-
if (
|
1297
|
-
result_tool_name in self.llm_tools_handled
|
1298
|
-
and tool_name != result_tool_name
|
1299
|
-
):
|
1300
|
-
# TODO: do we need to remove the tool message from the chat_doc?
|
1301
|
-
# if (chat_doc is not None and
|
1302
|
-
# maybe_result in chat_doc.tool_messages):
|
1303
|
-
# chat_doc.tool_messages.remove(maybe_result)
|
1304
|
-
# if we can handle it, do so
|
1305
|
-
result = self.handle_tool_message(maybe_result, chat_doc=chat_doc)
|
1306
|
-
else:
|
1307
|
-
# else wrap it in an agent response and return it so
|
1308
|
-
# orchestrator can find a respondent
|
1309
|
-
result = self.create_agent_response(tool_messages=[maybe_result])
|
1310
|
-
elif isinstance(maybe_result, (ChatDocument, str)):
|
1311
|
-
result = maybe_result
|
1312
|
-
elif isinstance(maybe_result, BaseModel):
|
1313
|
-
result = maybe_result.json()
|
1314
|
-
else:
|
1315
|
-
# last resort: use json.dumps() or str() to make it a str
|
1316
|
-
try:
|
1317
|
-
result = json.dumps(maybe_result)
|
1318
|
-
except Exception:
|
1319
|
-
try:
|
1320
|
-
result = str(maybe_result)
|
1321
|
-
except Exception as e:
|
1322
|
-
logger.error(
|
1323
|
-
f"""
|
1324
|
-
Error converting result of {tool_name} to str: {e}",
|
1325
|
-
""",
|
1326
|
-
exc_info=True,
|
1327
|
-
)
|
1328
|
-
result = None
|
1338
|
+
result = self._process_handle_message_result(
|
1339
|
+
maybe_result, tool_name, chat_doc
|
1340
|
+
)
|
1329
1341
|
except Exception as e:
|
1330
1342
|
# raise the error here since we are sure it's
|
1331
1343
|
# not a pydantic validation error,
|
langroid/agent/chat_agent.py
CHANGED
@@ -118,7 +118,7 @@ class ChatAgent(Agent):
|
|
118
118
|
self.config: ChatAgentConfig = config
|
119
119
|
self.config._set_fn_or_tools(self._fn_call_available())
|
120
120
|
self.message_history: List[LLMMessage] = []
|
121
|
-
self.
|
121
|
+
self.init_state()
|
122
122
|
# An agent's "task" is defined by a system msg and an optional user msg;
|
123
123
|
# These are "priming" messages that kick off the agent's conversation.
|
124
124
|
self.system_message: str = self.config.system_message
|
@@ -172,6 +172,15 @@ class ChatAgent(Agent):
|
|
172
172
|
self.enable_message(SendTool, use=False, handle=True)
|
173
173
|
self.enable_message(AgentSendTool, use=False, handle=True)
|
174
174
|
|
175
|
+
def init_state(self) -> None:
|
176
|
+
"""
|
177
|
+
Initialize the state of the agent. Just conversation state here,
|
178
|
+
but subclasses can override this to initialize other state.
|
179
|
+
"""
|
180
|
+
super().init_state()
|
181
|
+
self.clear_history(0)
|
182
|
+
self.clear_dialog()
|
183
|
+
|
175
184
|
@staticmethod
|
176
185
|
def from_id(id: str) -> "ChatAgent":
|
177
186
|
"""
|
@@ -169,6 +169,7 @@ class QueryPlanCritic(ChatAgent):
|
|
169
169
|
self.enable_message(AgentDoneTool, use=False, handle=True)
|
170
170
|
|
171
171
|
def init_state(self) -> None:
|
172
|
+
super().init_state()
|
172
173
|
self.expecting_feedback_tool = False
|
173
174
|
|
174
175
|
def query_plan_answer(self, msg: QueryPlanAnswerTool) -> str:
|
@@ -51,11 +51,13 @@ class LanceRAGTaskCreator:
|
|
51
51
|
critic_name=critic_name,
|
52
52
|
doc_agent_name=doc_agent_name,
|
53
53
|
doc_schema=agent._get_clean_vecdb_schema(),
|
54
|
+
llm=agent.config.llm,
|
54
55
|
)
|
55
56
|
query_plan_agent_config.set_system_message()
|
56
57
|
|
57
58
|
critic_config = QueryPlanCriticConfig(
|
58
59
|
doc_schema=agent._get_clean_vecdb_schema(),
|
60
|
+
llm=agent.config.llm,
|
59
61
|
)
|
60
62
|
critic_config.set_system_message()
|
61
63
|
|
@@ -144,6 +144,7 @@ class LanceQueryPlanAgent(ChatAgent):
|
|
144
144
|
self.enable_message(AgentDoneTool, use=False, handle=True)
|
145
145
|
|
146
146
|
def init_state(self) -> None:
|
147
|
+
super().init_state()
|
147
148
|
self.curr_query_plan: QueryPlan | None = None
|
148
149
|
self.expecting_query_plan: bool = False
|
149
150
|
# how many times re-trying query plan in response to feedback:
|
langroid/agent/task.py
CHANGED
@@ -259,8 +259,7 @@ class Task:
|
|
259
259
|
agent = cast(ChatAgent, agent)
|
260
260
|
self.agent: ChatAgent = agent
|
261
261
|
if isinstance(agent, ChatAgent) and len(agent.message_history) == 0 or restart:
|
262
|
-
self.agent.
|
263
|
-
self.agent.clear_dialog()
|
262
|
+
self.agent.init_state()
|
264
263
|
# possibly change the system and user messages
|
265
264
|
if system_message:
|
266
265
|
# we always have at least 1 task_message
|
@@ -579,8 +578,6 @@ class Task:
|
|
579
578
|
Recursively reset message history & state of own agent and
|
580
579
|
those of all sub-tasks.
|
581
580
|
"""
|
582
|
-
self.agent.clear_history(0)
|
583
|
-
self.agent.clear_dialog()
|
584
581
|
self.agent.init_state()
|
585
582
|
for t in self.sub_tasks:
|
586
583
|
t.reset_all_sub_tasks()
|
langroid/agent/tool_message.py
CHANGED
@@ -296,6 +296,17 @@ class FinalResultTool(ToolMessage):
|
|
296
296
|
|
297
297
|
request: str = ""
|
298
298
|
purpose: str = "Ignored; Wrapper for a structured message"
|
299
|
+
id: str = "" # placeholder for OpenAI-API tool_call_id
|
300
|
+
|
301
|
+
_handle_only: bool = False # only allow handling, but not use (LLM-generation)?
|
299
302
|
|
300
303
|
class Config:
|
301
304
|
extra = Extra.allow
|
305
|
+
# only HANDLING allowed, NOT "use" (i.e LLM generation)
|
306
|
+
handle_only: bool = False
|
307
|
+
arbitrary_types_allowed = False
|
308
|
+
validate_all = True
|
309
|
+
validate_assignment = True
|
310
|
+
# do not include these fields in the generated schema
|
311
|
+
# since we don't require the LLM to specify them
|
312
|
+
schema_extra = {"exclude": {"purpose", "id"}}
|
langroid/parsing/code_parser.py
CHANGED
@@ -115,5 +115,7 @@ class CodeParser:
|
|
115
115
|
for d in docs
|
116
116
|
if d.metadata.language in self.config.extensions # type: ignore
|
117
117
|
]
|
118
|
+
if len(chunked_docs) == 0:
|
119
|
+
return []
|
118
120
|
# collapse the list of lists into a single list
|
119
121
|
return reduce(lambda x, y: x + y, chunked_docs)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: langroid
|
3
|
-
Version: 0.10.
|
3
|
+
Version: 0.10.2
|
4
4
|
Summary: Harness LLMs with Multi-Agent Programming
|
5
5
|
License: MIT
|
6
6
|
Author: Prasad Chalasani
|
@@ -162,6 +162,9 @@ into simplifying the developer experience; it does not use `Langchain`.
|
|
162
162
|
:fire: See this [Intro to Langroid](https://lancedb.substack.com/p/langoid-multi-agent-programming-framework)
|
163
163
|
blog post from the LanceDB team
|
164
164
|
|
165
|
+
:fire: Just published in ML for Healthcare (2024): a Langroid-based Multi-Agent RAG system for
|
166
|
+
pharmacovigilance, see [blog post](https://langroid.github.io/langroid/blog/2024/08/12/malade-multi-agent-architecture-for-pharmacovigilance/)
|
167
|
+
|
165
168
|
|
166
169
|
We welcome contributions -- See the [contributions](./CONTRIBUTING.md) document
|
167
170
|
for ideas on what to contribute.
|
@@ -1,10 +1,10 @@
|
|
1
1
|
langroid/__init__.py,sha256=z_fCOLQJPOw3LLRPBlFB5-2HyCjpPgQa4m4iY5Fvb8Y,1800
|
2
2
|
langroid/agent/__init__.py,sha256=CFjjVvXVEV4ac0PdNPHVQHREV2HbbHCF6wj42v5MpJ4,826
|
3
|
-
langroid/agent/base.py,sha256=
|
3
|
+
langroid/agent/base.py,sha256=PAMTnYefsDiXBXrj-b9XuBBxj8woqssxOf_0HeXiZsE,59206
|
4
4
|
langroid/agent/batch.py,sha256=feRA_yRG768ElOQjrKEefcRv6Aefd_yY7qktuYUQDwc,10040
|
5
5
|
langroid/agent/callbacks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
6
6
|
langroid/agent/callbacks/chainlit.py,sha256=Qedk1-CBCgo9PdaIa7AboLBFCTgAMg9q5nGmoqpZ378,22050
|
7
|
-
langroid/agent/chat_agent.py,sha256=
|
7
|
+
langroid/agent/chat_agent.py,sha256=nGikT3OYQsB4avePxBo4QCY3HV_BJpIItwR_ebOySE8,48378
|
8
8
|
langroid/agent/chat_document.py,sha256=DnmRLma0zud0XsN_wm-F0fnQv3fjQghv3t8Ahudq238,16799
|
9
9
|
langroid/agent/helpers.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
10
|
langroid/agent/junk,sha256=LxfuuW7Cijsg0szAzT81OjWWv1PMNI-6w_-DspVIO2s,339
|
@@ -13,9 +13,9 @@ langroid/agent/special/__init__.py,sha256=gik_Xtm_zV7U9s30Mn8UX3Gyuy4jTjQe9zjiE3
|
|
13
13
|
langroid/agent/special/doc_chat_agent.py,sha256=8NPAhMnHkFUolQ8EHos40tz5Vwuz_m33NjUfjheXWXY,54569
|
14
14
|
langroid/agent/special/lance_doc_chat_agent.py,sha256=s8xoRs0gGaFtDYFUSIRchsgDVbS5Q3C2b2mr3V1Fd-Q,10419
|
15
15
|
langroid/agent/special/lance_rag/__init__.py,sha256=QTbs0IVE2ZgDg8JJy1zN97rUUg4uEPH7SLGctFNumk4,174
|
16
|
-
langroid/agent/special/lance_rag/critic_agent.py,sha256=
|
17
|
-
langroid/agent/special/lance_rag/lance_rag_task.py,sha256=
|
18
|
-
langroid/agent/special/lance_rag/query_planner_agent.py,sha256
|
16
|
+
langroid/agent/special/lance_rag/critic_agent.py,sha256=OtFuHthKQLkdVkvuZ2m0GNq1qOYLqHkm1pfLRFnSg5c,9548
|
17
|
+
langroid/agent/special/lance_rag/lance_rag_task.py,sha256=qDouwz-Yi8aSIAVb2Jx6buTKwO2L7PSvUY604Eu0uIM,2957
|
18
|
+
langroid/agent/special/lance_rag/query_planner_agent.py,sha256=5YPeliCjlRk1LEDe5eFyqfkq9RjDfa4usjBsNmT9GsQ,11509
|
19
19
|
langroid/agent/special/lance_tools.py,sha256=qS8x4wi8mrqfbYV2ztFzrcxyhHQ0ZWOc-zkYiH7awj0,2105
|
20
20
|
langroid/agent/special/neo4j/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
21
21
|
langroid/agent/special/neo4j/csv_kg_chat.py,sha256=dRsAgMBa1H_EMI2YYgJR2Xyv1D7e4o3G9M64mTewq_c,6409
|
@@ -33,8 +33,8 @@ langroid/agent/special/sql/utils/system_message.py,sha256=qKLHkvQWRQodTtPLPxr1GS
|
|
33
33
|
langroid/agent/special/sql/utils/tools.py,sha256=vFYysk6Vi7HJjII8B4RitA3pt_z3gkSglDNdhNVMiFc,1332
|
34
34
|
langroid/agent/special/table_chat_agent.py,sha256=d9v2wsblaRx7oMnKhLV7uO_ujvk9gh59pSGvBXyeyNc,9659
|
35
35
|
langroid/agent/structured_message.py,sha256=y7pud1EgRNeTFZlJmBkLmwME3yQJ_IYik-Xds9kdZbY,282
|
36
|
-
langroid/agent/task.py,sha256=
|
37
|
-
langroid/agent/tool_message.py,sha256=
|
36
|
+
langroid/agent/task.py,sha256=3Shs5PFDTrKgbt6kyYyyHXIDc0V9z8wCubwCWKcuvmU,80448
|
37
|
+
langroid/agent/tool_message.py,sha256=OiShCp8NwG7p3fVxwLhHCxhaRp2chuzEL7FBWOqoxg4,11715
|
38
38
|
langroid/agent/tools/__init__.py,sha256=lgWAWsPgMx-NdDPVX6tXO_U0cIQX7dwzhUC0G4IfUgk,726
|
39
39
|
langroid/agent/tools/duckduckgo_search_tool.py,sha256=NhsCaGZkdv28nja7yveAhSK_w6l_Ftym8agbrdzqgfo,1935
|
40
40
|
langroid/agent/tools/extract_tool.py,sha256=u5lL9rKBzaLBOrRyLnTAZ97pQ1uxyLP39XsWMnpaZpw,3789
|
@@ -82,7 +82,7 @@ langroid/mytypes.py,sha256=ptAFxEAtiwmIfUnGisNotTe8wT9LKBf22lOfPgZoQIY,2368
|
|
82
82
|
langroid/parsing/__init__.py,sha256=ZgSAfgTC6VsTLFlRSWT-TwYco7SQeRMeZG-49MnKYGY,936
|
83
83
|
langroid/parsing/agent_chats.py,sha256=sbZRV9ujdM5QXvvuHVjIi2ysYSYlap-uqfMMUKulrW0,1068
|
84
84
|
langroid/parsing/code-parsing.md,sha256=--cyyNiSZSDlIwcjAV4-shKrSiRe2ytF3AdSoS_hD2g,3294
|
85
|
-
langroid/parsing/code_parser.py,sha256=
|
85
|
+
langroid/parsing/code_parser.py,sha256=AOxb3xbYpTBPP3goOm5dKfJdh5hS_2BhLVCEkifWZN8,3796
|
86
86
|
langroid/parsing/config.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
87
87
|
langroid/parsing/document_parser.py,sha256=WGnA5ADwMHliGJt6WW9rc4RiFXQcKU33b5zdPiGrtEY,24265
|
88
88
|
langroid/parsing/image_text.py,sha256=sbLIQ5nHe2UnYUksBaQsmZGaX-X0qgEpPd7CEzi_z5M,910
|
@@ -134,8 +134,8 @@ langroid/vector_store/meilisearch.py,sha256=6frB7GFWeWmeKzRfLZIvzRjllniZ1cYj3Hmh
|
|
134
134
|
langroid/vector_store/momento.py,sha256=qR-zBF1RKVHQZPZQYW_7g-XpTwr46p8HJuYPCkfJbM4,10534
|
135
135
|
langroid/vector_store/qdrant_cloud.py,sha256=3im4Mip0QXLkR6wiqVsjV1QvhSElfxdFSuDKddBDQ-4,188
|
136
136
|
langroid/vector_store/qdrantdb.py,sha256=v88lqFkepADvlN6lByUj9I4NEKa9X9lWH16uTPPbYrE,17457
|
137
|
-
pyproject.toml,sha256=
|
138
|
-
langroid-0.10.
|
139
|
-
langroid-0.10.
|
140
|
-
langroid-0.10.
|
141
|
-
langroid-0.10.
|
137
|
+
pyproject.toml,sha256=pfB7YUZ95hBPldXjKSFUJcyE2smbS67EpJx-glYg20U,7106
|
138
|
+
langroid-0.10.2.dist-info/LICENSE,sha256=EgVbvA6VSYgUlvC3RvPKehSg7MFaxWDsFuzLOsPPfJg,1065
|
139
|
+
langroid-0.10.2.dist-info/METADATA,sha256=kKD4a_WwpLHCOffm6vwnHpOcWEgL64uDePVAd2ku83Q,54992
|
140
|
+
langroid-0.10.2.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
141
|
+
langroid-0.10.2.dist-info/RECORD,,
|
pyproject.toml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "langroid"
|
3
|
-
version = "0.10.
|
3
|
+
version = "0.10.2"
|
4
4
|
description = "Harness LLMs with Multi-Agent Programming"
|
5
5
|
authors = ["Prasad Chalasani <pchalasani@gmail.com>"]
|
6
6
|
readme = "README.md"
|
@@ -90,6 +90,7 @@ async-generator = "^1.10"
|
|
90
90
|
python-magic = "^0.4.27"
|
91
91
|
json-repair = "^0.27.0"
|
92
92
|
|
93
|
+
|
93
94
|
[tool.poetry.extras]
|
94
95
|
# install these using, e.g.,
|
95
96
|
# `poetry install -E [...]` where [...] is one of the extras below
|
@@ -169,14 +170,14 @@ optional = true
|
|
169
170
|
|
170
171
|
mkdocs = "^1.4.2"
|
171
172
|
mkdocs-material = "^9.1.5"
|
172
|
-
mkdocstrings = {extras = ["python"], version = "^0.
|
173
|
+
mkdocstrings = {extras = ["python"], version = "^0.25.2"}
|
173
174
|
mkdocs-awesome-pages-plugin = "^2.8.0"
|
174
175
|
mkdocs-rss-plugin = "^1.8.0"
|
175
176
|
mkdocs-gen-files = "^0.4.0"
|
176
177
|
mkdocs-literate-nav = "^0.6.0"
|
177
178
|
mkdocs-section-index = "^0.3.5"
|
178
179
|
mkdocs-jupyter = "^0.24.1"
|
179
|
-
|
180
|
+
griffe = "<1.0.0"
|
180
181
|
|
181
182
|
|
182
183
|
# ========================================
|
File without changes
|
File without changes
|