首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >FastAPI开发AI应用二:多厂商模型使用指南

FastAPI开发AI应用二:多厂商模型使用指南

作者头像
wayn
发布于 2025-07-08 11:04:19
发布于 2025-07-08 11:04:19
16200
代码可运行
举报
文章被收录于专栏:wayn的程序开发wayn的程序开发
运行总次数:0
代码可运行

本文将深入讲解如何在 FastAPI AI 聊天应用中设计和实现多模型厂商架构,让你的应用能够灵活切换不同的 AI 提供商,提升系统的可靠性和成本效益。即使你是架构设计新手,也能跟着本教程掌握多厂商集成的核心技术。

📖 项目地址:https://github.com/wayn111/fastapi-ai-chat-demo 温馨提示:本文全文约一万字,看完约需 15 分钟。 上文链接:FastAPI开发AI应用一:实现连续多轮对话

项目概述

想象一下,你的 AI 聊天应用不再依赖单一的 AI 提供商,而是能够智能地在 OpenAI、DeepSeek、通义千问等多个厂商之间切换。当某个服务出现问题时,可以切换到备用提供商;当需要降低成本时,可以选择性价比更高的模型。这就是我们要构建的多模型厂商架构!

在本章节中,我们重构了前端界面,使其更加美观,参考 lobechat 界面风格。

核心功能

  • 多厂商统一管理:一套代码支持多个 AI 提供商,无需重复开发
  • 智能故障转移:主提供商不可用时自动切换到备用提供商
  • 成本优化策略:根据不同场景选择最经济的模型
  • 动态提供商发现:新增提供商无需修改核心代码
  • 统一接口设计:所有提供商使用相同的调用方式

技术栈

  • 核心框架:FastAPI(高性能异步 Web 框架)
  • AI 集成:OpenAI SDK(统一的 AI 接口标准)
  • 设计模式:工厂模式 + 抽象工厂模式
  • 配置管理:环境变量 + 动态配置
  • 数据存储Redis(会话和配置缓存)

🤖 支持的 AI 厂商

厂商

代表模型

特色

成本水平

OpenAI

GPT-4, GPT-3.5-turbo

综合能力强,生态完善

较高

DeepSeek

deepseek-chat, deepseek-coder

性价比高,推理能力强

通义千问

qwen-turbo, qwen-plus

中文理解优秀,阿里生态

中等

🏗️ 核心架构设计

🎯 设计理念

我们的多模型厂商架构基于三个核心设计原则:

1. 统一接口原则所有 AI 提供商都遵循相同的接口规范,就像不同品牌的手机都使用相同的充电接口一样。这样可以确保切换提供商时不需要修改业务代码。

2. 开放扩展原则新增 AI 提供商时,只需要继承基类并配置几个参数,系统会自动发现并集成新的提供商。

3. 故障隔离原则每个提供商都是独立的实例,一个提供商的故障不会影响其他提供商的正常工作。

🏛️ 架构层次

我们的架构分为四个清晰的层次,每一层都有明确的职责:

1. 抽象接口层(BaseAIProvider)

这是整个架构的"宪法",定义了所有 AI 提供商必须遵循的接口规范:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from abc import ABC, abstractmethod
from typing import List, Dict, Any, AsyncGenerator

class BaseAIProvider(ABC):
    """AI提供商抽象基类 - 定义统一接口规范"""

    def __init__(self, config: Dict[str, Any]):
        """初始化提供商配置"""
        self.config = config
        self.provider_name = self.__class__.__name__.replace('Provider', '').lower()

    @abstractmethod
    asyncdef generate_response(self, messages: List[AIMessage], **kwargs) -> AIResponse:
        """生成AI响应 - 所有提供商必须实现"""
        pass

    @abstractmethod
    asyncdef generate_streaming_response(self, messages: List[AIMessage], **kwargs) -> AsyncGenerator[str, None]:
        """生成流式响应 - 支持实时对话"""
        pass

    @abstractmethod
    def validate_config(self) -> bool:
        """验证配置有效性"""
        pass

为什么这样设计?

  • 强制规范:所有提供商都必须实现这些方法
  • 统一流式响应:所有厂商使用同一套流式响应
  • 安全性:每个厂商都需要验证配置有效性
2. 兼容适配层(OpenAICompatibleProvider)

这一层是我们架构的"译官",将 OpenAI 的接口标准适配给所有提供商:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class OpenAICompatibleProvider(BaseAIProvider):
    """OpenAI兼容提供商基类 - 统一OpenAI SDK调用方式"""

    # 子类需要重写的配置
    DEFAULT_BASE_URL = None
    DEFAULT_MODEL = None
    PROVIDER_NAME = None
    AVAILABLE_MODELS = []

    def __init__(self, config: Dict[str, Any]):
        """初始化OpenAI兼容客户端"""
        super().__init__(config)
        self.client = None
        self._initialize_client()

    def _initialize_client(self):
        """初始化OpenAI SDK客户端"""
        try:
            api_key = self.get_config_value('api_key')
            ifnot api_key:
                logger.error(f"{self.get_provider_display_name()}API密钥为空")
                return

            # 使用OpenAI SDK,但指向不同厂商的API端点
            self.client = OpenAI(
                api_key=api_key,
                base_url=self.get_config_value('base_url', self.DEFAULT_BASE_URL)
            )
            logger.info(f"{self.get_provider_display_name()}客户端初始化成功")
        except Exception as e:
            logger.error(f"客户端初始化失败: {e}")
            self.client = None

核心优势:

  • 代码复用:所有兼容 OpenAI 接口的厂商都可以复用这套代码
  • 维护简单:所有厂商共用一套 openai 的 api 接口调用逻辑
  • 标准统一:所有厂商都使用同一套流式响应,使用相同的消息格式和参数
3. 具体提供商实现层

这一层是各个 AI 厂商的"身份证",每个提供商只需要声明自己的基本信息,继承 OpenAICompatibleProvider 即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class DeepseekProvider(OpenAICompatibleProvider):
    """DeepSeek提供商实现 - 只需配置基本信息"""

    # 提供商配置 - 这就是全部需要的代码!
    DEFAULT_BASE_URL = 'https://api.deepseek.com/v1'
    DEFAULT_MODEL = 'deepseek-chat'
    PROVIDER_NAME = 'DeepSeek'
    AVAILABLE_MODELS = [
        'deepseek-chat',      # 通用对话模型
        'deepseek-coder',     # 代码专用模型
        'deepseek-math',      # 数学推理模型
        'deepseek-reasoner'   # 深度推理模型
    ]

实现原理:

  • 继承复用:继承 OpenAICompatibleProvider 获得所有通用功能
  • 配置驱动:只需要配置几个类变量就完成了集成
  • 自动发现:系统会自动扫描并注册这个提供商
4. 工厂管理层(AIProviderFactory)

这是整个架构的"大脑",负责动态发现、创建和管理所有提供商:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class AIProviderFactory:
    """AI提供商工厂 - 统一管理所有提供商"""

    # 提供商实例缓存
    _instances: Dict[str, BaseAIProvider] = {}
    # 动态发现的提供商类缓存
    _discovered_providers: Optional[Dict[str, Type[BaseAIProvider]]] = None

    @classmethod
    def _discover_providers(cls) -> Dict[str, Type[BaseAIProvider]]:
        """动态发现所有提供商类 - 这是魔法发生的地方"""
        if cls._discovered_providers isnotNone:
            return cls._discovered_providers

        providers = {}

        # 扫描 ai_providers 包中的所有模块
        import ai_providers
        package_path = ai_providers.__path__

        for importer, modname, ispkg in pkgutil.iter_modules(package_path):
            if modname.endswith('_provider') and modname != 'openai_compatible_provider':
                try:
                    # 动态导入模块
                    module = importlib.import_module(f'ai_providers.{modname}')

                    # 查找继承自OpenAICompatibleProvider的类
                    for name, obj in inspect.getmembers(module, inspect.isclass):
                        if (issubclass(obj, OpenAICompatibleProvider) and
                            obj != OpenAICompatibleProvider and
                            hasattr(obj, 'PROVIDER_NAME')):

                            provider_key = name.lower().replace('provider', '')
                            providers[provider_key] = obj
                            logger.debug(f"发现提供商: {provider_key} -> {name}")

                except Exception as e:
                    logger.warning(f"导入模块 {modname} 时出错: {e}")

        cls._discovered_providers = providers
        logger.info(f"动态发现 {len(providers)} 个提供商: {list(providers.keys())}")
        return providers

工厂模式的威力:

  • 动态发现:自动扫描并注册新的提供商,无需手动配置
  • 实例缓存:相同配置的提供商实例会被缓存,提高性能
  • 统一创建:所有提供商都通过工厂创建,确保一致性
🔄 多提供商管理器

在工厂的基础上,我们还提供了多提供商管理器,让你可以同时管理多个提供商:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MultiProviderManager:
    """多提供商管理器 - 统一管理多个AI提供商实例"""

    def __init__(self, configs: Dict[str, Dict[str, Any]]):
        """初始化多提供商管理器

        Args:
            configs: 多个提供商的配置,格式:{provider_name: config}
        """
        self.providers: Dict[str, BaseAIProvider] = {}
        self.default_provider = None

        # 初始化所有配置的提供商
        for provider_name, config in configs.items():
            try:
                provider = AIProviderFactory.create_provider(provider_name, config)
                if provider.validate_config():
                    self.providers[provider_name] = provider
                    logger.info(f"提供商 {provider_name} 初始化成功")

                    # 设置默认提供商
                    if self.default_provider isNone:
                        self.default_provider = provider_name
                else:
                    logger.warning(f"提供商 {provider_name} 配置验证失败")
            except Exception as e:
                logger.error(f"提供商 {provider_name} 初始化失败: {e}")

    def get_available_providers(self) -> List[str]:
        """获取所有可用的提供商列表"""
        return list(self.providers.keys())
🔧 环境变量配置

在项目根目录创建 .env 文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
REDIS_HOST="127.0.0.1"
REDIS_PORT=6379
REDIS_PASSWORD=""

# ===========================================
# AI 提供商配置(至少配置一个)
# ===========================================

# OpenAI 配置
OPENAI_API_KEY=sk-your-openai-api-key
OPENAI_BASE_URL=https://api.openai.com/v1  # 可选,默认官方地址
OPENAI_MODEL=gpt-4o  # 可选,默认模型

# DeepSeek 配置
DEEPSEEK_API_KEY=sk-your-deepseek-api-key
DEEPSEEK_MODEL=deepseek-chat  # 可选

# 通义千问配置
QIANWEN_API_KEY=sk-your-qianwen-api-key
QIANWEN_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1

# ===========================================
# 应用配置
# ===========================================
DEFAULT_AI_PROVIDER=deepseek  # 默认使用的提供商
MAX_TOKENS=1000               # 最大生成长度
TEMPERATURE=0.7              # 创造性参数
🏗️ 配置类设计

我们使用配置类来统一管理所有配置项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Config:
    """应用配置管理类"""

    # 应用基础配置
    APP_NAME = "FastAPI AI Chat Demo"
    # ...

    # 新增AI提供商基础信息
    _AI_PROVIDERS_INFO = {
        'openai': {
            'base_url': 'https://api.openai.com/v1',
            'model': 'gpt-4o'
        },
        'deepseek': {
            'base_url': 'https://api.deepseek.com/v1',
            'model': 'deepseek-chat'
        },
        'qianwen': {
            'base_url': 'https://dashscope.aliyuncs.com/compatible-mode/v1',
            'model': 'qwen-turbo'
        }
    }

    # AI提供商配置 - 动态生成
    @classmethod
    def _get_ai_providers_config(cls) -> dict:
        """获取所有AI提供商配置"""
        return {provider: cls._build_provider_config(provider) for provider in cls._AI_PROVIDERS_INFO.keys()}

    # 延迟初始化AI提供商配置
    @property
    def AI_PROVIDERS_CONFIG(self) -> dict:
        ifnot hasattr(self, '_ai_providers_config'):
            self._ai_providers_config = self._get_ai_providers_config()
        return self._ai_providers_config

    @classmethod
    def get_all_ai_configs(cls) -> dict:
        """获取所有已配置API Key的AI提供商配置"""
        configs = cls._get_ai_providers_config()
        return {name: config for name, config in configs.items() if config.get('api_key')}

在 Config 配置中新增 AI 提供商核心配置。

📡 核心 API 接口

1. 获取可用提供商列表
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.get("/providers")
asyncdef get_providers():
    """获取可用的AI提供商列表"""
    logger.info("获取AI提供商列表")
    try:
        configured_providers = Config.get_configured_providers()
        all_models = ai_manager.get_all_available_models()

        providers_info = []
        for provider in configured_providers:
            provider_obj = ai_manager.get_provider(provider)
            if provider_obj:
                providers_info.append({
                    "id": provider,
                    "name": provider_obj.get_provider_name(),
                    "models": provider_obj.get_available_models(),
                    "is_default": provider == Config.DEFAULT_AI_PROVIDER
                })

        return {
            "providers": providers_info,
            "default_provider": Config.DEFAULT_AI_PROVIDER,
            "all_models": all_models
        }
    except Exception as e:
        logger.error(f"获取AI提供商列表失败: {e}")
        raise HTTPException(status_code=, detail=f"获取提供商列表失败: {str(e)}")

/providers 接口会返回所有可用 AI 提供商,以及对应模型。

2. 流式聊天接口(支持提供商选择)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.get("/chat/stream")
asyncdef chat_stream(
    user_id: str = Query(..., description="用户ID"),
    session_id: str = Query(..., description="会话ID"),
    message: str = Query(..., description="用户消息"),
    role: str = Query("assistant", description="AI角色"),
    provider: Optional[str] = Query(None, description="AI提供商"),
    model: Optional[str] = Query(None, description="AI模型")
):
    """流式聊天接口"""
    logger.info(f"流式聊天请求 - 用户: {user_id}, 会话: {session_id[:]}..., 角色: {role}, 消息长度: {len(message)}, 提供商: {provider}")

    if role notin AI_ROLES:
        logger.warning(f"不支持的AI角色: {role}")
        raise HTTPException(status_code=, detail="不支持的AI角色")

    return StreamingResponse(
        generate_streaming_response(user_id, session_id, message, role, provider, model),
        media_type="text/event-stream",
        headers={
            "Cache-Control": "no-cache",
            "Connection": "keep-alive",
            "Access-Control-Allow-Origin": "*"
        }
    )

流式聊天接口参数中新增 AI 提供商以及 AI 模型参数。

🛠️ 扩展新提供商实现

🚀 快速添加新提供商

对于支持 OpenAI API 格式的提供商,只需几行代码即可集成:

这里用 moonshot 作为新厂商接入,在 ai_providers 目录下新增 moonshot_provider.py 文件,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# ai_providers/moonshot_provider.py
from ai_providers.openai_compatible_provider import OpenAICompatibleProvider

class MoonshotProvider(OpenAICompatibleProvider):
    """月之暗面 Kimi 提供商"""
    DEFAULT_BASE_URL = "https://api.moonshot.cn/v1"
    DEFAULT_MODEL = "moonshot-v1-8k"
    PROVIDER_NAME = "moonshot"
    AVAILABLE_MODELS = [
        "moonshot-v1-8k",
        "moonshot-v1-32k",
        "moonshot-v1-128k"
    ]
环境变量配置

在 .env 文件中新增 moonshot 配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Moonshot (月之暗面)
MOONSHOT_API_KEY=sk-your-moonshot-api-key
MOONSHOT_BASE_URL=https://api.moonshot.cn/v1  # 可选
MOONSHOT_MODEL=moonshot-v1-8k  # 可选
配置类更新

config.py 中添加 moonshot 配置,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Config:
    # ... 现有配置 ...

    # AI提供商基础信息
    _AI_PROVIDERS_INFO = {
        'openai': {
            'base_url': 'https://api.openai.com/v1',
            'model': 'gpt-4o'
        },
        'deepseek': {
            'base_url': 'https://api.deepseek.com/v1',
            'model': 'deepseek-chat'
        },
        'qianwen': {
            'base_url': 'https://dashscope.aliyuncs.com/compatible-mode/v1',
            'model': 'qwen-turbo'
        },
        'moonshot': {
            'base_url': 'https://api.moonshot.cn/v1',
            'model': 'moonshot-v1-8k'
        }
    }

通过以上步骤,您可以轻松扩展支持任何新的 AI 提供商,系统会自动发现并集成新的提供商,无需修改核心代码。

📚 总结

本文详细介绍了如何在 FastAPI 应用中构建一个灵活、可扩展的多模型厂商架构。通过抽象接口层、兼容适配层、具体实现层和工厂管理层的四层架构设计,实现了所有 AI 提供商的统一接口调用,支持 OpenAI、DeepSeek、通义千问等多个厂商的无缝集成。核心采用工厂模式和抽象工厂模式,配合动态提供商发现机制,新增厂商只需几行代码即可完成集成。

最后觉得本文写的不错的话,可以关注我,我会继续更新 FastAPI 框架开发 AI 聊天应用代码。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 waynblog 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
系统盘为啥往往是C盘?软件为啥希望把自己装在C盘上?
周末,我在家里面看电视,女朋友正在旁边鼓捣她的电脑,但是好像并不是很顺利,于是就有了以下对话。
Java3y
2019/05/08
1.8K0
系统盘为啥往往是C盘?软件为啥希望把自己装在C盘上?
磁盘查看分区操作命令详细
描述:主要讲解Windows下对于磁盘分区的操作,以及磁盘分区标卷信息的查看等等;
全栈工程师修炼指南
2020/10/26
4.7K0
磁盘查看分区操作命令详细
【Linux系统IO】四、文件系统
​ 之前我们学习的都是进程与被打开文件的关系,但是那些没有被打开的文件呢,它们需不需要被管理呢 ❓❓❓
利刃大大
2025/03/06
2030
【Linux系统IO】四、文件系统
Linux操作之存储空间和目录相关
Linux中swap与memory。对于memory没什么可说的就是机器的物理内存,读写速度低于cpu一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存的造价是要高于磁盘的,虽然相对来说价格一直在降低。除此之外,内存的断电丢失数据也是一个原因说不能把所有数据和程序都保存在内存中。既然不能全部使用内存,那数据还有程序肯定不可能一直霸占在内存中。当内存没有可用的,就必须要把内存中不经常运行的程序给踢出去。但是踢到哪里去,这时候swap就出现了。swap全称为swap place,即交换区,当内存不够的时候,被踢出的进程被暂时存储到交换区。当需要这条被踢出的进程的时候,就从交换区重新加载到内存,否则它不会主动交换到真实内存中。
郑小超.
2023/11/02
4230
电脑只有一个C盘怎么办?
在日常使用电脑的过程中,不少用户会遇到电脑只有一个C盘的情况。C盘作为系统盘,既要运行操作系统,又要安装各种软件和存放用户文件,时间一长,C盘就容易爆满,导致系统运行缓慢,甚至出现崩溃。那么,电脑只有一个C盘怎么办呢?本文将为大家详细介绍解决办法。
用户7704932
2024/07/12
3740
电脑只有一个C盘怎么办?
Linux系统磁盘与分区管理
Linux最传统的磁盘文件系统(filesystem)使用的是EXT4格式,所以要了解文件系统就得要由认识EXT4开始,而文件系统是创建在硬盘上面的,因此我们得了解硬盘的物理组成才行,下面我们回来详细谈一谈磁盘,inode,block还有superblock等文件系统,的理论知识.
王瑞MVP
2022/12/28
6.3K0
常用电脑资料速查
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/10
2.6K0
计算机基础(二)
计算机基础(二) 设计架构     一般消费者常说的电脑通常指的就是x86的个人电脑架构。早期两大主流x86开发商(Intel, AMD)的CPU架构与设计理念都有些许差异。 1、CPU 1.Intel芯片架构     北桥:负责链接速度较快的CPU、内存与显卡接口等元件。     南桥:负责连接速度较慢的设备接口,包括硬盘、USB、网卡等等。     由于北桥最重要的就是CPU 与内存之间的桥接,因此目前的主流架构中,大多将北桥内存控制器整合到CPU封装当中了。     早期芯片组分南北桥,北桥可以连接C
云飞扬
2018/06/19
1.6K0
从裸机启动一个C++程序实战操作
对于一个C++程序员来说,可能更多是是每天都在跟各种上层语义、设计模式、软件方法等等在打交道。但对于「一个C++程序是如何运行在机器上的」这件事可能会比较陌生。有时,遇到一些问题,在宏观角度看起来可能比较难以解释,但其实从底层出发,就能发现这个问题其实根本不算问题。类似的问题有:
腾讯技术工程官方号
2024/03/30
1.1K0
从裸机启动一个C++程序实战操作
硬件资料和软件资料_电脑硬件检测工具哪个好
2. BIOS报警声意义 3. BIOS自检与开机故障相关问题 5. 计算机几个常见指标的意义 6. 显卡GPU参数 7. 显示卡常见故障全面解决 8. 集成声卡常见故障及解决 9. 显示器经典故障以及处理办法 10. AMI主板代码大全(BIOS-ID)
全栈程序员站长
2022/11/01
5.1K0
计算机
信息的概念:  一般认为:信息是在自然界、人类社会和人类思维活动中普遍存在的一切物质和事物的属性。  信息能够用来消除事物不确定的因素
青灯古酒
2023/10/16
5850
大学课程 | 计算机操作系统
(3) 模块接口法的优缺点: 优点: ①提高OS设计的正确性,可理解性,可维护性 ②增强OS的可适应性 ③加速OS的开发过程 缺点: ①接口很难满足实际需求 ②无序模块法,无法寻找一个可靠的决定顺序
Justlovesmile
2021/12/14
9890
大学课程 | 计算机操作系统
数据中心机房建设方案
数据中心机房总面积大约178平方米,使用面积约为123平方米,分为三个功能区域,分别为主设备机房、动力机房、操作间、钢瓶间。各间需要单独隔开。隔开后主设备机房用于放置配线柜、机柜、服务器、小型机、网络设备、通讯设备等重要设备;动力机房放置UPS、电池、配电柜等。
全栈程序员站长
2022/08/22
2.9K0
数据中心机房建设方案
Linux Procfs (一) /proc/* 文件实例解析
Procfs 是进程文件系统的缩写,包含一个伪文件系统(启动时动态生成的文件系统),用于通过内核访问进程信息。linux这个文件系统通常被挂载到 /proc 目录。
晴日飞鸢
2022/03/05
6.8K0
纪念晶体管诞生71周年——改变世界30款芯片大阅兵!
1947年12月23日,第一个基于锗半导体的具有放大功能的点接触式晶体管面世,标志着现代半导体产业的诞生和信息时代正式开启。
新智元
2018/12/29
1.1K0
实施运维企业面试题-5「建议收藏」
NETW 参考答案 A 类 255.0.0.0 B 类 255.255.0.0 C 类 255.255.255.0 4 请描述预留给企业
全栈程序员站长
2022/08/22
3.4K0
字节跳动面经汇总 -- C++后端
本篇博文主要介绍2021秋招时汇总的一些字节跳动后端面试过程中可能遇到的一些问题。
范中豪
2021/12/20
8140
字节跳动面经汇总 -- C++后端
运维面试题(1024水篇)
NETWORK 1 请描述TCP/IP协议中主机与主机之间通信的三要素 参考答案 IP地址(IP address) 子网掩码(subnet mask) IP路由(IP router)
全栈程序员站长
2022/09/13
2.7K0
Windows 罕见技巧全集3
1.重新启动Windows 点“开始”|“关闭系统”以后,在“关闭Windows”对话框中,按住Shift键不放, 用鼠标点击“重新启动计算机”,再点“是”按钮,释放Shift键。这样,就重新启动Windows界面,而不是重新启动计算机。 2. 跳过开机画面 启动时按 esc 即可,或者干脆一点,修改 msdos.sys在options段落加入logo=0。
py3study
2020/01/08
1.8K0
从零开始学习Linux笔记
Linux 从零开始学习笔记 http://down-ww3.7down.net/pcdown/soft/xiazai/xishuolinux.rar
全栈程序员站长
2022/07/29
1.1K0
从零开始学习Linux笔记
相关推荐
系统盘为啥往往是C盘?软件为啥希望把自己装在C盘上?
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 项目概述
    • 核心功能
    • 技术栈
    • 🤖 支持的 AI 厂商
  • 🏗️ 核心架构设计
    • 🎯 设计理念
    • 🏛️ 架构层次
      • 1. 抽象接口层(BaseAIProvider)
      • 2. 兼容适配层(OpenAICompatibleProvider)
      • 3. 具体提供商实现层
      • 4. 工厂管理层(AIProviderFactory)
      • 🔄 多提供商管理器
      • 🔧 环境变量配置
    • 📡 核心 API 接口
      • 1. 获取可用提供商列表
      • 2. 流式聊天接口(支持提供商选择)
  • 🛠️ 扩展新提供商实现
    • 🚀 快速添加新提供商
      • 环境变量配置
      • 配置类更新
  • 📚 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档