66 lines
2.2 KiB
Python
66 lines
2.2 KiB
Python
from odoo import models, fields, api
|
|
from .openwebui_model import OpenWebUIModel
|
|
import openwebui_client
|
|
from typing import Optional
|
|
|
|
|
|
class OpenWebUIProvider(models.Model):
|
|
_name = "openwebui.provider"
|
|
_description = "OpenWebUI Provider"
|
|
|
|
name = fields.Char(string="Name", required=True)
|
|
base_url = fields.Char(
|
|
string="Base URL",
|
|
required=True,
|
|
help="Base URL of the OpenWebUI server.",
|
|
)
|
|
api_key = fields.Char(
|
|
string="API Key",
|
|
required=True,
|
|
help="API key for authentication.",
|
|
groups="base.group_system",
|
|
)
|
|
model_ids = fields.One2many(
|
|
comodel_name="openwebui.model",
|
|
inverse_name="provider_id",
|
|
)
|
|
default_model_id = fields.Many2one(
|
|
comodel_name="openwebui.model",
|
|
)
|
|
|
|
def get_client(
|
|
self, model: Optional[OpenWebUIModel] = None
|
|
) -> openwebui_client.OpenWebUIClient:
|
|
if not self.base_url or not self.api_key:
|
|
raise ValueError("Base URL and API key are required")
|
|
model = model or self.default_model_id
|
|
return openwebui_client.OpenWebUIClient(
|
|
base_url=self.base_url,
|
|
api_key=self.api_key,
|
|
default_model=model.technical_name if model else None,
|
|
)
|
|
|
|
def sync_models(self):
|
|
client = self.get_client()
|
|
local_models = self.model_ids
|
|
remote_models = {model.id: model.name for model in client.models.list()}
|
|
for model in local_models:
|
|
if model.technical_name not in remote_models.keys():
|
|
model.unlink()
|
|
elif model.name != remote_models[model.technical_name]:
|
|
model.name = remote_models[model.technical_name]
|
|
for model_id, model_name in remote_models.items():
|
|
if model_id not in local_models.mapped("technical_name"):
|
|
self.env["openwebui.model"].create(
|
|
{
|
|
"name": model_name,
|
|
"technical_name": model_id,
|
|
"provider_id": self.id,
|
|
}
|
|
)
|
|
|
|
def create(self, vals_list):
|
|
providers = super().create(vals_list)
|
|
for provider in providers:
|
|
provider.sync_models()
|
|
return providers
|