Agno's CompanyTools now carries create_company_product and create_company_routine, so a founder can type "set up a Product for our docs site with an intake Routine" to OS Manager and find the Product, its website Source and its Routine in the CompanyOS lists afterwards. Product Manager, an OS Manager member once AgentOS(manager=OSManager()) is set, offers this step whenever a person starts a chat with no Product yet.
The tools take the same Source and Routine declarations as code and YAML. Every record belongs to the person in the chat, and website Sources keep the agent and run that added them. Leave out cron_expr and the Routine runs on demand. If a Source or Routine fails partway, the tool discards the half-built Product.
Product Manager needs a model, and no key was available, so this script called the tools directly with a run context for a person named Ana, as the release's 05_product_manager.py cookbook does. The from a Routine run line is a call made under a Routine's authority. Real output:
tools: ['create_company_product', 'create_company_routine']
missing schedules:write -> PermissionError Permission required: schedules:write
product: {'name': 'Documentation', 'user_id': 'ana'} routine_ids: 1
routine: {'name': 'd4f4939a-d21d-44b3-8770-ebf7cf21bcd5.weekly-summary', 'schedule_type': None, 'cron_expr': '0 16 * * 5', 'user_id': 'ana'}
from a Routine run -> PermissionError Company Products and Routines cannot be created from automated runs; Routines propose work
GET /company/products: ['Documentation']
GET /company/sources: [('website', 'https://docs.agno.com', 'chat')]
GET /company/routines: [('d4f4939a-d21d-44b3-8770-ebf7cf21bcd5.intake', 'on_demand'), ('d4f4939a-d21d-44b3-8770-ebf7cf21bcd5.weekly-summary', 'scheduled')]The tool's own reply leaves schedule_type empty, and GET /company/routines fills it in. No HTTP route or database schema changed.
See the cookbook, and learn more about asking OS Manager for Company work in the documentation.
Frequently asked questions
The chatting person needs products:write, plus sources:write when the request includes Sources, schedules:write and routines:write when it includes Routines, and run permission on each Routine's executor. A missing scope raises a PermissionError that names it before anything is written.
No. Both tools refuse inside Routine runs and automatic Task execution with "Company Products and Routines cannot be created from automated runs; Routines propose work".
Website Sources only, without an id or credential_ref. Git and markdown Sources still go through the /company/sources route.



