11package io .quarkiverse .langchain4j .jlama ;
22
33import static io .quarkiverse .langchain4j .jlama .JlamaModel .toFinishReason ;
4+ import static io .quarkiverse .langchain4j .runtime .VertxUtil .runOutEventLoop ;
45
56import java .nio .file .Path ;
67import java .util .List ;
1011import com .github .tjake .jlama .model .AbstractModel ;
1112import com .github .tjake .jlama .model .functions .Generator ;
1213import com .github .tjake .jlama .safetensors .DType ;
14+ import com .github .tjake .jlama .safetensors .prompt .PromptContext ;
1315import com .github .tjake .jlama .safetensors .prompt .PromptSupport ;
1416
1517import dev .langchain4j .data .message .AiMessage ;
@@ -32,17 +34,21 @@ public JlamaStreamingChatModel(JlamaStreamingChatModelBuilder builder) {
3234 .withRetry (() -> registry .downloadModel (builder .modelName , Optional .ofNullable (builder .authToken )), 3 );
3335
3436 JlamaModel .Loader loader = jlamaModel .loader ();
35- if (builder .quantizeModelAtRuntime != null && builder .quantizeModelAtRuntime )
37+ if (builder .quantizeModelAtRuntime != null && builder .quantizeModelAtRuntime ) {
3638 loader = loader .quantized ();
39+ }
3740
38- if (builder .workingQuantizedType != null )
41+ if (builder .workingQuantizedType != null ) {
3942 loader = loader .workingQuantizationType (builder .workingQuantizedType );
43+ }
4044
41- if (builder .threadCount != null )
45+ if (builder .threadCount != null ) {
4246 loader = loader .threadCount (builder .threadCount );
47+ }
4348
44- if (builder .workingDirectory != null )
49+ if (builder .workingDirectory != null ) {
4550 loader = loader .workingDirectory (builder .workingDirectory );
51+ }
4652
4753 this .model = loader .load ();
4854 this .temperature = builder .temperature == null ? 0.7f : builder .temperature ;
@@ -55,21 +61,18 @@ public static JlamaStreamingChatModelBuilder builder() {
5561
5662 @ Override
5763 public void generate (List <ChatMessage > messages , StreamingResponseHandler <AiMessage > handler ) {
58- if (model .promptSupport ().isEmpty ())
59- throw new UnsupportedOperationException ("This model does not support chat generation" );
60-
61- PromptSupport .Builder promptBuilder = model .promptSupport ().get ().builder ();
62- for (ChatMessage message : messages ) {
63- switch (message .type ()) {
64- case SYSTEM -> promptBuilder .addSystemMessage (message .text ());
65- case USER -> promptBuilder .addUserMessage (message .text ());
66- case AI -> promptBuilder .addAssistantMessage (message .text ());
67- default -> throw new IllegalArgumentException ("Unsupported message type: " + message .type ());
64+ PromptContext promptContext = createPromptContext (messages );
65+ runOutEventLoop (new Runnable () {
66+ @ Override
67+ public void run () {
68+ internalGenerate (handler , promptContext );
6869 }
69- }
70+ });
71+ }
7072
73+ private void internalGenerate (StreamingResponseHandler <AiMessage > handler , PromptContext promptContext ) {
7174 try {
72- Generator .Response r = model .generate (id , promptBuilder . build () , temperature , maxTokens , (token , time ) -> {
75+ Generator .Response r = model .generate (id , promptContext , temperature , maxTokens , (token , time ) -> {
7376 handler .onNext (token );
7477 });
7578
@@ -80,6 +83,23 @@ public void generate(List<ChatMessage> messages, StreamingResponseHandler<AiMess
8083 }
8184 }
8285
86+ private PromptContext createPromptContext (List <ChatMessage > messages ) {
87+ if (model .promptSupport ().isEmpty ()) {
88+ throw new UnsupportedOperationException ("This model does not support chat generation" );
89+ }
90+
91+ PromptSupport .Builder promptBuilder = model .promptSupport ().get ().builder ();
92+ for (ChatMessage message : messages ) {
93+ switch (message .type ()) {
94+ case SYSTEM -> promptBuilder .addSystemMessage (message .text ());
95+ case USER -> promptBuilder .addUserMessage (message .text ());
96+ case AI -> promptBuilder .addAssistantMessage (message .text ());
97+ default -> throw new IllegalArgumentException ("Unsupported message type: " + message .type ());
98+ }
99+ }
100+ return promptBuilder .build ();
101+ }
102+
83103 @ SuppressWarnings ("OptionalUsedAsFieldOrParameterType" )
84104 public static class JlamaStreamingChatModelBuilder {
85105
0 commit comments