jianmu.node¶
适用对象:节点作者 / 工作流开发者 / Tree Studio 维护者
是否必读:是
相关模块:jianmu.engine, jianmu.tool, jianmu.skill, jianmu.swarm
1. 模块职责¶
jianmu.node 是节点公开入口,集中暴露节点基类、内置节点和预制组合。
如果说 jianmu.engine 更偏运行时核心,那么 jianmu.node 就是大多数用户真正直接编排行为树时会使用的模块。
2. 适合查什么¶
- 基类与运行时节点语义:
AsyncBehaviour、LoopUntilSuccess - 装饰器:
node - 常见节点:
AgentLLMNode、ToolExecutor、SkillNode - 通用节点:
Log、Wait、Timeout、StateCondition - 多 Agent 节点:
SpawnAgent、SendMessage、WaitMessage、SwarmNode - 预制模式:
create_react_node()、create_plan_execute_node()
3. 使用建议¶
- 写自定义节点,优先从这里进入
- 使用内置工作流节点,也优先依赖这里的公开对象
- 树组合子如
Sequence、Selector、Parallel虽然这里仍可见,但新代码应优先从jianmu.tree导入 - 如果你只是想理解“同步节点 / 异步节点”,优先看
jianmu.Node和jianmu.AsyncNode - 想理解更深层端口与注入机制,再回看
docs/concepts/node_system.md create_react_node()和create_plan_execute_node()现在都支持把工具集合、动态 tool provider、执行约束和 tool runner 作为 preset 入口参数传入LoopUntilSuccess和Timeout已统一成更偏 keyword-only 的调用风格;新代码应显式写child=、max_iterations=、duration=SpawnAgent默认每次执行都会创建一个新 agent;如果希望复用同一个已写入状态的 agent id,可显式使用reuse_if_present=True
4. 边界说明¶
jianmu.node负责jianmu语义节点、内建节点和 presetjianmu.tree负责行为树原语jianmu.node.builtin是内建实现的组织层,不是主推荐导入路径
因此推荐:
from jianmu.node import Logfrom jianmu.node import ToolExecutor
而不是默认推荐:
from jianmu.node.builtin import Logfrom jianmu.node.builtin import ToolExecutor
5. 最小示例¶
from jianmu.model import ModelClient
from jianmu.node import ToolExecutor, create_react_node
from jianmu.tool import CalculatorTool
model_client = ModelClient.resolve()
react_node = create_react_node(
model_client=model_client,
tools=[CalculatorTool()],
)
tool_executor = ToolExecutor(tools=[CalculatorTool()])
6. preset 心智模型¶
create_react_node()适合“边想边调用工具”的单循环 Agentcreate_plan_execute_node()适合“先规划、再执行、必要时再评审”的显式分阶段流程- 两者都属于公开高频 preset,文档与调用方式应尽量保持同一量级的可配置性
当前推荐的理解方式:
model_client:模型客户端tools:静态工具集tool_providers:动态工具来源tool_runner:工具执行器覆盖constraints:审批 / 沙箱 / 执行约束config:preset 的节点级配置
7. 常见入口¶
- 想写单次模型节点:看
SimpleLLMNode - 想让模型发起工具调用:看
AgentLLMNode+ToolExecutor - 想直接加载 skill:看
SkillNode - 想快速搭 ReAct / Plan-Execute:看
create_react_node()/create_plan_execute_node()
8. API 参考¶
node
¶
jianmu Nodes: pre-built nodes for common use cases.
AsyncBehaviour
¶
Bases: Behaviour
Base class for asynchronous Jianmu nodes.
Initialize an asynchronous Jianmu behaviour node.
源代码位于: jianmu/engine/behaviour.py
initialise
¶
Start a fresh async task whenever the node re-enters execution.
源代码位于: jianmu/engine/behaviour.py
tick
¶
Restart completed RUNNING tasks so async nodes can make forward progress across ticks.
源代码位于: jianmu/engine/behaviour.py
update
¶
Map async task state back into py_trees status values.
返回:
| 类型 | 描述 |
|---|---|
Status
|
|
Status
|
task is missing or returned an invalid type, |
Status
|
cancelled, or the |
源代码位于: jianmu/engine/behaviour.py
terminate
¶
Cancel the in-flight task when the node is interrupted.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
new_status
|
Status
|
The status py_trees is transitioning this node to. |
必需 |
源代码位于: jianmu/engine/behaviour.py
update_async
async
¶
Run one asynchronous node update.
返回:
| 类型 | 描述 |
|---|---|
Status
|
py_trees status value produced by the async node logic. |
引发:
| 类型 | 描述 |
|---|---|
NotImplementedError
|
Always raised in the base class; subclasses must override this method. |
源代码位于: jianmu/engine/behaviour.py
LoopUntilSuccess
¶
LoopUntilSuccess(
name: str | None = None,
*,
child: Optional[Behaviour] = None,
max_iterations: int = 10,
abort_condition: Optional[Callable[[], bool]] = None,
)
Bases: Decorator
Retry a child until it succeeds or the iteration budget is exhausted.
This decorator converts child failure into another execution round until the child succeeds, the retry budget is exhausted, or an abort condition triggers.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
max_iterations |
Maximum allowed retry count before terminal failure. |
|
iteration_count |
Current retry count for the active entry. |
|
abort_condition |
Optional callable used to stop the loop early. |
Configure retry-until-success behaviour with an abort hook.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
name
|
str | None
|
Behavior tree node name. |
None
|
child
|
Optional[Behaviour]
|
Wrapped child behavior to retry. |
None
|
max_iterations
|
int
|
Maximum number of agent-loop rounds triggered by child failure before the loop fails terminally. |
10
|
abort_condition
|
Optional[Callable[[], bool]]
|
Optional callable that stops the loop early when
it returns |
None
|
源代码位于: jianmu/node/composites.py
dump_resume_state
¶
Return loop-local state needed to continue after checkpoint restore.
restore_resume_state
¶
Restore loop-local retry progress from checkpoint metadata.
initialise
¶
Reset the retry counter at the start of each entry.
源代码位于: jianmu/node/composites.py
update
¶
Translate child failure into a scheduled retry.
返回:
| 类型 | 描述 |
|---|---|
Status
|
The current decorator status after evaluating the child state. |
源代码位于: jianmu/node/composites.py
terminate
¶
Clear retry bookkeeping on exit.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
new_status
|
Status
|
Final status assigned to this decorator. |
必需 |
源代码位于: jianmu/node/composites.py
AgentLLMNode
¶
AgentLLMNode(
name: str | None = None,
*,
namespace: Optional[str] = None,
model_client: ModelClient,
tools_schema: Optional[List[Dict[str, Any]]] = None,
tools_description: str = "",
context_builder: Optional[
ContextBuilderProtocol
] = None,
config: Optional[AgentLLMConfig] = None,
)
Bases: SimpleLLMNode
Run an agent-oriented LLM step that may emit structured tool calls.
Compared with SimpleLLMNode, this node additionally exposes tool
schemas to the model, accumulates usage across iterations, and persists
emitted tool calls into shared state for ToolExecutor to consume.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
_tools_schema |
Structured tool schemas exposed to the model. |
|
_tools_description |
Human-readable tool description block for prompts. |
Initialize the node.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
name
|
str | None
|
Node name shown in traces and tree views. |
None
|
namespace
|
Optional[str]
|
Optional state namespace for port resolution. |
None
|
model_client
|
ModelClient
|
Explicit model client used for inference. |
必需 |
tools_schema
|
Optional[List[Dict[str, Any]]]
|
Structured tool schema exposed to the model. |
None
|
tools_description
|
str
|
Human-readable tool description block for prompts. |
''
|
context_builder
|
Optional[ContextBuilderProtocol]
|
Optional context builder override. |
None
|
config
|
Optional[AgentLLMConfig]
|
Agent LLM execution configuration. |
None
|
源代码位于: jianmu/node/builtin/llm.py
update_async
async
¶
Run one agent step and extract any emitted tool calls.
返回:
| 类型 | 描述 |
|---|---|
Status
|
|
Status
|
|
源代码位于: jianmu/node/builtin/llm.py
705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 | |
SimpleLLMNode
¶
SimpleLLMNode(
name: str | None = None,
*,
namespace: Optional[str] = None,
model_client: ModelClient,
context_builder: Optional[
ContextBuilderProtocol
] = None,
config: Optional[AgentLLMConfig] = None,
)
Bases: AsyncNode
Run one LLM call and persist the response back to state.
SimpleLLMNode is the minimal model-inference node: it builds prompt
context from state, calls a model client once, appends the assistant message,
and writes the resulting text to text_output.
Use this when you need one model turn without tool calling. For
tool-capable agent turns, use AgentLLMNode.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
_explicit_model_client |
Explicit model client bound at construction time. |
|
config |
LLM execution configuration for the node. |
|
_explicit_context_builder |
Optional explicit context-builder override. |
Initialize the node.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
name
|
str | None
|
Node name shown in traces and tree views. |
None
|
namespace
|
Optional[str]
|
Optional state namespace for port resolution. |
None
|
model_client
|
ModelClient
|
Explicit model client used for inference. |
必需 |
context_builder
|
Optional[ContextBuilderProtocol]
|
Optional context builder override. When omitted, the node resolves a default chat or ReAct builder. |
None
|
config
|
Optional[AgentLLMConfig]
|
LLM execution configuration. |
None
|
源代码位于: jianmu/node/builtin/llm.py
initialise
¶
Start an async model call and reset stale task records on fresh entry.
update_async
async
¶
Build prompt context, invoke the model, and persist the answer.
返回:
| 类型 | 描述 |
|---|---|
Status
|
|
Status
|
|
源代码位于: jianmu/node/builtin/llm.py
422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 | |
ToolExecutor
¶
ToolExecutor(
name: str | None = None,
*,
namespace: Optional[str] = None,
tools: Optional[List[Tool]] = None,
tool_runner: Optional[Any] = None,
guard_enforcer: Optional[Any] = None,
constraints: Optional[Any] = None,
config: Optional[ToolExecutorConfig] = None,
tool_result_policy: Optional[ToolResultPolicy] = None,
tool_result_policy_scope: Optional[
ToolResultPolicyScope
] = None,
)
Bases: AsyncNode
Execute agent-selected tool calls and append observations to state.
ToolExecutor expects pending tool calls to already exist in agent state
and is typically paired with AgentLLMNode or one of the preset agent
loops. It resolves the requested tool by name, runs it, and appends a tool
observation message back into the shared conversation state.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
toolset |
Registered runtime tool collection visible to the executor. |
|
config |
Execution and observation configuration for tool runs. |
|
constraints |
Optional guard and execution constraints for the batch. |
Initialize the executor.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
name
|
str | None
|
Node name shown in traces and tree views. |
None
|
namespace
|
Optional[str]
|
Optional state namespace for port resolution. |
None
|
tools
|
Optional[List[Tool]]
|
Tool registry exposed to the agent. |
None
|
tool_runner
|
Optional[Any]
|
Optional explicit tool runner override. |
None
|
guard_enforcer
|
Optional[Any]
|
Optional explicit guard enforcer override. |
None
|
constraints
|
Optional[Any]
|
Optional guard and execution constraints used to build approval and execution policy components. |
None
|
config
|
Optional[ToolExecutorConfig]
|
Executor configuration including retry and key settings. |
None
|
tool_result_policy
|
Optional[ToolResultPolicy]
|
Optional policy evaluated after each completed tool call and before its observation is committed. |
None
|
tool_result_policy_scope
|
Optional[ToolResultPolicyScope]
|
Optional predicate limiting which tool
calls are handled by |
None
|
源代码位于: jianmu/node/builtin/tool.py
completion_status
property
¶
Return the status requested by the latest Complete disposition.
返回:
| 类型 | 描述 |
|---|---|
Status | None
|
Completion status for the active batch, or |
Status | None
|
result has completed the ReAct loop. |
initialise
¶
Reset policy completion state and start a fresh asynchronous batch.
dump_resume_state
¶
Return tool-executor local state needed for checkpoint resume.
源代码位于: jianmu/node/builtin/tool.py
restore_resume_state
¶
Restore pending tool-executor state from checkpoint metadata.
源代码位于: jianmu/node/builtin/tool.py
inject
¶
Bind runtime dependencies and cancel workers when a run detaches.
源代码位于: jianmu/node/builtin/tool.py
terminate
¶
Cancel child tool workers before interrupting the coordinator task.
register_tool
¶
Register a tool under its lowercase runtime name.
This is a supported extension point for workflow assembly and visual
editors that attach ToolNode definitions to a ToolExecutor.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
tool
|
Tool
|
Tool instance to expose for execution. |
必需 |
源代码位于: jianmu/node/builtin/tool.py
update_async
async
¶
Execute the current batch of agent-requested tool calls.
返回:
| 类型 | 描述 |
|---|---|
Status
|
|
Status
|
|
源代码位于: jianmu/node/builtin/tool.py
1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 | |
ToolNode
¶
ToolNode(
name: str | None = None,
*,
namespace: str | None = None,
tool: Tool,
input_key: str = "input",
output_key: str = "output",
execute: Optional[bool] = None,
)
Bases: AsyncNode
Wrap one Tool so it can participate directly in a behavior tree.
ToolNode is the right abstraction when a workflow explicitly decides
where a tool call sits in the tree. In contrast, ToolExecutor is used
by agent loops that receive tool calls from an LLM.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
tool |
Underlying tool implementation invoked by the node. |
|
input_key |
State key used to read tool input. |
|
output_key |
State key used to persist tool output. |
|
execute |
Whether the tool should execute when the node is ticked. |
|
_tool_runner |
Cached sandbox-aware tool runner instance. |
|
_tool_runner_signature |
Stable signature used to decide runner reuse. |
Initialize the node.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
name
|
str | None
|
Node name shown in traces and tree views. |
None
|
namespace
|
str | None
|
Optional state namespace for port resolution. |
None
|
tool
|
Tool
|
Underlying tool implementation to invoke. |
必需 |
input_key
|
str
|
State key used to read tool input. |
'input'
|
output_key
|
str
|
State key used to persist tool output. |
'output'
|
execute
|
Optional[bool]
|
Whether the node should execute the tool when ticked. |
None
|
源代码位于: jianmu/node/builtin/tool.py
update_async
async
¶
Run the wrapped tool once and write its output back to state.
返回:
| 类型 | 描述 |
|---|---|
Status
|
|
Status
|
|
源代码位于: jianmu/node/builtin/tool.py
302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 | |
SkillNode
¶
SkillNode(
name: str | None = None,
*,
namespace: str | None = None,
model_client: Any = None,
skills_dir: str | Path | None = None,
enabled_skills: list[str] | None = None,
explicit_enabled_skills: bool = False,
skill_files: list[str | Path] | None = None,
messages: Sequence[Any] | None = None,
tools: Optional[list[Tool]] = None,
output_schema: Optional[dict[str, Any]] = None,
config: SkillNodeConfig | None = None,
tool_result_policy: ToolResultPolicy | None = None,
tool_result_policy_scope: ToolResultPolicyScope
| None = None,
)
Bases: FlattenedAgentNode
Skill-oriented agent node that loads and runs one or more skills.
SkillNode bridges file-based skill definitions into a runnable node. A
skill may be prompt-driven or behavior-tree-driven, and the node handles
skill discovery, prompt composition, tool exposure, and normalized output
persistence.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
namespace |
Optional state namespace used for this node's execution. |
|
state_manager |
Shared runtime state manager injected by the runner. |
|
ctx |
Runtime dependency context injected by the runner. |
Initialize a skill-driven agent node.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
name
|
str | None
|
Node name shown in traces and tree views. |
None
|
namespace
|
str | None
|
Optional state namespace for port resolution. |
None
|
model_client
|
Any
|
Explicit model client override for prompt-driven skills. |
None
|
skills_dir
|
str | Path | None
|
Directory containing |
None
|
enabled_skills
|
list[str] | None
|
Optional skill names to load from |
None
|
explicit_enabled_skills
|
bool
|
Whether an explicitly provided empty
|
False
|
skill_files
|
list[str | Path] | None
|
Explicit |
None
|
messages
|
Sequence[Any] | None
|
Optional fixed messages injected into skill execution context. |
None
|
tools
|
Optional[list[Tool]]
|
Extra tools exposed alongside skill-declared tools. |
None
|
output_schema
|
Optional[dict[str, Any]]
|
Explicit output schema override. |
None
|
config
|
SkillNodeConfig | None
|
Skill node configuration and constraints. |
None
|
引发:
| 类型 | 描述 |
|---|---|
ValueError
|
If |
源代码位于: jianmu/node/builtin/skill.py
update
¶
Run the compiled skill subtree and publish its formal outputs outward.
源代码位于: jianmu/node/builtin/skill.py
Log
¶
Bases: Node
Log a message to console (and broadcast to Studio if configured).
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
_broadcast_callback |
Optional[Callable[[str, str], None]]
|
Optional callback used to mirror logs externally. |
message |
Static log message emitted when the node ticks. |
Create a node that logs one static message.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
name
|
str | None
|
Node name shown in traces and tree views. |
None
|
namespace
|
str | None
|
Optional state namespace. |
None
|
message
|
str
|
Static string to emit when the node ticks. |
''
|
源代码位于: jianmu/node/builtin/utility.py
update
¶
Emit the configured log message and succeed.
返回:
| 类型 | 描述 |
|---|---|
Status
|
Always |
源代码位于: jianmu/node/builtin/utility.py
Wait
¶
Bases: AsyncNode
Wait for a specified duration, then return SUCCESS.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
duration |
Number of seconds waited before succeeding. |
Create an async wait node for a fixed duration.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
name
|
str | None
|
Node name shown in traces and tree views. |
None
|
namespace
|
str | None
|
Optional state namespace. |
None
|
duration
|
float
|
Number of seconds to wait before returning SUCCESS. |
1.0
|
源代码位于: jianmu/node/builtin/utility.py
update_async
async
¶
Sleep for the configured duration and then succeed.
返回:
| 类型 | 描述 |
|---|---|
Status
|
Always |
源代码位于: jianmu/node/builtin/utility.py
Timeout
¶
Timeout(
name: str | None = None,
*,
namespace: str | None = None,
child: Behaviour,
duration: float,
)
Bases: Decorator
Async-friendly timeout decorator.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
duration |
Timeout window in seconds. |
|
expiry_time |
Monotonic deadline for the current entry. |
Wrap a child with an async-friendly timeout policy.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
name
|
str | None
|
Node name shown in traces and tree views. |
None
|
namespace
|
str | None
|
Optional state namespace. |
None
|
child
|
Behaviour
|
Child behaviour node to wrap. |
必需 |
duration
|
float
|
Timeout in seconds after which the child is cancelled. |
必需 |
源代码位于: jianmu/node/builtin/utility.py
dump_resume_state
¶
Return remaining timeout budget for checkpoint restore.
源代码位于: jianmu/node/builtin/utility.py
restore_resume_state
¶
Restore pending timeout budget from checkpoint metadata.
源代码位于: jianmu/node/builtin/utility.py
initialise
¶
Start a fresh timeout window for the current entry.
源代码位于: jianmu/node/builtin/utility.py
update
¶
Fail when the timeout expires; otherwise mirror child status.
返回:
| 类型 | 描述 |
|---|---|
Status
|
|
Status
|
status of the child behaviour. |
源代码位于: jianmu/node/builtin/utility.py
StateCondition
¶
StateCondition(
name: str | None = None,
*,
namespace: Optional[str] = None,
key: Optional[str] = None,
op: str = "truthy",
value: Any = None,
predicate: Optional[Callable[[Any], bool]] = None,
)
Bases: Node
Generic state condition node.
Supports two evaluation modes:
1. Predicate mode: call predicate(state) and convert the result to bool.
2. Declarative mode: compare state[key] with op and value.
Returns SUCCESS when the condition passes, otherwise FAILURE.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
key |
State field key used for declarative comparisons. |
|
op |
Comparison operator used for declarative mode. |
|
value |
Reference value used for declarative comparisons. |
|
predicate |
Optional predicate callable evaluated against the full state. |
Configure a predicate- or comparison-based state condition.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
name
|
str | None
|
Node name shown in traces and tree views. |
None
|
namespace
|
Optional[str]
|
Optional state namespace. |
None
|
key
|
Optional[str]
|
State field key to read for declarative comparisons. |
None
|
op
|
str
|
Comparison operator ( |
'truthy'
|
value
|
Any
|
Reference value for declarative comparisons. |
None
|
predicate
|
Optional[Callable[[Any], bool]]
|
Optional callable receiving the full state object; takes precedence over declarative comparisons when set. |
None
|
源代码位于: jianmu/node/builtin/condition.py
update
¶
Evaluate the configured condition against current state.
返回:
| 类型 | 描述 |
|---|---|
Status
|
|
Status
|
when it fails or the state manager is not bound. |
源代码位于: jianmu/node/builtin/condition.py
EvaluationNode
¶
EvaluationNode(
name: str | None = None,
*,
namespace: str | None = None,
model_client: Optional[ModelClient] = None,
input_keys: Optional[list[str]] = None,
output_keys: Optional[
EvaluationStateKeys | dict
] = None,
append_to_messages: bool = True,
feedback_role: str = "user",
config: Optional[AgentLLMConfig] = None,
)
Bases: AsyncNode
Evaluator node for actor-evaluator workflows.
Reads configured input fields from state, asks the model for a structured
score/reflection result, and writes outputs back through EvaluationStateKeys.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
_explicit_model_client |
Explicit evaluator model-client override. |
|
config |
Agent LLM configuration used for the evaluator call. |
|
output_keys |
State-key mapping used for score/reflection outputs. |
|
input_keys |
State field names included in the evaluator prompt. |
|
append_to_messages |
Whether evaluator feedback is appended to history. |
|
feedback_role |
Role used when appending feedback messages. |
Configure evaluator inputs, outputs, and provider settings.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
name
|
str | None
|
Node name shown in traces and tree views. |
None
|
namespace
|
str | None
|
Optional state namespace for port resolution. |
None
|
model_client
|
Optional[ModelClient]
|
Explicit model client override for the evaluator call. |
None
|
input_keys
|
Optional[list[str]]
|
State field names to include in the evaluator prompt. |
None
|
output_keys
|
Optional[EvaluationStateKeys | dict]
|
State keys that receive the score, reflection, and best-answer outputs. |
None
|
append_to_messages
|
bool
|
Whether to append the feedback message to the conversation history. |
True
|
feedback_role
|
str
|
Role used when appending the feedback message. |
'user'
|
config
|
Optional[AgentLLMConfig]
|
Agent LLM configuration for the evaluator model call. |
None
|
源代码位于: jianmu/node/builtin/evaluation.py
update_async
async
¶
Call the evaluator model and persist score/reflection outputs.
返回:
| 类型 | 描述 |
|---|---|
Status
|
|
Status
|
|
Status
|
available, or the model response cannot be parsed. |
源代码位于: jianmu/node/builtin/evaluation.py
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 | |
SpawnAgent
¶
SpawnAgent(
name: str | None = None,
*,
namespace: str | None = None,
runtime: Optional[Any] = None,
role: Optional[str] = None,
task: Optional[str] = None,
parent_id: Optional[str] = None,
constraints: Optional[object] = None,
role_key: str = "role",
task_key: str = "task",
parent_id_key: str = "agent_id",
constraints_key: str = "constraints",
mode: str = "detached",
output_key: str = "spawned_agent_id",
reuse_if_present: bool = False,
)
Bases: _SwarmRuntimeNode
Behavior tree node to spawn a new agent in the swarm runtime.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
role |
Static role name override. |
|
role_key |
State key used to resolve the role dynamically. |
|
task |
Static task text override. |
|
task_key |
State key used to resolve the task dynamically. |
|
mode |
Spawn mode passed to the runtime. |
|
constraints |
Static execution constraints override. |
|
constraints_key |
State key used to resolve constraints dynamically. |
|
runtime |
Explicit swarm runtime reference. |
|
parent_id |
Static parent agent id override. |
|
parent_id_key |
State key used to resolve the parent agent id. |
|
output_key |
State key where the spawned agent id is written. |
|
reuse_if_present |
Whether an existing output agent id should be reused. |
Initialize a node that spawns swarm agents.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
name
|
str | None
|
Node name shown in traces and tree views. |
None
|
namespace
|
str | None
|
Optional state namespace for port resolution. |
None
|
runtime
|
Optional[Any]
|
Explicit swarm runtime reference; falls back to state if omitted. |
None
|
role
|
Optional[str]
|
Static role name to spawn; overrides |
None
|
task
|
Optional[str]
|
Static task string; overrides |
None
|
parent_id
|
Optional[str]
|
Static parent agent id; overrides |
None
|
constraints
|
Optional[object]
|
Static execution constraints; overrides
|
None
|
role_key
|
str
|
State key used to read the role when |
'role'
|
task_key
|
str
|
State key used to read the task when |
'task'
|
parent_id_key
|
str
|
State key for the parent agent id. |
'agent_id'
|
constraints_key
|
str
|
State key for runtime constraints. |
'constraints'
|
mode
|
str
|
Agent spawn mode (e.g. |
'detached'
|
output_key
|
str
|
State key where the new agent id is written. |
'spawned_agent_id'
|
reuse_if_present
|
bool
|
When True, reuse a previously written agent id
from |
False
|
源代码位于: jianmu/node/builtin/swarm.py
update_async
async
¶
Spawn an agent and write its identifier to state.
When reuse_if_present is enabled, the node first checks the
resolved output_key state slot. If a non-empty agent id is already
present, that id is preserved and no new agent is spawned.
返回:
| 类型 | 描述 |
|---|---|
Status
|
|
Status
|
|
源代码位于: jianmu/node/builtin/swarm.py
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 | |
SendMessage
¶
SendMessage(
name: str | None = None,
*,
namespace: str | None = None,
runtime: Optional[Any] = None,
to_agent_id: Optional[str] = None,
group_id: Optional[str] = None,
topic: Optional[str] = None,
content: Optional[str] = None,
sender_id: Optional[str] = None,
to_agent_key: str = "to_agent_id",
group_key: str = "group_id",
topic_key: str = "topic",
content_key: str = "message",
sender_key: str = "agent_id",
)
Bases: _SwarmRuntimeNode
Behavior tree node to send a message to another agent or group.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
to_agent_id |
Static direct-message recipient agent id. |
|
to_agent_key |
State key used to resolve the recipient dynamically. |
|
group_id |
Static group channel id. |
|
group_key |
State key used to resolve the group dynamically. |
|
topic |
Static topic channel name. |
|
topic_key |
State key used to resolve the topic dynamically. |
|
content |
Static message body override. |
|
content_key |
State key used to resolve the message body dynamically. |
|
sender_id |
Static sender id override. |
|
sender_key |
State key used to resolve the sender dynamically. |
|
runtime |
Explicit swarm runtime reference. |
Initialize a node that sends swarm messages.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
name
|
str | None
|
Node name shown in traces and tree views. |
None
|
namespace
|
str | None
|
Optional state namespace for port resolution. |
None
|
runtime
|
Optional[Any]
|
Explicit swarm runtime reference; falls back to state. |
None
|
to_agent_id
|
Optional[str]
|
Static direct-message recipient agent id. |
None
|
group_id
|
Optional[str]
|
Static group channel id. |
None
|
topic
|
Optional[str]
|
Static topic channel name. |
None
|
content
|
Optional[str]
|
Static message body; overrides |
None
|
sender_id
|
Optional[str]
|
Static sender id; overrides |
None
|
to_agent_key
|
str
|
State key for the recipient agent id. |
'to_agent_id'
|
group_key
|
str
|
State key for the group id. |
'group_id'
|
topic_key
|
str
|
State key for the topic name. |
'topic'
|
content_key
|
str
|
State key for the message body. |
'message'
|
sender_key
|
str
|
State key for the sender id. |
'agent_id'
|
源代码位于: jianmu/node/builtin/swarm.py
update_async
async
¶
Send a routed swarm message through the runtime.
返回:
| 类型 | 描述 |
|---|---|
Status
|
|
Status
|
when the runtime, content, or routing target cannot be resolved. |
源代码位于: jianmu/node/builtin/swarm.py
326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 | |
WaitMessage
¶
Bases: Node
Block execution until inbound swarm messages are available.
Initialize a node that waits for inbound messages.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
name
|
str | None
|
Node name shown in traces and tree views. |
None
|
namespace
|
str | None
|
Optional state namespace for port resolution. |
None
|
源代码位于: jianmu/node/builtin/swarm.py
update
¶
Succeed when incoming messages are available.
返回:
| 类型 | 描述 |
|---|---|
Status
|
|
Status
|
otherwise |
源代码位于: jianmu/node/builtin/swarm.py
WaitForever
¶
Bases: Node
Keep execution running indefinitely until interrupted from outside.
Initialize a node that never completes.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
name
|
str | None
|
Node name shown in traces and tree views. |
None
|
namespace
|
str | None
|
Optional state namespace for port resolution. |
None
|
源代码位于: jianmu/node/builtin/swarm.py
SwarmNode
¶
SwarmNode(
name: str | None = None,
*,
namespace: str | None = None,
model_client: Any = None,
skills_dir: str | Path | None = None,
enabled_skills: list[str] | None = None,
explicit_enabled_skills: bool = False,
skill_files: list[str | Path] | None = None,
messages: Sequence[Any] | None = None,
tools: Optional[list[Tool]] = None,
output_schema: Optional[dict[str, Any]] = None,
config: SkillNodeConfig | None = None,
tool_result_policy: ToolResultPolicy | None = None,
tool_result_policy_scope: ToolResultPolicyScope
| None = None,
)
Bases: SkillNode
Behavior tree node that hosts swarm agent execution using skills.
源代码位于: jianmu/node/builtin/skill.py
update
¶
Run the skill node and persist a swarm success flag.
返回:
| 类型 | 描述 |
|---|---|
Status
|
The execution Status of the node. |
源代码位于: jianmu/node/builtin/swarm.py
StateKeys
¶
Bases: BaseModel
Single source of truth for state field naming conventions.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
messages |
str
|
State key for conversation history. |
rounds |
str
|
State key for loop round counters. |
actions |
str
|
State key for model-emitted actions or tool calls. |
done |
str
|
State key indicating workflow completion. |
text_output |
str
|
State key for latest plain-text node output. |
final_answer |
str
|
State key for final user-facing answer text. |
skill_result |
str
|
State key for structured skill outputs. |
usage |
str
|
State key for aggregated model-usage metadata. |
streaming_output |
str
|
State key for incremental streamed text. |
tool_effects |
str
|
State key for aggregated tool-side-effect counters. |
EvaluationStateKeys
¶
Bases: BaseModel
State field routing for EvaluationNode outputs.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
score |
str | None
|
State key receiving the evaluator score. |
reflection |
str | None
|
State key receiving the evaluator reflection text. |
highest_score |
str | None
|
State key tracking the best score so far. |
best_answer |
str | None
|
State key storing the best answer content. |
best_answer_source |
str
|
State key pointing to the answer candidate being scored. |
ReActConfig
¶
Bases: BaseModel
ReAct (Reason + Act) loop configuration.
system_prompt configures the persona/base prompt. The ReAct protocol
prompt and tool descriptions are added by the context builder.
max_iterations is the main agent-loop round limit, not a low-level
tree tick limit.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
model |
str
|
Primary model identifier used for ReAct turns. |
temperature |
float
|
Sampling temperature for generation. |
max_tokens |
Optional[int]
|
Optional output-token cap. |
top_p |
Optional[float]
|
Optional nucleus-sampling parameter. |
top_k |
Optional[int]
|
Optional top-k sampling parameter. |
timeout |
float
|
Provider timeout in seconds. |
stream |
bool
|
Whether streaming responses are requested. |
max_budget_tokens |
Optional[int]
|
Optional budget cap shared with runtime accounting. |
max_iterations |
int
|
Main ReAct loop round limit. |
soft_landing |
bool
|
Whether soft-landing summary behavior is enabled. |
resilience |
ModelResilienceConfig
|
Retry and fallback policy for provider calls. |
system_prompt |
Optional[str]
|
Optional persona/base prompt override. |
tool_choice |
Optional[Any]
|
Provider-specific tool selection directive applied only to the first model round of each ReAct run. |
extra_params |
Dict[str, Any]
|
Additional provider-specific generation parameters. |
keys |
StateKeys
|
State-key mapping used by the preset. |
AgentLLMConfig
¶
Bases: BaseModel
LLM generation parameters plus state routing keys.
system_prompt configures the persona/base prompt. Context presets may
still append protocol, tools, skills, history, and other runtime blocks.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
model |
str
|
Primary model identifier used for inference. |
temperature |
float
|
Sampling temperature for generation. |
max_tokens |
Optional[int]
|
Optional output-token cap. |
top_p |
Optional[float]
|
Optional nucleus-sampling parameter. |
top_k |
Optional[int]
|
Optional top-k sampling parameter. |
timeout |
float
|
Provider timeout in seconds. |
stream |
bool
|
Whether streaming responses are requested. |
max_budget_tokens |
Optional[int]
|
Optional budget cap shared with runtime accounting. |
resilience |
ModelResilienceConfig
|
Retry and fallback policy for provider calls. |
extra_params |
Dict[str, Any]
|
Additional provider-specific generation parameters. |
system_prompt |
Optional[str]
|
Optional persona/base prompt override. |
keys |
StateKeys
|
State-key mapping used by the node. |
ToolExecutorConfig
¶
Bases: BaseModel
Tool executor configuration.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
max_retries |
int
|
Maximum retry count for tool execution failures. |
retry_backoff |
float
|
Backoff delay between retries. |
timeout_s |
float | None
|
Optional timeout in seconds for each tool execution. |
observation_format |
str
|
Format used for tool observations. |
execution_mode |
Literal['auto', 'serial', 'parallel']
|
Tool scheduling mode: auto, serial, or parallel. |
keys |
StateKeys
|
State-key mapping used by the executor. |
PlanExecuteConfig
¶
Bases: BaseModel
Plan-Execute(-Review) loop configuration.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
model |
str
|
Primary model identifier used across the preset. |
temperature |
float
|
Sampling temperature for generation. |
max_tokens |
Optional[int]
|
Optional output-token cap. |
top_p |
Optional[float]
|
Optional nucleus-sampling parameter. |
top_k |
Optional[int]
|
Optional top-k sampling parameter. |
timeout |
float
|
Provider timeout in seconds. |
max_budget_tokens |
Optional[int]
|
Optional budget cap shared with runtime accounting. |
stream |
bool
|
Whether streaming responses are requested. |
max_rounds |
int
|
Maximum plan/execute rounds before termination. |
enable_review |
bool
|
Whether review steps are enabled. |
review_threshold |
float
|
Score threshold for successful review. |
plan_prompt |
Optional[str]
|
Optional custom planning prompt override. |
execute_prompt |
Optional[str]
|
Optional custom execution prompt override. |
review_prompt |
Optional[str]
|
Optional custom review prompt override. |
plan_key |
str
|
State key used to store the plan. |
score_key |
str
|
State key used to store review scores. |
keys |
StateKeys
|
State-key mapping used by the preset. |
node
¶
node(
_func: Optional[Callable[..., Any]] = None,
*,
name: Optional[str] = None,
description: Optional[str] = None,
) -> (
type[FunctionNode]
| Callable[[Callable[..., Any]], type[FunctionNode]]
)
Decorator to wrap a function into a behaviour tree node class.
Can be used with or without arguments::
@node
def my_func(state): ...
@node(name="custom_name")
def my_func(state): ...
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
_func
|
Optional[Callable[..., Any]]
|
The function to wrap when used without parentheses. |
None
|
name
|
Optional[str]
|
Optional node name override (defaults to the function name). |
None
|
description
|
Optional[str]
|
Optional node description (defaults to the function docstring). |
None
|
返回:
| 类型 | 描述 |
|---|---|
type[FunctionNode] | Callable[[Callable[..., Any]], type[FunctionNode]]
|
A |
源代码位于: jianmu/node/decorator.py
create_react_node
¶
create_react_node(
name: str = "ReActAgent",
*,
namespace: Optional[str] = None,
model_client: ModelClient,
tools: Optional[Sequence[Tool]] = None,
tool_providers: Optional[Sequence[ToolProvider]] = None,
tool_provider_context: Optional[Any] = None,
tool_runner: Optional[Any] = None,
constraints: Optional[Any] = None,
context_builder: Optional[
ContextBuilderProtocol
] = None,
config: Optional[ReActConfig] = None,
tool_result_policy: Optional[ToolResultPolicy] = None,
tool_result_policy_scope: Optional[
ToolResultPolicyScope
] = None,
) -> Selector
Build a ReAct subtree with agent, tool, and completion nodes.
This preset assembles the common ReAct loop:
- ask an agent LLM node for the next step
- execute emitted tool calls
- stop once
donebecomes truthy in state
It is the quickest way to build a tool-using agent::
root = create_react_node(
model_client=my_model_client,
tools=[CalculatorTool()],
)
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
name
|
str
|
Root node name for the preset subtree. |
'ReActAgent'
|
namespace
|
Optional[str]
|
Optional state namespace for isolation. |
None
|
model_client
|
ModelClient
|
Model client used by the agent node. |
必需 |
tools
|
Optional[Sequence[Tool]]
|
Static tools available to the agent. |
None
|
tool_providers
|
Optional[Sequence[ToolProvider]]
|
Optional providers that contribute dynamic tools at assembly time. |
None
|
tool_provider_context
|
Optional[Any]
|
Optional context passed to tool providers during collection. |
None
|
tool_runner
|
Optional[Any]
|
Optional explicit tool runner override. |
None
|
constraints
|
Optional[Any]
|
Optional execution/guard constraints shared with the tool executor. |
None
|
context_builder
|
Optional[ContextBuilderProtocol]
|
Optional prompt context builder passed to the agent LLM node. |
None
|
config
|
Optional[ReActConfig]
|
ReAct configuration. Defaults are used when omitted. |
None
|
tool_result_policy
|
Optional[ToolResultPolicy]
|
Optional result policy evaluated after tool execution and before observation commit. |
None
|
tool_result_policy_scope
|
Optional[ToolResultPolicyScope]
|
Optional predicate limiting the calls to
which |
None
|
返回:
| 类型 | 描述 |
|---|---|
Selector
|
Configured looping subtree that runs until the shared |
Selector
|
produced. |
Notes
The preset shares the same state-key mapping across the LLM node and
tool executor. For custom key layouts, pass a tailored ReActConfig.
源代码位于: jianmu/node/presets/react.py
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 | |
create_plan_execute_node
¶
create_plan_execute_node(
name: str = "PlanExecute",
*,
namespace: Optional[str] = None,
model_client: Optional[ModelClient] = None,
tools: Optional[Sequence[Tool]] = None,
tool_providers: Optional[Sequence[ToolProvider]] = None,
tool_provider_context: Optional[Any] = None,
tool_runner: Optional[Any] = None,
constraints: Optional[Any] = None,
config: Optional[PlanExecuteConfig] = None,
) -> LoopUntilSuccess
Build a plan-execute-review preset subtree.
This preset separates planning from execution. The planner writes an intermediate plan, the executor works against tools and message history, and an optional reviewer validates the result before the loop exits.
Use it when a task benefits from explicit decomposition rather than a single ReAct loop.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
name
|
str
|
Root node name for the preset subtree. |
'PlanExecute'
|
namespace
|
Optional[str]
|
Optional state namespace for isolation. |
None
|
model_client
|
Optional[ModelClient]
|
Model client used for planning, execution, and optional
review. When omitted, |
None
|
tools
|
Optional[Sequence[Tool]]
|
Static tools exposed to the executor. |
None
|
tool_providers
|
Optional[Sequence[ToolProvider]]
|
Optional providers that contribute dynamic tools at assembly time. |
None
|
tool_provider_context
|
Optional[Any]
|
Optional context passed to tool providers during collection. |
None
|
tool_runner
|
Optional[Any]
|
Optional explicit tool runner override for tool execution. |
None
|
constraints
|
Optional[Any]
|
Optional execution/guard constraints shared with the tool executor. |
None
|
config
|
Optional[PlanExecuteConfig]
|
Plan-execute configuration. Defaults are used when omitted. |
None
|
返回:
| 类型 | 描述 |
|---|---|
LoopUntilSuccess
|
Configured looping subtree for planning, execution, and optional review. |
Notes
Planner and executor use different logical state keys for their final outputs so the planner's plan does not overwrite the user-facing final answer.
源代码位于: jianmu/node/presets/plan_execute.py
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 | |