MCPcopy Create free account
hub / github.com/FuzzAnything/PromptFuzz / generate_until_n_success

Method generate_until_n_success

src/fuzzer.rs:107–160  ·  view source on GitHub ↗
(
        &mut self,
        prompt: &mut Prompt,
        logger: &mut ProgramLogger,
    )

Source from the content-addressed store, hash-verified

105 }
106
107 pub fn generate_until_n_success(
108 &mut self,
109 prompt: &mut Prompt,
110 logger: &mut ProgramLogger,
111 ) -> Result<Vec<Program>> {
112 log::trace!(
113 "Generate until {} sucess programs",
114 get_config().fuzz_round_succ
115 );
116 let mut succ_programs = Vec::new();
117
118 while succ_programs.len() < get_config().fuzz_round_succ {
119 let mut programs = self.handler.generate(prompt)?;
120 if programs.is_empty() {
121 log::warn!("LLM did not generate any program, retrying...");
122 continue;
123 }
124 for program in &mut programs {
125 program.id = self.deopt.inc_seed_id();
126 }
127
128 log::debug!(
129 "LLM generated {} programs. Sanitize those programs!",
130 programs.len()
131 );
132 let check_res = self
133 .executor
134 .check_programs_are_correct(&programs, &self.deopt)?;
135 // Check each generated programs, and save thems according where they contains errors.
136 for (i, program) in programs.iter().enumerate() {
137 let has_err = check_res
138 .get(i)
139 .unwrap_or_else(|| panic!("cannot obtain check_res at `{i}`"));
140 // save as error programs
141 if let Some(err_msg) = has_err {
142 self.deopt.save_err_program(program, err_msg)?;
143 logger.log_err(err_msg);
144 } else {
145 succ_programs.push(program.clone());
146 logger.log_succ();
147 }
148 }
149 logger.print_succ_round();
150 // if the combiantion continusely failed in a long time, shuffle the prompt to escape the bad combination;
151 if self
152 .schedule
153 .should_shuffle(logger.get_rc_succ(), logger.get_rc_total())
154 {
155 log::info!("Fuzzer stuck in the current prompt, choose a new one.");
156 break;
157 }
158 }
159 Ok(succ_programs)
160 }
161
162 fn mutate_prompt(&mut self, prompt: &mut Prompt) -> Result<()> {
163 let api_coverage = self.observer.compute_library_api_coverage()?;

Callers 1

fuzz_loopMethod · 0.80

Calls 13

get_configFunction · 0.85
generateMethod · 0.80
inc_seed_idMethod · 0.80
save_err_programMethod · 0.80
log_errMethod · 0.80
log_succMethod · 0.80
print_succ_roundMethod · 0.80
should_shuffleMethod · 0.80
get_rc_succMethod · 0.80
get_rc_totalMethod · 0.80
is_emptyMethod · 0.45

Tested by

no test coverage detected