diff --git a/app/api/logs/[...path]/route.ts b/app/api/logs/[...path]/route.ts index ad6bc33f3..5083853dd 100644 --- a/app/api/logs/[...path]/route.ts +++ b/app/api/logs/[...path]/route.ts @@ -4,15 +4,16 @@ import { insertUser } from "@/lib/auth"; // import { getTokenLength } from "@/app/utils/token"; // import { Tiktoken } from "tiktoken/lite" // import cl100k_base from "tiktoken/encoders/cl100k_base.json" -import "tiktoken"; -import { get_encoding } from "tiktoken"; +// import "tiktoken"; +// import { get_encoding } from "tiktoken"; import { addHours, subMinutes } from "date-fns"; +import { getTokenLength } from "@/lib/utils"; -function getTokenLength(input: string): number { - const encoding = get_encoding("cl100k_base"); - // console.log('tokens: ', input, encoding.countTokens()) - return encoding.encode(input).length; -} +// function getTokenLength(input: string): number { +// const encoding = get_encoding("cl100k_base"); +// // console.log('tokens: ', input, encoding.countTokens()) +// return encoding.encode(input).length; +// } async function handle( req: NextRequest, diff --git a/app/components/chat.tsx b/app/components/chat.tsx index 51a4b54af..acd85f8ce 100644 --- a/app/components/chat.tsx +++ b/app/components/chat.tsx @@ -50,6 +50,7 @@ import { useAppConfig, DEFAULT_TOPIC, ModelType, + ChatSession, } from "../store"; import { @@ -101,6 +102,7 @@ import { Button } from "emoji-picker-react/src/components/atoms/Button"; import Image from "next/image"; import { useAllModels } from "../utils/hooks"; import { MultimodalContent } from "../client/api"; +import { getTokenLength } from "@/lib/utils"; const Markdown = dynamic(async () => (await import("./markdown")).Markdown, { loading: () => , @@ -350,9 +352,10 @@ function ChatAction(props: { icon: 16, }); const allModels = useAllModels().map((item) => item.displayName); - const customModelClassName = allModels.includes(props.text) - ? "chat-input-action-long-weight" - : ""; + let customModelClassName = ""; + if (props.text.includes("使用") || allModels.includes(props.text)) { + customModelClassName = "chat-input-action-long-weight"; + } function updateWidth() { if (!iconRef.current || !textRef.current) return; @@ -466,6 +469,7 @@ export function ChatActions(props: { ); const [showModelSelector, setShowModelSelector] = useState(false); const [showUploadImage, setShowUploadImage] = useState(false); + const current_day_token = localStorage.getItem("current_day_token") ?? ""; useEffect(() => { const show = isVisionModel(currentModel); @@ -602,6 +606,22 @@ export function ChatActions(props: { }} /> )} + + false} + text={"使用 " + current_day_token} + icon={ + 😀 + } + /> ); } @@ -1643,8 +1663,45 @@ function _Chat() { ); } +function getCurrentDayToken(sessions: ChatSession[]): number { + try { + const currentTime = new Date(); + const startOfTheDayInTimeZone = new Date( + currentTime.getFullYear(), + currentTime.getMonth(), + currentTime.getDate(), + 0, + 0, + 0, + ); + const current_day_message = sessions + .reduce((acc, item) => { + // @ts-ignore + return acc.concat(item.messages); + }, []) + .filter((item1) => { + // @ts-ignore + const dateToCheck = new Date(item1.date); + return startOfTheDayInTimeZone < dateToCheck; + }); + // @ts-ignore + const all_current_day_content = current_day_message + .map((item) => item.content) + .join(" "); + // 获取会话之后,再整合content, + return getTokenLength(all_current_day_content); + } catch (e) { + return 0; + } +} + export function Chat() { const chatStore = useChatStore(); const sessionIndex = chatStore.currentSessionIndex; + // 这里计先计算一下当天总token数。 + localStorage.setItem( + "current_day_token", + String(getCurrentDayToken(chatStore.sessions)), + ); return <_Chat key={sessionIndex}>; } diff --git a/app/utils/token.ts b/app/utils/token.ts index 1e803408c..6ff0f5df2 100644 --- a/app/utils/token.ts +++ b/app/utils/token.ts @@ -23,19 +23,19 @@ export function estimateTokenLength(input: string): number { // import { get_encoding } from "tiktoken"; -export function getTokenLength(input: string): number { - // const { get_encoding } = require( "tiktoken" ); - // const encoding = get_encoding("cl100k_base"); - - const { Tiktoken } = require("tiktoken/lite"); - const cl100k_base = require("tiktoken/encoders/cl100k_base.json"); - const encoding = new Tiktoken( - cl100k_base.bpe_ranks, - cl100k_base.special_tokens, - cl100k_base.pat_str, - ); - const tokenLength = encoding.encode(input).length; - // console.log('[TOKEN],=========', input, tokenLength) - - return tokenLength; -} +// export function getTokenLength(input: string): number { +// // const { get_encoding } = require( "tiktoken" ); +// // const encoding = get_encoding("cl100k_base"); +// +// const { Tiktoken } = require("tiktoken/lite"); +// const cl100k_base = require("tiktoken/encoders/cl100k_base.json"); +// const encoding = new Tiktoken( +// cl100k_base.bpe_ranks, +// cl100k_base.special_tokens, +// cl100k_base.pat_str, +// ); +// const tokenLength = encoding.encode(input).length; +// // console.log('[TOKEN],=========', input, tokenLength) +// +// return tokenLength; +// } diff --git a/lib/auth_list.ts b/lib/auth_list.ts index 27d7616cc..c28ea6df2 100644 --- a/lib/auth_list.ts +++ b/lib/auth_list.ts @@ -4,7 +4,8 @@ export const DENY_LIST: string[] = [ ] export const ADMIN_LIST: string[] = [ "司金辉", "sijinhui", "sijinhui@qq.com", - "yuchuan", "于川" + "yuchuan", "于川", + "jujujujuju", ] diff --git a/lib/utils.ts b/lib/utils.ts index f43cf2645..c2c0e3fad 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -1,9 +1,13 @@ -// import { clsx, type ClassValue } from "clsx"; -import { twMerge } from "tailwind-merge"; -// export function cn(...inputs: ClassValue[]) { -// return twMerge(clsx(inputs)); -// } +import {get_encoding} from "tiktoken"; + + +export function getTokenLength(input: string): number { + const encoding = get_encoding("cl100k_base"); + // console.log('tokens: ', input, encoding.countTokens()) + return encoding.encode(input).length; +} + export async function fetcher( input: RequestInfo, init?: RequestInit, diff --git a/public/grinning-face.webp b/public/grinning-face.webp new file mode 100644 index 000000000..6e350846a Binary files /dev/null and b/public/grinning-face.webp differ