pythonpython-3.xtelegramaiogram

How do I get the FSM context to pass to my function?


Utilities.py

import aiogram
import aiogram.filters
import aiogram.types
import aiogram.fsm.context
import aiogram.fsm.state

from aiogram.fsm.storage.redis import RedisStorage
import redis.asyncio as redis

with open("Telegram/Configs.json", "r") as File:
    TelegramConfigs: dict[str, typing.Any] = json.load(File)

Main

import Telegram.Utilities as Utilities

Dispatcher=Utilities.aiogram.Dispatcher(
    storage=Utilities.RedisStorage(
        Utilities.redis.Redis(
            host="127.0.0.1",
            port=6379,
        )
    )
)

Router=Utilities.aiogram.Router(name = "Main")

@Router.message(Utilities.aiogram.filters.CommandStart())
@Router.callback_query(Utilities.aiogram.F.data == "start")
async def start(MessageOrCallback: Utilities.aiogram.types.Message | Utilities.aiogram.types.CallbackQuery, State: Utilities.aiogram.fsm.context.FSMContext):
    print("/Started")

Dispatcher.include_router(Router)

This code is just a minimal example

Looking at the docs (https://docs.aiogram.dev/en/dev-3.x/dispatcher/finite_state_machine/index.html) they casually have the FSM context as a second parameter in their start function but as soon as I run the start command I get this error:

Cause exception while process update id=511380950 by bot id=7945450430
TypeError: start() missing 1 required positional argument: 'State'
Traceback (most recent call last):
  File "/Users/zein/Desktop/Usolabot/venv/lib/python3.13/site-packages/aiogram/dispatcher/dispatcher.py", line 309, in _process_update
    response = await self.feed_update(bot, update, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/zein/Desktop/Usolabot/venv/lib/python3.13/site-packages/aiogram/dispatcher/dispatcher.py", line 158, in feed_update
    response = await self.update.wrap_outer_middleware(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<7 lines>...
    )
    ^
  File "/Users/zein/Desktop/Usolabot/venv/lib/python3.13/site-packages/aiogram/dispatcher/middlewares/error.py", line 25, in __call__
    return await handler(event, data)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/zein/Desktop/Usolabot/venv/lib/python3.13/site-packages/aiogram/dispatcher/middlewares/user_context.py", line 56, in __call__
    return await handler(event, data)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/zein/Desktop/Usolabot/venv/lib/python3.13/site-packages/aiogram/fsm/middleware.py", line 42, in __call__
    return await handler(event, data)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/zein/Desktop/Usolabot/venv/lib/python3.13/site-packages/aiogram/dispatcher/event/telegram.py", line 121, in trigger
    return await wrapped_inner(event, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/zein/Desktop/Usolabot/venv/lib/python3.13/site-packages/aiogram/dispatcher/event/handler.py", line 43, in call
    return await wrapped()
           ^^^^^^^^^^^^^^^
  File "/Users/zein/Desktop/Usolabot/venv/lib/python3.13/site-packages/aiogram/dispatcher/dispatcher.py", line 276, in _listen_update
    return await self.propagate_event(update_type=update_type, event=event, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/zein/Desktop/Usolabot/venv/lib/python3.13/site-packages/aiogram/dispatcher/router.py", line 146, in propagate_event
    return await observer.wrap_outer_middleware(_wrapped, event=event, data=kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/zein/Desktop/Usolabot/venv/lib/python3.13/site-packages/aiogram/dispatcher/router.py", line 141, in _wrapped
    return await self._propagate_event(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        observer=observer, update_type=update_type, event=telegram_event, **data
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/Users/zein/Desktop/Usolabot/venv/lib/python3.13/site-packages/aiogram/dispatcher/router.py", line 174, in _propagate_event
    response = await router.propagate_event(update_type=update_type, event=event, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/zein/Desktop/Usolabot/venv/lib/python3.13/site-packages/aiogram/dispatcher/router.py", line 146, in propagate_event
    return await observer.wrap_outer_middleware(_wrapped, event=event, data=kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/zein/Desktop/Usolabot/venv/lib/python3.13/site-packages/aiogram/dispatcher/router.py", line 141, in _wrapped
    return await self._propagate_event(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        observer=observer, update_type=update_type, event=telegram_event, **data
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/Users/zein/Desktop/Usolabot/venv/lib/python3.13/site-packages/aiogram/dispatcher/router.py", line 166, in _propagate_event
    response = await observer.trigger(event, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/zein/Desktop/Usolabot/venv/lib/python3.13/site-packages/aiogram/dispatcher/event/telegram.py", line 121, in trigger
    return await wrapped_inner(event, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/zein/Desktop/Usolabot/venv/lib/python3.13/site-packages/aiogram/dispatcher/event/handler.py", line 43, in call
    return await wrapped()
                 ~~~~~~~^^
TypeError: start() missing 1 required positional argument: 'State'

I've looked as hard as I can to try see what i'm not doing that they're doing but I just don't see it.


Solution

  • Apparently you can't name the second parameter whatever you want. The name of the second parameter must be state. Not knowing this information, I was using a capitalised S. Putting it to lowercase solved the problem.