Player 2 (#3)

Decision Making (not finish)
This commit is contained in:
Luca De Laurentiis
2025-04-12 21:47:57 +02:00
committed by GitHub
parent 3f9de128be
commit bc2ea68332
4 changed files with 33 additions and 60 deletions

4
app.py
View File

@ -7,6 +7,7 @@ import config
from dto.requests import GameStartRequestDTO, GameDecisionRequestDTO from dto.requests import GameStartRequestDTO, GameDecisionRequestDTO
from dto.responses import GameStartResponseWithBotDecisionDTO from dto.responses import GameStartResponseWithBotDecisionDTO
from services.julius_baer_api_client import JuliusBaerApiClient from services.julius_baer_api_client import JuliusBaerApiClient
from services.player import Player
app = Flask(__name__) app = Flask(__name__)
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - [%(module)s] - %(message)s') logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - [%(module)s] - %(message)s')
@ -18,6 +19,7 @@ jb_client = JuliusBaerApiClient()
def new_game(): def new_game():
game_start_request = GameStartRequestDTO(player_name=config.API_TEAM) game_start_request = GameStartRequestDTO(player_name=config.API_TEAM)
res = jb_client.start_game(game_start_request) res = jb_client.start_game(game_start_request)
bot_decision = Player().make_decision(res.client_data)
res_with_bot_decision = GameStartResponseWithBotDecisionDTO( res_with_bot_decision = GameStartResponseWithBotDecisionDTO(
message=res.message, message=res.message,
@ -26,7 +28,7 @@ def new_game():
client_id=res.client_id, client_id=res.client_id,
client_data=res.client_data, client_data=res.client_data,
score=res.score, score=res.score,
bot_decision="Accept" # TODO: Get decision from bot bot_decision=bot_decision
) )
return res_with_bot_decision.model_dump_json() return res_with_bot_decision.model_dump_json()

View File

@ -1,35 +0,0 @@
client_id,decision
cdd60b2d-34eb-4db4-9d5e-8e903bbb4057,Accept
7b48afa1-6db3-4762-8faf-e73b5158f6b0,Accept
32eeffdc-91ab-4518-8dc6-4d805c5e4aed,Accept
1b97cefc-48ab-437f-8cd0-ffd4eaa707df,Accept
5471d561-b89b-4317-b3ed-499b5334e424,Accept
a482b28b-6f4c-4f2d-a167-42c071a92470,Accept
2d7d0293-291c-46ec-91fb-75351be347f8,Accept
3006006d-1060-4b53-afd3-b702a8fc2358,Accept
f4a42e3e-75a8-43dc-92fe-e38fe23b1d82,Accept
a5e06a84-2b05-47d1-8149-649d7a9e8bb6,Accept
36adf081-fef6-4696-81da-e6ba73a6c8a0,Accept
154b3c9d-a2e0-4d40-bb39-f3a249b26bc2,Accept
71fdff4e-466a-40c8-a944-4958be13f974,Accept
7b20c9c6-1bd6-4675-9e46-9b9829e50252,Accept
1591ebcd-d0c2-44c7-b130-72f9a15c8a35,Accept
10fd6524-a2a0-4ecf-953e-6c758f7147dc,Accept
44418b3d-e2cd-4105-a599-5165c00c4971,Accept
06dcf9d6-3ec4-451c-9bf4-75cb9c8061ee,Accept
d1d0eb32-9f99-422c-a404-606b4d5c3a10,Accept
3efa6b4e-8a4b-43d8-b570-0d02dd28b5ee,Accept
42d0b5e4-03ab-4199-a74b-2f3fbe68680a,Accept
1ad14242-15a9-4142-bc1f-c3fdd1165021,Accept
e11b296a-5278-49de-a6b1-01aa31a508c4,Accept
ad6b6980-7b2e-4af9-bda0-2ec004574211,Accept
ac62e33d-6645-4360-8e14-21bfb0b6902a,Accept
d5789f9c-a0f4-4663-9c6e-0d416bbbffb8,Accept
25a429d6-bd8a-45d2-af1d-a0b8e5ec2e72,Accept
e592968f-4970-4aad-82d5-9f9383e3ae57,Accept
ef70356d-5014-498e-9897-643b6bc88dab,Accept
87db27e8-e1ff-4915-8dd2-2dc4afb570a4,Accept
161cffea-a125-4496-a0fc-17d21e2ae512,Accept
aaa05711-5e4b-455e-9971-fdba386441e9,Accept
3709c954-6c2e-42a5-90f7-8b73c374943f,Accept
f3054c1b-ad4a-4cad-be7b-03cb192f5c45,Accept
1 client_id decision
2 cdd60b2d-34eb-4db4-9d5e-8e903bbb4057 Accept
3 7b48afa1-6db3-4762-8faf-e73b5158f6b0 Accept
4 32eeffdc-91ab-4518-8dc6-4d805c5e4aed Accept
5 1b97cefc-48ab-437f-8cd0-ffd4eaa707df Accept
6 5471d561-b89b-4317-b3ed-499b5334e424 Accept
7 a482b28b-6f4c-4f2d-a167-42c071a92470 Accept
8 2d7d0293-291c-46ec-91fb-75351be347f8 Accept
9 3006006d-1060-4b53-afd3-b702a8fc2358 Accept
10 f4a42e3e-75a8-43dc-92fe-e38fe23b1d82 Accept
11 a5e06a84-2b05-47d1-8149-649d7a9e8bb6 Accept
12 36adf081-fef6-4696-81da-e6ba73a6c8a0 Accept
13 154b3c9d-a2e0-4d40-bb39-f3a249b26bc2 Accept
14 71fdff4e-466a-40c8-a944-4958be13f974 Accept
15 7b20c9c6-1bd6-4675-9e46-9b9829e50252 Accept
16 1591ebcd-d0c2-44c7-b130-72f9a15c8a35 Accept
17 10fd6524-a2a0-4ecf-953e-6c758f7147dc Accept
18 44418b3d-e2cd-4105-a599-5165c00c4971 Accept
19 06dcf9d6-3ec4-451c-9bf4-75cb9c8061ee Accept
20 d1d0eb32-9f99-422c-a404-606b4d5c3a10 Accept
21 3efa6b4e-8a4b-43d8-b570-0d02dd28b5ee Accept
22 42d0b5e4-03ab-4199-a74b-2f3fbe68680a Accept
23 1ad14242-15a9-4142-bc1f-c3fdd1165021 Accept
24 e11b296a-5278-49de-a6b1-01aa31a508c4 Accept
25 ad6b6980-7b2e-4af9-bda0-2ec004574211 Accept
26 ac62e33d-6645-4360-8e14-21bfb0b6902a Accept
27 d5789f9c-a0f4-4663-9c6e-0d416bbbffb8 Accept
28 25a429d6-bd8a-45d2-af1d-a0b8e5ec2e72 Accept
29 e592968f-4970-4aad-82d5-9f9383e3ae57 Accept
30 ef70356d-5014-498e-9897-643b6bc88dab Accept
31 87db27e8-e1ff-4915-8dd2-2dc4afb570a4 Accept
32 161cffea-a125-4496-a0fc-17d21e2ae512 Accept
33 aaa05711-5e4b-455e-9971-fdba386441e9 Accept
34 3709c954-6c2e-42a5-90f7-8b73c374943f Accept
35 f3054c1b-ad4a-4cad-be7b-03cb192f5c45 Accept

View File

@ -4,8 +4,10 @@ import time
from typing import Literal, Dict, Any from typing import Literal, Dict, Any
import config import config
from dto.requests import GameStartRequestDTO, GameDecisionRequestDTO from dto.requests import GameStartRequestDTO, GameDecisionRequestDTO
from services.extractor import extract_profile, extract_passport, extract_description, extract_account
from services.julius_baer_api_client import JuliusBaerApiClient from services.julius_baer_api_client import JuliusBaerApiClient
from utils.storage.game_files_manager import store_game_round_data, store_decision from utils.storage.game_files_manager import store_game_round_data
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -34,10 +36,10 @@ class Player:
start_response = self.client.start_game(payload) start_response = self.client.start_game(payload)
log.info('game started, session id: %s', start_response.session_id) log.info('game started, session id: %s', start_response.session_id)
client_id = start_response.client_id
decision = self.make_decision(start_response.client_data) decision = self.make_decision(start_response.client_data)
decision_counter = 0 decision_counter = 0
client_id = start_response.client_id
is_game_running = True is_game_running = True
while is_game_running: while is_game_running:
@ -53,8 +55,6 @@ class Player:
status = decision_response.status status = decision_response.status
is_game_running = status not in ['gameover', 'complete'] is_game_running = status not in ['gameover', 'complete']
if is_game_running:
store_decision(str(client_id), decision)
client_id = decision_response.client_id client_id = decision_response.client_id
decision = self.make_decision(decision_response.client_data) decision = self.make_decision(decision_response.client_data)
@ -71,11 +71,31 @@ class Player:
time.sleep(1) time.sleep(1)
def make_decision(self, client_data: Dict[str, Any]) -> Literal["Accept", "Reject"]: def make_decision(self, client_data: Dict[str, Any]) -> Literal["Accept", "Reject"]:
# Do your magic! # Data extraction
profile = extract_profile(client_data)
passport = extract_passport(client_data)
description = extract_description(client_data)
account = extract_account(client_data)
prompt_template = (
"You are a helpful assistant at a private bank.\n"
"Your task is to accept or reject a new client's application for private banking.\n\n"
"Only reject the application if there is an inconsistency in the data provided.\n"
"Inconsistencies include:\n"
"- Incorrect data (e.g., mismatched or invalid information)\n"
"- Incomplete data (e.g., missing required fields)\n\n"
"Return only JSON matching this format:\n"
"{format_instructions}\n\n"
"Here is the extracted passport text:\n"
"{processed_text}\n\n"
"Use the extracted profile, description, and account details to check consistency."
)
# You'd insert the format instructions and passport text here before calling the LLM
# For example:
# final_prompt = prompt_template.format(
# format_instructions=your_format_instructions,
# processed_text=passport['text']
# )
return 'Accept' # Replace me!! return 'Accept' # Replace me!!

View File

@ -4,7 +4,6 @@ import logging
import config import config
import json import json
from typing import Dict, Any from typing import Dict, Any
import csv
from pathlib import Path from pathlib import Path
from dto.responses import GameStartResponseDTO, GameDecisionResponseDTO from dto.responses import GameStartResponseDTO, GameDecisionResponseDTO
@ -129,16 +128,3 @@ def store_game_round_data(decision: str, response: GameStartResponseDTO | GameDe
except Exception as e: except Exception as e:
logging.error(f"[!] Failed to save API response JSON: {e}") logging.error(f"[!] Failed to save API response JSON: {e}")
def store_decision(client_id: str, decision: str):
path = Path('./resources/decision_log2.csv') # TODO clean me!!
path.parent.mkdir(parents=True, exist_ok=True) # create dirs if needed
exists = path.exists()
with open(path, 'a', newline='') as f:
writer = csv.writer(f)
if not exists:
writer.writerow(['client_id', 'decision']) # header
writer.writerow([client_id, decision])