[{"data":1,"prerenderedAt":1862},["ShallowReactive",2],{"guide-\u002Fguides\u002Fsdk":3,"developer-code-1wjk1yk":1845,"developer-code-rxqm9f":1846,"developer-code-13d8hrj":1847,"developer-code-1cfhzmk":1848,"developer-code-csrwmq":1849,"developer-code-znejch":1850,"developer-code-x94mlc":1851,"developer-code-1ao897t":1852,"developer-code-1h64ruz":1853,"developer-code-lwo884":1854,"developer-code-18x26s6":1855,"developer-code-1vj3ov7":1856,"developer-code-1xagynz":1857,"developer-code-kz8rgy":1858,"developer-code-bw2srb":1859,"developer-code-1tcriyf":1860,"developer-code-kgaz19":1861},{"id":4,"title":5,"body":6,"description":1836,"extension":1837,"meta":1838,"navigation":1839,"path":1841,"seo":1842,"stem":1843,"__hash__":1844},"guides\u002Fguides\u002Fsdk.md","VisionStory Python SDK",{"type":7,"value":8,"toc":1817},"minimark",[9,23,26,31,56,60,69,72,119,136,140,145,156,164,205,208,253,338,358,362,365,388,426,433,436,516,530,550,563,567,573,722,760,764,774,810,818,822,825,925,929,961,972,976,1113,1138,1153,1157,1168,1306,1314,1318,1385,1389,1392,1444,1453,1457,1531,1535,1565,1569,1596,1780,1813],[10,11,12,13,17,18,22],"p",{},"The ",[14,15,16],"code",{},"visionstory"," package is the official Python SDK for the VisionStory API. This ",[19,20,21],"strong",{},"zero-dependency"," client uses only the Python standard library and handles authentication, JSON, base64 uploads, asynchronous polling, errors, and media downloads.",[10,24,25],{},"Requires Python 3.10+.",[27,28,30],"h2",{"id":29},"install-the-visionstory-python-sdk","Install the VisionStory Python SDK",[32,33,38],"pre",{"className":34,"code":35,"language":36,"meta":37,"style":37},"language-bash shiki shiki-themes github-light github-dark","pip install visionstory\n","bash","",[14,39,40],{"__ignoreMap":37},[41,42,45,49,53],"span",{"class":43,"line":44},"line",1,[41,46,48],{"class":47},"sScJk","pip",[41,50,52],{"class":51},"sZZnC"," install",[41,54,55],{"class":51}," visionstory\n",[27,57,59],{"id":58},"discover-new-sdk-features","Discover new SDK features",[10,61,62,63,68],{},"In an interactive Python session, the SDK checks the VisionStory release manifest at most once per day and displays an upgrade notice at most once per week when a newer version is available. The notice includes the latest version, release title, upgrade command, and ",[64,65,67],"a",{"href":66},"\u002Fguides\u002Fchangelog","release notes",". Update checks fail silently when you are offline and never change the installed package.",[10,70,71],{},"Check explicitly in a notebook, server process, or CI job:",[32,73,77],{"className":74,"code":75,"language":76,"meta":37,"style":37},"language-python shiki shiki-themes github-light github-dark","from visionstory import check_for_updates\n\nprint(check_for_updates())\n# installed_version, latest_version, update_available, highlights, update_command\n","python",[14,78,79,95,102,112],{"__ignoreMap":37},[41,80,81,85,89,92],{"class":43,"line":44},[41,82,84],{"class":83},"szBVR","from",[41,86,88],{"class":87},"sVt8B"," visionstory ",[41,90,91],{"class":83},"import",[41,93,94],{"class":87}," check_for_updates\n",[41,96,98],{"class":43,"line":97},2,[41,99,101],{"emptyLinePlaceholder":100},true,"\n",[41,103,105,109],{"class":43,"line":104},3,[41,106,108],{"class":107},"sj4cs","print",[41,110,111],{"class":87},"(check_for_updates())\n",[41,113,115],{"class":43,"line":114},4,[41,116,118],{"class":117},"sJ8bj","# installed_version, latest_version, update_available, highlights, update_command\n",[10,120,121,122,125,126,129,130,135],{},"Disable passive notices with ",[14,123,124],{},"VISIONSTORY_UPDATE_CHECK=0",", or force the interactive notice behavior with ",[14,127,128],{},"VISIONSTORY_UPDATE_CHECK=1",". The machine-readable release manifest is available at ",[64,131,133],{"href":132},"\u002Freleases\u002Flatest.json",[14,134,132],{},".",[27,137,139],{"id":138},"authenticate-the-python-client","Authenticate the Python client",[141,142,144],"h3",{"id":143},"default-setup-use-the-official-api","Default setup: use the official API",[10,146,147,148,151,152,155],{},"For most applications, configure only ",[14,149,150],{},"VISIONSTORY_API_KEY"," and use ",[14,153,154],{},"from_env()",". You do not need to set a domain or a timeout.",[10,157,158,159,163],{},"Create a key on the ",[64,160,162],{"href":161},"\u002Fapi-keys","API keys page",", then provide it through your application's environment or deployment secret store. Never put a real key in source code, chat, or a committed environment file.",[32,165,167],{"className":74,"code":166,"language":76,"meta":37,"style":37},"from visionstory import VisionStoryClient\n\nclient = VisionStoryClient.from_env()\nprint(client.get_credits())  # Read-only authentication check; does not generate media\n",[14,168,169,180,184,195],{"__ignoreMap":37},[41,170,171,173,175,177],{"class":43,"line":44},[41,172,84],{"class":83},[41,174,88],{"class":87},[41,176,91],{"class":83},[41,178,179],{"class":87}," VisionStoryClient\n",[41,181,182],{"class":43,"line":97},[41,183,101],{"emptyLinePlaceholder":100},[41,185,186,189,192],{"class":43,"line":104},[41,187,188],{"class":87},"client ",[41,190,191],{"class":83},"=",[41,193,194],{"class":87}," VisionStoryClient.from_env()\n",[41,196,197,199,202],{"class":43,"line":114},[41,198,108],{"class":107},[41,200,201],{"class":87},"(client.get_credits())  ",[41,203,204],{"class":117},"# Read-only authentication check; does not generate media\n",[10,206,207],{},"For a local test without a configured environment, run this in your own terminal before creating the client. Input stays hidden; the key is available only to this Python process, not future terminals:",[32,209,211],{"className":74,"code":210,"language":76,"meta":37,"style":37},"import getpass\nimport os\n\nos.environ[\"VISIONSTORY_API_KEY\"] = getpass.getpass(\"VisionStory API key (hidden): \")\n",[14,212,213,220,227,231],{"__ignoreMap":37},[41,214,215,217],{"class":43,"line":44},[41,216,91],{"class":83},[41,218,219],{"class":87}," getpass\n",[41,221,222,224],{"class":43,"line":97},[41,223,91],{"class":83},[41,225,226],{"class":87}," os\n",[41,228,229],{"class":43,"line":104},[41,230,101],{"emptyLinePlaceholder":100},[41,232,233,236,239,242,244,247,250],{"class":43,"line":114},[41,234,235],{"class":87},"os.environ[",[41,237,238],{"class":51},"\"VISIONSTORY_API_KEY\"",[41,240,241],{"class":87},"] ",[41,243,191],{"class":83},[41,245,246],{"class":87}," getpass.getpass(",[41,248,249],{"class":51},"\"VisionStory API key (hidden): \"",[41,251,252],{"class":87},")\n",[254,255,256,272],"table",{},[257,258,259],"thead",{},[260,261,262,266,269],"tr",{},[263,264,265],"th",{},"Setting",[263,267,268],{},"Default behavior",[263,270,271],{},"How to customize",[273,274,275,296,323],"tbody",{},[260,276,277,281,289],{},[278,279,280],"td",{},"API key",[278,282,283,285,286,288],{},[14,284,154],{}," reads ",[14,287,150],{},"; a missing or empty key raises an error",[278,290,291,292,295],{},"Supply the environment variable or pass ",[14,293,294],{},"api_key"," to the constructor",[260,297,298,301,311],{},[278,299,300],{},"API address",[278,302,303,306,307,310],{},[14,304,305],{},"https:\u002F\u002Fopenapi.visionstory.ai"," when ",[14,308,309],{},"VISIONSTORY_API_BASE"," is not set",[278,312,313,314,316,317,319,320,295],{},"Set ",[14,315,309],{}," for ",[14,318,154],{},", or pass ",[14,321,322],{},"base_url",[260,324,325,328,331],{},[278,326,327],{},"HTTP timeout",[278,329,330],{},"60 seconds for requests without an operation-specific override",[278,332,333,334,337],{},"Pass ",[14,335,336],{},"request_timeout"," in seconds",[339,340,341],"blockquote",{},[10,342,343,346,347,349,350,353,354,357],{},[19,344,345],{},"SDK authentication is separate from CLI login."," ",[14,348,154],{}," reads the current process environment. It does not load ",[14,351,352],{},".env"," files or credentials saved by ",[14,355,356],{},"visionstory login","; your application must load or inject environment variables before creating the client.",[141,359,361],{"id":360},"custom-setup-choose-another-api-address","Custom setup: choose another API address",[10,363,364],{},"Use this only for a trusted proxy, gateway, or test server that implements the VisionStory API. The simplest option is to change the environment and keep your Python code unchanged:",[32,366,368],{"className":34,"code":367,"language":36,"meta":37,"style":37},"# macOS \u002F Linux \u002F WSL shell; applies to this terminal and its child processes\nexport VISIONSTORY_API_BASE=\"https:\u002F\u002Fyour-api.example.com\"\n",[14,369,370,375],{"__ignoreMap":37},[41,371,372],{"class":43,"line":44},[41,373,374],{"class":117},"# macOS \u002F Linux \u002F WSL shell; applies to this terminal and its child processes\n",[41,376,377,380,383,385],{"class":43,"line":97},[41,378,379],{"class":83},"export",[41,381,382],{"class":87}," VISIONSTORY_API_BASE",[41,384,191],{"class":83},[41,386,387],{"class":51},"\"https:\u002F\u002Fyour-api.example.com\"\n",[32,389,391],{"className":74,"code":390,"language":76,"meta":37,"style":37},"from visionstory import VisionStoryClient\n\nclient = VisionStoryClient.from_env(request_timeout=120)\n",[14,392,393,403,407],{"__ignoreMap":37},[41,394,395,397,399,401],{"class":43,"line":44},[41,396,84],{"class":83},[41,398,88],{"class":87},[41,400,91],{"class":83},[41,402,179],{"class":87},[41,404,405],{"class":43,"line":97},[41,406,101],{"emptyLinePlaceholder":100},[41,408,409,411,413,416,419,421,424],{"class":43,"line":104},[41,410,188],{"class":87},[41,412,191],{"class":83},[41,414,415],{"class":87}," VisionStoryClient.from_env(",[41,417,336],{"class":418},"s4XuR",[41,420,191],{"class":83},[41,422,423],{"class":107},"120",[41,425,252],{"class":87},[10,427,428,429,432],{},"To return to the official API, remove the override (",[14,430,431],{},"unset VISIONSTORY_API_BASE"," in the same shell), then create a new client. Do not set it to an empty string.",[10,434,435],{},"For per-client settings, pass the values explicitly:",[32,437,439],{"className":74,"code":438,"language":76,"meta":37,"style":37},"import os\nfrom visionstory import VisionStoryClient\n\nclient = VisionStoryClient(\n    api_key=os.environ[\"VISIONSTORY_API_KEY\"],\n    base_url=\"https:\u002F\u002Fyour-api.example.com\",\n    request_timeout=120,\n)\n",[14,440,441,447,457,461,470,485,499,511],{"__ignoreMap":37},[41,442,443,445],{"class":43,"line":44},[41,444,91],{"class":83},[41,446,226],{"class":87},[41,448,449,451,453,455],{"class":43,"line":97},[41,450,84],{"class":83},[41,452,88],{"class":87},[41,454,91],{"class":83},[41,456,179],{"class":87},[41,458,459],{"class":43,"line":104},[41,460,101],{"emptyLinePlaceholder":100},[41,462,463,465,467],{"class":43,"line":114},[41,464,188],{"class":87},[41,466,191],{"class":83},[41,468,469],{"class":87}," VisionStoryClient(\n",[41,471,473,476,478,480,482],{"class":43,"line":472},5,[41,474,475],{"class":418},"    api_key",[41,477,191],{"class":83},[41,479,235],{"class":87},[41,481,238],{"class":51},[41,483,484],{"class":87},"],\n",[41,486,488,491,493,496],{"class":43,"line":487},6,[41,489,490],{"class":418},"    base_url",[41,492,191],{"class":83},[41,494,495],{"class":51},"\"https:\u002F\u002Fyour-api.example.com\"",[41,497,498],{"class":87},",\n",[41,500,502,505,507,509],{"class":43,"line":501},7,[41,503,504],{"class":418},"    request_timeout",[41,506,191],{"class":83},[41,508,423],{"class":107},[41,510,498],{"class":87},[41,512,514],{"class":43,"line":513},8,[41,515,252],{"class":87},[10,517,518,346,521,523,524,526,527,529],{},[19,519,520],{},"Configuration precedence:",[14,522,154],{}," reads both environment variables. The direct constructor uses its arguments and defaults; it does not read ",[14,525,309],{},". If you omit ",[14,528,322],{}," from the constructor, it uses the official address even when that environment variable is set. Changes to environment variables do not update an existing client.",[339,531,532],{},[10,533,534,537,538,541,542,545,546,549],{},[19,535,536],{},"Use a trusted HTTPS address."," SDK requests send your key in the ",[14,539,540],{},"X-API-Key"," header to the configured server. Provide the base address without ",[14,543,544],{},"\u002Fapi\u002Fv1",": SDK methods append paths such as ",[14,547,548],{},"\u002Fapi\u002Fv1\u002Fmodels",". Changing the domain does not make an unrelated API compatible.",[10,551,552,554,555,558,559,562],{},[14,553,336],{}," controls HTTP requests, not total video rendering time. Some operations use their own request timeout. Configure asynchronous waiting separately with ",[14,556,557],{},"wait_for_video(..., timeout=600)","; downloads have their own ",[14,560,561],{},"client.download(url, path, timeout=120)"," setting.",[27,564,566],{"id":565},"generate-a-talking-avatar-video-in-python","Generate a talking avatar video in Python",[10,568,569,572],{},[14,570,571],{},"generate_video"," submits the job and polls until it finishes — one call in, a finished video out:",[32,574,576],{"className":74,"code":575,"language":76,"meta":37,"style":37},"from pathlib import Path\nfrom visionstory import VisionStoryClient, build_video_payload\n\nclient = VisionStoryClient.from_env()\n\npayload = build_video_payload(\n    avatar_id=\"YOUR_AVATAR_ID\",        # select from client.list_avatars()\n    text=\"Hello World, this is my first video.\",\n    voice_id=\"YOUR_VOICE_ID\",          # select from client.list_voices()\n)\nvideo = client.generate_video(payload)          # submit + poll until \"created\"\nclient.download(video[\"video_url\"], Path(\"result.mp4\"))\nprint(\"saved result.mp4\")\n",[14,577,578,590,601,605,613,617,627,643,655,672,677,691,709],{"__ignoreMap":37},[41,579,580,582,585,587],{"class":43,"line":44},[41,581,84],{"class":83},[41,583,584],{"class":87}," pathlib ",[41,586,91],{"class":83},[41,588,589],{"class":87}," Path\n",[41,591,592,594,596,598],{"class":43,"line":97},[41,593,84],{"class":83},[41,595,88],{"class":87},[41,597,91],{"class":83},[41,599,600],{"class":87}," VisionStoryClient, build_video_payload\n",[41,602,603],{"class":43,"line":104},[41,604,101],{"emptyLinePlaceholder":100},[41,606,607,609,611],{"class":43,"line":114},[41,608,188],{"class":87},[41,610,191],{"class":83},[41,612,194],{"class":87},[41,614,615],{"class":43,"line":472},[41,616,101],{"emptyLinePlaceholder":100},[41,618,619,622,624],{"class":43,"line":487},[41,620,621],{"class":87},"payload ",[41,623,191],{"class":83},[41,625,626],{"class":87}," build_video_payload(\n",[41,628,629,632,634,637,640],{"class":43,"line":501},[41,630,631],{"class":418},"    avatar_id",[41,633,191],{"class":83},[41,635,636],{"class":51},"\"YOUR_AVATAR_ID\"",[41,638,639],{"class":87},",        ",[41,641,642],{"class":117},"# select from client.list_avatars()\n",[41,644,645,648,650,653],{"class":43,"line":513},[41,646,647],{"class":418},"    text",[41,649,191],{"class":83},[41,651,652],{"class":51},"\"Hello World, this is my first video.\"",[41,654,498],{"class":87},[41,656,658,661,663,666,669],{"class":43,"line":657},9,[41,659,660],{"class":418},"    voice_id",[41,662,191],{"class":83},[41,664,665],{"class":51},"\"YOUR_VOICE_ID\"",[41,667,668],{"class":87},",          ",[41,670,671],{"class":117},"# select from client.list_voices()\n",[41,673,675],{"class":43,"line":674},10,[41,676,252],{"class":87},[41,678,680,683,685,688],{"class":43,"line":679},11,[41,681,682],{"class":87},"video ",[41,684,191],{"class":83},[41,686,687],{"class":87}," client.generate_video(payload)          ",[41,689,690],{"class":117},"# submit + poll until \"created\"\n",[41,692,694,697,700,703,706],{"class":43,"line":693},12,[41,695,696],{"class":87},"client.download(video[",[41,698,699],{"class":51},"\"video_url\"",[41,701,702],{"class":87},"], Path(",[41,704,705],{"class":51},"\"result.mp4\"",[41,707,708],{"class":87},"))\n",[41,710,712,714,717,720],{"class":43,"line":711},13,[41,713,108],{"class":107},[41,715,716],{"class":87},"(",[41,718,719],{"class":51},"\"saved result.mp4\"",[41,721,252],{"class":87},[10,723,724,727,728,346,731,346,734,737,738,741,742,745,746,745,749,745,752,755,756,759],{},[14,725,726],{},"build_video_payload"," takes ",[14,729,730],{},"text",[19,732,733],{},"or",[14,735,736],{},"audio_url"," \u002F ",[14,739,740],{},"audio_file"," (exactly one), plus optional ",[14,743,744],{},"model_id",", ",[14,747,748],{},"aspect_ratio",[14,750,751],{},"resolution",[14,753,754],{},"speech_rate",", and more — it maps directly to the ",[14,757,758],{},"POST \u002Fapi\u002Fv1\u002Fvideo"," body.",[27,761,763],{"id":762},"use-the-visionstory-cli","Use the VisionStory CLI",[10,765,766,767,770,771,773],{},"A separate ",[14,768,769],{},"visionstory-cli"," package provides a ",[14,772,16],{}," command that covers the same surface — no code required:",[32,775,777],{"className":34,"code":776,"language":36,"meta":37,"style":37},"visionstory create-video --avatar-id YOUR_AVATAR_ID --text \"Hello from VisionStory.\" --voice-id YOUR_VOICE_ID --output result.mp4\n",[14,778,779],{"__ignoreMap":37},[41,780,781,783,786,789,792,795,798,801,804,807],{"class":43,"line":44},[41,782,16],{"class":47},[41,784,785],{"class":51}," create-video",[41,787,788],{"class":107}," --avatar-id",[41,790,791],{"class":51}," YOUR_AVATAR_ID",[41,793,794],{"class":107}," --text",[41,796,797],{"class":51}," \"Hello from VisionStory.\"",[41,799,800],{"class":107}," --voice-id",[41,802,803],{"class":51}," YOUR_VOICE_ID",[41,805,806],{"class":107}," --output",[41,808,809],{"class":51}," result.mp4\n",[10,811,812,813,817],{},"See the ",[64,814,816],{"href":815},"\u002Fguides\u002Fcli","CLI"," guide for every command, flag, and example.",[27,819,821],{"id":820},"list-models-avatars-voices-and-credits","List models, avatars, voices, and credits",[10,823,824],{},"Don't hardcode IDs — list them and pick at runtime:",[32,826,828],{"className":74,"code":827,"language":76,"meta":37,"style":37},"client.list_models()      # avatar render models\nclient.list_avatars(limit=20)                  # owned avatars\nclient.list_avatars(is_public=True, limit=20)  # public avatar library\nclient.list_voices(locale=\"es-MX\", provider=\"minimax\", limit=50)\nclient.get_credits()      # remaining balance\n",[14,829,830,838,857,883,917],{"__ignoreMap":37},[41,831,832,835],{"class":43,"line":44},[41,833,834],{"class":87},"client.list_models()      ",[41,836,837],{"class":117},"# avatar render models\n",[41,839,840,843,846,848,851,854],{"class":43,"line":97},[41,841,842],{"class":87},"client.list_avatars(",[41,844,845],{"class":418},"limit",[41,847,191],{"class":83},[41,849,850],{"class":107},"20",[41,852,853],{"class":87},")                  ",[41,855,856],{"class":117},"# owned avatars\n",[41,858,859,861,864,866,869,871,873,875,877,880],{"class":43,"line":104},[41,860,842],{"class":87},[41,862,863],{"class":418},"is_public",[41,865,191],{"class":83},[41,867,868],{"class":107},"True",[41,870,745],{"class":87},[41,872,845],{"class":418},[41,874,191],{"class":83},[41,876,850],{"class":107},[41,878,879],{"class":87},")  ",[41,881,882],{"class":117},"# public avatar library\n",[41,884,885,888,891,893,896,898,901,903,906,908,910,912,915],{"class":43,"line":114},[41,886,887],{"class":87},"client.list_voices(",[41,889,890],{"class":418},"locale",[41,892,191],{"class":83},[41,894,895],{"class":51},"\"es-MX\"",[41,897,745],{"class":87},[41,899,900],{"class":418},"provider",[41,902,191],{"class":83},[41,904,905],{"class":51},"\"minimax\"",[41,907,745],{"class":87},[41,909,845],{"class":418},[41,911,191],{"class":83},[41,913,914],{"class":107},"50",[41,916,252],{"class":87},[41,918,919,922],{"class":43,"line":472},[41,920,921],{"class":87},"client.get_credits()      ",[41,923,924],{"class":117},"# remaining balance\n",[27,926,928],{"id":927},"verify-sdk-cli-and-mcp-compatibility","Verify SDK, CLI, and MCP compatibility",[32,930,932],{"className":74,"code":931,"language":76,"meta":37,"style":37},"from visionstory import get_contract_info\n\nprint(get_contract_info())\n# contract_version, SHA-256 contract_hash, and operation_count=28\n",[14,933,934,945,949,956],{"__ignoreMap":37},[41,935,936,938,940,942],{"class":43,"line":44},[41,937,84],{"class":83},[41,939,88],{"class":87},[41,941,91],{"class":83},[41,943,944],{"class":87}," get_contract_info\n",[41,946,947],{"class":43,"line":97},[41,948,101],{"emptyLinePlaceholder":100},[41,950,951,953],{"class":43,"line":104},[41,952,108],{"class":107},[41,954,955],{"class":87},"(get_contract_info())\n",[41,957,958],{"class":43,"line":114},[41,959,960],{"class":117},"# contract_version, SHA-256 contract_hash, and operation_count=28\n",[10,962,963,964,967,968,971],{},"The same fingerprint is available through ",[14,965,966],{},"visionstory contract"," and the MCP\nresource ",[14,969,970],{},"visionstory:\u002F\u002Fcontract",". Matching values mean the SDK, CLI, and MCP\nserver were built from the same OpenAPI and channel mapping.",[27,973,975],{"id":974},"create-avatars-clone-voices-and-upload-assets","Create avatars, clone voices, and upload assets",[32,977,979],{"className":74,"code":978,"language":76,"meta":37,"style":37},"avatar = client.create_avatar(image_url=\"https:\u002F\u002Fyour.site\u002Fface.jpg\")   # or image_file=Path(\"face.jpg\")\nclient.update_avatar_framing(\n    avatar_id=avatar[\"avatar_id\"],\n    aspect_ratio=\"9:16\",\n    zoom=1.2,\n    offset_x=0,\n    offset_y=-0.25,\n)\nclient.clone_voice(audio_url=\"https:\u002F\u002Fyour.site\u002Fsample.mp3\")   # or audio_file=Path(\"sample.mp3\")\nclient.upload_asset(url=\"https:\u002F\u002Fyour.site\u002Fclip.mp4\")          # or file_path=Path(\"clip.mp4\")\n",[14,980,981,1005,1010,1024,1036,1048,1060,1073,1077,1094],{"__ignoreMap":37},[41,982,983,986,988,991,994,996,999,1002],{"class":43,"line":44},[41,984,985],{"class":87},"avatar ",[41,987,191],{"class":83},[41,989,990],{"class":87}," client.create_avatar(",[41,992,993],{"class":418},"image_url",[41,995,191],{"class":83},[41,997,998],{"class":51},"\"https:\u002F\u002Fyour.site\u002Fface.jpg\"",[41,1000,1001],{"class":87},")   ",[41,1003,1004],{"class":117},"# or image_file=Path(\"face.jpg\")\n",[41,1006,1007],{"class":43,"line":97},[41,1008,1009],{"class":87},"client.update_avatar_framing(\n",[41,1011,1012,1014,1016,1019,1022],{"class":43,"line":104},[41,1013,631],{"class":418},[41,1015,191],{"class":83},[41,1017,1018],{"class":87},"avatar[",[41,1020,1021],{"class":51},"\"avatar_id\"",[41,1023,484],{"class":87},[41,1025,1026,1029,1031,1034],{"class":43,"line":114},[41,1027,1028],{"class":418},"    aspect_ratio",[41,1030,191],{"class":83},[41,1032,1033],{"class":51},"\"9:16\"",[41,1035,498],{"class":87},[41,1037,1038,1041,1043,1046],{"class":43,"line":472},[41,1039,1040],{"class":418},"    zoom",[41,1042,191],{"class":83},[41,1044,1045],{"class":107},"1.2",[41,1047,498],{"class":87},[41,1049,1050,1053,1055,1058],{"class":43,"line":487},[41,1051,1052],{"class":418},"    offset_x",[41,1054,191],{"class":83},[41,1056,1057],{"class":107},"0",[41,1059,498],{"class":87},[41,1061,1062,1065,1068,1071],{"class":43,"line":501},[41,1063,1064],{"class":418},"    offset_y",[41,1066,1067],{"class":83},"=-",[41,1069,1070],{"class":107},"0.25",[41,1072,498],{"class":87},[41,1074,1075],{"class":43,"line":513},[41,1076,252],{"class":87},[41,1078,1079,1082,1084,1086,1089,1091],{"class":43,"line":657},[41,1080,1081],{"class":87},"client.clone_voice(",[41,1083,736],{"class":418},[41,1085,191],{"class":83},[41,1087,1088],{"class":51},"\"https:\u002F\u002Fyour.site\u002Fsample.mp3\"",[41,1090,1001],{"class":87},[41,1092,1093],{"class":117},"# or audio_file=Path(\"sample.mp3\")\n",[41,1095,1096,1099,1102,1104,1107,1110],{"class":43,"line":674},[41,1097,1098],{"class":87},"client.upload_asset(",[41,1100,1101],{"class":418},"url",[41,1103,191],{"class":83},[41,1105,1106],{"class":51},"\"https:\u002F\u002Fyour.site\u002Fclip.mp4\"",[41,1108,1109],{"class":87},")          ",[41,1111,1112],{"class":117},"# or file_path=Path(\"clip.mp4\")\n",[10,1114,1115,1116,1118,1119,1122,1123,1126,1127,1130,1131,1133,1134,1137],{},"Avatar listing is cursor-paginated and returns one collection at a time. Omit ",[14,1117,863],{}," for avatars owned by the current account, or set ",[14,1120,1121],{},"is_public=True"," for the public library. Follow ",[14,1124,1125],{},"next_cursor"," with ",[14,1128,1129],{},"cursor="," and choose a ",[14,1132,845],{}," from 1 to 100. Only owned avatars can be reframed; read the avatar's current ",[14,1135,1136],{},"framing"," entries before updating one aspect ratio.",[10,1139,1140,1143,1144,1147,1148,1152],{},[14,1141,1142],{},"upload_asset"," returns a reusable ",[14,1145,1146],{},"asset_id"," you can reference from ",[64,1149,1151],{"href":1150},"\u002Fguides\u002Fai-video","AI Video"," requests.",[27,1154,1156],{"id":1155},"transcribe-audio-and-create-subtitles","Transcribe audio and create subtitles",[10,1158,1159,1160,1163,1164,1167],{},"Transcribe WAV or MP3 audio from a local path, public URL, or reusable asset. Add ",[14,1161,1162],{},"diarize=True"," for speaker labels and ",[14,1165,1166],{},"srt=True"," for subtitle output:",[32,1169,1171],{"className":74,"code":1170,"language":76,"meta":37,"style":37},"from pathlib import Path\n\ntranscript = client.transcribe_audio(\n    audio_file=Path(\"interview.mp3\"),\n    diarize=True,\n    srt=True,\n)\nPath(\"interview.srt\").write_text(transcript[\"srt\"], encoding=\"utf-8\")\n\nalignment = client.align_audio(\n    text=\"Welcome to VisionStory.\",\n    asset_id=\"YOUR_AUDIO_ASSET_ID\",\n)\n",[14,1172,1173,1183,1187,1197,1213,1224,1235,1239,1265,1269,1279,1290,1302],{"__ignoreMap":37},[41,1174,1175,1177,1179,1181],{"class":43,"line":44},[41,1176,84],{"class":83},[41,1178,584],{"class":87},[41,1180,91],{"class":83},[41,1182,589],{"class":87},[41,1184,1185],{"class":43,"line":97},[41,1186,101],{"emptyLinePlaceholder":100},[41,1188,1189,1192,1194],{"class":43,"line":104},[41,1190,1191],{"class":87},"transcript ",[41,1193,191],{"class":83},[41,1195,1196],{"class":87}," client.transcribe_audio(\n",[41,1198,1199,1202,1204,1207,1210],{"class":43,"line":114},[41,1200,1201],{"class":418},"    audio_file",[41,1203,191],{"class":83},[41,1205,1206],{"class":87},"Path(",[41,1208,1209],{"class":51},"\"interview.mp3\"",[41,1211,1212],{"class":87},"),\n",[41,1214,1215,1218,1220,1222],{"class":43,"line":472},[41,1216,1217],{"class":418},"    diarize",[41,1219,191],{"class":83},[41,1221,868],{"class":107},[41,1223,498],{"class":87},[41,1225,1226,1229,1231,1233],{"class":43,"line":487},[41,1227,1228],{"class":418},"    srt",[41,1230,191],{"class":83},[41,1232,868],{"class":107},[41,1234,498],{"class":87},[41,1236,1237],{"class":43,"line":501},[41,1238,252],{"class":87},[41,1240,1241,1243,1246,1249,1252,1255,1258,1260,1263],{"class":43,"line":513},[41,1242,1206],{"class":87},[41,1244,1245],{"class":51},"\"interview.srt\"",[41,1247,1248],{"class":87},").write_text(transcript[",[41,1250,1251],{"class":51},"\"srt\"",[41,1253,1254],{"class":87},"], ",[41,1256,1257],{"class":418},"encoding",[41,1259,191],{"class":83},[41,1261,1262],{"class":51},"\"utf-8\"",[41,1264,252],{"class":87},[41,1266,1267],{"class":43,"line":657},[41,1268,101],{"emptyLinePlaceholder":100},[41,1270,1271,1274,1276],{"class":43,"line":674},[41,1272,1273],{"class":87},"alignment ",[41,1275,191],{"class":83},[41,1277,1278],{"class":87}," client.align_audio(\n",[41,1280,1281,1283,1285,1288],{"class":43,"line":679},[41,1282,647],{"class":418},[41,1284,191],{"class":83},[41,1286,1287],{"class":51},"\"Welcome to VisionStory.\"",[41,1289,498],{"class":87},[41,1291,1292,1295,1297,1300],{"class":43,"line":693},[41,1293,1294],{"class":418},"    asset_id",[41,1296,191],{"class":83},[41,1298,1299],{"class":51},"\"YOUR_AUDIO_ASSET_ID\"",[41,1301,498],{"class":87},[41,1303,1304],{"class":43,"line":711},[41,1305,252],{"class":87},[10,1307,1308,1309,1313],{},"See ",[64,1310,1312],{"href":1311},"\u002Fguides\u002Faudio-understanding","Audio Transcription and Alignment"," for request shapes, limits, word timestamps, and billing.",[27,1315,1317],{"id":1316},"synthesize-localized-speech","Synthesize localized speech",[32,1319,1321],{"className":74,"code":1320,"language":76,"meta":37,"style":37},"speech = client.create_speech(\n    text=\"Welcome to VisionStory.\",\n    voice_id=\"YOUR_VOICE_ID\",\n    locale=\"en-GB\",\n)\nPath(\"speech.mp3\").write_bytes(speech[\"audio\"])\n",[14,1322,1323,1333,1343,1353,1365,1369],{"__ignoreMap":37},[41,1324,1325,1328,1330],{"class":43,"line":44},[41,1326,1327],{"class":87},"speech ",[41,1329,191],{"class":83},[41,1331,1332],{"class":87}," client.create_speech(\n",[41,1334,1335,1337,1339,1341],{"class":43,"line":97},[41,1336,647],{"class":418},[41,1338,191],{"class":83},[41,1340,1287],{"class":51},[41,1342,498],{"class":87},[41,1344,1345,1347,1349,1351],{"class":43,"line":104},[41,1346,660],{"class":418},[41,1348,191],{"class":83},[41,1350,665],{"class":51},[41,1352,498],{"class":87},[41,1354,1355,1358,1360,1363],{"class":43,"line":114},[41,1356,1357],{"class":418},"    locale",[41,1359,191],{"class":83},[41,1361,1362],{"class":51},"\"en-GB\"",[41,1364,498],{"class":87},[41,1366,1367],{"class":43,"line":472},[41,1368,252],{"class":87},[41,1370,1371,1373,1376,1379,1382],{"class":43,"line":487},[41,1372,1206],{"class":87},[41,1374,1375],{"class":51},"\"speech.mp3\"",[41,1377,1378],{"class":87},").write_bytes(speech[",[41,1380,1381],{"class":51},"\"audio\"",[41,1383,1384],{"class":87},"])\n",[27,1386,1388],{"id":1387},"control-asynchronous-polling","Control asynchronous polling",[10,1390,1391],{},"Submit and poll separately when you want to show progress or do other work in between:",[32,1393,1395],{"className":74,"code":1394,"language":76,"meta":37,"style":37},"created = client.create_video(payload)          # returns immediately with a video_id\nvideo = client.wait_for_video(created[\"video_id\"], poll_interval=5, timeout=600)\n",[14,1396,1397,1410],{"__ignoreMap":37},[41,1398,1399,1402,1404,1407],{"class":43,"line":44},[41,1400,1401],{"class":87},"created ",[41,1403,191],{"class":83},[41,1405,1406],{"class":87}," client.create_video(payload)          ",[41,1408,1409],{"class":117},"# returns immediately with a video_id\n",[41,1411,1412,1414,1416,1419,1422,1424,1427,1429,1432,1434,1437,1439,1442],{"class":43,"line":97},[41,1413,682],{"class":87},[41,1415,191],{"class":83},[41,1417,1418],{"class":87}," client.wait_for_video(created[",[41,1420,1421],{"class":51},"\"video_id\"",[41,1423,1254],{"class":87},[41,1425,1426],{"class":418},"poll_interval",[41,1428,191],{"class":83},[41,1430,1431],{"class":107},"5",[41,1433,745],{"class":87},[41,1435,1436],{"class":418},"timeout",[41,1438,191],{"class":83},[41,1440,1441],{"class":107},"600",[41,1443,252],{"class":87},[10,1445,1446,1449,1450,135],{},[14,1447,1448],{},"generate_video(payload, wait=False)"," is equivalent to ",[14,1451,1452],{},"create_video",[27,1454,1456],{"id":1455},"handle-sdk-errors-and-timeouts","Handle SDK errors and timeouts",[32,1458,1460],{"className":74,"code":1459,"language":76,"meta":37,"style":37},"from visionstory import VisionStoryAPIError, VideoTimeoutError\n\ntry:\n    video = client.generate_video(payload)\nexcept VideoTimeoutError:\n    ...   # still not finished after `timeout` seconds\nexcept VisionStoryAPIError as e:\n    ...   # API returned an error, or the task failed — credits for failed tasks are refunded automatically\n",[14,1461,1462,1473,1477,1485,1495,1503,1511,1524],{"__ignoreMap":37},[41,1463,1464,1466,1468,1470],{"class":43,"line":44},[41,1465,84],{"class":83},[41,1467,88],{"class":87},[41,1469,91],{"class":83},[41,1471,1472],{"class":87}," VisionStoryAPIError, VideoTimeoutError\n",[41,1474,1475],{"class":43,"line":97},[41,1476,101],{"emptyLinePlaceholder":100},[41,1478,1479,1482],{"class":43,"line":104},[41,1480,1481],{"class":83},"try",[41,1483,1484],{"class":87},":\n",[41,1486,1487,1490,1492],{"class":43,"line":114},[41,1488,1489],{"class":87},"    video ",[41,1491,191],{"class":83},[41,1493,1494],{"class":87}," client.generate_video(payload)\n",[41,1496,1497,1500],{"class":43,"line":472},[41,1498,1499],{"class":83},"except",[41,1501,1502],{"class":87}," VideoTimeoutError:\n",[41,1504,1505,1508],{"class":43,"line":487},[41,1506,1507],{"class":107},"    ...",[41,1509,1510],{"class":117},"   # still not finished after `timeout` seconds\n",[41,1512,1513,1515,1518,1521],{"class":43,"line":501},[41,1514,1499],{"class":83},[41,1516,1517],{"class":87}," VisionStoryAPIError ",[41,1519,1520],{"class":83},"as",[41,1522,1523],{"class":87}," e:\n",[41,1525,1526,1528],{"class":43,"line":513},[41,1527,1507],{"class":107},[41,1529,1530],{"class":117},"   # API returned an error, or the task failed — credits for failed tasks are refunded automatically\n",[27,1532,1534],{"id":1533},"related-visionstory-developer-guides","Related VisionStory developer guides",[1536,1537,1538,1546,1553,1558],"ul",{},[1539,1540,1541,1545],"li",{},[64,1542,1544],{"href":1543},"\u002Fguides\u002Fquick-start","Quick start"," — the same flow, step by step.",[1539,1547,1548,1552],{},[64,1549,1551],{"href":1550},"\u002Fguides\u002Ffor-agents","For agents"," — let an AI agent drive the API via the Skill or MCP server.",[1539,1554,1555,1557],{},[64,1556,1312],{"href":1311}," — speech-to-text, SRT, and forced alignment.",[1539,1559,1560,1564],{},[64,1561,1563],{"href":1562},"\u002Freference","API reference"," — every endpoint the SDK wraps.",[27,1566,1568],{"id":1567},"structured-media-extraction-and-speech-rate","Structured media extraction and speech rate",[10,1570,1571,1572,1575,1576,745,1579,1582,1583,1586,1587,745,1590,1582,1593,135],{},"Use ",[14,1573,1574],{},"understand_media"," for schema-constrained JSON from images, audio, or video. It takes required ",[14,1577,1578],{},"prompt",[14,1580,1581],{},"inputs",", and ",[14,1584,1585],{},"schema",", waits synchronously for up to 180 seconds, and returns ",[14,1588,1589],{},"output",[14,1591,1592],{},"usage",[14,1594,1595],{},"cost_credit",[32,1597,1599],{"className":74,"code":1598,"language":76,"meta":37,"style":37},"from visionstory import VisionStoryClient\n\nclient = VisionStoryClient.from_env()\nresult = client.understand_media(\n    prompt=\"Identify the subject\",\n    inputs=[{\"asset_id\": \"YOUR_ASSET_ID\"}],\n    schema={\"type\": \"object\", \"properties\": {\"subject\": {\"type\": \"string\"}}, \"required\": [\"subject\"]},\n)\nprint(result[\"output\"])\n\nspeech = client.create_speech(text=\"Hello\", voice_id=\"YOUR_VOICE_ID\", speech_rate=\"slow\")\n# Save speech[\"audio\"] as MP3. Omit speech_rate to keep normal speed.\n",[14,1600,1601,1611,1615,1623,1633,1645,1667,1719,1723,1735,1739,1775],{"__ignoreMap":37},[41,1602,1603,1605,1607,1609],{"class":43,"line":44},[41,1604,84],{"class":83},[41,1606,88],{"class":87},[41,1608,91],{"class":83},[41,1610,179],{"class":87},[41,1612,1613],{"class":43,"line":97},[41,1614,101],{"emptyLinePlaceholder":100},[41,1616,1617,1619,1621],{"class":43,"line":104},[41,1618,188],{"class":87},[41,1620,191],{"class":83},[41,1622,194],{"class":87},[41,1624,1625,1628,1630],{"class":43,"line":114},[41,1626,1627],{"class":87},"result ",[41,1629,191],{"class":83},[41,1631,1632],{"class":87}," client.understand_media(\n",[41,1634,1635,1638,1640,1643],{"class":43,"line":472},[41,1636,1637],{"class":418},"    prompt",[41,1639,191],{"class":83},[41,1641,1642],{"class":51},"\"Identify the subject\"",[41,1644,498],{"class":87},[41,1646,1647,1650,1652,1655,1658,1661,1664],{"class":43,"line":487},[41,1648,1649],{"class":418},"    inputs",[41,1651,191],{"class":83},[41,1653,1654],{"class":87},"[{",[41,1656,1657],{"class":51},"\"asset_id\"",[41,1659,1660],{"class":87},": ",[41,1662,1663],{"class":51},"\"YOUR_ASSET_ID\"",[41,1665,1666],{"class":87},"}],\n",[41,1668,1669,1672,1674,1677,1680,1682,1685,1687,1690,1693,1696,1698,1700,1702,1705,1708,1711,1714,1716],{"class":43,"line":501},[41,1670,1671],{"class":418},"    schema",[41,1673,191],{"class":83},[41,1675,1676],{"class":87},"{",[41,1678,1679],{"class":51},"\"type\"",[41,1681,1660],{"class":87},[41,1683,1684],{"class":51},"\"object\"",[41,1686,745],{"class":87},[41,1688,1689],{"class":51},"\"properties\"",[41,1691,1692],{"class":87},": {",[41,1694,1695],{"class":51},"\"subject\"",[41,1697,1692],{"class":87},[41,1699,1679],{"class":51},[41,1701,1660],{"class":87},[41,1703,1704],{"class":51},"\"string\"",[41,1706,1707],{"class":87},"}}, ",[41,1709,1710],{"class":51},"\"required\"",[41,1712,1713],{"class":87},": [",[41,1715,1695],{"class":51},[41,1717,1718],{"class":87},"]},\n",[41,1720,1721],{"class":43,"line":513},[41,1722,252],{"class":87},[41,1724,1725,1727,1730,1733],{"class":43,"line":657},[41,1726,108],{"class":107},[41,1728,1729],{"class":87},"(result[",[41,1731,1732],{"class":51},"\"output\"",[41,1734,1384],{"class":87},[41,1736,1737],{"class":43,"line":674},[41,1738,101],{"emptyLinePlaceholder":100},[41,1740,1741,1743,1745,1748,1750,1752,1755,1757,1760,1762,1764,1766,1768,1770,1773],{"class":43,"line":679},[41,1742,1327],{"class":87},[41,1744,191],{"class":83},[41,1746,1747],{"class":87}," client.create_speech(",[41,1749,730],{"class":418},[41,1751,191],{"class":83},[41,1753,1754],{"class":51},"\"Hello\"",[41,1756,745],{"class":87},[41,1758,1759],{"class":418},"voice_id",[41,1761,191],{"class":83},[41,1763,665],{"class":51},[41,1765,745],{"class":87},[41,1767,754],{"class":418},[41,1769,191],{"class":83},[41,1771,1772],{"class":51},"\"slow\"",[41,1774,252],{"class":87},[41,1776,1777],{"class":43,"line":693},[41,1778,1779],{"class":117},"# Save speech[\"audio\"] as MP3. Omit speech_rate to keep normal speed.\n",[10,1781,1782,1784,1785,745,1788,1791,1792,1795,1796,1799,1800,1806,1807,1812],{},[14,1783,754],{}," accepts ",[14,1786,1787],{},"slow",[14,1789,1790],{},"normal",", or ",[14,1793,1794],{},"fast","; ",[14,1797,1798],{},"None"," leaves the field out. See ",[64,1801,1805],{"href":1802,"rel":1803},"https:\u002F\u002Fdevelopers.visionstory.ai\u002Fguides\u002Fmedia-understanding",[1804],"nofollow","Media Understanding"," for input limits, billing, and timeout handling, and ",[64,1808,1811],{"href":1809,"rel":1810},"https:\u002F\u002Fdevelopers.visionstory.ai\u002Fguides\u002Ftext-to-speech",[1804],"Text to Speech"," for binary responses.",[1814,1815,1816],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":37,"searchDepth":97,"depth":97,"links":1818},[1819,1820,1821,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835],{"id":29,"depth":97,"text":30},{"id":58,"depth":97,"text":59},{"id":138,"depth":97,"text":139,"children":1822},[1823,1824],{"id":143,"depth":104,"text":144},{"id":360,"depth":104,"text":361},{"id":565,"depth":97,"text":566},{"id":762,"depth":97,"text":763},{"id":820,"depth":97,"text":821},{"id":927,"depth":97,"text":928},{"id":974,"depth":97,"text":975},{"id":1155,"depth":97,"text":1156},{"id":1316,"depth":97,"text":1317},{"id":1387,"depth":97,"text":1388},{"id":1455,"depth":97,"text":1456},{"id":1533,"depth":97,"text":1534},{"id":1567,"depth":97,"text":1568},"Install the zero-dependency VisionStory Python SDK to generate media, filter voices, synthesize speech, transcribe audio, create subtitles, and manage API resources.","md",{},{"title":1840,"order":657},"Python SDK","\u002Fguides\u002Fsdk",{"title":5,"description":1836},"guides\u002Fsdk","NXifaj-DqzgiKRZI4r9mGrIojv4zzkxdtM6Gf6XawRc","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">pip\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> install\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> visionstory\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> visionstory \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> check_for_updates\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79C0FF\">print\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(check_for_updates())\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#8B949E\"># installed_version, latest_version, update_available, highlights, update_command\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> visionstory \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryClient\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryClient.from_env()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79C0FF\">print\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(client.get_credits())  \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># Read-only authentication check; does not generate media\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> getpass\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> os\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">os.environ[\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"VISIONSTORY_API_KEY\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">] \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> getpass.getpass(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"VisionStory API key (hidden): \"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#8B949E\"># macOS \u002F Linux \u002F WSL shell; applies to this terminal and its child processes\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">export\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VISIONSTORY_API_BASE\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"https:\u002F\u002Fyour-api.example.com\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> visionstory \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryClient\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryClient.from_env(\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">request_timeout\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">120\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> os\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> visionstory \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryClient\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryClient(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    api_key\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">os.environ[\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"VISIONSTORY_API_KEY\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    base_url\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"https:\u002F\u002Fyour-api.example.com\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    request_timeout\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">120\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> pathlib \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> Path\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> visionstory \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryClient, build_video_payload\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryClient.from_env()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">payload \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> build_video_payload(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    avatar_id\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"YOUR_AVATAR_ID\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,        \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># select from client.list_avatars()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    text\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"Hello World, this is my first video.\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    voice_id\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"YOUR_VOICE_ID\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,          \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># select from client.list_voices()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">video \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> client.generate_video(payload)          \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># submit + poll until \"created\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client.download(video[\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"video_url\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">], Path(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"result.mp4\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">))\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79C0FF\">print\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"saved result.mp4\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">visionstory\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> create-video\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> --avatar-id\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> YOUR_AVATAR_ID\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> --text\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> \"Hello from VisionStory.\"\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> --voice-id\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> YOUR_VOICE_ID\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> --output\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> result.mp4\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client.list_models()      \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># avatar render models\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client.list_avatars(\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">limit\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">20\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)                  \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># owned avatars\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client.list_avatars(\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">is_public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">True\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">limit\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">20\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)  \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># public avatar library\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client.list_voices(\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">locale\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"es-MX\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">provider\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"minimax\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">limit\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">50\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client.get_credits()      \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># remaining balance\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> visionstory \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> get_contract_info\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79C0FF\">print\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(get_contract_info())\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#8B949E\"># contract_version, SHA-256 contract_hash, and operation_count=28\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">avatar \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> client.create_avatar(\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">image_url\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"https:\u002F\u002Fyour.site\u002Fface.jpg\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)   \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># or image_file=Path(\"face.jpg\")\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client.update_avatar_framing(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    avatar_id\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">avatar[\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"avatar_id\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    aspect_ratio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"9:16\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    zoom\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">1.2\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    offset_x\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">0\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    offset_y\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=-\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">0.25\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client.clone_voice(\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">audio_url\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"https:\u002F\u002Fyour.site\u002Fsample.mp3\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)   \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># or audio_file=Path(\"sample.mp3\")\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client.upload_asset(\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">url\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"https:\u002F\u002Fyour.site\u002Fclip.mp4\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)          \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># or file_path=Path(\"clip.mp4\")\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> pathlib \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> Path\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">transcript \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> client.transcribe_audio(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    audio_file\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">Path(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"interview.mp3\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">),\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    diarize\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">True\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    srt\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">True\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">Path(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"interview.srt\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">).write_text(transcript[\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"srt\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">], \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">encoding\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"utf-8\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">alignment \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> client.align_audio(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    text\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"Welcome to VisionStory.\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    asset_id\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"YOUR_AUDIO_ASSET_ID\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">speech \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> client.create_speech(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    text\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"Welcome to VisionStory.\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    voice_id\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"YOUR_VOICE_ID\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    locale\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"en-GB\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">Path(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"speech.mp3\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">).write_bytes(speech[\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"audio\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">])\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">created \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> client.create_video(payload)          \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># returns immediately with a video_id\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">video \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> client.wait_for_video(created[\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"video_id\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">], \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">poll_interval\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">5\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">timeout\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">600\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> visionstory \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryAPIError, VideoTimeoutError\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">try\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">    video \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> client.generate_video(payload)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">except\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VideoTimeoutError:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79C0FF\">    ...\u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">   # still not finished after `timeout` seconds\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">except\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryAPIError \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">as\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> e:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79C0FF\">    ...\u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">   # API returned an error, or the task failed — credits for failed tasks are refunded automatically\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> visionstory \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryClient\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryClient.from_env()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">result \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> client.understand_media(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    prompt\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"Identify the subject\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    inputs\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">[{\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"asset_id\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"YOUR_ASSET_ID\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">}],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    schema\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">{\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"type\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"object\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"properties\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: {\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"subject\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: {\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"type\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"string\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">}}, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"required\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: [\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"subject\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">]},\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79C0FF\">print\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(result[\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"output\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">])\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">speech \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> client.create_speech(\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">text\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"Hello\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">voice_id\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"YOUR_VOICE_ID\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">speech_rate\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"slow\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#8B949E\"># Save speech[\"audio\"] as MP3. Omit speech_rate to keep normal speed.\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",1790231923841]