tiny_factory / tools /tiny_word_processor.py
harvesthealth's picture
Restructure project and deploy
e9aab05 verified
import json
from tinytroupe.tools import logger, TinyTool
import tinytroupe.utils as utils
class TinyWordProcessor(TinyTool):
def __init__(self, owner=None, exporter=None, enricher=None):
super().__init__("wordprocessor", "A basic word processor tool that allows agents to write documents.", owner=owner, real_world_side_effects=False, exporter=exporter, enricher=enricher)
def write_document(self, title, content, author=None):
logger.debug(f"Writing document with title {title} and content: {content}")
if self.enricher is not None:
requirements =\
"""
Turn any draft or outline into an actual and long document, with many, many details. Include tables, lists, and other elements.
The result **MUST** be at least 5 times larger than the original content in terms of characters - do whatever it takes to make it this long and detailed.
"""
content = self.enricher.enrich_content(requirements=requirements,
content=content,
content_type="Document",
context_info=None,
context_cache=None, verbose=False)
if self.exporter is not None:
if author is not None:
artifact_name = f"{title}.{author}"
else:
artifact_name = title
self.exporter.export(artifact_name=artifact_name, artifact_data= content, content_type="Document", content_format="md", target_format="md")
self.exporter.export(artifact_name=artifact_name, artifact_data= content, content_type="Document", content_format="md", target_format="docx")
json_doc = {"title": title, "content": content, "author": author}
self.exporter.export(artifact_name=artifact_name, artifact_data= json_doc, content_type="Document", content_format="md", target_format="json")
def _process_action(self, agent, action) -> bool:
try:
if action['type'] == "WRITE_DOCUMENT" and action['content'] is not None:
# parse content json
if isinstance(action['content'], str):
doc_spec = utils.extract_json(action['content'])
else:
doc_spec = action['content']
# checks whether there are any kwargs that are not valid
valid_keys = ["title", "content", "author"]
utils.check_valid_fields(doc_spec, valid_keys)
# uses the kwargs to create a new document
self.write_document(**doc_spec)
return True
else:
return False
except json.JSONDecodeError as e:
logger.error(f"Error parsing JSON content: {e}. Original content: {action['content']}")
return False
except Exception as e:
logger.error(f"Error processing action: {e}")
return False
def actions_definitions_prompt(self) -> str:
prompt = \
"""
- WRITE_DOCUMENT: you can create a new document. The content of the document has many fields, and you **must** use a JSON format to specify them. Here are the possible fields:
* title: The title of the document. Mandatory.
* content: The actual content of the document. You **must** use Markdown to format this content. Mandatory.
* author: The author of the document. You should put your own name. Optional.
"""
return utils.dedent(prompt)
def actions_constraints_prompt(self) -> str:
prompt = \
"""
- Whenever you WRITE_DOCUMENT, you write all the content at once. Moreover, the content should be long and detailed, unless there's a good reason for it not to be.
- Whenever you WRITE_DOCUMENT, you **must** embed the content in a JSON object. Use only valid escape sequences in the JSON content.
- When you WRITE_DOCUMENT, you follow these additional guidelines:
* For any milestones or timelines mentioned, try mentioning specific owners or partner teams, unless there's a good reason not to do so.
"""
return utils.dedent(prompt)