mirror of
https://github.com/getcompanion-ai/co-mono.git
synced 2026-04-19 01:04:27 +00:00
Custom provider WIP
This commit is contained in:
parent
389c80d7a8
commit
1f9a3a00cc
17 changed files with 1185 additions and 107 deletions
99
packages/web-ui/src/components/CustomProviderCard.ts
Normal file
99
packages/web-ui/src/components/CustomProviderCard.ts
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
import { Button, html, i18n, type TemplateResult } from "@mariozechner/mini-lit";
|
||||
import { LitElement } from "lit";
|
||||
import { customElement, property } from "lit/decorators.js";
|
||||
import type { CustomProvider } from "../storage/stores/custom-providers-store.js";
|
||||
|
||||
@customElement("custom-provider-card")
|
||||
export class CustomProviderCard extends LitElement {
|
||||
@property({ type: Object }) provider!: CustomProvider;
|
||||
@property({ type: Boolean }) isAutoDiscovery = false;
|
||||
@property({ type: Object }) status?: { modelCount: number; status: "connected" | "disconnected" | "checking" };
|
||||
@property() onRefresh?: (provider: CustomProvider) => void;
|
||||
@property() onEdit?: (provider: CustomProvider) => void;
|
||||
@property() onDelete?: (provider: CustomProvider) => void;
|
||||
|
||||
protected createRenderRoot() {
|
||||
return this;
|
||||
}
|
||||
|
||||
private renderStatus(): TemplateResult {
|
||||
if (!this.isAutoDiscovery) {
|
||||
return html`
|
||||
<div class="text-xs text-muted-foreground mt-1">
|
||||
${i18n("Models")}: ${this.provider.models?.length || 0}
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
if (!this.status) return html``;
|
||||
|
||||
const statusIcon =
|
||||
this.status.status === "connected"
|
||||
? html`<span class="text-green-500">●</span>`
|
||||
: this.status.status === "checking"
|
||||
? html`<span class="text-yellow-500">●</span>`
|
||||
: html`<span class="text-red-500">●</span>`;
|
||||
|
||||
const statusText =
|
||||
this.status.status === "connected"
|
||||
? `${this.status.modelCount} ${i18n("models")}`
|
||||
: this.status.status === "checking"
|
||||
? i18n("Checking...")
|
||||
: i18n("Disconnected");
|
||||
|
||||
return html`
|
||||
<div class="text-xs text-muted-foreground mt-1 flex items-center gap-1">
|
||||
${statusIcon} ${statusText}
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
render(): TemplateResult {
|
||||
return html`
|
||||
<div class="border border-border rounded-lg p-4 space-y-2">
|
||||
<div class="flex items-center justify-between">
|
||||
<div class="flex-1">
|
||||
<div class="font-medium text-sm text-foreground">${this.provider.name}</div>
|
||||
<div class="text-xs text-muted-foreground mt-1">
|
||||
<span class="capitalize">${this.provider.type}</span>
|
||||
${this.provider.baseUrl ? html` • ${this.provider.baseUrl}` : ""}
|
||||
</div>
|
||||
${this.renderStatus()}
|
||||
</div>
|
||||
<div class="flex gap-2">
|
||||
${
|
||||
this.isAutoDiscovery && this.onRefresh
|
||||
? Button({
|
||||
onClick: () => this.onRefresh?.(this.provider),
|
||||
variant: "ghost",
|
||||
size: "sm",
|
||||
children: i18n("Refresh"),
|
||||
})
|
||||
: ""
|
||||
}
|
||||
${
|
||||
this.onEdit
|
||||
? Button({
|
||||
onClick: () => this.onEdit?.(this.provider),
|
||||
variant: "ghost",
|
||||
size: "sm",
|
||||
children: i18n("Edit"),
|
||||
})
|
||||
: ""
|
||||
}
|
||||
${
|
||||
this.onDelete
|
||||
? Button({
|
||||
onClick: () => this.onDelete?.(this.provider),
|
||||
variant: "ghost",
|
||||
size: "sm",
|
||||
children: i18n("Delete"),
|
||||
})
|
||||
: ""
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
}
|
||||
|
|
@ -63,7 +63,7 @@ export class UserMessage extends LitElement {
|
|||
: this.message.content.find((c) => c.type === "text")?.text || "";
|
||||
|
||||
return html`
|
||||
<div class="flex justify-start ml-4">
|
||||
<div class="flex justify-start mx-4">
|
||||
<div class="user-message-container py-2 px-4 rounded-xl">
|
||||
<markdown-block .content=${content}></markdown-block>
|
||||
${
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue