diff --git a/web/package-lock.json b/web/package-lock.json index 6b87d740..be9e91fb 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -11,6 +11,7 @@ "@hookform/resolvers": "^5.0.1", "@radix-ui/react-checkbox": "^1.3.1", "@radix-ui/react-dialog": "^1.1.13", + "@radix-ui/react-hover-card": "^1.1.13", "@radix-ui/react-label": "^2.1.6", "@radix-ui/react-select": "^2.2.4", "@radix-ui/react-slot": "^1.2.2", @@ -46,7 +47,6 @@ "eslint-config-next": "15.2.4", "eslint-config-prettier": "^10.1.2", "eslint-plugin-prettier": "^5.2.6", - "husky": "^9.1.7", "lint-staged": "^15.5.1", "prettier": "^3.5.3", "tw-animate-css": "^1.2.9", @@ -1115,6 +1115,37 @@ } } }, + "node_modules/@radix-ui/react-hover-card": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.13.tgz", + "integrity": "sha512-Wtjvx0d/6Bgd/jAYS1mW6IPSUQ25y0hkUSOS1z5/4+U8+DJPwKroqJlM/AlVFl3LywGoruiPmcvB9Aks9mSOQw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.9", + "@radix-ui/react-popper": "1.2.6", + "@radix-ui/react-portal": "1.1.8", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-id": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", @@ -4298,21 +4329,6 @@ "node": ">=16.17.0" } }, - "node_modules/husky": { - "version": "9.1.7", - "resolved": "https://registry.npmmirror.com/husky/-/husky-9.1.7.tgz", - "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", - "dev": true, - "bin": { - "husky": "bin.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", diff --git a/web/package.json b/web/package.json index 8894e743..88b493a5 100644 --- a/web/package.json +++ b/web/package.json @@ -19,6 +19,7 @@ "@hookform/resolvers": "^5.0.1", "@radix-ui/react-checkbox": "^1.3.1", "@radix-ui/react-dialog": "^1.1.13", + "@radix-ui/react-hover-card": "^1.1.13", "@radix-ui/react-label": "^2.1.6", "@radix-ui/react-select": "^2.2.4", "@radix-ui/react-slot": "^1.2.2", diff --git a/web/src/app/home/components/dynamic-form/DynamicFormItemComponent.tsx b/web/src/app/home/components/dynamic-form/DynamicFormItemComponent.tsx index 03412dc6..c1834136 100644 --- a/web/src/app/home/components/dynamic-form/DynamicFormItemComponent.tsx +++ b/web/src/app/home/components/dynamic-form/DynamicFormItemComponent.tsx @@ -18,6 +18,11 @@ import { useEffect, useState } from 'react'; import { httpClient } from '@/app/infra/http/HttpClient'; import { LLMModel } from '@/app/infra/entities/api'; import { toast } from 'sonner'; +import { + HoverCard, + HoverCardContent, + HoverCardTrigger, +} from '@/components/ui/hover-card'; export default function DynamicFormItemComponent({ config, @@ -133,9 +138,106 @@ export default function DynamicFormItemComponent({ {llmModels.map((model) => ( - - {model.name} - + + + {model.name} + + +
+
+ icon +

{model.name}

+
+

+ {model.description} +

+ {model.requester_config && ( +
+ + + + Base URL: + {model.requester_config.base_url} +
+ )} + {model.abilities && model.abilities.length > 0 && ( +
+ {model.abilities.map((ability) => ( +
+ {ability === 'vision' && ( + + + + )} + {ability === 'func_call' && ( + + + + )} + + {ability === 'vision' + ? '视觉能力' + : ability === 'func_call' + ? '函数调用' + : ability} + +
+ ))} +
+ )} + {model.extra_args && + Object.keys(model.extra_args).length > 0 && ( +
+
额外参数:
+
+ {Object.entries( + model.extra_args as Record, + ).map(([key, value]) => ( +
+ {key}: + + {JSON.stringify(value)} + +
+ ))} +
+
+ )} +
+
+
))}
diff --git a/web/src/components/ui/hover-card.tsx b/web/src/components/ui/hover-card.tsx new file mode 100644 index 00000000..dc543a33 --- /dev/null +++ b/web/src/components/ui/hover-card.tsx @@ -0,0 +1,51 @@ +'use client'; + +import * as React from 'react'; +import * as HoverCardPrimitive from '@radix-ui/react-hover-card'; + +import { cn } from '@/lib/utils'; + +function HoverCard({ + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function HoverCardTrigger({ + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function HoverCardContent({ + className, + align = 'center', + sideOffset = 4, + ...props +}: React.ComponentProps) { + return ( + + + + ); +} + +export { HoverCard, HoverCardTrigger, HoverCardContent };