Skip to content

Commit 0508547

Browse files
committed
Remove ChatGPT model module and inline its logic into OpenAI Compatible
The ChatGPTModel was only used as a base class for LocalLLM. Eliminate the indirection by moving queryAsync and _doQuery directly into LocalLLM and having it inherit from AiModelBase instead.
1 parent 1bd302b commit 0508547

File tree

2 files changed

+48
-62
lines changed

2 files changed

+48
-62
lines changed

qgitc/models/chatgpt.py

Lines changed: 0 additions & 58 deletions
This file was deleted.

qgitc/models/openaicompat.py

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66
from PySide6.QtNetwork import QNetworkReply, QNetworkRequest
77

88
from 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

1312
class 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

Comments
 (0)