1
- import os
2
1
import time
3
2
from typing import List
4
3
from dotenv import load_dotenv
5
4
6
5
from virtuals_acp import VirtualsACP , ACPJob , ACPJobPhase
7
- from virtuals_acp .configs import BASE_SEPOLIA_CONFIG
6
+ from virtuals_acp .env import EnvSettings
8
7
9
8
load_dotenv (override = True )
10
9
11
- EVALUATOR_PRIVATE_KEY = os .environ .get ("WHITELISTED_WALLET_PRIVATE_KEY" )
12
- EVALUATOR_WALLET_ADDRESS = os .environ .get ("EVALUATOR_AGENT_WALLET_ADDRESS" )
13
10
11
+ # --- Configuration for the job polling interval ---
14
12
POLL_INTERVAL_SECONDS = 20
13
+ # --------------------------------------------------
15
14
16
- if not all ([EVALUATOR_PRIVATE_KEY , EVALUATOR_WALLET_ADDRESS ]):
17
- print ("Error: Ensure EVALUATOR_PRIVATE_KEY and EVALUATOR_WALLET_ADDRESS are set." )
18
- exit (1 )
15
+ def evaluator ():
16
+ env = EnvSettings ()
19
17
20
- def main ():
21
- print ("--- Evaluator Script (Simplified Direct Client Usage) ---" )
22
- evaluator_acp = VirtualsACP (
23
- wallet_private_key = EVALUATOR_PRIVATE_KEY ,
24
- agent_wallet_address = EVALUATOR_WALLET_ADDRESS ,
25
- config = BASE_SEPOLIA_CONFIG
18
+ acp = VirtualsACP (
19
+ wallet_private_key = env .WHITELISTED_WALLET_PRIVATE_KEY ,
20
+ agent_wallet_address = env .EVALUATOR_AGENT_WALLET_ADDRESS ,
21
+ entity_id = env .EVALUATOR_ENTITY_ID ,
26
22
)
27
- print (f"Evaluator ACP Initialized. Agent: { evaluator_acp .agent_address } " )
23
+ print (f"Evaluator ACP Initialized. Agent: { acp .agent_address } " )
28
24
29
25
evaluated_deliverables = set () # Store (job_id, deliverable_memo_id) to avoid re-evaluation
30
26
31
27
while True :
32
- print (f"\n Evaluator: Polling for jobs assigned to { EVALUATOR_WALLET_ADDRESS } requiring evaluation..." )
33
- active_jobs_list : List [ACPJob ] = evaluator_acp .get_active_jobs ()
28
+ print (f"\n Evaluator: Polling for jobs assigned to { acp . agent_address } requiring evaluation..." )
29
+ active_jobs_list : List [ACPJob ] = acp .get_active_jobs ()
34
30
35
31
if not active_jobs_list :
36
32
print ("Evaluator: No active jobs found in this poll." )
@@ -39,36 +35,40 @@ def main():
39
35
40
36
for job_summary in active_jobs_list :
41
37
onchain_job_id = job_summary .id
42
-
38
+
43
39
try :
44
- job_details = evaluator_acp .get_job_by_onchain_id (onchain_job_id )
45
- current_phase = job_details .phase
46
-
40
+ job = acp .get_job_by_onchain_id (onchain_job_id )
41
+ current_phase = job .phase
42
+
43
+ # Ensure this job is for the current evaluator
44
+ if job .evaluator_address != acp .agent_address :
45
+ continue
46
+
47
47
if current_phase == ACPJobPhase .EVALUATION :
48
48
print (f"Evaluator: Found Job { onchain_job_id } in EVALUATION phase." )
49
-
49
+
50
50
# Find the seller's deliverable memo. Its next_phase should be COMPLETED.
51
51
seller_deliverable_memo_to_sign = None
52
- for memo in reversed (job_details .memos ): # Check latest first
52
+ for memo in reversed (job .memos ): # Check latest first
53
53
if ACPJobPhase (memo .next_phase ) == ACPJobPhase .COMPLETED :
54
54
seller_deliverable_memo_to_sign = memo
55
55
break
56
-
56
+
57
57
if seller_deliverable_memo_to_sign :
58
58
deliverable_key = (onchain_job_id , seller_deliverable_memo_to_sign .id )
59
59
if deliverable_key in evaluated_deliverables :
60
- # print(f"Deliverable memo {seller_deliverable_memo_to_sign.id} for job {onchain_job_id} already processed.")
60
+ print (f"Deliverable memo { seller_deliverable_memo_to_sign .id } for job { onchain_job_id } already processed." )
61
61
continue
62
62
63
63
print (f" Job { onchain_job_id } : Found deliverable memo { seller_deliverable_memo_to_sign .id } to evaluate." )
64
64
print (f" Deliverable Content: { seller_deliverable_memo_to_sign .content } " )
65
-
65
+
66
66
# Simple evaluation logic: always accept
67
67
accept_the_delivery = True
68
68
evaluation_reason = "Deliverable looks great, approved!"
69
-
69
+
70
70
print (f" Job { onchain_job_id } : Evaluating... Accepting: { accept_the_delivery } " )
71
- evaluator_acp .evaluate_job_delivery (
71
+ acp .evaluate_job_delivery (
72
72
memo_id_of_deliverable = seller_deliverable_memo_to_sign .id ,
73
73
accept = accept_the_delivery ,
74
74
reason = evaluation_reason
@@ -77,14 +77,16 @@ def main():
77
77
evaluated_deliverables .add (deliverable_key )
78
78
else :
79
79
print (f" Job { onchain_job_id } in EVALUATION, but no deliverable memo (next_phase=COMPLETED) found yet." )
80
+ elif current_phase in [ACPJobPhase .REQUEST , ACPJobPhase .NEGOTIATION ]:
81
+ print (f"Evaluator: Job { onchain_job_id } is in { current_phase .name } phase. Waiting for job to be delivered." )
82
+ continue
80
83
elif current_phase in [ACPJobPhase .COMPLETED , ACPJobPhase .REJECTED ]:
81
84
print (f"Evaluator: Job { onchain_job_id } is already in { current_phase .name } . No action." )
82
- # Potentially add to a "handled" set if not using evaluated_deliverables
83
-
85
+
84
86
except Exception as e :
85
87
print (f"Evaluator: Error processing job { onchain_job_id } : { e } " )
86
-
88
+
87
89
time .sleep (POLL_INTERVAL_SECONDS )
88
90
89
91
if __name__ == "__main__" :
90
- main ()
92
+ evaluator ()
0 commit comments