首页 > 其他分享 >bolt.new本地化运行踩坑

bolt.new本地化运行踩坑

时间:2024-10-18 11:13:18浏览次数:1  
标签:const lib 本地化 app server bolt llm new import

接入OpenAI端点

安装依赖pnpm add @ai-sdk/openai

diff --git a/app/lib/.server/llm/model.ts b/app/lib/.server/llm/model.ts
index f0d695c..5217697 100644
--- a/app/lib/.server/llm/model.ts
+++ b/app/lib/.server/llm/model.ts
@@ -1,9 +1,34 @@
 import { createAnthropic } from '@ai-sdk/anthropic';
+import { createOpenAI } from '@ai-sdk/openai';
 
 export function getAnthropicModel(apiKey: string) {
   const anthropic = createAnthropic({
-    apiKey,
+    apiKey: 'sk-xxxx',
+    baseURL: 'https://api.openai-proxy.org/anthropic/v1'
   });
 
   return anthropic('claude-3-5-sonnet-20240620');
 }
+
+
+export function getOpenAIModel() {
+  // const openai = createOpenAI({
+  //   baseURL: 'https://api.openai-proxy.org/v1',
+  //   apiKey: 'sk-xxxx',
+  // });
+  // return openai('gpt-4o-2024-08-06');
+}
+
diff --git a/app/lib/.server/llm/stream-text.ts b/app/lib/.server/llm/stream-text.ts
index cf937fd..2619f89 100644
--- a/app/lib/.server/llm/stream-text.ts
+++ b/app/lib/.server/llm/stream-text.ts
@@ -1,6 +1,6 @@
 import { streamText as _streamText, convertToCoreMessages } from 'ai';
 import { getAPIKey } from '~/lib/.server/llm/api-key';
-import { getAnthropicModel } from '~/lib/.server/llm/model';
+import { getAnthropicModel, getOpenAIModel } from '~/lib/.server/llm/model';
 import { MAX_TOKENS } from './constants';
 import { getSystemPrompt } from './prompts';
 
@@ -23,11 +23,12 @@ export type StreamingOptions = Omit<Parameters<typeof _streamText>[0], 'model'>;
 
 export function streamText(messages: Messages, env: Env, options?: StreamingOptions) {
   return _streamText({
-    model: getAnthropicModel(getAPIKey(env)),
+    // model: getAnthropicModel(getAPIKey(env)),
+    model: getOpenAIModel(getAPIKey(env)),
     system: getSystemPrompt(),
     maxTokens: MAX_TOKENS,
     headers: {
-      'anthropic-beta': 'max-tokens-3-5-sonnet-2024-07-15',
+      // 'anthropic-beta': 'max-tokens-3-5-sonnet-2024-07-15',
     },
     messages: convertToCoreMessages(messages),
     ...options,

diff --git a/app/lib/.server/llm/constants.ts b/app/lib/.server/llm/constants.ts
index b24acdf..e8f6b1c 100644
--- a/app/lib/.server/llm/constants.ts
+++ b/app/lib/.server/llm/constants.ts
@@ -1,5 +1,6 @@
 // see https://docs.anthropic.com/en/docs/about-claude/models
-export const MAX_TOKENS = 8192;
+export const MAX_TOKENS = 4000;
+// export const MAX_TOKENS = 8192;
 
 // limits the number of model responses that can be returned in a single request
 export const MAX_RESPONSE_SEGMENTS = 2;

修改ai模块node_modules/ai/dist/index.mjs,屏蔽报错

  get partialObjectStream() {
    return createAsyncIterableStream(this.originalStream, {
      transform(chunk, controller) {
        switch (chunk.type) {
          case "object":
            controller.enqueue(chunk.object);
            break;
          case "text-delta":
          case "finish":
            break;
          case "error":
            controller.error(chunk.error);
            break;
          default: {
            const _exhaustiveCheck = chunk;
--          throw new Error(`Unsupported chunk type: ${_exhaustiveCheck}`);
++          // throw new Error(`Unsupported chunk type: ${_exhaustiveCheck}`);
          }
        }
      }
    });

增加下载文件功能

先安装两个依赖pnpm add jszip file-saver

diff --git a/app/components/workbench/Workbench.client.tsx b/app/components/workbench/Workbench.client.tsx
index b8142a6..07cb2ab 100644
--- a/app/components/workbench/Workbench.client.tsx
+++ b/app/components/workbench/Workbench.client.tsx
@@ -3,6 +3,8 @@ import { motion, type HTMLMotionProps, type Variants } from 'framer-motion';
 import { computed } from 'nanostores';
 import { memo, useCallback, useEffect } from 'react';
 import { toast } from 'react-toastify';
+import JSZip from 'jszip';
+import FileSaver from 'file-saver';
 import {
   type OnChangeCallback as OnEditorChange,
   type OnScrollCallback as OnEditorScroll,
@@ -99,6 +101,23 @@ export const Workbench = memo(({ chatStarted, isStreaming }: WorkspaceProps) =>
     workbenchStore.resetCurrentDocument();
   }, []);
 
+  const downloadFiles = () => {
+    const files = workbenchStore.files.get();
+
+    const zip = new JSZip();
+
+    for (const [fsPath, dirent] of Object.entries(files)) {
+      if (dirent?.type === 'file') {
+        const filename = fsPath.replace('/home/project/', '');
+        zip.file(filename, dirent.content);
+      }
+    }
+
+    zip.generateAsync({ type: 'blob' }).then((content) => {
+      FileSaver.saveAs(content, 'download.zip');
+    });
+  };
+
   return (
     chatStarted && (
       <motion.div
@@ -140,6 +159,14 @@ export const Workbench = memo(({ chatStarted, isStreaming }: WorkspaceProps) =>
                     workbenchStore.showWorkbench.set(false);
                   }}
                 />
+                <IconButton
+                  icon="i-ph:download"
+                  className="-mr-1"
+                  size="xl"
+                  onClick={() => {
+                    downloadFiles();
+                  }}
+                />
               </div>
               <div className="relative flex-1 overflow-hidden">
                 <View

标签:const,lib,本地化,app,server,bolt,llm,new,import
From: https://www.cnblogs.com/mesopotamiaa/p/18473872

相关文章

  • C#图像处理与OCR:从验证码识别到文本提取 Tesseract实现验证码识别:本地化
    以下示例代码中,涉及到的知识点主要包括图像处理、验证码识别、Base64转换、图像预处理等。以下是详细的知识点梳理,以及相应的代码示例:1.图像加载与保存使用Image.FromFile加载本地图像,并使用Bitmap进行图像操作。Bitmap是图像处理的主要类,支持各种图像操作。代码......
  • Loading class `com.mysql.jdbc.Driver’. This is deprecated. The new driver class
    原文链接:Loadingclass`com.mysql.jdbc.Driver’.Thisisdeprecated.Thenewdriverclassis`com.mysql.cj.jdbc.Driver’.–每天进步一点点(longkui.site)某日构建springboot项目时,报的错:Loadingclass`com.mysql.jdbc.Driver'.Thisisdeprecated.Thenewdriver......
  • NewStar2024-week2-Crypto
    Crypto茶里茶气fromCrypto.Util.numberimport*flag="flag{*****}"assertlen(flag)==25a=""foriinflag:a+=hex(ord(i))[2:]l=int(a,16).bit_length()print("l=",l)v0=int(a,16)>>(l//2)v1=int(......
  • Educational Codeforces Round 170 (Rated for Div. 2) C. New Games
    题意转化找一些相邻的数(其中相邻定义为递增序下任意相邻两数差\(\leq1\))求相邻数中,不同数字有\(k\)种,取到数字个数的最大值算法容易想到按顺序排列观察到有点像滑动窗口,考虑用队列维护一个出现不同数字次数为\(k\)的区间,再计算代码来自转载地址voidsolv......
  • JNI(Java Native Interface)和NIO(New Input/Output)是什么?
    1.JNI(JavaNativeInterface)JNI是一种接口,允许Java代码与其他编程语言(例如C或C++)编写的本地代码进行交互。通过JNI,Java程序可以调用本地代码中的函数或库,反过来,本地代码也可以访问Java的对象和方法。JNI通常在以下场景中使用:系统级别操作:有时Java无法直接访问操作系统的......
  • Boost Data Visualization with a New Gauge Control
    BoostDataVisualizationwithaNewGaugeControlCodejockToolkitPro24.0.0helpsusersexperiencemodern,customizablegaugesthatbringdatatolife,inasingle,versatilecomponent.CodejockToolkitProisacomprehensivesuiteofUIcomp......
  • CF908D-New Year and Arbitrary Arrangement
    CF908D-NewYearandArbitraryArrangement前言不是这题为啥星\(2200\)啊,感觉做的很多\(3000\)左右的题都比这道题水吧。简化题意给定空字符串,每次在串尾加入\(a\)或\(b\),各有一定概率。若其中有\(\gek\)个\(ab\)子序列,则停止加入。问至加入结束时,含有\(a......
  • NewStar CTF[pwn] overwrite WriteUp
    IDA打开,查看func()函数,得到以下代码点击查看代码unsigned__int64func(){size_tinput1[6];//[rsp+Ch][rbp-84h]BYREFcharnptr[72];//[rsp+40h][rbp-50h]BYREFunsigned__int64v3;//[rsp+88h][rbp-8h]v3=__readfsqword(0x28u);printf("plsin......
  • python __new__和__init__的区别
    简介__new__和__init__都是Python中的特殊方法,它们在对象生命周期中起到不同的作用。用法1、__new__方法:__new__是一个静态方法,用于创建一个新的对象实例。当你调用一个类时,__new__方法是第一个被调用的方法。它的主要任务是分配内存空间,并返回一个新创建的对象实例。通常情况......
  • Newtec MDM2510 REST API
    NewtecMDM2510RESTAPI SatOct1214:37:112024<--L10SatOct1214:37:112024<--A15SatOct1214:37:112024<--W15SatOct1214:37:112024<--S172.0000000.0000000.000000SatOct1214:37:112024......