ajout boucle refus projet final, TODO : correction QA, verif arborescence mini
This commit is contained in:
@@ -12,7 +12,7 @@ from langchain_core.runnables import RunnableConfig
|
|||||||
async def pm_node(state: WorkflowState):
|
async def pm_node(state: WorkflowState):
|
||||||
history = state.get("chat_history", []) or []
|
history = state.get("chat_history", []) or []
|
||||||
|
|
||||||
if state.get("status") == "spec_incomplete" and state.get("user_feedback"):
|
if state.get("status") in ["spec_incomplete", "human_refused"] and state.get("user_feedback"):
|
||||||
current_input = state["user_feedback"]
|
current_input = state["user_feedback"]
|
||||||
full_user_input = f"{state['user_input']}\n{current_input}"
|
full_user_input = f"{state['user_input']}\n{current_input}"
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ async def render_workflow_state(new_state: dict):
|
|||||||
res = await cl.AskActionMessage(
|
res = await cl.AskActionMessage(
|
||||||
content="**Souhaitez-vous valider et packager ce livrable ?**",
|
content="**Souhaitez-vous valider et packager ce livrable ?**",
|
||||||
actions=[
|
actions=[
|
||||||
cl.Action(name="valider_projet", payload={"value": "approve"}, label="🚀 Valider & Livrer", description="Génère l'archive et indexe le projet"),
|
cl.Action(name="valider_projet", payload={"value": "approve"}, label="✅ Valider & Livrer", description="Génère l'archive et indexe le projet"),
|
||||||
cl.Action(name="refuser_projet", payload={"value": "refuse"}, label="❌ Refuser et corriger", description="Renvoie le projet au PM avec vos commentaires")
|
cl.Action(name="refuser_projet", payload={"value": "refuse"}, label="❌ Refuser et corriger", description="Renvoie le projet au PM avec vos commentaires")
|
||||||
],
|
],
|
||||||
timeout=3600
|
timeout=3600
|
||||||
@@ -163,16 +163,14 @@ async def render_workflow_state(new_state: dict):
|
|||||||
cl.user_session.set("graph_state", final_state)
|
cl.user_session.set("graph_state", final_state)
|
||||||
|
|
||||||
elif res and res.get("name") == "refuser_projet":
|
elif res and res.get("name") == "refuser_projet":
|
||||||
await cl.Message(content="❌ **Projet refusé.**").send()
|
|
||||||
feedback_user = await cl.AskUserMessage(
|
feedback_user = await cl.AskUserMessage(
|
||||||
content="📝 Veuillez décrire les corrections ou les modifications à apporter au projet :",
|
content="Veuillez décrire les corrections ou les modifications à apporter au projet.",
|
||||||
timeout=600
|
timeout=600
|
||||||
).send()
|
).send()
|
||||||
|
|
||||||
if feedback_user:
|
if feedback_user:
|
||||||
new_state["status"] = "human_refused"
|
new_state["status"] = "human_refused"
|
||||||
new_state["user_feedback"] = feedback_user["output"]
|
new_state["user_feedback"] = feedback_user["output"]
|
||||||
new_state["status"] = "spec_incomplete"
|
|
||||||
cl.user_session.set("graph_state", new_state)
|
cl.user_session.set("graph_state", new_state)
|
||||||
|
|
||||||
await cl.Message(content="🔄 **Feedback transmis.** Prise en compte des modifications...").send()
|
await cl.Message(content="🔄 **Feedback transmis.** Prise en compte des modifications...").send()
|
||||||
@@ -183,9 +181,7 @@ async def render_workflow_state(new_state: dict):
|
|||||||
loop_state = resp.json()
|
loop_state = resp.json()
|
||||||
cl.user_session.set("graph_state", loop_state)
|
cl.user_session.set("graph_state", loop_state)
|
||||||
|
|
||||||
if loop_state.get("status") == "spec_incomplete":
|
await render_workflow_state(loop_state)
|
||||||
question = loop_state.get("spec", {}).get("clarifying_question")
|
|
||||||
await cl.Message(content=f"**ARC a analysé vos retours mais a besoin d'une précision :**\n\n{question}").send()
|
|
||||||
|
|
||||||
elif current_status == "delivered":
|
elif current_status == "delivered":
|
||||||
await cl.Message(content="✅ Ce projet a déjà été traité et livré.").send()
|
await cl.Message(content="✅ Ce projet a déjà été traité et livré.").send()
|
||||||
@@ -201,6 +197,10 @@ async def on_open_file(action: cl.Action):
|
|||||||
filename = action.payload.get("filename")
|
filename = action.payload.get("filename")
|
||||||
files = cl.user_session.get("current_files", {})
|
files = cl.user_session.get("current_files", {})
|
||||||
content = files.get(filename, "")
|
content = files.get(filename, "")
|
||||||
|
if content is None:
|
||||||
|
content = ""
|
||||||
|
if not str(content).strip():
|
||||||
|
content = "(Fichier vide)"
|
||||||
|
|
||||||
ext = filename.split(".")[-1] if "." in filename else "text"
|
ext = filename.split(".")[-1] if "." in filename else "text"
|
||||||
is_md = ext in ("md", "markdown")
|
is_md = ext in ("md", "markdown")
|
||||||
@@ -214,7 +214,7 @@ async def on_open_file(action: cl.Action):
|
|||||||
|
|
||||||
new_viewer = cl.Text(
|
new_viewer = cl.Text(
|
||||||
name=filename,
|
name=filename,
|
||||||
content=content,
|
content=str(content),
|
||||||
language=None if is_md else ext,
|
language=None if is_md else ext,
|
||||||
display="side",
|
display="side",
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user