From 8a85f0501ddf5629ec2851916f0cdfdfaf2ad075 Mon Sep 17 00:00:00 2001 From: Mery-Sanz Date: Wed, 14 May 2025 13:16:37 +0200 Subject: [PATCH] update /load --- docs/cai_faq.md | 22 +++------------------- docs/media/cai-011-load-command.png | Bin 0 -> 18545 bytes 2 files changed, 3 insertions(+), 19 deletions(-) create mode 100644 docs/media/cai-011-load-command.png diff --git a/docs/cai_faq.md b/docs/cai_faq.md index e393a6eb..b5313851 100644 --- a/docs/cai_faq.md +++ b/docs/cai_faq.md @@ -91,35 +91,19 @@ ??? question "How to know more about the CLI? /help" ![cai-006-help](media/cai-006-help.png) - -??? question "How can I trace the whole execution?" - The environment variable `CAI_TRACING` allows the user to set it to `CAI_TRACING=true` to enable tracing, or `CAI_TRACING=false` to disable it. - When CAI is prompted by the first time, the user is provided with two paths, the execution log, and the tracing log. - ![cai-009-logs](media/cai-009-logs.png) ??? question "Can I expand CAI capabilities using previous run logs?" - Absolutely! The **memory extension** allows you to use a previously sucessful runs ( the log object is stored as a **.jsonl file in the [log](cai/logs) folder** ) in a new run against the same target. - The user is also given the path highlighted in orange as shown below. - - ![cai-009-logs](media/cai-009-logs.png) + Absolutely! The **/load command** allows you to use a previously sucessful runs ( the log object is stored as a **.jsonl file in the [log](cai/logs) folder** ) in a new run against the same target. How to make use of this functionality? 1. Run CAI against the target. Let's assume the target name is: `target001`. 2. Get the log file path, something like: ```logs/cai_20250408_111856.jsonl``` - 3. Generate the memory using any model of your preference: - ```shell - JSONL_FILE_PATH="logs/cai_20250408_111856.jsonl" CTF_INSIDE="false" CAI_MEMORY_COLLECTION="target001" CAI_MEMORY="episodic" CAI_MODEL="claude-3-5-sonnet-20241022" python3 tools/2_jsonl_to_memory.py - ``` + 3. Start cai again and select the jsonl file: - The script [`tools/2_jsonl_to_memory.py`](cai/tools/2_jsonl_to_memory.py) will generate a memory collection file with the most relevant steps. The quality of the memory collection will depend on the model you use. - - 4. Use the generated memory collection and execute a new run: - ```shell - CAI_MEMORY="episodic" CAI_MODEL="gpt-4o" CAI_MEMORY_COLLECTION="target001" CAI_TRACING=false python3 cai/cli.py - ``` + ![cai-011-load-command](media/cai-011-load-command.png) ??? question "Can I expand CAI capabilities using scripts or extra information?" diff --git a/docs/media/cai-011-load-command.png b/docs/media/cai-011-load-command.png new file mode 100644 index 0000000000000000000000000000000000000000..2ef3ce9a1b067e95f02bbca8f2dc32411ce3f597 GIT binary patch literal 18545 zcmb5W1yoy2_vl>;#ag6LT#I{f*W&K(rATo1gyO~Bi#rr6?!}9{ySoP0n?BDg&%O7* zzV+R#b&|;$J7;F+%}{@%tn@HZ~C-js677$QUa-f2>zFl>-}mv%dW_;>JBTS-R)h z3-iV44S8M7-u&FsMMH)Is~Cyx_t4Z?(eb^XVz)CVB|=8kHLNDX_h*s@cCv9jn*(2Fm)%H(ci|EJ0;es^AI(#F); znAF|I+SZBJU4ZPb61>p#pVI&`(!Yv0TM3Y9$t#hH+Buq%axyV9F_Q@*laiA1JAN_a zRS}c;S9Rz&0Wu3`XM0`%z|GB#$&HQ4&e0se!o$M@U}godvNA$TFgkhIIvcw)+B%W{ z-N?V&5i@l%aRk~s1MO@{|FmoT+0MmTfQ;-KeVwN6!2kAS>-4YNg5DtDPY!^E zi5c*pwxLz||D5Gj0=k=8Yl{JGpu+?0Ly(h;|F7czSH^!k{6|Ht|5oJYV*Y2%f8_k1 zHPxL=9YyVIpglSZ{&!;jRr#Np|EkCj_;cg`7>K_|`LDCkVHQN@2mEKs1d(4cZ~uDr zO8Awun24G?%rOYTTV4G60-2H1esJ#H17-;aX3|;Wai)*w=r3{mu-Bp^*HAe(rzD)Pno)y3WLm-tT{^ z%iV!Uk#2N{rQy9>P93~oXWidY3Ax}0#>{6#R(0(6UeQPNXyke0(i6p1@JwEa; zB-GZ*Q5H;>EAFGDjuk|d?yvd!u_j=lK|;$7`91C_^LUiEU30dcF$UN(_!lm|A#kMi zk}0vgw^)3p7#JKbAX?;7$9-et_0v1Fv&ckas)@r?=owMD4^?cs^gWS)OpW)O>DDbr znWd`9aqfr2w4%Mx!B4w)ckwH3(N1W-KO{-0@L3p+QXeQIVv;HP{7&I>}z*cfSP=>%HyQ{vRCt3qSI^fi&EQj#t8B^^xuGr&ZTT#bW8L!Vnluk3W zS{l@EF_Q|9LM%F6I_o%KvvV2MnZXrj-O~lo@vvwFk5)t$MpfNPU&bXOY-P*AqY}$< z+%3mMM@t2xVoijSU{5^q7+Sb|&jkv84^V!c-h7=sqOZ9Av$Xh&Nwj6JCJFB;0}wQR z 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