feat: claude function call

This commit is contained in:
Hk-Gosuto
2024-08-17 13:05:49 +00:00
parent 0a643dc71d
commit 8c5e92d66a
5 changed files with 119 additions and 80 deletions

View File

@@ -2,17 +2,23 @@ import { NextRequest, NextResponse } from "next/server";
import { AgentApi, RequestBody, ResponseBody } from "../agentapi";
import { auth } from "@/app/api/auth";
import { NodeJSTool } from "@/app/api/langchain-tools/nodejs_tools";
import { ModelProvider } from "@/app/constant";
import { ModelProvider, ServiceProvider } from "@/app/constant";
import { ChatOpenAI, OpenAIEmbeddings } from "@langchain/openai";
import { OllamaEmbeddings } from "@langchain/community/embeddings/ollama";
import { Embeddings } from "@langchain/core/embeddings";
import { BaseLanguageModel } from "@langchain/core/language_models/base";
async function handle(req: NextRequest) {
if (req.method === "OPTIONS") {
return NextResponse.json({ body: "OK" }, { status: 200 });
}
try {
const authResult = auth(req, ModelProvider.GPT);
const reqBody: RequestBody = await req.json();
const modelProvider =
reqBody.provider === ServiceProvider.Anthropic
? ModelProvider.Claude
: ModelProvider.GPT;
const authResult = auth(req, modelProvider);
if (authResult.error) {
return NextResponse.json(authResult, {
status: 401,
@@ -25,27 +31,17 @@ async function handle(req: NextRequest) {
const controller = new AbortController();
const agentApi = new AgentApi(encoder, transformStream, writer, controller);
const reqBody: RequestBody = await req.json();
const authToken = req.headers.get("Authorization") ?? "";
const authToken =
(req.headers.get("Authorization") || req.headers.get("x-api-key")) ?? "";
const token = authToken.trim().replaceAll("Bearer ", "").trim();
const apiKey = await agentApi.getOpenAIApiKey(token);
const baseUrl = await agentApi.getOpenAIBaseUrl(reqBody.baseUrl);
const apiKey = agentApi.getApiKey(token, reqBody.provider);
const baseUrl = agentApi.getBaseUrl(reqBody.baseUrl, reqBody.provider);
let model: BaseLanguageModel;
let embeddings: Embeddings | null;
model = agentApi.getToolBaseLanguageModel(reqBody, apiKey, baseUrl);
embeddings = agentApi.getToolEmbeddings(reqBody, apiKey, baseUrl);
const model = new ChatOpenAI(
{
temperature: 0,
modelName: reqBody.model,
openAIApiKey: apiKey,
},
{ basePath: baseUrl },
);
const embeddings = new OpenAIEmbeddings(
{
openAIApiKey: apiKey,
},
{ basePath: baseUrl },
);
let ragEmbeddings: Embeddings;
if (process.env.OLLAMA_BASE_URL) {
ragEmbeddings = new OllamaEmbeddings({
@@ -98,6 +94,7 @@ async function handle(req: NextRequest) {
export const GET = handle;
export const POST = handle;
export const maxDuration = 60;
export const runtime = "nodejs";
export const preferredRegion = [
"arn1",