乐于分享
好东西不私藏

08. nanobot 源码解读:tool

08. nanobot 源码解读:tool

08. nanobot 源码解读:tool

文档内容基于 HKUDS/nanobot: "🐈 nanobot: The Ultra-Lightweight Personal AI Agent" 的 main 分支 56ce1816 提交进行说明。


目录

  • • 08. nanobot 源码解读:tool
    • • 目录
    • • tool 的抽象
      • • JSON Schema 相关
      • • tool 的执行
    • • tool 的发现与加载
    • • tool 的实现

大模型在训练完成后,在使用时有如下短板:

  • • 信息陈旧:大模型的知识来自训练数据,在训练之后出现的新知识则无法知晓
  • • 计算不精准:大模型通过概率机制生成下一个 token,容易出现幻觉,如果进行数学计算等需要精确结果的操作时容易出现问题
  • • 无法执行动作:大模型如果要和外部系统交互,仅凭生成的文本很难操作外部系统

因此有了工具调用(function calling)的诉求。tool,就是能让大模型能够调用外部函数或API的能力。

tool 的抽象

nanobot 在 nanobot/agent/tools/base.py 中定义了描述 tool 的抽象类 Tool

首先关注 Tool 中与大模型传参相关的抽象方法(已装饰为属性):

  • • namestr,工具名称
  • • descriptionstr,用于描述这个工具的功能和用途,大模型依据此判断是否要调用该工具
  • • parametersdict[str, Ant],描述工具参数的 JSON Schemananobot 提供了装饰器来设置 parameters ,所以源码中有部分实现类用装饰器替代了抽象方法实现。

其次关注 Tool 中与 Agent Loop 期间工具执行相关的抽象方法(已装饰为属性):

  • • read_onlybool,表示该工具是只读操作,不会产生副作用
  • • exclusivebool,表示该工具必须单独执行
  • • concurrent_safebool,默认值为 read_only and not exclusive,表示该工具在并发场景下是否安全

仅 concurrent_safe 属性在 Agent Loop 流程中被使用,用于控制工具是否并发执行。

接下来关注 Tool 自动发现与加载时用到的两个内部属性:

  • • _plugin_discoverablebool,默认 Truenanobot 自动发现工具时,若该属性设置为 False 时,则不会被发现。
  • • _scopesset[str],默认 {"core"},表示该工具的应用范围,可用的值有
    • • coreAgent Loop 流程中可以被主Agent使用
    • • subagentAgent Loop 流程中可以被子Agent使用
    • • memory:顾名思义应该是在涉及改写记忆文件的操作(如 dream)中使用,但是当前仅在测试代码中发现使用 memory 值

最后重点关注 Tool 执行相关的抽象方法:

  • • execute:抽象方法,工具执行的实现处,接收大模型参数,执行工具调用,然后返回结果给大模型。nanobot 约定了该方法的返回值应该为 str 或者 list[dict]

大模型调用工具时,会根据描述工具入参的 JSON Schema 来生成参数。nanobot 在收到大模型生成的参数后,需要将参数转换为适合 Python 函数调用的入参格式 dict,还需要校验参数是否符合 JSON Schema 规范,校验通过之后才会调用 execute因此,Tool 还提供了关于参数校验、参数转换等方法的实现。

JSON Schema 相关

JSON Schema 是一种用于描述和验证 JSON 数据结构的声明式语言。

简单讲,JSON Schema 是一个描述数据结构的 JSON 格式规范,主要作用是:

  • • 告诉大模型,工具需要什么样的数据结构
  • • 校验大模型生成的参数是否符合数据结构规范

比如一个获取天气的工具 def get_weather(city: str) -> str,就需要一个 {"city": "xxx"} 格式的输入,用 JSON Schema 描述这个输入如下:

{    "type": "object",           # 输入是一个对象    "properties": {             # 这个对象包含以下属性        "city": {                 # 属性 city            "type": "string"        # 类型是 string        }    },    "required": ["city"]        # 对象的必填字段有 city}

如果大模型要获取北京的天气信息,就需要生成参数 {"city": "北京"}

更多详细规则可以参阅 json-schema.org。

在 nanobot/agent/tools/base.py 中定义了抽象类 Schema

  • • to_json_schema()abstractmethod,生成符合 JSON Schema 格式的 dict
  • • validate_value(value): 校验传入的参数 value 是否符合自身表示的 JSON Schema
  • • validate_json_schema_value(val, schema)staticmethod,校验传入的参数 val 是否符合参数 schema 表示的 JSON Schema

nanobot/agent/tools/schema.py 中根据 JSON Schema 规范定义了各个类型对应的 Schema 实现:StringSchemaIntegerSchemaNumberSchemaBooleanSchemaArraySchemaObjectSchema

tool 的执行

tool 的执行重点关注下面两处:

  • • nanobot/agent/tools/registry.py 中的 ToolRegistry.execute
  • • nanobot/agent/runner.py 中的 AgentRunner._run_tool

首先查看 ToolRegistry.execute,该方法实现了参数解析和工具执行:

async def execute(self, name: str, params: Any) -> Any:    """Execute a tool by name with given parameters."""    hint = "\n\n[Analyze the error above and try a different approach.]"    # prepare_call 需要做到这几件事:    #    1. 根据 name 找到 tool    #    2. 转换 params 为函数入参形式(dict)并校验是否符合工具参数规范    #    3. 返回 tool、工具入参、错误信息(找不到 tool 或者参数有问题)    tool, params, error = self.prepare_call(name, params)    if error:        return error + hint    try:        assert tool is not None  # guarded by prepare_call()        # Tool.execute 返回值建议为 str 或者 list[dict]        result = await tool.execute(**params)        # 如果有报错,建议返回 str 且以 Error 开头        if isinstance(result, str) and result.startswith("Error"):            return result + hint        return result    except Exception as e:        return f"Error executing {name}: {str(e)}" + hint

然后是 AgentRunner._run_tool,这个函数在 Agent Loop 流程中调用,对比 ToolRegistry.execute,有更多的业务处理逻辑,且增加了事件记录:

async def _run_tool(    self,    spec: AgentRunSpec,    tool_call: ToolCallRequest,    external_lookup_counts: dict[str, int],    workspace_violation_counts: dict[str, int],) -> tuple[Any, dict[str, str], BaseException | None]:    hint = "\n\n[Analyze the error above and try a different approach.]"    # 限制外部工具的重复调用(允许重复两次):web_fetch(url) 和 web_search(query)    # 参数相同时就返回【让大模型参考之前的答案】    lookup_error = repeated_external_lookup_error(        tool_call.name,        tool_call.arguments,        external_lookup_counts,    )    if lookup_error:        event = {            "name": tool_call.name,            "status": "error",            "detail": "repeated external lookup blocked",        }        if spec.fail_on_tool_error:            return lookup_error + hint, event, RuntimeError(lookup_error)        return lookup_error + hint, event, None    # spec.tools 就是 ToolRegistry 实例,这里将 ToolRegistry.execute 的实现拆分了    # 然后加入事件记录,同时也将报错信息做了符合此处调用的处理    prepare_call = getattr(spec.tools, "prepare_call", None)    tool, params, prep_error = None, tool_call.arguments, None    if callable(prepare_call):        with suppress(Exception):            prepared = prepare_call(tool_call.name, tool_call.arguments)            if isinstance(prepared, tuple) and len(prepared) == 3:                tool, params, prep_error = prepared    if prep_error:        event = {            "name": tool_call.name,            "status": "error",            "detail": prep_error.split(": ", 1)[-1][:120],        }        # 对某些异常生成定制化的错误信息        #  - ssrf攻击:如通过 web_fetch 工具访问内网资源        #  - 工作区越界:如通过 read_file 工具访问没有权限读的文件        # 注意,这需要 tool 返回的错误信息字符串与匹配逻辑一致才可以细分        handled = self._classify_violation(            raw_text=prep_error,            soft_payload=prep_error + hint,            event=event,            tool_call=tool_call,            workspace_violation_counts=workspace_violation_counts,        )        # 有定制化错误信息就使用定制化错误信息        if handled is not None:            return handled        # 没有定制化错误信息就用之前的        return prep_error + hint, event, (            RuntimeError(prep_error) if spec.fail_on_tool_error else None        )    # 需要跟踪文件编辑情况,构造 file_edit_start 事件交给对应处理器处理    # 后面还有 file_edit_error / file_edit_end 事件    # 文件编辑跟踪相关的代码在这里先省略了    try:        if tool is not None:            # 执行工具            # 可以发现,AgentRunner._run_tool 整体和 ToolRegistry.execute 是一样的            # 都是 prepare_call + tool.execute            result = await tool.execute(**params)        else:            # 这块是兜底操作,回到了 ToolRegistry.execute            result = await spec.tools.execute(tool_call.name, params)    except asyncio.CancelledError:        raise    except BaseException as exc:        # 略,file_edit_error 事件 以及 error信息处理        return payload, event, None    # 略,file_edit_end 事件    # 对结果进行下修饰后返回    detail = "" if result is None else str(result)    detail = detail.replace("\n", " ").strip()    if not detail:        detail = "(empty)"    elif len(detail) > 120:        detail = detail[:120] + "..."    return result, {"name": tool_call.name, "status": "ok", "detail": detail}, None

tool 的发现与加载

nanobot 可以手动指定哪些工具需要添加到大模型参数,也可以通过 nanobot/agent/tools/loader.py 中的 ToolLoader 自动发现并加载符合规范的工具。

自动发现有两个来源:

第一个来源是扫描 nanobot/agent/tools/ 包,读取各模块属性,然后筛选符合规范的 Tool 实现类:

  • • 是 Tool 的实现类: isinstance(attr, type) and issubclass(attr, Tool) and attr is not Tool
  • • 不能是内部属性: not attr_name.startswith("_")
  • • 不能是抽象类: not getattr(attr, "__abstractmethods__", None)
  • • 允许被自动发现: not getattr(attr, "_plugin_discoverable", True) is False
  • • 首次发现

第二个来源是通过 entry-point 找到 nanobot.tools 组来筛选对应的 Tool 实现类:

  • • 是 Tool 的实现类: isinstance(cls, type) and issubclass(cls, Tool)
  • • 不是抽象类: not getattr(cls, "__abstractmethods__", None)
  • • 允许被自动发现: getattr(cls, "_plugin_discoverable", True)

然后在根据 scope 属性筛选哪些工具能被加载到 Agent Loop 流程中使用。

tool 的实现

需要继承 Tool 并实现抽象方法。用 read_file (ReadFileTool) 工具做个说明:

# 通过装饰器 tool_parameters 就不用实现 Tool 的抽象方法 parameters 了# 当然也可以提供 parameters 方法实现来描述 schema@tool_parameters(    tool_parameters_schema(        path=StringSchema("The file path to read"),        offset=IntegerSchema(            1,            description="Line number to start reading from (1-indexed, default 1)",            minimum=1,),        limit=IntegerSchema(            2000,            description="Maximum number of lines to read (default 2000)",            minimum=1,),        pages=StringSchema("Page range for PDF files, e.g. '1-5' (default: all, max 20 pages)"),        force=BooleanSchema(            description="Bypass same-file read deduplication and return content again.",            default=False,),        required=["path"],)    # 整体来讲,大模型就知道有这么一个函数定义了,且知道各个参数都是干什么的    # def xx(path: str, offset:int=?, limit:int=?, pages:str=?, force:bool=?)    # 这里写 =? 主要是表现这个参数不是必填参数    # 然后函数的名称、函数的作用则需要通过 name、description 来描述了)# ReadFileTool -> _FsTool -> Toolclass ReadFileTool(_FsTool):    _scopes = {"core", "subagent", "memory"}    # 略    @property    def name(self) -> str:        # 让大模型知道这个工具名称是 read_file        return "read_file"    @property    def description(self) -> str:        # 让大模型知道这个工具的用途是读文件        # 尽量写详细点,不然大模型判断起来可能会有失误        return (            "Read a file (text, image, or document). "            "Text output format: LINE_NUM|CONTENT. "            "Images return visual content for analysis. "            "Supports PDF, DOCX, XLSX, PPTX documents. "            "Use find_files/list_dir first when the path is uncertain. "            "Read the relevant range before editing so replacements or patches "            "are based on current content. "            "Use offset and limit for large text files. "            "Use force=true to re-read content even if unchanged. "            "Reads exceeding ~128K chars are truncated."        )    # 略    async def execute(        self,        path: str | None = None,        offset: int = 1,        limit: int | None = None,        pages: str | None = None,        force: bool = False,        **kwargs: Any,) -> Any:        # execute 签名必须要与 parameters 描述的一致        # 也可以看到,工具的默认值在这里放着(前面schema定义的默认值仅有描述意义,虽然在nanobot中也没有把默认值转成json给大模型)        # 具体实现略
基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-16 23:44:48 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/750628.html
  2. 运行时间 : 0.123675s [ 吞吐率:8.09req/s ] 内存消耗:4,659.11kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=1d959505f632050c232384463124394e
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000665s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000924s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000344s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000269s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000452s ]
  6. SELECT * FROM `set` [ RunTime:0.000213s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000513s ]
  8. SELECT * FROM `article` WHERE `id` = 750628 LIMIT 1 [ RunTime:0.003318s ]
  9. UPDATE `article` SET `lasttime` = 1781624688 WHERE `id` = 750628 [ RunTime:0.012772s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000335s ]
  11. SELECT * FROM `article` WHERE `id` < 750628 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000516s ]
  12. SELECT * FROM `article` WHERE `id` > 750628 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000371s ]
  13. SELECT * FROM `article` WHERE `id` < 750628 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002485s ]
  14. SELECT * FROM `article` WHERE `id` < 750628 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.009437s ]
  15. SELECT * FROM `article` WHERE `id` < 750628 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.006540s ]
0.125350s