|
| 1 | +import { |
| 2 | + combineLatest, |
| 3 | + debounceTime, |
| 4 | + delay, |
| 5 | + distinctUntilChanged, |
| 6 | + filter, |
| 7 | + from, |
| 8 | + fromEvent, |
| 9 | + map, |
| 10 | + mergeMap, |
| 11 | + share, |
| 12 | + switchMap, |
| 13 | + tap, |
| 14 | +} from "https://cdn.jsdelivr.net/npm/rxjs@7.8.1/+esm"; |
| 15 | +import { connect, ground } from "./connect.js"; |
| 16 | +import { doLLM, extractResponse, generateImage } from "./llm.js"; |
| 17 | +import { BehaviourNode } from "./nodes/BehaviourNode.js"; |
| 18 | +import { CombinedDataUI } from "./nodes/CombinedDataUI.js"; |
| 19 | +import { Cursor } from "./nodes/Cursor.js"; |
| 20 | +import { DangerousUI } from "./nodes/DangerousUI.js"; |
| 21 | +import { GeneratedBackstoryUI } from "./nodes/GeneratedBackstoryUI.js"; |
| 22 | +import { GeneratedNameTagUI } from "./nodes/GeneratedNameTagUI.js"; |
| 23 | +import { GeneratedNameUI } from "./nodes/GeneratedNameUI.js"; |
| 24 | +import { PortraitUI } from "./nodes/PortraitUI.js"; |
| 25 | +import { GeneratedStatsUI } from "./nodes/GeneratedStatsUI.js"; |
| 26 | + |
| 27 | +const startButton = document.getElementById("startWorkflow"); |
| 28 | + |
| 29 | +const name$ = BehaviourNode(""); |
| 30 | +const nameUi$ = GeneratedNameUI(); |
| 31 | +const nameTagUi$ = GeneratedNameTagUI(); |
| 32 | +const danger$ = DangerousUI(); |
| 33 | +const cursor$ = Cursor(); |
| 34 | +const combined$ = CombinedDataUI(); |
| 35 | +const backstoryUi$ = GeneratedBackstoryUI(); |
| 36 | +const portraitUi$ = PortraitUI(); |
| 37 | +const statsUi$ = GeneratedStatsUI(); |
| 38 | + |
| 39 | +const character$ = combineLatest([ |
| 40 | + nameUi$.out.name, |
| 41 | + statsUi$.out.str, |
| 42 | + statsUi$.out.dex, |
| 43 | + statsUi$.out.con, |
| 44 | + statsUi$.out.int, |
| 45 | + statsUi$.out.wis, |
| 46 | + statsUi$.out.cha, |
| 47 | +]).pipe( |
| 48 | + map(([name, str, dex, con, int, wis, cha]) => ({ |
| 49 | + name, |
| 50 | + stats: { |
| 51 | + str, |
| 52 | + dex, |
| 53 | + con, |
| 54 | + int, |
| 55 | + wis, |
| 56 | + cha, |
| 57 | + }, |
| 58 | + })), |
| 59 | +); |
| 60 | + |
| 61 | +const backstory$ = character$.pipe( |
| 62 | + filter( |
| 63 | + (v) => |
| 64 | + v.name.length > 0 && |
| 65 | + (v.stats.str > 0 || |
| 66 | + v.stats.dex > 0 || |
| 67 | + v.stats.con > 0 || |
| 68 | + v.stats.int > 0 || |
| 69 | + v.stats.wis > 0 || |
| 70 | + v.stats.cha > 0), |
| 71 | + ), |
| 72 | + debounceTime(1000), |
| 73 | + distinctUntilChanged(), |
| 74 | + switchMap((character) => { |
| 75 | + console.log("character", character); |
| 76 | + return from( |
| 77 | + doLLM( |
| 78 | + JSON.stringify(character), |
| 79 | + "Write a possible backstory for this fantasy character in 280 characters or less.", |
| 80 | + ), |
| 81 | + ); |
| 82 | + }), |
| 83 | + map(extractResponse), |
| 84 | + share(), |
| 85 | +); |
| 86 | + |
| 87 | +const image$ = backstory$.pipe( |
| 88 | + debounceTime(1000), |
| 89 | + distinctUntilChanged(), |
| 90 | + switchMap((backstory) => { |
| 91 | + console.log("backstory", backstory); |
| 92 | + return from( |
| 93 | + generateImage( |
| 94 | + "Create a fantasy portrait of character based on this bio: " + |
| 95 | + backstory, |
| 96 | + ), |
| 97 | + ); |
| 98 | + }), |
| 99 | + share(), |
| 100 | +); |
| 101 | + |
| 102 | +connect(name$.out.value, nameUi$.in.name); |
| 103 | + |
| 104 | +connect(character$, combined$.in.data); |
| 105 | +connect(character$, combined$.in.render); |
| 106 | + |
| 107 | +connect(nameUi$.out.name, nameTagUi$.in.name); |
| 108 | +connect(nameUi$.out.name, nameTagUi$.in.render); |
| 109 | +connect(backstory$, backstoryUi$.in.backstory); |
| 110 | +connect(backstory$, backstoryUi$.in.render); |
| 111 | +connect(image$, portraitUi$.in.img); |
| 112 | +connect(image$, portraitUi$.in.render); |
| 113 | + |
| 114 | +ground(nameUi$.out.ui); |
| 115 | +ground(nameTagUi$.out.ui); |
| 116 | +ground(combined$.out.ui); |
| 117 | +// ground(danger$.out.ui); |
| 118 | +ground(backstoryUi$.out.ui); |
| 119 | +ground(portraitUi$.out.ui); |
| 120 | +ground(statsUi$.out.ui); |
| 121 | + |
| 122 | +character$.subscribe(console.log); |
| 123 | + |
| 124 | +ground( |
| 125 | + fromEvent(startButton, "click").pipe( |
| 126 | + tap(() => { |
| 127 | + // name$.in.value.next("Ben" + Math.floor(Math.random() * 1000)); |
| 128 | + nameUi$.in.generate.next(); |
| 129 | + nameTagUi$.in.generate.next(); |
| 130 | + // danger$.in.generate.next(); |
| 131 | + backstoryUi$.in.generate.next(); |
| 132 | + statsUi$.in.generate.next(); |
| 133 | + |
| 134 | + cursor$.in.render.next(); |
| 135 | + combined$.in.render.next(); |
| 136 | + }), |
| 137 | + ), |
| 138 | +); |
0 commit comments