penguiflow 2.2.3__py3-none-any.whl → 2.2.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of penguiflow might be problematic. Click here for more details.
- examples/__init__.py +0 -0
- examples/controller_multihop/__init__.py +0 -0
- examples/controller_multihop/flow.py +54 -0
- examples/fanout_join/__init__.py +0 -0
- examples/fanout_join/flow.py +54 -0
- examples/map_concurrent/__init__.py +0 -0
- examples/map_concurrent/flow.py +56 -0
- examples/metadata_propagation/flow.py +61 -0
- examples/mlflow_metrics/__init__.py +1 -0
- examples/mlflow_metrics/flow.py +120 -0
- examples/playbook_retrieval/__init__.py +0 -0
- examples/playbook_retrieval/flow.py +61 -0
- examples/quickstart/__init__.py +0 -0
- examples/quickstart/flow.py +71 -0
- examples/react_minimal/main.py +109 -0
- examples/react_parallel/main.py +121 -0
- examples/react_pause_resume/main.py +157 -0
- examples/react_replan/main.py +133 -0
- examples/reliability_middleware/__init__.py +0 -0
- examples/reliability_middleware/flow.py +67 -0
- examples/roadmap_status_updates/__init__.py +0 -0
- examples/roadmap_status_updates/flow.py +640 -0
- examples/roadmap_status_updates_subflows/__init__.py +0 -0
- examples/roadmap_status_updates_subflows/flow.py +814 -0
- examples/routing_policy/__init__.py +0 -0
- examples/routing_policy/flow.py +89 -0
- examples/routing_predicate/__init__.py +0 -0
- examples/routing_predicate/flow.py +51 -0
- examples/routing_union/__init__.py +0 -0
- examples/routing_union/flow.py +56 -0
- examples/status_roadmap_flow/__init__.py +0 -0
- examples/status_roadmap_flow/flow.py +458 -0
- examples/streaming_llm/__init__.py +3 -0
- examples/streaming_llm/flow.py +77 -0
- examples/testkit_demo/flow.py +34 -0
- examples/trace_cancel/flow.py +79 -0
- examples/traceable_errors/flow.py +51 -0
- examples/visualizer/flow.py +49 -0
- penguiflow/__init__.py +1 -1
- {penguiflow-2.2.3.dist-info → penguiflow-2.2.5.dist-info}/METADATA +4 -1
- penguiflow-2.2.5.dist-info/RECORD +68 -0
- {penguiflow-2.2.3.dist-info → penguiflow-2.2.5.dist-info}/top_level.txt +1 -0
- penguiflow-2.2.3.dist-info/RECORD +0 -30
- {penguiflow-2.2.3.dist-info → penguiflow-2.2.5.dist-info}/WHEEL +0 -0
- {penguiflow-2.2.3.dist-info → penguiflow-2.2.5.dist-info}/entry_points.txt +0 -0
- {penguiflow-2.2.3.dist-info → penguiflow-2.2.5.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"""Mock LLM streaming example."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
from collections import defaultdict
|
|
7
|
+
|
|
8
|
+
from penguiflow import (
|
|
9
|
+
Headers,
|
|
10
|
+
Message,
|
|
11
|
+
Node,
|
|
12
|
+
NodePolicy,
|
|
13
|
+
StreamChunk,
|
|
14
|
+
chunk_to_ws_json,
|
|
15
|
+
create,
|
|
16
|
+
format_sse_event,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
async def mock_llm(message: Message, ctx) -> None:
|
|
21
|
+
"""Emit streaming tokens for an incoming prompt."""
|
|
22
|
+
|
|
23
|
+
prompt = str(message.payload)
|
|
24
|
+
tokens = prompt.split()
|
|
25
|
+
|
|
26
|
+
for idx, token in enumerate(tokens):
|
|
27
|
+
await asyncio.sleep(0.05)
|
|
28
|
+
done = idx == len(tokens) - 1
|
|
29
|
+
text = token + (" " if not done else "")
|
|
30
|
+
await ctx.emit_chunk(
|
|
31
|
+
parent=message,
|
|
32
|
+
text=text,
|
|
33
|
+
done=done,
|
|
34
|
+
meta={"token_index": idx},
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
BUFFERS: defaultdict[str, list[str]] = defaultdict(list)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
async def sse_sink(message: Message, _ctx) -> str | None:
|
|
42
|
+
"""Print Server-Sent Events payloads and return final text when complete."""
|
|
43
|
+
|
|
44
|
+
chunk = message.payload
|
|
45
|
+
assert isinstance(chunk, StreamChunk)
|
|
46
|
+
|
|
47
|
+
buffer = BUFFERS[chunk.stream_id]
|
|
48
|
+
buffer.append(chunk.text)
|
|
49
|
+
|
|
50
|
+
print(format_sse_event(chunk), end="")
|
|
51
|
+
if chunk.done:
|
|
52
|
+
final_text = "".join(BUFFERS.pop(chunk.stream_id))
|
|
53
|
+
print(chunk_to_ws_json(chunk))
|
|
54
|
+
return final_text
|
|
55
|
+
return None
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
async def main() -> None:
|
|
59
|
+
llm_node = Node(mock_llm, name="mock_llm", policy=NodePolicy(validate="none"))
|
|
60
|
+
sink_node = Node(sse_sink, name="sse_sink", policy=NodePolicy(validate="none"))
|
|
61
|
+
flow = create(llm_node.to(sink_node))
|
|
62
|
+
flow.run()
|
|
63
|
+
|
|
64
|
+
message = Message(
|
|
65
|
+
payload="Penguins huddle to stay warm",
|
|
66
|
+
headers=Headers(tenant="demo"),
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
await flow.emit(message)
|
|
70
|
+
final_text = await flow.fetch()
|
|
71
|
+
print(f"final: {final_text}")
|
|
72
|
+
|
|
73
|
+
await flow.stop()
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
if __name__ == "__main__": # pragma: no cover
|
|
77
|
+
asyncio.run(main())
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
|
|
3
|
+
from penguiflow import FinalAnswer, Headers, Message, Node, NodePolicy, create, testkit
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
async def enrich(message: Message, _ctx) -> Message:
|
|
7
|
+
enriched = message.payload + " ⛸️"
|
|
8
|
+
return message.model_copy(update={"payload": enriched})
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
async def finalize(message: Message, _ctx) -> Message:
|
|
12
|
+
answer = FinalAnswer(text=message.payload.upper())
|
|
13
|
+
return message.model_copy(update={"payload": answer})
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
async def main() -> None:
|
|
17
|
+
enrich_node = Node(enrich, name="enrich", policy=NodePolicy(validate="none"))
|
|
18
|
+
final_node = Node(finalize, name="final", policy=NodePolicy(validate="none"))
|
|
19
|
+
flow = create(enrich_node.to(final_node), final_node.to())
|
|
20
|
+
|
|
21
|
+
message = Message(payload="hello penguins", headers=Headers(tenant="demo"))
|
|
22
|
+
|
|
23
|
+
result = await testkit.run_one(flow, message)
|
|
24
|
+
testkit.assert_node_sequence(message.trace_id, ["enrich", "final"])
|
|
25
|
+
|
|
26
|
+
final_answer = result.payload
|
|
27
|
+
if isinstance(final_answer, FinalAnswer):
|
|
28
|
+
print(f"Final answer: {final_answer.text}")
|
|
29
|
+
else:
|
|
30
|
+
print(f"Unexpected payload: {result}")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
if __name__ == "__main__":
|
|
34
|
+
asyncio.run(main())
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from penguiflow import FlowEvent, Headers, Message, Node, NodePolicy, create
|
|
7
|
+
|
|
8
|
+
_started = asyncio.Event()
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def build_cancel_playbook() -> tuple[Any, Any]:
|
|
12
|
+
async def sub_worker(message: Message, _ctx) -> Message:
|
|
13
|
+
print(f"subflow: started for trace {message.trace_id}")
|
|
14
|
+
_started.set()
|
|
15
|
+
try:
|
|
16
|
+
await asyncio.sleep(1.0)
|
|
17
|
+
except asyncio.CancelledError:
|
|
18
|
+
print(f"subflow: received cancellation for trace {message.trace_id}")
|
|
19
|
+
raise
|
|
20
|
+
return message
|
|
21
|
+
|
|
22
|
+
node = Node(sub_worker, name="sub", policy=NodePolicy(validate="none"))
|
|
23
|
+
return create(node.to()), None
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
async def controller(message: Message, ctx) -> Message:
|
|
27
|
+
await ctx.call_playbook(build_cancel_playbook, message)
|
|
28
|
+
return message
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
async def sink(message: Message, _ctx) -> str:
|
|
32
|
+
return str(message.payload)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
async def _metrics_printer(event: FlowEvent) -> None:
|
|
36
|
+
if event.event_type.startswith("trace_cancel"):
|
|
37
|
+
payload = event.to_payload()
|
|
38
|
+
pending = payload.get("trace_pending")
|
|
39
|
+
inflight = payload.get("trace_inflight")
|
|
40
|
+
q_in = payload.get("q_depth_in")
|
|
41
|
+
q_out = payload.get("q_depth_out")
|
|
42
|
+
print(
|
|
43
|
+
f"{event.event_type} pending={pending} inflight={inflight} "
|
|
44
|
+
f"q_in={q_in} q_out={q_out}"
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
async def main() -> None:
|
|
49
|
+
controller_node = Node(
|
|
50
|
+
controller,
|
|
51
|
+
name="controller",
|
|
52
|
+
policy=NodePolicy(validate="none"),
|
|
53
|
+
)
|
|
54
|
+
sink_node = Node(
|
|
55
|
+
sink,
|
|
56
|
+
name="sink",
|
|
57
|
+
policy=NodePolicy(validate="none"),
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
flow = create(controller_node.to(sink_node))
|
|
61
|
+
flow.add_middleware(_metrics_printer)
|
|
62
|
+
flow.run()
|
|
63
|
+
|
|
64
|
+
cancel_msg = Message(payload="cancel-me", headers=Headers(tenant="demo"))
|
|
65
|
+
safe_msg = Message(payload="safe", headers=Headers(tenant="demo"))
|
|
66
|
+
|
|
67
|
+
await flow.emit(cancel_msg)
|
|
68
|
+
await _started.wait()
|
|
69
|
+
await flow.cancel(cancel_msg.trace_id)
|
|
70
|
+
|
|
71
|
+
await flow.emit(safe_msg)
|
|
72
|
+
safe_result = await flow.fetch()
|
|
73
|
+
print(f"safe result: {safe_result}")
|
|
74
|
+
|
|
75
|
+
await flow.stop()
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
if __name__ == "__main__": # pragma: no cover
|
|
79
|
+
asyncio.run(main())
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""Example showcasing FlowError emission to the Rookery."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
|
|
7
|
+
from penguiflow import (
|
|
8
|
+
FlowError,
|
|
9
|
+
Headers,
|
|
10
|
+
Message,
|
|
11
|
+
Node,
|
|
12
|
+
NodePolicy,
|
|
13
|
+
create,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
async def flaky_node(message: Message, _ctx) -> Message:
|
|
18
|
+
raise RuntimeError("external service unavailable")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
async def main() -> None:
|
|
22
|
+
node = Node(
|
|
23
|
+
flaky_node,
|
|
24
|
+
name="flaky", # keep a readable name for error payloads
|
|
25
|
+
policy=NodePolicy(validate="none", max_retries=1, timeout_s=0.05),
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
flow = create(node.to(), emit_errors_to_rookery=True)
|
|
29
|
+
flow.run()
|
|
30
|
+
|
|
31
|
+
message = Message(payload="trigger", headers=Headers(tenant="demo"))
|
|
32
|
+
|
|
33
|
+
await flow.emit(message)
|
|
34
|
+
result = await flow.fetch()
|
|
35
|
+
|
|
36
|
+
if isinstance(result, FlowError):
|
|
37
|
+
payload = result.to_payload()
|
|
38
|
+
print(
|
|
39
|
+
"flow error captured:",
|
|
40
|
+
payload["code"],
|
|
41
|
+
payload.get("message"),
|
|
42
|
+
"trace=", payload.get("trace_id"),
|
|
43
|
+
)
|
|
44
|
+
else: # pragma: no cover - defensive
|
|
45
|
+
print("unexpected result:", result)
|
|
46
|
+
|
|
47
|
+
await flow.stop()
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
if __name__ == "__main__": # pragma: no cover
|
|
51
|
+
asyncio.run(main())
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
from penguiflow import Node, NodePolicy, create, flow_to_dot, flow_to_mermaid
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
async def controller(message: str, ctx) -> str:
|
|
9
|
+
"""Simple controller that loops until it receives STOP."""
|
|
10
|
+
|
|
11
|
+
if message == "STOP":
|
|
12
|
+
return message
|
|
13
|
+
return message
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
async def summarize(message: str, ctx) -> str:
|
|
17
|
+
"""Pretend to summarize the accumulated working memory."""
|
|
18
|
+
|
|
19
|
+
return f"summary:{message}"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def build_flow_diagrams() -> None:
|
|
23
|
+
controller_node = Node(
|
|
24
|
+
controller,
|
|
25
|
+
name="controller",
|
|
26
|
+
allow_cycle=True,
|
|
27
|
+
policy=NodePolicy(validate="none"),
|
|
28
|
+
)
|
|
29
|
+
summarize_node = Node(
|
|
30
|
+
summarize,
|
|
31
|
+
name="summarize",
|
|
32
|
+
policy=NodePolicy(validate="none"),
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
flow = create(controller_node.to(controller_node, summarize_node))
|
|
36
|
+
|
|
37
|
+
mermaid = flow_to_mermaid(flow, direction="LR")
|
|
38
|
+
dot = flow_to_dot(flow, rankdir="LR")
|
|
39
|
+
|
|
40
|
+
base = Path(__file__).parent
|
|
41
|
+
(base / "diagram.md").write_text(f"```mermaid\n{mermaid}\n```\n", encoding="utf-8")
|
|
42
|
+
(base / "diagram.dot").write_text(f"{dot}\n", encoding="utf-8")
|
|
43
|
+
|
|
44
|
+
print("Mermaid diagram written to diagram.md")
|
|
45
|
+
print("DOT diagram written to diagram.dot")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
if __name__ == "__main__": # pragma: no cover - manual example
|
|
49
|
+
build_flow_diagrams()
|
penguiflow/__init__.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: penguiflow
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.5
|
|
4
4
|
Summary: Async agent orchestration primitives.
|
|
5
5
|
Author: PenguiFlow Team
|
|
6
6
|
License: MIT License
|
|
@@ -687,9 +687,12 @@ pytest -q
|
|
|
687
687
|
* `examples/streaming_llm/`: mock LLM emitting streaming chunks to an SSE sink.
|
|
688
688
|
* `examples/metadata_propagation/`: attaching and consuming `Message.meta` context.
|
|
689
689
|
* `examples/visualizer/`: exports Mermaid + DOT diagrams with loop/subflow annotations.
|
|
690
|
+
* `examples/roadmap_status_updates/`: roadmap-aware agent scaffold that streams status updates and final chunks.
|
|
691
|
+
* `examples/status_roadmap_flow/`: roadmap-driven websocket status updates with FlowResponse scaffolding.
|
|
690
692
|
* `examples/react_minimal/`: JSON-only ReactPlanner loop with a stubbed LLM.
|
|
691
693
|
* `examples/react_pause_resume/`: Phase B planner features with pause/resume and developer hints.
|
|
692
694
|
|
|
695
|
+
|
|
693
696
|
---
|
|
694
697
|
|
|
695
698
|
## 🤝 Contributing
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
examples/controller_multihop/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
+
examples/controller_multihop/flow.py,sha256=OWDt62vriJQLbT903xwMSzLodpKu3yNKrsOcTHhRJ54,1335
|
|
4
|
+
examples/fanout_join/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
+
examples/fanout_join/flow.py,sha256=vYV_8BymsEngYXOqr2CESHF6bSZyNE889-LFbIksNp4,1426
|
|
6
|
+
examples/map_concurrent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
|
+
examples/map_concurrent/flow.py,sha256=VwY17FJip1ECLjTjW4ngjvrIGpRQwsYUGd8trjbizUY,1736
|
|
8
|
+
examples/metadata_propagation/flow.py,sha256=j7Jq-5sxSPrwdOgZkQWTeHy40JZjovhqBxY_R_RGmXY,1561
|
|
9
|
+
examples/mlflow_metrics/__init__.py,sha256=wtVt6xOTCKbE-FZWzCFgGdvSVQCU7kgPEw_cC-1g0F8,36
|
|
10
|
+
examples/mlflow_metrics/flow.py,sha256=lXErUrktpoZtg1tySblCIJsBPXn4Q2Z_xwlyp8bgo4s,4108
|
|
11
|
+
examples/playbook_retrieval/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
|
+
examples/playbook_retrieval/flow.py,sha256=QvPsQjZc7syg5hsvIpYmicqQ_MFvC3KQByPeRL4THmw,1922
|
|
13
|
+
examples/quickstart/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
|
+
examples/quickstart/flow.py,sha256=sdMCsjGQy-6aACi-3EgL2yPwEb840L9bo04aGl-tI4k,1743
|
|
15
|
+
examples/react_minimal/main.py,sha256=DI7tkIuo8aRq0f_ztp-w6jYSxPa5_DL2lsSxLE6-AzY,2875
|
|
16
|
+
examples/react_parallel/main.py,sha256=PEiZ7eVCvFFPwTxFxNGJY_5zn-AUsyiEMGZNtFSCz40,3449
|
|
17
|
+
examples/react_pause_resume/main.py,sha256=n-mZWEn5r9PhWbUiq9vizwW8WjvFDi1Xts7h7Fw_5Lg,4758
|
|
18
|
+
examples/react_replan/main.py,sha256=PYffkxojH5hbqUfZH2yW-PQD_VQKsCvyG3SChU2-tFE,3656
|
|
19
|
+
examples/reliability_middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
|
+
examples/reliability_middleware/flow.py,sha256=3NaLLuVaWz5HLqP8BLdygqqLqavgCRAAeMiSWyBuS90,1522
|
|
21
|
+
examples/roadmap_status_updates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
22
|
+
examples/roadmap_status_updates/flow.py,sha256=aPDq8HRPe1LkJeHntlszbf_AUNLujOLCttjXtg5DOoc,19261
|
|
23
|
+
examples/roadmap_status_updates_subflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
24
|
+
examples/roadmap_status_updates_subflows/flow.py,sha256=jMgHt39PyYm5eii4F7qC6qpYtk9RCBh5sL45-giteD4,25698
|
|
25
|
+
examples/routing_policy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
26
|
+
examples/routing_policy/flow.py,sha256=k8zGTDEQ5NPsVL6k1vMUiVKO2YmZaXJeHPS-bd8fq5o,2041
|
|
27
|
+
examples/routing_predicate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
28
|
+
examples/routing_predicate/flow.py,sha256=WtZzhuLqWdjTtkEiBiOGcuHm6VLsNE-9wnjAiNgwUlA,1275
|
|
29
|
+
examples/routing_union/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
30
|
+
examples/routing_union/flow.py,sha256=ynvhYSKqNhr8adf9jJdhW-BwWBJK4Xl3eF73hcPtRJI,1296
|
|
31
|
+
examples/status_roadmap_flow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
32
|
+
examples/status_roadmap_flow/flow.py,sha256=-fVx6DRZin_SuWf2820nQGbFt-6srBZ8iUv1-9aSbFA,14063
|
|
33
|
+
examples/streaming_llm/__init__.py,sha256=l4PbJZqC1LE9iaCqA2Rzt5LNpThEa7ThWngH3diFVCw,51
|
|
34
|
+
examples/streaming_llm/flow.py,sha256=W85Pb91-M6_Q4Tjo9Cg1U42tqFQ6EZmW-qNt1kKXOrM,1872
|
|
35
|
+
examples/testkit_demo/flow.py,sha256=k39Okl6EFO9b1XaQtrbstrpZhWJdNspEQpmT1bRqd1w,1134
|
|
36
|
+
examples/trace_cancel/flow.py,sha256=ml-J7c11vr4tQZdU8fO_fbz-s78zp6-E6US3gM36zvY,2208
|
|
37
|
+
examples/traceable_errors/flow.py,sha256=GqRE8OP13bq1xOdn846V5slENXFR94_waD0uZ3NrhA8,1186
|
|
38
|
+
examples/visualizer/flow.py,sha256=KXjmB71GKwk0-Wq51yI2lL3YJ0DkQxL8y5auzJlIoSw,1326
|
|
39
|
+
penguiflow/__init__.py,sha256=_5YBwcpgfzMOzjyopIVMais4EkdAD612-9GJZUZ-buM,2435
|
|
40
|
+
penguiflow/admin.py,sha256=093xFkE4bM_2ZhLrzhrEUKtmKHi_yVfMPyaGfwi1rcA,5382
|
|
41
|
+
penguiflow/bus.py,sha256=mb29509_n97A6zwC-6EDpYorfAWFSpwqsMu_WeZhLE8,732
|
|
42
|
+
penguiflow/catalog.py,sha256=z-Drf6PbEkvd65PcBvsVJZBBnM9GwT8ctcMdiIoQ5HY,4673
|
|
43
|
+
penguiflow/core.py,sha256=NJrXfu1YbZyzGaXsSIbwFl8LBslAzntU3LiFgvEqz3s,54755
|
|
44
|
+
penguiflow/debug.py,sha256=KPdpWbascsi1ghu-2HPqRORPM2iqkuV6qWyPc0mAalY,945
|
|
45
|
+
penguiflow/errors.py,sha256=mXpCqZ3zdvz7J7Dck_kcw2BGTIm9yrJAjxp_L8KMY7o,3419
|
|
46
|
+
penguiflow/metrics.py,sha256=KsxH9tUqrYfs3EyccLcM0-haYySAByq7RMnK7q61eRA,3989
|
|
47
|
+
penguiflow/middlewares.py,sha256=cB4SrRciNcKHyLanaMVsfMElt3El0LNCj_3dyik07x4,2864
|
|
48
|
+
penguiflow/node.py,sha256=0NOs3rU6t1tHNNwwJopqzM2ufGcp82JpzhckynWBRqs,3563
|
|
49
|
+
penguiflow/patterns.py,sha256=qtzRSNRKxV5_qEPXhffd15PuCZs0YnoGF80nNUsrcxw,5512
|
|
50
|
+
penguiflow/policies.py,sha256=3w8ionnpTyuA0ZCc3jPpB011L7_i1qlbiO6escY024s,4385
|
|
51
|
+
penguiflow/registry.py,sha256=1nR3J1A6jzuevH8EMn83vCkSnnNKgE28CCO6fXMA3wE,2001
|
|
52
|
+
penguiflow/remote.py,sha256=0-2aW48P8OB8KLEC_7_F_RHtzVJk3huyAMBGdXjmWeA,16426
|
|
53
|
+
penguiflow/state.py,sha256=fBY5d_48hR4XHWVG08FraaQ7u4IVPJwooewfVLmzu1Q,1773
|
|
54
|
+
penguiflow/streaming.py,sha256=RKMm4VfaDA2ceEM_pB2Cuhmpwtdcjj7og-kjXQQDcbc,3863
|
|
55
|
+
penguiflow/testkit.py,sha256=pIFYpu1RfJnW2mbGvUkPhMpL-xDAw0E959oTMxLkLh8,11806
|
|
56
|
+
penguiflow/types.py,sha256=Fl56-b7OwIEUbPMDD1CY09nbOG_tmBw3FUhioojeG5M,1503
|
|
57
|
+
penguiflow/viz.py,sha256=KbBb9kKoL223vj0NgJV_jo5ny-0RTc2gcSBACm0jG8w,5508
|
|
58
|
+
penguiflow/planner/__init__.py,sha256=y-dCNIQmkqEgzrnVqQSU6i2tB0dwqjb7LgG2lhtLJJ8,459
|
|
59
|
+
penguiflow/planner/prompts.py,sha256=R9LveYlp6JbSIBcZiRjTZYu-eKk3fgrKZH0Jf3pNVvM,7551
|
|
60
|
+
penguiflow/planner/react.py,sha256=WP0WvoDShKf5k0jHLiFtUT4ns5YAgWW348C1YEdkSXo,50321
|
|
61
|
+
penguiflow-2.2.5.dist-info/licenses/LICENSE,sha256=JSvodvLXxSct_kI9IBsZOBpVKoESQTB_AGbkClwZ7HI,1065
|
|
62
|
+
penguiflow_a2a/__init__.py,sha256=JuK_ov06yS2H97D2OVXhgX8LcgdOqE3EujUPaDKaduc,342
|
|
63
|
+
penguiflow_a2a/server.py,sha256=VMBO-oGjB6Z9mtRBU0z7ZFGprDUC_kihZJukh3budbs,25932
|
|
64
|
+
penguiflow-2.2.5.dist-info/METADATA,sha256=96CpD4IUHfPShON7ZTzbeb-itGc5hXkmyjy6MDI5zuI,28150
|
|
65
|
+
penguiflow-2.2.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
66
|
+
penguiflow-2.2.5.dist-info/entry_points.txt,sha256=F2KxANLEVGRbpWLmcHcvYrTVLWbKWdmk3VOe98a7t9I,59
|
|
67
|
+
penguiflow-2.2.5.dist-info/top_level.txt,sha256=3vpgBt9ye3flT7bZ2cM0D5_eGk0xt_k8x5X9SizoW_g,35
|
|
68
|
+
penguiflow-2.2.5.dist-info/RECORD,,
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
penguiflow/__init__.py,sha256=NeujEqgD0FZg1Oy4F_tyhXIdFm1EDp1DQdHWBt8TSF8,2435
|
|
2
|
-
penguiflow/admin.py,sha256=093xFkE4bM_2ZhLrzhrEUKtmKHi_yVfMPyaGfwi1rcA,5382
|
|
3
|
-
penguiflow/bus.py,sha256=mb29509_n97A6zwC-6EDpYorfAWFSpwqsMu_WeZhLE8,732
|
|
4
|
-
penguiflow/catalog.py,sha256=z-Drf6PbEkvd65PcBvsVJZBBnM9GwT8ctcMdiIoQ5HY,4673
|
|
5
|
-
penguiflow/core.py,sha256=NJrXfu1YbZyzGaXsSIbwFl8LBslAzntU3LiFgvEqz3s,54755
|
|
6
|
-
penguiflow/debug.py,sha256=KPdpWbascsi1ghu-2HPqRORPM2iqkuV6qWyPc0mAalY,945
|
|
7
|
-
penguiflow/errors.py,sha256=mXpCqZ3zdvz7J7Dck_kcw2BGTIm9yrJAjxp_L8KMY7o,3419
|
|
8
|
-
penguiflow/metrics.py,sha256=KsxH9tUqrYfs3EyccLcM0-haYySAByq7RMnK7q61eRA,3989
|
|
9
|
-
penguiflow/middlewares.py,sha256=cB4SrRciNcKHyLanaMVsfMElt3El0LNCj_3dyik07x4,2864
|
|
10
|
-
penguiflow/node.py,sha256=0NOs3rU6t1tHNNwwJopqzM2ufGcp82JpzhckynWBRqs,3563
|
|
11
|
-
penguiflow/patterns.py,sha256=qtzRSNRKxV5_qEPXhffd15PuCZs0YnoGF80nNUsrcxw,5512
|
|
12
|
-
penguiflow/policies.py,sha256=3w8ionnpTyuA0ZCc3jPpB011L7_i1qlbiO6escY024s,4385
|
|
13
|
-
penguiflow/registry.py,sha256=1nR3J1A6jzuevH8EMn83vCkSnnNKgE28CCO6fXMA3wE,2001
|
|
14
|
-
penguiflow/remote.py,sha256=0-2aW48P8OB8KLEC_7_F_RHtzVJk3huyAMBGdXjmWeA,16426
|
|
15
|
-
penguiflow/state.py,sha256=fBY5d_48hR4XHWVG08FraaQ7u4IVPJwooewfVLmzu1Q,1773
|
|
16
|
-
penguiflow/streaming.py,sha256=RKMm4VfaDA2ceEM_pB2Cuhmpwtdcjj7og-kjXQQDcbc,3863
|
|
17
|
-
penguiflow/testkit.py,sha256=pIFYpu1RfJnW2mbGvUkPhMpL-xDAw0E959oTMxLkLh8,11806
|
|
18
|
-
penguiflow/types.py,sha256=Fl56-b7OwIEUbPMDD1CY09nbOG_tmBw3FUhioojeG5M,1503
|
|
19
|
-
penguiflow/viz.py,sha256=KbBb9kKoL223vj0NgJV_jo5ny-0RTc2gcSBACm0jG8w,5508
|
|
20
|
-
penguiflow/planner/__init__.py,sha256=y-dCNIQmkqEgzrnVqQSU6i2tB0dwqjb7LgG2lhtLJJ8,459
|
|
21
|
-
penguiflow/planner/prompts.py,sha256=R9LveYlp6JbSIBcZiRjTZYu-eKk3fgrKZH0Jf3pNVvM,7551
|
|
22
|
-
penguiflow/planner/react.py,sha256=WP0WvoDShKf5k0jHLiFtUT4ns5YAgWW348C1YEdkSXo,50321
|
|
23
|
-
penguiflow-2.2.3.dist-info/licenses/LICENSE,sha256=JSvodvLXxSct_kI9IBsZOBpVKoESQTB_AGbkClwZ7HI,1065
|
|
24
|
-
penguiflow_a2a/__init__.py,sha256=JuK_ov06yS2H97D2OVXhgX8LcgdOqE3EujUPaDKaduc,342
|
|
25
|
-
penguiflow_a2a/server.py,sha256=VMBO-oGjB6Z9mtRBU0z7ZFGprDUC_kihZJukh3budbs,25932
|
|
26
|
-
penguiflow-2.2.3.dist-info/METADATA,sha256=EI229Uw4qXvAnK3eNPoReka1Xz8sFVtEP5ZMbGpZyT0,27930
|
|
27
|
-
penguiflow-2.2.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
28
|
-
penguiflow-2.2.3.dist-info/entry_points.txt,sha256=F2KxANLEVGRbpWLmcHcvYrTVLWbKWdmk3VOe98a7t9I,59
|
|
29
|
-
penguiflow-2.2.3.dist-info/top_level.txt,sha256=K-fTwLA14n0u_LDxDBCV7FmeBnJffhTOtUbTtOymQns,26
|
|
30
|
-
penguiflow-2.2.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|