🤖 Webman AI接入DeepSeek教程

walkor

最近DeepSeek超级火爆,很多开发者问起Webman Ai如何接入DeepSeek,今天图文教程来了,非常简单,只需要三步即可。

  • 进入管理后台 http://example.com/app/admin

  • AI模型里添加如图模型

截图

名称:DeepSeek
类型:deepseek
模型处理器:plugin\ai\app\handler\Gpt(默认值)
支持的模型:

deepseek-chat
deepseek-reasoner

api:https://api.deepseek.com

apikey:sk-xxxx apikey获取地址

  • 配置对外的模型列表
    截图
    "deepseek-chat": "deepseek-chat",
    "deepseek-reasoner": "deepseek-reasoner"
  • 新增角色
    截图
    截图

  • 前端访问
    截图

511 6 2
6个回答

miraclesev

支持大佬

  • sora 5天前

    您好,我这边调用本地搭建的DeepSeek模型,流式输出的时候,返回的数据带0就会返回一个空数据,比如我提问100以内素数之和,回答中没有0,求大佬解答

  • walkor 5天前

    截个图吧,什么样的提问,哪里输出了空数据

sora


下面是Driver下的文件

<?php

namespace plugin\ai\app\handler\driver;

use Exception;
use support\exception\BusinessException;
use Workerman\Http\Client;
use Workerman\Http\Response;

class DeepSeek extends Base
{
    /**
     * @var string api地址
     */
    protected $api = 'http://127.0.0.1:11434/';

    /**
     * @var float
     */
    protected $version = '2023-06-01';

    /**
     * @param $options
     */
    public function __construct($options)
    {
        parent::__construct($options);
        $this->api = $options['api'] ?? $this->api;
    }

    /**
     * @desc completions
     * @param array $data
     * @param array $options
     */
    public function completions(array $data, array $options)
    {
        $headers = $this->getHeaders($options);

        // $this->api.= '/api/generate';

//        $headers['x-api-key'] = $this->apikey;
//        $headers['anthropic-version'] = $this->version;

$data['stream'] = false;
$data['prompt'] = end($data['messages'])['content'];
        // if (isset($options['stream'])) {
        //     $data['stream'] = true;
        // }
        // if ($data['stream'] ?? false) {
        //     $headers['Accept'] = 'text/event-stream';
        // }

        $options = $this->formatOptions($options);
// var_dump($data);
//         $data = static::formatData($data);
// var_dump($data);
        $requestOptions = [
            'method' => 'POST',
            'data' => json_encode($data),
            'headers' => $headers,
            'progress' => function ($buffer) use ($options) {
                $message = static::formatResponse((string)$buffer);
                if($message['response']){
                    $data = [
                        'content' => $message['response']
                    ];
                }else{
                        $data = [];
                    // if(!$message['done']){
                    //     $data = [
                    //         'error' => [
                    //             'code' => 500,
                    //             'message' => '网络链接错误,请稍后重试!',
                    //             'detail' => json_decode($buffer, true)
                    //         ],
                    //     ];
                    // }else{
                    //     $data = [];
                    // }
                }

                $options['stream']($data);
            },
            'success' => function (Response $response) use ($options) {
                $options['complete'](static::formatResponse((string)$response->getBody()), $response);
            },
            'error' => function ($exception) use ($options) {
                $options['complete']([
                    'error' => [
                        'code' => 'exception',
                        'message' => $exception->getMessage(),
                        'detail' => (string) $exception
                    ],
                ], new Response(0));
            }
        ];
        $http = new Client(['timeout' => 600]);
        $http->request($this->api, $requestOptions);
    }

    /**
     * 格式化消息
     * @param array $data
     * @return array
     */
    protected static function formatData(array $data)
    {
        $model = $data['model'] ?? '';
        $temperature = $data['temperature'] ?? null;
        $maxTokens = $data['max_tokens']??1024;
        $messages = static::formatMessages($data['messages']);
        $data = [
            'model'             => $model,
            'messages'          => $messages,
            'max_tokens'        => $maxTokens,
            'stop_sequences'    => array("\n\nHuman:")
        ];
        if ($temperature !== null) {
            $data['temperature'] = $temperature;
        }
        return $data;
    }

    public static function formatResponse($buffer)
    {
        $json = json_decode($buffer, true);
        if ($json) {
            return $json;
        }
    }
}
  • sora 5天前

    使用非流式返回的时候不会出现这个问题

你这里写的可能有问题,

if($message['response'])

改成

if($message['response'] || $message['response']==='0')
  • sora 5天前

    好的!感谢老大!犯了个低级的错误(面壁思过)

  • walkor 5天前

    不客气,你们本地部署的具体哪个模型?用的服务器配置是怎样的?
    我想本地部署试下,不知道需要什么配置。

  • sora 5天前

    本地是用的ollama,两个4070tisuper16g 可以跑32b和32b以下的,70b就很慢,一个字一个字往外蹦的那种(还是显存太小了)70b预计是需要至少32g以上的显存。
    部署deepseek主要是吃显存,见过有大佬用魔改的多个2080ti22g部署,这个没有尝试过,不知道可不可行
    https://www.bilibili.com/opus/1028826816959217669

  • walkor 5天前

    好的,非常感谢

  • sora 5天前

    openwebui 这个是ollama的可视化界面

  • sora 5天前

    显存配置基本可以参考一下ollama上面的r1模型对应的大小,例如70b是40G左右,就是大概需要40g显存
    32b是20G左右
    大体可以这样推算

sora

附一张图参考

  • 暂无评论
ascuge

大佬,支持思考过程好像需要改一下代码是不?

小吴大大

借楼问下,我用得腾讯云提供的 deepseek 接口,然后如果需要让webman ai的deepseek模型支持解读 pdf word 图片啥的文档上传,我需要一一去实现什么?

  • 暂无评论
×
🔝