Skip to content

Commit d51193d

Browse files
committed
test: add notebook to test LLMStreamingGenerator
work on #31
1 parent d38eac5 commit d51193d

File tree

2 files changed

+235
-0
lines changed

2 files changed

+235
-0
lines changed

how-tos/llm-streaming.ipynb

+234
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "code",
5+
"execution_count": 1,
6+
"metadata": {},
7+
"outputs": [],
8+
"source": [
9+
"String userHomeDir = System.getProperty(\"user.home\");\n",
10+
"String localRespoUrl = \"file://\" + userHomeDir + \"/.m2/repository/\";\n",
11+
"String langchain4jVersion = \"0.35.0\""
12+
]
13+
},
14+
{
15+
"cell_type": "code",
16+
"execution_count": 2,
17+
"metadata": {},
18+
"outputs": [
19+
{
20+
"name": "stdout",
21+
"output_type": "stream",
22+
"text": [
23+
"\u001b[0mRepository \u001b[1m\u001b[32mlocal\u001b[0m url: \u001b[1m\u001b[32mfile:///Users/bsorrentino/.m2/repository/\u001b[0m added.\n",
24+
"\u001b[0mRepositories count: 4\n",
25+
"\u001b[0mname: \u001b[1m\u001b[32mcentral \u001b[0murl: \u001b[1m\u001b[32mhttps://repo.maven.apache.org/maven2/ \u001b[0mrelease:\u001b[32mtrue \u001b[0mupdate:\u001b[32mnever \u001b[0msnapshot:\u001b[32mfalse \u001b[0mupdate:\u001b[32mnever \n",
26+
"\u001b[0m\u001b[0mname: \u001b[1m\u001b[32mjboss \u001b[0murl: \u001b[1m\u001b[32mhttps://repository.jboss.org/nexus/content/repositories/releases/ \u001b[0mrelease:\u001b[32mtrue \u001b[0mupdate:\u001b[32mnever \u001b[0msnapshot:\u001b[32mfalse \u001b[0mupdate:\u001b[32mnever \n",
27+
"\u001b[0m\u001b[0mname: \u001b[1m\u001b[32matlassian \u001b[0murl: \u001b[1m\u001b[32mhttps://packages.atlassian.com/maven/public \u001b[0mrelease:\u001b[32mtrue \u001b[0mupdate:\u001b[32mnever \u001b[0msnapshot:\u001b[32mfalse \u001b[0mupdate:\u001b[32mnever \n",
28+
"\u001b[0m\u001b[0mname: \u001b[1m\u001b[32mlocal \u001b[0murl: \u001b[1m\u001b[32mfile:///Users/bsorrentino/.m2/repository/ \u001b[0mrelease:\u001b[32mtrue \u001b[0mupdate:\u001b[32mnever \u001b[0msnapshot:\u001b[32mtrue \u001b[0mupdate:\u001b[32malways \n",
29+
"\u001b[0m"
30+
]
31+
}
32+
],
33+
"source": [
34+
"%dependency /add-repo local \\{localRespoUrl} release|never snapshot|always\n",
35+
"%dependency /list-repos"
36+
]
37+
},
38+
{
39+
"cell_type": "markdown",
40+
"metadata": {},
41+
"source": [
42+
"Remove installed package from Jupiter cache"
43+
]
44+
},
45+
{
46+
"cell_type": "code",
47+
"execution_count": 3,
48+
"metadata": {},
49+
"outputs": [],
50+
"source": [
51+
"%%bash \n",
52+
"rm -rf \\{userHomeDir}/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/bsc/langgraph4j"
53+
]
54+
},
55+
{
56+
"cell_type": "code",
57+
"execution_count": 4,
58+
"metadata": {},
59+
"outputs": [
60+
{
61+
"name": "stdout",
62+
"output_type": "stream",
63+
"text": [
64+
"Adding dependency \u001b[0m\u001b[1m\u001b[32morg.slf4j:slf4j-jdk14:2.0.9\n",
65+
"\u001b[0mAdding dependency \u001b[0m\u001b[1m\u001b[32morg.bsc.langgraph4j:langgraph4j-core-jdk8:1.0-SNAPSHOT\n",
66+
"\u001b[0mAdding dependency \u001b[0m\u001b[1m\u001b[32morg.bsc.langgraph4j:langgraph4j-langchain4j:1.0-SNAPSHOT\n",
67+
"\u001b[0mAdding dependency \u001b[0m\u001b[1m\u001b[32mdev.langchain4j:langchain4j:0.35.0\n",
68+
"\u001b[0mAdding dependency \u001b[0m\u001b[1m\u001b[32mdev.langchain4j:langchain4j-open-ai:0.35.0\n",
69+
"\u001b[0mSolving dependencies\n",
70+
"Resolved artifacts count: 26\n",
71+
"Add to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/slf4j/slf4j-jdk14/2.0.9/slf4j-jdk14-2.0.9.jar\u001b[0m\n",
72+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/slf4j/slf4j-api/2.0.9/slf4j-api-2.0.9.jar\u001b[0m\n",
73+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/bsc/langgraph4j/langgraph4j-core-jdk8/1.0-SNAPSHOT/langgraph4j-core-jdk8-1.0-SNAPSHOT.jar\u001b[0m\n",
74+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/bsc/async/async-generator-jdk8/2.1.0-SNAPSHOT/async-generator-jdk8-2.1.0-SNAPSHOT.jar\u001b[0m\n",
75+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/bsc/langgraph4j/langgraph4j-langchain4j/1.0-SNAPSHOT/langgraph4j-langchain4j-1.0-SNAPSHOT.jar\u001b[0m\n",
76+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/dev/langchain4j/langchain4j/0.35.0/langchain4j-0.35.0.jar\u001b[0m\n",
77+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/dev/langchain4j/langchain4j-core/0.35.0/langchain4j-core-0.35.0.jar\u001b[0m\n",
78+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar\u001b[0m\n",
79+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/apache/opennlp/opennlp-tools/1.9.4/opennlp-tools-1.9.4.jar\u001b[0m\n",
80+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/dev/langchain4j/langchain4j-open-ai/0.35.0/langchain4j-open-ai-0.35.0.jar\u001b[0m\n",
81+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/dev/ai4j/openai4j/0.22.0/openai4j-0.22.0.jar\u001b[0m\n",
82+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/squareup/retrofit2/retrofit/2.9.0/retrofit-2.9.0.jar\u001b[0m\n",
83+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/squareup/retrofit2/converter-jackson/2.9.0/converter-jackson-2.9.0.jar\u001b[0m\n",
84+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/fasterxml/jackson/core/jackson-databind/2.17.2/jackson-databind-2.17.2.jar\u001b[0m\n",
85+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/fasterxml/jackson/core/jackson-annotations/2.17.2/jackson-annotations-2.17.2.jar\u001b[0m\n",
86+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/fasterxml/jackson/core/jackson-core/2.17.2/jackson-core-2.17.2.jar\u001b[0m\n",
87+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/squareup/okhttp3/okhttp/4.12.0/okhttp-4.12.0.jar\u001b[0m\n",
88+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/squareup/okio/okio/3.6.0/okio-3.6.0.jar\u001b[0m\n",
89+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/squareup/okio/okio-jvm/3.6.0/okio-jvm-3.6.0.jar\u001b[0m\n",
90+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/squareup/okhttp3/okhttp-sse/4.12.0/okhttp-sse-4.12.0.jar\u001b[0m\n",
91+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.9.10/kotlin-stdlib-jdk8-1.9.10.jar\u001b[0m\n",
92+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/jetbrains/kotlin/kotlin-stdlib/1.9.10/kotlin-stdlib-1.9.10.jar\u001b[0m\n",
93+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/jetbrains/kotlin/kotlin-stdlib-common/1.9.10/kotlin-stdlib-common-1.9.10.jar\u001b[0m\n",
94+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/jetbrains/annotations/13.0/annotations-13.0.jar\u001b[0m\n",
95+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.9.10/kotlin-stdlib-jdk7-1.9.10.jar\u001b[0m\n",
96+
"\u001b[0mAdd to classpath: \u001b[0m\u001b[32m/Users/bsorrentino/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/com/knuddels/jtokkit/1.1.0/jtokkit-1.1.0.jar\u001b[0m\n",
97+
"\u001b[0m"
98+
]
99+
}
100+
],
101+
"source": [
102+
"%dependency /add org.slf4j:slf4j-jdk14:2.0.9\n",
103+
"%dependency /add org.bsc.langgraph4j:langgraph4j-core-jdk8:1.0-SNAPSHOT\n",
104+
"%dependency /add org.bsc.langgraph4j:langgraph4j-langchain4j:1.0-SNAPSHOT\n",
105+
"%dependency /add dev.langchain4j:langchain4j:\\{langchain4jVersion}\n",
106+
"%dependency /add dev.langchain4j:langchain4j-open-ai:\\{langchain4jVersion}\n",
107+
"\n",
108+
"%dependency /resolve"
109+
]
110+
},
111+
{
112+
"cell_type": "markdown",
113+
"metadata": {},
114+
"source": [
115+
"### Initialize Logger"
116+
]
117+
},
118+
{
119+
"cell_type": "code",
120+
"execution_count": 7,
121+
"metadata": {},
122+
"outputs": [],
123+
"source": [
124+
"try( var file = new java.io.FileInputStream(\"./logging.properties\")) {\n",
125+
" var lm = java.util.logging.LogManager.getLogManager();\n",
126+
" lm.checkAccess(); \n",
127+
" lm.readConfiguration( file );\n",
128+
"}\n",
129+
"\n",
130+
"var log = org.slf4j.LoggerFactory.getLogger(\"llm-streaming\");\n"
131+
]
132+
},
133+
{
134+
"cell_type": "code",
135+
"execution_count": 10,
136+
"metadata": {},
137+
"outputs": [
138+
{
139+
"name": "stderr",
140+
"output_type": "stream",
141+
"text": [
142+
"2024-11-05 19:20:42 INFO REPL.$JShell$31 do_it$ RESULT:\n",
143+
"2024-11-05 19:20:42 INFO REPL.$JShell$31 do_it$ RESULT:Why\n",
144+
"2024-11-05 19:20:42 INFO REPL.$JShell$31 do_it$ RESULT: did\n",
145+
"2024-11-05 19:20:42 INFO REPL.$JShell$31 do_it$ RESULT: the\n",
146+
"2024-11-05 19:20:42 INFO REPL.$JShell$31 do_it$ RESULT: scare\n",
147+
"2024-11-05 19:20:42 INFO REPL.$JShell$31 do_it$ RESULT:crow\n",
148+
"2024-11-05 19:20:42 INFO REPL.$JShell$31 do_it$ RESULT: win\n",
149+
"2024-11-05 19:20:42 INFO REPL.$JShell$31 do_it$ RESULT: an\n",
150+
"2024-11-05 19:20:42 INFO REPL.$JShell$31 do_it$ RESULT: award\n",
151+
"2024-11-05 19:20:42 INFO REPL.$JShell$31 do_it$ RESULT:?\n",
152+
"2024-11-05 19:20:42 INFO REPL.$JShell$31 do_it$ RESULT: \n",
153+
"\n",
154+
"\n",
155+
"2024-11-05 19:20:42 INFO REPL.$JShell$31 do_it$ RESULT:Because\n",
156+
"2024-11-05 19:20:42 INFO REPL.$JShell$31 do_it$ RESULT: he\n",
157+
"2024-11-05 19:20:42 INFO REPL.$JShell$31 do_it$ RESULT: was\n",
158+
"2024-11-05 19:20:42 INFO REPL.$JShell$31 do_it$ RESULT: outstanding\n",
159+
"2024-11-05 19:20:42 INFO REPL.$JShell$31 do_it$ RESULT: in\n",
160+
"2024-11-05 19:20:42 INFO REPL.$JShell$31 do_it$ RESULT: his\n",
161+
"2024-11-05 19:20:42 INFO REPL.$JShell$31 do_it$ RESULT: field\n",
162+
"2024-11-05 19:20:42 INFO REPL.$JShell$31 do_it$ RESULT:!\n"
163+
]
164+
}
165+
],
166+
"source": [
167+
"import dev.langchain4j.model.StreamingResponseHandler;\n",
168+
"import dev.langchain4j.model.chat.StreamingChatLanguageModel;\n",
169+
"import dev.langchain4j.model.openai.OpenAiStreamingChatModel;\n",
170+
"import dev.langchain4j.data.message.AiMessage;\n",
171+
"import dev.langchain4j.model.output.Response;\n",
172+
"import static dev.langchain4j.model.openai.OpenAiChatModelName.GPT_4_O_MINI;\n",
173+
"import org.bsc.langgraph4j.langchain4j.generators.LLMStreamingGenerator;\n",
174+
"\n",
175+
"\n",
176+
"var generator = new LLMStreamingGenerator();\n",
177+
"\n",
178+
"StreamingChatLanguageModel model = OpenAiStreamingChatModel.builder()\n",
179+
" .apiKey(System.getenv(\"OPENAI_API_KEY\"))\n",
180+
" .modelName(GPT_4_O_MINI)\n",
181+
" .build();\n",
182+
"\n",
183+
"String userMessage = \"Tell me a joke\";\n",
184+
"\n",
185+
"/*\n",
186+
"model.generate(userMessage, new StreamingResponseHandler<AiMessage>() {\n",
187+
"\n",
188+
" @Override\n",
189+
" public void onNext(String token) {\n",
190+
" System.out.println(\"onNext: \" + token);\n",
191+
" }\n",
192+
"\n",
193+
" @Override\n",
194+
" public void onComplete(Response<AiMessage> response) {\n",
195+
" System.out.println(\"onComplete: \" + response);\n",
196+
" }\n",
197+
"\n",
198+
" @Override\n",
199+
" public void onError(Throwable error) {\n",
200+
" error.printStackTrace();\n",
201+
" }\n",
202+
"});\n",
203+
"*/\n",
204+
"\n",
205+
"model.generate(userMessage, generator.handler() );\n",
206+
"\n",
207+
"for( var r : generator ) {\n",
208+
" //System.out.println( r );\n",
209+
" log.info( \"RESULT:{}\", r );\n",
210+
" }\n",
211+
" \n",
212+
"//Thread.sleep( 1000 );"
213+
]
214+
}
215+
],
216+
"metadata": {
217+
"kernelspec": {
218+
"display_name": "Java (rjk 2.2.0)",
219+
"language": "java",
220+
"name": "rapaio-jupyter-kernel"
221+
},
222+
"language_info": {
223+
"codemirror_mode": "java",
224+
"file_extension": ".jshell",
225+
"mimetype": "text/x-java-source",
226+
"name": "java",
227+
"nbconvert_exporter": "script",
228+
"pygments_lexer": "java",
229+
"version": "17.0.2+8-86"
230+
}
231+
},
232+
"nbformat": 4,
233+
"nbformat_minor": 2
234+
}

how-tos/logging.properties

+1
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,4 @@ org.bsc.langgraph4j.serializer.std.ObjectOutputWithMapper.level = INFO
2727
AdaptiveRag.level = FINEST
2828
AgentExecutor.level = FINEST
2929
time-travel.level = FINEST
30+
llm-streaming.level = FINEST

0 commit comments

Comments
 (0)