ChatGPT-Next-Web icon indicating copy to clipboard operation
ChatGPT-Next-Web copied to clipboard

[Feature] 添加对 Azure OpenAI API 的支持

Open edisonzf2020 opened this issue 1 year ago • 47 comments

edisonzf2020 avatar Apr 02 '23 14:04 edisonzf2020

修改BASE_URL成微软的endpoint,API key修改成微软的key,不能工作。微软还需要设置其他参数。

edisonzf2020 avatar Apr 02 '23 14:04 edisonzf2020

azure openai proxy的项目可以搜一下,这个满足你的需求

tiny656 avatar Apr 02 '23 15:04 tiny656

#258

ripenedcat avatar Apr 03 '23 00:04 ripenedcat

azure openai proxy的项目可以搜一下,这个满足你的需求

感谢思路,使用的https://github.com/diemus/azure-openai-proxy/blob/main/README.zh-cn.md, 将本项目base url替换成docker server url, https改为http后,成功!

ripenedcat avatar Apr 03 '23 00:04 ripenedcat

@ripenedcat

感谢反馈,之后我会将此方式补充到 README。

Yidadaa avatar Apr 03 '23 06:04 Yidadaa

azure openai proxy的项目可以搜一下,这个满足你的需求

感谢思路,使用的https://github.com/diemus/azure-openai-proxy/blob/main/README.zh-cn.md, 将本项目base url替换成docker server url, https改为http后,成功!

这个项目也不错 https://github.com/stulzq/azure-openai-proxy

cl1107 avatar Apr 04 '23 12:04 cl1107

怎么搞定的?我用了这个azure-openai-proxy项目搭了个proxy,用代码调用已经成功了,但是用chatgpt next web会出错 error code 1003,感觉好像stream方式 azure API不支持?

doherty88 avatar Apr 05 '23 09:04 doherty88

怎么搞定的?我用了这个azure-openai-proxy项目搭了个proxy,用代码调用已经成功了,但是用chatgpt next web会出错 error code 1003,感觉好像stream方式 azure API不支持?

看一下chatgpt next web选的model是不是在azure-openai-proxy的环境变量里? 以及common.ts里是否改成了http模式(如果你没有https反代的话)? 具体在看下azure-openai-proxy的log里是否有什么线索呢

ripenedcat avatar Apr 05 '23 09:04 ripenedcat

@Yidadaa

如果用户没有服务器可以 通过 cloudflare worker

https://github.com/haibbo/cf-openai-azure-proxy

haibbo avatar Apr 05 '23 16:04 haibbo

怎么搞定的?我用了这个azure-openai-proxy项目搭了个proxy,用代码调用已经成功了,但是用chatgpt next web会出错 error code 1003,感觉好像stream方式 azure API不支持?

@doherty88 是我开发的这个吗?https://github.com/diemus/azure-openai-proxy

有问题可以在issue里提供复现场景,有些web项目会调用一些特殊的接口,比如获取model列表,资金余额之类的,Azure是没有的,近期会补上一个mock接口来模拟这类请求的返回。如果是这个问题,临时的解决方案是换一个前端项目,有些项目不会去调类似的接口。另外stream是支持的。

diemus avatar Apr 06 '23 02:04 diemus

怎么搞定的?我用了这个azure-openai-proxy项目搭了个proxy,用代码调用已经成功了,但是用chatgpt next web会出错 error code 1003,感觉好像stream方式 azure API不支持?

我也发现了同样的问题, 用的是cloudflare worker. 问题好像也是和stream有关, 回复的message会keep loading,然后说 “出错了,稍后重试吧”

lzhgus avatar Apr 06 '23 19:04 lzhgus

是的,我是用的这个。 现在我用了railway来部署ChatGPT-Next-Web,同样的proxy docker,同样的环境变量设置就可以用了。

doherty88 avatar Apr 07 '23 00:04 doherty88

是的,我是用的这个。 现在我用了railway来部署ChatGPT-Next-Web,同样的proxy docker,同样的环境变量设置就可以用了。

谢谢, 用railway, 我这儿还是有问题。。

{ "cause": { "errno": -3008, "code": "ENOTFOUND", "syscall": "getaddrinfo", "hostname": "https" } }

lzhgus avatar Apr 07 '23 02:04 lzhgus

PROTOCOL 这个环境变量设了吗?我的azure代理是http模式,所以我这这个环境变量设成 “http”

doherty88 avatar Apr 07 '23 04:04 doherty88

是的,我是用的这个。 现在我用了railway来部署ChatGPT-Next-Web,同样的proxy docker,同样的环境变量设置就可以用了。

谢谢, 用railway, 我这儿还是有问题。。

{ "cause": { "errno": -3008, "code": "ENOTFOUND", "syscall": "getaddrinfo", "hostname": "https" } }

@lzhgus

  • 你在填写base url的时候只需要包含域名,不要带协议头https://
  • 我测试下来https是工作的,stream也是支持的,如果你想全部部署在Azure上的话,可以直接用 Azure Container App 去部署 Azure OpenAI proxyChatGPT-Next-Web
  • 这个方案前200万次请求是免费的 https://learn.microsoft.com/en-us/azure/container-apps/billing#consumption-plan
  • 有个技巧是,你可以把container的最小instance调整到0,这意味着,只有请求过来以后才会起一个container,一段时间不用会自动scale到0,完全不收费。不过这种方式的缺点是,第一次请求的响应会有点慢。

Jer-y avatar Apr 07 '23 06:04 Jer-y

是的,我是用的这个。 现在我用了railway来部署ChatGPT-Next-Web,同样的proxy docker,同样的环境变量设置就可以用了。

谢谢, 用railway, 我这儿还是有问题。。 { "cause": { "errno": -3008, "code": "ENOTFOUND", "syscall": "getaddrinfo", "hostname": "https" } }

@lzhgus

  • 你在填写base url的时候只需要包含域名,不要带协议头https://
  • 我测试下来https是工作的,stream也是支持的,如果你想全部部署在Azure山的话,可以直接用Azure Container App去部署Azure OpenAI proxyChatGPT-Next-Web
  • 这个方案前200万次请求是免费的 https://learn.microsoft.com/en-us/azure/container-apps/billing#consumption-plan
  • 有个技巧是,你可以把container的最小instance调整到0,这意味着,只有请求过来以后才会起一个container,一段时间不用会自动scale到0,完全不收费。不过这种方式的缺点是,第一次请求的响应会有点慢。

感谢回复, 我觉得base url应该是问题,现在已经工作了。 对的, 我也是全部部署在Azure 上的, 用的是Container App。 有一个问题不知道大家是否注意到, 可能是因为Proxy, client side的behavior 改变了, 现在不会像之前一样逐字输出, 而是会略显卡顿的输出或者是一次性显示全部。

lzhgus avatar Apr 07 '23 06:04 lzhgus

@lzhgus

  • 你在填写base url的时候只需要包含域名,不要带协议头https://
  • 我测试下来https是工作的,stream也是支持的,如果你想全部部署在Azure山的话,可以直接用Azure Container App去部署Azure OpenAI proxyChatGPT-Next-Web
  • 这个方案前200万次请求是免费的 https://learn.microsoft.com/en-us/azure/container-apps/billing#consumption-plan
  • 有个技巧是,你可以把container的最小instance调整到0,这意味着,只有请求过来以后才会起一个container,一段时间不用会自动scale到0,完全不收费。不过这种方式的缺点是,第一次请求的响应会有点慢。

感谢回复, 我觉得base url应该是问题,现在已经工作了。 对的, 我也是全部部署在Azure 上的, 用的是Container App。 有一个问题不知道大家是否注意到, 可能是因为Proxy, client side的behavior 改变了, 现在不会像之前一样逐字输出, 而是会略显卡顿的输出或者是一次性显示全部。

我没猜错的话,这个应该是Azure Container App的问题,默认的Container APP用的ingress proxy开启了buffer造成了打字机效果被影响。因为不影响我的使用我倒是没有去深究。如果你想有打字机效果的话还是用其他手段(Azure VM, AKS, etc)自行部署最合适

Jer-y avatar Apr 07 '23 07:04 Jer-y

未必是代理的问题,azure直连也缺少打字机效果,之前测试过,感觉不用太纠结这个问题

diemus avatar Apr 07 '23 07:04 diemus

你是说PlayGround嘛。哈哈哈哈他们都没加打字机效果的实现,另外就是代码输出都没调试过,把markdown原始内容都返回来了,我已经给开发组开了issue了,不过估计他们暂时不会修。另外我倒是同意,不用太纠结这个问题。又不是不能用.jpg

Jer-y avatar Apr 07 '23 07:04 Jer-y

不是playground,就是直接请求azure openai,流式返回的时候,azure不是按字返回的,而是一次返回一大段,然后又是一段。感觉在azure那一层就已经不是打字机效果了

diemus avatar Apr 07 '23 07:04 diemus

那么你的判断肯定就没错了,我下周一开个feature的work item给他们,不过,这种功能估计优先级不高,可能会拖。

Jer-y avatar Apr 07 '23 08:04 Jer-y

我相信playground 应该也用了ReadableStream 去处理流式返回和实现打字机效果, 我可以去codebase找找看确认下,不过相较于直接call openai, azure openai service 的 latency 更高, 但是download 时间却大幅变短, 可能因此打字机的效果变得怪异了。 不过确实这也不影响使用 :)

image image

lzhgus avatar Apr 07 '23 17:04 lzhgus

大家可以试试这个, 它实现了打印机效果

https://github.com/haibbo/cf-openai-azure-proxy

原理就是, 从Azure OpenAI Service拿到的消息虽然是一段一段的, 但给客户端的时候我拆出一条条的消息, 依次给.

haibbo avatar Apr 08 '23 03:04 haibbo

大家可以试试这个, 它实现了打印机效果

https://github.com/haibbo/cf-openai-azure-proxy

原理就是, 从Azure OpenAI Service拿到的消息虽然是一段一段的, 但给客户端的时候我拆出一条条的消息, 依次给.

cf-openai-azure-proxy这个项目太赞了,谢谢~~~

yinm0591 avatar Apr 09 '23 08:04 yinm0591

@haibbo 感谢分享!星星已送出 @lzhgus 说的是是对的。我周末测了一下并和OpenAI做了比较,Azure的流式返回是一段一段地吐,虽然实际返回速度比原生的要好,但是视觉感官有点顿顿的。另外很奇怪的点是中文/日文/韩文等响应的latency比英文要高很多,这一点很费解。美国那边的PM说用的和OpenAI是同样的方案。我可以体会到追这种问题要多久。anyway,有需求的暂时就前台处理吧

Jer-y avatar Apr 11 '23 12:04 Jer-y

https://github.com/hbsgithub/deno-azure-openai-proxy 基于@haibbo 的卓越工作,我增加了mapper的功能,并改写成ts脚本部署在deno deploy上,特性如下:

  1. 相比于cloudflare workers,可以无需代理,直连使用
  2. 支持自定义二级域名(*.deno.dev)或者绑定自己的域名
  3. 支持打字机模式的流式响应
  4. 支持mapper,可以自定义模型映射规则,也支持直接透传模型名
  5. 无需服务器,免费在线部署,每月10万次请求额度

欢迎大家使用!

hbsgithub avatar Apr 12 '23 05:04 hbsgithub

@edisonzf2020 至少改四处才可以应用Azure openai API.

  1. BASE_URL 替换成Azure的,例如:[你的SourceName].openai.azure.com/openai/deployments
  2. headers不是用Authorization: `Bearer ${apiKey}`,,而是用"api-key": `${apiKey}`,
  3. "v1/chat/completions"替换成你在Azure Deploy的chat/completions的Path, 例如:[你的DeploymentId]/chat/completions?api-version=2023-03-15-preview
  4. chat-stream\route.ts里其中一段代码:
          try {
            const json = JSON.parse(data);
            const text = json.choices[0].delta.content;
            const queue = encoder.encode(text);
            controller.enqueue(queue);
          } catch (e) {
            controller.error(e);
          }

替换为:

          try {
            const json = JSON.parse(data);
            const text = json.choices[0].delta.content;
            if (text) {
              // console.debug(text);
              const queue = encoder.encode(text);
              controller.enqueue(queue);
            } else {
              // console.log({ json });
              const stop = json.choices[0].finish_reason;
              if (stop === "stop") {
                controller.close();
                return;
              }
            }
          } catch (e) {
            controller.error(e);
          }

DinoFeng avatar Apr 12 '23 06:04 DinoFeng

我用stulzq/azure-openai-proxy 就可以把azure的API转成openAI的API给chatgpt-web用, 如下:

version: "3"
services:
  chatgpt-web:
    image: chenzhaoyu94/chatgpt-web:{{ web_version }}
    ports:
      - "{{ http_port }}:3002"
    environment:
      OPENAI_API_KEY: {{ chatgpt_openai_api_key }}
      OPENAI_API_BASE_URL: http://azure-openai-proxy:8080
      AUTH_SECRET_KEY: "" # Leave blank
      MAX_REQUEST_PER_HOUR: 1000
      TIMEOUT_MS: 60000
    depends_on:
      - azure-openai-proxy
    links:
      - azure-openai-proxy
    networks:
      - chatgpt-ns

  azure-openai-proxy:
    image: stulzq/azure-openai-proxy:{{ proxy_version }}
    ports:
      - "{{ proxy_port }}:8080"
    environment:
      AZURE_OPENAI_ENDPOINT: {{ chatgpt_openai_endpoint }}
      AZURE_OPENAI_MODEL_MAPPER: {{ chatgpt_azure_openai_model_mapper }}
      AZURE_OPENAI_API_VER: {{ chatgpt_azure_openai_api_ver }}
    networks:
      - chatgpt-ns

networks:
  chatgpt-ns:
    driver: bridge

duchenpaul avatar Apr 23 '23 09:04 duchenpaul

我不是web开发者,不过还是非常希望能够加入对于azure openai的原生支持,主要是这个UI相较其他UI很舒服也很实用。根据这个文件(https://github.com/mckaywrigley/chatbot-ui/blob/main/README.md ),应该只需要加入这几个环境变量就可以。我可以提供一个测试环境。

Environment Variable Default value Description
OPENAI_API_KEY The default API key used for authentication with OpenAI
OPENAI_API_HOST https://api.openai.com The base url, for Azure use https://<endpoint>.openai.azure.com
OPENAI_API_TYPE openai The API type, options are openai or azure
OPENAI_API_VERSION 2023-03-15-preview Only applicable for Azure OpenAI
AZURE_DEPLOYMENT_ID Needed when Azure OpenAI, Ref Azure OpenAI API
OPENAI_ORGANIZATION Your OpenAI organization ID
DEFAULT_MODEL gpt-3.5-turbo The default model to use on new conversations, for Azure use gpt-35-turbo

xiaoyongzhu avatar Apr 23 '23 19:04 xiaoyongzhu

To the users who are seeking a right way of using Azure Open AI proxy in this project:

After building your own Azure Open AI proxy service, you can use below commands to startup the ChatGPT-Next-Web docker container.

  1. If the service is accessible with an URL
docker run -d -p 3000:3000 \
   -e OPENAI_API_KEY="<Your Azure OpenAI API key here>" \
   -e CODE="<your own password>" \
   -e BASE_URL="gpt-proxy.contoso.com" \
   yidadaa/chatgpt-next-web

  1. If the service is accessible locally
# The proxy service available on 0.0.0.0:8080, proxy service and ChatGPT-Next-Web are on same machine.
docker run -d -p 3000:3000 \
   -e OPENAI_API_KEY="<Your Azure OpenAI API key here>" \
   -e CODE="<your own password>" \
   --net=host \
   -e BASE_URL="0.0.0.0:8080" \
   yidadaa/chatgpt-next-web

The configurations are defined in the project but not mentioned in the readme. Appreciate if someone can enrich the doc and list all environment variables there.

luckyBricks avatar Apr 24 '23 15:04 luckyBricks