1import{serve}from"https://deno.land/std@0.224.0/http/server.ts";
2import{OpenAI}from"https://deno.land/x/openai@v4.68.0/mod.ts";
3
4interfaceEmbedPayload{
5texts:string[];
6namespace?:string;
7metadata?:Record<string,unknown>;
8}
9
10constopenai=newOpenAI(Deno.env.get("OPENAI_API_KEY")!);
11constPINECONE_URL=Deno.env.get("PINECONE_INDEX_URL")!;
12constPINECONE_KEY=Deno.env.get("PINECONE_API_KEY")!;
13
14asyncfunctionembedAndStore(req:Request):Promise<Response>{
15const{texts,namespace,metadata}:EmbedPayload=awaitreq.json();
16
17constembedding=awaitopenai.embeddings.create({
18model:"text-embedding-3-small",
19input:texts,
20});
21
22constvectors=embedding.data.map((e,i)=>({
23id:`vec-${Date.now()}-${i}`,
24values:e.embedding,
25metadata:{...metadata,text:texts[i]},
26}));
27
28constres=awaitfetch(
29`${PINECONE_URL}/vectors/upsert`,
30{
31method:"POST",
32headers:{
33Authorization:`Bearer ${PINECONE_KEY}`,
34"Content-Type":"application/json",
35},
36body:JSON.stringify({vectors,namespace}),
37}
38);
39
40returnnewResponse(JSON.stringify({upserted:vectors.length}),{
41headers:{"content-type":"application/json"},
42});
43}
44
45serve(embedAndStore,{port:8080});