flock-core 0.1.2__py3-none-any.whl → 0.2.2__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 flock-core might be problematic. Click here for more details.
- flock/__init__.py +1 -4
- flock/core/__init__.py +1 -7
- flock/core/context/context.py +182 -0
- flock/core/context/context_manager.py +34 -0
- flock/core/{context_vars.py → context/context_vars.py} +8 -6
- flock/core/execution/local_executor.py +27 -0
- flock/core/execution/temporal_executor.py +56 -0
- flock/core/flock.py +232 -208
- flock/core/flock_agent.py +574 -0
- flock/core/logging/__init__.py +2 -18
- flock/core/logging/formatters/base_formatter.py +36 -0
- flock/core/logging/formatters/formatter_factory.py +38 -0
- flock/core/logging/formatters/pprint_formatter.py +18 -0
- flock/core/logging/formatters/rich_formatters.py +132 -0
- flock/core/logging/formatters/theme_builder.py +480 -0
- flock/core/logging/formatters/themed_formatter.py +442 -0
- flock/core/logging/logging.py +141 -0
- flock/core/logging/telemetry.py +21 -0
- flock/core/logging/trace_and_logged.py +55 -0
- flock/core/mixin/dspy_integration.py +197 -0
- flock/core/mixin/prompt_parser.py +125 -0
- flock/core/registry/agent_registry.py +118 -0
- flock/core/tools/basic_tools.py +296 -98
- flock/core/tools/dev_tools/github.py +190 -0
- flock/core/util/cli_helper.py +25 -0
- flock/core/util/input_resolver.py +156 -0
- flock/core/util/serializable.py +93 -0
- flock/themes/3024-day.toml +39 -0
- flock/themes/3024-night.toml +77 -0
- flock/themes/aardvark-blue.toml +77 -0
- flock/themes/abernathy.toml +77 -0
- flock/themes/adventure.toml +77 -0
- flock/themes/adventuretime.toml +77 -0
- flock/themes/afterglow.toml +77 -0
- flock/themes/alabaster.toml +77 -0
- flock/themes/alienblood.toml +77 -0
- flock/themes/andromeda.toml +77 -0
- flock/themes/apple-classic.toml +77 -0
- flock/themes/apple-system-colors.toml +77 -0
- flock/themes/arcoiris.toml +77 -0
- flock/themes/argonaut copy.toml +77 -0
- flock/themes/argonaut.toml +39 -0
- flock/themes/arthur.toml +77 -0
- flock/themes/ateliersulphurpool.toml +77 -0
- flock/themes/atom.toml +38 -0
- flock/themes/atom_test.toml +65 -0
- flock/themes/atomonelight.toml +77 -0
- flock/themes/aurora.toml +77 -0
- flock/themes/ayu copy.toml +77 -0
- flock/themes/ayu-light.toml +77 -0
- flock/themes/ayu-mirage.toml +77 -0
- flock/themes/ayu.toml +39 -0
- flock/themes/banana-blueberry.toml +77 -0
- flock/themes/batman.toml +77 -0
- flock/themes/belafonte-day.toml +77 -0
- flock/themes/belafonte-night.toml +77 -0
- flock/themes/birdsofparadise.toml +77 -0
- flock/themes/blazer.toml +77 -0
- flock/themes/blue-matrix.toml +77 -0
- flock/themes/blueberrypie.toml +77 -0
- flock/themes/bluedolphin.toml +77 -0
- flock/themes/blulocodark.toml +77 -0
- flock/themes/blulocolight.toml +77 -0
- flock/themes/borland.toml +77 -0
- flock/themes/breeze.toml +77 -0
- flock/themes/bright-lights.toml +77 -0
- flock/themes/broadcast.toml +77 -0
- flock/themes/brogrammer.toml +77 -0
- flock/themes/builtin-dark.toml +77 -0
- flock/themes/builtin-light.toml +77 -0
- flock/themes/builtin-pastel-dark.toml +77 -0
- flock/themes/builtin-solarized-dark.toml +77 -0
- flock/themes/builtin-solarized-light.toml +77 -0
- flock/themes/builtin-tango-dark.toml +77 -0
- flock/themes/builtin-tango-light.toml +77 -0
- flock/themes/c64.toml +77 -0
- flock/themes/calamity.toml +77 -0
- flock/themes/catppuccin-frappe.toml +77 -0
- flock/themes/catppuccin-latte.toml +77 -0
- flock/themes/catppuccin-macchiato.toml +77 -0
- flock/themes/catppuccin-mocha.toml +77 -0
- flock/themes/cga.toml +77 -0
- flock/themes/chalk.toml +77 -0
- flock/themes/chalkboard.toml +77 -0
- flock/themes/challengerdeep.toml +77 -0
- flock/themes/chester.toml +77 -0
- flock/themes/ciapre.toml +77 -0
- flock/themes/clrs.toml +77 -0
- flock/themes/cobalt-neon.toml +77 -0
- flock/themes/cobalt2.toml +77 -0
- flock/themes/coffee-theme.toml +77 -0
- flock/themes/crayonponyfish.toml +77 -0
- flock/themes/cutiepro.toml +77 -0
- flock/themes/cyberdyne.toml +77 -0
- flock/themes/cyberpunk.toml +77 -0
- flock/themes/cyberpunkscarletprotocol.toml +77 -0
- flock/themes/dark+.toml +77 -0
- flock/themes/dark-pastel.toml +77 -0
- flock/themes/darkermatrix.toml +77 -0
- flock/themes/darkmatrix.toml +77 -0
- flock/themes/darkside.toml +77 -0
- flock/themes/dayfox.toml +77 -0
- flock/themes/deep.toml +77 -0
- flock/themes/desert.toml +77 -0
- flock/themes/dimidium.toml +77 -0
- flock/themes/dimmedmonokai.toml +77 -0
- flock/themes/django.toml +77 -0
- flock/themes/djangorebornagain.toml +77 -0
- flock/themes/djangosmooth.toml +77 -0
- flock/themes/doom-peacock.toml +77 -0
- flock/themes/doomone.toml +77 -0
- flock/themes/dotgov.toml +77 -0
- flock/themes/dracula+.toml +77 -0
- flock/themes/dracula.toml +77 -0
- flock/themes/duckbones.toml +77 -0
- flock/themes/duotone-dark.toml +77 -0
- flock/themes/earthsong.toml +77 -0
- flock/themes/elemental.toml +77 -0
- flock/themes/elementary.toml +77 -0
- flock/themes/encom.toml +77 -0
- flock/themes/espresso-libre.toml +77 -0
- flock/themes/espresso.toml +77 -0
- flock/themes/everblush.toml +77 -0
- flock/themes/fahrenheit.toml +77 -0
- flock/themes/fairyfloss.toml +77 -0
- flock/themes/farmhouse-dark.toml +77 -0
- flock/themes/farmhouse-light.toml +77 -0
- flock/themes/fideloper.toml +77 -0
- flock/themes/firefly-traditional.toml +77 -0
- flock/themes/firefoxdev.toml +77 -0
- flock/themes/firewatch.toml +77 -0
- flock/themes/fishtank.toml +77 -0
- flock/themes/flat.toml +77 -0
- flock/themes/flatland.toml +77 -0
- flock/themes/flexoki-dark.toml +77 -0
- flock/themes/flexoki-light.toml +77 -0
- flock/themes/floraverse.toml +77 -0
- flock/themes/forestblue.toml +77 -0
- flock/themes/framer.toml +77 -0
- flock/themes/frontenddelight.toml +77 -0
- flock/themes/funforrest.toml +77 -0
- flock/themes/galaxy.toml +77 -0
- flock/themes/galizur.toml +77 -0
- flock/themes/github-dark.toml +77 -0
- flock/themes/github.toml +77 -0
- flock/themes/glacier.toml +77 -0
- flock/themes/grape.toml +77 -0
- flock/themes/grass.toml +77 -0
- flock/themes/grey-green.toml +77 -0
- flock/themes/gruber-darker.toml +77 -0
- flock/themes/gruvboxdark.toml +77 -0
- flock/themes/gruvboxdarkhard.toml +77 -0
- flock/themes/gruvboxlight.toml +77 -0
- flock/themes/guezwhoz.toml +77 -0
- flock/themes/hacktober.toml +77 -0
- flock/themes/hardcore.toml +77 -0
- flock/themes/harper.toml +77 -0
- flock/themes/hax0r-blue.toml +77 -0
- flock/themes/hax0r-gr33n.toml +77 -0
- flock/themes/hax0r-r3d.toml +77 -0
- flock/themes/highway.toml +77 -0
- flock/themes/hipster-green.toml +77 -0
- flock/themes/hivacruz.toml +77 -0
- flock/themes/homebrew.toml +77 -0
- flock/themes/hopscotch.256.toml +77 -0
- flock/themes/hopscotch.toml +77 -0
- flock/themes/hurtado.toml +77 -0
- flock/themes/hybrid.toml +77 -0
- flock/themes/ic-green-ppl.toml +77 -0
- flock/themes/ic-orange-ppl.toml +77 -0
- flock/themes/iceberg-dark.toml +77 -0
- flock/themes/iceberg-light.toml +77 -0
- flock/themes/idea.toml +77 -0
- flock/themes/idletoes.toml +77 -0
- flock/themes/ir-black.toml +77 -0
- flock/themes/iterm2-dark-background.toml +77 -0
- flock/themes/iterm2-default.toml +77 -0
- flock/themes/iterm2-light-background.toml +77 -0
- flock/themes/iterm2-pastel-dark-background.toml +77 -0
- flock/themes/iterm2-smoooooth.toml +77 -0
- flock/themes/iterm2-solarized-dark.toml +77 -0
- flock/themes/iterm2-solarized-light.toml +77 -0
- flock/themes/iterm2-tango-dark.toml +77 -0
- flock/themes/iterm2-tango-light.toml +77 -0
- flock/themes/jackie-brown.toml +77 -0
- flock/themes/japanesque.toml +77 -0
- flock/themes/jellybeans.toml +77 -0
- flock/themes/jetbrains-darcula.toml +77 -0
- flock/themes/jubi.toml +77 -0
- flock/themes/kanagawabones.toml +77 -0
- flock/themes/kibble.toml +77 -0
- flock/themes/kolorit.toml +77 -0
- flock/themes/konsolas.toml +77 -0
- flock/themes/kurokula.toml +77 -0
- flock/themes/lab-fox.toml +77 -0
- flock/themes/laser.toml +77 -0
- flock/themes/later-this-evening.toml +77 -0
- flock/themes/lavandula.toml +77 -0
- flock/themes/liquidcarbon.toml +77 -0
- flock/themes/liquidcarbontransparent.toml +77 -0
- flock/themes/liquidcarbontransparentinverse.toml +77 -0
- flock/themes/lovelace.toml +77 -0
- flock/themes/man-page.toml +77 -0
- flock/themes/mariana.toml +77 -0
- flock/themes/material.toml +77 -0
- flock/themes/materialdark.toml +77 -0
- flock/themes/materialdarker.toml +77 -0
- flock/themes/materialdesigncolors.toml +77 -0
- flock/themes/materialocean.toml +77 -0
- flock/themes/mathias.toml +77 -0
- flock/themes/matrix.toml +77 -0
- flock/themes/medallion.toml +77 -0
- flock/themes/mellifluous.toml +77 -0
- flock/themes/midnight-in-mojave.toml +77 -0
- flock/themes/mirage.toml +77 -0
- flock/themes/misterioso.toml +77 -0
- flock/themes/molokai.toml +77 -0
- flock/themes/monalisa.toml +77 -0
- flock/themes/monokai-remastered.toml +77 -0
- flock/themes/monokai-soda.toml +77 -0
- flock/themes/monokai-vivid.toml +77 -0
- flock/themes/n0tch2k.toml +77 -0
- flock/themes/neobones-dark.toml +77 -0
- flock/themes/neobones-light.toml +77 -0
- flock/themes/neon.toml +77 -0
- flock/themes/neopolitan.toml +77 -0
- flock/themes/neutron.toml +77 -0
- flock/themes/night-owlish-light.toml +77 -0
- flock/themes/nightfox.toml +77 -0
- flock/themes/nightlion-v1.toml +77 -0
- flock/themes/nightlion-v2.toml +77 -0
- flock/themes/niji.toml +77 -0
- flock/themes/nocturnal-winter.toml +77 -0
- flock/themes/nord-light.toml +77 -0
- flock/themes/nord.toml +77 -0
- flock/themes/novel.toml +77 -0
- flock/themes/nvimdark.toml +77 -0
- flock/themes/nvimlight.toml +77 -0
- flock/themes/obsidian.toml +77 -0
- flock/themes/ocean.toml +77 -0
- flock/themes/oceanic-next.toml +77 -0
- flock/themes/oceanicmaterial.toml +77 -0
- flock/themes/ollie.toml +77 -0
- flock/themes/onehalfdark.toml +77 -0
- flock/themes/onehalflight.toml +77 -0
- flock/themes/operator-mono-dark.toml +77 -0
- flock/themes/overnight-slumber.toml +77 -0
- flock/themes/oxocarbon.toml +77 -0
- flock/themes/palenighthc.toml +77 -0
- flock/themes/pandora.toml +77 -0
- flock/themes/paraiso-dark.toml +77 -0
- flock/themes/paulmillr.toml +77 -0
- flock/themes/pencildark.toml +77 -0
- flock/themes/pencillight.toml +77 -0
- flock/themes/peppermint.toml +77 -0
- flock/themes/piatto-light.toml +77 -0
- flock/themes/pnevma.toml +77 -0
- flock/themes/popping-and-locking.toml +77 -0
- flock/themes/primary.toml +77 -0
- flock/themes/pro-light.toml +77 -0
- flock/themes/pro.toml +77 -0
- flock/themes/purple-rain.toml +77 -0
- flock/themes/purplepeter.toml +77 -0
- flock/themes/rapture.toml +77 -0
- flock/themes/raycast-dark.toml +77 -0
- flock/themes/raycast-light.toml +77 -0
- flock/themes/rebecca.toml +77 -0
- flock/themes/red-alert.toml +77 -0
- flock/themes/red-planet.toml +77 -0
- flock/themes/red-sands.toml +77 -0
- flock/themes/relaxed.toml +77 -0
- flock/themes/retro.toml +77 -0
- flock/themes/rippedcasts.toml +77 -0
- flock/themes/rose-pine-dawn.toml +77 -0
- flock/themes/rose-pine-moon.toml +77 -0
- flock/themes/rose-pine.toml +77 -0
- flock/themes/rouge-2.toml +77 -0
- flock/themes/royal.toml +77 -0
- flock/themes/ryuuko.toml +77 -0
- flock/themes/sakura.toml +77 -0
- flock/themes/scarlet-protocol.toml +77 -0
- flock/themes/seafoam-pastel.toml +77 -0
- flock/themes/seashells.toml +77 -0
- flock/themes/seoulbones-dark.toml +77 -0
- flock/themes/seoulbones-light.toml +77 -0
- flock/themes/seti.toml +77 -0
- flock/themes/shades-of-purple.toml +77 -0
- flock/themes/shaman.toml +77 -0
- flock/themes/slate.toml +77 -0
- flock/themes/sleepyhollow.toml +77 -0
- flock/themes/smyck.toml +77 -0
- flock/themes/snazzy.toml +77 -0
- flock/themes/softserver.toml +77 -0
- flock/themes/solarized-darcula.toml +77 -0
- flock/themes/solarized-dark---patched.toml +77 -0
- flock/themes/solarized-dark-higher-contrast.toml +77 -0
- flock/themes/spacedust.toml +77 -0
- flock/themes/spacegray-eighties-dull.toml +77 -0
- flock/themes/spacegray-eighties.toml +77 -0
- flock/themes/spacegray.toml +77 -0
- flock/themes/spiderman.toml +77 -0
- flock/themes/spring.toml +77 -0
- flock/themes/square.toml +77 -0
- flock/themes/sublette.toml +77 -0
- flock/themes/subliminal.toml +77 -0
- flock/themes/sugarplum.toml +77 -0
- flock/themes/sundried.toml +77 -0
- flock/themes/symfonic.toml +77 -0
- flock/themes/synthwave-everything.toml +77 -0
- flock/themes/synthwave.toml +77 -0
- flock/themes/synthwavealpha.toml +77 -0
- flock/themes/tango-adapted.toml +77 -0
- flock/themes/tango-half-adapted.toml +77 -0
- flock/themes/teerb.toml +77 -0
- flock/themes/terafox.toml +77 -0
- flock/themes/terminal-basic.toml +77 -0
- flock/themes/thayer-bright.toml +77 -0
- flock/themes/the-hulk.toml +77 -0
- flock/themes/tinacious-design-(dark).toml +77 -0
- flock/themes/tinacious-design-(light).toml +77 -0
- flock/themes/tokyonight-day.toml +77 -0
- flock/themes/tokyonight-storm.toml +77 -0
- flock/themes/tokyonight.toml +77 -0
- flock/themes/tomorrow-night-blue.toml +77 -0
- flock/themes/tomorrow-night-bright.toml +77 -0
- flock/themes/tomorrow-night-burns.toml +77 -0
- flock/themes/tomorrow-night-eighties.toml +77 -0
- flock/themes/tomorrow-night.toml +77 -0
- flock/themes/tomorrow.toml +77 -0
- flock/themes/toychest.toml +77 -0
- flock/themes/treehouse.toml +77 -0
- flock/themes/twilight.toml +77 -0
- flock/themes/ubuntu.toml +77 -0
- flock/themes/ultradark.toml +77 -0
- flock/themes/ultraviolent.toml +77 -0
- flock/themes/underthesea.toml +77 -0
- flock/themes/unikitty.toml +77 -0
- flock/themes/urple.toml +77 -0
- flock/themes/vaughn.toml +77 -0
- flock/themes/vesper.toml +77 -0
- flock/themes/vibrantink.toml +77 -0
- flock/themes/vimbones.toml +77 -0
- flock/themes/violet-dark.toml +77 -0
- flock/themes/violet-light.toml +77 -0
- flock/themes/warmneon.toml +77 -0
- flock/themes/wez.toml +77 -0
- flock/themes/whimsy.toml +77 -0
- flock/themes/wildcherry.toml +77 -0
- flock/themes/wilmersdorf.toml +77 -0
- flock/themes/wombat.toml +77 -0
- flock/themes/wryan.toml +77 -0
- flock/themes/xcodedark.toml +77 -0
- flock/themes/xcodedarkhc.toml +77 -0
- flock/themes/xcodelight.toml +77 -0
- flock/themes/xcodelighthc.toml +77 -0
- flock/themes/xcodewwdc.toml +77 -0
- flock/themes/zenbones-dark.toml +77 -0
- flock/themes/zenbones-light.toml +77 -0
- flock/themes/zenbones.toml +77 -0
- flock/themes/zenburn.toml +77 -0
- flock/themes/zenburned.toml +77 -0
- flock/themes/zenwritten-dark.toml +77 -0
- flock/themes/zenwritten-light.toml +77 -0
- flock/workflow/activities.py +175 -115
- flock/workflow/agent_activities.py +24 -26
- flock/workflow/temporal_setup.py +38 -37
- flock/workflow/workflow.py +58 -53
- flock_core-0.2.2.dist-info/METADATA +320 -0
- flock_core-0.2.2.dist-info/RECORD +372 -0
- {flock_core-0.1.2.dist-info → flock_core-0.2.2.dist-info}/licenses/LICENSE +21 -21
- flock/agents/__init__.py +0 -3
- flock/agents/batch_agent.py +0 -175
- flock/agents/declarative_agent.py +0 -166
- flock/agents/loop_agent.py +0 -178
- flock/agents/trigger_agent.py +0 -191
- flock/agents/user_agent.py +0 -230
- flock/app/components/__init__.py +0 -14
- flock/app/components/charts/agent_workflow.py +0 -14
- flock/app/components/charts/core_architecture.py +0 -14
- flock/app/components/charts/tool_system.py +0 -14
- flock/app/components/history_grid.py +0 -168
- flock/app/components/history_grid_alt.py +0 -189
- flock/app/components/sidebar.py +0 -19
- flock/app/components/theme.py +0 -9
- flock/app/components/util.py +0 -18
- flock/app/hive_app.py +0 -118
- flock/app/html/d3.html +0 -179
- flock/app/modules/__init__.py +0 -12
- flock/app/modules/about.py +0 -17
- flock/app/modules/agent_detail.py +0 -70
- flock/app/modules/agent_list.py +0 -59
- flock/app/modules/playground.py +0 -322
- flock/app/modules/settings.py +0 -96
- flock/core/agent.py +0 -150
- flock/core/agent_registry.py +0 -162
- flock/core/context.py +0 -279
- flock/core/handoff/handoff_base.py +0 -12
- flock/core/logging/error_handler.py +0 -84
- flock/core/logging/formatters.py +0 -122
- flock/core/logging/handlers.py +0 -117
- flock/core/logging/logger.py +0 -107
- flock/core/serializable.py +0 -206
- flock_core-0.1.2.dist-info/METADATA +0 -476
- flock_core-0.1.2.dist-info/RECORD +0 -48
- flock_core-0.1.2.dist-info/entry_points.txt +0 -2
- /flock/{core/config/declarative_agent_config.py → workflow/__init__.py} +0 -0
- {flock_core-0.1.2.dist-info → flock_core-0.2.2.dist-info}/WHEEL +0 -0
flock/workflow/activities.py
CHANGED
|
@@ -1,115 +1,175 @@
|
|
|
1
|
-
"""Defines Temporal activities for running a chain of agents."""
|
|
2
|
-
|
|
3
|
-
from datetime import datetime
|
|
4
|
-
|
|
5
|
-
from
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
from flock.core.
|
|
9
|
-
from flock.core.context import
|
|
10
|
-
from flock.core.
|
|
11
|
-
from flock.core.
|
|
12
|
-
from flock.core.logging import
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
1
|
+
"""Defines Temporal activities for running a chain of agents with logging and tracing."""
|
|
2
|
+
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
|
|
5
|
+
from opentelemetry import trace
|
|
6
|
+
from temporalio import activity
|
|
7
|
+
|
|
8
|
+
from flock.core.context.context import FlockContext
|
|
9
|
+
from flock.core.context.context_vars import FLOCK_CURRENT_AGENT
|
|
10
|
+
from flock.core.flock_agent import FlockAgent, HandOff
|
|
11
|
+
from flock.core.logging.formatters.base_formatter import FormatterOptions
|
|
12
|
+
from flock.core.logging.formatters.formatter_factory import FormatterFactory
|
|
13
|
+
from flock.core.logging.logging import get_logger
|
|
14
|
+
from flock.core.registry.agent_registry import Registry
|
|
15
|
+
from flock.core.util.input_resolver import resolve_inputs
|
|
16
|
+
|
|
17
|
+
logger = get_logger("activities")
|
|
18
|
+
tracer = trace.get_tracer(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@activity.defn
|
|
22
|
+
async def run_agent(
|
|
23
|
+
context: FlockContext, output_formatter: FormatterOptions = None
|
|
24
|
+
) -> dict:
|
|
25
|
+
"""Runs a chain of agents using the provided context.
|
|
26
|
+
|
|
27
|
+
The context contains state, history, and agent definitions.
|
|
28
|
+
After each agent run, its output is merged into the context.
|
|
29
|
+
"""
|
|
30
|
+
# Start a top-level span for the entire run_agent activity.
|
|
31
|
+
with tracer.start_as_current_span("run_agent") as span:
|
|
32
|
+
registry = Registry()
|
|
33
|
+
previous_agent_name = ""
|
|
34
|
+
if isinstance(context, dict):
|
|
35
|
+
context = FlockContext.from_dict(context)
|
|
36
|
+
current_agent_name = context.get_variable(FLOCK_CURRENT_AGENT)
|
|
37
|
+
span.set_attribute("initial.agent", current_agent_name)
|
|
38
|
+
logger.info("Starting agent chain", initial_agent=current_agent_name)
|
|
39
|
+
|
|
40
|
+
agent = registry.get_agent(current_agent_name)
|
|
41
|
+
agent.resolve_callables(context=context)
|
|
42
|
+
if not agent:
|
|
43
|
+
logger.error("Agent not found", agent=current_agent_name)
|
|
44
|
+
span.record_exception(
|
|
45
|
+
Exception(f"Agent '{current_agent_name}' not found")
|
|
46
|
+
)
|
|
47
|
+
return {"error": f"Agent '{current_agent_name}' not found."}
|
|
48
|
+
|
|
49
|
+
# Loop over agents in the chain.
|
|
50
|
+
while agent:
|
|
51
|
+
# Create a nested span for this iteration.
|
|
52
|
+
with tracer.start_as_current_span("agent_iteration") as iter_span:
|
|
53
|
+
iter_span.set_attribute("agent.name", agent.name)
|
|
54
|
+
|
|
55
|
+
# Resolve inputs for the agent.
|
|
56
|
+
agent_inputs = resolve_inputs(
|
|
57
|
+
agent.input, context, previous_agent_name
|
|
58
|
+
)
|
|
59
|
+
iter_span.add_event(
|
|
60
|
+
"resolved inputs", attributes={"inputs": str(agent_inputs)}
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
# Execute the agent with its own span.
|
|
64
|
+
with tracer.start_as_current_span("execute_agent") as exec_span:
|
|
65
|
+
logger.info("Executing agent", agent=agent.name)
|
|
66
|
+
try:
|
|
67
|
+
result = await agent.run(agent_inputs)
|
|
68
|
+
exec_span.set_attribute("result", str(result))
|
|
69
|
+
logger.debug(
|
|
70
|
+
"Agent execution completed", agent=agent.name
|
|
71
|
+
)
|
|
72
|
+
except Exception as e:
|
|
73
|
+
logger.error(
|
|
74
|
+
"Agent execution failed",
|
|
75
|
+
agent=agent.name,
|
|
76
|
+
error=str(e),
|
|
77
|
+
)
|
|
78
|
+
exec_span.record_exception(e)
|
|
79
|
+
raise
|
|
80
|
+
|
|
81
|
+
# Optionally display formatted output.
|
|
82
|
+
display_output = True
|
|
83
|
+
if agent.config:
|
|
84
|
+
display_output = not agent.config.disable_output
|
|
85
|
+
|
|
86
|
+
if output_formatter and display_output:
|
|
87
|
+
formatter = FormatterFactory.create_formatter(
|
|
88
|
+
output_formatter
|
|
89
|
+
)
|
|
90
|
+
formatter.display(
|
|
91
|
+
result, agent.name, output_formatter.wait_for_input
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
# If there is no handoff, record the result and finish.
|
|
95
|
+
if not agent.hand_off:
|
|
96
|
+
context.record(
|
|
97
|
+
agent.name,
|
|
98
|
+
result,
|
|
99
|
+
timestamp=datetime.now(),
|
|
100
|
+
hand_off=None,
|
|
101
|
+
called_from=previous_agent_name,
|
|
102
|
+
)
|
|
103
|
+
logger.info(
|
|
104
|
+
"No handoff defined, completing chain", agent=agent.name
|
|
105
|
+
)
|
|
106
|
+
iter_span.add_event("chain completed")
|
|
107
|
+
return result
|
|
108
|
+
|
|
109
|
+
# Determine the next agent.
|
|
110
|
+
handoff_data = HandOff()
|
|
111
|
+
if callable(agent.hand_off):
|
|
112
|
+
logger.debug("Executing handoff function", agent=agent.name)
|
|
113
|
+
try:
|
|
114
|
+
handoff_data = agent.hand_off(context, result)
|
|
115
|
+
if isinstance(handoff_data.next_agent, FlockAgent):
|
|
116
|
+
handoff_data.next_agent = (
|
|
117
|
+
handoff_data.next_agent.name
|
|
118
|
+
)
|
|
119
|
+
except Exception as e:
|
|
120
|
+
logger.error(
|
|
121
|
+
"Handoff function error",
|
|
122
|
+
agent=agent.name,
|
|
123
|
+
error=str(e),
|
|
124
|
+
)
|
|
125
|
+
iter_span.record_exception(e)
|
|
126
|
+
return {"error": f"Handoff function error: {e}"}
|
|
127
|
+
elif isinstance(agent.hand_off, str | FlockAgent):
|
|
128
|
+
handoff_data.next_agent = (
|
|
129
|
+
agent.hand_off
|
|
130
|
+
if isinstance(agent.hand_off, str)
|
|
131
|
+
else agent.hand_off.name
|
|
132
|
+
)
|
|
133
|
+
else:
|
|
134
|
+
logger.error("Unsupported hand_off type", agent=agent.name)
|
|
135
|
+
iter_span.add_event("unsupported hand_off type")
|
|
136
|
+
return {"error": "Unsupported hand_off type."}
|
|
137
|
+
|
|
138
|
+
# Record the agent run in the context.
|
|
139
|
+
context.record(
|
|
140
|
+
agent.name,
|
|
141
|
+
result,
|
|
142
|
+
timestamp=datetime.now().isoformat(),
|
|
143
|
+
hand_off=handoff_data,
|
|
144
|
+
called_from=previous_agent_name,
|
|
145
|
+
)
|
|
146
|
+
previous_agent_name = agent.name
|
|
147
|
+
|
|
148
|
+
# Prepare the next agent.
|
|
149
|
+
try:
|
|
150
|
+
agent = registry.get_agent(handoff_data.next_agent)
|
|
151
|
+
agent.resolve_callables(context=context)
|
|
152
|
+
if not agent:
|
|
153
|
+
logger.error(
|
|
154
|
+
"Next agent not found",
|
|
155
|
+
agent=handoff_data.next_agent,
|
|
156
|
+
)
|
|
157
|
+
iter_span.record_exception(
|
|
158
|
+
Exception(
|
|
159
|
+
f"Next agent '{handoff_data.next_agent}' not found"
|
|
160
|
+
)
|
|
161
|
+
)
|
|
162
|
+
return {
|
|
163
|
+
"error": f"Next agent '{handoff_data.next_agent}' not found."
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
context.set_variable(FLOCK_CURRENT_AGENT, agent.name)
|
|
167
|
+
logger.info("Handing off to next agent", next=agent.name)
|
|
168
|
+
iter_span.set_attribute("next.agent", agent.name)
|
|
169
|
+
except Exception as e:
|
|
170
|
+
logger.error("Error during handoff", error=str(e))
|
|
171
|
+
iter_span.record_exception(e)
|
|
172
|
+
return {"error": f"Error during handoff: {e}"}
|
|
173
|
+
|
|
174
|
+
# If the loop exits unexpectedly, return the initial input.
|
|
175
|
+
return context.get_variable("init_input")
|
|
@@ -1,26 +1,24 @@
|
|
|
1
|
-
from temporalio import activity
|
|
2
|
-
|
|
3
|
-
from flock.
|
|
4
|
-
from flock.core.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
@activity.defn
|
|
8
|
-
async def run_declarative_agent_activity(params: dict) -> dict:
|
|
9
|
-
"""Temporal activity to run a declarative (or batch) agent.
|
|
10
|
-
|
|
11
|
-
Expects a dictionary with:
|
|
12
|
-
- "agent_data": a dict representation of the agent (as produced by .dict()),
|
|
13
|
-
- "context_data": a dict containing the FlockContext state and optionally other fields.
|
|
14
|
-
|
|
15
|
-
The activity reconstructs the agent and a FlockContext, then calls the agent’s _evaluate() method.
|
|
16
|
-
"""
|
|
17
|
-
agent_data = params.get("agent_data")
|
|
18
|
-
context_data = params.get("context_data", {})
|
|
19
|
-
# Reconstruct the agent from its serialized representation.
|
|
20
|
-
agent =
|
|
21
|
-
# Reconstruct the FlockContext from the state.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
result = await agent._evaluate(context)
|
|
26
|
-
return result
|
|
1
|
+
from temporalio import activity
|
|
2
|
+
|
|
3
|
+
from flock.core.context.context import FlockContext
|
|
4
|
+
from flock.core.flock_agent import FlockAgent
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@activity.defn
|
|
8
|
+
async def run_declarative_agent_activity(params: dict) -> dict:
|
|
9
|
+
"""Temporal activity to run a declarative (or batch) agent.
|
|
10
|
+
|
|
11
|
+
Expects a dictionary with:
|
|
12
|
+
- "agent_data": a dict representation of the agent (as produced by .dict()),
|
|
13
|
+
- "context_data": a dict containing the FlockContext state and optionally other fields.
|
|
14
|
+
|
|
15
|
+
The activity reconstructs the agent and a FlockContext, then calls the agent’s _evaluate() method.
|
|
16
|
+
"""
|
|
17
|
+
agent_data = params.get("agent_data")
|
|
18
|
+
context_data = params.get("context_data", {})
|
|
19
|
+
# Reconstruct the agent from its serialized representation.
|
|
20
|
+
agent = FlockAgent.from_dict(agent_data)
|
|
21
|
+
# Reconstruct the FlockContext from the state.
|
|
22
|
+
context = FlockContext.from_dict(context_data)
|
|
23
|
+
result = await agent.evaluate(context)
|
|
24
|
+
return result
|
flock/workflow/temporal_setup.py
CHANGED
|
@@ -1,37 +1,38 @@
|
|
|
1
|
-
import asyncio
|
|
2
|
-
import uuid
|
|
3
|
-
|
|
4
|
-
from temporalio.client import Client
|
|
5
|
-
from temporalio.worker import Worker
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
async def create_temporal_client() -> Client:
|
|
9
|
-
client = await Client.connect("localhost:7233")
|
|
10
|
-
return client
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
1
|
+
import asyncio
|
|
2
|
+
import uuid
|
|
3
|
+
|
|
4
|
+
from temporalio.client import Client
|
|
5
|
+
from temporalio.worker import Worker
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
async def create_temporal_client() -> Client:
|
|
9
|
+
client = await Client.connect("localhost:7233")
|
|
10
|
+
return client
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
async def setup_worker(workflow, activity) -> Client:
|
|
14
|
+
worker_client = await create_temporal_client()
|
|
15
|
+
worker = Worker(worker_client, task_queue="flock-queue", workflows=[workflow], activities=[activity])
|
|
16
|
+
asyncio.create_task(worker.run())
|
|
17
|
+
await asyncio.sleep(1)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
async def run_worker(client: Client, task_queue: str, workflows, activities):
|
|
21
|
+
worker = Worker(client, task_queue=task_queue, workflows=workflows, activities=activities)
|
|
22
|
+
await worker.run()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
async def run_activity(client: Client, name: str, func, param):
|
|
26
|
+
run_id = f"{name}_{uuid.uuid4().hex[:4]}"
|
|
27
|
+
|
|
28
|
+
try:
|
|
29
|
+
result = await client.execute_activity(
|
|
30
|
+
func,
|
|
31
|
+
param,
|
|
32
|
+
id=run_id,
|
|
33
|
+
task_queue="flock-queue",
|
|
34
|
+
start_to_close_timeout=300, # e.g., 5 minutes
|
|
35
|
+
)
|
|
36
|
+
return result
|
|
37
|
+
except Exception:
|
|
38
|
+
raise
|
flock/workflow/workflow.py
CHANGED
|
@@ -1,53 +1,58 @@
|
|
|
1
|
-
from datetime import timedelta
|
|
2
|
-
|
|
3
|
-
from temporalio import workflow
|
|
4
|
-
|
|
5
|
-
from flock.core.context import FlockContext
|
|
6
|
-
from flock.core.logging import
|
|
7
|
-
from flock.workflow.activities import run_agent
|
|
8
|
-
|
|
9
|
-
# Import activity, passing it through the sandbox without reloading the module
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
self.context
|
|
23
|
-
self.context.
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
1
|
+
from datetime import timedelta
|
|
2
|
+
|
|
3
|
+
from temporalio import workflow
|
|
4
|
+
|
|
5
|
+
from flock.core.context.context import FlockContext
|
|
6
|
+
from flock.core.logging.logging import get_logger
|
|
7
|
+
from flock.workflow.activities import run_agent
|
|
8
|
+
|
|
9
|
+
# Import activity, passing it through the sandbox without reloading the module
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
logger = get_logger("workflow")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@workflow.defn
|
|
16
|
+
class FlockWorkflow:
|
|
17
|
+
def __init__(self) -> None:
|
|
18
|
+
self.context = None
|
|
19
|
+
|
|
20
|
+
@workflow.run
|
|
21
|
+
async def run(self, context_dict: dict) -> dict:
|
|
22
|
+
self.context = FlockContext.from_dict(context_dict)
|
|
23
|
+
self.context.workflow_id = workflow.info().workflow_id
|
|
24
|
+
self.context.workflow_timestamp = workflow.info().start_time.strftime("%Y-%m-%d %H:%M:%S")
|
|
25
|
+
|
|
26
|
+
try:
|
|
27
|
+
logger.info(
|
|
28
|
+
"Starting workflow execution",
|
|
29
|
+
timestamp=self.context.workflow_timestamp,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
result = await workflow.execute_activity(
|
|
33
|
+
run_agent,
|
|
34
|
+
self.context,
|
|
35
|
+
start_to_close_timeout=timedelta(minutes=5),
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
self.context.set_variable(
|
|
39
|
+
"flock.result",
|
|
40
|
+
{
|
|
41
|
+
"result": result,
|
|
42
|
+
"success": True,
|
|
43
|
+
},
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
logger.success("Workflow completed successfully")
|
|
47
|
+
return result
|
|
48
|
+
|
|
49
|
+
except Exception as e:
|
|
50
|
+
logger.exception("Workflow execution failed", error=str(e))
|
|
51
|
+
self.context.set_variable(
|
|
52
|
+
"flock.result",
|
|
53
|
+
{
|
|
54
|
+
"result": f"Failed: {e}",
|
|
55
|
+
"success": False,
|
|
56
|
+
},
|
|
57
|
+
)
|
|
58
|
+
return self.context
|