mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-05-24 16:07:30 +08:00
* [Partner Nodes] add reasoning widget to Anthropic node Signed-off-by: bigcat88 <bigcat88@icloud.com> * [Partner Nodes] add new OpenRouterLLM node Signed-off-by: bigcat88 <bigcat88@icloud.com> * [Partner Nodes] fix passing images to Grok LLM Signed-off-by: bigcat88 <bigcat88@icloud.com> --------- Signed-off-by: bigcat88 <bigcat88@icloud.com>
94 lines
2.7 KiB
Python
94 lines
2.7 KiB
Python
"""Pydantic models for the OpenRouter chat completions API.
|
|
|
|
See: https://openrouter.ai/docs/api/api-reference/chat/send-chat-completion-request
|
|
"""
|
|
|
|
from typing import Literal
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class OpenRouterTextContent(BaseModel):
|
|
type: Literal["text"] = "text"
|
|
text: str = Field(...)
|
|
|
|
|
|
class OpenRouterImageUrl(BaseModel):
|
|
url: str = Field(...)
|
|
|
|
|
|
class OpenRouterImageContent(BaseModel):
|
|
type: Literal["image_url"] = "image_url"
|
|
image_url: OpenRouterImageUrl = Field(...)
|
|
|
|
|
|
class OpenRouterVideoUrl(BaseModel):
|
|
url: str = Field(...)
|
|
|
|
|
|
class OpenRouterVideoContent(BaseModel):
|
|
type: Literal["video_url"] = "video_url"
|
|
video_url: OpenRouterVideoUrl = Field(...)
|
|
|
|
|
|
OpenRouterContentBlock = OpenRouterTextContent | OpenRouterImageContent | OpenRouterVideoContent
|
|
|
|
|
|
class OpenRouterMessage(BaseModel):
|
|
role: Literal["system", "user", "assistant"] = Field(...)
|
|
content: str | list[OpenRouterContentBlock] = Field(...)
|
|
|
|
|
|
class OpenRouterReasoningConfig(BaseModel):
|
|
effort: str | None = Field(None)
|
|
exclude: bool | None = Field(None, description="If true, model reasons but reasoning is excluded from response.")
|
|
|
|
|
|
class OpenRouterWebSearchOptions(BaseModel):
|
|
search_context_size: str | None = Field(None)
|
|
|
|
|
|
class OpenRouterChatRequest(BaseModel):
|
|
model: str = Field(...)
|
|
messages: list[OpenRouterMessage] = Field(...)
|
|
seed: int | None = Field(None)
|
|
reasoning: OpenRouterReasoningConfig | None = Field(None)
|
|
web_search_options: OpenRouterWebSearchOptions | None = Field(None)
|
|
stream: bool = Field(False)
|
|
|
|
|
|
class OpenRouterUsage(BaseModel):
|
|
prompt_tokens: int | None = Field(None)
|
|
completion_tokens: int | None = Field(None)
|
|
total_tokens: int | None = Field(None)
|
|
cost: float | None = Field(None, description="Server-side authoritative USD cost of the call.")
|
|
|
|
|
|
class OpenRouterResponseMessage(BaseModel):
|
|
role: str | None = Field(None)
|
|
content: str | None = Field(None)
|
|
reasoning: str | None = Field(None)
|
|
refusal: str | None = Field(None)
|
|
|
|
|
|
class OpenRouterChoice(BaseModel):
|
|
index: int | None = Field(None)
|
|
message: OpenRouterResponseMessage | None = Field(None)
|
|
finish_reason: str | None = Field(None)
|
|
|
|
|
|
class OpenRouterError(BaseModel):
|
|
code: int | str | None = Field(None)
|
|
message: str | None = Field(None)
|
|
metadata: dict | None = Field(None)
|
|
|
|
|
|
class OpenRouterChatResponse(BaseModel):
|
|
id: str | None = Field(None)
|
|
model: str | None = Field(None)
|
|
object: str | None = Field(None)
|
|
provider: str | None = Field(None)
|
|
choices: list[OpenRouterChoice] | None = Field(None)
|
|
usage: OpenRouterUsage | None = Field(None)
|
|
error: OpenRouterError | None = Field(None)
|