visuddhinanda 7 miesięcy temu
rodzic
commit
f0b7343639

+ 96 - 0
api-v8/app/Http/Controllers/SysModelController.php

@@ -0,0 +1,96 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Models\AiModel;
+use Illuminate\Http\Request;
+use App\Http\Api\AuthApi;
+use Illuminate\Support\Facades\Log;
+use App\Tools\RedisClusters;
+use App\Http\Resources\AiModelResource;
+
+class SysModelController extends Controller
+{
+    protected $key = "/ai/model/system/";
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function index(Request $request)
+    {
+        //
+        $user = AuthApi::current($request);
+        if (!$user) {
+            Log::error('notification auth failed {request}', ['request' => $request]);
+            return $this->error(__('auth.failed'), 401, 401);
+        }
+        $modelsId = RedisClusters::get($this->key . $request->get('view', 'wbw'));
+        if (!is_array($modelsId)) {
+            $modelsId = [];
+        }
+        $result = AiModel::whereIn('uid', $modelsId)
+            ->get();
+        return $this->ok(
+            [
+                "rows" => AiModelResource::collection(resource: $result),
+                "count" => count($result),
+            ]
+        );
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\Response
+     */
+    public function store(Request $request)
+    {
+        //
+        $user = AuthApi::current($request);
+        if (!$user) {
+            Log::error('notification auth failed {request}', ['request' => $request]);
+            return $this->error(__('auth.failed'), 401, 401);
+        }
+        RedisClusters::put(
+            $this->key . $request->get('view', 'wbw'),
+            $request->get('models')
+        );
+        return $this->ok('ok');
+    }
+
+    /**
+     * Display the specified resource.
+     *
+     * @param  \App\Models\AiModel  $aiModel
+     * @return \Illuminate\Http\Response
+     */
+    public function show(string $view)
+    {
+        //
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \App\Models\AiModel  $aiModel
+     * @return \Illuminate\Http\Response
+     */
+    public function update(Request $request, AiModel $aiModel)
+    {
+        //
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  \App\Models\AiModel  $aiModel
+     * @return \Illuminate\Http\Response
+     */
+    public function destroy(AiModel $aiModel)
+    {
+        //
+    }
+}

+ 15 - 0
dashboard-v4/dashboard/src/pages/admin/ai/index.tsx

@@ -0,0 +1,15 @@
+import { Outlet } from "react-router-dom";
+import { Layout } from "antd";
+import { styleStudioContent } from "../../studio/style";
+
+const { Content } = Layout;
+
+const Widget = () => {
+  return (
+    <Content style={styleStudioContent}>
+      <Outlet />
+    </Content>
+  );
+};
+
+export default Widget;

+ 97 - 0
dashboard-v4/dashboard/src/pages/admin/ai/list.tsx

@@ -0,0 +1,97 @@
+import { Divider, Transfer } from "antd";
+import { useEffect, useState } from "react";
+import { TransferDirection } from "antd/es/transfer";
+
+import { get, post } from "../../../request";
+import {
+  IAiModelListResponse,
+  IAiModelResponse,
+  IAiModelSystem,
+} from "../../../components/api/ai";
+import { useAppSelector } from "../../../hooks";
+import { siteInfo } from "../../../reducers/layout";
+
+interface RecordType {
+  key: string;
+  title: string;
+  description?: string;
+}
+
+const Widget = () => {
+  const [models, setModels] = useState<RecordType[]>();
+
+  const [targetKeys, setTargetKeys] = useState<string[]>([]);
+  const [selectedKeys, setSelectedKeys] = useState<string[]>([]);
+
+  const site = useAppSelector(siteInfo);
+
+  useEffect(() => {
+    const url = `/v2/ai-model?view=chat`;
+    get<IAiModelListResponse>(url)
+      .then((json) => {
+        if (json.ok) {
+          setModels(
+            json.data.rows.map((item) => {
+              return {
+                key: item.uid,
+                title: item.name,
+                description: item.model,
+              };
+            })
+          );
+        }
+      })
+      .finally(() => {
+        const wbw = site?.settings?.models?.wbw?.map((item) => item.uid) ?? [];
+        setTargetKeys(wbw);
+      });
+  }, [site?.settings?.models?.wbw]);
+
+  const onChange = (
+    nextTargetKeys: string[],
+    direction: TransferDirection,
+    moveKeys: string[]
+  ) => {
+    setTargetKeys(nextTargetKeys);
+    const url = `/v2/system-model`;
+    post<IAiModelSystem, IAiModelResponse>(url, {
+      view: "wbw",
+      models: nextTargetKeys,
+    })
+      .then((json) => {
+        if (json.ok) {
+          console.info("system model save ok");
+        } else {
+          console.error("system model save");
+        }
+      })
+      .catch((e) => console.error(e));
+  };
+
+  const onSelectChange = (
+    sourceSelectedKeys: string[],
+    targetSelectedKeys: string[]
+  ) => {
+    console.log("sourceSelectedKeys:", sourceSelectedKeys);
+    console.log("targetSelectedKeys:", targetSelectedKeys);
+    setSelectedKeys([...sourceSelectedKeys, ...targetSelectedKeys]);
+  };
+
+  return (
+    <div>
+      <Divider>WBW</Divider>
+      <Transfer
+        dataSource={models}
+        titles={["All", "Selected"]}
+        targetKeys={targetKeys}
+        selectedKeys={selectedKeys}
+        onChange={onChange}
+        onSelectChange={onSelectChange}
+        render={(item) => item.title}
+      />
+      <Divider>Chat</Divider>
+    </div>
+  );
+};
+
+export default Widget;