├── .gitignore ├── Caller12.py ├── DSPY10.py ├── DSPY11.py ├── DSPY12.py ├── DSPY12_Out.md ├── DSPY12_Out_2.md ├── DSPY12_Out_3.md ├── DSPY7.py ├── DSPY7_Caller.py ├── DSPY8.py ├── LICENSE ├── MultiHop_Sum.py ├── README.md ├── Router ├── CallRouter.htm ├── ElthosRouter2.py └── requirements.txt ├── TestFirework1.py └── VecDB_ChunkTests ├── README.MD ├── TestData.json ├── TestQA.json ├── VDB_Chroma_TestChuncks.py └── VDB_Weaviate_TestChunks.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # pdm 105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 106 | #pdm.lock 107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 108 | # in version control. 109 | # https://pdm.fming.dev/#use-with-ide 110 | .pdm.toml 111 | 112 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 113 | __pypackages__/ 114 | 115 | # Celery stuff 116 | celerybeat-schedule 117 | celerybeat.pid 118 | 119 | # SageMath parsed files 120 | *.sage.py 121 | 122 | # Environments 123 | .env 124 | .venv 125 | env/ 126 | venv/ 127 | ENV/ 128 | env.bak/ 129 | venv.bak/ 130 | 131 | # Spyder project settings 132 | .spyderproject 133 | .spyproject 134 | 135 | # Rope project settings 136 | .ropeproject 137 | 138 | # mkdocs documentation 139 | /site 140 | 141 | # mypy 142 | .mypy_cache/ 143 | .dmypy.json 144 | dmypy.json 145 | 146 | # Pyre type checker 147 | .pyre/ 148 | 149 | # pytype static type analyzer 150 | .pytype/ 151 | 152 | # Cython debug symbols 153 | cython_debug/ 154 | 155 | # PyCharm 156 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 157 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 158 | # and can be added to the global gitignore or merged into this file. For a more nuclear 159 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 160 | #.idea/ 161 | -------------------------------------------------------------------------------- /Caller12.py: -------------------------------------------------------------------------------- 1 | import subprocess 2 | 3 | input_value = 44 4 | convert_from = "degrees fahrenheit" 5 | convert_to = "degrees celsius" 6 | convert_to2 = "degrees Kelvin" 7 | context = "You generate top quality python code, paying careful attention to the details of the requirements." 8 | 9 | 10 | question = (f"Generate Python code that converts {input_value} {convert_from} to {convert_to}." 11 | f" Then the code should convert the {input_value} to {convert_to2}." 12 | f" Then the code should print the conversion statement: {convert_from} to {convert_to}." 13 | f" then the code should print the conversion statement: {convert_from} to {convert_to2}." 14 | f" Then the code should create a file c:/temp/conversion.txt with the printed conversion statements in it." 15 | f" Then the code should have error handling routines, and print any errors to the console." 16 | f" Then the code ensure that all variables and functions are correctly created and referenced." 17 | f" Then the code should print a success message, and show the name of the file and what folder the file was saved to." 18 | ) 19 | 20 | # input_value = 44 21 | # convert_from = "degrees fahrenheit" 22 | # convert_to = "degrees celsius" 23 | # convert_to2 = "degrees Kelvin" 24 | # context = "You generate top quality python code, paying careful attention to the details of the requirements." 25 | # 26 | # 27 | # question = (f"Generate Python code that converts {input_value} {convert_from} to {convert_to}." 28 | # f" Then the code should convert the {input_value} to {convert_to2}." 29 | # f" Then the code should print the conversion statement: {convert_from} to {convert_to}." 30 | # f" then the code should print the conversion statement: {convert_from} to {convert_to2}." 31 | # f" Then the code should create a file c:/temp/conversion.txt with the printed conversion statements in it." 32 | # f" Then the code should have error handling routines, and print any errors to the console." 33 | # f" Then the code ensure that all variables and functions are correctly created and referenced." 34 | # f" Then the code should print a success message, and show the name of the file and what folder the file was saved to." 35 | # ) 36 | # 37 | # 38 | # input_value = 100 39 | # convert_from = "degrees celsius" 40 | @@ -32,4 +32,28 @@ 41 | 42 | # compile_tasks 43 | 44 | context = "You generate top quality python code, paying careful attention to the details to ensure your code meets the requirements. You always triple check your code to ensure nothing has been left out." 45 | question = (f" Generate Python code that uses pyodbc to make a sql 2019 connection to the localhost database StylishCSS using a trusted connection." 46 | f" Then the code should loads the contents of C:\\inetpub\\wwwroot\\Elthos_ODS_Web\\App_Themes\\common.css into the StylishCSS.dbo.REF_CSS row by row so that each line in the file is added as a row in the table." 47 | f" The code should use the following Stored Procedure to do so:" 48 | f" I_REF_CSS @Name As VarChar(255), @FilePathName As Text, @RowNumber As Integer, @RowContent As Text " 49 | f" Ensure the pyodbc code commits the transaction at the end of the loop so the data saves to the table." 50 | f" Ensure the code should have error handling routines, and print any errors to the console, using traceback to also include line number of the error." 51 | f" Then ensure that all variables and functions are correctly created and referenced." 52 | f" Then ensure that all python libraries and modules are valid and useful for this code." 53 | f" Then execute the code and print a success message showing how many rows were added to the table." 54 | f" Then save the code to a file named C:\\Temp\\CSS_Code.py." 55 | f" Then create an html page with mermaid.js flowchart TD, to diagram the function calls of the python script, and save to C:\\Temp\\CSS_Code_Flow.html." 56 | f" Use the following format for the HTML File, and do not use square brackets for sql objects or it will break the mermaid js file: " 57 | f"
" 58 | f" flowchart TD " 59 | f" A[fill in here] --> B[fill in here]" 60 | f"" 61 | f" " 64 | f" When saving code to a file, be sure to handle the code block quotes by using single quotes for the inner block and double quotes for the outer block or the file will not save correctly." 65 | f" Last, ask the user if they want to use a python command to execute the code in C:\\Temp\\CSS_Code.py" 66 | ) 67 | 68 | subprocess.call(["python", "C:\\Users\\mabramsR\\source\\repos\\DSPY_MA\\DSPY12.py", context, question]) 69 | -------------------------------------------------------------------------------- /DSPY10.py: -------------------------------------------------------------------------------- 1 | import importlib 2 | import re 3 | import sys 4 | 5 | import dspy 6 | 7 | colbertv2_wiki17_abstracts = dspy.ColBERTv2( 8 | url="http://20.102.90.50:2017/wiki17_abstracts" 9 | ) 10 | MyLM = dspy.OpenAI( 11 | api_base="http://localhost:1234/v1/", 12 | api_key="sk-111111", 13 | model="macadeliccc/laser-dolphin-mixtral-2x7b-dpo", 14 | temperature=0.0, 15 | max_tokens=7000, 16 | ) 17 | dspy.settings.configure(lm=MyLM, rm=colbertv2_wiki17_abstracts) 18 | 19 | 20 | class GenerateTasks(dspy.Signature): 21 | """Generate a list of tasks in structured format.""" 22 | 23 | context = dspy.InputField(desc="You create a high level project task list.") 24 | question = dspy.InputField() 25 | tasks = dspy.OutputField(desc="Enumerated Task List", type=list) 26 | 27 | def forward(context, question): 28 | # prompt = "Context: {context}\nQuestion: {question}\nGenerate a list of tasks in bullet points that fulfill the requirements." 29 | pred_generate_tasks = dspy.Predict("context, question -> tasks") 30 | TasksList = pred_generate_tasks(context=context, question=question) 31 | 32 | return TasksList 33 | 34 | 35 | class MultiHopTasks(dspy.Module): 36 | def __init__(self, lm, passages_per_hop=3): 37 | self.Generate_query = dspy.ChainOfThought("context, question -> query") 38 | self.retrieve = dspy.Retrieve(k=passages_per_hop) 39 | self.generate_answer = dspy.ChainOfThought("context, question -> task_list") 40 | 41 | def forward(self, context, question): 42 | context_list = [context] # Convert context to a list 43 | for _ in range(2): 44 | query = self.Generate_query( 45 | context=context_list[-1], question=question 46 | ).query 47 | retrieved_passages = self.retrieve(query).passages 48 | context_list.extend(retrieved_passages) 49 | return self.generate_answer(context=context_list, question=question) 50 | 51 | 52 | class MultiHop(dspy.Module): 53 | def __init__(self, lm, passages_per_hop=3): 54 | self.Generate_query = dspy.ChainOfThought("context, question -> query") 55 | self.retrieve = dspy.Retrieve(k=passages_per_hop) 56 | self.generate_answer = dspy.ChainOfThought("context, question -> answer") 57 | 58 | def forward(self, context, question): 59 | context_list = [context] # Convert context to a list 60 | for _ in range(2): 61 | query = self.Generate_query( 62 | context=context_list[-1], question=question 63 | ).query 64 | retrieved_passages = self.retrieve(query).passages 65 | context_list.extend(retrieved_passages) 66 | return self.generate_answer(context=context_list, question=question) 67 | 68 | 69 | def DoesImportModuleExist(code): 70 | modules = re.findall(r"import\s+(\w+)", code) 71 | missing_modules = [] 72 | 73 | for module_name in modules: 74 | try: 75 | importlib.import_module(module_name) 76 | print(f"{module_name} is already installed.") 77 | except ModuleNotFoundError: 78 | missing_modules.append(module_name) 79 | 80 | if missing_modules: 81 | user_input = input( 82 | f"The following modules are not installed: {', '.join(missing_modules)}. Do you want to install them? (Y/N): " 83 | ) 84 | if user_input.upper() == "Y": 85 | import subprocess 86 | 87 | for module_name in missing_modules: 88 | subprocess.run(["pip", "install", module_name]) 89 | return True 90 | else: 91 | return False 92 | else: 93 | return True 94 | 95 | 96 | def ValidateCode(code, task): 97 | validation_question = f"The requirements are: {task}. Does the following code fulfill them? True or False\n{code}" 98 | IsCodeValid = MultiHop(MyLM).forward(context="...", question=validation_question) 99 | return IsCodeValid.answer 100 | 101 | 102 | def ValidateCodeMatchesTask(CodeBlock, task): 103 | EvalQuestion = ( 104 | "The requirements are: " 105 | + task 106 | + "\n" 107 | + "And the code is this: \n" 108 | + CodeBlock 109 | + "\n" 110 | + "Is it true that the code fullfil the requirements? True or False" 111 | ) 112 | print("A *************************************") 113 | print(EvalQuestion) 114 | multihop = MultiHop(MyLM) 115 | response = multihop.forward( 116 | context="You are an expert programm who evalutes code to determine if it meets the requirements. Return True or False.", 117 | question=EvalQuestion, 118 | ) 119 | print("B *************************************") 120 | print(response) 121 | print("C *************************************") 122 | 123 | return response 124 | 125 | 126 | def run_python_code(code): 127 | try: 128 | print("-- RUN THE FOLLOWING CODE -- \n") 129 | code = code.replace("Â ", "") 130 | code = code.replace("```", "***", 1) 131 | code = code.replace("```", "***", 1) 132 | print( 133 | ("--------------------------------------------------------------------\n") 134 | ) 135 | print(code + "\n") 136 | print( 137 | ("--------------------------------------------------------------------\n") 138 | ) 139 | 140 | InstallModule = DoesImportModuleExist(code) 141 | if InstallModule: 142 | print("Required Modules are Installed") 143 | else: 144 | print("Module was Not Installed, but is required for this script.") 145 | return 146 | 147 | compiled_code = compile(code, "file", "exec") 148 | # print("code compiled successfully") 149 | 150 | # HERE WE SHOULD CHECK TO SEE IF THE CODE IS DANGEROUS TO RUN 151 | question = "Is this code dangerous to run? " + code 152 | 153 | Pred = dspy.Predict("question -> rationale, bool") 154 | response = Pred(question=question) 155 | 156 | print("Is this code dangerous to run? " + str(response.bool) + "\n") 157 | 158 | print(response.rationale + "\n") 159 | 160 | if str(response.bool) == "False": 161 | print("This code is safe to run. You may process the code.\n") 162 | exec(compiled_code) 163 | else: 164 | user_input = input( 165 | "The code may not be safe to run. Are you sure you want to continue? (Y/N): " 166 | ) 167 | 168 | if user_input.upper() == "Y": 169 | print("Continuing with running the code.\n") 170 | exec(compiled_code) 171 | print("\n" + "Code processing completed.") 172 | else: 173 | print("Exiting without running the code.") 174 | except SyntaxError as e: 175 | print(f"Error executing code: {e}") 176 | 177 | 178 | def process_generated_code(code): 179 | """ 180 | Processes the generated code by cleaning and potentially performing additional checks. 181 | """ 182 | # Implement code cleaning or other processing steps here 183 | cleaned_code = code.replace("Â ", "") 184 | cleaned_code = cleaned_code.replace("```", "***", 1) 185 | cleaned_code = cleaned_code.replace("```", "***", 1) 186 | return cleaned_code 187 | 188 | 189 | def build_code_block(context, question): 190 | """ 191 | Generates, processes, and compiles the code for a given task. 192 | """ 193 | code = GenCode(context=context, task=question) 194 | processed_code = process_generated_code(code) 195 | return processed_code 196 | 197 | 198 | def compile_tasks_into_one_block(tasks): 199 | """ 200 | Compiles a list of task code strings into a single Python code block. 201 | 202 | Args: 203 | tasks: A list of strings, where each string represents the code for a task. 204 | 205 | Returns: 206 | A single string containing the combined code block for all tasks. 207 | 208 | This function iterates through the provided task codes and joins them with appropriate 209 | separators to create a single executable block. It ensures proper separation 210 | between tasks to avoid syntax errors. 211 | """ 212 | # Initialize an empty string to hold the compiled code 213 | compiled_code_block = "" 214 | 215 | # Iterate over each task's code 216 | for task_code in tasks: 217 | # **Prepend each task code with two newlines** 218 | task_code = "\n\n" + task_code 219 | 220 | # Append the task's code to the compiled code block 221 | compiled_code_block += task_code 222 | 223 | # Return the compiled code block 224 | return compiled_code_block 225 | 226 | 227 | def GenCode(context, task, depth=0, max_depth=5): 228 | print("Enter GenCode at Depth: " + str(depth)) 229 | 230 | #print("context : " + context + "\n") 231 | #print("task: " + task + "\n") 232 | 233 | multihop = MultiHop(MyLM) 234 | response = multihop.forward(context=context, question=task) 235 | 236 | try: 237 | generated_code = response.answer 238 | generated_code = generated_code.replace("Â ", "") 239 | generated_code = generated_code.replace("```", "***", 1) 240 | generated_code = generated_code.replace("```", "***", 1) 241 | print("-----------------------------------------") 242 | print(generated_code) 243 | print("-----------------------------------------") 244 | 245 | isCodeValid = ValidateCode(generated_code, task) 246 | print("IsCodeValid: " + str(isCodeValid)) 247 | #print(type(isCodeValid)) 248 | 249 | if isCodeValid: 250 | print("isCodeValid is True...") 251 | print(generated_code) 252 | if generated_code: 253 | start_marker = "***python" 254 | end_marker = "***" 255 | 256 | start = generated_code.find(start_marker) + len(start_marker) 257 | end = generated_code.find(end_marker, start) 258 | 259 | python_code = generated_code[start:end].strip() 260 | return python_code 261 | else: 262 | if depth >= max_depth: 263 | raise ValueError("Maximum recursion depth reached") 264 | else: 265 | GenCode(context, task, depth=depth + 1) 266 | 267 | except Exception as e: 268 | print(str(e)) 269 | sys.exit(1) 270 | 271 | # ... (code for generating code) 272 | 273 | 274 | class Main: 275 | def __init__(self, context, question): 276 | self.context = context 277 | self.question = question 278 | 279 | def execute(self): 280 | try: 281 | print("--- START PROGRAM ---\n\n") 282 | print("Context: " + context) 283 | print("Question: " + question) 284 | print("------------------") 285 | 286 | print("Generate Tasks...") 287 | 288 | tasks_data = GenerateTasks.forward(context=context, question=question) 289 | tasks = tasks_data.tasks.split("\n") 290 | 291 | if isinstance(tasks_data, dspy.primitives.prediction.Prediction): 292 | compiled_task_codes = [] 293 | 294 | tasks = tasks_data.tasks.split("\n") 295 | 296 | print("=================================================") 297 | print("Tasks to be processed:") 298 | print(tasks) 299 | print("=================================================") 300 | for task_index, task in enumerate( 301 | tasks[0:], start=1 302 | ): 303 | #cleaned_task = task.strip(".") # Remove trailing period if present 304 | cleaned_task = task.strip("1234567890.") 305 | 306 | print( 307 | f"Task {task_index}: {cleaned_task}" 308 | ) # Print task number and description 309 | 310 | Code_Block = build_code_block( 311 | context=context, 312 | question=f"Generate a python script that does the following: \n{cleaned_task}", 313 | ) 314 | 315 | print("validate code...") 316 | CodeValidated = ValidateCodeMatchesTask( 317 | CodeBlock=Code_Block, task=task 318 | ) 319 | print("========== CodeValidated ================") 320 | print(CodeValidated) 321 | print("=========================================") 322 | if CodeValidated: 323 | print("Code_Block: \n" + str(Code_Block)) 324 | compiled_task_codes.append(Code_Block) 325 | else: 326 | print(f"Task code failed validation for task: {task}") 327 | 328 | if compiled_task_codes: 329 | print("compiled Tasks:") 330 | 331 | combined_code_block = compile_tasks_into_one_block( 332 | compiled_task_codes 333 | ) 334 | print("Combined Code Block:") 335 | print(combined_code_block) 336 | run_python_code(combined_code_block) 337 | else: 338 | print("No valid code generated from tasks.") 339 | except Exception as e: 340 | print(f"Failed to generate tasks from LLM: {e}") 341 | 342 | 343 | if __name__ == "__main__": 344 | context = sys.argv[1] 345 | question = sys.argv[2] 346 | 347 | main_program = Main(context, question) 348 | main_program.execute() 349 | -------------------------------------------------------------------------------- /DSPY11.py: -------------------------------------------------------------------------------- 1 | import importlib 2 | import re 3 | import sys 4 | 5 | import dspy 6 | 7 | colbertv2_wiki17_abstracts = dspy.ColBERTv2( 8 | url="http://20.102.90.50:2017/wiki17_abstracts" 9 | ) 10 | MyLM = dspy.OpenAI( 11 | api_base="http://localhost:1234/v1/", 12 | api_key="sk-111111", 13 | model="macadeliccc/laser-dolphin-mixtral-2x7b-dpo", 14 | temperature=0.6, 15 | max_tokens=7000, 16 | ) 17 | dspy.settings.configure(lm=MyLM, rm=colbertv2_wiki17_abstracts) 18 | 19 | 20 | class MultiHop(dspy.Module): 21 | def __init__(self, lm, passages_per_hop=3): 22 | self.Generate_query = dspy.ChainOfThought("context, question -> query") 23 | self.retrieve = dspy.Retrieve(k=passages_per_hop) 24 | self.generate_answer = dspy.ChainOfThought("context, question -> answer") 25 | 26 | def forward(self, context, question): 27 | context_list = [context] # Convert context to a list 28 | 29 | # Combine all tasks into a single string before sending to Retriever 30 | combined_tasks = "\n".join(question.split("\n")[1:]) 31 | 32 | query = self.Generate_query( 33 | context=context_list[-1], 34 | question=f"Given the following tasks:\n{combined_tasks}\nWhat is the Python code to accomplish them?", 35 | ).query 36 | retrieved_passages = self.retrieve(query).passages 37 | context_list.extend(retrieved_passages) 38 | return self.generate_answer(context=context_list, question=question) 39 | 40 | 41 | class MultiHop(dspy.Module): 42 | def __init__(self, lm, passages_per_hop=3): 43 | self.Generate_query = dspy.ChainOfThought("context, question -> query") 44 | self.retrieve = dspy.Retrieve(k=passages_per_hop) 45 | self.generate_answer = dspy.ChainOfThought("context, question -> answer") 46 | 47 | def forward(self, context, question): 48 | context_list = [context] # Convert context to a list 49 | for _ in range(2): 50 | query = self.Generate_query( 51 | context=context_list[-1], question=question 52 | ).query 53 | retrieved_passages = self.retrieve(query).passages 54 | context_list.extend(retrieved_passages) 55 | return self.generate_answer(context=context_list, question=question) 56 | 57 | 58 | class MultiHopTasks(dspy.Module): 59 | def __init__(self, lm, passages_per_hop=3): 60 | self.Generate_query = dspy.ChainOfThought("context, question -> query") 61 | self.retrieve = dspy.Retrieve(k=passages_per_hop) 62 | self.generate_answer = dspy.ChainOfThought("context, question -> task_list") 63 | 64 | def forward(self, context, question): 65 | context_list = [context] # Convert context to a list 66 | for _ in range(2): 67 | query = self.Generate_query( 68 | context=context_list[-1], question=question 69 | ).query 70 | retrieved_passages = self.retrieve(query).passages 71 | context_list.extend(retrieved_passages) 72 | return self.generate_answer(context=context_list, question=question) 73 | 74 | 75 | 76 | class GenerateTasks(dspy.Signature): 77 | """Generate a list of tasks in structured format.""" 78 | 79 | context = dspy.InputField(desc="You create a high level project task list.") 80 | question = dspy.InputField() 81 | tasks = dspy.OutputField(desc="Enumerated Task List", type=list) 82 | 83 | def forward(context, question): 84 | #prompt = f"Context: {context}\nQuestion: {question}\nGenerate a list of tasks in bullet points that fulfill the requirements." 85 | pred_generate_tasks = dspy.Predict("context, question -> tasks") 86 | TasksList = pred_generate_tasks(context=context, question=question) 87 | 88 | #multihop = MultiHop(MyLM) 89 | #response = multihop.forward(context=context, question=question) 90 | #TasksList = response.answer 91 | 92 | return TasksList 93 | 94 | 95 | def DoesImportModuleExist(code): 96 | modules = re.findall(r"import\s+(\w+)", code) 97 | missing_modules = [] 98 | 99 | for module_name in modules: 100 | try: 101 | importlib.import_module(module_name) 102 | print(f"{module_name} is already installed.") 103 | except ModuleNotFoundError: 104 | missing_modules.append(module_name) 105 | 106 | if missing_modules: 107 | user_input = input( 108 | f"The following modules are not installed: {', '.join(missing_modules)}. Do you want to install them? (Y/N): " 109 | ) 110 | if user_input.upper() == "Y": 111 | import subprocess 112 | 113 | for module_name in missing_modules: 114 | subprocess.run(["pip", "install", module_name]) 115 | return True 116 | else: 117 | return False 118 | else: 119 | return True 120 | 121 | def ValidateCode(code, task): 122 | validation_question = f"The requirements are: {task}. Does the following code fulfill them? True or False\n{code}" 123 | IsCodeValid = MultiHop(MyLM).forward(context="...", question=validation_question) 124 | return IsCodeValid.answer 125 | 126 | def ValidateCodeMatchesTask(CodeBlock, task): 127 | EvalQuestion = ( 128 | "The requirements are: " 129 | + task 130 | + "\n" 131 | + "And the code is this: \n" 132 | + CodeBlock 133 | + "\n" 134 | + "Is it true that the code fullfil the requirements? True or False" 135 | ) 136 | print("A *************************************") 137 | print(EvalQuestion) 138 | multihop = MultiHop(MyLM) 139 | response = multihop.forward( 140 | context="You are an expert programm who evalutes code to determine if it meets the requirements. Return True or False.", 141 | question=EvalQuestion, 142 | ) 143 | print("B *************************************") 144 | print(response) 145 | print("C *************************************") 146 | 147 | return response 148 | 149 | 150 | def run_python_code(code): 151 | try: 152 | print("-- RUN THE FOLLOWING CODE -- \n") 153 | code = code.replace("Â ", "") 154 | code = code.replace("```", "***", 1) 155 | code = code.replace("```", "***", 1) 156 | print( 157 | ("--------------------------------------------------------------------\n") 158 | ) 159 | print(code + "\n") 160 | print( 161 | ("--------------------------------------------------------------------\n") 162 | ) 163 | 164 | InstallModule = DoesImportModuleExist(code) 165 | if InstallModule: 166 | print("Required Modules are Installed") 167 | else: 168 | print("Module was Not Installed, but is required for this script.") 169 | return 170 | 171 | compiled_code = compile(code, "file", "exec") 172 | # print("code compiled successfully") 173 | 174 | # HERE WE SHOULD CHECK TO SEE IF THE CODE IS DANGEROUS TO RUN 175 | question = "Is this code dangerous to run? " + code 176 | 177 | Pred = dspy.Predict("question -> rationale, bool") 178 | response = Pred(question=question) 179 | 180 | print("Is this code dangerous to run? " + str(response.bool) + "\n") 181 | 182 | print(response.rationale + "\n") 183 | 184 | if str(response.bool) == "False": 185 | print("This code is safe to run. You may process the code.\n") 186 | exec(compiled_code) 187 | else: 188 | user_input = input( 189 | "The code may not be safe to run. Are you sure you want to continue? (Y/N): " 190 | ) 191 | 192 | if user_input.upper() == "Y": 193 | print("Continuing with running the code.\n") 194 | exec(compiled_code) 195 | print("\n" + "Code processing completed.") 196 | else: 197 | print("Exiting without running the code.") 198 | except SyntaxError as e: 199 | print(f"Error executing code: {e}") 200 | 201 | 202 | def process_generated_code(code): 203 | """ 204 | Processes the generated code by cleaning and potentially performing additional checks. 205 | """ 206 | # Implement code cleaning or other processing steps here 207 | cleaned_code = code.replace("Â ", "") 208 | cleaned_code = cleaned_code.replace("```", "***", 1) 209 | cleaned_code = cleaned_code.replace("```", "***", 1) 210 | return cleaned_code 211 | 212 | 213 | def build_code_block(context, question): 214 | """ 215 | Generates, processes, and compiles the code for a given task. 216 | 217 | Combines all tasks into a single question before sending to MultiHop. 218 | """ 219 | code = GenCode(context=context, task=question) 220 | processed_code = process_generated_code(code) 221 | return processed_code 222 | 223 | 224 | def compile_tasks_into_one_block(tasks): 225 | """ 226 | Compiles a list of task code strings into a single Python code block. 227 | 228 | Args: 229 | tasks: A list of strings, where each string represents the code for a task. 230 | 231 | Returns: 232 | A single string containing the combined code block for all tasks. 233 | 234 | This function iterates through the provided task codes and joins them with appropriate 235 | separators to create a single executable block. It ensures proper separation 236 | between tasks to avoid syntax errors. 237 | """ 238 | # Initialize an empty string to hold the compiled code 239 | compiled_code_block = "" 240 | 241 | # Iterate over each task's code 242 | for task_code in tasks: 243 | # **Prepend each task code with two newlines** 244 | task_code = "\n\n" + task_code 245 | 246 | # Append the task's code to the compiled code block 247 | compiled_code_block += task_code 248 | 249 | # Return the compiled code block 250 | return compiled_code_block 251 | 252 | 253 | def GenCode(context, task, depth=0, max_depth=5): 254 | print("Enter GenCode at Depth: " + str(depth)) 255 | 256 | multihop = MultiHop(MyLM) 257 | response = multihop.forward(context=context, question=task) 258 | 259 | try: 260 | generated_code = response.answer 261 | generated_code = generated_code.replace("Â ", "") 262 | generated_code = generated_code.replace("```", "***", 1) 263 | generated_code = generated_code.replace("```", "***", 1) 264 | print("-- GENERATED CODE -----------------------") 265 | print(generated_code) 266 | print("-----------------------------------------") 267 | 268 | isCodeValid = ValidateCode(generated_code, task) 269 | print("IsCodeValid: " + str(isCodeValid)) 270 | 271 | if isCodeValid: 272 | print("isCodeValid is True...") 273 | print(generated_code) 274 | if generated_code: 275 | start_marker = "***python" 276 | end_marker = "***" 277 | 278 | start = generated_code.find(start_marker) + len(start_marker) 279 | end = generated_code.find(end_marker, start) 280 | 281 | python_code = generated_code[start:end].strip() 282 | return python_code 283 | else: 284 | if depth >= max_depth: 285 | raise ValueError("Maximum recursion depth reached") 286 | else: 287 | GenCode(context, task, depth=depth + 1) 288 | 289 | except Exception as e: 290 | print(str(e)) 291 | sys.exit(1) 292 | 293 | class Main: 294 | def __init__(self, context, question): 295 | self.context = context 296 | self.question = question 297 | 298 | def execute(self): 299 | try: 300 | print("--- START PROGRAM ---\n\n") 301 | print("Context: " + context) 302 | print("Question: " + question) 303 | print("------------------") 304 | 305 | print("Generate Tasks...") 306 | 307 | tasks_data = GenerateTasks.forward(context=context, question=question) 308 | tasks = tasks_data.tasks.split("\n") 309 | 310 | if isinstance(tasks_data, dspy.primitives.prediction.Prediction): 311 | compiled_task_codes = [] 312 | 313 | tasks = tasks_data.tasks.split("\n") 314 | 315 | print("=================================================") 316 | print("Tasks to be processed:") 317 | print(tasks) 318 | print("=================================================") 319 | for task_index, task in enumerate(tasks[0:], start=1): 320 | # cleaned_task = task.strip(".") # Remove trailing period if present 321 | cleaned_task = task.strip("1234567890.") 322 | 323 | print( 324 | f"Task {task_index}: {cleaned_task}" 325 | ) 326 | 327 | Code_Block = build_code_block( 328 | context=context, 329 | question=f"Generate a python script that does the following: \n{cleaned_task}", 330 | ) 331 | 332 | print("validate code...") 333 | CodeValidated = ValidateCodeMatchesTask( 334 | CodeBlock=Code_Block, task=task 335 | ) 336 | print("========== CodeValidated ================") 337 | print(CodeValidated) 338 | print("=========================================") 339 | if CodeValidated: 340 | print("Code_Block: \n" + str(Code_Block)) 341 | compiled_task_codes.append(Code_Block) 342 | else: 343 | print(f"Task code failed validation for task: {task}") 344 | 345 | if compiled_task_codes: 346 | print("compiled Tasks:") 347 | 348 | combined_code_block = compile_tasks_into_one_block( 349 | compiled_task_codes 350 | ) 351 | print("Combined Code Block:") 352 | print(combined_code_block) 353 | run_python_code(combined_code_block) 354 | else: 355 | print("No valid code generated from tasks.") 356 | except Exception as e: 357 | print(f"Failed to generate tasks from LLM: {e}") 358 | 359 | 360 | if __name__ == "__main__": 361 | context = sys.argv[1] 362 | question = sys.argv[2] 363 | 364 | main_program = Main(context, question) 365 | main_program.execute() 366 | -------------------------------------------------------------------------------- /DSPY12.py: -------------------------------------------------------------------------------- 1 | import dspy 2 | import re 3 | import io 4 | import sys 5 | import importlib 6 | import traceback 7 | import ast 8 | import pylint 9 | from ast import parse 10 | from io import StringIO 11 | from transformers import BertTokenizer 12 | from pylint import lint 13 | from pylint.reporters import text 14 | 15 | print("Inside DSPY12.py...") 16 | 17 | colbertv2_wiki17_abstracts = dspy.ColBERTv2(url="http://20.102.90.50:2017/wiki17_abstracts") 18 | 19 | # MyLM = dspy.OpenAI( 20 | # api_base="http://localhost:1234/v1/", 21 | # api_key="sk-111111", 22 | # model="macadeliccc/laser-dolphin-mixtral-2x7b-dpo", 23 | # temperature=0.6, 24 | # max_tokens=7000, 25 | # ) 26 | 27 | try: 28 | MyLM = dspy.OpenAI( 29 | api_base="https://api.fireworks.ai/inference/v1/", 30 | api_key="KsQU3QAFYmdQpXAewUKgcnZSmmadB2NbGAAE8xsU1SAC6e8G", 31 | # model="accounts/fireworks/models/mistral-7b-instruct-4k", 32 | model="accounts/fireworks/models/mixtral-8x22b-instruct", 33 | temperature=0, 34 | max_tokens=3000, 35 | ) 36 | print("MyLM is initialized.") 37 | dspy.settings.configure(lm=MyLM, rm=colbertv2_wiki17_abstracts, timeout=30) 38 | print("Settings are configured.") 39 | 40 | except Exception as e: 41 | tb = traceback.format_exc() 42 | print(f"There was an Error: {e}\n{tb}", file=sys.stderr) 43 | 44 | 45 | class MultiHop(dspy.Module): 46 | def __init__(self, lm, passages_per_hop=3): 47 | self.Generate_query = dspy.ChainOfThought("context, question -> query") 48 | self.retrieve = dspy.Retrieve(k=passages_per_hop) 49 | self.generate_answer = dspy.ChainOfThought("context, question -> answer") 50 | 51 | def forward(self, context, question): 52 | print("Inside MultiHop 1") 53 | context_list = [context] 54 | tokenizer = BertTokenizer.from_pretrained( 55 | "bert-base-uncased" 56 | ) # Or whatever tokenizer you're using 57 | 58 | # Create a Predict object for summarization 59 | ContextSum = dspy.Predict("context, question -> summary") 60 | 61 | for _ in range(3): # Change this number to the number of hops you want 62 | query = self.Generate_query( 63 | context=context_list[-1], question=question 64 | ).query 65 | retrieved_passages = self.retrieve(query).passages 66 | 67 | # Check the size of the context_list 68 | context_string = " ".join(context_list) 69 | num_tokens = len(tokenizer.tokenize(context_string)) 70 | if num_tokens > 0.75 * tokenizer.model_max_length: 71 | # If the context_list is too large, summarize the first item 72 | context_list[0] = ContextSum( 73 | context=context_list[0], question=question 74 | ).summary 75 | 76 | context_list.extend(retrieved_passages) 77 | 78 | return self.generate_answer(context=context_list, question=question) 79 | 80 | 81 | class GenerateTasks(dspy.Signature): 82 | """Generate a list of tasks in structured format.""" 83 | 84 | context = dspy.InputField(desc="You create a high level project task list.") 85 | question = dspy.InputField() 86 | tasks = dspy.OutputField(desc="Enumerated Task List", type=list) 87 | 88 | def forward(context, question): 89 | print("Inside GenerateTasks...") 90 | 91 | # NOTE: PREDICT IS INFERIOR TO CHAINOFTHOUGHT 92 | # pred_generate_tasks = dspy.Predict("context, question -> tasks") 93 | # TasksList = pred_generate_tasks(context=context, question=question) 94 | 95 | pred_generate_tasks2 = dspy.ChainOfThought("context, question -> tasks") 96 | TasksList2 = pred_generate_tasks2(context=context, question=question) 97 | 98 | # print("tasks: " + str(TasksList)) 99 | # print("tasks2: " + str(TasksList2)) 100 | 101 | # USE CHAIN OF THOUGHT RESULTS 102 | return TasksList2 103 | 104 | 105 | def DoesImportModuleExist(code): 106 | modules = re.findall(r"import\s+(\w+)", code) 107 | missing_modules = [] 108 | 109 | for module_name in modules: 110 | try: 111 | importlib.import_module(module_name) 112 | print(f"{module_name} is already installed.") 113 | except ModuleNotFoundError: 114 | missing_modules.append(module_name) 115 | 116 | if missing_modules: 117 | user_input = input( 118 | f"The following modules are not installed: {', '.join(missing_modules)}. Do you want to install them? (Y/N): " 119 | ) 120 | if user_input.upper() == "Y": 121 | import subprocess 122 | 123 | for module_name in missing_modules: 124 | subprocess.run(["pip", "install", module_name]) 125 | return True 126 | else: 127 | return False 128 | else: 129 | return True 130 | 131 | 132 | 133 | def identify_language(code): 134 | """ 135 | Attempts to identify the name of the programming language of the provided code snippet. 136 | 137 | Args: 138 | code: The code string to identify. 139 | 140 | Returns: 141 | A string representing the identified programming language name, e.g., 'python', 'csharp', 'vbnet', etc. 142 | """ 143 | context = "You are a programming expert who can determine the language name that a code block is written in." 144 | question = code[:100] 145 | 146 | def forward(context, question): 147 | pred_Language = dspy.Predict("context, code_snip -> code_language") 148 | ProgLanguage = pred_Language(context=context, code_snip=question) 149 | print("Inside identify_language forward()") 150 | 151 | parts = ProgLanguage.code_language.split("\n") 152 | code_language = parts[0].strip() 153 | print("Language:" + code_language.lower().strip()) 154 | 155 | return code_language.lower() 156 | 157 | return forward(context, question) 158 | 159 | 160 | def validate_python_code_ast(code): 161 | """ 162 | Validates Python code syntax and optionally performs additional checks. 163 | 164 | Args: 165 | code: The Python code string to validate. 166 | 167 | Returns: 168 | A tuple containing: 169 | - is_ast_valid: Boolean indicating if the code is syntactically valid (based on ast.parse). 170 | - additional_checks: List of results from any additional checks performed (empty list if none). 171 | """ 172 | print("Inside validate_python_code_ast...") 173 | 174 | is_ast_valid = True 175 | additional_checks = [] 176 | error_message = "" 177 | 178 | try: 179 | # Validate basic syntax using ast.parse 180 | parse(code) 181 | except SyntaxError as e: 182 | is_ast_valid = False 183 | error_message = str(e) 184 | 185 | 186 | # Optionally perform additional checks using libraries like pylint 187 | try: 188 | # Pylint check (example) 189 | print("linter validation...") 190 | 191 | # Assuming 'code' is the string of code you want to lint 192 | # Write the code to a temporary file 193 | with open('temp_file.py', 'w') as temp_file: 194 | temp_file.write(code) 195 | 196 | # Initialize a StringIO object to capture the output 197 | pylint_output = StringIO() 198 | 199 | # Run Pylint on the temporary file 200 | pylint.lint.Run(['temp_file.py'], reporter=text.TextReporter(pylint_output), exit=False) 201 | 202 | # Get the output 203 | output = pylint_output.getvalue() 204 | 205 | # Parse the output to get the number of warnings 206 | # This is a simplified example; parsing the output for specific information would require more sophisticated parsing 207 | warnings_count = output.count('warning') 208 | 209 | # Append the count of warnings to additional_checks 210 | additional_checks.append(f"Pylint warnings: {warnings_count}") 211 | 212 | except Exception as e: 213 | # Handle potential errors during additional checks 214 | print(f"Error during additional checks: {e}") 215 | error_message = error_message + ", " + str(e) 216 | 217 | return is_ast_valid, additional_checks, error_message 218 | 219 | 220 | def ValidateCodeMatchesTask(CodeBlock, TasksList): 221 | print("Inside ValidateCodeMatchesTask...") 222 | EvalQuestion = ( 223 | "The requirements are: \n" 224 | + TasksList + " \n" 225 | + "And the code is this: \n" 226 | + "----------------------------------------------------- \n" 227 | + (CodeBlock + " \n") 228 | + "----------------------------------------------------- \n" 229 | + "Does this code fulfill each and every requirement in the task list? True or False" 230 | ) 231 | print("** EVAL QUESTION ******************************************************* \n") 232 | print(EvalQuestion) 233 | multihop = MultiHop(MyLM) 234 | response = multihop.forward( 235 | context="You are a Quality Assurance expert programmer who evalutes code to determine if it meets all of the the requirements. Every item in the task list must be met by the code. Return True or False.", 236 | question=EvalQuestion, 237 | ) 238 | print("** EVAL RESPONSE ****************************************************** \n") 239 | print(response.rationale) 240 | print("** END EVALUATION ***************************************************** \n") 241 | 242 | return response 243 | 244 | def run_code(Code_Block, language): 245 | print("Running the code...") 246 | if language.lower() == "python": 247 | try: 248 | print( 249 | "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! \n" 250 | ) 251 | run_python_code(Code_Block) 252 | print( 253 | "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! \n" 254 | ) 255 | except Exception as e: 256 | print(f"Failed to run code: {e}") 257 | sys.exit(1) 258 | else: 259 | print("This is non-executable source code so we will not run it.") 260 | 261 | 262 | def run_python_code(code): 263 | try: 264 | print("-- RUN THE FOLLOWING CODE -- \n") 265 | code = code.replace("Â ", "") 266 | code = code.replace("```", "***", 1) 267 | code = code.replace("```", "***", 1) 268 | print("--------------------------------------------------------------------\n") 269 | 270 | print(code + "\n") 271 | print("--------------------------------------------------------------------\n") 272 | 273 | InstallModule = DoesImportModuleExist(code) 274 | if InstallModule: 275 | print("Required Modules are Installed") 276 | else: 277 | print("Module was Not Installed, but is required for this script.") 278 | return 279 | 280 | question = "Is this code dangerous to run? " + code 281 | 282 | Pred = dspy.Predict("question -> rationale, bool") 283 | response = Pred(question=question) 284 | 285 | print("Is this code dangerous to run? " + str(response.bool) + "\n") 286 | 287 | if str(response.bool) == "False": 288 | print("Validate the compiled code with ast...") 289 | 290 | ast_valid = validate_python_code_ast(code) 291 | 292 | print("Is AST Validated: " + str(ast_valid)) 293 | 294 | if ast_valid[0]: 295 | print( 296 | "This code is safe to run and passed ast validation... compiling code..." 297 | ) 298 | compiled_code = compile(code, "file", "exec") 299 | print("Code is compiled... Run Code...") 300 | try: 301 | print(compiled_code) 302 | exec(compiled_code) 303 | print("\n" + "Code processing completed.") 304 | return True 305 | except Exception as e: 306 | tb = traceback.format_exc() 307 | print(f"There was an Error: {e}\n{tb}", file=sys.stderr) 308 | return e 309 | else: 310 | print("Code did not pass ast validation.") 311 | return "AST_FAIL" 312 | 313 | else: 314 | print(response.rationale + "\n") 315 | user_input = input( 316 | "The code may not be safe to run. Are you sure you want to continue? (Y/N): " 317 | ) 318 | 319 | if user_input.upper() == "Y": 320 | print("Continuing with running the code.\n") 321 | compiled_code = compile(code, "file", "exec") 322 | print("Code is compiled... Run Code...") 323 | try: 324 | print(compiled_code) 325 | exec(compiled_code) 326 | print("\n" + "Code processing completed.") 327 | except Exception as e: 328 | tb = traceback.format_exc() 329 | print(f"There was an Error: {e}\n{tb}", file=sys.stderr) 330 | else: 331 | print("Exiting without running the code.") 332 | except Exception as e: 333 | tb = traceback.format_exc() 334 | print(f"There was an Error: {e}\n{tb}", file=sys.stderr) 335 | 336 | 337 | def clean_generated_code(code): 338 | """ 339 | Processes the generated code by cleaning and potentially performing additional checks. 340 | """ 341 | # Implement code cleaning or other processing steps here 342 | cleaned_code = code.replace("Â ", "") 343 | cleaned_code = cleaned_code.replace("```", "***", 1) 344 | cleaned_code = cleaned_code.replace("```", "***", 1) 345 | return cleaned_code 346 | 347 | 348 | def extract_code_block(generated_code, inpLanguage): 349 | print("Inside extract_code_block...") 350 | 351 | # SET CODE BLOCK IN CASE NO MARKERS ARE FOUND 352 | code_block = generated_code 353 | language = "" 354 | # Find the start of the code block 355 | start_marker_pattern = r"```(\w+)?" 356 | start_match = re.search(start_marker_pattern, generated_code) 357 | if start_match: 358 | start_marker = start_match.group() 359 | start_index = start_match.start() 360 | 361 | # Find the end of the code block 362 | end_marker = start_marker[:3] 363 | end_index = generated_code.find(end_marker, start_index + len(start_marker)) 364 | if end_index != -1: 365 | code_block = generated_code[ 366 | start_index + len(start_marker) : end_index 367 | ].strip() 368 | 369 | # Determine the language 370 | language_match = re.search(r"(\w+)", start_marker) 371 | if language_match: 372 | language = language_match.group(1).lower() 373 | else: 374 | language = None 375 | 376 | if inpLanguage != language: 377 | print("Note: input language did not match found language") 378 | print( 379 | "inpLanguage: " + str(inpLanguage) + ", Language: " + str(language) 380 | ) 381 | 382 | return code_block 383 | 384 | return code_block, language 385 | 386 | 387 | def GenCode(context, task, depth=0, max_depth=5): 388 | """ 389 | Generates code using MultiHop with a limited recursion depth. 390 | 391 | Args: 392 | context: The context string for the code generation. 393 | task: The task description for the code to fulfill. 394 | depth: Current recursion depth (internal use). 395 | max_depth: Maximum allowed recursion depth. 396 | 397 | Returns: 398 | The generated code if successful, None otherwise. 399 | 400 | Raises: 401 | ValueError: If the maximum recursion depth is reached. 402 | """ 403 | print("Enter GenCode (" + str(depth) + ")...") 404 | 405 | multihop = MultiHop(MyLM) 406 | response = multihop.forward(context=context, question=task) 407 | 408 | try: 409 | generated_code = response.answer 410 | print("-- GENERATED CODE -----------------------") 411 | print(generated_code) 412 | print("-----------------------------------------") 413 | 414 | language = identify_language(generated_code).lower() 415 | extracted_code = extract_code_block(generated_code, language) 416 | 417 | print("-- EXTRACTED CODE -----------------------") 418 | print(extracted_code) 419 | print("-----------------------------------------") 420 | 421 | isCodeValid = ValidateCodeMatchesTask( CodeBlock=extracted_code, TasksList=task) 422 | print("IsCodeValid: " + str(isCodeValid.answer)) 423 | 424 | if isCodeValid: 425 | 426 | # return the generated code. Note: code can come with explanation text. We only want the code. 427 | return extracted_code, language 428 | 429 | else: 430 | if depth >= max_depth: 431 | raise ValueError("Maximum recursion depth reached") 432 | else: 433 | # Retry with updated context including rationale if not max depth 434 | GenCode( 435 | context + " rationale: " + isCodeValid.rationale, 436 | task, 437 | depth=depth + 1, 438 | ) 439 | 440 | except Exception as e: 441 | tb = traceback.format_exc() 442 | print(f"There was an Error: {e}\n{tb}", file=sys.stderr) 443 | sys.exit(1) 444 | 445 | return None # No valid code generated within recursion limit 446 | 447 | 448 | class Main: 449 | def __init__(self, context, question): 450 | self.context = context 451 | self.question = question 452 | 453 | def execute(self): 454 | try: 455 | print("\n--- START PROGRAM ---\n") 456 | print("Inside Main.Execute()") 457 | print("Context: " + self.context) 458 | print("Question: " + self.question) 459 | print("------------------") 460 | 461 | print("Generate Tasks...") 462 | 463 | 464 | tasks_data = GenerateTasks.forward(context=self.context, question=self.question) 465 | 466 | tasks = tasks_data.tasks.split("\n") 467 | 468 | if isinstance(tasks_data, dspy.primitives.prediction.Prediction): 469 | TasksList = tasks_data.tasks 470 | print("=================================================") 471 | print("Tasks to be processed:") 472 | print(TasksList) 473 | print("=================================================") 474 | else: 475 | print("Tasks to be processed:") 476 | TasksList = self.question # If the task list is not generated, use the question as the task list 477 | print(TasksList) 478 | print("=================================================") 479 | 480 | try: 481 | generated_code = GenCode(context=self.context, task=self.question) 482 | extracted_code = generated_code[0] 483 | language = generated_code[1] 484 | 485 | print("Code Language: " + str(language.lower())) 486 | 487 | if language == "python": 488 | Code_Block = clean_generated_code(extracted_code) 489 | else: 490 | Code_Block = extracted_code 491 | 492 | print("Validating code...") 493 | CodeTasksValidated = ValidateCodeMatchesTask(CodeBlock=Code_Block, TasksList=TasksList) 494 | print("Is code valid: " + str(CodeTasksValidated.answer)) 495 | 496 | if CodeTasksValidated: 497 | 498 | CodeTaskValidated = True 499 | ASTValidated = True 500 | 501 | if language.lower() == "python": 502 | ast_valid = validate_python_code_ast(Code_Block) 503 | 504 | print("AST Validation A: " + str(ast_valid)) 505 | 506 | if not ast_valid[0]: 507 | print(f"Code failed AST validation.") 508 | # Add the error message to the context 509 | self.context += ( 510 | f"\n The python code failed AST validation. Please refactor the code to fix any errors: " 511 | + Code_Block 512 | + "\n Error:" 513 | + ast_valid[2] #ast_valid[2] contains the error messages from the validation procedure 514 | ) 515 | # Recursively call GenCode with the updated context 516 | generated_code = GenCode(context=self.context, task=self.question) 517 | extracted_code = generated_code[0] 518 | language = generated_code[1] 519 | 520 | if language == "python": 521 | Code_Block = clean_generated_code(extracted_code) 522 | else: 523 | Code_Block = extracted_code 524 | 525 | # Validate the new code 526 | CodeTaskValidated = ValidateCodeMatchesTask(CodeBlock=Code_Block, TasksList=TasksList) 527 | ASTValidated = validate_python_code_ast(Code_Block) 528 | 529 | if CodeTaskValidated and ASTValidated: 530 | print("Code has passed validations. Writing to file...") 531 | with open("c:/Temp/Generated_code.txt", "w") as file: 532 | file.write(Code_Block) 533 | print("Code has been saved to disk.") 534 | print("Running the code...") 535 | run_code(Code_Block=Code_Block, language=language) 536 | 537 | else: 538 | print("Code has passed validations. Writing to file...") 539 | with open("c:/Temp/Generated_code.txt", "w") as file: 540 | file.write(Code_Block) 541 | print( 542 | "This is non-executable " 543 | + language 544 | + " source code, therefore we will not attempt to run it. Code has been saved to disk instead." 545 | ) 546 | else: 547 | print(f"Code failed validation.") 548 | sys.exit(1) 549 | except ValueError as e: 550 | if "maximum recursion depth reached" in str(e): 551 | print( 552 | f"Error: Maximum recursion depth reached for generating code. Consider adjusting max_depth in GenCode or reformulating the task description." 553 | ) 554 | else: 555 | raise e # Raise other ValueErrors 556 | 557 | except Exception as e: 558 | tb = traceback.format_exc() 559 | print(f"There was an Error in Main(): {e}\n{tb}", file=sys.stderr) 560 | 561 | 562 | if __name__ == "__main__": 563 | # context = sys.argv[1] 564 | # question = sys.argv[2] 565 | 566 | # context = "You generate python code." 567 | # question = "Generatea python script that prints 'hello world' to the console." 568 | 569 | # input_value = 76 570 | # convert_from = "miles" 571 | # convert_to = "feet" 572 | # convert_to2 = "yards" 573 | # context = "You generate top quality python code, paying careful attention to the details of the requirements." 574 | # 575 | # question = (f"Generate Python code that converts {input_value} {convert_from} to {convert_to}." 576 | # f" Then convert the {input_value} to {convert_to2}." 577 | # f" Then print the conversion statement: {convert_from} to {convert_to}." 578 | # f" then print the conversion statement: {convert_from} to {convert_to2}." 579 | # f" Then create a file c:/temp/conversion.txt with the printed conversion statements in it." 580 | # f" Then perform this calculation: x = 1/0 " 581 | # f" Then have error handling routines using traceback." 582 | # f" Then print a success message, and show the name of the file and what folder the file was saved to." 583 | # ) 584 | 585 | context = ( 586 | "You generate top quality, professional, C# code, paying careful attention to the details to ensure your code meets the requirements." 587 | " You always double check your code to ensure nothing has been left out." 588 | " Your job is to only write the code, and that is all. Your job is only to write the C# code, not to create the project, deploy or to test it." 589 | ) 590 | 591 | question = ( 592 | f" Generate a windows service in C# that monitors the windows events log." 593 | f" The windows service should use an ai model hosted at http://localhost:1234/v1/ in order to provide an Alert when unusual behavior is occuring on the machine that indicates a high probability of the existance of a virus or hacker." 594 | f" The windows service should send the Alert by email to vbwyrde@yahoo.com when the service indicates the existance of a virus or hacker." 595 | f" The windows service should use professional error handling." 596 | f" The windows service should log any virus or hacker Alerts to c:/Temp/AIMonitor.log" 597 | ) 598 | 599 | print("Inside Main()...") 600 | print(context) 601 | print(question) 602 | main_program = Main(context, question) 603 | main_program.execute() 604 | -------------------------------------------------------------------------------- /DSPY12_Out.md: -------------------------------------------------------------------------------- 1 | # DSPY12.py OUTPUT 2 | This is the output of DSPY12.py ... note: a good deal of the output here are print statements to help trace the script's operations. If / when I get to a final version, it will remove most of the print statements you see here. 3 | 4 | ## DSPY12.py Features 5 | 6 | - Imports several libraries including dspy, transformers, importlib, subprocess, ast, and traceback. 7 | 8 | - Initializes a connection to a large language model (LLM) called MyLM through the dspy library. 9 | 10 | - Defines a class called MultiHop that inherits from the dspy.Module class. This class is designed to answer questions in a multi-hop fashion by combining retrieval and reasoning steps. 11 | 12 | - Defines a class called GenerateTasks that inherits from the dspy.Signature class. This class is designed to generate a list of tasks from a given context and question. 13 | 14 | - Defines a function called DoesImportModuleExist that checks if all the required modules are installed for the provided code. If not, it asks the user if they want to install them. 15 | 16 | - Defines a function called validate_python_code_ast that validates the Python code using the ast library. 17 | 18 | - Defines a function called ValidateCodeMatchesTask that checks if the generated code fulfills all the requirements specified in the task list. 19 | 20 | - Defines a function called run_code that executes the provided Python code. 21 | 22 | - Defines a function called run_python_code that compiles and executes the provided Python code after performing safety checks such as AST validation. 23 | 24 | - Defines a function called process_generated_code that cleans the generated code. 25 | 26 | - Defines a recursive function called GenCode that generates Python code to fulfill a given task by interacting with the MyLM model. 27 | 28 | - Defines a class called Main that takes a context and question as input and executes the entire program flow. This includes generating tasks, generating code, validating the code, and finally running the code. 29 | ---- 30 | ## Initial Input Question 31 | 32 | ``` 33 | input_value = 45 34 | convert_from = "miles" 35 | convert_to = "feet" 36 | convert_to2 = "yards" 37 | context = "You generate top quality python code, paying careful attention to the details of the requirements." 38 | 39 | question = (f"Generate Python code that converts {input_value} {convert_from} to {convert_to}." 40 | f" Then the code should convert the {input_value} to {convert_to2}." 41 | f" Then the code should print the conversion statement: {convert_from} to {convert_to}." 42 | f" then the code should print the conversion statement: {convert_from} to {convert_to2}." 43 | f" Then the code should create a file c:/temp/conversion.txt with the printed conversion statements in it." 44 | f" Then the code should have error handling routines using traceback." 45 | f" Then the code should print a success message, and show the name of the file and what folder 46 | the file was saved to." 47 | f" Finally, write the generated code out to a file c:/temp/code.py, and show the name of the file and what 48 | folder the code file was saved to." 49 | ) 50 | ``` 51 | ---- 52 | 53 | ## Output from Program to Console: 54 | 55 | ---- 56 | MyLM is initialized. 57 | 58 | Settings are configured. 59 | 60 | Starting DSPY12.py... 61 | 62 | You generate top quality python code, paying careful attention to the details of the requirements. 63 | 64 | Generate Python code that converts 43 miles to feet. Then the code should convert the 43 to yards. Then the code should print the conversion statement: miles to feet. then the code should print the conversion statement: miles to yards. Then the code should create a file c:/temp/conversion.txt with the printed conversion statements in it. Then the code should have error handling routines using traceback. Then the code should print a success message, and show the name of the file and what folder the file was saved to. 65 | 66 | --- START PROGRAM --- 67 | 68 | Context: You generate top quality python code, paying careful attention to the details of the requirements. 69 | 70 | Question: Generate Python code that converts 43 miles to feet. Then the code should convert the 43 to yards. Then the code should print the conversion statement: miles to feet. then the code should print the conversion statement: miles to yards. Then the code should create a file c:/temp/conversion.txt with the printed conversion statements in it. Then the code should have error handling routines using traceback. Then the code should print a success message, and show the name of the file and what folder the file was saved to. 71 | 72 | ------------------ 73 | Generate Tasks... 74 | 75 | Inside GenerateTasks... 76 | 77 | ================================================= 78 | 79 | Tasks to be processed: 80 | 81 | 1. Convert 43 miles to feet by multiplying it by 5280. 82 | 2. Convert 43 miles to yards by multiplying it by 1760. 83 | 3. Print the conversion statement: miles to feet. 84 | 4. Print the conversion statement: miles to yards. 85 | 5. Create a file c:/temp/conversion.txt and write the printed conversion statements to it. 86 | 6. Use a try-except block to handle potential errors using traceback. 87 | 7. Print a success message and show the name of the file and what folder the file was saved to. 88 | 89 | ================================================= 90 | 91 | Enter GenCode (0)... 92 | 93 | Inside MultiHop 1 94 | 95 | -- GENERATED CODE ----------------------- 96 | 97 | ```python 98 | import traceback 99 | 100 | try: 101 | # Convert 43 miles to feet 102 | feet = 43 * 5280 103 | # Convert 43 miles to yards 104 | yards = 43 * 1760 105 | 106 | # Print conversion statements 107 | print(f"43 miles is equal to {feet} feet") 108 | print(f"43 miles is equal to {yards} yards") 109 | 110 | # Create conversion.txt file and write conversion statements to it 111 | with open("c:/temp/conversion.txt", "w") as file: 112 | file.write(f"43 miles is equal to {feet} feet\n") 113 | file.write(f"43 miles is equal to {yards} yards\n") 114 | 115 | # Print success message 116 | print(f"File 'conversion.txt' has been saved to 'c:/temp/'") 117 | 118 | except Exception as e: 119 | # Print error message and traceback 120 | print(f"An error occurred: {e}") 121 | print(traceback.format_exc()) 122 | ``` 123 | ----------------------------------------- 124 | Inside ValidateCodeMatchesTask... 125 | 126 | ** EVAL QUESTION ** 127 | 128 | The requirements are: Generate Python code that converts 43 miles to feet. Then the code should convert the 43 to yards. Then the code should print the conversion statement: miles to feet. then the code should print the conversion statement: miles to yards. Then the code should create a file c:/temp/conversion.txt with the printed conversion statements in it. Then the code should have error handling routines using traceback. Then the code should print a success message, and show the name of the file and what folder the file was saved to. 129 | 130 | And the code is this: 131 | ----------------------------------------------------- 132 | ```python 133 | import traceback 134 | 135 | try: 136 | # Convert 43 miles to feet 137 | feet = 43 * 5280 138 | # Convert 43 miles to yards 139 | yards = 43 * 1760 140 | 141 | # Print conversion statements 142 | print(f"43 miles is equal to {feet} feet") 143 | print(f"43 miles is equal to {yards} yards") 144 | 145 | # Create conversion.txt file and write conversion statements to it 146 | with open("c:/temp/conversion.txt", "w") as file: 147 | file.write(f"43 miles is equal to {feet} feet\n") 148 | file.write(f"43 miles is equal to {yards} yards\n") 149 | 150 | # Print success message 151 | print(f"File 'conversion.txt' has been saved to 'c:/temp/'") 152 | 153 | except Exception as e: 154 | # Print error message and traceback 155 | print(f"An error occurred: {e}") 156 | print(traceback.format_exc()) 157 | ``` 158 | 159 | ----------------------------------------------------- 160 | 161 | Does this code fulfill each and every requirement in the task list? True or False 162 | 163 | Inside MultiHop 1 164 | 165 | ** EVAL RESPONSE ** 166 | 167 | Prediction( 168 | rationale='produce the answer. We have to check if the given Python code fulfills every requirement in the task list.\n1. The code converts 43 miles to feet: feet = 43 * 5280\n2. The code converts 43 miles to yards: yards = 43 * 1760\n3. The code prints the conversion statements: print(f"43 miles is equal to {feet} feet") and print(f"43 miles is equal to {yards} yards")\n4. The code creates a file \'conversion.txt\' and writes the conversion statements to it: with open("c:/temp/conversion.txt", "w") as file: file.write(f"43 miles is equal to {feet} feet\\n") and file.write(f"43 miles is equal to {yards} yards\\n")\n5. The code has error handling routines using traceback: except Exception as e: print(f"An error occurred: {e}") and print(traceback.format_exc())\n6. The code prints a success message and shows the name of the file and the folder where the file was saved: print(f"File \'conversion.txt\' has been saved to \'c:/temp/\'")\n\nSince the code fulfills every requirement in the task list, the answer is True.', 169 | answer='True' 170 | ) 171 | 172 | ** END EVALUATION ** 173 | 174 | IsCodeValid: Prediction( 175 | rationale='produce the answer. We have to check if the given Python code fulfills every requirement in the task list.\n1. The code converts 43 miles to feet: feet = 43 * 5280\n2. The code converts 43 miles to yards: yards = 43 * 1760\n3. The code prints the conversion statements: print(f"43 miles is equal to {feet} feet") and print(f"43 miles is equal to {yards} yards")\n4. The code creates a file \'conversion.txt\' and writes the conversion statements to it: with open("c:/temp/conversion.txt", "w") as file: file.write(f"43 miles is equal to {feet} feet\\n") and file.write(f"43 miles is equal to {yards} yards\\n")\n5. The code has error handling routines using traceback: except Exception as e: print(f"An error occurred: {e}") and print(traceback.format_exc())\n6. The code prints a success message and shows the name of the file and the folder where the file was saved: print(f"File \'conversion.txt\' has been saved to \'c:/temp/\'")\n\nSince the code fulfills every requirement in the task list, the answer is True.', 176 | answer='True' 177 | ) 178 | 179 | IsCodeValid is True... 180 | 181 | ```python 182 | import traceback 183 | 184 | try: 185 | # Convert 43 miles to feet 186 | feet = 43 * 5280 187 | # Convert 43 miles to yards 188 | yards = 43 * 1760 189 | 190 | # Print conversion statements 191 | print(f"43 miles is equal to {feet} feet") 192 | print(f"43 miles is equal to {yards} yards") 193 | 194 | # Create conversion.txt file and write conversion statements to it 195 | with open("c:/temp/conversion.txt", "w") as file: 196 | file.write(f"43 miles is equal to {feet} feet\n") 197 | file.write(f"43 miles is equal to {yards} yards\n") 198 | 199 | # Print success message 200 | print(f"File 'conversion.txt' has been saved to 'c:/temp/'") 201 | 202 | except Exception as e: 203 | # Print error message and traceback 204 | print(f"An error occurred: {e}") 205 | print(traceback.format_exc()) 206 | ``` 207 | 208 | Validate code... 209 | 210 | Inside ValidateCodeMatchesTask... 211 | 212 | ** EVAL QUESTION ** 213 | 214 | The requirements are: ['1. Convert 43 miles to feet by multiplying it by 5280.', '2. Convert 43 miles to yards by multiplying it by 1760.', '3. Print the conversion statement: miles to feet.', '4. Print the conversion statement: miles to yards.', '5. Create a file c:/temp/conversion.txt and write the printed conversion statements to it.', '6. Use a try-except block to handle potential errors using traceback.', '7. Print a success message and show the name of the file and what folder the file was saved to.'] 215 | 216 | And the code is this: 217 | 218 | ----------------------------------------------------- 219 | ``` 220 | import traceback 221 | 222 | try: 223 | # Convert 43 miles to feet 224 | feet = 43 * 5280 225 | # Convert 43 miles to yards 226 | yards = 43 * 1760 227 | 228 | # Print conversion statements 229 | print(f"43 miles is equal to {feet} feet") 230 | print(f"43 miles is equal to {yards} yards") 231 | 232 | # Create conversion.txt file and write conversion statements to it 233 | with open("c:/temp/conversion.txt", "w") as file: 234 | file.write(f"43 miles is equal to {feet} feet\n") 235 | file.write(f"43 miles is equal to {yards} yards\n") 236 | 237 | # Print success message 238 | print(f"File 'conversion.txt' has been saved to 'c:/temp/'") 239 | 240 | except Exception as e: 241 | # Print error message and traceback 242 | print(f"An error occurred: {e}") 243 | print(traceback.format_exc()) 244 | ``` 245 | ----------------------------------------------------- 246 | Does this code fulfill each and every requirement in the task list? True or False 247 | 248 | Inside MultiHop 1 249 | 250 | ** EVAL RESPONSE ** 251 | 252 | Prediction( 253 | rationale="determine if the code fulfills each and every requirement in the task list.\n\n1. Convert 43 miles to feet by multiplying it by 5280.\n* The code correctly converts 43 miles to feet by multiplying it by 5280.\n2. Convert 43 miles to yards by multiplying it by 1760.\n* The code correctly converts 43 miles to yards by multiplying it by 1760.\n3. Print the conversion statement: miles to feet.\n* The code prints the conversion statement for miles to feet.\n4. Print the conversion statement: miles to yards.\n* The code prints the conversion statement for miles to yards.\n5. Create a file c:/temp/conversion.txt and write the printed conversion statements to it.\n* The code creates a file named 'conversion.txt' in the 'c:/temp/' directory and writes the printed conversion statements to it.\n6. Use a try-except block to handle potential errors using traceback.\n* The code uses a try-except block to handle potential errors and prints the traceback.\n7. Print a success message and show the name of the file and what folder the file was saved to.\n* The code prints a success message showing the name of the file and the directory it was saved to.", 254 | answer='True' 255 | ) 256 | 257 | ** END EVALUATION ** 258 | 259 | Is code valid: Prediction( 260 | rationale="determine if the code fulfills each and every requirement in the task list.\n\n1. Convert 43 miles to feet by multiplying it by 5280.\n* The code correctly converts 43 miles to feet by multiplying it by 5280.\n2. Convert 43 miles to yards by multiplying it by 1760.\n* The code correctly converts 43 miles to yards by multiplying it by 1760.\n3. Print the conversion statement: miles to feet.\n* The code prints the conversion statement for miles to feet.\n4. Print the conversion statement: miles to yards.\n* The code prints the conversion statement for miles to yards.\n5. Create a file c:/temp/conversion.txt and write the printed conversion statements to it.\n* The code creates a file named 'conversion.txt' in the 'c:/temp/' directory and writes the printed conversion statements to it.\n6. Use a try-except block to handle potential errors using traceback.\n* The code uses a try-except block to handle potential errors and prints the traceback.\n7. Print a success message and show the name of the file and what folder the file was saved to.\n* The code prints a success message showing the name of the file and the directory it was saved to.", 261 | answer='True' 262 | ) 263 | 264 | AST Validation of code: 265 | 266 | ``` 267 | import traceback 268 | try: 269 | # Convert 43 miles to feet 270 | feet = 43 * 5280 271 | # Convert 43 miles to yards 272 | yards = 43 * 1760 273 | 274 | # Print conversion statements 275 | print(f"43 miles is equal to {feet} feet") 276 | print(f"43 miles is equal to {yards} yards") 277 | 278 | # Create conversion.txt file and write conversion statements to it 279 | with open("c:/temp/conversion.txt", "w") as file: 280 | file.write(f"43 miles is equal to {feet} feet\n") 281 | file.write(f"43 miles is equal to {yards} yards\n") 282 | 283 | # Print success message 284 | print(f"File 'conversion.txt' has been saved to 'c:/temp/'") 285 | 286 | except Exception as e: 287 | # Print error message and traceback 288 | print(f"An error occurred: {e}") 289 | print(traceback.format_exc()) 290 | ``` 291 | 292 | AST Validation Passed... 293 | AST Validation A: True 294 | Code has been processed! 295 | Running the code... 296 | 297 | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 298 | 299 | -- RUN THE FOLLOWING CODE -- 300 | 301 | -------------------------------------------------------------------- 302 | ``` 303 | import traceback 304 | 305 | try: 306 | # Convert 43 miles to feet 307 | feet = 43 * 5280 308 | # Convert 43 miles to yards 309 | yards = 43 * 1760 310 | 311 | # Print conversion statements 312 | print(f"43 miles is equal to {feet} feet") 313 | print(f"43 miles is equal to {yards} yards") 314 | 315 | # Create conversion.txt file and write conversion statements to it 316 | with open("c:/temp/conversion.txt", "w") as file: 317 | file.write(f"43 miles is equal to {feet} feet\n") 318 | file.write(f"43 miles is equal to {yards} yards\n") 319 | 320 | # Print success message 321 | print(f"File 'conversion.txt' has been saved to 'c:/temp/'") 322 | 323 | except Exception as e: 324 | # Print error message and traceback 325 | print(f"An error occurred: {e}") 326 | print(traceback.format_exc()) 327 | ``` 328 | -------------------------------------------------------------------- 329 | 330 | traceback is already installed. 331 | Required Modules are Installed 332 | Is this code dangerous to run? False 333 | 334 | Validate the compiled code with ast... 335 | 336 | AST Validation of code: 337 | 338 | ``` 339 | import traceback 340 | 341 | try: 342 | # Convert 43 miles to feet 343 | feet = 43 * 5280 344 | # Convert 43 miles to yards 345 | yards = 43 * 1760 346 | 347 | # Print conversion statements 348 | print(f"43 miles is equal to {feet} feet") 349 | print(f"43 miles is equal to {yards} yards") 350 | 351 | # Create conversion.txt file and write conversion statements to it 352 | with open("c:/temp/conversion.txt", "w") as file: 353 | file.write(f"43 miles is equal to {feet} feet\n") 354 | file.write(f"43 miles is equal to {yards} yards\n") 355 | 356 | # Print success message 357 | print(f"File 'conversion.txt' has been saved to 'c:/temp/'") 358 | 359 | except Exception as e: 360 | # Print error message and traceback 361 | print(f"An error occurred: {e}") 362 | print(traceback.format_exc()) 363 | ``` 364 | 365 | AST Validation Passed... 366 | 367 | Is AST Validated: True 368 | 369 | This code is safe to run and passed ast validation... compiling code... 370 | 371 | Code is compiled... Run Code... 372 | 373 |
at 0x0000024F53762F80, file "file", line 1>
374 |
375 | 43 miles is equal to 227040 feet
376 | 43 miles is equal to 75680 yards
377 | File 'conversion.txt' has been saved to 'c:/temp/'
378 |
379 | Code processing completed.
380 |
381 | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
382 |
--------------------------------------------------------------------------------
/DSPY12_Out_2.md:
--------------------------------------------------------------------------------
1 | # DSPY12.py OUTPUT
2 | This is the output of DSPY12.py ... note: a good deal of the output here are print statements to help trace the script's operations. If / when I get to a final version, it will remove most of the print statements you see here.
3 |
4 | ## DSPY12.py Features
5 |
6 | * `identify_language(code)`: This function takes a code snippet (`code`) as input and attempts to identify the programming language used in the code. It utilizes a ChainOfThought method to query the language model (`MyLM`) and returns the language name as a string (e.g., "python", "csharp").
7 | * `MultiHop(dspy.Module)`: This class defines a multi-hop reasoning module that can be used to ask questions in a step-by-step manner. It takes a language model (`lm`) and the number of hops (`passages_per_hop`) as input during initialization. The `forward` method of this class takes the context (`context`) and question (`question`) as input and uses the ChainOfThought method to generate a sequence of questions and retrieve relevant passages. Finally, it utilizes another ChainOfThought method to answer the original question based on the accumulated information.
8 | * `GenerateTasks(dspy.Signature)`: This class defines the signature for the `GenerateTasks` function. It specifies the input and output fields for the function. The context (`context`) and question (`question`) are the input fields, and the tasks (`tasks`) is the output field. The tasks field is expected to be a list containing the generated tasks in a structured format.
9 | * `DoesImportModuleExist(code)`: This function checks if the required modules are installed for the provided code (`code`). It uses regular expressions to find all import statements and then tries to import the mentioned modules using `importlib.import_module`. If any module is missing, it prompts the user for installation and potentially installs them using `subprocess.run`. It returns True if all modules are installed or if the user confirms the installation, otherwise it returns False.
10 | * `validate_python_code_ast(code)`: This function attempts to parse the provided Python code (`code`) using the `ast.parse` function. If the parsing is successful, it returns True, otherwise it returns the encountered error.
11 | * `ValidateCodeMatchesTask(CodeBlock, task)`: This function takes a code block (`CodeBlock`) and a task (`task`) as input and evaluates if the code fulfills all the requirements specified in the task. It leverages the `MultiHop` class to create a new instance with the language model (`MyLM`) and then uses the `forward` method to ask the LM if the code meets all the requirements. It returns the response object containing the answer (True/False) and the rationale provided by the LM.
12 | * `run_code(Code_Block, language)`: This function executes the provided code (`CodeBlock`). It first checks the language (`language`) and if it's Python, it attempts to run the code using `exec`. Before running the code, it performs several checks including checking for dangerous code patterns using a prediction method (`Pred`), attempting AST validation (`validate_python_code_ast`), and prompting for user confirmation if the code is flagged as potentially unsafe.
13 | * `process_generated_code(code)`: This function performs any cleaning or pre-processing steps on the generated code (`code`). In the current implementation, it replaces some special characters.
14 | * `extract_code_block(generated_code, inpLanguage)`: This function extracts the code block from the provided code (`generated_code`). It searches for specific markers (```) to identify the code block and extracts the content between the markers. It also attempts to determine the code language based on the markers.
15 | * `GenCode(context, task, depth=0, max_depth=5)`: This function recursively generates code using a multi-hop approach. It takes the context (`context`), task (`task`), current depth (`depth`), and maximum depth (`max_depth`) as input. It utilizes the `MultiHop` class to generate an initial code snippet and then validates the generated code against the task using the `ValidateCodeMatchesTask` function. If the validation fails and the maximum depth is not reached, it retries the generation process with an updated context that includes the rationale for the failed validation. This recursive process continues until the generated code meets the requirements or the maximum depth is reached.
16 | * `Main`: This class defines the main program that takes the context (`context`) and question (`question`) as input and executes the entire code generation process. It first calls the `GenerateTasks` function to get the list of tasks. Then, it calls the `GenCode` function to generate the code for each task. The generated code is then validated, processed, and potentially executed.
17 |
18 | ----
19 | ## Initial Input Question
20 |
21 | ```
22 | context = ("You generate top quality, professional, vb.net code, paying careful attention to the details
23 | to ensure your code meets the requirements."
24 | " You always double check your code to ensure nothing has been left out."
25 | " Your job is to only write the code, and that is all. Your job is only to write the vb.net code,
26 | not to create the project, deploy or to test it."
27 | )
28 |
29 | question = (f" Generate a windows service in vb.net that monitors the windows events log."
30 | f" The windows service should use an ai model hosted at http://localhost:1234/v1/ in order to provide
31 | an Alert when unusual behavior is occuring on the machine that indicates a high probability of
32 | the existance of a virus or hacker."
33 | f" The windows service should send the Alert by email to Somebody@yahoo.com when the service indicates
34 | the existance of a virus or hacker."
35 | f" The windows service should use professional error handling."
36 | f" The windows service should log any virus or hacker Alerts to c:/Temp/AIMonitor.log"
37 | )
38 | ```
39 | ----
40 |
41 | ## Output from Program to Console:
42 | ---
43 |
44 | None of PyTorch, TensorFlow >= 2.0, or Flax have been found. Models won't be available and only tokenizers, configuration and file/data utilities can be used.
45 |
46 | Inside DSPY12.py...
47 |
48 | MyLM is initialized.
49 |
50 | Settings are configured.
51 |
52 | Inside DSPY12.py...
53 |
54 | You generate top quality, professional, vb.net code, paying careful attention to the details to ensure your code meets the requirements. You always double check your code to ensure nothing has been left out. Your job is to only write the code, and that is all. Your job is only to write the vb.net code, not to create the project, deploy or to test it.
55 | Generate a windows service in vb.net that monitors the windows events log. The windows service should use an ai model hosted at http://localhost:1234/v1/ in order to provide an Alert when unusual behavior is occuring on the machine that indicates a high probability of the existance of a virus or hacker. The windows service should send the Alert by email to somebody@yahoo.com when the service indicates the existance of a virus or hacker. The windows service should use professional error handling. The windows service should log any virus or hacker Alerts to c:/Temp/AIMonitor.log
56 |
57 | --- START PROGRAM ---
58 |
59 | Context: You generate top quality, professional, vb.net code, paying careful attention to the details to ensure your code meets the requirements. You always double check your code to ensure nothing has been left out. Your job is to only write the code, and that is all. Your job is only to write the vb.net code, not to create the project, deploy or to test it.
60 |
61 | Question: Generate a windows service in vb.net that monitors the windows events log. The windows service should use an ai model hosted at http://localhost:1234/v1/ in order to provide an Alert when unusual behavior is occuring on the machine that indicates a high probability of the existance of a virus or hacker. The windows service should send the Alert by email to somebody@yahoo.com when the service indicates the existance of a virus or hacker. The windows service should use professional error handling. The windows service should log any virus or hacker Alerts to c:/Temp/AIMonitor.log
62 |
63 | ------------------
64 |
65 | Generate Tasks...
66 |
67 | Inside GenerateTasks...
68 |
69 | =================================================
70 |
71 | Tasks to be processed:
72 |
73 | 1. Create a new Windows Service project in Visual Basic.
74 | 2. Add the necessary references and imports to use the AI model and the email functionality.
75 | 3. Write the code to monitor the Windows Event Log and use the AI model to detect unusual behavior.
76 | 4. If a virus or hacker is detected, send an email to the specified address and log the alert to the specified location.
77 | 5. Use professional error handling to ensure the service runs smoothly.
78 |
79 | =================================================
80 |
81 | Enter GenCode (0)...
82 |
83 | Inside MultiHop 1
84 |
85 | -- GENERATED CODE -----------------------
86 |
87 | To generate a windows service in vb.net that monitors the windows events log, use the following code:
88 |
89 | ```vbnet
90 | Imports System.ServiceProcess
91 | Imports System.Timers
92 | Imports System.Diagnostics
93 | Imports System.Net.Http
94 | Imports System.IO
95 |
96 | Public Class AIService
97 | Private Shared ReadOnly logPath As String = "c:/Temp/AIMonitor.log"
98 | Private Shared ReadOnly emailAddress As String = "somebody@yahoo.com"
99 | Private Shared ReadOnly aiModelUrl As String = "http://localhost:1234/v1/"
100 |
101 | Protected Overrides Sub OnStart(ByVal args() As String)
102 | Try
103 | ' Set up a timer to check the event log every 5 minutes
104 | Dim timer As New Timer(300000)
105 | AddHandler timer.Elapsed, AddressOf CheckEventLog
106 | timer.Start()
107 | Catch ex As Exception
108 | ' Log the error and send an email notification
109 | LogError(ex)
110 | SendEmail(ex.Message)
111 | End Try
112 | End Sub
113 |
114 | Private Sub CheckEventLog(sender As Object, e As ElapsedEventArgs)
115 | Try
116 | ' Get the event log entries
117 | Dim entries As EventLogEntryCollection = EventLog.GetEventLogs()(0).Entries
118 |
119 | ' Loop through the entries and check for unusual behavior
120 | For Each entry As EventLogEntry In entries
121 | If IsUnusualBehavior(entry) Then
122 | ' Use the AI model to determine if the behavior indicates a virus or hacker
123 | Dim isVirusOrHacker As Boolean = CheckForVirusOrHacker(entry)
124 | If isVirusOrHacker Then
125 | ' Log the alert and send an email notification
126 | LogAlert(entry)
127 | SendEmail("Virus or hacker detected: " & entry.Message)
128 | End If
129 | End If
130 | Next
131 | Catch ex As Exception
132 | ' Log the error and send an email notification
133 | LogError(ex)
134 | SendEmail(ex.Message)
135 | End Try
136 | End Sub
137 |
138 | Private Function IsUnusualBehavior(entry As EventLogEntry) As Boolean
139 | ' Check the event log entry for unusual behavior
140 | ' Return True if the behavior is unusual, False otherwise
141 | End Function
142 |
143 | Private Function CheckForVirusOrHacker(entry As EventLogEntry) As Boolean
144 | Try
145 | ' Use the AI model to determine if the behavior indicates a virus or hacker
146 | Dim client As New HttpClient()
147 | Dim request As New HttpRequestMessage(HttpMethod.Post, aiModelUrl & "check")
148 | request.Content = New StringContent(entry.Message, System.Text.Encoding.UTF8, "application/json")
149 | Dim response As HttpResponseMessage = client.SendAsync(request).Result
150 | If response.IsSuccessStatusCode Then
151 | Dim result As String = response.Content.ReadAsStringAsync().Result
152 | Return result.Contains("true")
153 | Else
154 | Return False
155 | End If
156 | Catch ex As Exception
157 | Return False
158 | End Try
159 | End Function
160 |
161 | Private Sub LogAlert(entry As EventLogEntry)
162 | Try
163 | ' Log the alert to the log file
164 | Dim alert As String = "Alert: " & entry.Message
165 | File.AppendAllText(logPath, alert & Environment.NewLine)
166 | Catch ex As Exception
167 | ' Log the error and send an email notification
168 | LogError(ex)
169 | SendEmail(ex.Message)
170 | End Try
171 | End Sub
172 |
173 | Private Sub LogError(ex As Exception)
174 | Try
175 | ' Log the error to the log file
176 | Dim error As String = "Error: " & ex.Message
177 | File.AppendAllText(logPath, error & Environment.NewLine)
178 | Catch ex2 As Exception
179 | ' Send an email notification
180 | SendEmail(ex2.Message)
181 | End Try
182 | End Sub
183 |
184 | Private Sub SendEmail(message As String)
185 | Try
186 | ' Send an email notification
187 | Dim client As New SmtpClient("smtp.gmail.com", 587)
188 | client.Credentials = New NetworkCredential(emailAddress, "password")
189 | client.EnableSsl = True
190 | Dim mail As New MailMessage(emailAddress, emailAddress)
191 | mail.Body = message
192 | client.Send(mail)
193 | Catch ex As Exception
194 | ' Log the error and send an email notification
195 | LogError(ex)
196 | SendEmail(ex.Message)
197 | End Try
198 | End Sub
199 |
200 | Protected Overrides Sub OnStop()
201 | ' TODO: Add code here to perform any tear-down necessary to stop your service.
202 | End Sub
203 | End Class
204 | ```
205 |
206 | This code creates a windows service in vb.net that monitors the windows events log. The windows service uses an ai model hosted at http://localhost:1234/v1/ to provide an Alert when unusual behavior is occuring on the machine that indicates a high probability of the existance of a virus or hacker. The windows service sends the Alert by email to somebody@yahoo.com when the service indicates the existance of a virus or hacker. The windows service uses professional error handling. The windows service logs any virus or hacker Alerts to c:/Temp/AIMonitor.log.
207 |
208 | The `OnStart` method sets up a timer to check the event log every 5 minutes. The `CheckEventLog` method gets the event log entries and loops through them to check for unusual behavior. If unusual behavior is detected, the `CheckForVirusOrHacker` method uses the AI model to determine if the behavior indicates a virus or hacker. If a virus or hacker is detected, the `LogAlert` method logs the alert to the log file and the `SendEmail` method sends an email notification. The `LogError` method logs any errors that occur. The `OnStop` method is used to stop the service.
209 |
210 | -----------------------------------------
211 |
212 | Inside ValidateCodeMatchesTask...
213 |
214 | ** EVAL QUESTION *******************************************************
215 |
216 | The requirements are: Generate a windows service in vb.net that monitors the windows events log. The windows service should use an ai model hosted at http://localhost:1234/v1/ in order to provide an Alert when unusual behavior is occuring on the machine that indicates a high probability of the existance of a virus or hacker. The windows service should send the Alert by email to somebody@yahoo.com when the service indicates the existance of a virus or hacker. The windows service should use professional error handling. The windows service should log any virus or hacker Alerts to c:/Temp/AIMonitor.log
217 |
218 | And the code is this:
219 |
220 | -----------------------------------------------------
221 |
222 | To generate a windows service in vb.net that monitors the windows events log, use the following code:
223 | ```vbnet
224 | Imports System.ServiceProcess
225 | Imports System.Timers
226 | Imports System.Diagnostics
227 | Imports System.Net.Http
228 | Imports System.IO
229 |
230 | Public Class AIService
231 | Private Shared ReadOnly logPath As String = "c:/Temp/AIMonitor.log"
232 | Private Shared ReadOnly emailAddress As String = "somebody@yahoo.com"
233 | Private Shared ReadOnly aiModelUrl As String = "http://localhost:1234/v1/"
234 |
235 | Protected Overrides Sub OnStart(ByVal args() As String)
236 | Try
237 | ' Set up a timer to check the event log every 5 minutes
238 | Dim timer As New Timer(300000)
239 | AddHandler timer.Elapsed, AddressOf CheckEventLog
240 | timer.Start()
241 | Catch ex As Exception
242 | ' Log the error and send an email notification
243 | LogError(ex)
244 | SendEmail(ex.Message)
245 | End Try
246 | End Sub
247 |
248 | Private Sub CheckEventLog(sender As Object, e As ElapsedEventArgs)
249 | Try
250 | ' Get the event log entries
251 | Dim entries As EventLogEntryCollection = EventLog.GetEventLogs()(0).Entries
252 |
253 | ' Loop through the entries and check for unusual behavior
254 | For Each entry As EventLogEntry In entries
255 | If IsUnusualBehavior(entry) Then
256 | ' Use the AI model to determine if the behavior indicates a virus or hacker
257 | Dim isVirusOrHacker As Boolean = CheckForVirusOrHacker(entry)
258 | If isVirusOrHacker Then
259 | ' Log the alert and send an email notification
260 | LogAlert(entry)
261 | SendEmail("Virus or hacker detected: " & entry.Message)
262 | End If
263 | End If
264 | Next
265 | Catch ex As Exception
266 | ' Log the error and send an email notification
267 | LogError(ex)
268 | SendEmail(ex.Message)
269 | End Try
270 | End Sub
271 |
272 | Private Function IsUnusualBehavior(entry As EventLogEntry) As Boolean
273 | ' Check the event log entry for unusual behavior
274 | ' Return True if the behavior is unusual, False otherwise
275 | End Function
276 |
277 | Private Function CheckForVirusOrHacker(entry As EventLogEntry) As Boolean
278 | Try
279 | ' Use the AI model to determine if the behavior indicates a virus or hacker
280 | Dim client As New HttpClient()
281 | Dim request As New HttpRequestMessage(HttpMethod.Post, aiModelUrl & "check")
282 | request.Content = New StringContent(entry.Message, System.Text.Encoding.UTF8, "application/json")
283 | Dim response As HttpResponseMessage = client.SendAsync(request).Result
284 | If response.IsSuccessStatusCode Then
285 | Dim result As String = response.Content.ReadAsStringAsync().Result
286 | Return result.Contains("true")
287 | Else
288 | Return False
289 | End If
290 | Catch ex As Exception
291 | Return False
292 | End Try
293 | End Function
294 |
295 | Private Sub LogAlert(entry As EventLogEntry)
296 | Try
297 | ' Log the alert to the log file
298 | Dim alert As String = "Alert: " & entry.Message
299 | File.AppendAllText(logPath, alert & Environment.NewLine)
300 | Catch ex As Exception
301 | ' Log the error and send an email notification
302 | LogError(ex)
303 | SendEmail(ex.Message)
304 | End Try
305 | End Sub
306 |
307 | Private Sub LogError(ex As Exception)
308 | Try
309 | ' Log the error to the log file
310 | Dim error As String = "Error: " & ex.Message
311 | File.AppendAllText(logPath, error & Environment.NewLine)
312 | Catch ex2 As Exception
313 | ' Send an email notification
314 | SendEmail(ex2.Message)
315 | End Try
316 | End Sub
317 |
318 | Private Sub SendEmail(message As String)
319 | Try
320 | ' Send an email notification
321 | Dim client As New SmtpClient("smtp.gmail.com", 587)
322 | client.Credentials = New NetworkCredential(emailAddress, "password")
323 | client.EnableSsl = True
324 | Dim mail As New MailMessage(emailAddress, emailAddress)
325 | mail.Body = message
326 | client.Send(mail)
327 | Catch ex As Exception
328 | ' Log the error and send an email notification
329 | LogError(ex)
330 | SendEmail(ex.Message)
331 | End Try
332 | End Sub
333 |
334 | Protected Overrides Sub OnStop()
335 | ' TODO: Add code here to perform any tear-down necessary to stop your service.
336 | End Sub
337 | End Class
338 | ```
339 |
340 | This code creates a windows service in vb.net that monitors the windows events log. The windows service uses an ai model hosted at http://localhost:1234/v1/ to provide an Alert when unusual behavior is occuring on the machine that indicates a high probability of the existance of a virus or hacker. The windows service sends the Alert by email to somebody@yahoo.com when the service indicates the existance of a virus or hacker. The windows service uses professional error handling. The windows service logs any virus or hacker Alerts to c:/Temp/AIMonitor.log.
341 |
342 | The `OnStart` method sets up a timer to check the event log every 5 minutes. The `CheckEventLog` method gets the event log entries and loops through them to check for unusual behavior. If unusual behavior is detected, the `CheckForVirusOrHacker` method uses the AI model to determine if the behavior indicates a virus or hacker. If a virus or hacker is detected, the `LogAlert` method logs the alert to the log file and the `SendEmail` method sends an email notification. The `LogError` method logs any errors that occur. The `OnStop` method is used to stop the service.
343 |
344 | -----------------------------------------------------
345 |
346 | Does this code fulfill each and every requirement in the task list? True or False
347 |
348 | Inside MultiHop 1
349 |
350 | ** EVAL RESPONSE ******************************************************
351 |
352 | produce the answer.
353 |
354 | 1. The code is written in VB.NET and creates a Windows service that monitors the Windows event log.
355 | 2. The service uses an AI model hosted at to provide an alert when unusual behavior is detected.
356 | 3. The alert is sent by email to somebody@yahoo.com when a virus or hacker is detected.
357 | 4. The service uses professional error handling and logs any virus or hacker alerts to c:/Temp/AIMonitor.log.
358 | 5. The OnStart method sets up a timer to check the event log every 5 minutes, and the CheckEventLog method gets the event log entries and loops through them to check for unusual behavior. If unusual behavior is detected, the CheckForVirusOrHacker method uses the AI model to determine if the behavior indicates a virus or hacker. If a virus or hacker is detected, the LogAlert method logs the alert to the log file and the SendEmail method sends an email notification. The LogError method logs any errors that occur. The OnStop method is used to stop the service.
359 | 6. Therefore, the code fulfills each and every requirement in the task list.
360 | ** END EVALUATION *****************************************************
361 |
362 | IsCodeValid: True
363 |
364 | IsCodeValid is True...
365 |
366 | To generate a windows service in vb.net that monitors the windows events log, use the following code:
367 |
368 | ```vbnet
369 | Imports System.ServiceProcess
370 | Imports System.Timers
371 | Imports System.Diagnostics
372 | Imports System.Net.Http
373 | Imports System.IO
374 |
375 | Public Class AIService
376 | Private Shared ReadOnly logPath As String = "c:/Temp/AIMonitor.log"
377 | Private Shared ReadOnly emailAddress As String = "somebody@yahoo.com"
378 | Private Shared ReadOnly aiModelUrl As String = "http://localhost:1234/v1/"
379 |
380 | Protected Overrides Sub OnStart(ByVal args() As String)
381 | Try
382 | ' Set up a timer to check the event log every 5 minutes
383 | Dim timer As New Timer(300000)
384 | AddHandler timer.Elapsed, AddressOf CheckEventLog
385 | timer.Start()
386 | Catch ex As Exception
387 | ' Log the error and send an email notification
388 | LogError(ex)
389 | SendEmail(ex.Message)
390 | End Try
391 | End Sub
392 |
393 | Private Sub CheckEventLog(sender As Object, e As ElapsedEventArgs)
394 | Try
395 | ' Get the event log entries
396 | Dim entries As EventLogEntryCollection = EventLog.GetEventLogs()(0).Entries
397 |
398 | ' Loop through the entries and check for unusual behavior
399 | For Each entry As EventLogEntry In entries
400 | If IsUnusualBehavior(entry) Then
401 | ' Use the AI model to determine if the behavior indicates a virus or hacker
402 | Dim isVirusOrHacker As Boolean = CheckForVirusOrHacker(entry)
403 | If isVirusOrHacker Then
404 | ' Log the alert and send an email notification
405 | LogAlert(entry)
406 | SendEmail("Virus or hacker detected: " & entry.Message)
407 | End If
408 | End If
409 | Next
410 | Catch ex As Exception
411 | ' Log the error and send an email notification
412 | LogError(ex)
413 | SendEmail(ex.Message)
414 | End Try
415 | End Sub
416 |
417 | Private Function IsUnusualBehavior(entry As EventLogEntry) As Boolean
418 | ' Check the event log entry for unusual behavior
419 | ' Return True if the behavior is unusual, False otherwise
420 | End Function
421 |
422 | Private Function CheckForVirusOrHacker(entry As EventLogEntry) As Boolean
423 | Try
424 | ' Use the AI model to determine if the behavior indicates a virus or hacker
425 | Dim client As New HttpClient()
426 | Dim request As New HttpRequestMessage(HttpMethod.Post, aiModelUrl & "check")
427 | request.Content = New StringContent(entry.Message, System.Text.Encoding.UTF8, "application/json")
428 | Dim response As HttpResponseMessage = client.SendAsync(request).Result
429 | If response.IsSuccessStatusCode Then
430 | Dim result As String = response.Content.ReadAsStringAsync().Result
431 | Return result.Contains("true")
432 | Else
433 | Return False
434 | End If
435 | Catch ex As Exception
436 | Return False
437 | End Try
438 | End Function
439 |
440 | Private Sub LogAlert(entry As EventLogEntry)
441 | Try
442 | ' Log the alert to the log file
443 | Dim alert As String = "Alert: " & entry.Message
444 | File.AppendAllText(logPath, alert & Environment.NewLine)
445 | Catch ex As Exception
446 | ' Log the error and send an email notification
447 | LogError(ex)
448 | SendEmail(ex.Message)
449 | End Try
450 | End Sub
451 |
452 | Private Sub LogError(ex As Exception)
453 | Try
454 | ' Log the error to the log file
455 | Dim error As String = "Error: " & ex.Message
456 | File.AppendAllText(logPath, error & Environment.NewLine)
457 | Catch ex2 As Exception
458 | ' Send an email notification
459 | SendEmail(ex2.Message)
460 | End Try
461 | End Sub
462 |
463 | Private Sub SendEmail(message As String)
464 | Try
465 | ' Send an email notification
466 | Dim client As New SmtpClient("smtp.gmail.com", 587)
467 | client.Credentials = New NetworkCredential(emailAddress, "password")
468 | client.EnableSsl = True
469 | Dim mail As New MailMessage(emailAddress, emailAddress)
470 | mail.Body = message
471 | client.Send(mail)
472 | Catch ex As Exception
473 | ' Log the error and send an email notification
474 | LogError(ex)
475 | SendEmail(ex.Message)
476 | End Try
477 | End Sub
478 |
479 | Protected Overrides Sub OnStop()
480 | ' TODO: Add code here to perform any tear-down necessary to stop your service.
481 | End Sub
482 | End Class
483 | ```
484 |
485 | This code creates a windows service in vb.net that monitors the windows events log. The windows service uses an ai model hosted at http://localhost:1234/v1/ to provide an Alert when unusual behavior is occuring on the machine that indicates a high probability of the existance of a virus or hacker. The windows service sends the Alert by email to somebody@yahoo.com when the service indicates the existance of a virus or hacker. The windows service uses professional error handling. The windows service logs any virus or hacker Alerts to c:/Temp/AIMonitor.log.
486 |
487 | The `OnStart` method sets up a timer to check the event log every 5 minutes. The `CheckEventLog` method gets the event log entries and loops through them to check for unusual behavior. If unusual behavior is detected, the `CheckForVirusOrHacker` method uses the AI model to determine if the behavior indicates a virus or hacker. If a virus or hacker is detected, the `LogAlert` method logs the alert to the log file and the `SendEmail` method sends an email notification. The `LogError` method logs any errors that occur. The `OnStop` method is used to stop the service.
488 |
489 | Inside identify_language...
490 |
491 | Inside extract_code_block...
492 |
493 | Note: input language did not match found language
494 |
495 | inpLanguage: vb.net, Language: vbnet
496 |
497 | Language: vb.net
498 |
499 | Validating code...
500 |
501 | Inside ValidateCodeMatchesTask...
502 |
503 | ** EVAL QUESTION *******************************************************
504 |
505 | The requirements are: ['1. Create a new Windows Service project in Visual Basic.', '2. Add the necessary references and imports to use the AI model and the email functionality.', '3. Write the code to monitor the Windows Event Log and use the AI model to detect unusual behavior.', '4. If a virus or hacker is detected, send an email to the specified address and log the alert to the specified location.', '5. Use professional error handling to ensure the service runs smoothly.']
506 |
507 | And the code is this:
508 |
509 | -----------------------------------------------------
510 | ```
511 | Imports System.ServiceProcess
512 | Imports System.Timers
513 | Imports System.Diagnostics
514 | Imports System.Net.Http
515 | Imports System.IO
516 |
517 | Public Class AIService
518 | Private Shared ReadOnly logPath As String = "c:/Temp/AIMonitor.log"
519 | Private Shared ReadOnly emailAddress As String = "somebody@yahoo.com"
520 | Private Shared ReadOnly aiModelUrl As String = "http://localhost:1234/v1/"
521 |
522 | Protected Overrides Sub OnStart(ByVal args() As String)
523 | Try
524 | ' Set up a timer to check the event log every 5 minutes
525 | Dim timer As New Timer(300000)
526 | AddHandler timer.Elapsed, AddressOf CheckEventLog
527 | timer.Start()
528 | Catch ex As Exception
529 | ' Log the error and send an email notification
530 | LogError(ex)
531 | SendEmail(ex.Message)
532 | End Try
533 | End Sub
534 |
535 | Private Sub CheckEventLog(sender As Object, e As ElapsedEventArgs)
536 | Try
537 | ' Get the event log entries
538 | Dim entries As EventLogEntryCollection = EventLog.GetEventLogs()(0).Entries
539 |
540 | ' Loop through the entries and check for unusual behavior
541 | For Each entry As EventLogEntry In entries
542 | If IsUnusualBehavior(entry) Then
543 | ' Use the AI model to determine if the behavior indicates a virus or hacker
544 | Dim isVirusOrHacker As Boolean = CheckForVirusOrHacker(entry)
545 | If isVirusOrHacker Then
546 | ' Log the alert and send an email notification
547 | LogAlert(entry)
548 | SendEmail("Virus or hacker detected: " & entry.Message)
549 | End If
550 | End If
551 | Next
552 | Catch ex As Exception
553 | ' Log the error and send an email notification
554 | LogError(ex)
555 | SendEmail(ex.Message)
556 | End Try
557 | End Sub
558 |
559 | Private Function IsUnusualBehavior(entry As EventLogEntry) As Boolean
560 | ' Check the event log entry for unusual behavior
561 | ' Return True if the behavior is unusual, False otherwise
562 | End Function
563 |
564 | Private Function CheckForVirusOrHacker(entry As EventLogEntry) As Boolean
565 | Try
566 | ' Use the AI model to determine if the behavior indicates a virus or hacker
567 | Dim client As New HttpClient()
568 | Dim request As New HttpRequestMessage(HttpMethod.Post, aiModelUrl & "check")
569 | request.Content = New StringContent(entry.Message, System.Text.Encoding.UTF8, "application/json")
570 | Dim response As HttpResponseMessage = client.SendAsync(request).Result
571 | If response.IsSuccessStatusCode Then
572 | Dim result As String = response.Content.ReadAsStringAsync().Result
573 | Return result.Contains("true")
574 | Else
575 | Return False
576 | End If
577 | Catch ex As Exception
578 | Return False
579 | End Try
580 | End Function
581 |
582 | Private Sub LogAlert(entry As EventLogEntry)
583 | Try
584 | ' Log the alert to the log file
585 | Dim alert As String = "Alert: " & entry.Message
586 | File.AppendAllText(logPath, alert & Environment.NewLine)
587 | Catch ex As Exception
588 | ' Log the error and send an email notification
589 | LogError(ex)
590 | SendEmail(ex.Message)
591 | End Try
592 | End Sub
593 |
594 | Private Sub LogError(ex As Exception)
595 | Try
596 | ' Log the error to the log file
597 | Dim error As String = "Error: " & ex.Message
598 | File.AppendAllText(logPath, error & Environment.NewLine)
599 | Catch ex2 As Exception
600 | ' Send an email notification
601 | SendEmail(ex2.Message)
602 | End Try
603 | End Sub
604 |
605 | Private Sub SendEmail(message As String)
606 | Try
607 | ' Send an email notification
608 | Dim client As New SmtpClient("smtp.gmail.com", 587)
609 | client.Credentials = New NetworkCredential(emailAddress, "password")
610 | client.EnableSsl = True
611 | Dim mail As New MailMessage(emailAddress, emailAddress)
612 | mail.Body = message
613 | client.Send(mail)
614 | Catch ex As Exception
615 | ' Log the error and send an email notification
616 | LogError(ex)
617 | SendEmail(ex.Message)
618 | End Try
619 | End Sub
620 |
621 | Protected Overrides Sub OnStop()
622 | ' TODO: Add code here to perform any tear-down necessary to stop your service.
623 | End Sub
624 | End Class
625 | ```
626 |
627 | -----------------------------------------------------
628 |
629 | Does this code fulfill each and every requirement in the task list? True or False
630 |
631 | Inside MultiHop 1
632 |
633 | ** EVAL RESPONSE ******************************************************
634 |
635 | produce the answer. We can see that the code is a Visual Basic Windows Service project that monitors the Windows Event Log and uses an AI model to detect unusual behavior. If a virus or hacker is detected, it sends an email to the specified address and logs the alert to the specified location. The code also includes professional error handling. Therefore, it meets all of the requirements in the task list.
636 |
637 | ** END EVALUATION *****************************************************
638 |
639 | Is code valid: True
640 |
641 | This code is non-executable VB.NET source code, therefore we will not attempt to run it. Code has been saved to disk instead.
642 |
643 | -- PROCESSING COMLETED - GENERATED CODE FILE SAVED TO DESK --
644 |
--------------------------------------------------------------------------------
/DSPY12_Out_3.md:
--------------------------------------------------------------------------------
1 | # DSPY12.py OUTPUT
2 | This is the output of DSPY12.py ... note: a good deal of the output here are print statements to help trace the script's operations. If / when I get to a final version, it will remove most of the print statements you see here.
3 |
4 | ## DSPY12.py Features
5 |
6 | * `identify_language(code)`: This function takes a code snippet (`code`) as input and attempts to identify the programming language used in the code. It utilizes a ChainOfThought method to query the language model (`MyLM`) and returns the language name as a string (e.g., "python", "csharp").
7 | * `MultiHop(dspy.Module)`: This class defines a multi-hop reasoning module that can be used to ask questions in a step-by-step manner. It takes a language model (`lm`) and the number of hops (`passages_per_hop`) as input during initialization. The `forward` method of this class takes the context (`context`) and question (`question`) as input and uses the ChainOfThought method to generate a sequence of questions and retrieve relevant passages. Finally, it utilizes another ChainOfThought method to answer the original question based on the accumulated information.
8 | * `GenerateTasks(dspy.Signature)`: This class defines the signature for the `GenerateTasks` function. It specifies the input and output fields for the function. The context (`context`) and question (`question`) are the input fields, and the tasks (`tasks`) is the output field. The tasks field is expected to be a list containing the generated tasks in a structured format.
9 | * `DoesImportModuleExist(code)`: This function checks if the required modules are installed for the provided code (`code`). It uses regular expressions to find all import statements and then tries to import the mentioned modules using `importlib.import_module`. If any module is missing, it prompts the user for installation and potentially installs them using `subprocess.run`. It returns True if all modules are installed or if the user confirms the installation, otherwise it returns False.
10 | * `validate_python_code_ast(code)`: This function attempts to parse the provided Python code (`code`) using the `ast.parse` function. If the parsing is successful, it returns True, otherwise it returns the encountered error.
11 | * `ValidateCodeMatchesTask(CodeBlock, task)`: This function takes a code block (`CodeBlock`) and a task (`task`) as input and evaluates if the code fulfills all the requirements specified in the task. It leverages the `MultiHop` class to create a new instance with the language model (`MyLM`) and then uses the `forward` method to ask the LM if the code meets all the requirements. It returns the response object containing the answer (True/False) and the rationale provided by the LM.
12 | * `run_code(Code_Block, language)`: This function executes the provided code (`CodeBlock`). It first checks the language (`language`) and if it's Python, it attempts to run the code using `exec`. Before running the code, it performs several checks including checking for dangerous code patterns using a prediction method (`Pred`), attempting AST validation (`validate_python_code_ast`), and prompting for user confirmation if the code is flagged as potentially unsafe.
13 | * `process_generated_code(code)`: This function performs any cleaning or pre-processing steps on the generated code (`code`). In the current implementation, it replaces some special characters.
14 | * `extract_code_block(generated_code, inpLanguage)`: This function extracts the code block from the provided code (`generated_code`). It searches for specific markers (```) to identify the code block and extracts the content between the markers. It also attempts to determine the code language based on the markers.
15 | * `GenCode(context, task, depth=0, max_depth=5)`: This function recursively generates code using a multi-hop approach. It takes the context (`context`), task (`task`), current depth (`depth`), and maximum depth (`max_depth`) as input. It utilizes the `MultiHop` class to generate an initial code snippet and then validates the generated code against the task using the `ValidateCodeMatchesTask` function. If the validation fails and the maximum depth is not reached, it retries the generation process with an updated context that includes the rationale for the failed validation. This recursive process continues until the generated code meets the requirements or the maximum depth is reached.
16 | * `Main`: This class defines the main program that takes the context (`context`) and question (`question`) as input and executes the entire code generation process. It first calls the `GenerateTasks` function to get the list of tasks. Then, it calls the `GenCode` function to generate the code for each task. The generated code is then validated, processed, and potentially executed.
17 |
18 | ----
19 | ## Initial Input Question
20 |
21 | ```
22 | context = (
23 | "You generate top quality, professional, C# code, paying careful attention to the details to ensure your code meets the requirements."
24 | " You always double check your code to ensure nothing has been left out."
25 | " Your job is to only write the code, and that is all. Your job is only to write the C# code, not to create the project, deploy or to test it."
26 | )
27 |
28 | question = (
29 | f" Generate a windows service in C# that monitors the windows events log."
30 | f" The windows service should use an ai model hosted at http://localhost:1234/v1/ in order
31 | to provide an Alert when unusual behavior is occuring on the machine that indicates a
32 | high probability of the existance of a virus or hacker."
33 | f" The windows service should send the Alert by email to somebody@yahoo.com when the service
34 | indicates the existance of a virus or hacker."
35 | f" The windows service should use professional error handling."
36 | f" The windows service should log any virus or hacker Alerts to c:/Temp/AIMonitor.log"
37 | )
38 | ```
39 | ----
40 |
41 | ## Output from Program to Console:
42 | ---
43 |
44 | Inside DSPY12.py...
45 |
46 | MyLM is initialized.
47 |
48 | Settings are configured.
49 |
50 | Inside Main()...
51 |
52 | You generate top quality, professional, C# code, paying careful attention to the details to ensure your code meets the requirements. You always double check your code to ensure nothing has been left out. Your job is to only write the code, and that is all. Your job is only to write the C# code, not to create the project, deploy or to test it.
53 | Generate a windows service in C# that monitors the windows events log. The windows service should use an ai model hosted at http://localhost:1234/v1/ in order to provide an Alert when unusual behavior is occuring on the machine that indicates a high probability of the existance of a virus or hacker. The windows service should send the Alert by email to somebody@yahoo.com when the service indicates the existance of a virus or hacker. The windows service should use professional error handling. The windows service should log any virus or hacker Alerts to c:/Temp/AIMonitor.log
54 |
55 | --- START PROGRAM ---
56 |
57 | Inside Main.Execute()
58 | Context: You generate top quality, professional, C# code, paying careful attention to the details to ensure your code meets the requirements. You always double check your code to ensure nothing has been left out. Your job is to only write the code, and that is all. Your job is only to write the C# code, not to create the project, deploy or to test it.
59 | Question: Generate a windows service in C# that monitors the windows events log. The windows service should use an ai model hosted at http://localhost:1234/v1/ in order to provide an Alert when unusual behavior is occuring on the machine that indicates a high probability of the existance of a virus or hacker. The windows service should send the Alert by email to somebody@yahoo.com when the service indicates the existance of a virus or hacker. The windows service should use professional error handling. The windows service should log any virus or hacker Alerts to c:/Temp/AIMonitor.log
60 |
61 | ------------------
62 |
63 | Generate Tasks...
64 |
65 | Inside GenerateTasks...
66 |
67 | =================================================
68 |
69 | Tasks to be processed:
70 |
71 | 1. Create a new Windows Service project in Visual Studio.
72 |
73 | 2. Add necessary references and using directives for working with Windows Event Log, HttpClient, and email.
74 |
75 | 3. Implement the OnStart method to start monitoring the Windows Event Log.
76 |
77 | 4. Implement the OnStop method to stop the monitoring.
78 |
79 | 5. Create a method to send an email alert.
80 |
81 | 6. Create a method to log the alert to a file.
82 |
83 | 7. Implement the AI model to detect unusual behavior.
84 |
85 | 8. Use HttpClient to send a request to the AI model and process the response.
86 |
87 | 9. Implement error handling to ensure the service runs smoothly.
88 |
89 | 10. Test the service to ensure it works as expected.
90 |
91 | =================================================
92 |
93 | Enter GenCode (0)...
94 |
95 | Inside MultiHop 1
96 |
97 | -- GENERATED CODE -----------------------
98 |
99 | ```csharp
100 | using System;
101 | using System.Diagnostics;
102 | using System.IO;
103 | using System.Net.Mail;
104 | using System.ServiceProcess;
105 | using System.Timers;
106 |
107 | namespace AIMonitorService
108 | {
109 | public partial class AIMonitorService : ServiceBase
110 | {
111 | private Timer timer;
112 |
113 | public AIMonitorService()
114 | {
115 | InitializeComponent();
116 | }
117 |
118 | protected override void OnStart(string[] args)
119 | {
120 | timer = new Timer();
121 | timer.Interval = 60000; // 1 minute
122 | timer.Elapsed += new ElapsedEventHandler(OnTimerElapsed);
123 | timer.Start();
124 | }
125 |
126 | protected override void OnStop()
127 | {
128 | timer.Stop();
129 | }
130 |
131 | private void OnTimerElapsed(object sender, ElapsedEventArgs e)
132 | {
133 | try
134 | {
135 | EventLog eventLog = new EventLog("Security");
136 | foreach (EventLogEntry entry in eventLog.Entries)
137 | {
138 | if (entry.TimeWritten > DateTime.Now.AddMinutes(-1))
139 | {
140 | string message = entry.Message;
141 | string source = entry.Source;
142 | int eventId = entry.EventID;
143 |
144 | // Call AI model to determine if behavior is unusual
145 | bool isUnusual = CallAIModel(message, source, eventId);
146 |
147 | if (isUnusual)
148 | {
149 | // Send Alert by email
150 | SendAlertEmail(message, source, eventId);
151 |
152 | // Log Alert
153 | LogAlert(message, source, eventId);
154 | }
155 | }
156 | }
157 | }
158 | catch (Exception ex)
159 | {
160 | // Log error
161 | File.AppendAllText("c:/Temp/AIMonitor.log", $"Error: {ex.Message}\n");
162 | }
163 | }
164 |
165 | private bool CallAIModel(string message, string source, int eventId)
166 | {
167 | // Call AI model and return result
168 | // This is a placeholder and should be replaced with actual code to call the AI model
169 | return true;
170 | }
171 |
172 | private void SendAlertEmail(string message, string source, int eventId)
173 | {
174 | MailMessage mail = new MailMessage();
175 | SmtpClient smtpServer = new SmtpClient("smtp.gmail.com");
176 |
177 | mail.From = new MailAddress("somebody@yahoo.com");
178 | mail.To.Add("somebody@yahoo.com");
179 | mail.Subject = "AIMonitor Alert";
180 | mail.Body = $"Message: {message}\nSource: {source}\nEvent ID: {eventId}";
181 |
182 | smtpServer.Port = 587;
183 | smtpServer.Credentials = new System.Net.NetworkCredential("somebody@yahoo.com", "password");
184 | smtpServer.EnableSsl = true;
185 |
186 | smtpServer.Send(mail);
187 | }
188 |
189 | private void LogAlert(string message, string source, int eventId)
190 | {
191 | File.AppendAllText("c:/Temp/AIMonitor.log", $"Alert: {message}\nSource: {source}\nEvent ID: {eventId}\n");
192 | }
193 | }
194 | }
195 | ```
196 |
197 | -----------------------------------------
198 |
199 | Inside identify_language forward()
200 |
201 | Language:c#
202 |
203 | Inside extract_code_block...
204 |
205 | Note: input language did not match found language
206 |
207 | inpLanguage: c#, Language: csharp
208 |
209 | -- EXTRACTED CODE -----------------------
210 | ```
211 | using System;
212 | using System.Diagnostics;
213 | using System.IO;
214 | using System.Net.Mail;
215 | using System.ServiceProcess;
216 | using System.Timers;
217 |
218 | namespace AIMonitorService
219 | {
220 | public partial class AIMonitorService : ServiceBase
221 | {
222 | private Timer timer;
223 |
224 | public AIMonitorService()
225 | {
226 | InitializeComponent();
227 | }
228 |
229 | protected override void OnStart(string[] args)
230 | {
231 | timer = new Timer();
232 | timer.Interval = 60000; // 1 minute
233 | timer.Elapsed += new ElapsedEventHandler(OnTimerElapsed);
234 | timer.Start();
235 | }
236 |
237 | protected override void OnStop()
238 | {
239 | timer.Stop();
240 | }
241 |
242 | private void OnTimerElapsed(object sender, ElapsedEventArgs e)
243 | {
244 | try
245 | {
246 | EventLog eventLog = new EventLog("Security");
247 | foreach (EventLogEntry entry in eventLog.Entries)
248 | {
249 | if (entry.TimeWritten > DateTime.Now.AddMinutes(-1))
250 | {
251 | string message = entry.Message;
252 | string source = entry.Source;
253 | int eventId = entry.EventID;
254 |
255 | // Call AI model to determine if behavior is unusual
256 | bool isUnusual = CallAIModel(message, source, eventId);
257 |
258 | if (isUnusual)
259 | {
260 | // Send Alert by email
261 | SendAlertEmail(message, source, eventId);
262 |
263 | // Log Alert
264 | LogAlert(message, source, eventId);
265 | }
266 | }
267 | }
268 | }
269 | catch (Exception ex)
270 | {
271 | // Log error
272 | File.AppendAllText("c:/Temp/AIMonitor.log", $"Error: {ex.Message}\n");
273 | }
274 | }
275 |
276 | private bool CallAIModel(string message, string source, int eventId)
277 | {
278 | // Call AI model and return result
279 | // This is a placeholder and should be replaced with actual code to call the AI model
280 | return true;
281 | }
282 |
283 | private void SendAlertEmail(string message, string source, int eventId)
284 | {
285 | MailMessage mail = new MailMessage();
286 | SmtpClient smtpServer = new SmtpClient("smtp.gmail.com");
287 |
288 | mail.From = new MailAddress("somebody@yahoo.com");
289 | mail.To.Add("somebody@yahoo.com");
290 | mail.Subject = "AIMonitor Alert";
291 | mail.Body = $"Message: {message}\nSource: {source}\nEvent ID: {eventId}";
292 |
293 | smtpServer.Port = 587;
294 | smtpServer.Credentials = new System.Net.NetworkCredential("somebody@yahoo.com", "password");
295 | smtpServer.EnableSsl = true;
296 |
297 | smtpServer.Send(mail);
298 | }
299 |
300 | private void LogAlert(string message, string source, int eventId)
301 | {
302 | File.AppendAllText("c:/Temp/AIMonitor.log", $"Alert: {message}\nSource: {source}\nEvent ID: {eventId}\n");
303 | }
304 | }
305 | }
306 | ```
307 |
308 | -----------------------------------------
309 |
310 | Inside ValidateCodeMatchesTask...
311 |
312 | ** EVAL QUESTION *******************************************************
313 |
314 | The requirements are:
315 |
316 | Generate a windows service in C# that monitors the windows events log. The windows service should use an ai model hosted at http://localhost:1234/v1/ in order to provide an Alert when unusual behavior is occuring on the machine that indicates a high probability of the existance of a virus or hacker. The windows service should send the Alert by email to somebody@yahoo.com when the service indicates the existance of a virus or hacker. The windows service should use professional error handling. The windows service should log any virus or hacker Alerts to c:/Temp/AIMonitor.log
317 |
318 | And the code is this:
319 |
320 | -----------------------------------------------------
321 | ```
322 | using System;
323 | using System.Diagnostics;
324 | using System.IO;
325 | using System.Net.Mail;
326 | using System.ServiceProcess;
327 | using System.Timers;
328 |
329 | namespace AIMonitorService
330 | {
331 | public partial class AIMonitorService : ServiceBase
332 | {
333 | private Timer timer;
334 |
335 | public AIMonitorService()
336 | {
337 | InitializeComponent();
338 | }
339 |
340 | protected override void OnStart(string[] args)
341 | {
342 | timer = new Timer();
343 | timer.Interval = 60000; // 1 minute
344 | timer.Elapsed += new ElapsedEventHandler(OnTimerElapsed);
345 | timer.Start();
346 | }
347 |
348 | protected override void OnStop()
349 | {
350 | timer.Stop();
351 | }
352 |
353 | private void OnTimerElapsed(object sender, ElapsedEventArgs e)
354 | {
355 | try
356 | {
357 | EventLog eventLog = new EventLog("Security");
358 | foreach (EventLogEntry entry in eventLog.Entries)
359 | {
360 | if (entry.TimeWritten > DateTime.Now.AddMinutes(-1))
361 | {
362 | string message = entry.Message;
363 | string source = entry.Source;
364 | int eventId = entry.EventID;
365 |
366 | // Call AI model to determine if behavior is unusual
367 | bool isUnusual = CallAIModel(message, source, eventId);
368 |
369 | if (isUnusual)
370 | {
371 | // Send Alert by email
372 | SendAlertEmail(message, source, eventId);
373 |
374 | // Log Alert
375 | LogAlert(message, source, eventId);
376 | }
377 | }
378 | }
379 | }
380 | catch (Exception ex)
381 | {
382 | // Log error
383 | File.AppendAllText("c:/Temp/AIMonitor.log", $"Error: {ex.Message}\n");
384 | }
385 | }
386 |
387 | private bool CallAIModel(string message, string source, int eventId)
388 | {
389 | // Call AI model and return result
390 | // This is a placeholder and should be replaced with actual code to call the AI model
391 | return true;
392 | }
393 |
394 | private void SendAlertEmail(string message, string source, int eventId)
395 | {
396 | MailMessage mail = new MailMessage();
397 | SmtpClient smtpServer = new SmtpClient("smtp.gmail.com");
398 |
399 | mail.From = new MailAddress("somebody@yahoo.com");
400 | mail.To.Add("somebody@yahoo.com");
401 | mail.Subject = "AIMonitor Alert";
402 | mail.Body = $"Message: {message}\nSource: {source}\nEvent ID: {eventId}";
403 |
404 | smtpServer.Port = 587;
405 | smtpServer.Credentials = new System.Net.NetworkCredential("somebody@yahoo.com", "password");
406 | smtpServer.EnableSsl = true;
407 |
408 | smtpServer.Send(mail);
409 | }
410 |
411 | private void LogAlert(string message, string source, int eventId)
412 | {
413 | File.AppendAllText("c:/Temp/AIMonitor.log", $"Alert: {message}\nSource: {source}\nEvent ID: {eventId}\n");
414 | }
415 | }
416 | }
417 | ```
418 |
419 | -----------------------------------------------------
420 |
421 | Does this code fulfill each and every requirement in the task list? True or False
422 |
423 | Inside MultiHop 1
424 |
425 | ** EVAL RESPONSE ******************************************************
426 |
427 | produce the answer. We need to check if the code fulfills each and every requirement in the task list. The code provided is a C# Windows service that monitors the Windows event log and uses an AI model to determine if there is unusual behavior that may indicate the presence of a virus or hacker. The service sends an alert by email to somebody@yahoo.com and logs any alerts to c:/Temp/AIMonitor.log. The code uses professional error handling. However, the code does not meet the requirement of using an AI model hosted at http://localhost:1234/v1/ to provide an alert. The placeholder function CallAIModel() should be replaced with actual code to call the AI model. Therefore, the code does not fulfill each and every requirement in the task list.
428 |
429 | ** END EVALUATION *****************************************************
430 |
431 | IsCodeValid: False
432 |
433 | Code Language: c#
434 |
435 | Validating code...
436 |
437 | Inside ValidateCodeMatchesTask...
438 |
439 | ** EVAL QUESTION *******************************************************
440 |
441 | The requirements are:
442 |
443 | 1. Create a new Windows Service project in Visual Studio.
444 |
445 | 2. Add necessary references and using directives for working with Windows Event Log, HttpClient, and email.
446 |
447 | 3. Implement the OnStart method to start monitoring the Windows Event Log.
448 |
449 | 4. Implement the OnStop method to stop the monitoring.
450 |
451 | 5. Create a method to send an email alert.
452 |
453 | 6. Create a method to log the alert to a file.
454 |
455 | 7. Implement the AI model to detect unusual behavior.
456 |
457 | 8. Use HttpClient to send a request to the AI model and process the response.
458 |
459 | 9. Implement error handling to ensure the service runs smoothly.
460 |
461 | 10. Test the service to ensure it works as expected.
462 |
463 | And the code is this:
464 |
465 | -----------------------------------------------------
466 | ```
467 | using System;
468 | using System.Diagnostics;
469 | using System.IO;
470 | using System.Net.Mail;
471 | using System.ServiceProcess;
472 | using System.Timers;
473 |
474 | namespace AIMonitorService
475 | {
476 | public partial class AIMonitorService : ServiceBase
477 | {
478 | private Timer timer;
479 |
480 | public AIMonitorService()
481 | {
482 | InitializeComponent();
483 | }
484 |
485 | protected override void OnStart(string[] args)
486 | {
487 | timer = new Timer();
488 | timer.Interval = 60000; // 1 minute
489 | timer.Elapsed += new ElapsedEventHandler(OnTimerElapsed);
490 | timer.Start();
491 | }
492 |
493 | protected override void OnStop()
494 | {
495 | timer.Stop();
496 | }
497 |
498 | private void OnTimerElapsed(object sender, ElapsedEventArgs e)
499 | {
500 | try
501 | {
502 | EventLog eventLog = new EventLog("Security");
503 | foreach (EventLogEntry entry in eventLog.Entries)
504 | {
505 | if (entry.TimeWritten > DateTime.Now.AddMinutes(-1))
506 | {
507 | string message = entry.Message;
508 | string source = entry.Source;
509 | int eventId = entry.EventID;
510 |
511 | // Call AI model to determine if behavior is unusual
512 | bool isUnusual = CallAIModel(message, source, eventId);
513 |
514 | if (isUnusual)
515 | {
516 | // Send Alert by email
517 | SendAlertEmail(message, source, eventId);
518 |
519 | // Log Alert
520 | LogAlert(message, source, eventId);
521 | }
522 | }
523 | }
524 | }
525 | catch (Exception ex)
526 | {
527 | // Log error
528 | File.AppendAllText("c:/Temp/AIMonitor.log", $"Error: {ex.Message}\n");
529 | }
530 | }
531 |
532 | private bool CallAIModel(string message, string source, int eventId)
533 | {
534 | // Call AI model and return result
535 | // This is a placeholder and should be replaced with actual code to call the AI model
536 | return true;
537 | }
538 |
539 | private void SendAlertEmail(string message, string source, int eventId)
540 | {
541 | MailMessage mail = new MailMessage();
542 | SmtpClient smtpServer = new SmtpClient("smtp.gmail.com");
543 |
544 | mail.From = new MailAddress("somebody@yahoo.com");
545 | mail.To.Add("somebody@yahoo.com");
546 | mail.Subject = "AIMonitor Alert";
547 | mail.Body = $"Message: {message}\nSource: {source}\nEvent ID: {eventId}";
548 |
549 | smtpServer.Port = 587;
550 | smtpServer.Credentials = new System.Net.NetworkCredential("somebody@yahoo.com", "password");
551 | smtpServer.EnableSsl = true;
552 |
553 | smtpServer.Send(mail);
554 | }
555 |
556 | private void LogAlert(string message, string source, int eventId)
557 | {
558 | File.AppendAllText("c:/Temp/AIMonitor.log", $"Alert: {message}\nSource: {source}\nEvent ID: {eventId}\n");
559 | }
560 | }
561 | }
562 | ```
563 |
564 | -----------------------------------------------------
565 |
566 | Does this code fulfill each and every requirement in the task list? True or False
567 |
568 | Inside MultiHop 1
569 |
570 | ** EVAL RESPONSE ******************************************************
571 |
572 | determine if the code fulfills each and every requirement in the task list.
573 |
574 | 1. The code creates a new Windows Service project in Visual Studio.
575 |
576 | 2. The code includes necessary references and using directives for working with Windows Event Log, HttpClient, and email.
577 |
578 | 3. The code implements the OnStart method to start monitoring the Windows Event Log.
579 |
580 | 4. The code implements the OnStop method to stop the monitoring.
581 |
582 | 5. The code creates a method to send an email alert.
583 |
584 | 6. The code creates a method to log the alert to a file.
585 |
586 | 7. The code implements the AI model to detect unusual behavior.
587 |
588 | 8. The code uses HttpClient to send a request to the AI model and process the response.
589 |
590 | 9. The code implements error handling to ensure the service runs smoothly.
591 |
592 | 10. The code can be tested to ensure it works as expected.
593 |
594 | Therefore, the code fulfills each and every requirement in the task list.
595 |
596 | ** END EVALUATION *****************************************************
597 |
598 | Is code valid: True
599 |
600 | Code has passed validations. Writing to file...
601 |
602 | This is non-executable c# source code, therefore we will not attempt to run it. Code has been saved to disk instead.
603 |
604 | -- PROGRAM FINISHED --
605 |
--------------------------------------------------------------------------------
/DSPY7.py:
--------------------------------------------------------------------------------
1 | import sys
2 | import dspy
3 | import re
4 | import importlib
5 |
6 | if __name__ == "__main__":
7 | if len(sys.argv) != 3:
8 | print("Usage: python DSPY7.py ")
9 | sys.exit(1)
10 |
11 | context = sys.argv[1]
12 | question = sys.argv[2]
13 |
14 | # Now you can use the context and question variables in your script
15 | print("Context:", context)
16 | print("Question:", question)
17 |
18 | class MultiHop(dspy.Module):
19 | def __init__(self, lm, passages_per_hop=3):
20 | self.Generate_query = dspy.ChainOfThought("context, question -> query")
21 | self.retrieve = dspy.Retrieve(k=passages_per_hop)
22 | self.generate_answer = dspy.ChainOfThought("context, question -> answer")
23 |
24 | def forward(self, context, question):
25 | context_list = [context] # Convert context to a list
26 | for _ in range(2):
27 | query = self.Generate_query(context=context_list[-1], question=question).query
28 | retrieved_passages = self.retrieve(query).passages
29 | context_list.extend(retrieved_passages)
30 | return self.generate_answer(context=context_list, question=question)
31 |
32 |
33 | def run_python_code(code):
34 | try:
35 | print(("--------------------------------------------------------------------\n"))
36 | print("-- THIS IS THE GENERATED CODE -- \n")
37 | code = code.replace('Â ', '')
38 | code = code.replace('```', '***', 1)
39 | code = code.replace('```', '***', 1)
40 | print(("--------------------------------------------------------------------\n"))
41 | print(code + "\n")
42 | print(("--------------------------------------------------------------------\n"))
43 |
44 | InstallModule = DoesImportModuleExist(code)
45 | if InstallModule:
46 | print("Required Modules are Installed")
47 | else:
48 | print("Module was Not Installed, but is required for this script.")
49 | return
50 |
51 | compiled_code = compile(code, 'file', 'exec')
52 | # print("code compiled successfully")
53 |
54 | # HERE WE SHOULD CHECK TO SEE IF THE CODE IS DANGEROUS TO RUN
55 | question = "Is this code dangerous to run? " + code
56 |
57 | Pred = dspy.Predict("question -> rationale, bool")
58 | response = Pred(question=question)
59 |
60 | print("Is this code dangerous to run? " + str(response.bool) + "\n")
61 |
62 | print(response.rationale + "\n")
63 |
64 | if str(response.bool) == "False":
65 | print("This code is safe to run. You may process the code.\n")
66 | exec(compiled_code)
67 | else:
68 | user_input = input("The code may not be safe to run. Are you sure you want to continue? (Y/N): ")
69 |
70 | if user_input.upper() == "Y":
71 | print("Continuing with running the code.\n")
72 | exec(compiled_code)
73 | print("\n" + "Code processing completed.")
74 | else:
75 | print("Exiting without running the code.")
76 | except SyntaxError as e:
77 | error = str(e) # Convert the exception to a string
78 | return error # Return the error string
79 |
80 |
81 |
82 | def DoesImportModuleExist(code):
83 | modules = re.findall(r'import\s+(\w+)', code)
84 | missing_modules = []
85 |
86 | for module_name in modules:
87 | try:
88 | importlib.import_module(module_name)
89 | print(f"{module_name} is already installed.")
90 | except ModuleNotFoundError:
91 | missing_modules.append(module_name)
92 |
93 | if missing_modules:
94 | user_input = input(
95 | f"The following modules are not installed: {', '.join(missing_modules)}. Do you want to install them? (Y/N): ")
96 | if user_input.upper() == 'Y':
97 | import subprocess
98 | for module_name in missing_modules:
99 | subprocess.run(['pip', 'install', module_name])
100 | return True
101 | else:
102 | return False
103 | else:
104 | return True
105 |
106 |
107 | def GenCode(context, question):
108 | multihop = MultiHop(MyLM)
109 | response = multihop.forward(context=context, question=question)
110 |
111 | try:
112 | generated_code = response.answer
113 | generated_code = generated_code.replace('Â ', '')
114 | generated_code = generated_code.replace('```', '***', 1)
115 | generated_code = generated_code.replace('```', '***', 1)
116 |
117 | if generated_code:
118 | start_marker = "***python"
119 | end_marker = "***"
120 |
121 | start = generated_code.find(start_marker) + len(start_marker)
122 | end = generated_code.find(end_marker, start)
123 |
124 | python_code = generated_code[start:end].strip()
125 | return python_code
126 | except Exception as e:
127 | print(str(e))
128 | sys.exit(1)
129 | def RunProcess(context, question):
130 |
131 | retry_count = 0
132 | generated_python_code = GenCode(context, question)
133 |
134 | while retry_count < 3:
135 | results = run_python_code(generated_python_code)
136 |
137 | if isinstance(results, str): # Check if results contain an error message
138 | print(f"Error occurred: {results}")
139 | retry_count += 1
140 | question_with_error = f"{question} Error: {results}"
141 | generated_python_code = f"{generated_python_code} {question_with_error}"
142 | else:
143 | break
144 |
145 | if retry_count == 3:
146 | print("Failed to process after 3 attempts. Stopping.")
147 | else:
148 | print("Processing completed successfully.")
149 |
150 | colbertv2_wiki17_abstracts = dspy.ColBERTv2(url='http://20.102.90.50:2017/wiki17_abstracts')
151 |
152 | MyLM = dspy.OpenAI(api_base="http://localhost:1234/v1/",
153 | api_key="sk-111111",
154 | model="macadeliccc/laser-dolphin-mixtral-2x7b-dpo",
155 | temperature=0,
156 | max_tokens=7000)
157 |
158 | dspy.settings.configure(lm=MyLM, rm=colbertv2_wiki17_abstracts)
159 |
160 | RunProcess(context, question)
161 |
162 |
--------------------------------------------------------------------------------
/DSPY7_Caller.py:
--------------------------------------------------------------------------------
1 | import subprocess
2 |
3 | input_value = 22.2
4 | convert_from = "degrees celsius"
5 | convert_to = "degrees Fahrenheit"
6 | context = "You generate python code."
7 | question = f"Generate a Python script that converts {input_value} {convert_from} to {convert_to} and prints the result as {convert_from} to {convert_to}."
8 |
9 | # question = "Generate a python script that will delete the file c:/temp/TestDeleteMe.txt"
10 | # question = "Generate a python script that opens a file c:/Users/mabramsR/Desktop/PythonEnvironments/DSPY/DSPY2.py and opens a connection to a sql server 19 database named AI_Exchange on the localhost using a trusted connection."
11 |
12 | # question = input("Please state your request: ")
13 |
14 | subprocess.call(["python", "DSPY7.py", context, question])
15 |
16 |
--------------------------------------------------------------------------------
/DSPY8.py:
--------------------------------------------------------------------------------
1 | import sys
2 | import dspy
3 | import pygments # Assuming you have pygments installed
4 |
5 | class Task:
6 | def __init__(self, description, function):
7 | self.description = description
8 | self.function = function
9 |
10 |
11 | if __name__ == "__main__":
12 | if len(sys.argv) != 3:
13 | print("Usage: python DSPY7.py ")
14 | sys.exit(1)
15 |
16 | context = sys.argv[1]
17 | question = sys.argv[2]
18 |
19 | # Now you can use the context and question variables in your script
20 | print("Context:", context)
21 | print("Question:", question)
22 |
23 | class MultiHop(dspy.Module):
24 | def __init__(self, lm, passages_per_hop=3):
25 | self.Generate_query = dspy.ChainOfThought("context, question -> query")
26 | self.retrieve = dspy.Retrieve(k=passages_per_hop)
27 | self.generate_answer = dspy.ChainOfThought("context, question -> answer")
28 |
29 | def forward(self, context, question):
30 | context_list = [context] # Convert context to a list
31 | for _ in range(2):
32 | query = self.Generate_query(context=context_list[-1], question=question).query
33 | retrieved_passages = self.retrieve(query).passages
34 | context_list.extend(retrieved_passages)
35 | return self.generate_answer(context=context_list, question=question)
36 |
37 |
38 | def run_python_code(code):
39 | try:
40 | print("-- RUN THE FOLLOWING CODE -- \n")
41 | code = code.replace('Â ', '')
42 | code = code.replace('```', '***', 1)
43 | code = code.replace('```', '***', 1)
44 | print(("--------------------------------------------------------------------\n"))
45 | print(code + "\n")
46 | print(("--------------------------------------------------------------------\n"))
47 |
48 | compiled_code = compile(code, 'file', 'exec')
49 | # print("code compiled successfully")
50 |
51 | # HERE WE SHOULD CHECK TO SEE IF THE CODE IS DANGEROUS TO RUN
52 | question = "Is this code dangerous to run? " + code
53 |
54 | Pred = dspy.Predict("question -> rationale, bool")
55 | response = Pred(question=question)
56 |
57 | print("Is this code dangerous to run? " + str(response.bool) + "\n")
58 |
59 | print(response.rationale + "\n")
60 |
61 | if str(response.bool) == "False":
62 | print("This code is safe to run. You may process the code.\n")
63 | exec(compiled_code)
64 | else:
65 | user_input = input("The code may not be safe to run. Are you sure you want to continue? (Y/N): ")
66 |
67 | if user_input.upper() == "Y":
68 | print("Continuing with running the code.\n")
69 | exec(compiled_code)
70 | print("\n" + "Code processing completed.")
71 | else:
72 | print("Exiting without running the code.")
73 | except SyntaxError as e:
74 | print(f"Error executing code: {e}")
75 |
76 | def identify_task_type(task_description):
77 | keywords = {
78 | "code_generation": ["generate code", "write a Python function", "create a script"],
79 | "data_manipulation": ["filter data", "sort data", "calculate statistics"],
80 | "file_operation": ["read a file", "write to a file", "download a file"]
81 | }
82 | for task_type, phrases in keywords.items():
83 | for phrase in phrases:
84 | if phrase in task_description.lower():
85 | return task_type
86 | return "other" # Default category for unidentified tasks
87 |
88 | colbertv2_wiki17_abstracts = dspy.ColBERTv2(url='http://20.102.90.50:2017/wiki17_abstracts')
89 |
90 | MyLM = dspy.OpenAI(api_base="http://localhost:1234/v1/", api_key="sk-111111",
91 | model="macadeliccc/laser-dolphin-mixtral-2x7b-dpo", temperature=.40, max_tokens=7000)
92 |
93 | dspy.settings.configure(lm=MyLM, rm=colbertv2_wiki17_abstracts)
94 |
95 | multihop = MultiHop(MyLM)
96 |
97 | response = multihop.forward(context=context, question=question)
98 |
99 | # LLM output processing modified to generate tasks
100 | generated_tasks = []
101 | try:
102 | response = multihop.forward(context=context, question=question)
103 | tasks_data = response.answer
104 |
105 | collected_code = []
106 |
107 | for task in tasks_data:
108 | description = task["description"]
109 | task_type = identify_task_type(task["description"])
110 |
111 | if "code_generation" in task_type:
112 | # Handle code generation tasks (assuming code is already parsed and compiled)
113 | collected_code.append(task["code"])
114 | elif task_type == "data_manipulation" or task_type == "file_operation":
115 | max_retries = 3
116 | retries = 0
117 | while retries < max_retries:
118 | new_response = multihop.forward(context=context, question=task["description"])
119 | # Check if parsed code is available and valid Python code
120 | if "code" in new_response and is_valid_python_code(new_response.code):
121 | collected_code.append(new_response.code)
122 | break # Code found, exit the retry loop
123 | else:
124 | retries += 1
125 | if retries < max_retries:
126 | print(f"Retrying code generation (attempt {retries+1} of {max_retries})")
127 | else:
128 | collected_code.append("Task could not be written as Python code.")
129 | else:
130 | # Handle other or unidentified tasks (potentially add a placeholder message)
131 | collected_code.append("Task description: " + description + " (Unidentified task type)")
132 |
133 | # Display formatted code blocks
134 | for code_block in collected_code:
135 | print(pygments.highlight(code_block, PythonLexer(), TerminalFormatter()))
136 |
137 | # Prompt for confirmation
138 | user_response = input("Do you want to execute the generated code? (Y/N): ")
139 |
140 | if user_response.lower() == "y":
141 | for code_block in collected_code:
142 | run_python_code(code_block)
143 | else:
144 | print("Code execution skipped.")
145 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 vbwyrde
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/MultiHop_Sum.py:
--------------------------------------------------------------------------------
1 | from transformers import BertTokenizer
2 |
3 | def forward(self, context, question):
4 | print("Inside MultiHop 1")
5 | context_list = [context]
6 | tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') # Or whatever tokenizer you're using
7 |
8 | # Create a Predict object for summarization
9 | ContextSum = dspy.Predict("context, question -> summary")
10 |
11 | for _ in range(3): # Change this number to the number of hops you want
12 | query = self.Generate_query(
13 | context=context_list[-1], question=question
14 | ).query
15 | retrieved_passages = self.retrieve(query).passages
16 |
17 | # Check the size of the context_list
18 | context_string = ' '.join(context_list)
19 | num_tokens = len(tokenizer.tokenize(context_string))
20 | if num_tokens > 0.75 * tokenizer.model_max_length:
21 | # If the context_list is too large, summarize the first item
22 | context_list[0] = ContextSum(context=context_list[0], question=question).summary
23 |
24 | context_list.extend(retrieved_passages)
25 |
26 | return self.generate_answer(context=context_list, question=question)
27 |
28 |
29 | # Absolutely, your approach makes a lot of sense! You’re considering the importance of each part of the context_list in relation to the original question, and prioritizing the
30 | # preservation of the most relevant parts. This is a smart way to manage the size of the context_list while minimizing the loss of important information.
31 | #
32 | # Here’s a high-level outline of how you might implement this:
33 | #
34 | # Monitor the size of the context_list: Keep track of the number of tokens in the context_list. Once it reaches 75% of the context window size, start the summarization process.
35 | #
36 | # Rate the importance of each part: For each item in the context_list, use a prediction model to rate its importance to the solution. This could be based on how closely it
37 | # relates to the original question, or any other criteria you think is relevant.
38 | #
39 | # Summarize low-priority parts: Start by summarizing the parts with the lowest priority. This could be done using a text summarization algorithm or model.
40 | #
41 | # Check the size again: After each summarization step, check the size of the context_list again. If it’s still too large, continue with the next lowest priority part.
42 | #
43 | # This approach ensures that the most relevant information is preserved as long as possible, while less relevant information is summarized to save space. It’s a dynamic and adaptable
44 | # solution that should work well in many different scenarios. Great thinking!
45 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # DSPY_VBWyrde
2 | DSPY Experiments
3 |
4 | This is intended to be a series of experiments designed to help me learn DSPY.
5 | They may or may not be useful.
6 | There is likely no other purpose for these experiments than to see if something I have in mind can be done with DSPY, and if so, how well does it work.
7 |
8 | No guarantees for applicability or usefulness are provided.
9 |
10 | This code may not be used for any harmful purposes, or the Over-Mind AI will be pissed off. And you don't want that. Believe me.
11 |
12 | ## DSPY7 Usage
13 | You use DSPY7 from the command prompt by setting up the Caller.py with your request ("question"). The format for the request is fairly specific
14 | in the sense you want to tell it to "Generate a Python Script..." that does something specific.
15 |
16 | You can find an example of the caller.py listed in the folder.
17 |
18 | When you have it setup with what you want then you call it as follows:
19 |
20 | ```(env)>python caller.py```
21 |
22 | This will then call DSPY7.py with your request and process it.
23 |
24 | ___
25 | Following are some sample outputs
26 |
27 | ## DSPY7.py - Examples
28 | ___
29 | ### INPUTS:
30 | ```
31 | input_value = 33
32 | convert_from = "degrees celsius"
33 | convert_to = "degrees fahrenheit"
34 | context = "You generate python code."
35 | question = f"Generate a Python script that gets the input value from the user and
36 | converts {input_value} {convert_from} to {convert_to}
37 | and prints the result as {convert_from} to {convert_to}."
38 | ```
39 | ```
40 | ----------------------------------
41 | -- GENERATED CODE --
42 | ----------------------------------
43 |
44 | # Import necessary modules
45 | import math
46 |
47 | # Define a function to convert Celsius to Fahrenheit
48 | def celsius_to_fahrenheit(celsius):
49 | fahrenheit = (celsius * 9/5) + 32
50 | return fahrenheit
51 |
52 | # Get input value from the user in Celsius
53 | celsius = float(input("Enter a temperature in degrees Celsius: "))
54 |
55 | # Convert Celsius to Fahrenheit
56 | fahrenheit = celsius_to_fahrenheit(celsius)
57 |
58 | # Print the result in both Celsius and Fahrenheit
59 | print(f"{celsius} degrees Celsius is equal to {fahrenheit} degrees Fahrenheit.")
60 |
61 | ----------------------------------
62 |
63 | Enter a temperature in degrees Celsius: 33
64 | 33.0 degrees Celsius is equal to 91.4 degrees Fahrenheit.
65 |
66 | ```
67 | ___
68 | ### INPUTS:
69 | ```
70 | context = "You generate python code."
71 | question = f"Generate a python script that will delete the file c:/tmp/DeleteMe.txt."
72 | ```
73 | ```
74 | ----------------------------------
75 | -- GENERATED CODE --
76 | ----------------------------------
77 |
78 | --------------------------------------------------------------------
79 |
80 | import os
81 |
82 | # Specify the file path to be deleted
83 | file_path = "c:/tmp/DeleteMe.txt"
84 |
85 | # Use the os.remove() function to delete the file
86 | os.remove(file_path)
87 |
88 | --------------------------------------------------------------------
89 |
90 | Is this code dangerous to run? ${bool does not apply directly to textual explanations. Instead, it would be used in a
91 | programming context to represent true or false values based on specific conditions or evaluations. In this case,
92 | whether the code is dangerous or not depends on various factors such as file location, user permissions, and potential
93 | consequences of data loss. Therefore, it's not appropriate to assign a boolean value here.}
94 |
95 | The given code imports the `os` module, which provides a way to interact with the operating system. It then specifies
96 | a file path and uses the `os.remove()` function to delete the specified file. If this code is executed with proper
97 | permissions, it will successfully remove the file. However, if the file or its location is critical to the system or
98 | user's data, running this code could potentially lead to data loss or other unintended consequences. It may also be
99 | considered dangerous if the file path is determined by user input without proper validation and sanitization.
100 |
101 | The code may not be safe to run. Are you sure you want to continue? (Y/N): Y
102 | Continuing with running the code.
103 | Code processing completed.
104 |
105 | ```
106 | ___
107 |
108 | ## Next Steps
109 | The next step for DSPY experimentation will be to have the LLM create tasks, and then process the tasks one at a time.
110 | This will allow the program to function in an agent-like fashion to break down a complex request into its logical
111 | sub-components and run them individually. As a step in that process will be to have the LLM validate the the task list
112 | asking it to check to ensure the order of the tasks is correct, and that the overall structure of the task list
113 | is correctly aligned to the goal of the intitial request.
114 |
115 | ## Current Status (4/2/2024)
116 | DSPY12.py is called by Caller12.py.
117 |
118 | It is run as follows:
119 |
120 | ```(env) >python caller12.py ```
121 |
122 | It produces the following output:
123 |
124 | ```
125 | --- START PROGRAM ---
126 |
127 |
128 | Context: You generate top quality python code, paying careful attention to the details of the requirements.
129 | Question: Generate Python code that converts 44 miles to feet. Then the code should convert the 44 to yards.
130 | Then the code should print the conversion statement: miles to feet.
131 | Then the code should print the conversion statement: miles to yards.
132 | Then the code should create a file c:/temp/conversion.txt with the printed conversion statements in it.
133 | Then the code should have error handling routines.
134 | Then the code should print a success message, and show the name of the file and what folder the file was saved to.
135 | ------------------
136 | Generate Tasks...
137 | Inside GenerateTasks...
138 | =================================================
139 | Tasks to be processed:
140 | 1. Define a function to convert miles to feet.
141 | 2. Define a function to convert miles to yards.
142 | 3. Create a main function that uses these conversion functions.
143 | 4. Implement error handling for input validation.
144 | 5. Print the conversion statements "miles to feet" and "miles to yards".
145 | 6. Write the conversion statements into a file named "conversion.txt" at path c:/temp/.
146 | 7. Print a success message, including the name of the file and the folder it was saved to.
147 | =================================================
148 | Enter GenCode (0)...
149 | Inside MultiHop 1
150 | -- GENERATED CODE -----------------------
151 | ***python
152 | import os
153 |
154 | MILES_TO_FEET = 5280
155 | MILES_TO_YARDS = 1760
156 |
157 | try:
158 | miles = 44
159 | feet = miles * MILES_TO_FEET
160 | print(f"{miles} miles is equal to {feet} feet.")
161 |
162 | yards = miles * MILES_TO_YARDS
163 | print(f"{miles} miles is equal to {yards} yards.")
164 |
165 | with open('c:/temp/conversion.txt', 'w') as f:
166 | f.write(f"Miles to Feet: {feet}\n")
167 | f.write(f"Miles to Yards: {yards}\n")
168 |
169 | print("Conversion statements saved successfully in c:/temp/conversion.txt.")
170 | except Exception as e:
171 | print(f"An error occurred: {e}")
172 | ***
173 | Inside MultiHop 1
174 | IsCodeValid: True.
175 | isCodeValid is True...
176 | ***python
177 | import os
178 |
179 | MILES_TO_FEET = 5280
180 | MILES_TO_YARDS = 1760
181 |
182 | try:
183 | miles = 44
184 | feet = miles * MILES_TO_FEET
185 | print(f"{miles} miles is equal to {feet} feet.")
186 |
187 | yards = miles * MILES_TO_YARDS
188 | print(f"{miles} miles is equal to {yards} yards.")
189 |
190 | with open('c:/temp/conversion.txt', 'w') as f:
191 | f.write(f"Miles to Feet: {feet}\n")
192 | f.write(f"Miles to Yards: {yards}\n")
193 |
194 | print("Conversion statements saved successfully in c:/temp/conversion.txt.")
195 | except Exception as e:
196 | print(f"An error occurred: {e}")
197 |
198 |
199 | Validate code...
200 | Inside ValidateCodeMatchesTask...
201 | A *************************************
202 | The requirements are: ['1. Define a function to convert miles to feet.',
203 | '2. Define a function to convert miles to yards.',
204 | '3. Create a main function that uses these conversion functions.',
205 | '4. Implement error handling for input validation.',
206 | '5. Print the conversion statements "miles to feet" and "miles to yards".',
207 | '6. Write the conversion statements into a file named "conversion.txt" at path c:/temp/.',
208 | '7. Print a success message, including the name of the file and the folder it was saved to.']
209 | And the code is this:
210 | import os
211 |
212 | MILES_TO_FEET = 5280
213 | MILES_TO_YARDS = 1760
214 |
215 | try:
216 | miles = 44
217 | feet = miles * MILES_TO_FEET
218 | print(f"{miles} miles is equal to {feet} feet.")
219 |
220 | yards = miles * MILES_TO_YARDS
221 | print(f"{miles} miles is equal to {yards} yards.")
222 |
223 | with open('c:/temp/conversion.txt', 'w') as f:
224 | f.write(f"Miles to Feet: {feet}\n")
225 | f.write(f"Miles to Yards: {yards}\n")
226 |
227 | print("Conversion statements saved successfully in c:/temp/conversion.txt.")
228 | except Exception as e:
229 | print(f"An error occurred: {e}")
230 | Is it true that the code fullfil the requirements? True or False
231 | Inside MultiHop 1
232 | B *************************************
233 | Prediction(
234 | rationale='determine if the provided code fulfills the given requirements. We will check each requirement
235 | and see if the code matches it.\n\n1. Define a function to convert miles to feet: The code does not have a
236 | separate function for this conversion, but it performs the conversion directly. So, it partially meets this
237 | requirement.\n2. Define a function to convert miles to yards: Again, the code does not have a separate function
238 | for this conversion; it performs the conversion directly. So, it partially meets this requirement as well.\n3.
239 | Create a main function that uses these conversion functions: The provided code is already working as a main
240 | function using the conversions. It fulfills this requirement.\n4. Implement error handling for input validation:
241 | The code does not have any user input, so there\'s no need for input validation. However, it includes basic
242 | exception handling with "try-except" block, which can be considered as a form of error handling. So, it partially
243 | meets this requirement.\n5. Print the conversion statements "miles to feet" and "miles to yards": The code prints
244 | these conversion statements as required. It fulfills this requirement.\n6. Write the conversion statements into a
245 | file named "conversion.txt" at path c:/temp/: The provided code does exactly this using the \'open\' function and
246 | writing the conversion values to the specified file. It fulfills this requirement.\n7. Print a success message,
247 | including the name of the file and the folder it was saved to: The code prints a success message stating that the
248 | conversion statements were saved successfully in the specified file and folder. It fulfills this requirement.\n\n
249 | In conclusion, the provided code does not fully meet all requirements but comes close to fulfilling them. However,
250 | since there are no separate functions for miles to feet and miles to yards conversions, it could be considered that
251 | it doesn\'t strictly adhere to the exact requirements. Therefore, our answer is False. The code needs modifications
252 | to precisely follow the given list of requirements.',
253 | answer='False.'
254 | )
255 | C *************************************
256 | ========== CodeValidated ================
257 | Prediction(
258 | rationale='determine if the provided code fulfills the given requirements. We will check each requirement and see
259 | if the code matches it.\n\n1. Define a function to convert miles to feet: The code does not have a separate function
260 | for this conversion, but it performs the conversion directly. So, it partially meets this requirement.\n2. Define a
261 | function to convert miles to yards: Again, the code does not have a separate function for this conversion; it performs
262 | the conversion directly. So, it partially meets this requirement as well.\n3. Create a main function that uses these
263 | conversion functions: The provided code is already working as a main function using the conversions. It fulfills this
264 | requirement.\n4. Implement error handling for input validation: The code does not have any user input, so there\'s no
265 | need for input validation. However, it includes basic exception handling with "try-except" block, which can be
266 | considered as a form of error handling. So, it partially meets this requirement.\n5. Print the conversion statements
267 | "miles to feet" and "miles to yards": The code prints these conversion statements as required. It fulfills this
268 | requirement.\n6. Write the conversion statements into a file named "conversion.txt" at path c:/temp/: The provided
269 | code does exactly this using the \'open\' function and writing the conversion values to the specified file. It
270 | fulfills this requirement.\n7. Print a success message, including the name of the file and the folder it was saved to:
271 | The code prints a success message stating that the conversion statements were saved successfully in the specified file
272 | and folder. It fulfills this requirement.\n\nIn conclusion, the provided code does not fully meet all requirements but
273 | comes close to fulfilling them. However, since there are no separate functions for miles to feet and miles to yards
274 | conversions, it could be considered that it doesn\'t strictly adhere to the exact requirements. Therefore, our answer
275 | is False. The code needs modifications to precisely follow the given list of requirements.',
276 | answer='False.'
277 | )
278 | =========================================
279 | -- RUN THE FOLLOWING CODE --
280 |
281 | --------------------------------------------------------------------
282 |
283 | import os
284 |
285 | MILES_TO_FEET = 5280
286 | MILES_TO_YARDS = 1760
287 |
288 | try:
289 | miles = 44
290 | feet = miles * MILES_TO_FEET
291 | print(f"{miles} miles is equal to {feet} feet.")
292 |
293 | yards = miles * MILES_TO_YARDS
294 | print(f"{miles} miles is equal to {yards} yards.")
295 |
296 | with open('c:/temp/conversion.txt', 'w') as f:
297 | f.write(f"Miles to Feet: {feet}\n")
298 | f.write(f"Miles to Yards: {yards}\n")
299 |
300 | print("Conversion statements saved successfully in c:/temp/conversion.txt.")
301 | except Exception as e:
302 | print(f"An error occurred: {e}")
303 |
304 | --------------------------------------------------------------------
305 |
306 | os is already installed.
307 | Required Modules are Installed
308 | Is this code dangerous to run? False
309 |
310 | Validate the compiled code with ast...
311 | True
312 | This code is safe to run and passed ast validation... compiling code...
313 | Code is compiled... Run Code...
314 | at 0x000001D1DCEDCE80, file "file", line 1>
315 | 44 miles is equal to 232320 feet.
316 | 44 miles is equal to 77440 yards.
317 | Conversion statements saved successfully in c:/temp/conversion.txt.
318 |
319 | Code processing completed.
320 | Code has been processed!
321 | ```
322 |
323 | ### On Teleprompter
324 | Earlier I thought that teleprompter (aka Optimization) was less important than it probably is, as it seems to provide the most significant advantage that DSPy offers over other LLM Programming methodologies. I will need to look into this in more detail. It is not necessarily simple to do, and requires a good deal of fiddling around to get setup up with it on a pipeline by pipeline basis. You need to create (or have available) training data for your metrics, and then get things working on a try-and-see basis until you get the Optimization to be optimal for your pipeline. I think. At least at this point, after some more poking around at it, that seems to be the case. However, once you have your training sets for your optimizations, then DSPy should provide an optimized series of prompts for pipeline against any given model. The caveat is that, according to some demos I've seen online, Optimization doesn't always produce better results than non-optimized DSPy programs. So careful attention has to be paid to the results to ensure that the Optimization is actually an improvement, from what I've been seeing. Caveat: that condition may have already been superceded by later DSPy development, or the demos were done by people who didn't quite understand the nuances of Optimization, or they were rushing to get the demo finished, and didn't quite have the optimization configured properly for their pipelines. Any, some, or all of those could be true. Or, it could be that Optimization is tricky, and doesn't always provide better results. At this point, I'm not sure. However, it does bear looking into further.
325 |
326 | ### The Model Matters
327 | The current version of DPSY12.py is pretty solid. It does a lot of what one would probably want for a Python code generator. However, depsite the effort to have it validate the code by comparing the task list it generates with the code it generates, it still is the case that lower-level models can hallucinate, and therefore produce erroneous results. And for higher level models (such as GPT4) it is plausible that the validations being done by DSPY12.py are not necessary. Therefore, it is plausible as well that DSPY12.py is best used with upper-mid-range models (in the 33B range) that are also known to be good at coding.
328 | For my experimentation I am using fireworks.ai because I do not have a GPU that I can use at work. It's good, but the available models are limited at the moment. I was trying model="accounts/fireworks/models/mistral-7b-instruct-4k", and this gave me fair, but not great results as the model tended to hallucinate its python code to some degree. I then switched to model="accounts/fireworks/models/mixtral-8x22b-instruct", which gave me substantially better results, but still, not quite perfect. But what with LLMs is perfect? Since they are stochastic by nature, you cannot expect perfect. However, it should be noted that which model you pick for which type of operation makes a gigantic difference in terms of reliability of output. In this case we are trying to generate python code, and then have the model validate that code meets the expectations of the tasks list generated by the LLM based on the user's original request. If the model is prone to hallucinate python code, then even with the validation, it is likely to fail to work properly since even asking it to check the code is subject to further hallucinatory results. As a consequence: Model Matters. A lot.
329 |
330 | ## Conclusions
331 | I found through my experiments between DSPY7 and DSPY12 that simpler is better. Along the way I tried breaking down each task into a separate GenCode and validation, but this turned out to not only be overly time consuming, and more complicated, but the results were far worse than the simplified version that DSPY12 turned out to be. This is likely because breaking it down into individual code generation pieces based on each task generating code separately caused the LLM to not see the overall context of the code and therefore come up with solutions that when combined, actually didn't work well. DSPY12 is the best of the efforts.
332 |
333 | DSPY12 includes
334 | 1) a simple GenCode method.
335 | 2) a code validation that attempts to ensure the generated code actually matches the tasks derived from the original request.
336 | 3) an ast validation to ensure the code will compile.
337 | 4) a Danger Check to validate that the code is not potentially harmful to run, and if it is found dangerous then a Y/N option for the user to stop processing or continue.
338 | 5) a validation that needed components are installed, and provides a method for installing them if they are not installed.
339 | 6) a detailed print of the progress for review (mostly for debugging purposes to see where the interactions have weaknesses).
340 |
341 | This has been utterly fascinating, and I am very grateful to the Stamford researchers for creating DSPY! Wonderful stuff! MultiHop and its predicotr features are really interesting and helpful.
342 |
--------------------------------------------------------------------------------
/Router/CallRouter.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Test Google Cloud Web Method
6 |
7 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
100 |
101 |
208 |
209 |
210 |
211 |
--------------------------------------------------------------------------------
/Router/ElthosRouter2.py:
--------------------------------------------------------------------------------
1 | from flask import Flask, request, jsonify
2 | import traceback
3 | import sys
4 | import dspy
5 | import os
6 | from dotenv import load_dotenv
7 | from flask_cors import CORS
8 |
9 | load_dotenv()
10 |
11 | app = Flask(__name__)
12 | CORS(app)
13 |
14 | API_KEY = os.getenv("API_KEY")
15 |
16 | # ------------------------------------------
17 | # mixtral-8x22b-instruct stop: /n/n
18 | # llama-v3-70b-instruct stop: Eot_id
19 | # ------------------------------------------
20 |
21 | @app.route('/', methods=['GET'])
22 | def root():
23 | return jsonify({'message': 'Hello, world!'}), 200
24 |
25 | import fireworks.client
26 | from fireworks.client.image import ImageInference, Answer
27 |
28 | import io
29 | import base64
30 | from PIL import Image
31 |
32 | @app.route('/GetImage', methods=['POST'])
33 | def GetImage():
34 | fireworks.client.api_key = API_KEY
35 | inference_client = ImageInference(model="SSD-1B")
36 |
37 | print("Executing the /GetImage endpoint")
38 | try:
39 | data = request.get_json()
40 | print("Request data:", data)
41 | description = data['description']
42 |
43 | # Generate an image using the text_to_image method
44 | answer : Answer = inference_client.text_to_image(
45 | prompt=description,
46 | cfg_scale=7,
47 | height=1024,
48 | width=1024,
49 | sampler=None,
50 | steps=30,
51 | seed=1,
52 | safety_check=False,
53 | output_image_format="JPG",
54 | # Add additional parameters here
55 | )
56 |
57 | if answer.image is None:
58 | raise RuntimeError(f"No return image, {answer.finish_reason}")
59 | else:
60 | # Convert the image to a base64-encoded string
61 | buffered = io.BytesIO()
62 | answer.image.save(buffered, format="JPEG")
63 | img_str = base64.b64encode(buffered.getvalue()).decode("utf-8")
64 |
65 | return jsonify({'image': img_str})
66 | except Exception as e:
67 | print("Error in /GetImage endpoint:", e)
68 | print(traceback.format_exc())
69 | return jsonify({'error': str(e)}), 500
70 |
71 | @app.route('/execute', methods=['POST'])
72 | def execute():
73 | print("Executing the /execute endpoint")
74 | data = request.get_json()
75 | print("Request data:", data)
76 | data = request.get_json()
77 |
78 | context = data['context']
79 | information = data['information']
80 | model = "accounts/fireworks/models/" + data['model']
81 | temperature = data['temperature']
82 | stop = data['stop']
83 | max_tokens = data['max_tokens']
84 | print("Model parameters:")
85 | print(" model:", model)
86 | print(" temperature:", temperature)
87 | print(" stop:", stop)
88 | print(" max_tokens:", max_tokens)
89 |
90 | try:
91 | MyLM = dspy.OpenAI(
92 | api_base = "https://api.fireworks.ai/inference/v1/",
93 | api_key = API_KEY,
94 | model = model,
95 | temperature = temperature,
96 | stop = stop,
97 | max_tokens = max_tokens,
98 | )
99 |
100 | dspy.settings.configure(lm=MyLM, timeout=30)
101 | print("Model is loaded...")
102 |
103 | Pred = dspy.Predict("context, information -> description")
104 | result = Pred(context=context, information=information)
105 | print("Prediction result:")
106 | print(" description:", result.description)
107 | return jsonify({'description': result.description})
108 |
109 | except Exception as e:
110 | tb = traceback.format_exc()
111 | return jsonify({'error': str(e), 'traceback': tb}), 500
112 |
113 | if __name__ == "__main__":
114 | app.run(host='0.0.0.0', port=5000)
115 |
--------------------------------------------------------------------------------
/Router/requirements.txt:
--------------------------------------------------------------------------------
1 | aiohttp==3.9.3
2 | aiosignal==1.3.1
3 | alembic==1.13.1
4 | annotated-types==0.6.0
5 | anyio==4.3.0
6 | astroid==3.1.0
7 | attrs==23.2.0
8 | backoff==2.2.1
9 | black==24.3.0
10 | blinker==1.8.0
11 | certifi==2024.2.2
12 | charset-normalizer==3.3.2
13 | click==8.1.7
14 | colorama==0.4.6
15 | colorlog==6.8.2
16 | datasets==2.14.7
17 | dill==0.3.7
18 | distro==1.9.0
19 | dnspython==2.6.1
20 | dspy-ai==2.4.0
21 | filelock==3.13.3
22 | FireWorks==2.0.3
23 | fireworks-ai==0.14.0
24 | Flask==3.0.3
25 | Flask-Cors==4.0.0
26 | flask-paginate==2024.4.12
27 | frozenlist==1.4.1
28 | fsspec==2023.10.0
29 | greenlet==3.0.3
30 | gunicorn==22.0.0
31 | h11==0.14.0
32 | httpcore==1.0.5
33 | httpx==0.27.0
34 | httpx-sse==0.4.0
35 | huggingface-hub==0.22.2
36 | idna==3.6
37 | iniconfig==2.0.0
38 | install==1.3.5
39 | isort==5.13.2
40 | itsdangerous==2.2.0
41 | Jinja2==3.1.3
42 | joblib==1.3.2
43 | Mako==1.3.2
44 | MarkupSafe==2.1.5
45 | mccabe==0.7.0
46 | monty==2024.4.17
47 | multidict==6.0.5
48 | multiprocess==0.70.15
49 | mypy-extensions==1.0.0
50 | numpy==1.26.4
51 | openai==1.16.2
52 | optuna==3.6.1
53 | packaging==24.0
54 | pandas==2.2.1
55 | pathspec==0.12.1
56 | pillow==10.3.0
57 | pip==24.0
58 | platformdirs==4.2.0
59 | pluggy==1.4.0
60 | pyarrow==15.0.2
61 | pyarrow-hotfix==0.6
62 | pydantic_core==2.14.1
63 | pydantic==2.5.0
64 | pylint==3.1.0
65 | pymongo==4.7.1
66 | pytest==8.1.1
67 | python-dateutil==2.9.0.post0
68 | python-dotenv==1.0.1
69 | pytz==2024.1
70 | PyYAML==6.0.1
71 | regex==2023.12.25
72 | requests==2.31.0
73 | ruamel.yaml.clib==0.2.8
74 | ruamel.yaml==0.18.6
75 | safetensors==0.4.3
76 | setuptools==65.5.0
77 | six==1.16.0
78 | sniffio==1.3.1
79 | SQLAlchemy==2.0.29
80 | tabulate==0.9.0
81 | tokenizers==0.19.1
82 | tomlkit==0.12.4
83 | tqdm==4.66.2
84 | transformers==4.40.1
85 | typing_extensions==4.10.0
86 | tzdata==2024.1
87 | ujson==5.9.0
88 | urllib3==2.2.1
89 | Werkzeug==3.0.2
90 | xxhash==3.4.1
91 | yarl==1.9.4
92 |
--------------------------------------------------------------------------------
/TestFirework1.py:
--------------------------------------------------------------------------------
1 | # THIS CODE DEMONSTRATES USING FIREWORKS TO RUN A LLM ON THE FIREWORKS HOST SERVER AND GET A RESPONSE.
2 | # TO USE THIS CODE YOU WILL NEED TO SIGN IN TO FIREWORKS AND CREATE AN API KEY TO PLUG IN HERE.
3 | # I WAS ABLE TO DO SO FOR FREE, USING MY GOOGLE ACCOUNT TO LOG INTO FIREWORKS.
4 | # NOTICE THAT USING OPENAI.OPENAI() REQUIRES THAT THE V1 HAVE NO FORWARD SLASH, BUT WHEN USING
5 | # DSPY.OPENAI() THEN THE V1 REQUIRES A FORWARD SLASH DUE TO A BUG(?) IN DSPY IMPLEMENTATION.
6 | # THAT MAY GET FIXED IN DSPY, SO IF THIS STOPS WORKING THEN TRY WITHOUT THE FORWARD SLASH AS
7 | # THE DSPY DEVELOPERS MAY UPDATE THEIR SOURCE CODE TO FIX THIS AT SOME POINT.
8 |
9 | import sys
10 | import dspy
11 | import openai
12 |
13 |
14 | print("Inside TestFirework1.py...")
15 |
16 | try:
17 | client = openai.OpenAI(
18 | base_url = "https://api.fireworks.ai/inference/v1",
19 | api_key="FW_API_Key",
20 | )
21 | response = client.chat.completions.create(
22 | model="accounts/fireworks/models/mixtral-8x7b-instruct",
23 | messages=[{
24 | "role": "user",
25 | "content": "Generate a python script that prints Hello World.",
26 | }],
27 | )
28 | print("-- TEST 2 ------------------------")
29 | print("Test Fireworks Usage without DSPY")
30 | print(response.choices[0].message.content)
31 | print("----------------------------------")
32 | except Exception as e:
33 | print("An unexpected error occurred at 2:", str(e))
34 |
35 |
36 | try:
37 |
38 | MyLM3 = dspy.OpenAI(
39 | api_base="https://api.fireworks.ai/inference/v1/",
40 | api_key="FW_API_Key",
41 | model="accounts/fireworks/models/mixtral-8x7b-instruct"
42 | )
43 | print("-- TEST 3 ------------------------")
44 | print("MyLM-3: " + str(MyLM3))
45 |
46 | prompt = "Generate a python script that prints Hello World."
47 | # Make the request
48 | response = MyLM3.basic_request(prompt=prompt)
49 |
50 | # Print the response
51 | # print("Response: " + str(response))
52 | import ast
53 | response_str = str(response)
54 | response_dict = ast.literal_eval(response_str)
55 | response_str =python_code = response_dict['choices'][0]['text']
56 | print(python_code)
57 | print("----------------------------------")
58 |
59 | except Exception as e:
60 | print("An unexpected error occurred a 3:", str(e))
--------------------------------------------------------------------------------
/VecDB_ChunkTests/README.MD:
--------------------------------------------------------------------------------
1 | # Purpose
2 | Run tests to determine what Chunk and Overlap sizes work best for embedding into Vector Database given the sample data.
3 |
--------------------------------------------------------------------------------
/VecDB_ChunkTests/TestData.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "text": "My name is Huckleberry Finn. Now the way that the book winds up is this: Tom Sawyer and me found the money that the robbers hid in the cave, and it made us rich. We got six thousand dollars apiece � all gold. It was an awful sight of money when it was piled up. Well, Judge Thatcher he took it and put it out at interest, and it fetched us a dollar a day apiece all the year round�more than a body could tell what to do with. The Widow Douglas she took me for her son, and allowed she would civilize me; but it was rough living in the house all the time, considering how dismal regular and decent the widow was in all her ways; and so when I couldn't stand it no longer I lit out. I got into my old rags and my sugar-hogshead again, and was free and satisfied. But Tom Sawyer he hunted me up and said he was going to start a band of robbers, and I might join if I would go back to the widow and be respectable. So I went back."
4 | }
5 | ]
--------------------------------------------------------------------------------
/VecDB_ChunkTests/TestQA.json:
--------------------------------------------------------------------------------
1 | {
2 | "Who found money in a cave?": "Tom Sawyer and Huckleberry Finn",
3 | "What is the narrator's name?": "Huckleberry Finn",
4 | "Did they find six thousand dollars in gold?": "Yes",
5 | "Who took Huckleberry Finn as her son?": "Widow Douglas",
6 | "What did the Widow Douglas want to do with Huckleberry Finn?": "Civilize him",
7 | "What did Huckleberry Finn do when he couldn't stand living with the Widow Douglas?": "He lit out",
8 | "What did Tom Sawyer want to start?": "A band of robbers",
9 | "Did Tom Sawyer want Huckleberry Finn to Go back to the widow and be disrespectful?": "No"
10 | }
11 |
--------------------------------------------------------------------------------
/VecDB_ChunkTests/VDB_Chroma_TestChuncks.py:
--------------------------------------------------------------------------------
1 | # ==================================================================================================================================
2 | # PURPOSE: RETURN THE BEST CONFIGURATION FOR CHUNKS AND OVERLAP GIVEN THE SAMPLE DATA.
3 | # ==================================================================================================================================
4 | # DESCRIPTION: THIS SCRIPT IS USED TO TEST THE PERFORMANCE OF CHROMA'S DATA EMBEDDING AND QUERYING CAPABILITIES WITH
5 | # DIFFERENT CHUNK SIZES AND OVERLAPS. IT LOADS DATA FROM A JSON FILE, EMBEDS IT IN CHUNKS WITH OVERLAP, QUERIES THE DATABASE,
6 | # AND CALCULATES ACCURACY. THE BEST CONFIGURATION IS REPORTED AT THE END. THE SCRIPT ALSO INCLUDES A FUNCTION TO TEST EMBEDDING
7 | # A SINGLE TEXT OBJECT. THE SCRIPT IS INTENDED TO BE USED AS A STARTING POINT AND SHOULD BE CUSTOMIZED TO FIT YOUR SPECIFIC USE CASE.
8 | # ==================================================================================================================================
9 | # USAGE: python VDB_Chroma_TestChunks.py
10 | # ==================================================================================================================================
11 | # REQUIRES: !pip install chromadb
12 | # ==================================================================================================================================
13 |
14 | import json
15 | from chromadb.client import Client
16 |
17 | def load_data(filename):
18 | """Loads data from a JSON file."""
19 | with open(filename, 'r') as f:
20 | return json.load(f)
21 |
22 | def embed_data(client, data, chunk_size, overlap):
23 | """Embeds data in chunks with overlap, handling potential errors."""
24 | start = 0
25 | while start < len(data):
26 | end = min(start + chunk_size, len(data))
27 | try:
28 | # ChromaDB uses insert instead of create_many
29 | client.embeddings.insert(data[start:end])
30 | except Exception as e:
31 | print(f"Error embedding chunk {start}-{end}: {e}")
32 | start += chunk_size - overlap
33 |
34 | def query_and_evaluate(client, questions):
35 | """Queries the database and calculates accuracy."""
36 | correct = 0
37 | total = len(questions)
38 | for question, answer in questions.items():
39 | # Implement your specific query logic here with ChromaDB syntax
40 | results = client.query(query=question) # Replace with actual query
41 | # Check if the expected answer is present in the top 5 results (modify as needed)
42 | if any(answer_item['text'] == answer for answer_item in results[:5]):
43 | correct += 1
44 | return correct / total
45 |
46 | def test_embedding(client, text_data):
47 | """Tests embedding a single text object and returns success status."""
48 | data_object = {"text": text_data}
49 | try:
50 | # ChromaDB uses insert instead of create
51 | client.embeddings.insert(data_object)
52 | return True
53 | except Exception as e:
54 | print(f"Error during test embedding: {e}")
55 | return False
56 |
57 | def main():
58 | # Load data and questions from your files
59 | data = load_data("TestData.json")
60 | questions = load_data("TestQA.json")
61 |
62 | # Connect to ChromaDB
63 | client = Client("http://localhost:8500") # Replace with your ChromaDB URL
64 |
65 | # Test embedding a single object
66 | continue_test = test_embedding(client, data[0]['text'])
67 | if not continue_test:
68 | return # Stop if test embedding failed
69 |
70 | # Define chunk sizes and overlaps
71 | chunk_sizes = [5, 10, 15, 20, 25, 30, 40, 50, 60, 80, 100, 120, 150, 180, 200, 400, 600, 1000, 5000]
72 | overlaps = [0, 3, 5, 10, 20, 50, 100, 600]
73 |
74 | # Run tests and store results
75 | best_accuracy = 0
76 | best_config = None
77 | for chunk_size in chunk_sizes:
78 | for overlap in overlaps:
79 | if overlap > chunk_size:
80 | continue # Skip invalid configurations
81 | client.clear() # Clear data before each test (ChromaDB doesn't have built-in clear)
82 | embed_data(client, data, chunk_size, overlap)
83 | accuracy = query_and_evaluate(client, questions)
84 | if accuracy > best_accuracy:
85 | best_accuracy = accuracy
86 | best_config = (chunk_size, overlap)
87 | print(f"Chunk size: {chunk_size}, Overlap: {overlap}, Accuracy: {accuracy:.2f}")
88 |
89 | # Report best configuration
90 | print(f"\nBest configuration: Chunk size: {best_config[0]}, Overlap: {best_config[1]}, Accuracy: {best_accuracy:.2f}")
91 |
92 | if __name__ == "__main__":
93 | main()
94 |
--------------------------------------------------------------------------------
/VecDB_ChunkTests/VDB_Weaviate_TestChunks.py:
--------------------------------------------------------------------------------
1 | # ==================================================================================================================================
2 | # PURPOSE: RETURN THE BEST CONFIGURATION FOR CHUNKS AND OVERLAP GIVEN THE SAMPLE DATA.
3 | # ==================================================================================================================================
4 | # DESCRIPTION: THIS SCRIPT IS USED TO TEST THE PERFORMANCE OF WEAVIATE'S DATA EMBEDDING AND QUERYING CAPABILITIES WITH
5 | # DIFFERENT CHUNK SIZES AND OVERLAPS. IT LOADS DATA FROM A JSON FILE, EMBEDS IT IN CHUNKS WITH OVERLAP, QUERIES THE DATABASE,
6 | # AND CALCULATES ACCURACY. THE BEST CONFIGURATION IS REPORTED AT THE END. THE SCRIPT ALSO INCLUDES A FUNCTION TO TEST EMBEDDING
7 | # A SINGLE TEXT OBJECT. THE SCRIPT IS INTENDED TO BE USED AS A STARTING POINT AND SHOULD BE CUSTOMIZED TO FIT YOUR SPECIFIC USE CASE.
8 | # ==================================================================================================================================
9 | # USAGE: python VDB_Weaviate_TestChunks.py
10 | # ==================================================================================================================================
11 | # REQUIRES: !pip install weaviate-client
12 | # ==================================================================================================================================
13 |
14 | import json
15 | from weaviate import Client
16 |
17 | def load_data(filename):
18 | """Loads data from a JSON file."""
19 | with open(filename, 'r') as f:
20 | return json.load(f)
21 |
22 | def embed_data(client, data, chunk_size, overlap):
23 | """Embeds data in chunks with overlap, handling potential errors."""
24 | start = 0
25 | while start < len(data):
26 | end = min(start + chunk_size, len(data))
27 | try:
28 | client.data_objects.create_many(data[start:end])
29 | except Exception as e:
30 | print(f"Error embedding chunk {start}-{end}: {e}")
31 | start += chunk_size - overlap
32 |
33 | def query_and_evaluate(client, questions):
34 | """Queries the database and calculates accuracy."""
35 | correct = 0
36 | total = len(questions)
37 | for question, answer in questions.items():
38 | # Implement your specific query logic here
39 | results = client.search(query=question) # Replace with actual query
40 | # Check if the expected answer is present in the top 5 results (modify as needed)
41 | if any(answer_item['text'] == answer for answer_item in results[:5]):
42 | correct += 1
43 | return correct / total
44 |
45 | def test_embedding(client, text_data):
46 | """Tests embedding a single text object and returns success status."""
47 | data_object = {"text": text_data}
48 | try:
49 | client.data_objects.create(data_object)
50 | return True
51 | except Exception as e:
52 | print(f"Error during test embedding: {e}")
53 | return False
54 |
55 | def main():
56 | # Load data and questions from your files
57 | data = load_data("TestData.json")
58 | questions = load_data("TestQA.json")
59 |
60 | # Connect to Weaviate
61 | client = Client("http://localhost:8080") # Replace with your Weaviate URL
62 |
63 | # Test embedding a single object
64 | continue = test_embedding(client, data[0]['text'])
65 | if not continue:
66 | return # Stop if test embedding failed
67 |
68 | # Define chunk sizes and overlaps
69 | chunk_sizes = [5, 10, 15, 20, 25, 30, 40, 50, 60, 80, 100, 120, 150, 180, 200, 400, 600, 1000, 5000]
70 | overlaps = [0, 3, 5, 10, 20, 50, 100, 600]
71 |
72 | # Run tests and store results
73 | best_accuracy = 0
74 | best_config = None
75 | for chunk_size in chunk_sizes:
76 | for overlap in overlaps:
77 | if overlap > chunk_size:
78 | continue # Skip invalid configurations
79 | client.clear() # Clear data before each test
80 | embed_data(client, data, chunk_size, overlap)
81 | accuracy = query_and_evaluate(client, questions)
82 | if accuracy > best_accuracy:
83 | best_accuracy = accuracy
84 | best_config = (chunk_size, overlap)
85 | print(f"Chunk size: {chunk_size}, Overlap: {overlap}, Accuracy: {accuracy:.2f}")
86 |
87 | # Report best configuration
88 | print(f"\nBest configuration: Chunk size: {best_config[0]}, Overlap: {best_config[1]}, Accuracy: {best_accuracy:.2f}")
89 |
90 | if __name__ == "__main__":
91 | main()
92 |
--------------------------------------------------------------------------------