openJiuwen Core应用开发案例:开发智能影视资讯助手完整实现过程总结

openJiuwen Core是一款大模型应用的Python软件开发工具包,为运行在openJiuwen框架上的智能体提供高性能运行时。这款开发工具包不仅封装了Agent创建、工作流编排、大模型与工具调用等多层次、易上手的对外接口;还内置了支持异步IO、流式处理的高性能运行时,实现智能体的状态保存和中断接续;更配备了提示词自优化、提示词生成、全链路观测等一系列智能体调试调优工具。openJiuwen Core开发工具包兼顾灵活性与稳定性,助力开发者高效构建稳定的大模型应用。

开源地址:https://atomgit.com/openJiuwen/agent-core?utm_source=csdn

1. 智能影视助手项目概述

智能影视助手项目展示了AI技术在娱乐资讯领域的应用价值。通过openJiuwen Agent Core框架,成功构建了一个具备智能推荐、自然语言理解、个性化服务等能力的智能助手。

该助手能够:

  • 接收用户自然语言查询
  • 智能理解用户影视偏好
  • 调用影视API获取热门资讯
  • 以友好的Markdown格式返回结果
  • 支持持续的交互式对话

2. openJiuwen Core框架介绍

openJiuwen Core是一款大模型应用的Python软件开发工具包,为运行在openJiuwen框架上的智能体提供高性能运行时。这款开发工具包不仅封装了Agent创建、工作流编排、大模型与工具调用等多层次、易上手的对外接口;还内置了支持异步IO、流式处理的高性能运行时,实现智能体的状态保存和中断接续;更配备了提示词自优化、提示词生成、全链路观测等一系列智能体调试调优工具。

openJiuwen Core开发工具包兼顾灵活性与稳定性,助力开发者高效构建稳定的大模型应用。

2.1 Agent编排能力

openJiuwen Core内置了两类预置智能体,功能丰富、开发灵活,可满足不同场景下的智能需求:

ReActAgent

  • 遵循ReAct(Reasoning + Action)规划范式
  • 以思考→行动→观察的循环迭代完成任务
  • 具备强大的多轮推理与自我修正能力
  • 支持动态决策和环境适应
  • 适用于需复杂推理、策略调整的多样化场景

WorkflowAgent

  • 专注多步骤任务导向的流程自动化
  • 严格按照用户预定义流程高效执行复杂任务
  • 能够随着用户意图的变更灵活切换任务
  • 侧重于基于预设流程实现任务的规范化与高效化执行
  • 适用于任务结构清晰、可拆解为多步骤的场景

2.2 高性能执行引擎

openJiuwen Core提供高性能执行引擎,支持分布式部署与低成本运行:

  • 异步并行图执行器:具备组件并发执行、异步IO处理、结构化上下文管理能力,支持多工作流任务高效并行处理
  • 组件基础能力:支持组件间流批一体传值、动态跳转、状态中断与恢复,提供组件动态配置与多实例管理
  • 数据存储与流式处理:提供流式输出、组件间流式传输等数据管控能力,可对接外部存储系统实现智能体上下文数据外置

2.3 插件扩展能力

openJiuwen Core提供强大的插件扩展机制,支持灵活的功能扩展:

  • Plugin Center:集中管理各类插件,支持插件的注册、查询、版本控制和依赖管理
  • Runtime Loading Mechanism:支持插件的动态加载与卸载,无需重启服务即可更新功能
  • 插件开发框架:提供统一的插件开发接口和规范,降低插件开发难度

2.4 智能LLM交互

openJiuwen Core优化了与大语言模型的交互方式,提升了智能体的表现能力:

  • Prompt Management:提供完善的提示词管理系统,支持提示词模板化、版本控制和动态生成
  • Prompt Optimization:内置提示词优化算法,提升大模型的理解能力和响应质量
  • 多模型支持:兼容主流的大语言模型,如OpenAI、Anthropic、百度文心一言、阿里巴巴通义千问等

3. 环境准备与SDK安装

python环境准备:

# 创建python 虚拟环境(命名为'.venv'是常见约定)
python3 -m venv .myvenv
source .myvenv/bin/activate

#配置python的国内镜像源头
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/

3.1 安装依赖

#SDK安装
pip install -U openjiuwen
pip install requests

3.2 配置API密钥

在代码中设置大模型配置信息:

import os

# 大模型配置信息,根据你的实际配置
os.environ.setdefault("API_BASE", "https://apis.iflow.cn/v1")
os.environ.setdefault("API_KEY", "your-api-key")
os.environ.setdefault("MODEL_PROVIDER", "OpenAI")
os.environ.setdefault("MODEL_NAME", "qwen3-32b")
os.environ.setdefault("LLM_SSL_VERIFY", "false")

4. 智能影视助手实现

4.1 项目结构

movie_assistant/
├── main.py              # 主程序入口
└── requirements.txt     # 项目依赖

4.2 核心代码实现

4.2.1 工具函数开发(影视API资源接口地址:http://49.235.52.102:8000/api/v1/hotmovie)
def build_movie_tool():
    import requests
    import json
    
    def get_hot_movies(city: str = "北京", count: int = 10, start: int = 0):
        """获取热门影视资讯"""
        try:
            url = "http://49.235.52.102:8000/api/v1/hotmovie"
            headers = {
                "accept": "application/json",
                "Content-Type": "application/json"
            }
            payload = {
                "city": city,
                "count": count,
                "start": start
            }
            
            response = requests.post(url, headers=headers, json=payload, timeout=10)
            
            if response.status_code == 200:
                data = response.json()
                if data["code"] == 0:
                    return {
                        "success": True,
                        "data": data["data"],
                        "total": data["total"],
                        "title": data["title"]
                    }
                else:
                    return {"error": f"API返回错误: {data.get('message', '未知错误')}"}
            else:
                return {"error": f"请求失败,状态码: {response.status_code}"}
        except Exception as e:
            return {"error": f"获取影视信息时发生错误: {str(e)}"}

    from openjiuwen.core.utils.tool.function.function import LocalFunction
    from openjiuwen.core.utils.tool.param import Param
    
    return LocalFunction(
        name="MovieReporter",
        description="影视资讯查询插件,获取当前热门电影信息",
        params=[
            Param(name="city", description="查询城市,默认为北京", type="string", required=False),
            Param(name="count", description="返回结果数量", type="integer", required=False),
            Param(name="start", description="起始位置", type="integer", required=False),
        ],
        func=get_hot_movies
    )
4.2.2 智能体创建
def create_movie_agent():
    from openjiuwen.core.utils.llm.base import BaseModelInfo
    from openjiuwen.core.component.common.configs.model_config import ModelConfig
    from openjiuwen.agent.react_agent import create_react_agent_config, ReActAgent
    from datetime import datetime
    
    # 1. 创建模型配置(保持不变)
    
    # 2. 创建影视专用提示词模板
    def build_prompt():
        template = (
            "你是智能影视助手,专注于提供最新电影资讯和推荐服务。\n"
            "1. 默认查询当前热门电影;\n"
            "2. 支持按城市查询当地热映影片;\n"
            "3. 当用户要求推荐电影时,优先推荐评分8.0以上的佳作;\n"
            "4. 对于新上映电影,需标注'新上映'标识;\n"
            "5. 当用户询问具体电影信息时,需提供详细资讯;\n"
            "6. 支持分页查询,每次返回10条结果。"
        )
        return [{"role": "system", "content": template}]

    # 3. 创建Agent配置
    agent_config = create_react_agent_config(
        agent_id="movie_assistant",
        agent_version="1.0.0",
        description="Jiuwen 智能影视助手 - 提供最新电影资讯、评分和个性化推荐",
        model=build_model(),
        prompt_template=build_prompt(),
    )
    
    # 4. 创建ReAct Agent实例
    movie_agent = ReActAgent(agent_config)
    
    # 5. 添加影视查询工具
    movie_agent.add_tools([build_movie_tool()])
    
    return movie_agent
4.2.3 Markdown格式化输出
def format_movies_to_markdown(result):
    """将影视数据格式化为Markdown"""
    if "error" in result:
        return f"## 错误信息\n\n{result['error']}"
    
    if not result.get("success"):
        return "## 未获取到有效影视数据"
    
    data = result["data"]
    title = result.get("title", "热门电影推荐")
    
    markdown = f"## {title}\n\n"
    markdown += f"共 {result['total']} 部电影 | 当前展示 {len(data)} 部\n\n"
    
    for movie in data:
        # 生成豆瓣链接
        douban_url = f"https://movie.douban.com/subject/{movie['id']}/"
        
        markdown += f"### [{movie['title']}]({douban_url})\n"
        markdown += f"![电影海报]({movie['cover']})\n\n"
        markdown += f"- **评分**: {'暂无' if movie['rate'] == 0 else movie['rate']}\n"
        markdown += f"- **类型**: {movie['genre'] or '未分类'}\n"
        markdown += f"- **ID**: {movie['id']}\n\n"
        markdown += "---\n"
    
    return markdown
4.2.4 异步执行与交互界面
async def main():
    movie_agent = create_movie_agent()
    
    print("=== Jiuwen 智能影视助手 ===")
    print("您好!我是您的影视资讯助手,可以为您推荐最新热门电影!")
    print("提示:输入 '退出' 或 'quit' 结束对话\n")
    
    while True:
        try:
            user_input = input("您想了解什么电影资讯? ")
            
            if user_input.lower() in ['退出', 'quit', 'q']:
                print("再见!期待下次为您推荐好电影。")
                break
                
            print("助手: 正在查询影视数据库...")
            result = await movie_agent.invoke({"query": user_input})
            
            formatted_result = format_movies_to_markdown(result)
            print(f"\n{formatted_result}\n")
            
        except KeyboardInterrupt:
            print("\n感谢使用,再见!")
            break
        except Exception as e:
            print(f"助手: 查询失败: {str(e)}")

在这里插入图片描述

5. ReActAgent在影视领域的应用

ReActAgent在影视助手中的工作原理:

5.1 智能推荐流程

  1. 意图识别:解析用户查询(如"最近有什么好看的动作片?")
  2. 参数适配:自动补全参数(类型→动作片,count=10)
  3. API调用:请求影视资讯API
  4. 结果过滤:按评分过滤推荐电影
  5. 个性化输出:生成带海报的Markdown结果

5.2 核心优势

  • 动态分页:自动处理分页参数(start/count)
  • 城市适配:根据用户位置推荐当地热映影片
  • 评分优先:自动优先推荐高分电影
  • 新片标识:自动标注新上映电影

6. 项目运行与测试

6.1 启动程序

python main.py

6.2 交互测试示例

=== Jiuwen 智能影视助手 ===
您想了解什么电影资讯? 推荐近期高分电影

助手: 正在查询影视数据库...

## 正在上映的电影-北京
共 55 部电影 | 当前展示 10 部

### [寻秦记](https://movie.douban.com/subject/26389539/)
![电影海报](https://image...)
- **评分**: 6.5
- **类型**: 未分类
- **ID**: 26389539
---
### [用武之地](https://movie.douban.com/subject/35461578/)
![电影海报](https://image...)
- **评分**: 7.5
- **类型**: 未分类
- **ID**: 35461578
---
...(更多结果)

6.3完整代码

import os
import asyncio
import requests

# 配置大模型参数
os.environ.setdefault("API_BASE", "https://apis.iflow.cn/v1")
os.environ.setdefault("API_KEY", "xxxxxxxxxx")
os.environ.setdefault("MODEL_PROVIDER", "OpenAI")
os.environ.setdefault("MODEL_NAME", "qwen3-32b")
os.environ.setdefault("LLM_SSL_VERIFY", "false")

# 获取环境变量
API_BASE = os.getenv("API_BASE")
API_KEY = os.getenv("API_KEY")
MODEL_PROVIDER = os.getenv("MODEL_PROVIDER")
MODEL_NAME = os.getenv("MODEL_NAME")
LLM_SSL_VERIFY = os.getenv("LLM_SSL_VERIFY", "false") == "true"

def build_movie_tool():
    """构建影视查询工具函数"""
    def get_hot_movies(city: str = "北京", count: int = 10, start: int = 0):
        """
        获取热门影视资讯
        :param city: 查询城市,默认为北京
        :param count: 返回结果数量
        :param start: 起始位置
        :return: 影视数据字典
        """
        try:
            url = "http://49.235.52.102:8000/api/v1/hotmovie"
            headers = {
                "accept": "application/json",
                "Content-Type": "application/json"
            }
            payload = {
                "city": city,
                "count": count,
                "start": start
            }
            
            response = requests.post(url, headers=headers, json=payload, timeout=15)
            
            if response.status_code == 200:
                data = response.json()
                if data["code"] == 0:
                    return {
                        "success": True,
                        "data": data["data"],
                        "total": data["total"],
                        "start": data["start"],
                        "title": data["title"]
                    }
                else:
                    return {"error": f"API返回错误: {data.get('message', '未知错误')}"}
            else:
                return {"error": f"请求失败,状态码: {response.status_code}"}
        except Exception as e:
            return {"error": f"获取影视信息时发生错误: {str(e)}"}

    from openjiuwen.core.utils.tool.function.function import LocalFunction
    from openjiuwen.core.utils.tool.param import Param
    
    return LocalFunction(
        name="MovieReporter",
        description="影视资讯查询插件,获取当前热门电影信息",
        params=[
            Param(name="city", description="查询城市,默认为北京", type="string", required=False),
            Param(name="count", description="返回结果数量,默认10条", type="integer", required=False),
            Param(name="start", description="起始位置,默认0", type="integer", required=False),
        ],
        func=get_hot_movies
    )

def create_movie_agent():
    """创建影视查询智能体"""
    from openjiuwen.core.utils.llm.base import BaseModelInfo
    from openjiuwen.core.component.common.configs.model_config import ModelConfig
    from openjiuwen.agent.react_agent import create_react_agent_config, ReActAgent
    
    # 1. 创建模型配置
    def build_model():
        return ModelConfig(
            model_provider=MODEL_PROVIDER,
            model_info=BaseModelInfo(
                model=MODEL_NAME,
                api_base=API_BASE,
                api_key=API_KEY,
                temperature=0.7,
                top_p=0.9,
                timeout=30,
            ),
        )

    # 2. 创建影视专用提示词模板
    def build_prompt():
        template = (
            "你是智能影视助手,专注于提供最新电影资讯和推荐服务。\n"
            "1. 默认查询当前热门电影;\n"
            "2. 支持按城市查询当地热映影片;\n"
            "3. 当用户要求推荐电影时,优先推荐评分8.0以上的佳作;\n"
            "4. 对于评分低于5.0的电影,需标注'谨慎观看'提示;\n"
            "5. 当用户询问具体电影信息时,需提供详细资讯;\n"
            "6. 支持分页查询,每次返回10条结果;\n"
            "7. 对于新上映电影,需标注'新上映'标识。"
        )
        return [{"role": "system", "content": template}]

    # 3. 创建Agent配置
    agent_config = create_react_agent_config(
        agent_id="movie_assistant",
        agent_version="1.0.0",
        description="Jiuwen 智能影视助手 - 提供最新电影资讯、评分和个性化推荐",
        model=build_model(),
        prompt_template=build_prompt(),
    )
    
    # 4. 创建ReAct Agent实例
    movie_agent = ReActAgent(agent_config)
    
    # 5. 添加影视查询工具
    movie_agent.add_tools([build_movie_tool()])
    
    return movie_agent

def format_movies_to_markdown(result):
    """将影视数据格式化为Markdown"""
    if "error" in result:
        return f"## 错误信息\n\n{result['error']}"
    
    if not result.get("success", False):
        return "## 未获取到有效影视数据"
    
    data = result.get("data", [])
    title = result.get("title", "热门电影推荐")
    total = result.get("total", 0)
    start = result.get("start", 0)
    count = len(data)
    
    # 计算分页信息
    current_page = (start // count) + 1 if count > 0 else 1
    total_pages = (total + count - 1) // count if count > 0 else 1
    
    markdown = f"## {title}\n\n"
    markdown += f"**共 {total} 部电影** | **当前展示 {start+1}-{start+count} 部** | **第 {current_page}/{total_pages} 页**\n\n"
    
    for movie in data:
        # 生成豆瓣链接
        douban_url = f"https://movie.douban.com/subject/{movie['id']}/"
        
        # 处理评分显示
        rate = movie['rate']
        if rate == 0:
            rate_display = "暂无评分"
            rate_emoji = "🆕"
        elif rate >= 8.0:
            rate_display = f"⭐️ **{rate}** (强烈推荐)"
            rate_emoji = "👍👍"
        elif rate >= 6.0:
            rate_display = f"⭐️ {rate}"
            rate_emoji = "👍"
        else:
            rate_display = f"⚠️ {rate} (谨慎观看)"
            rate_emoji = "👀"
        
        markdown += f"### {rate_emoji} [{movie['title']}]({douban_url})\n"
        markdown += f"![电影海报]({movie['cover']})\n\n"
        markdown += f"- **评分**: {rate_display}\n"
        markdown += f"- **类型**: {movie['genre'] or '未分类'}\n"
        markdown += f"- **ID**: {movie['id']}\n\n"
        markdown += "---\n"
    
    # 添加分页提示
    if total_pages > 1:
        markdown += "\n**提示**: 输入 '下一页' 查看更多结果\n"
    
    return markdown

async def main():
    """主交互函数"""
    movie_agent = create_movie_agent()
    
    print("=== Jiuwen 智能影视助手 ===")
    print("您好!我是您的影视资讯助手,可以为您推荐最新热门电影!")
    print("支持命令: '推荐'、'高分电影'、'新片'、'下一页'、'退出'")
    print("=" * 40 + "\n")
    
    current_start = 0
    current_city = "北京"
    
    while True:
        try:
            user_input = input("🎬 您想了解什么电影资讯? ")
            
            if user_input.lower() in ['退出', 'quit', 'q', 'exit']:
                print("\n再见!期待下次为您推荐好电影。🎉")
                break
                
            # 处理分页命令
            if user_input.lower() in ['下一页', 'next']:
                current_start += 10
                user_input = f"查询{current_city}的电影,从第{current_start+1}条开始"
            
            # 处理城市变更
            elif "上海" in user_input:
                current_city = "上海"
                current_start = 0
            elif "广州" in user_input:
                current_city = "广州"
                current_start = 0
            elif "深圳" in user_input:
                current_city = "深圳"
                current_start = 0
            elif "北京" in user_input:
                current_city = "北京"
                current_start = 0
            
            print("\n助手: 正在查询影视数据库...")
            result = await movie_agent.invoke({"query": user_input})
            
            # 更新分页位置
            if "start" in result:
                current_start = result["start"]
            
            formatted_result = format_movies_to_markdown(result)
            print(f"\n{formatted_result}\n")
            print("=" * 40)
            
        except KeyboardInterrupt:
            print("\n感谢使用,再见!")
            break
        except Exception as e:
            print(f"\n助手: 查询失败: {str(e)}\n")

if __name__ == "__main__":
    asyncio.run(main())

7. 技术亮点与应用价值

7.1 技术升级

  1. 数据结构适配:重构数据处理逻辑,支持影视多维数据
  2. 海报渲染优化:自动转换图片URL为Markdown格式
  3. 智能过滤机制:实现按评分/类型的动态过滤
  4. 分页控制:自动管理分页参数(start/count)

7.2 应用价值

  1. 影视发现平台:帮助用户发现冷门佳作
  2. 院线决策支持:实时获取各地热映影片
  3. 个性化推荐:基于评分/类型的智能推荐
  4. 影视资料库:构建结构化电影数据库

8. 总结与展望

通过本项目,展示了如何快速构建智能影视助手:

8.1 项目价值

  • 数据可视化:海报+评分的直观展示
  • 跨地域支持:多城市影院数据获取
  • 实时性:获取最新上映信息
  • 扩展性强:可集成购票/预告片等功能

8.2 未来扩展

  1. 集成购票接口
  2. 添加预告片展示功能
  3. 实现用户偏好记忆
  4. 开发影视资讯订阅服务
  5. 增加多语言支持

openJiuwen Core框架为智能体开发提供了坚实的基础,使开发者能够专注于业务逻辑实现,而无需关心底层的AI技术细节。相信随着智能体技术的不断成熟,它将在更多领域发挥重要作用,为用户提供更加智能、便捷的服务体验。

📌 相关链接

如需进一步了解 openJiuwen 的功能和使用方法,请参考官方文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

特立独行的猫a

您的鼓励是我的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值