feat: lafClaude
This commit is contained in:
3
src/utils/chat/claude.ts
Normal file
3
src/utils/chat/claude.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
export const ClaudeSliceTextByToken = ({ text, length }: { text: string; length: number }) => {
|
||||
return text.slice(0, length);
|
||||
};
|
||||
@@ -1,46 +1,30 @@
|
||||
import { OpenAiChatEnum } from '@/constants/model';
|
||||
import { ClaudeEnum, OpenAiChatEnum } from '@/constants/model';
|
||||
import type { ChatModelType } from '@/constants/model';
|
||||
import type { ChatItemSimpleType } from '@/types/chat';
|
||||
import { countOpenAIToken, getOpenAiEncMap, adaptChatItem_openAI } from './openai';
|
||||
import { ChatCompletionRequestMessage } from 'openai';
|
||||
|
||||
export type CountTokenType = { messages: ChatItemSimpleType[] };
|
||||
import { countOpenAIToken, openAiSliceTextByToken } from './openai';
|
||||
import { ClaudeSliceTextByToken } from './claude';
|
||||
|
||||
export const modelToolMap: Record<
|
||||
ChatModelType,
|
||||
{
|
||||
countTokens: (data: CountTokenType) => number;
|
||||
adaptChatMessages: (data: CountTokenType) => ChatCompletionRequestMessage[];
|
||||
countTokens: (data: { messages: ChatItemSimpleType[] }) => number;
|
||||
sliceText: (data: { text: string; length: number }) => string;
|
||||
}
|
||||
> = {
|
||||
[OpenAiChatEnum.GPT35]: {
|
||||
countTokens: ({ messages }: CountTokenType) =>
|
||||
countOpenAIToken({ model: OpenAiChatEnum.GPT35, messages }),
|
||||
adaptChatMessages: adaptChatItem_openAI
|
||||
countTokens: ({ messages }) => countOpenAIToken({ model: OpenAiChatEnum.GPT35, messages }),
|
||||
sliceText: (data) => openAiSliceTextByToken({ model: OpenAiChatEnum.GPT35, ...data })
|
||||
},
|
||||
[OpenAiChatEnum.GPT4]: {
|
||||
countTokens: ({ messages }: CountTokenType) =>
|
||||
countOpenAIToken({ model: OpenAiChatEnum.GPT4, messages }),
|
||||
adaptChatMessages: adaptChatItem_openAI
|
||||
countTokens: ({ messages }) => countOpenAIToken({ model: OpenAiChatEnum.GPT4, messages }),
|
||||
sliceText: (data) => openAiSliceTextByToken({ model: OpenAiChatEnum.GPT35, ...data })
|
||||
},
|
||||
[OpenAiChatEnum.GPT432k]: {
|
||||
countTokens: ({ messages }: CountTokenType) =>
|
||||
countOpenAIToken({ model: OpenAiChatEnum.GPT432k, messages }),
|
||||
adaptChatMessages: adaptChatItem_openAI
|
||||
countTokens: ({ messages }) => countOpenAIToken({ model: OpenAiChatEnum.GPT432k, messages }),
|
||||
sliceText: (data) => openAiSliceTextByToken({ model: OpenAiChatEnum.GPT35, ...data })
|
||||
},
|
||||
[ClaudeEnum.Claude]: {
|
||||
countTokens: () => 0,
|
||||
sliceText: ClaudeSliceTextByToken
|
||||
}
|
||||
};
|
||||
|
||||
export const sliceTextByToken = ({
|
||||
model = 'gpt-3.5-turbo',
|
||||
text,
|
||||
length
|
||||
}: {
|
||||
model: ChatModelType;
|
||||
text: string;
|
||||
length: number;
|
||||
}) => {
|
||||
const enc = getOpenAiEncMap()[model];
|
||||
const encodeText = enc.encode(text);
|
||||
const decoder = new TextDecoder();
|
||||
return decoder.decode(enc.decode(encodeText.slice(0, length)));
|
||||
};
|
||||
|
||||
@@ -2,7 +2,7 @@ import { encoding_for_model, type Tiktoken } from '@dqbd/tiktoken';
|
||||
import type { ChatItemSimpleType } from '@/types/chat';
|
||||
import { ChatRoleEnum } from '@/constants/chat';
|
||||
import { ChatCompletionRequestMessage, ChatCompletionRequestMessageRoleEnum } from 'openai';
|
||||
|
||||
import { OpenAiChatEnum } from '@/constants/model';
|
||||
import Graphemer from 'graphemer';
|
||||
|
||||
const textDecoder = new TextDecoder();
|
||||
@@ -52,7 +52,7 @@ export function countOpenAIToken({
|
||||
model
|
||||
}: {
|
||||
messages: ChatItemSimpleType[];
|
||||
model: 'gpt-3.5-turbo' | 'gpt-4' | 'gpt-4-32k';
|
||||
model: `${OpenAiChatEnum}`;
|
||||
}) {
|
||||
function getChatGPTEncodingText(
|
||||
messages: { role: 'system' | 'user' | 'assistant'; content: string; name?: string }[],
|
||||
@@ -104,3 +104,18 @@ export function countOpenAIToken({
|
||||
|
||||
return text2TokensLen(getOpenAiEncMap()[model], getChatGPTEncodingText(adaptMessages, model));
|
||||
}
|
||||
|
||||
export const openAiSliceTextByToken = ({
|
||||
model = 'gpt-3.5-turbo',
|
||||
text,
|
||||
length
|
||||
}: {
|
||||
model: `${OpenAiChatEnum}`;
|
||||
text: string;
|
||||
length: number;
|
||||
}) => {
|
||||
const enc = getOpenAiEncMap()[model];
|
||||
const encodeText = enc.encode(text);
|
||||
const decoder = new TextDecoder();
|
||||
return decoder.decode(enc.decode(encodeText.slice(0, length)));
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user