From e52d563984928bcf37a0eeae55aacc16afb23273 Mon Sep 17 00:00:00 2001 From: Kerem Turgutlu Date: Wed, 16 Sep 2026 22:58:35 +0300 Subject: [PATCH] InputVideo: start, end and fps clip fields --- aidialog/_modidx.py | 2 ++ aidialog/msg_parts.py | 16 ++++++++++++++-- nbs/00_msg_parts.ipynb | 28 ++++++++++++++++++++++++++-- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/aidialog/_modidx.py b/aidialog/_modidx.py index 7396b1f..787cd81 100644 --- a/aidialog/_modidx.py +++ b/aidialog/_modidx.py @@ -252,6 +252,8 @@ 'aidialog.msg_parts.InputFile': ('msg_parts.html#inputfile', 'aidialog/msg_parts.py'), 'aidialog.msg_parts.InputImage': ('msg_parts.html#inputimage', 'aidialog/msg_parts.py'), 'aidialog.msg_parts.InputVideo': ('msg_parts.html#inputvideo', 'aidialog/msg_parts.py'), + 'aidialog.msg_parts.InputVideo.__init__': ( 'msg_parts.html#inputvideo.__init__', + 'aidialog/msg_parts.py'), 'aidialog.msg_parts.MdStr': ('msg_parts.html#mdstr', 'aidialog/msg_parts.py'), 'aidialog.msg_parts.Media': ('msg_parts.html#media', 'aidialog/msg_parts.py'), 'aidialog.msg_parts.Media.__init__': ('msg_parts.html#media.__init__', 'aidialog/msg_parts.py'), diff --git a/aidialog/msg_parts.py b/aidialog/msg_parts.py index 3870440..1f53a2e 100644 --- a/aidialog/msg_parts.py +++ b/aidialog/msg_parts.py @@ -6,7 +6,7 @@ # %% auto #0 __all__ = ['PartType', 'tool_info', 'usage_info', 'think_start', 'think_end', 're_think', 'fence_call_re', 'Part', 'Text', - 'Thinking', 'Refusal', 'Media', 'InputImage', 'InputAudio', 'InputVideo', 'InputFile', 'mk_part', 'Msg', + 'Thinking', 'Refusal', 'Media', 'InputImage', 'InputAudio', 'InputFile', 'InputVideo', 'mk_part', 'Msg', 'msg2dict', 'dict2msg', 'ToolUse', 'ToolResult', 'display_list', 'Completion', 'mk_tool_res_msg', 'sys_text', 'part_txt', 'data_url', 'url_mime', 'MediaUrl', 'mk_content', 'parse_tools', 'strip_tools', 'conv_tools', 'extract_fence_call', 'mk_result_fence', 'split_fence_msgs', 'tool_text', 'fmt2hist', 'ToolResponse', @@ -74,9 +74,21 @@ def __init__(self, text=None, mime=None, **kw): # chkstyle: skip class InputImage(Media, tag=PartType.input_image): "An image input." class InputAudio(Media, tag=PartType.input_audio): "An audio input." -class InputVideo(Media, tag=PartType.input_video): "A video input." class InputFile (Media, tag=PartType.input_file ): "A file input." +class InputVideo(Media, tag=PartType.input_video): + "A video input; `start`/`end` clip it to a range and `fps` sets the sampled frame rate, for providers that support them" + def __init__(self, + text=None, # URL or data URL + mime=None, # Media type + start=None, # Clip start, in seconds + end=None, # Clip end, in seconds + fps=None, # Frames per second sampled from the video + **kw + ): + super().__init__(text, mime, **kw) + store_attr('start,end,fps') + # %% ../nbs/00_msg_parts.ipynb #3c5ecde9 def mk_part(type, **kw): "The `Part` subclass registered for wire tag `type`, built from `kw`" diff --git a/nbs/00_msg_parts.ipynb b/nbs/00_msg_parts.ipynb index 941d5cd..3f1c343 100644 --- a/nbs/00_msg_parts.ipynb +++ b/nbs/00_msg_parts.ipynb @@ -235,8 +235,20 @@ "# chkstyle: skip\n", "class InputImage(Media, tag=PartType.input_image): \"An image input.\"\n", "class InputAudio(Media, tag=PartType.input_audio): \"An audio input.\"\n", - "class InputVideo(Media, tag=PartType.input_video): \"A video input.\"\n", - "class InputFile (Media, tag=PartType.input_file ): \"A file input.\"" + "class InputFile (Media, tag=PartType.input_file ): \"A file input.\"\n", + "\n", + "class InputVideo(Media, tag=PartType.input_video):\n", + " \"A video input; `start`/`end` clip it to a range and `fps` sets the sampled frame rate, for providers that support them\"\n", + " def __init__(self,\n", + " text=None, # URL or data URL\n", + " mime=None, # Media type\n", + " start=None, # Clip start, in seconds\n", + " end=None, # Clip end, in seconds\n", + " fps=None, # Frames per second sampled from the video\n", + " **kw\n", + " ):\n", + " super().__init__(text, mime, **kw)\n", + " store_attr('start,end,fps')" ] }, { @@ -260,6 +272,18 @@ " return Part.reg[type](**kw)" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "5b9c136b", + "metadata": {}, + "outputs": [], + "source": [ + "v = InputVideo('https://www.youtube.com/watch?v=x', start=600, end=1200)\n", + "test_eq(mk_part(**{k:v for k,v in v.__dict__.items() if k[0] != '_'}, type=v.type), v)\n", + "v" + ] + }, { "cell_type": "code", "execution_count": null,