| | import os |
| | import threading |
| | import time |
| | from concurrent.futures import ThreadPoolExecutor, as_completed |
| | from pathlib import Path |
| | import jsonlines |
| | from tqdm import tqdm |
| |
|
| | import vertexai |
| | from vertexai.generative_models import GenerativeModel |
| |
|
| | |
| | |
| | |
| | os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/home/weifengsun/tangou1/step2/gemini.json" |
| | vertexai.init(project="tangou") |
| | model = GenerativeModel("gemini-2.5-flash-lite") |
| |
|
| | |
| | |
| | |
| | PRICE_INPUT_PER_1M = 0.1 |
| | PRICE_OUTPUT_PER_1M = 0.4 |
| |
|
| | |
| | |
| | |
| | class APIMonitor: |
| | def __init__(self, max_usd: float): |
| | self.max_usd = max_usd |
| | self.input_tokens = 0 |
| | self.output_tokens = 0 |
| | self.total_cost = 0.0 |
| | self.lock = threading.Lock() |
| | self.stop_event = threading.Event() |
| | self.start_time = time.time() |
| |
|
| | @staticmethod |
| | def estimate_tokens(text: str) -> int: |
| | return max(1, len(text) // 3) |
| |
|
| | def reserve_input(self, prompt: str): |
| | est = self.estimate_tokens(prompt) |
| | est_cost = est / 1_000_000 * PRICE_INPUT_PER_1M |
| | with self.lock: |
| | if self.total_cost + est_cost > self.max_usd: |
| | self.stop_event.set() |
| | raise RuntimeError("💥 API budget exceeded (input)") |
| | self.input_tokens += est |
| | self.total_cost += est_cost |
| |
|
| | def record_output(self, text: str): |
| | est = self.estimate_tokens(text) |
| | cost = est / 1_000_000 * PRICE_OUTPUT_PER_1M |
| | with self.lock: |
| | self.output_tokens += est |
| | self.total_cost += cost |
| | if self.total_cost > self.max_usd: |
| | self.stop_event.set() |
| | raise RuntimeError("💥 API budget exceeded (output)") |
| |
|
| | def snapshot(self): |
| | with self.lock: |
| | return { |
| | "input_tokens": self.input_tokens, |
| | "output_tokens": self.output_tokens, |
| | "total_cost": round(self.total_cost, 6), |
| | "elapsed": round(time.time() - self.start_time, 2), |
| | } |
| |
|
| | monitor = APIMonitor(max_usd=100.0) |
| |
|
| | |
| | |
| | |
| | def infer_one(prompt: str, idx: int): |
| | if monitor.stop_event.is_set(): |
| | return {"idx": idx, "status": "stopped", "output": ""} |
| |
|
| | try: |
| | monitor.reserve_input(prompt) |
| | resp = model.generate_content(prompt) |
| | text = resp.text or "" |
| | monitor.record_output(text) |
| | return {"idx": idx, "status": "ok", "output": text} |
| | except Exception as e: |
| | return {"idx": idx, "status": "error", "error": str(e)} |
| |
|
| | |
| | |
| | |
| | prompt_template = Path("prompt.txt").read_text(encoding="utf-8") |
| | input_file = "/home/weifengsun/tangou1/step2/step22/output/function_filtered_scores.jsonl" |
| | inputs = [] |
| |
|
| | amount = 500000 |
| | with jsonlines.open(input_file, "r") as reader: |
| | for obj in reader: |
| | if amount == 0: |
| | break |
| | amount -= 1 |
| | prompt = prompt_template.replace("<<<CODE>>>", obj["code_content"]).replace( |
| | "<<<README>>>", obj["md_summary"] |
| | ) |
| | inputs.append(prompt) |
| |
|
| | |
| | |
| | |
| | output_file = "/home/weifengsun/tangou1/step2/step22/output/gemini_results.jsonl" |
| | completed_idx = set() |
| | if os.path.exists(output_file): |
| | with jsonlines.open(output_file, "r") as reader: |
| | for obj in reader: |
| | completed_idx.add(obj["idx"]) |
| |
|
| | |
| | tasks = [(idx, prompt) for idx, prompt in enumerate(inputs) if idx not in completed_idx] |
| | total_tasks = len(inputs) |
| | remaining_tasks = len(tasks) |
| | print(f"Total: {total_tasks}, Completed: {len(completed_idx)}, Remaining: {remaining_tasks}") |
| |
|
| | |
| | |
| | |
| | write_lock = threading.Lock() |
| | MAX_WORKERS = 8 |
| |
|
| | with jsonlines.open(output_file, mode="a", flush=True) as writer, ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: |
| | futures = {executor.submit(infer_one, prompt, idx): idx for idx, prompt in tasks} |
| |
|
| | pbar = tqdm(total=remaining_tasks, desc="Generating", unit="item") |
| |
|
| | for future in as_completed(futures): |
| | result = future.result() |
| |
|
| | |
| | with write_lock: |
| | writer.write(result) |
| |
|
| | |
| | pbar.update(1) |
| |
|
| | |
| | snap = monitor.snapshot() |
| | pbar.set_postfix({ |
| | "cost": f"${snap['total_cost']}", |
| | "in_tok": snap["input_tokens"], |
| | "out_tok": snap["output_tokens"], |
| | "elapsed_s": snap["elapsed"] |
| | }) |
| |
|
| | |
| | if monitor.stop_event.is_set(): |
| | print("🛑 Budget limit reached. Stopping all requests.") |
| | break |
| |
|
| | pbar.close() |
| |
|
| | print("✅ All done.") |
| |
|