66from PySide6 .QtNetwork import QNetworkReply , QNetworkRequest
77
88from qgitc .applicationbase import ApplicationBase
9- from qgitc .llm import AiModelFactory
10- from qgitc .models .chatgpt import ChatGPTModel
9+ from qgitc .llm import AiModelBase , AiModelFactory , AiParameters , AiRole
1110
1211
1312class OpenAICompatModelsFetcher (QObject ):
@@ -70,7 +69,7 @@ def requestInterruption(self):
7069
7170
7271@AiModelFactory .register ()
73- class LocalLLM (ChatGPTModel ):
72+ class LocalLLM (AiModelBase ):
7473
7574 _models = {}
7675
@@ -84,7 +83,8 @@ def __init__(self, model: str = None, parent=None):
8483 if url not in LocalLLM ._models :
8584 LocalLLM ._models [url ] = []
8685 authToken = settings .localLlmAuth ()
87- self .nameFetcher = OpenAICompatModelsFetcher (self .url_base , authToken )
86+ self .nameFetcher = OpenAICompatModelsFetcher (
87+ self .url_base , authToken )
8888 self .nameFetcher .finished .connect (self ._onFetchFinished )
8989 self .nameFetcher .start ()
9090 else :
@@ -116,3 +116,47 @@ def cleanup(self):
116116 def authorization (self ):
117117 settings = ApplicationBase .instance ().settings ()
118118 return settings .localLlmAuth ()
119+
120+ def queryAsync (self , params : AiParameters ):
121+ payload = {
122+ "frequency_penalty" : 0 ,
123+ "max_tokens" : params .max_tokens or 4096 ,
124+ "model" : params .model or self .modelId or "gpt-4.1" ,
125+ "presence_penalty" : 0 ,
126+ "temperature" : params .temperature ,
127+ "stream" : params .stream
128+ }
129+
130+ if params .tools :
131+ payload ["tools" ] = params .tools
132+ payload ["tool_choice" ] = params .tool_choice or "auto"
133+
134+ if params .continue_only :
135+ payload ["messages" ] = self .toOpenAiMessages ()
136+ elif params .fill_point is not None :
137+ payload ["prefix" ] = params .prompt [:params .fill_point ]
138+ payload ["suffix" ] = params .prompt [params .fill_point :]
139+ if params .language is not None and params .language != "None" :
140+ payload ["language" ] = params .language
141+ self .addHistory (AiRole .User , params .prompt )
142+ else :
143+ if params .sys_prompt :
144+ self .addHistory (AiRole .System , params .sys_prompt )
145+ self .addHistory (AiRole .User , params .prompt )
146+
147+ payload ["messages" ] = self .toOpenAiMessages ()
148+
149+ if params .top_p is not None :
150+ payload ["top_p" ] = params .top_p
151+
152+ self ._doQuery (payload , params .stream )
153+
154+ def _doQuery (self , payload , stream = True ):
155+ headers = {
156+ b"Content-Type" : b"application/json; charset=utf-8"
157+ }
158+
159+ if self .authorization :
160+ headers [b"Authorization" ] = self .authorization .encode ()
161+
162+ self .post (self .url , headers = headers , data = payload , stream = stream )
0 commit comments