OpenAI 围绕 ChatGPT 的 React Native 包装器,可将其与您的应用程序无缝集成。它处理身份验证、流式响应并跟踪对话。一切都不需要服务器。
ChatGptProvider
useChatGpt
conversationId
和messageId
来保持对话继续进行这不是官方 ChatGPT 库。这是为了让 ChatGPT 与 React Native 应用程序的集成变得更容易。因此,请将其视为实验性的,并在生产中谨慎使用。
?运行小吃示例应用程序以查看其运行情况。该示例的源代码位于 /example 文件夹下。
npm install react-native-chatgpt
您还需要安装react-native-webview
和expo-secure-store
npx expo install react-native-webview expo-secure-store
不需要额外的步骤。
您还需要安装react-native-webview
、 react-native-vector-icons
和expo-secure-store
npm install react-native-webview react-native-vector-icons expo-secure-store
安装完成后,您还应该按照一些附加说明来设置库:
该库导出一个提供程序组件和一个钩子作为其主要 API。
ChatGptProvider
提供程序组件应放置在 React Native 应用程序的根目录下,如下例所示:
import { ChatGptProvider } from 'react-native-chatgpt' ;
import App from './App' ;
const Root = ( ) => {
return (
< ChatGptProvider >
< App / >
< / ChatGptProvider >
) ;
} ;
以下ChatGptProvider
属性允许您自定义处理 ChatGPT 身份验证的模式的外观以及聊天机器人请求的超时。
姓名 | 必需的 | 类型 | 描述 |
---|---|---|---|
children | 是的 | React.Node | 您的应用程序组件树 |
containerStyles | 不 | StyleProp<ViewStyle> | 应用于 webview 容器的额外样式 |
backdropStyles | 不 | StyleProp<ViewStyle> | 应用于背景视图的额外样式。默认情况下它使用半透明背景颜色rgba(0, 0, 0, 0.5) |
renderCustomCloseIcon | 不 | (closeModal: () => void) => React.Node | 一个自定义的关闭按钮渲染器放置在 webview 的顶部。默认情况下,它在右上角呈现一个黑色十字 (X)。不要忘记将作为参数提供的closeModal 函数与onPress 事件连接起来 |
requestTimeout | 不 | number | 在取消正常请求之前您愿意等待的最长时间(以毫秒为单位),默认为 30000 毫秒 |
streamedRequestTimeout | 不 | number | 在取消基于流的请求之前您愿意等待的最长时间(以毫秒为单位),默认为 15000 毫秒 |
useChatGpt
该钩子返回一个具有以下属性的对象:
status
status: 'initializing' | 'logged-out' | 'getting_auth_token' | 'authenticated' ;
initializing
:表示库正在启动。您不应该假设任何有关身份验证状态的信息,并等待该值更改为logged-out
或authenticated
。logged-out
反映您尚未经过身份验证或您的 ChatGPT 访问令牌已过期getting_auth_token
:登录模式关闭后持续几秒钟的短暂状态。它反映了该库正在后台获取 ChatGPT 身份验证令牌的事实。您可以使用此状态来呈现加载指示器。authenticated
:表示您已登录。只有在此状态下,您才能与聊天机器人交互。 ChatGPT 颁发的 JWT 令牌将在 7 天后过期,因此您大约每周必须重新进行一次身份验证。库将通过将状态从authenticated
更改为logged-out
来报告这一情况。
login
function login ( ) : void ;
执行时打开模式并触发 ChatGPT 身份验证流程的函数。
成功完成后, status
将从logged-out
变为getting_auth_token
(几秒钟),最后变为authenticated
sendMessage
这是该库的核心功能。它向聊天机器人发送消息并返回响应。根据传递的参数,它可以以两种不同的方式使用:
function sendMessage (
message : string ,
options ?: {
conversationId ?: string ;
messageId ?: string ;
}
) : Promise < {
message : string ;
messageId : string ;
conversationId : string ;
} > ;
它随响应返回一个承诺。这是最简单的使用方法,但处理响应的速度会比较慢,因为它需要等待完整的响应可用。
如果要跟踪对话,请使用响应对象中的conversationId
和messageId
,并将它们再次传递给sendMessage
。
如果服务器拒绝请求或超时,则会抛出ChatGptError
。
import React from 'react' ;
import { Button } from 'react-native' ;
import { useChatGpt , ChatGptError } from 'react-native-chatgpt' ;
const Example = ( ) => {
const { sendMessage } = useChatGpt ( ) ;
const handleSendMessage = async ( ) => {
try {
const { message , conversationId , messageId } = await sendMessage (
'Outline possible topics for an SEO article'
) ;
// After the user has read the response, send another message
const { message : followUp } = await sendMessage (
'Elaborate on the first suggestion' ,
{
conversationId ,
messageId ,
}
) ;
} catch ( error ) {
if ( error instanceof ChatGptError ) {
// Handle error accordingly
}
}
} ;
return < Button onPress = { handleSendMessage } title = "Send message" / > ;
} ;
function sendMessage ( args : {
message : string ;
options ?: {
conversationId ?: string ;
messageId ?: string ;
} ;
onAccumulatedResponse ?: ( response : {
message : string ;
messageId : string ;
conversationId : string ;
isDone ?: boolean ;
} ) => void ;
onError ?: ( err : ChatGptError ) => void ;
} ) : void ;
它接受一个回调函数,该函数将随着响应更新而不断调用。此版本对于需要在响应可用时立即显示响应的场景非常有用,类似于 ChatGPT API 在网络游乐场上的工作方式。
如果要跟踪对话,请使用响应对象中的conversationId
和messageId
,并将它们再次传递给sendMessage
。
检查响应对象中的isDone
属性以检测响应何时完成。
如果发生错误,则会使用ChatGptError
调用onError
回调。
import React , { useState } from 'react' ;
import { Button } from 'react-native' ;
import { useChatGpt , ChatGptError } from 'react-native-chatgpt' ;
const StreamExample = ( ) => {
const { sendMessage } = useChatGpt ( ) ;
const [ response , setResponse ] = useState ( '' ) ;
const handleSendMessage = ( ) => {
sendMessage ( {
message : 'Outline possible topics for an SEO article' ,
onAccumulatedResponse : ( { message , isDone } ) => {
setResponse ( message ) ;
if ( isDone ) {
// The response is complete, you can send another message
}
} ,
onError : ( e ) => {
// Handle error accordingly
} ,
} ) ;
} ;
return (
< View style = { { flex : 1 } } >
< Button onPress = { handleSendMessage } title = "Get streamed response" / >
< Text > { response } < / Text >
< / View >
) ;
} ;
请参阅贡献指南,了解如何为存储库和开发工作流程做出贡献。
麻省理工学院 © 劳尔·戈麦斯·阿库纳
如果您发现这个项目有趣,请考虑在 Twitter 上关注我