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/__init__.py
CHANGED
flock/core/__init__.py
CHANGED
|
@@ -1,7 +1 @@
|
|
|
1
|
-
|
|
2
|
-
from flock.core.agent_registry import Registry
|
|
3
|
-
from flock.core.context import FlockContext
|
|
4
|
-
from flock.core.flock import Flock
|
|
5
|
-
from flock.core.serializable import Serializable
|
|
6
|
-
|
|
7
|
-
__all__ = ["Agent", "Flock", "FlockContext", "Registry", "Serializable"]
|
|
1
|
+
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
from dataclasses import asdict, dataclass, field
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
from typing import Any, Literal
|
|
4
|
+
|
|
5
|
+
from opentelemetry import trace
|
|
6
|
+
|
|
7
|
+
from flock.core.context.context_vars import FLOCK_LAST_AGENT, FLOCK_LAST_RESULT
|
|
8
|
+
from flock.core.logging.logging import get_logger
|
|
9
|
+
from flock.core.util.serializable import Serializable
|
|
10
|
+
|
|
11
|
+
logger = get_logger("context")
|
|
12
|
+
tracer = trace.get_tracer(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass
|
|
16
|
+
class AgentRunRecord:
|
|
17
|
+
agent: str = field(default="")
|
|
18
|
+
data: dict[str, Any] = field(default_factory=dict)
|
|
19
|
+
timestamp: str = field(default="")
|
|
20
|
+
hand_off: dict = field(default_factory=dict)
|
|
21
|
+
called_from: str = field(default="")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass
|
|
25
|
+
class AgentDefinition:
|
|
26
|
+
agent_type: str = field(default="")
|
|
27
|
+
agent_name: str = field(default="")
|
|
28
|
+
agent_data: dict = field(default_factory=dict)
|
|
29
|
+
serializer: Literal["json", "cloudpickle", "msgpack"] = field(
|
|
30
|
+
default="cloudpickle"
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass
|
|
35
|
+
class FlockContext(Serializable):
|
|
36
|
+
state: dict[str, Any] = field(default_factory=dict)
|
|
37
|
+
history: list[AgentRunRecord] = field(default_factory=list)
|
|
38
|
+
agent_definitions: dict[str, AgentDefinition] = field(default_factory=dict)
|
|
39
|
+
run_id: str = field(default="")
|
|
40
|
+
workflow_id: str = field(default="")
|
|
41
|
+
workflow_timestamp: str = field(default="")
|
|
42
|
+
|
|
43
|
+
def record(
|
|
44
|
+
self,
|
|
45
|
+
agent_name: str,
|
|
46
|
+
data: dict[str, Any],
|
|
47
|
+
timestamp: str,
|
|
48
|
+
hand_off: str,
|
|
49
|
+
called_from: str,
|
|
50
|
+
) -> None:
|
|
51
|
+
record = AgentRunRecord(
|
|
52
|
+
agent=agent_name,
|
|
53
|
+
data=data.copy(),
|
|
54
|
+
timestamp=timestamp,
|
|
55
|
+
hand_off=hand_off,
|
|
56
|
+
called_from=called_from,
|
|
57
|
+
)
|
|
58
|
+
self.history.append(record)
|
|
59
|
+
for key, value in data.items():
|
|
60
|
+
self.set_variable(f"{agent_name}.{key}", value)
|
|
61
|
+
self.set_variable(FLOCK_LAST_RESULT, data)
|
|
62
|
+
self.set_variable(FLOCK_LAST_AGENT, agent_name)
|
|
63
|
+
logger.info(
|
|
64
|
+
"Agent run recorded",
|
|
65
|
+
agent=agent_name,
|
|
66
|
+
timestamp=timestamp,
|
|
67
|
+
data=data,
|
|
68
|
+
)
|
|
69
|
+
current_span = trace.get_current_span()
|
|
70
|
+
if current_span.get_span_context().is_valid:
|
|
71
|
+
current_span.add_event(
|
|
72
|
+
"record",
|
|
73
|
+
attributes={"agent": agent_name, "timestamp": timestamp},
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
def get_variable(self, key: str) -> Any:
|
|
77
|
+
return self.state.get(key)
|
|
78
|
+
|
|
79
|
+
def set_variable(self, key: str, value: Any) -> None:
|
|
80
|
+
old_value = self.state.get(key)
|
|
81
|
+
self.state[key] = value
|
|
82
|
+
if old_value != value:
|
|
83
|
+
logger.info(
|
|
84
|
+
"Context variable updated",
|
|
85
|
+
variable=key,
|
|
86
|
+
old=old_value,
|
|
87
|
+
new=value,
|
|
88
|
+
)
|
|
89
|
+
current_span = trace.get_current_span()
|
|
90
|
+
if current_span.get_span_context().is_valid:
|
|
91
|
+
current_span.add_event(
|
|
92
|
+
"set_variable",
|
|
93
|
+
attributes={
|
|
94
|
+
"key": key,
|
|
95
|
+
"old": str(old_value),
|
|
96
|
+
"new": str(value),
|
|
97
|
+
},
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
def deepcopy(self) -> "FlockContext":
|
|
101
|
+
return FlockContext.from_dict(self.to_dict())
|
|
102
|
+
|
|
103
|
+
def get_agent_history(self, agent_name: str) -> list[AgentRunRecord]:
|
|
104
|
+
return [record for record in self.history if record.agent == agent_name]
|
|
105
|
+
|
|
106
|
+
def next_input_for(self, agent) -> Any:
|
|
107
|
+
try:
|
|
108
|
+
if hasattr(agent, "input") and isinstance(agent.input, str):
|
|
109
|
+
keys = [k.strip() for k in agent.input.split(",") if k.strip()]
|
|
110
|
+
if len(keys) == 1:
|
|
111
|
+
return self.get_variable(keys[0])
|
|
112
|
+
else:
|
|
113
|
+
return {key: self.get_variable(key) for key in keys}
|
|
114
|
+
else:
|
|
115
|
+
return self.get_variable("init_input")
|
|
116
|
+
except Exception as e:
|
|
117
|
+
logger.error(
|
|
118
|
+
"Error getting next input for agent",
|
|
119
|
+
agent=agent.name,
|
|
120
|
+
error=str(e),
|
|
121
|
+
)
|
|
122
|
+
raise
|
|
123
|
+
|
|
124
|
+
def get_most_recent_value(self, variable_name: str) -> Any:
|
|
125
|
+
for history_record in reversed(self.history):
|
|
126
|
+
if variable_name in history_record.data:
|
|
127
|
+
return history_record.data[variable_name]
|
|
128
|
+
|
|
129
|
+
def get_agent_definition(self, agent_name: str) -> AgentDefinition | None:
|
|
130
|
+
return self.agent_definitions.get(agent_name)
|
|
131
|
+
|
|
132
|
+
def add_agent_definition(
|
|
133
|
+
self, agent_type: type, agent_name: str, agent_data: Any
|
|
134
|
+
) -> None:
|
|
135
|
+
definition = AgentDefinition(
|
|
136
|
+
agent_type=agent_type.__name__,
|
|
137
|
+
agent_name=agent_name,
|
|
138
|
+
agent_data=agent_data,
|
|
139
|
+
)
|
|
140
|
+
self.agent_definitions[agent_name] = definition
|
|
141
|
+
|
|
142
|
+
# Use the reactive setter for dict-like access.
|
|
143
|
+
def __getitem__(self, key: str) -> Any:
|
|
144
|
+
return self.get_variable(key)
|
|
145
|
+
|
|
146
|
+
def __setitem__(self, key: str, value: Any) -> None:
|
|
147
|
+
self.set_variable(key, value)
|
|
148
|
+
|
|
149
|
+
def to_dict(self) -> dict[str, Any]:
|
|
150
|
+
def convert(obj):
|
|
151
|
+
if isinstance(obj, datetime):
|
|
152
|
+
return obj.isoformat()
|
|
153
|
+
if hasattr(obj, "__dataclass_fields__"):
|
|
154
|
+
return asdict(
|
|
155
|
+
obj, dict_factory=lambda x: {k: convert(v) for k, v in x}
|
|
156
|
+
)
|
|
157
|
+
return obj
|
|
158
|
+
|
|
159
|
+
return convert(asdict(self))
|
|
160
|
+
|
|
161
|
+
@classmethod
|
|
162
|
+
def from_dict(cls, data: dict[str, Any]) -> "FlockContext":
|
|
163
|
+
def convert(obj):
|
|
164
|
+
if isinstance(obj, dict):
|
|
165
|
+
if "timestamp" in obj:
|
|
166
|
+
return AgentRunRecord(
|
|
167
|
+
**{
|
|
168
|
+
**obj,
|
|
169
|
+
"timestamp": datetime.fromisoformat(
|
|
170
|
+
obj["timestamp"]
|
|
171
|
+
),
|
|
172
|
+
}
|
|
173
|
+
)
|
|
174
|
+
if "agent_type" in obj:
|
|
175
|
+
return AgentDefinition(**obj)
|
|
176
|
+
return {k: convert(v) for k, v in obj.items()}
|
|
177
|
+
if isinstance(obj, list):
|
|
178
|
+
return [convert(v) for v in obj]
|
|
179
|
+
return obj
|
|
180
|
+
|
|
181
|
+
converted = convert(data)
|
|
182
|
+
return cls(**converted)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""Module for managing the FlockContext."""
|
|
2
|
+
|
|
3
|
+
from flock.core.context.context import FlockContext
|
|
4
|
+
from flock.core.context.context_vars import (
|
|
5
|
+
FLOCK_CURRENT_AGENT,
|
|
6
|
+
FLOCK_INITIAL_INPUT,
|
|
7
|
+
FLOCK_LOCAL_DEBUG,
|
|
8
|
+
FLOCK_RUN_ID,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def initialize_context(
|
|
13
|
+
context: FlockContext,
|
|
14
|
+
agent_name: str,
|
|
15
|
+
input_data: dict,
|
|
16
|
+
run_id: str,
|
|
17
|
+
local_debug: bool,
|
|
18
|
+
) -> None:
|
|
19
|
+
"""Initialize the FlockContext with standard variables before running an agent.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
context: The FlockContext instance.
|
|
23
|
+
agent_name: The name of the current agent.
|
|
24
|
+
input_data: A dictionary of inputs for the agent.
|
|
25
|
+
run_id: A unique identifier for the run.
|
|
26
|
+
local_debug: Flag indicating whether local debugging is enabled.
|
|
27
|
+
"""
|
|
28
|
+
context.set_variable(FLOCK_CURRENT_AGENT, agent_name)
|
|
29
|
+
for key, value in input_data.items():
|
|
30
|
+
context.set_variable("flock." + key, value)
|
|
31
|
+
context.set_variable(FLOCK_INITIAL_INPUT, input_data)
|
|
32
|
+
context.set_variable(FLOCK_LOCAL_DEBUG, local_debug)
|
|
33
|
+
context.run_id = run_id
|
|
34
|
+
context.set_variable(FLOCK_RUN_ID, run_id)
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
"""Context variables for Flock."""
|
|
2
|
+
|
|
3
|
+
FLOCK_CURRENT_AGENT = "flock.current_agent"
|
|
4
|
+
FLOCK_INITIAL_INPUT = "flock.initial_input"
|
|
5
|
+
FLOCK_LOCAL_DEBUG = "flock.local_debug"
|
|
6
|
+
FLOCK_RUN_ID = "flock.run_id"
|
|
7
|
+
FLOCK_LAST_AGENT = "flock.last_agent"
|
|
8
|
+
FLOCK_LAST_RESULT = "flock.last_result"
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# src/your_package/core/execution/local_executor.py
|
|
2
|
+
from flock.core.context.context import FlockContext
|
|
3
|
+
from flock.core.logging.logging import get_logger
|
|
4
|
+
from flock.workflow.activities import run_agent # This should be the local activity function
|
|
5
|
+
|
|
6
|
+
logger = get_logger("flock")
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
async def run_local_workflow(context: FlockContext, output_formatter, box_result: bool = True) -> dict:
|
|
10
|
+
"""Execute the agent workflow locally (for debugging).
|
|
11
|
+
|
|
12
|
+
Args:
|
|
13
|
+
context: The FlockContext instance with state and history.
|
|
14
|
+
output_formatter: Formatter options for displaying results.
|
|
15
|
+
box_result: If True, wraps the result in a Box for nicer display.
|
|
16
|
+
|
|
17
|
+
Returns:
|
|
18
|
+
A dictionary containing the workflow result.
|
|
19
|
+
"""
|
|
20
|
+
logger.info("Running local debug workflow")
|
|
21
|
+
result = await run_agent(context, output_formatter)
|
|
22
|
+
if box_result:
|
|
23
|
+
from box import Box
|
|
24
|
+
|
|
25
|
+
logger.debug("Boxing result")
|
|
26
|
+
return Box(result)
|
|
27
|
+
return result
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# src/your_package/core/execution/temporal_executor.py
|
|
2
|
+
from devtools import pprint
|
|
3
|
+
|
|
4
|
+
from flock.core.context.context import FlockContext
|
|
5
|
+
from flock.core.context.context_vars import FLOCK_RUN_ID
|
|
6
|
+
from flock.core.logging.formatters.formatter_factory import FormatterFactory
|
|
7
|
+
from flock.core.logging.logging import get_logger
|
|
8
|
+
from flock.workflow.activities import (
|
|
9
|
+
run_agent, # Activity function used in Temporal
|
|
10
|
+
)
|
|
11
|
+
from flock.workflow.temporal_setup import create_temporal_client, setup_worker
|
|
12
|
+
from flock.workflow.workflow import FlockWorkflow # Your workflow class
|
|
13
|
+
|
|
14
|
+
logger = get_logger("flock")
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
async def run_temporal_workflow(
|
|
18
|
+
context: FlockContext,
|
|
19
|
+
output_formatter,
|
|
20
|
+
box_result: bool = True,
|
|
21
|
+
) -> dict:
|
|
22
|
+
"""Execute the agent workflow via Temporal for robust, distributed processing.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
context: The FlockContext instance with state and history.
|
|
26
|
+
box_result: If True, wraps the result in a Box for nicer display.
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
A dictionary containing the workflow result.
|
|
30
|
+
"""
|
|
31
|
+
logger.info("Setting up Temporal workflow")
|
|
32
|
+
await setup_worker(workflow=FlockWorkflow, activity=run_agent)
|
|
33
|
+
logger.debug("Creating Temporal client")
|
|
34
|
+
flock_client = await create_temporal_client()
|
|
35
|
+
workflow_id = context.get_variable(FLOCK_RUN_ID)
|
|
36
|
+
logger.info("Executing Temporal workflow", workflow_id=workflow_id)
|
|
37
|
+
result = await flock_client.execute_workflow(
|
|
38
|
+
FlockWorkflow.run,
|
|
39
|
+
context.to_dict(),
|
|
40
|
+
id=workflow_id,
|
|
41
|
+
task_queue="flock-queue",
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
agent_name = context.get_variable("FLOCK_CURRENT_AGENT")
|
|
45
|
+
logger.debug("Formatting Temporal result", agent=agent_name)
|
|
46
|
+
if output_formatter:
|
|
47
|
+
formatter = FormatterFactory.create_formatter(output_formatter)
|
|
48
|
+
formatter.display(result, agent_name, output_formatter.wait_for_input)
|
|
49
|
+
else:
|
|
50
|
+
pprint(result)
|
|
51
|
+
if box_result:
|
|
52
|
+
from box import Box
|
|
53
|
+
|
|
54
|
+
logger.debug("Boxing Temporal result")
|
|
55
|
+
return Box(result)
|
|
56
|
+
return result
|