'use client' import { usePathname, useRouter, useSearchParams } from 'next/navigation' import { PrefetchKind } from 'next/dist/client/components/router-reducer/router-reducer-types' import toast from 'react-hot-toast' import { cn } from '@/lib/utils' import { ChatList } from '@/components/chat-list' import { ChatPanel } from '@/components/chat-panel' import { ChatScrollAnchor } from '@/components/chat-scroll-anchor' import { nanoid } from '@/lib/utils' import { functionSchemas } from '@/lib/functions/schemas' import { Landing } from '@/components/landing' import { useGlobalStore } from '@/app/state/global-store' import { useW3GPTDeploy } from '@/lib/hooks/use-w3gpt-deploy' // import { useNetwork } from 'wagmi' import { Dispatch, SetStateAction, useEffect, useState } from 'react' import { FadeIn } from './landing/fade-in' import Image from 'next/image'; import logoImage from '@/components/images/logo.png'; import jellaiImage from '@/components/images/jellai.png' import { useTranslation } from 'react-i18next' import { Button, Modal, message } from 'antd' import { PromptFormIndex } from './prompt-index' import { LogoAI } from './chat' import { useISDK, Message } from '@aigxion/isdk/react' import { PromptForm } from './prompt-form' import { ChatMessage } from './chat-message' import { Separator } from './ui/separator' import remarkGfm from 'remark-gfm' import remarkMath from 'remark-math' import { CodeBlock } from '@/components/ui/codeblock' import { MemoizedReactMarkdown } from '@/components/markdown' import { IconF, IconUser, IconW3GPT } from '@/components/ui/icons' import { ChatMessageActions } from '@/components/chat-message-actions' import { number } from 'zod' import Link from 'next/link' import { ChatRequest, FunctionCallHandler, FunctionCallHandlerV2 } from '@aigxion/isdk' export interface ChatProps extends React.ComponentProps<'div'> { initialMessages?: Message[] id: string position?: string className?: string classNameModal?: string defaultOpen?: boolean open?: boolean setOpen?: Dispatch> showLanding?: boolean avatarUrl?: string | null | undefined } export function ChatModel({ id, initialMessages, className, classNameModal, position, defaultOpen = false, showLanding = false, open, setOpen, avatarUrl }: ChatProps) { const router = useRouter() const path = usePathname() const { t, i18n } = useTranslation() // const [open, setOpen] = useState(defaultOpen); const searchParams = useSearchParams() let q = searchParams.get('q') let f = searchParams.get('f') console.log("-------", q, path) const isChatPage = path.includes('chat') const { setIsGenerating, setIsDeploying, setDeployContractConfig, verifyContractConfig, lastDeploymentData, setLastDeploymentData } = useGlobalStore() // const { chain } = useNetwork() // const fallbackChainId = chain?.unsupported === false ? chain.id : 5001 // const activeChainId = chain?.id ?? fallbackChainId // const { deploy } = useW3GPTDeploy({ chainId: activeChainId }) useEffect(() => { let isLounted = true async function verifyContract() { } verifyContract() // try { // let data = localStorage.getItem("UserData"); // if (data == null) return // data = JSON.parse(data) // console.log("UserData", data) // } catch (error) { // console.log(error) // } return () => { isLounted = false } }, []) useEffect(() => { let isMounted = true async function verifyContract() { if ( !verifyContractConfig?.deployHash || lastDeploymentData?.verificationStatus === 'success' ) { return } try { const response = await fetch('/api/verify-contract', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(verifyContractConfig) }) const data = await response.json() if (typeof data === 'string' && data.startsWith('0x') && isMounted) { toast.success('Contract verified successfully!') lastDeploymentData && setLastDeploymentData({ ...lastDeploymentData, verificationStatus: 'success' }) } else { setTimeout(verifyContract, 15000) // Retry after 15 seconds } } catch (error) { console.error('Verification failed', error) setTimeout(verifyContract, 15000) // Retry after 15 seconds } } verifyContract() return () => { isMounted = false } }, [lastDeploymentData, verifyContractConfig, setLastDeploymentData]) const functionCallHandler: FunctionCallHandler = async ( chatMessages, functionCall ) => { if (functionCall.name === 'deploy_contract') { setIsDeploying(true) const { chainId, contractName, sourceCode, constructorArgs } = JSON.parse( functionCall.arguments || '{}' ) // setDeployContractConfig({ // chainId: chainId ?? activeChainId, // contractName, // sourceCode, // constructorArgs // }) // const verifiedContractAddress = await deploy({ // chainId: chainId ?? activeChainId, // contractName, // sourceCode, // constructorArgs // }) // const functionResponse: ChatRequest = { // messages: [ // ...chatMessages, // { // id: nanoid(), // name: 'deploy_contract', // role: 'function', // content: JSON.stringify({ verifiedContractAddress }) // } // ], // functions: functionSchemas // } // return functionResponse } else if (functionCall.name === 'text_to_image') { const response = await fetch('/api/text-to-image', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ text: functionCall.arguments }) }) if (!response.ok) { throw new Error(response.statusText) } const { imageUrl, metadataUrl } = await response.json() const functionResponse: ChatRequest = { messages: [ ...chatMessages, { id: nanoid(), name: 'text-to-image', role: 'function', content: JSON.stringify({ imageUrl, metadataUrl }) } ], functions: functionSchemas } return functionResponse } } // {"messageId": "sendMessage", "conversationId": "thread_s1Bn2vw0X8BbsQCz3WtpmFg6", "type": "function", "functionName": "ShowCryptoAddressReceive", "functionArgs": "{\"cryptocurrencyType\":\"BTC\"}"} const functionCallHandlerV2: FunctionCallHandlerV2 = async ( functionCall ) => { const functionname = functionCall?.functionName message.warning(t("not_supported_call", { functionname })) switch (functionname) { case "CreateWalletWithTypes": // 创建钱包 break case "ShowCryptoAddressReceive": // 收款 console.log("----ShowCryptoAddressReceive-----", functionCall) break case "LoginHelp": // 进行第三方登录 break; case "ScanQrCode": // 扫描二维码 break; case "ChangePaymentPin": // 修改交易密码 break; case "CreatePaymentPin": // 设置交易密码 break; case "CountCryptoKindsQuantity": // 查询钱包中代币种类数量 break; case "InquireCryptoPriceFromExchange": // 查询代币当前价格 break; case "ListHistoryTransactionsUsingDate": // 查询交易记录 break; case "InqueryCryptoBalance": // 查询余额 break; case "TransferCryptoFromTo": // 转账 break; case "RecoverWallet": // 恢复钱包 break; default: console.log("----functionCallHandlerV2--default---", functionCall) break; } } const { messages, append, setMessages, reload, stop, isLoading, isSocket, input, setInput } = useISDK({ api: `${process.env.NEXT_PUBLIC_CLIENT_BASE_WS}`, experimental_onFunctionCall: functionCallHandler, experimental_onFunctionCallV2: functionCallHandlerV2, initialMessages, id, body: { id }, onResponse(response) { setIsGenerating(true) if (!isChatPage) { // router.prefetch(`/${i18n.language}/chat/${id}`, { router.prefetch(`/${path}`, { kind: PrefetchKind.FULL }) } if (response.status === 401) { toast.error(response.statusText) } }, onFinish() { setIsGenerating(false) if (!isChatPage) { history.pushState({}, '', `/${path}`) history.go(1) } } }) useEffect(() => { if (!isLoading && isSocket) { console.log('q has changed:', q); if (!!q) { append( { id, content: q, role: 'user' }, { functions: functionSchemas } ) if (setOpen) { setOpen(true) } } } // 这里可以执行您想要的任何操作 }, [q, isSocket]); return ( <>
{/*
{ showLanding && !position && }
{!open && { router.prefetch(`${path}?q=${value}`, { kind: PrefetchKind.FULL }) history.pushState({}, '', `${path}?q=${value}`) history.go(1) // console.log('--value----', value) // await new Promise(r => setTimeout(r, 300)); // setOpen(true) // await append( // { // id, // content: value, // role: 'user' // }, // { functions: functionSchemas } // ) }} // input={input} // setInput={setInput} // isLoading={isLoading} />}
*/}
{ if (setOpen) { setOpen(false) } }} onCancel={() => { q = "" // const url = `/chat/${id}` router.prefetch(path, { kind: PrefetchKind.FULL }) history.pushState({}, '', path) history.go(1) setMessages([]) if (setOpen) { setOpen(false) } }} footer="" // width={"50%"} // wrapClassName={cn('min-w-[95%] lg:min-w-[700px] p-[20px]', classNameModal)} className={cn('min-w-[95%] lg:min-w-[700px] p-[20px]', classNameModal)} >
{/* {showLanding && } */} {showLanding &&

Describe your intention

}
{/* */}
{messages.map((message, index) => (
{index < messages.length - 1 && ( )}
))}
{/* {!!messages && } */}
1 ? 'fixed bottom-0 bg-[#f6f6f6] z-[999]' : "absolute bg-[#fff]" )} style={{ // top: messages.length > 1 ? 'auto' : "10px", // backgroundColor: messages.length > 1 ? '#fff' : "", }} > {/* */}
{/*
{isLoading ? ( ) : ( messages?.length > 1 && ( ) )}
*/} {/*
*/}
{ await new Promise(r => setTimeout(r, 300)); await append( { id, content: value, role: 'user' }, { functions: functionSchemas } ) }} input={input} setInput={setInput} isLoading={isLoading} />
) } interface ChatMessageISDKProps { message: Message avatarUrl?: string | null | undefined } function ChatMessageISDK({ message, avatarUrl, ...props }: ChatMessageISDKProps) { const [isExpanded, setIsExpanded] = useState(false) const { t, i18n } = useTranslation() const language = i18n.language console.log("----ChatMessageISDK------", message) const onExpandClick = () => setIsExpanded(!isExpanded) if ((message.function_call && !isExpanded)) { return (
{/* */}
) } return (
{message.role === 'user' ? ( // {true ? ( avatarUrl ? ( {'user ) : ( // {t('your')} ) ) : message.function_call ? (
) : ( //
Answer Avatar
)}
{children}

}, code({ node, inline, className, children, ...props }) { if (children.length) { if (children[0] == '▍') { return ( ) } children[0] = (children[0] as string).replace('`▍`', '▍') } const match = /language-(\w+)/.exec(className || '') if (inline) { return ( {children} ) } return ( ) } }} > {message.content === '' ? typeof message.function_call === 'string' ? message.function_call : JSON.stringify(message.function_call) : message.content ?? ''}
) }