__version__ = "0.1.0" from agent.input_parser import InputParser from agent.rule_loader import RuleLoader from agent.prompt_builder import PromptBuilder from agent.api_client import APIClient from agent.output_writer import OutputWriter from agent.models import ProgramMeta, FileInfo, CopyField, KeyInfo, TableColumn, TableInfo from agent.config import load_config def generate(design_md: str, source_cbl: str, file_db_md: str, cpy_dir: str, db_md: str, output_dir: str = "output", api_key: str = None, api_model: str = None, rules_dir: str = "rules", max_tokens: int = None) -> dict: """生成测试数据的主入口函数。""" import os cfg = load_config()['api'] if api_key is None: api_key = cfg['api_key'] if api_model is None: api_model = cfg['model'] if max_tokens is None: max_tokens = cfg['max_tokens'] print(f"== 解析入力: {design_md}") parser = InputParser(design_md, source_cbl, file_db_md, cpy_dir, db_md) meta = parser.run() if meta.pgm_type == 'サブ': raise ValueError(f"程序 {meta.program_id} はサブプログラムです。主プログラムのみ処理対象です。") print(f" プログラムID: {meta.program_id}, パターン: {meta.pgm_pattern}, 入力タイプ: {meta.input_type}") # If rules_dir is relative, resolve from this file's location or cwd if not os.path.isabs(rules_dir): rules_dir = os.path.join(os.path.dirname(__file__), '..', rules_dir) loader = RuleLoader(rules_dir) rules_text, group_descriptions, group_count = loader.load(meta) print(f" ルール読み込み完了, グループ数: {group_count}") builder = PromptBuilder() prompt = builder.build(meta, rules_text, group_descriptions, group_count) client = APIClient(api_key=api_key, model=api_model, max_tokens=max_tokens) print(f" API呼び出し中...") result = client.generate(prompt) print(f" API応答受信") writer = OutputWriter(output_dir) output_files = writer.write(meta.program_id, result, meta.input_type) print(f" 出力完了: {len(output_files)} ファイル") return { "output_files": output_files, "program_id": meta.program_id, "groups": group_count, "input_type": meta.input_type, }