<?php
namespace Module\AigcBase\Admin\Controller;
use Illuminate\Routing\Controller;
use ModStart\Core\Exception\BizException;
use ModStart\Core\Input\InputPackage;
use ModStart\Core\Input\Response;
use ModStart\Core\Util\LogUtil;
use ModStart\Core\Util\RandomUtil;
use ModStart\Core\Util\SerializeUtil;
use ModStart\Core\Util\SessionUtil;
use Module\AigcBase\Provider\AigcChatProvider;
class AigcChatController extends Controller
{
public static $PermitMethodMap = [
'*' => '*',
];
public function index($type)
{
Response::textEventStreamed(function ($sendCallback, $param = []) use ($type) {
$input = InputPackage::buildFromInput();
$systemPrompt = $input->getTrimString('systemPrompt');
$prompt = $input->getTrimString('prompt');
$driver = null;
switch ($type) {
case 'ueditor':
$driver = modstart_config('AigcBase_AdminRichEditorDriver');
break;
}
try {
if (!$driver) {
BizException::throws('机器人没有配置,请在 后台→系统设置→AI平台对接→功能设置 中配置');
}
$provider = AigcChatProvider::getByFullName($driver);
if (empty($provider)) {
BizException::throws('机器人没有配置');
} else {
$option = [];
$option['systemPrompt'] = $systemPrompt;
$ret = $provider->chatStream(function ($payload, $param) use (&$sendCallback, &$send) {
call_user_func($sendCallback, $payload['type'], isset($payload['data']) ? $payload['data'] : null);
}, 'Admin_' . SessionUtil::id(), [
'type' => 'text',
'content' => $prompt,
], $option);
if (Response::isError($ret)) {
BizException::throws($ret['msg']);
}
}
LogUtil::info('AigcBase.admin.chat', $ret);
} catch (BizException $e) {
call_user_func($sendCallback, 'error', $e->getMessage());
}
});
}
public function quick()
{
$input = InputPackage::buildFromInput();
$prompt = $input->getTrimString('prompt');
$sessionId = $input->getTrimString('sessionId');
$driver = $input->getTrimString('driver');
if (empty($sessionId)) {
$sessionId = 'Admin_' . RandomUtil::string(16);
}
if (empty($driver)) {
$driver = modstart_config('AigcBase_AdminDefaultChatDriver');
}
if (!$driver) {
BizException::throws('机器人没有配置,请在 后台→系统设置→AI平台对接→功能设置 中配置');
}
$provider = AigcChatProvider::getByFullName($driver);
if (empty($provider)) {
BizException::throws('机器人没有配置');
}
$option = [
'markdown' => true,
];
$ret = $provider->chat($sessionId, [
'type' => 'text',
'content' => $prompt,
], $option);
if (Response::isError($ret)) {
BizException::throws($ret['msg']);
}
$content = isset($ret['data']['msg']['content'])
? $ret['data']['msg']['content']
: SerializeUtil::jsonEncode($ret['data']['msg']);
return Response::generateSuccessData([
'content' => $content,
]);
}
}