-
-
- {$t('登录')}
-
-
-
{
rules={[{ required: true, message: $t('请输入账号') ,whitespace:true }]}
>
{
@@ -209,8 +205,9 @@ const Login:FC = ()=> {
- {$t('Version (0)-(1)',[state.version,state.updateDate])}
- {$t(state.powered)}
+
+ {$t('Version (0)-(1)',[state.version,state.updateDate])}, {$t(state.powered)}
+
diff --git a/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterCreate.tsx b/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterCreate.tsx
index 69f14b86..42984e29 100644
--- a/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterCreate.tsx
+++ b/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterCreate.tsx
@@ -1,4 +1,4 @@
-import {App, Button, Form, Input, InputNumber, Row, Spin, Tag} from "antd";
+import {App, Button, Form, Input, InputNumber, Row, Select, Space, Spin, Tag} from "antd";
import { MutableRefObject, useEffect, useRef, useState} from "react";
import {BasicResponse, PLACEHOLDER, RESPONSE_TIPS, STATUS_CODE} from "@common/const/const.tsx";
import {useFetch} from "@common/hooks/http.ts";
@@ -17,6 +17,8 @@ import { DrawerWithFooter } from "@common/components/aoplatform/DrawerWithFooter
import AiServiceRouterModelConfig, { AiServiceRouterModelConfigHandle } from "./AiServiceInsideRouterModelConfig";
import { AiProviderDefaultConfig, AiProviderLlmsItems } from "@core/pages/aiSetting/AiSettingList";
import { EditableFormInstance } from "@ant-design/pro-components";
+import { validateUrlSlash } from "@common/utils/validate";
+import { API_PATH_MATCH_RULES } from "@core/const/system/const";
type AiServiceRouterField = {
name:string
@@ -62,8 +64,11 @@ const AiServiceInsideRouterCreate = () => {
const onFinish = ()=>{
return variablesTableRef?.current?.validateFields().then(()=>{
return form.validateFields().then((formValue)=>{
- const {name, path, description, variables, prompt, timeout, retry} = formValue
- const body = {name, path: prefixForce ? `${apiPrefix}/${path}`:path , description,timeout, retry,aiPrompt:{variables:variables, prompt:prompt},aiModel:{id:defaultLlm?.id, provider:defaultLlm?.provider, config:defaultLlm?.config}}
+ const {name, path, description, variables, prompt, timeout, retry,pathMatch} = formValue
+ const body = {
+ name,
+ path: `${prefixForce ? apiPrefix + '/' : ''}${path.trim()}${pathMatch === 'prefix' ? '/*' : ''}`,
+ description,timeout, retry,aiPrompt:{variables:variables, prompt:prompt},aiModel:{id:defaultLlm?.id, provider:defaultLlm?.provider, config:defaultLlm?.config}}
return fetchData
>('service/ai-router',{method: routeId ? 'PUT' : 'POST',eoBody:(body), eoParams: {service:serviceId,team:teamId, ...(routeId ? {router:routeId}: {})},eoTransformKeys:['aiPrompt','aiModel']}).then(response=>{
const {code,msg} = response
if(code === STATUS_CODE.SUCCESS){
@@ -92,7 +97,20 @@ const AiServiceInsideRouterCreate = () => {
const {code,data,msg} = response
if(code === STATUS_CODE.SUCCESS){
const {path, aiPrompt,aiModel} = data.api
- form.setFieldsValue({...data.api,...aiPrompt, path:prefixForce && path?.startsWith(apiPrefix + '/')? path.slice((apiPrefix?.length || 0) + 1) : path })
+ let newPath = path
+ let pathMatch = 'full'
+ if(prefixForce && path?.startsWith(apiPrefix + '/')){
+ newPath = path.slice((apiPrefix?.length || 0) + 1)
+ }
+ if(newPath.endsWith('/*')){
+ newPath = newPath.slice(0,-2)
+ pathMatch = 'prefix'
+ }
+ form.setFieldsValue({
+ ...data.api,
+ ...aiPrompt,
+ path:newPath,
+ pathMatch})
setVariablesTable(aiPrompt.variables as VariableItems[])
setDefaultLlm(prev => ({...prev, provider: aiModel?.provider, id:aiModel?.id, config:aiModel.config}) as (AiProviderDefaultConfig & { config: string; }))
getDefaultModelConfig(aiModel?.provider)
@@ -141,7 +159,8 @@ const AiServiceInsideRouterCreate = () => {
variables:[{key:'Query',value:'',require:true}],
prompt:'{{Query}}',
retry:0,
- timeout:300000
+ timeout:300000,
+ pathMatch:'prefix'
})
}
return (form.setFieldsValue({}))
@@ -230,15 +249,38 @@ const AiServiceInsideRouterCreate = () => {
-
- className="flex-1"
- label={$t("请求路径")}
- name="path"
- rules={[{ required: true,whitespace:true }]}
- >
-
-
+
+
+
+
+
+
+
+ name="path"
+ rules={[{ required: true,whitespace:true },
+ {
+ validator: validateUrlSlash,
+ }]}
+ noStyle
+ >
+ {
+ if((e.target.value as string).endsWith('/*')){
+ form.setFieldValue('path',e.target.value.slice(0,-2))
+ form.setFieldValue('pathMatch','prefix')
+ }
+ }}/>
+
+
+
+
diff --git a/frontend/packages/core/src/pages/system/api/SystemInsideRouterCreate.tsx b/frontend/packages/core/src/pages/system/api/SystemInsideRouterCreate.tsx
index 62fd6c99..aa1bd0b1 100644
--- a/frontend/packages/core/src/pages/system/api/SystemInsideRouterCreate.tsx
+++ b/frontend/packages/core/src/pages/system/api/SystemInsideRouterCreate.tsx
@@ -1,10 +1,10 @@
-import {App, Button, Col, Form, Input, Row, Select, Spin, Switch} from "antd";
+import {App, Button, Col, Form, Input, Row, Select, Space, Spin, Switch} from "antd";
import {forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState} from "react";
import EditableTableWithModal from "@common/components/aoplatform/EditableTableWithModal.tsx";
import styles from "./SystemInsideApi.module.css"
import {BasicResponse, PLACEHOLDER, RESPONSE_TIPS, STATUS_CODE} from "@common/const/const.tsx";
import {useFetch} from "@common/hooks/http.ts";
-import { API_PROTOCOL, HTTP_METHOD, MATCH_CONFIG, MatchPositionEnum, MatchTypeEnum } from "../../../const/system/const.tsx";
+import { API_PATH_MATCH_RULES, API_PROTOCOL, HTTP_METHOD, MATCH_CONFIG, MatchPositionEnum, MatchTypeEnum } from "../../../const/system/const.tsx";
import { SystemInsideRouterCreateHandle, SystemInsideRouterCreateProps, SystemApiProxyFieldType, SystemInsideApiProxyHandle } from "../../../const/system/type.ts";
import { MatchItem } from "@common/const/type.ts";
import { validateUrlSlash } from "@common/utils/validate.ts";
@@ -31,7 +31,7 @@ const SystemInsideRouterCreate = forwardRef{
return Promise.all([proxyRef.current?.validate?.(), form.validateFields()]).then(([,formValue])=>{
const body = {...formValue,
- path: prefixForce? `${apiPrefix}/${formValue.path.trim()}` : formValue.path.trim(),
+ path: `${prefixForce ? apiPrefix + '/' : ''}${formValue.path.trim()}${formValue.pathMatch === 'prefix' ? '/*' : ''}`,
proxy:{...formValue.proxy,path:formValue.proxy.path ? (formValue.proxy.path.startsWith('/')? formValue.proxy.path: '/'+ formValue.proxy.path) : undefined}}
return fetchData>('service/router',{
method: routeId ? 'PUT' :'POST' ,eoBody:(body), eoParams: {service:serviceId,team:teamId, router:routeId },eoTransformKeys:['matchType','disable']}).then(response=>{
@@ -77,7 +77,24 @@ const SystemInsideRouterCreate = forwardRef
-
-
- label={$t("请求路径")}
- name="path"
- rules={[{ required: true,whitespace:true },
- {
- validator: validateUrlSlash,
- }]}
- className={styles['form-input-group']}
- >
-
+
+
+
+
+
+
+ name="path"
+ rules={[{ required: true,whitespace:true },
+ {
+ validator: validateUrlSlash,
+ }]}
+ noStyle
+ >
+ {
+ if((e.target.value as string).endsWith('/*')){
+ form.setFieldValue('path',e.target.value.slice(0,-2))
+ form.setFieldValue('pathMatch','prefix')
+ }
+ }}/>
+
+