mirror of
https://github.com/labring/FastGPT.git
synced 2025-07-24 13:53:50 +00:00

* 4.7-alpha3 (#62) * doc * Optimize possible null Pointers and parts of Ux * fix: mulity index training error * feat: doc and rename question guide * fix ios speech input (#59) * fix: prompt editor variables nowrap (#61) * change openapi import in http module with curl import (#60) * chore(ui): dataset import modal ui (#58) * chore(ui): dataset import modal ui * use component * fix height * 4.7 (#63) * fix: claude3 image type verification failed (#1038) (#1040) * perf: curl import modal * doc img * perf: adapt cohere rerank * perf: code * perf: input style * doc --------- Co-authored-by: xiaotian <dimsky@163.com> * fix: ts * docker deploy * perf: prompt call * doc * ts * finish ui * perf: outlink detail ux * perf: user schema * fix: plugin update * feat: get current time plugin * fix: ts * perf: fetch anamation * perf: mark ux * doc * perf: select app ux * fix: split text custom string conflict * peref: inform readed * doc * memo flow component * perf: version * faq * feat: flow max runtimes * feat: similarity tip * feat: auto detect file encoding * Supports asymmetric vector model * fix: ts * perf: max w * move code * perf: hide whisper * fix: ts * feat: system msg modal * perf: catch error * perf: inform tip * fix: inform --------- Co-authored-by: heheer <71265218+newfish-cmyk@users.noreply.github.com> Co-authored-by: xiaotian <dimsky@163.com>
71 lines
1.9 KiB
TypeScript
71 lines
1.9 KiB
TypeScript
import { VectorModelItemType } from '@fastgpt/global/core/ai/model.d';
|
|
import { getAIApi } from '../config';
|
|
import { countPromptTokens } from '@fastgpt/global/common/string/tiktoken';
|
|
import { EmbeddingTypeEnm } from '@fastgpt/global/core/ai/constants';
|
|
|
|
type GetVectorProps = {
|
|
model: VectorModelItemType;
|
|
input: string;
|
|
type?: `${EmbeddingTypeEnm}`;
|
|
};
|
|
|
|
// text to vector
|
|
export async function getVectorsByText({ model, input, type }: GetVectorProps) {
|
|
if (!input) {
|
|
return Promise.reject({
|
|
code: 500,
|
|
message: 'input is empty'
|
|
});
|
|
}
|
|
|
|
try {
|
|
const ai = getAIApi();
|
|
|
|
// input text to vector
|
|
const result = await ai.embeddings
|
|
.create({
|
|
...model.defaultConfig,
|
|
...(type === EmbeddingTypeEnm.db && model.dbConfig),
|
|
...(type === EmbeddingTypeEnm.query && model.queryConfig),
|
|
model: model.model,
|
|
input: [input]
|
|
})
|
|
.then(async (res) => {
|
|
if (!res.data) {
|
|
return Promise.reject('Embedding API 404');
|
|
}
|
|
if (!res?.data?.[0]?.embedding) {
|
|
console.log(res);
|
|
// @ts-ignore
|
|
return Promise.reject(res.data?.err?.message || 'Embedding API Error');
|
|
}
|
|
|
|
return {
|
|
tokens: countPromptTokens(input),
|
|
vectors: await Promise.all(res.data.map((item) => unityDimensional(item.embedding)))
|
|
};
|
|
});
|
|
|
|
return result;
|
|
} catch (error) {
|
|
console.log(`Embedding Error`, error);
|
|
|
|
return Promise.reject(error);
|
|
}
|
|
}
|
|
|
|
function unityDimensional(vector: number[]) {
|
|
if (vector.length > 1536) {
|
|
console.log(
|
|
`The current vector dimension is ${vector.length}, and the vector dimension cannot exceed 1536. The first 1536 dimensions are automatically captured`
|
|
);
|
|
return vector.slice(0, 1536);
|
|
}
|
|
let resultVector = vector;
|
|
const vectorLen = vector.length;
|
|
|
|
const zeroVector = new Array(1536 - vectorLen).fill(0);
|
|
|
|
return resultVector.concat(zeroVector);
|
|
}
|