change to openai api type

This commit is contained in:
qnsh
2025-10-17 16:43:25 +08:00
parent 3133daa185
commit 3483bbb264
3 changed files with 69 additions and 33 deletions
+2 -2
View File
@@ -8,7 +8,7 @@
]
},
"ollama-vlm": {
"base_url": "https://ollama.com",
"base_url": "https://ollama.com/v1/chat/completions",
"api_key": "",
"timeout": 120,
"models": [
@@ -16,7 +16,7 @@
]
},
"ollama-llm": {
"base_url": "https://ollama.com",
"base_url": "https://ollama.com/v1/chat/completions",
"api_key": "",
"timeout": 120,
"models": [
+34 -20
View File
@@ -102,7 +102,7 @@ class OllamaLLM(io.ComfyNode):
raise ValueError("User prompt cannot be empty")
base_url, api_key, timeout = _load_config_credentials()
api_url = base_url+"/api/chat"
api_url = base_url
# 生成会话标识符(基于模型和系统提示词)
session_key = f"{model}_{hash(system_prompt) if system_prompt else 'no_system'}"
@@ -175,29 +175,43 @@ class OllamaLLM(io.ComfyNode):
except Exception as json_exception:
# print(f"JSON解析失败:{json_exception}")
raise ValueError(f'The API returned a JSON parsing failure')
# 解析响应数据
if "message" in data and data["message"]:
message = data.get("message", {})
content = message.get("content", "")
# 如果启用了上下文持久化,将助手的回复添加到历史记录
if persist_context and session_key in cls._conversation_history:
cls._conversation_history[session_key].append({
"role": "assistant",
"content": content
})
# 解析响应数据 - OpenAI兼容接口格式
if "choices" not in data:
raise ValueError(f'Missing "choices" field in API response')
# 获取历史对话记录并转换为JSON字符串
history_conversation = ""
if persist_context and session_key in cls._conversation_history:
history_conversation = json.dumps(cls._conversation_history[session_key], ensure_ascii=False)
else:
history_conversation = "[]"
choices = data["choices"]
if not choices or not isinstance(choices, list) or len(choices) == 0:
raise ValueError(f'Empty or invalid "choices" array in API response')
# 返回当前内容和历史对话JSON字符串
return io.NodeOutput(content, history_conversation)
first_choice = choices[0]
if not isinstance(first_choice, dict):
raise ValueError(f'Invalid choice format in API response')
message = first_choice.get("message", {})
if not message:
raise ValueError(f'Missing "message" field in API response')
content = message.get("content", "")
if not content:
raise ValueError(f'Empty content in API response')
# 如果启用了上下文持久化,将助手的回复添加到历史记录
if persist_context and session_key in cls._conversation_history:
cls._conversation_history[session_key].append({
"role": "assistant",
"content": content
})
# 获取历史对话记录并转换为JSON字符串
history_conversation = ""
if persist_context and session_key in cls._conversation_history:
history_conversation = json.dumps(cls._conversation_history[session_key], ensure_ascii=False)
else:
raise ValueError(f'Content data not found')
history_conversation = "[]"
# 返回当前内容和历史对话JSON字符串
return io.NodeOutput(content, history_conversation)
# 设置 web 目录,该目录中的任何 .js 文件都将被前端加载为前端扩展
# WEB_DIRECTORY = "./somejs"
+33 -11
View File
@@ -111,7 +111,7 @@ class OllamaVLM(io.ComfyNode):
raise ValueError("User prompt cannot be empty")
base_url, api_key, timeout = _load_config_credentials()
api_url = base_url+"/api/chat"
api_url = base_url
payload = {
"model": model,
"messages": [],
@@ -126,8 +126,16 @@ class OllamaVLM(io.ComfyNode):
image_base64 = tensor_to_base64_string(image)
user_message ={
"role": "user",
"content": user_prompt,
"images":[image_base64]
"content": [
{
"type": "text",
"text": user_prompt
},
{
"type": "image_url",
"image_url": f"data:image/png;base64,{image_base64}"
}
]
}
payload["messages"].append(user_message)
try:
@@ -141,7 +149,7 @@ class OllamaVLM(io.ComfyNode):
print(resp)
return cls._parse_response(resp)
except Exception as e:
raise ValueError(f'The API request failed:'+{e})
raise ValueError(f'The API request failed:{e}')
# 解析response 返回内容
@classmethod
def _parse_response(cls,resp):
@@ -156,13 +164,27 @@ class OllamaVLM(io.ComfyNode):
except Exception as json_exception:
# print(f"JSON解析失败:{json_exception}")
raise ValueError(f'The API returned a JSON parsing failure')
# 解析响应数据
if "message" in data and data["message"]:
message = data.get("message", {})
content = message.get("content","")
return io.NodeOutput(content)
else:
raise ValueError(f'Content data not found')
# 解析响应数据 - OpenAI兼容接口格式
if "choices" not in data:
raise ValueError(f'Missing "choices" field in API response')
choices = data["choices"]
if not choices or not isinstance(choices, list) or len(choices) == 0:
raise ValueError(f'Empty or invalid "choices" array in API response')
first_choice = choices[0]
if not isinstance(first_choice, dict):
raise ValueError(f'Invalid choice format in API response')
message = first_choice.get("message", {})
if not message:
raise ValueError(f'Missing "message" field in API response')
content = message.get("content", "")
if not content:
raise ValueError(f'Empty content in API response')
return io.NodeOutput(content)
# 设置 web 目录,该目录中的任何 .js 文件都将被前端加载为前端扩展
# WEB_DIRECTORY = "./somejs"