plato-sdk-v2 2.0.64__py3-none-any.whl → 2.3.4__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.
- plato/__init__.py +0 -9
- plato/_sims_generator/__init__.py +19 -4
- plato/_sims_generator/instruction.py +203 -0
- plato/_sims_generator/templates/instruction/helpers.py.jinja +161 -0
- plato/_sims_generator/templates/instruction/init.py.jinja +43 -0
- plato/agents/__init__.py +99 -430
- plato/agents/base.py +145 -0
- plato/agents/build.py +61 -0
- plato/agents/config.py +160 -0
- plato/agents/logging.py +515 -0
- plato/agents/runner.py +191 -0
- plato/agents/trajectory.py +266 -0
- plato/chronos/models/__init__.py +1 -1
- plato/sims/cli.py +299 -123
- plato/sims/registry.py +77 -4
- plato/v1/cli/agent.py +88 -84
- plato/v1/cli/pm.py +84 -44
- plato/v1/cli/sandbox.py +241 -61
- plato/v1/cli/ssh.py +16 -4
- plato/v1/cli/verify.py +685 -0
- plato/v1/cli/world.py +3 -0
- plato/v1/flow_executor.py +21 -17
- plato/v1/models/env.py +11 -11
- plato/v1/sdk.py +2 -2
- plato/v1/sync_env.py +11 -11
- plato/v1/sync_flow_executor.py +21 -17
- plato/v1/sync_sdk.py +4 -2
- plato/v2/__init__.py +2 -0
- plato/v2/async_/environment.py +31 -0
- plato/v2/async_/session.py +72 -4
- plato/v2/sync/environment.py +31 -0
- plato/v2/sync/session.py +72 -4
- plato/worlds/README.md +71 -56
- plato/worlds/__init__.py +56 -18
- plato/worlds/base.py +578 -93
- plato/worlds/config.py +276 -74
- plato/worlds/runner.py +475 -80
- {plato_sdk_v2-2.0.64.dist-info → plato_sdk_v2-2.3.4.dist-info}/METADATA +3 -3
- {plato_sdk_v2-2.0.64.dist-info → plato_sdk_v2-2.3.4.dist-info}/RECORD +41 -36
- {plato_sdk_v2-2.0.64.dist-info → plato_sdk_v2-2.3.4.dist-info}/entry_points.txt +1 -0
- plato/agents/callback.py +0 -246
- plato/world/__init__.py +0 -44
- plato/world/base.py +0 -267
- plato/world/config.py +0 -139
- plato/world/types.py +0 -47
- {plato_sdk_v2-2.0.64.dist-info → plato_sdk_v2-2.3.4.dist-info}/WHEEL +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
plato/__init__.py,sha256=
|
|
1
|
+
plato/__init__.py,sha256=a9E0KS1602GWHHStnf7wDEuvPCvh2GpPh0Sf8oKZx5Q,1795
|
|
2
2
|
plato/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
3
|
plato/_generated/__init__.py,sha256=8BNQD2tT98Nrl8jP97bIzUxFTkb1681a1kbJExyZYuo,738
|
|
4
4
|
plato/_generated/client.py,sha256=_oMKXyAShQVddCaIKnfB2zPkRsDlCwLp-N3RFoKq_v8,5489
|
|
@@ -283,10 +283,13 @@ plato/_generated/api/v2/user/get_current_user.py,sha256=tvamtbWTEkeeNUBLSPqZIcCG
|
|
|
283
283
|
plato/_generated/api/version/__init__.py,sha256=dQXTYrXjD1RZcvWwnlqXWAZ-eAV-V-6JSNuY7uaca7o,70
|
|
284
284
|
plato/_generated/api/version/check.py,sha256=HTVNw0oi9gbvX4pOVoH4y4JywCxdl1pJTCk2PjJFwJ4,778
|
|
285
285
|
plato/_generated/models/__init__.py,sha256=VGsTMYUCCqa7r_tl5m--dwjy7viYAN20nU2HhVAibcU,154130
|
|
286
|
-
plato/_sims_generator/__init__.py,sha256=
|
|
286
|
+
plato/_sims_generator/__init__.py,sha256=Km4QOl9wxjQ5dgpdhk9QnBFJFFc9eq3rPbMWIQRjIn0,1602
|
|
287
287
|
plato/_sims_generator/cli.py,sha256=mzolN-dxfMkVAdA-vC0esnai-cGg-i4ozOw8dACefV4,2709
|
|
288
|
+
plato/_sims_generator/instruction.py,sha256=Na9M-jIdBPhp_fLuBPTicoFnWriRyi8YiZ-eQBj64HI,6644
|
|
288
289
|
plato/_sims_generator/parser.py,sha256=BbgRYllqYf7H76JyMfe7LYo1we-kh7YEOxUwrYT3shc,38347
|
|
289
290
|
plato/_sims_generator/python.py,sha256=ZYZJeOhGhYV95iB2_G-stQHaIv5sQj0jo3GXSLb6SdA,18295
|
|
291
|
+
plato/_sims_generator/templates/instruction/helpers.py.jinja,sha256=kJ8lhVLPygjMh8l-In9rLtFci6Bxg3zVoz5BZFfLKms,4937
|
|
292
|
+
plato/_sims_generator/templates/instruction/init.py.jinja,sha256=oabz8xKdkz9SjRBYwg_GoHZdz1ZrhHXOOEazw2pOczQ,879
|
|
290
293
|
plato/_sims_generator/templates/python/api_init.py.jinja,sha256=HYNtVsiGU91IzhBtBA3qlLv8b3U5kZbmW-FqdZ9F7mQ,188
|
|
291
294
|
plato/_sims_generator/templates/python/client.py.jinja,sha256=H99L4kgRfTwJs3DOC9P-DcGtHNYBDNxcOvtedWEgWYM,19755
|
|
292
295
|
plato/_sims_generator/templates/python/endpoint.py.jinja,sha256=1ToZiS8w_aZydVBhNt5KxLIbCo3toWCi4NPjLAmhVy4,12478
|
|
@@ -294,8 +297,13 @@ plato/_sims_generator/templates/python/errors.py.jinja,sha256=8L_FbHczBNLXJrbSlN
|
|
|
294
297
|
plato/_sims_generator/templates/python/package_init.py.jinja,sha256=sOcJxUT0LuOWu5jOMGGKYxfCEjcYQv1hGF3n0iOA4hQ,986
|
|
295
298
|
plato/_sims_generator/templates/python/tag_init.py.jinja,sha256=WB_9cv0JKIVg5TOXeSolET3tAfVg7sExjboh5jbCXz4,170
|
|
296
299
|
plato/_sims_generator/templates/python/version_init.py.jinja,sha256=sGvFcYVfzXFyQDAe0PSOrg9yys93KE0XInFQNb1TvCY,179
|
|
297
|
-
plato/agents/__init__.py,sha256=
|
|
298
|
-
plato/agents/
|
|
300
|
+
plato/agents/__init__.py,sha256=1l-Vw5SFydmPsl1toXdc2oH3eLhFwz6jtI_DKUx4vmo,2847
|
|
301
|
+
plato/agents/base.py,sha256=vUbPQuNSo6Ka2lIB_ZOXgi4EoAjtAD7GIj9LnNotam0,4577
|
|
302
|
+
plato/agents/build.py,sha256=CNMbVQFs2_pYit1dA29Davve28Yi4c7TNK9wBB7odrE,1621
|
|
303
|
+
plato/agents/config.py,sha256=VZVMdCmEQnoR0VkrGdScG8p6zSKVFe7BZPd2h8lKNjI,5460
|
|
304
|
+
plato/agents/logging.py,sha256=bL3Q14YeFxWCQydGKrQzQPgKQzBoCCXy_AAQPZpBylU,16307
|
|
305
|
+
plato/agents/runner.py,sha256=UQWg3gpYhWLnGLB6Bs595qH7nZV-ch-u5fPlkltT_kc,6812
|
|
306
|
+
plato/agents/trajectory.py,sha256=WdiBmua0KvCrNaM3qgPI7-7B4xmSkfbP4oZ_9_8qHzU,10529
|
|
299
307
|
plato/chronos/__init__.py,sha256=RHMvSrQS_-vkKOyTRuAkp2gKDP1HEuBLDnw8jcZs1Jg,739
|
|
300
308
|
plato/chronos/client.py,sha256=YcOGtHWERyOD9z8LKt8bRMVL0cEwL2hiAP4qQgdZlUI,5495
|
|
301
309
|
plato/chronos/errors.py,sha256=xqQIQB43nAL5urF8qc_1KUJql7KCnspULOFHLNnf83M,4199
|
|
@@ -364,32 +372,33 @@ plato/chronos/api/worlds/create_world.py,sha256=H6yl5QIazNXgryOR5rvscSIMf8Y9kjc6
|
|
|
364
372
|
plato/chronos/api/worlds/delete_world.py,sha256=UETu3Zk0e2VkDdAyMilv1ev-0g_j-oujH1Dc8DBqQOc,1239
|
|
365
373
|
plato/chronos/api/worlds/get_world.py,sha256=eHTM1U5JiNTaZwYLh7x4QVBoRQeI5kaJ9o6xSi4-nos,1356
|
|
366
374
|
plato/chronos/api/worlds/list_worlds.py,sha256=hBAuGb69tlasyn-kV_LNr9x6Rr7SHhST5hXJn1uqMf8,1253
|
|
367
|
-
plato/chronos/models/__init__.py,sha256=
|
|
375
|
+
plato/chronos/models/__init__.py,sha256=5Hil8v_jFX1YU6LpOfqyJM4WV867Ckv6CX052Q4SCso,20996
|
|
368
376
|
plato/sims/README.md,sha256=FIbJhNVNAV-SO6dq_cXX3Rg0C7HdQCfEY9YxGlkCmsM,6902
|
|
369
377
|
plato/sims/__init__.py,sha256=tnoCGKZwNx6h22tEWLujdpLv6K4PpFU2RnDOhL1o-Uc,1494
|
|
370
378
|
plato/sims/agent_helpers.py,sha256=kITvQywoTCS8mGhro3jZWuPJHDlje-UZujhjoahqhd0,10291
|
|
371
|
-
plato/sims/cli.py,sha256=
|
|
379
|
+
plato/sims/cli.py,sha256=lvdc_fSyNVmXvblFaE0saiVPdTpoR8Tlh9NN2LCBrd8,52704
|
|
372
380
|
plato/sims/generate_clients.py,sha256=nEe39v3UOcks-ggv5jomcwN33R5U9n8MDNCpHoZ2lDg,5958
|
|
373
|
-
plato/sims/registry.py,sha256=
|
|
381
|
+
plato/sims/registry.py,sha256=1LHW1SMJJNYIvn0zY9BPkHo4yHpdDAk7BxTYw1HpweY,11963
|
|
374
382
|
plato/v1/__init__.py,sha256=t1Ejb7YCFOVSKZL9hJ0UsmEE1mULDvO__f75dz1UueQ,197
|
|
375
383
|
plato/v1/audit_ui.py,sha256=zYYufJKn7291uCNb_59ItmDTYsPr7YLshBFwcAwl1LQ,10990
|
|
376
384
|
plato/v1/cli.py,sha256=iEt58vvW7ab9YH0CLcBHvf4653fk1gcEdij4HZc10YY,269
|
|
377
385
|
plato/v1/config.py,sha256=Zc5qGBcR8UfLuZrfQhkZ5cUmV_9pPKHPyKpU0SNysGY,667
|
|
378
386
|
plato/v1/exceptions.py,sha256=BS5A0NLZ2FgL6YVaIL-c8FXASTsOpuKrF3_Pb0tad6w,109
|
|
379
|
-
plato/v1/flow_executor.py,sha256=
|
|
387
|
+
plato/v1/flow_executor.py,sha256=rHYPPG4XPdq00Ty7_c4r7dZ-LixtUrEV3KEg1i-Owto,19720
|
|
380
388
|
plato/v1/sandbox_sdk.py,sha256=5-ESB3spe4BFGn1dVfgSWwKyfQeeUokPWsmbti3obOY,41854
|
|
381
|
-
plato/v1/sdk.py,sha256=
|
|
382
|
-
plato/v1/sync_env.py,sha256=
|
|
383
|
-
plato/v1/sync_flow_executor.py,sha256=
|
|
384
|
-
plato/v1/sync_sdk.py,sha256=
|
|
389
|
+
plato/v1/sdk.py,sha256=zNcYgANeMZG8r9AH3POJhJ11UQcOvdsLfUFABoB1cwg,33382
|
|
390
|
+
plato/v1/sync_env.py,sha256=UIfDpx3nPHBNWzahSddvol0SvfK9vU4mr3MOIOPCGr8,24878
|
|
391
|
+
plato/v1/sync_flow_executor.py,sha256=kgvNYOtA9FHeNfP7qb8ZPUIlTsfIss_Z98W8uX5veck,19233
|
|
392
|
+
plato/v1/sync_sdk.py,sha256=2sedg1QJiSxr1I3kCyfaLAnlAgHlbblc3QQP_47O30k,25697
|
|
385
393
|
plato/v1/cli/__init__.py,sha256=om4b7PxgsoI7rEwuQelmQkqPdhMVn53_5qEN8kvksYw,105
|
|
386
|
-
plato/v1/cli/agent.py,sha256=
|
|
394
|
+
plato/v1/cli/agent.py,sha256=G6TV3blG_BqMDBWS-CG7GwzqoqcJTMsIKQ88jvLXb4k,43745
|
|
387
395
|
plato/v1/cli/main.py,sha256=ktPtBvMwykR7AjXmTQ6bmZkHdzpAjhX5Fq66cDbGSzA,6844
|
|
388
|
-
plato/v1/cli/pm.py,sha256=
|
|
389
|
-
plato/v1/cli/sandbox.py,sha256=
|
|
390
|
-
plato/v1/cli/ssh.py,sha256=
|
|
396
|
+
plato/v1/cli/pm.py,sha256=uLM6WszKqxq9Czg1FraDyWb9_INUuHZq63imvRYfRLw,49734
|
|
397
|
+
plato/v1/cli/sandbox.py,sha256=5rth_jL73L72GC0VJ0meXRgZo2EpsJ_qI3ipFjfXzJY,95185
|
|
398
|
+
plato/v1/cli/ssh.py,sha256=10ag6S1sxMcAmvcg24qy-yYwXb1miWfqxkXOs4QX8u0,6623
|
|
391
399
|
plato/v1/cli/utils.py,sha256=be-llK6T6NHnIQl_Kfs-8EPu9JhIuZ_k9tJ3Ts-AKt4,3887
|
|
392
|
-
plato/v1/cli/
|
|
400
|
+
plato/v1/cli/verify.py,sha256=7QmQwfOOkr8a51f8xfVIr2zif7wGl2E8HOZTbOaIoV0,20671
|
|
401
|
+
plato/v1/cli/world.py,sha256=yBUadOJs1QYm6Jmx_ACDzogybRq5x4B-BnTvGO_ulQk,9757
|
|
393
402
|
plato/v1/examples/doordash_tasks.py,sha256=8Sz9qx-vTmiOAiCAbrDRvZGsA1qQQBr1KHbxXdjr7OI,23233
|
|
394
403
|
plato/v1/examples/loadtest.py,sha256=ZsQYNN_fZjE7CbrbVJb4KDc0OLaH7b66iPrEHDhuw0U,5609
|
|
395
404
|
plato/v1/examples/test_env.py,sha256=8kUISbZyMi0Xh9HK7Il1okKQyz0Iq-vAKWgzC8kqUfU,4513
|
|
@@ -428,41 +437,37 @@ plato/v1/extensions/envgen-recorder/sessions.js,sha256=IrW0elMYYh4cUEmNZiHC-XhFL
|
|
|
428
437
|
plato/v1/extensions/envgen-recorder/styles.css,sha256=NbpKw4NSbYw6RVDOn4zpNwwVnjFQtKIene2MZBz9kb0,5359
|
|
429
438
|
plato/v1/models/__init__.py,sha256=rnv5oO0RQ_mbnv_0FxvCWpCnSKmBePoYoIQ0h1LuKE8,813
|
|
430
439
|
plato/v1/models/build_models.py,sha256=zcRwg2pzU5GFDp_Qi7g0UCVNGkOtXTlHNvq_6gm5mJc,10201
|
|
431
|
-
plato/v1/models/env.py,sha256=
|
|
440
|
+
plato/v1/models/env.py,sha256=UZgdjZrIkODeuTLTHaIyUqUJM83S8YYY_RbYqDeYjDk,31043
|
|
432
441
|
plato/v1/models/flow.py,sha256=bkleb7-OR6V5tzPtggf0ZJhHZQwnktCYr1C-ONpRzwE,6920
|
|
433
442
|
plato/v1/models/sandbox.py,sha256=yRN036G91tFAXGxU1ni7zCU1o7U1N8nI0mjLlBRDoSk,3478
|
|
434
443
|
plato/v1/models/task.py,sha256=QXwdFpDM_NLjRpQSK6duibXJXFAPZ8-PpyuLWZC5o4I,4897
|
|
435
444
|
plato/v1/utils/proxytunnel.py,sha256=N1MshFY3Pu3d19cTU619-e-gP2_j-89CEcld7lCoiGk,5706
|
|
436
|
-
plato/v2/__init__.py,sha256=
|
|
445
|
+
plato/v2/__init__.py,sha256=YUzdRnXsL61ey-LOoR-HZGYgfGKBxnuMtFIu-D0VB8E,1662
|
|
437
446
|
plato/v2/models.py,sha256=41EJPdbAsW-gARVND0cg4jqpzQuYlrbAW9hF8WI8kX4,2369
|
|
438
447
|
plato/v2/types.py,sha256=MrHiE8AobOegeTfoKKHZ5JTccaFfS3-EW0arV7q8S5c,3533
|
|
439
448
|
plato/v2/async_/__init__.py,sha256=zcNwuX2XD-WkUCFLvXtdRqFmCgeuY3-D4zGTRVwsAFI,484
|
|
440
449
|
plato/v2/async_/artifact.py,sha256=JBWVQeVaZhkU2qn_knyzyA7wd5iQ8qxfLQ_l9GPhgYs,1217
|
|
441
450
|
plato/v2/async_/client.py,sha256=GVgAgNN5gsDME8iV0zxqnwbsVS93J6cknOcq_VXwYN8,4209
|
|
442
|
-
plato/v2/async_/environment.py,sha256=
|
|
451
|
+
plato/v2/async_/environment.py,sha256=M5IeWYLwREOIyuS2zqgBSqHE_x66_OZXrevA9Rkc8Is,5825
|
|
443
452
|
plato/v2/async_/flow_executor.py,sha256=Tl4nRu1ZPWJFNNxyTGy-PxvebZEUD18ZDaz8T2chtzU,14188
|
|
444
|
-
plato/v2/async_/session.py,sha256=
|
|
453
|
+
plato/v2/async_/session.py,sha256=ssTEFgfpDQElQEmeKulLWKLoW-wA3m_nI3UvEWb9lB0,36749
|
|
445
454
|
plato/v2/sync/__init__.py,sha256=_WigxuehCC8A2yRy4mSaMQmIZhS0Gch4hhZC1VHyYXs,310
|
|
446
455
|
plato/v2/sync/artifact.py,sha256=wTLC-tugG128wLvh-JqNPb0zsw5FXEJlZNahurSWink,1169
|
|
447
456
|
plato/v2/sync/client.py,sha256=Q9fS1BF4KxTMMnceMwCMlb5dNFZ6LA4gsXWNLgsL2eE,3870
|
|
448
|
-
plato/v2/sync/environment.py,sha256=
|
|
457
|
+
plato/v2/sync/environment.py,sha256=WnDzbyEHpwCSEP8XnfNSjIYS7rt7lYR4HGJjzprZmTQ,5066
|
|
449
458
|
plato/v2/sync/flow_executor.py,sha256=N41-WCWIJVcCR2UmPUEiK7roNacYoeONkRXpR7lUgT8,13941
|
|
450
|
-
plato/v2/sync/session.py,sha256=
|
|
459
|
+
plato/v2/sync/session.py,sha256=jc71bZFb-1m4QTtU4V00OkNH8fHac3jyWTwq-uOK-BE,28409
|
|
451
460
|
plato/v2/utils/__init__.py,sha256=XLeFFsjXkm9g2raMmo7Wt4QN4hhCrNZDJKnpffJ4LtM,38
|
|
452
461
|
plato/v2/utils/db_cleanup.py,sha256=lnI5lsMHNHpG85Y99MaE4Rzc3618piuzhvH-uXO1zIc,8702
|
|
453
462
|
plato/v2/utils/models.py,sha256=PwehSSnIRG-tM3tWL1PzZEH77ZHhIAZ9R0UPs6YknbM,1441
|
|
454
463
|
plato/v2/utils/proxy_tunnel.py,sha256=8ZTd0jCGSfIHMvSv1fgEyacuISWnGPHLPbDglWroTzY,10463
|
|
455
|
-
plato/
|
|
456
|
-
plato/
|
|
457
|
-
plato/
|
|
458
|
-
plato/world/types.py,sha256=KelUwCpFefurzh-Vu-IooTgThW6LDq4kvo2_M3mRv4k,1270
|
|
459
|
-
plato/worlds/README.md,sha256=UkzsR6dgUK9oMQW1TXheHCabW0pEodOmqw5tGYh-XZU,5253
|
|
460
|
-
plato/worlds/__init__.py,sha256=-a2oRiN0ECurYWG3o313C8rqyowKjiFz4__GYmVMrA0,1001
|
|
461
|
-
plato/worlds/base.py,sha256=OSPs4wW-G6K1qoWEFcRAWPDFZ0-N1XTYp4wyzHHIF8A,6750
|
|
464
|
+
plato/worlds/README.md,sha256=TgG4aidude0ouJSCfY81Ev45hsUxPkO85HUIiWNqkcc,5463
|
|
465
|
+
plato/worlds/__init__.py,sha256=ALoou3l5lXvs_YZc5eH6HdMHpvhnpzKWqz__aSC1jFc,2152
|
|
466
|
+
plato/worlds/base.py,sha256=KsDq1TVVd4BKEFo42WodF4DPgodr00Gd1NrfzZEPqyw,25632
|
|
462
467
|
plato/worlds/build_hook.py,sha256=KSoW0kqa5b7NyZ7MYOw2qsZ_2FkWuz0M3Ru7AKOP7Qw,3486
|
|
463
|
-
plato/worlds/config.py,sha256=
|
|
464
|
-
plato/worlds/runner.py,sha256=
|
|
465
|
-
plato_sdk_v2-2.
|
|
466
|
-
plato_sdk_v2-2.
|
|
467
|
-
plato_sdk_v2-2.
|
|
468
|
-
plato_sdk_v2-2.
|
|
468
|
+
plato/worlds/config.py,sha256=fkWoetCawIPf5xgj5EyJCvopmPPzZQAqt0Ke9P4hq5c,10845
|
|
469
|
+
plato/worlds/runner.py,sha256=gwTBuDPoiP3aGF4UgqNKHrfv1wohr0tsex0xlcuaw8c,18202
|
|
470
|
+
plato_sdk_v2-2.3.4.dist-info/METADATA,sha256=k70jP_81ZXfk_e5_nZQNO8Huplz6Wm3JoazP2-loCmg,8510
|
|
471
|
+
plato_sdk_v2-2.3.4.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
472
|
+
plato_sdk_v2-2.3.4.dist-info/entry_points.txt,sha256=upGMbJCx6YWUTKrPoYvYUYfFCqYr75nHDwhA-45m6p8,136
|
|
473
|
+
plato_sdk_v2-2.3.4.dist-info/RECORD,,
|
plato/agents/callback.py
DELETED
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
"""Chronos callback utilities for agents.
|
|
2
|
-
|
|
3
|
-
This module provides utilities for agents to communicate with Chronos,
|
|
4
|
-
including pushing logs, uploading trajectories, and uploading zipped logs.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from __future__ import annotations
|
|
8
|
-
|
|
9
|
-
import base64
|
|
10
|
-
import io
|
|
11
|
-
import json
|
|
12
|
-
import logging
|
|
13
|
-
import zipfile
|
|
14
|
-
from pathlib import Path
|
|
15
|
-
from typing import Any
|
|
16
|
-
|
|
17
|
-
import httpx
|
|
18
|
-
|
|
19
|
-
logger = logging.getLogger(__name__)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
class ChronosCallback:
|
|
23
|
-
"""Utility class for communicating with Chronos server.
|
|
24
|
-
|
|
25
|
-
Handles pushing logs, updating status, and uploading artifacts
|
|
26
|
-
(trajectory and zipped logs) to the Chronos callback endpoints.
|
|
27
|
-
|
|
28
|
-
Example:
|
|
29
|
-
callback = ChronosCallback(
|
|
30
|
-
callback_url="http://chronos.example.com/api/callback",
|
|
31
|
-
session_id="abc123",
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
# Push logs during execution
|
|
35
|
-
await callback.push_logs([
|
|
36
|
-
{"level": "info", "message": "Starting agent..."},
|
|
37
|
-
])
|
|
38
|
-
|
|
39
|
-
# After agent completes, upload artifacts
|
|
40
|
-
await callback.upload_artifacts(logs_dir="/path/to/logs")
|
|
41
|
-
"""
|
|
42
|
-
|
|
43
|
-
def __init__(self, callback_url: str, session_id: str):
|
|
44
|
-
"""Initialize the callback client.
|
|
45
|
-
|
|
46
|
-
Args:
|
|
47
|
-
callback_url: Full callback base URL (e.g., http://server/api/callback)
|
|
48
|
-
session_id: The Chronos session ID for this run
|
|
49
|
-
"""
|
|
50
|
-
self.callback_url = callback_url.rstrip("/")
|
|
51
|
-
self.session_id = session_id
|
|
52
|
-
self._enabled = bool(callback_url and session_id)
|
|
53
|
-
|
|
54
|
-
@property
|
|
55
|
-
def enabled(self) -> bool:
|
|
56
|
-
"""Check if callbacks are enabled (both server and session_id set)."""
|
|
57
|
-
return self._enabled
|
|
58
|
-
|
|
59
|
-
async def push_logs(self, logs: list[dict[str, Any]]) -> bool:
|
|
60
|
-
"""Push log entries to Chronos.
|
|
61
|
-
|
|
62
|
-
Args:
|
|
63
|
-
logs: List of log entries, each with 'level' and 'message' keys.
|
|
64
|
-
Optional keys: 'timestamp', 'extra'
|
|
65
|
-
|
|
66
|
-
Returns:
|
|
67
|
-
True if logs were pushed successfully, False otherwise.
|
|
68
|
-
"""
|
|
69
|
-
if not self._enabled:
|
|
70
|
-
return False
|
|
71
|
-
|
|
72
|
-
try:
|
|
73
|
-
async with httpx.AsyncClient(timeout=10.0) as client:
|
|
74
|
-
response = await client.post(
|
|
75
|
-
f"{self.callback_url}/logs",
|
|
76
|
-
json={"session_id": self.session_id, "logs": logs},
|
|
77
|
-
)
|
|
78
|
-
return response.status_code == 200
|
|
79
|
-
except Exception as e:
|
|
80
|
-
logger.warning(f"Failed to push logs to Chronos: {e}")
|
|
81
|
-
return False
|
|
82
|
-
|
|
83
|
-
async def push_log(
|
|
84
|
-
self,
|
|
85
|
-
message: str,
|
|
86
|
-
level: str = "info",
|
|
87
|
-
extra: dict[str, Any] | None = None,
|
|
88
|
-
) -> bool:
|
|
89
|
-
"""Push a single log entry to Chronos.
|
|
90
|
-
|
|
91
|
-
Args:
|
|
92
|
-
message: Log message
|
|
93
|
-
level: Log level (debug, info, warning, error)
|
|
94
|
-
extra: Optional additional structured data
|
|
95
|
-
|
|
96
|
-
Returns:
|
|
97
|
-
True if log was pushed successfully, False otherwise.
|
|
98
|
-
"""
|
|
99
|
-
log_entry: dict[str, Any] = {"level": level, "message": message}
|
|
100
|
-
if extra:
|
|
101
|
-
log_entry["extra"] = extra
|
|
102
|
-
return await self.push_logs([log_entry])
|
|
103
|
-
|
|
104
|
-
async def update_status(
|
|
105
|
-
self,
|
|
106
|
-
status: str,
|
|
107
|
-
message: str | None = None,
|
|
108
|
-
extra: dict[str, Any] | None = None,
|
|
109
|
-
) -> bool:
|
|
110
|
-
"""Update the session status in Chronos.
|
|
111
|
-
|
|
112
|
-
Args:
|
|
113
|
-
status: New status (running, completed, failed)
|
|
114
|
-
message: Optional status message
|
|
115
|
-
extra: Optional additional data
|
|
116
|
-
|
|
117
|
-
Returns:
|
|
118
|
-
True if status was updated successfully, False otherwise.
|
|
119
|
-
"""
|
|
120
|
-
if not self._enabled:
|
|
121
|
-
return False
|
|
122
|
-
|
|
123
|
-
try:
|
|
124
|
-
async with httpx.AsyncClient(timeout=10.0) as client:
|
|
125
|
-
response = await client.post(
|
|
126
|
-
f"{self.callback_url}/status",
|
|
127
|
-
json={
|
|
128
|
-
"session_id": self.session_id,
|
|
129
|
-
"status": status,
|
|
130
|
-
"message": message,
|
|
131
|
-
"extra": extra,
|
|
132
|
-
},
|
|
133
|
-
)
|
|
134
|
-
return response.status_code == 200
|
|
135
|
-
except Exception as e:
|
|
136
|
-
logger.warning(f"Failed to update status in Chronos: {e}")
|
|
137
|
-
return False
|
|
138
|
-
|
|
139
|
-
def find_trajectory(self, logs_dir: str) -> dict[str, Any] | None:
|
|
140
|
-
"""Find and load ATIF trajectory from logs directory.
|
|
141
|
-
|
|
142
|
-
Agents write ATIF trajectory to /logs/agent/trajectory.json after
|
|
143
|
-
completing their run. This method finds and loads that file.
|
|
144
|
-
|
|
145
|
-
Args:
|
|
146
|
-
logs_dir: Path to the logs directory
|
|
147
|
-
|
|
148
|
-
Returns:
|
|
149
|
-
Parsed ATIF trajectory dict if found, None otherwise.
|
|
150
|
-
"""
|
|
151
|
-
trajectory_path = Path(logs_dir) / "agent" / "trajectory.json"
|
|
152
|
-
|
|
153
|
-
if not trajectory_path.exists():
|
|
154
|
-
return None
|
|
155
|
-
|
|
156
|
-
try:
|
|
157
|
-
with open(trajectory_path) as f:
|
|
158
|
-
data = json.load(f)
|
|
159
|
-
if isinstance(data, dict) and "schema_version" in data:
|
|
160
|
-
logger.info(f"Found ATIF trajectory: {trajectory_path}")
|
|
161
|
-
return data
|
|
162
|
-
return None
|
|
163
|
-
except Exception as e:
|
|
164
|
-
logger.warning(f"Failed to load trajectory from {trajectory_path}: {e}")
|
|
165
|
-
return None
|
|
166
|
-
|
|
167
|
-
def zip_logs_dir(self, logs_dir: str) -> bytes:
|
|
168
|
-
"""Zip the entire logs directory.
|
|
169
|
-
|
|
170
|
-
Args:
|
|
171
|
-
logs_dir: Path to the logs directory
|
|
172
|
-
|
|
173
|
-
Returns:
|
|
174
|
-
Zip file contents as bytes.
|
|
175
|
-
"""
|
|
176
|
-
logs_path = Path(logs_dir)
|
|
177
|
-
buffer = io.BytesIO()
|
|
178
|
-
|
|
179
|
-
with zipfile.ZipFile(buffer, "w", zipfile.ZIP_DEFLATED) as zf:
|
|
180
|
-
for file_path in logs_path.rglob("*"):
|
|
181
|
-
if file_path.is_file():
|
|
182
|
-
arcname = file_path.relative_to(logs_path)
|
|
183
|
-
zf.write(file_path, arcname)
|
|
184
|
-
|
|
185
|
-
buffer.seek(0)
|
|
186
|
-
return buffer.read()
|
|
187
|
-
|
|
188
|
-
async def upload_artifacts(
|
|
189
|
-
self,
|
|
190
|
-
logs_dir: str,
|
|
191
|
-
trajectory: dict[str, Any] | None = None,
|
|
192
|
-
) -> bool:
|
|
193
|
-
"""Upload trajectory and zipped logs to Chronos.
|
|
194
|
-
|
|
195
|
-
If trajectory is not provided, attempts to find it in the logs directory.
|
|
196
|
-
The logs directory is zipped and uploaded to S3 via Chronos.
|
|
197
|
-
|
|
198
|
-
Args:
|
|
199
|
-
logs_dir: Path to the logs directory
|
|
200
|
-
trajectory: Optional pre-loaded trajectory dict. If None, will
|
|
201
|
-
attempt to find trajectory.json in logs_dir.
|
|
202
|
-
|
|
203
|
-
Returns:
|
|
204
|
-
True if artifacts were uploaded successfully, False otherwise.
|
|
205
|
-
"""
|
|
206
|
-
if not self._enabled:
|
|
207
|
-
return False
|
|
208
|
-
|
|
209
|
-
# Find trajectory if not provided
|
|
210
|
-
if trajectory is None:
|
|
211
|
-
trajectory = self.find_trajectory(logs_dir)
|
|
212
|
-
if trajectory:
|
|
213
|
-
logger.info("Found ATIF trajectory in logs directory")
|
|
214
|
-
else:
|
|
215
|
-
logger.info("No ATIF trajectory found in logs directory")
|
|
216
|
-
|
|
217
|
-
# Zip logs directory
|
|
218
|
-
logs_base64: str | None = None
|
|
219
|
-
try:
|
|
220
|
-
logs_zip = self.zip_logs_dir(logs_dir)
|
|
221
|
-
logs_base64 = base64.b64encode(logs_zip).decode("utf-8")
|
|
222
|
-
logger.info(f"Zipped logs: {len(logs_zip)} bytes")
|
|
223
|
-
except Exception as e:
|
|
224
|
-
logger.warning(f"Failed to zip logs: {e}")
|
|
225
|
-
|
|
226
|
-
# Upload to Chronos
|
|
227
|
-
try:
|
|
228
|
-
async with httpx.AsyncClient(timeout=60.0) as client:
|
|
229
|
-
response = await client.post(
|
|
230
|
-
f"{self.callback_url}/artifacts",
|
|
231
|
-
json={
|
|
232
|
-
"session_id": self.session_id,
|
|
233
|
-
"trajectory": trajectory,
|
|
234
|
-
"logs_base64": logs_base64,
|
|
235
|
-
},
|
|
236
|
-
)
|
|
237
|
-
if response.status_code == 200:
|
|
238
|
-
result = response.json()
|
|
239
|
-
logger.info(f"Uploaded artifacts to Chronos: {result}")
|
|
240
|
-
return True
|
|
241
|
-
else:
|
|
242
|
-
logger.warning(f"Failed to upload artifacts: {response.status_code} {response.text}")
|
|
243
|
-
return False
|
|
244
|
-
except Exception as e:
|
|
245
|
-
logger.warning(f"Failed to upload artifacts to Chronos: {e}")
|
|
246
|
-
return False
|
plato/world/__init__.py
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
"""World module - OpenAI Gym-like interface for Plato simulators.
|
|
2
|
-
|
|
3
|
-
Provides an abstract World base class that manages Plato sessions and
|
|
4
|
-
exposes simulator URLs for agents to interact with via plato.sims SDK.
|
|
5
|
-
|
|
6
|
-
Usage:
|
|
7
|
-
from plato.world import World, WorldConfig, EnvSpec, Observation, StepResult
|
|
8
|
-
|
|
9
|
-
class MyWorld(World):
|
|
10
|
-
async def _on_reset(self) -> Observation:
|
|
11
|
-
return Observation(step=0, date=self.config.start_date, data={})
|
|
12
|
-
|
|
13
|
-
async def _on_step(self) -> StepResult:
|
|
14
|
-
return StepResult(observation=obs, reward=100.0)
|
|
15
|
-
|
|
16
|
-
def get_prompt(self) -> str:
|
|
17
|
-
return f"Day {self._current_step}: Do something..."
|
|
18
|
-
|
|
19
|
-
config = WorldConfig(
|
|
20
|
-
name="my-world",
|
|
21
|
-
envs=[EnvSpec(alias="store", simulator="spree")],
|
|
22
|
-
num_steps=30,
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
async with MyWorld(config) as world:
|
|
26
|
-
obs = await world.reset()
|
|
27
|
-
for _ in range(config.num_steps):
|
|
28
|
-
# Agent takes turn using world.get_env_vars()
|
|
29
|
-
result = await world.step()
|
|
30
|
-
if result.done:
|
|
31
|
-
break
|
|
32
|
-
"""
|
|
33
|
-
|
|
34
|
-
from plato.world.base import World
|
|
35
|
-
from plato.world.config import EnvSpec, WorldConfig
|
|
36
|
-
from plato.world.types import Observation, StepResult
|
|
37
|
-
|
|
38
|
-
__all__ = [
|
|
39
|
-
"World",
|
|
40
|
-
"WorldConfig",
|
|
41
|
-
"EnvSpec",
|
|
42
|
-
"Observation",
|
|
43
|
-
"StepResult",
|
|
44
|
-
]
|