Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,9 @@ dependencies = [
"flask",
"waitress",
"tqdm",
"haralyzer"
"haralyzer",
"torch",
"transformers"
]

[project.scripts]
Expand Down
4 changes: 3 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,6 @@ waitress # Production WSGI server
flask # WSGI server for development the code
tqdm
haralyzer
pandas
torch # LLM library
transformers
pandas
27 changes: 27 additions & 0 deletions src/javacore_analyser/ai/add_stack_depth.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#
# Copyright IBM Corp. 2025 - 2025
# SPDX-License-Identifier: Apache-2.0
#

import pandas as pd
import numpy as np


def main():
df = pd.read_csv('data.csv', delimiter='\t')
print(df)
for index, row in df.iterrows():
if not np.isfinite(row['stack_trace_depth']):
stack_trace = row['stack_trace']
#print("Index: " + str(index) + " stack trace: " + stack_trace)
if isinstance(stack_trace, str):
depth = stack_trace.count('.java:') + stack_trace.count('Native Method')
else:
depth = 0
row['stack_trace_depth'] = depth
df.loc[index, 'stack_trace_depth'] = depth
print(df)
df.to_csv('data-modified.csv', sep='\t')

if __name__ == '__main__':
main()
29 changes: 29 additions & 0 deletions src/javacore_analyser/ai/llm_local_model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#
# Copyright IBM Corp. 2025 - 2025
# SPDX-License-Identifier: Apache-2.0
#

import logging
from transformers import AutoModelForCausalLM, AutoTokenizer


class LLMLocalModel:

def __init__(self):
logging.info("Initialising LLM Local Model")
self.device = "cpu"
self.max_tokens = 50
self.model_path = "ibm-granite/granite-4.0-350M"
self.model = AutoModelForCausalLM.from_pretrained(self.model_path)
self.model.eval()
logging.info("LLM Local Model Initialised")


def generate_response(self, text):
chat = [{ "role": "user", "content": text },]
tokenizer = AutoTokenizer.from_pretrained(self.model_path)
chat = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True)
input_tokens = tokenizer(chat, return_tensors="pt").to(self.device)
output = self.model.generate(**input_tokens, max_new_tokens=self.max_tokens)
output = tokenizer.batch_decode(output)
return output[0]
12 changes: 12 additions & 0 deletions src/javacore_analyser/javacore_set.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
from tqdm import tqdm

from javacore_analyser import tips
import javacore_analyser
from javacore_analyser.code_snapshot_collection import CodeSnapshotCollection
from javacore_analyser.constants import *
from javacore_analyser.har_file import HarFile
Expand All @@ -29,6 +30,7 @@
from javacore_analyser.snapshot_collection import SnapshotCollection
from javacore_analyser.snapshot_collection_collection import SnapshotCollectionCollection
from javacore_analyser.verbose_gc import VerboseGcParser
from javacore_analyser.ai.llm_local_model import LLMLocalModel


def _create_xml_xsl_for_collection(tmp_dir, templates_dir, xml_xsl_filename, collection, output_file_prefix):
Expand Down Expand Up @@ -96,6 +98,9 @@ def __init__(self, path):
self.gc_parser = VerboseGcParser()
self.har_files = []

self.model = LLMLocalModel()


# Assisted by WCA@IBM
# Latest GenAI contribution: ibm/granite-8b-code-instruct
@staticmethod
Expand Down Expand Up @@ -367,6 +372,13 @@ def __create_report_xml(self, output_file):

doc_node = self.doc.documentElement

header_node = self.doc.createElement("header")
logging.info("Generating welcome message")
welcome_message = self.model.generate_response("Write one sentence tip for tunning Java application")
logging.info("Welcome message generated: " + welcome_message)
header_node.appendChild(self.doc.createTextNode(welcome_message))
doc_node.appendChild(header_node)

javacore_count_node = self.doc.createElement("javacore_count")
javacore_count_node.appendChild(self.doc.createTextNode(str(len(self.javacores))))
doc_node.appendChild(javacore_count_node)
Expand Down