Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -272,16 +272,26 @@ def step_game(state: dict, distributor_order: int):
|
|
| 272 |
demand_history_visible = state["customer_demand"][start_idx:(week - 1)]
|
| 273 |
|
| 274 |
llm_outputs = {}
|
| 275 |
-
for role in ["retailer", "wholesaler", "factory"]:
|
| 276 |
-
order_val, raw = call_llm_for_order(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 277 |
order_val = max(0, int(order_val))
|
| 278 |
-
state["orders_history"][role].append(order_val)
|
| 279 |
llm_outputs[role] = {"order": order_val, "raw": raw}
|
| 280 |
-
|
| 281 |
-
if role
|
| 282 |
-
state["
|
| 283 |
-
|
| 284 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 285 |
|
| 286 |
# 6) place orders into pipelines (will arrive after SHIPPING_LEAD_TIME)
|
| 287 |
downstream_map = {"factory": "wholesaler", "wholesaler": "distributor", "distributor": "retailer", "retailer": None}
|
|
@@ -418,14 +428,23 @@ with col_main:
|
|
| 418 |
st.markdown("---")
|
| 419 |
# Distributor form
|
| 420 |
with st.form(key=f"order_form_{participant_id}", clear_on_submit=False):
|
| 421 |
-
|
| 422 |
-
|
| 423 |
-
|
| 424 |
-
|
| 425 |
-
|
| 426 |
-
|
| 427 |
-
|
| 428 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 429 |
|
| 430 |
st.markdown("---")
|
| 431 |
pending = st.session_state.get("pending_orders", {}).get(participant_id, None)
|
|
|
|
| 272 |
demand_history_visible = state["customer_demand"][start_idx:(week - 1)]
|
| 273 |
|
| 274 |
llm_outputs = {}
|
| 275 |
+
for role in ["retailer", "wholesaler", "factory", "distributor"]:
|
| 276 |
+
order_val, raw = call_llm_for_order(
|
| 277 |
+
role,
|
| 278 |
+
state_snapshot_for_prompt(state),
|
| 279 |
+
state.get("info_sharing", False),
|
| 280 |
+
demand_history_visible
|
| 281 |
+
)
|
| 282 |
order_val = max(0, int(order_val))
|
|
|
|
| 283 |
llm_outputs[role] = {"order": order_val, "raw": raw}
|
| 284 |
+
|
| 285 |
+
if role != "distributor": # AI 决策直接生效
|
| 286 |
+
state["orders_history"][role].append(order_val)
|
| 287 |
+
if role == "retailer":
|
| 288 |
+
state["incoming_orders"]["distributor"] = order_val
|
| 289 |
+
elif role == "wholesaler":
|
| 290 |
+
state["incoming_orders"]["factory"] = order_val
|
| 291 |
+
|
| 292 |
+
# 人类 distributor 的真实 order 后面会覆盖
|
| 293 |
+
state["orders_history"]["distributor"].append(int(distributor_order))
|
| 294 |
+
state["incoming_orders"]["wholesaler"] = int(distributor_order)
|
| 295 |
|
| 296 |
# 6) place orders into pipelines (will arrive after SHIPPING_LEAD_TIME)
|
| 297 |
downstream_map = {"factory": "wholesaler", "wholesaler": "distributor", "distributor": "retailer", "retailer": None}
|
|
|
|
| 428 |
st.markdown("---")
|
| 429 |
# Distributor form
|
| 430 |
with st.form(key=f"order_form_{participant_id}", clear_on_submit=False):
|
| 431 |
+
st.write("### Your (Distributor) decision this week")
|
| 432 |
+
|
| 433 |
+
# 如果有 LLM 给的建议,就显示出来
|
| 434 |
+
last_log = state["logs"][-1] if state.get("logs") else None
|
| 435 |
+
if last_log and "llm_raw" in last_log and "distributor" in last_log["llm_raw"]:
|
| 436 |
+
suggestion = last_log["llm_raw"]["distributor"]
|
| 437 |
+
st.info(f"💡 AI suggests you order: **{suggestion}** units (you can follow or override)")
|
| 438 |
+
else:
|
| 439 |
+
st.info("💡 AI suggestion will appear after the first processed week.")
|
| 440 |
+
|
| 441 |
+
default_val = state["incoming_orders"].get("distributor", 4) or 4
|
| 442 |
+
distributor_order = st.number_input("Order to place to upstream (Wholesaler):", min_value=0, step=1, value=default_val)
|
| 443 |
+
submitted = st.form_submit_button("Submit Order (locks your decision)")
|
| 444 |
+
if submitted:
|
| 445 |
+
st.session_state.setdefault("pending_orders", {})
|
| 446 |
+
st.session_state["pending_orders"][participant_id] = int(distributor_order)
|
| 447 |
+
st.success(f"Order submitted: {distributor_order}. Now click 'Next Week' to process the week.")
|
| 448 |
|
| 449 |
st.markdown("---")
|
| 450 |
pending = st.session_state.get("pending_orders", {}).get(participant_id, None)
|