Skip to content

完整示例

字数统计:3.4k 字
阅读时长:13 分钟

💡 提醒

本章提供 5 个完整的开发示例,从简单到复杂,手把手教你实现各种 AI 功能。

适合场景

  • 🔰 刚开始学习,想要"抄作业"快速上手
  • 🔐 需要实现权限控制(管理员/VIP 功能)
  • 🌐 想创建翻译、代码审查等专用 Agent
  • 💝 需要实现好感度系统
  • 💬 想实现多轮对话记忆功能

生动比喻:本章就像是 AI 开发的"菜谱大全"。每个示例都是一道完整的"菜",有食材清单(导入)、烹饪步骤(代码)、成品展示(效果)。跟着做,你也能做出美味的 AI 功能!

本文档提供 GsCore AI Core 的完整开发示例,帮助插件开发者快速上手。

示例一:注册工具并使用 check_func

场景

创建一个带权限校验的管理员查询工具。

完整代码

python
from pydantic_ai import RunContext
from gsuid_core.ai_core.register import ai_tools, ai_entity
from gsuid_core.ai_core.models import ToolContext, KnowledgePoint, Event

# ==================== 权限校验函数 ====================

async def check_admin(ev: Event) -> tuple[bool, str]:
    """仅允许管理员使用此工具"""
    admin_ids = ["123456", "789012"]  # 管理员ID列表
    if ev.user_id in admin_ids:
        return True, ""
    return False, "仅管理员可用"

async def check_vip(ev: Event) -> tuple[bool, str]:
    """仅允许VIP用户使用此工具"""
    # 这里可以查询数据库判断用户是否为VIP
    vip_users = ["111111", "222222"]
    if ev.user_id in vip_users:
        return True, ""
    return False, "仅VIP用户可用"

# ==================== 工具注册 ====================

@ai_tools(check_func=check_admin)
async def admin_query(
    ctx: RunContext[ToolContext],
    uid: str,
) -> str:
    """
    管理员查询接口 - 仅管理员可用

    Args:
        uid: 要查询的用户ID
    """
    # 执行管理员级别的查询
    return f"管理员查询了用户 {uid} 的敏感信息"

@ai_tools(check_func=check_vip)
async def vip_feature(
    ctx: RunContext[ToolContext],
    feature_name: str,
) -> str:
    """
    VIP专属功能 - 仅VIP用户可用

    Args:
        feature_name: 要使用的功能名称
    """
    return f"VIP用户使用了功能: {feature_name}"

# ==================== 无需权限的工具 ====================

@ai_tools()
async def simple_calc(
    a: int,
    b: int,
    operation: str = "add",
) -> str:
    """
    简单计算器 - 所有用户可用

    Args:
        a: 第一个数
        b: 第二个数
        operation: 操作类型,add/sub/mul/div
    """
    if operation == "add":
        return str(a + b)
    elif operation == "sub":
        return str(a - b)
    elif operation == "mul":
        return str(a * b)
    elif operation == "div":
        if b == 0:
            return "错误:除数不能为0"
        return str(a / b)
    return "未知操作"

@ai_tools()
async def get_current_time() -> str:
    """获取当前时间 - 所有用户可用"""
    from datetime import datetime
    return datetime.now().strftime("%Y-%m-%d %H:%M:%S")

# ==================== 知识库注册 ====================

ai_entity(KnowledgePoint(
    id="plugin_help_001",
    plugin="MyPlugin",
    title="插件帮助文档",
    content="""
    # MyPlugin 插件帮助

    ## 命令列表
    - /help - 显示帮助
    - /admin - 管理员命令(仅管理员)
    - /vip - VIP功能(仅VIP用户)
    - /calc - 计算器(所有用户)
    - /time - 获取时间(所有用户)

    ## 功能说明
    本插件提供管理员查询、VIP功能、计算器等工具。
    """,
    tags=["帮助", "命令", "文档"],
))

示例二:创建临时 Agent 处理自定义任务

场景

创建一个翻译助手 Agent,专门处理翻译任务。

完整代码

python
from gsuid_core.ai_core.gs_agent import create_agent

# ==================== 翻译服务类 ====================

class TranslationService:
    """翻译服务"""
    
    def __init__(self):
        # 创建中英翻译 Agent
        self.zh_to_en = create_agent(
            model_name="gpt-3.5-turbo",
            system_prompt="""
你是一个专业的中英翻译助手。
将中文翻译成自然流畅的英文,保持原文的语气和风格。
只输出翻译结果,不添加解释。
            """,
        )
        
        # 创建英中翻译 Agent
        self.en_to_zh = create_agent(
            model_name="gpt-3.5-turbo",
            system_prompt="""
你是一个专业的英中翻译助手。
将英文翻译成自然流畅的中文,保持原文的语气和风格。
只输出翻译结果,不添加解释。
            """,
        )
        
        # 创建日英翻译 Agent
        self.ja_to_en = create_agent(
            model_name="gpt-4",
            system_prompt="""
你是一个专业的日英翻译助手。
将日文翻译成自然流畅的英文,保持原文的语气和风格。
只输出翻译结果,不添加解释。
            """,
        )
    
    async def translate(
        self,
        text: str,
        source_lang: str,
        target_lang: str,
    ) -> str:
        """
        翻译文本
        
        Args:
            text: 要翻译的文本
            source_lang: 源语言 (zh/en/ja)
            target_lang: 目标语言 (zh/en)
        """
        # 根据语言对选择 Agent
        if source_lang == "zh" and target_lang == "en":
            return await self.zh_to_en.run(text)
        elif source_lang == "en" and target_lang == "zh":
            return await self.en_to_zh.run(text)
        elif source_lang == "ja" and target_lang == "en":
            return await self.ja_to_en.run(text)
        else:
            return f"不支持的翻译方向: {source_lang} -> {target_lang}"

# ==================== 使用示例 ====================

# 创建翻译服务实例
translator = TranslationService()

# 在异步函数中使用
async def translate_example():
    # 中译英
    result1 = await translator.translate("你好,世界!", "zh", "en")
    print(f"中译英: {result1}")
    
    # 英译中
    result2 = await translator.translate("Hello, World!", "en", "zh")
    print(f"英译中: {result2}")

# ==================== 代码审查 Agent ====================

code_review_agent = create_agent(
    model_name="gpt-4",
    system_prompt="""
你是一个资深的 Python 代码审查专家。

## 审查内容
1. 代码风格和规范(PEP 8)
2. 潜在的错误和异常
3. 性能优化建议
4. 安全漏洞
5. 可读性和维护性

## 回复格式
1. **总体评价**: 代码质量概述
2. **问题列表**: 逐条列出发现的问题
3. **改进建议**: 具体的改进方案
4. **修改示例**: 提供修改后的代码
    """,
)

async def review_code(code: str) -> str:
    """审查代码"""
    prompt = f"请审查以下 Python 代码:\n\n```python\n{code}\n```"
    return await code_review_agent.run(prompt)

示例三:完整的插件初始化示例

场景

创建一个完整的插件,包含 AI 工具、知识库、别名等所有功能。

完整代码

python
# my_plugin/__init__.py

from gsuid_core.sv import SV
from gsuid_core.plugin import Plugin
from gsuid_core.models import Bot, Event

from gsuid_core.ai_core.register import ai_tools, ai_entity, ai_alias
from gsuid_core.ai_core.models import KnowledgePoint
from gsuid_core.ai_core.gs_agent import create_agent
from gsuid_core.ai_core.buildin_tools import (
    search_knowledge,
    send_message_by_ai,
    query_user_favorability,
)
from pydantic_ai import RunContext
from gsuid_core.ai_core.models import ToolContext

# ==================== 别名注册 ====================

# 注册插件别名
ai_alias("我的插件", ["MyPlugin", "mp", "myplugin"])

# 注册角色别名
ai_alias("丝柯克", ["skk", "斯柯克", "SKK", "师傅"])
ai_alias("达达利亚", ["公子", "鸭鸭", "阿贾克斯"])

# ==================== 知识库注册 ====================

# 注册插件介绍
ai_entity(KnowledgePoint(
    id="my_plugin_info",
    plugin="MyPlugin",
    title="我的插件介绍",
    content="""
# MyPlugin

## 功能特性
1. 角色信息查询
2. 装备推荐
3. 攻略查询
4. AI 智能助手

## 使用方法
发送 /help 获取帮助
发送 /query 角色名 查询角色信息
    """,
    tags=["插件", "功能", "帮助"],
))

# 注册角色知识库
ai_entity(KnowledgePoint(
    id="character_skk",
    plugin="MyPlugin",
    title="丝柯克 - 角色介绍",
    content="""
# 丝柯克

## 基础信息
- 元素: 水
- 武器: 单手剑
- 命之座: 镜中景座

## 技能介绍
### 普通攻击 - 流澜剑术
进行至多五段的连续剑击...

### 元素战技 - 镜中水月
召唤水元素之力...

### 元素爆发 - 万流归一
释放强大的水元素爆发...

## 培养建议
### 武器推荐
1. 专武 - 镜花水月
2. 替代 - 雾切之回光
3. 四星 - 天目影打刀

### 圣遗物推荐
- 套装: 沉沦之心4件套
- 主词条: 攻击沙、水伤杯、暴击/暴伤头
- 副词条: 暴击 > 暴伤 > 攻击 > 充能
    """,
    tags=["丝柯克", "skk", "水元素", "单手剑"],
))

# ==================== AI 工具注册 ====================

@ai_tools()
async def query_character(
    ctx: RunContext[ToolContext],
    character_name: str,
) -> str:
    """
    查询角色详细信息

    Args:
        character_name: 角色名称
    """
    # 使用知识库检索
    result = await search_knowledge(
        ctx,
        query=f"{character_name}的角色信息和培养建议",
        plugin="MyPlugin",
        limit=3,
    )
    return result

@ai_tools()
async def recommend_build(
    ctx: RunContext[ToolContext],
    character_name: str,
    build_type: str = "通用",
) -> str:
    """
    推荐角色配装

    Args:
        character_name: 角色名称
        build_type: 配装类型(通用/输出/辅助/生存)
    """
    # 查询知识库获取推荐
    result = await search_knowledge(
        ctx,
        query=f"{character_name}{build_type}配装推荐",
        plugin="MyPlugin",
        limit=2,
    )
    return result

@ai_tools()
async def check_user_status(
    ctx: RunContext[ToolContext],
) -> str:
    """
    查询用户当前状态(好感度、记忆等)
    """
    # 查询好感度
    favor = await query_user_favorability(ctx)
    
    return f"用户状态:\n{favor}"

# ==================== 创建专用 Agent ====================

# 创建角色攻略 Agent
character_guide_agent = create_agent(
    system_prompt="""
你是角色攻略专家,专门帮助玩家了解角色培养。

## 能力范围
1. 分析角色定位(主C/副C/辅助)
2. 推荐武器选择
3. 推荐圣遗物搭配
4. 提供天赋升级优先级
5. 推荐队伍搭配

## 回复格式
1. **角色定位**: 简要说明角色定位
2. **培养建议**: 武器/圣遗物/天赋
3. **队伍搭配**: 推荐配队方案
4. **注意事项**: 使用技巧和注意事项
    """,
)

# ==================== 插件注册 ====================

sv_myplugin = SV("我的插件")
pd_mp = Plugin(
    name="我的插件",
    pm=1,
    sv=sv_myplugin,
)

# ==================== 命令处理 ====================

@pd_mp.on_fullmatch("/myplugin help")
async def show_help(bot: Bot, ev: Event):
    """显示帮助"""
    help_text = """
【我的插件】帮助信息

【基础命令】
/help - 显示本帮助
/query 角色名 - 查询角色信息
/build 角色名 - 查询配装推荐

【AI功能】
直接发送问题,AI助手会为您解答

【示例】
/query 丝柯克
/build 达达利亚 输出
丝柯克怎么培养?
    """
    await bot.send(help_text)

@pd_mp.on_regex(r"/query (.+)")
async def handle_query(bot: Bot, ev: Event):
    """处理查询命令"""
    character = ev.regex_group[1]
    
    # 使用 Agent 生成回复
    result = await character_guide_agent.run(
        user_message=f"请介绍角色 {character} 的培养攻略",
        bot=bot,
        ev=ev,
    )
    
    await bot.send(result)

@pd_mp.on_regex(r"/build (.+?)(?: (.+))?$")
async def handle_build(bot: Bot, ev: Event):
    """处理配装命令"""
    character = ev.regex_group[1]
    build_type = ev.regex_group[2] or "通用"
    
    # 调用工具获取配装推荐
    from gsuid_core.ai_core.buildin_tools import search_knowledge
    from pydantic_ai import RunContext
    from gsuid_core.ai_core.models import ToolContext
    
    # 这里简化处理,实际应该通过 AI 调用工具
    await bot.send(f"正在查询 {character}{build_type} 配装推荐...")

示例四:好感度系统实现

场景

实现一个完整的好感度系统,包含查询、增加、奖励等功能。

完整代码

python
from gsuid_core.ai_core.register import ai_tools
from gsuid_core.ai_core.buildin_tools import (
    query_user_favorability,
    update_user_favorability,
    send_message_by_ai,
)
from pydantic_ai import RunContext
from gsuid_core.ai_core.models import ToolContext

# ==================== 好感度工具 ====================

@ai_tools()
async def daily_interaction(
    ctx: RunContext[ToolContext],
) -> str:
    """
    每日互动,增加好感度
    """
    import random
    
    # 随机增加 1-5 点好感度
    increase = random.randint(1, 5)
    
    # 更新好感度
    result = await update_user_favorability(ctx, increase)
    
    # 发送通知
    messages = [
        f"和你聊天真开心!好感度 +{increase} ❤️",
        f"今天也是美好的一天呢!好感度 +{increase} 🌟",
        f"谢谢你的陪伴!好感度 +{increase} 🎉",
    ]
    message = random.choice(messages)
    
    await send_message_by_ai(
        ctx,
        message_type="text",
        text=message,
    )
    
    return f"好感度增加了 {increase} 点"

@ai_tools()
async def check_favorability_level(
    ctx: RunContext[ToolContext],
) -> str:
    """
    查询好感度等级和奖励
    """
    # 查询当前好感度
    favor_info = await query_user_favorability(ctx)
    
    # 解析好感度值(这里简化处理)
    # 实际应该从 favor_info 中解析
    
    # 定义等级
    levels = [
        (0, 10, "陌生人", "暂无奖励"),
        (11, 30, "熟人", "每日签到奖励 x1.1"),
        (31, 60, "朋友", "每日签到奖励 x1.2"),
        (61, 100, "好友", "每日签到奖励 x1.5"),
        (101, 200, "挚友", "每日签到奖励 x2.0"),
        (201, float('inf'), "知己", "每日签到奖励 x3.0 + 专属功能"),
    ]
    
    # 这里简化返回
    return f"{favor_info}\n\n等级说明:\n" + "\n".join([
        f"{name} ({min_val}-{max_val}): {reward}"
        for min_val, max_val, name, reward in levels
    ])

@ai_tools()
async def give_gift(
    ctx: RunContext[ToolContext],
    gift_name: str,
) -> str:
    """
    赠送礼物,大幅增加好感度

    Args:
        gift_name: 礼物名称
    """
    # 定义礼物和对应的好感度
    gifts = {
        "鲜花": 5,
        "巧克力": 10,
        "首饰": 20,
        "书籍": 8,
        "美食": 12,
    }
    
    if gift_name not in gifts:
        return f"未知的礼物: {gift_name}。可用礼物: {', '.join(gifts.keys())}"
    
    increase = gifts[gift_name]
    
    # 更新好感度
    result = await update_user_favorability(ctx, increase)
    
    # 发送感谢消息
    thank_messages = {
        "鲜花": "哇,好漂亮的花!谢谢你!🌸",
        "巧克力": "巧克力!我的最爱!谢谢你!🍫",
        "首饰": "这...这太贵重了!我会好好珍惜的!💎",
        "书籍": "谢谢你的书,我会好好阅读的!📚",
        "美食": "看起来好好吃!谢谢你!🍰",
    }
    
    await send_message_by_ai(
        ctx,
        message_type="text",
        text=thank_messages[gift_name],
    )
    
    return f"赠送了 {gift_name},好感度 +{increase}"

示例五:多轮对话实现

场景

实现一个支持多轮对话的 AI 助手,能够记住对话上下文。

完整代码

python
from gsuid_core.ai_core.register import ai_tools
from gsuid_core.ai_core.gs_agent import create_agent
from gsuid_core.ai_core.buildin_tools import search_knowledge
from pydantic_ai import RunContext
from gsuid_core.ai_core.models import ToolContext

# ==================== 对话管理 ====================

class ConversationManager:
    """对话管理器"""
    
    def __init__(self):
        self.conversations = {}  # user_id -> conversation_history
    
    def get_history(self, user_id: str) -> list:
        """获取用户对话历史"""
        return self.conversations.get(user_id, [])
    
    def add_message(self, user_id: str, role: str, content: str):
        """添加消息到历史"""
        if user_id not in self.conversations:
            self.conversations[user_id] = []
        
        self.conversations[user_id].append({
            "role": role,
            "content": content,
        })
        
        # 限制历史长度
        if len(self.conversations[user_id]) > 20:
            self.conversations[user_id] = self.conversations[user_id][-20:]
    
    def clear_history(self, user_id: str):
        """清空对话历史"""
        self.conversations[user_id] = []

# 创建对话管理器实例
conversation_mgr = ConversationManager()

# ==================== 多轮对话 Agent ====================

chat_agent = create_agent(
    system_prompt="""
你是一个友好的 AI 助手,支持多轮对话。

## 对话原则
1. 记住之前的对话内容
2. 保持上下文连贯
3. 适时引用之前的信息
4. 主动询问以获取更多信息

## 能力范围
- 回答游戏相关问题
- 查询角色和装备信息
- 提供攻略建议
- 闲聊和陪伴
    """,
)

# ==================== 工具 ====================

@ai_tools()
async def chat_with_memory(
    ctx: RunContext[ToolContext],
    user_message: str,
) -> str:
    """
    进行多轮对话

    Args:
        user_message: 用户消息
    """
    user_id = ctx.deps.ev.user_id
    
    # 获取对话历史
    history = conversation_mgr.get_history(user_id)
    
    # 构建带上下文的提示
    context = ""
    if history:
        context = "之前的对话:\n"
        for msg in history[-5:]:  # 最近5条
            role_name = "用户" if msg["role"] == "user" else "助手"
            context += f"{role_name}: {msg['content']}\n"
        context += "\n"
    
    full_prompt = f"{context}当前用户消息: {user_message}"
    
    # 调用 Agent
    response = await chat_agent.run(
        user_message=full_prompt,
        bot=ctx.deps.bot,
        ev=ctx.deps.ev,
    )
    
    # 保存到历史
    conversation_mgr.add_message(user_id, "user", user_message)
    conversation_mgr.add_message(user_id, "assistant", response)
    
    return response

@ai_tools()
async def clear_conversation(
    ctx: RunContext[ToolContext],
) -> str:
    """
    清空当前对话历史
    """
    user_id = ctx.deps.ev.user_id
    conversation_mgr.clear_history(user_id)
    return "对话历史已清空"

@ai_tools()
async def query_with_context(
    ctx: RunContext[ToolContext],
    query: str,
) -> str:
    """
    结合知识库和对话上下文回答问题

    Args:
        query: 查询内容
    """
    user_id = ctx.deps.ev.user_id
    
    # 获取知识库信息
    knowledge = await search_knowledge(
        ctx,
        query=query,
        limit=3,
    )
    
    # 获取对话历史
    history = conversation_mgr.get_history(user_id)
    
    # 构建提示
    prompt = f"""
基于以下信息回答用户问题:

【知识库信息】
{knowledge}

【对话历史】
{history[-3:] if history else "无"}

【当前问题】
{query}
"""
    
    response = await chat_agent.run(prompt)
    
    # 保存对话
    conversation_mgr.add_message(user_id, "user", query)
    conversation_mgr.add_message(user_id, "assistant", response)
    
    return response

注意事项

  1. 错误处理:生产环境需要添加完善的错误处理
  2. 性能优化:大量知识库可能影响启动速度
  3. 隐私保护:注意用户数据的隐私和安全
  4. 成本控制:注意 AI 调用的 token 消耗
  5. 测试覆盖:为工具函数编写单元测试

下一步