---
categories:
  - "[[Meetings]]"
type: []
date: 2026-04-01
org:
loc:
people:
  - "[[Darsh Shah]]"
topics: []
granola_id: 767a76c7-d4f9-4336-bda8-15fef87e5541
source: granola
---

# Semantic Search - UE Call
## Notes

## Summary

### Architecture & Billing Model

- Semantic search is fully decoupled from Fab listings data

  - Uses a global embedding cache separate from any Fab database
  - Costs only incur on a cache miss (i.e. when an asset actually needs to be indexed)
- Current API calls (captioning, tagging, embedding) go directly to internal MLS services

  - Plan: route these through the EDA backend wrapper to hook into existing Fab billing/credit APIs
- Credit logic flow: MLS service calculates token cost → translates to credits → EDA backend logs credits per operation → calls Fab service to deduct balance
- Marat has a PR open for charging credits against an Epic ID (PR: [https://github.ol.epicgames.net/ArtStation/epic-developer-assistant/pull/223#discussion_r780243](https://github.ol.epicgames.net/ArtStation/epic-developer-assistant/pull/223#discussion_r780243))

  - Includes idempotency handling for failed charges
  - Balance check API also available; refund API not yet needed


### Credits & Pricing

- Proposed unit: 1 credit ≈ cost of indexing 1 asset ≈ ~$0.001 (i.e. ~$1 per 1,000 assets)

  - Mesh generation estimated at ~100 credits at this rate (~10x current EDA pricing)
  - Team aligned this isn’t alarming; credit inflation before launch is an option
- Keep credits as integers — avoid floats to prevent floating-point precision/accounting issues
- Search query cost estimated at $1–5 per 1 million queries (de minimis)

  - Keystroke-by-keystroke search would multiply query volume; first version will require hitting Enter to search
- Agreed heuristic: price indexing slightly above average cost to cover margin; big margins come from credit pack pricing tiers, not per-call margins
- Fractional credits deferred — preference to keep integer units and set 1 credit as the smallest meaningful charge


### Next Steps

- Jack

  - Add semantic search credit charging to the EDA backend
  - Align with Eugene and Mark on credit FX / margin analysis for embedding costs
- Darsh

  - Take auth/token integration offline with Jack — reuse existing EDA auth approach (Talent integration for bot abuse protection)
- Jack + Dan Prisman

  - Discuss UX flow for indexing (button vs. auto-index); first version will be manual button, auto-index off by default
  - Deploy prototype to Corgi for UX review

Chat with meeting transcript: [https://notes.granola.ai/t/ad9e32ee-8837-4fcf-94e4-65983e74b8ad](https://notes.granola.ai/t/ad9e32ee-8837-4fcf-94e4-65983e74b8ad)

[https://github.ol.epicgames.net/ArtStation/epic-developer-assistant/pull/223#discussion_r780243](https://github.ol.epicgames.net/ArtStation/epic-developer-assistant/pull/223#discussion_r780243)

## Transcript

**system**: Have as an internal plugin right now.

**system**: Or end of this week.

**system**: That will mean that when you type in the content browser.

**system**: There's an option to use semantic search.

**system**: And then slightly later down the line.

**system**: We're also wrap a tool around it. So the EDA can use it.

**system**: And the main point of this call is to start the conversations around the billing side or the credit side of the indexing required, a semantic search.

**system**: And also.

**system**: The kind of.

**system**: Credit system behind that and making sure.

**system**: That is considered in the same credit system as the EDA.

**system**: Also the authentication stuff is something that we is kind of like unresolved at the moment.

**system**: So those are the three.

**system**: Areas that I thought we should just discuss.

**system**: Yeah. Can I ask a couple.

**system**: Just prerequisite clarifying questions before we get into those?

**system**: So as I've discussed some of the semantic search stuff in conversations I've been in so far.

**system**: It seems like there's a little bit of overlap with what fab is doing because fab is also working on doing like semantic search indexing or like listings and working with MLS team to go through generate embeddings, store that, use it in our open search cluster.

**system**: My understanding is that.

**system**: This is separate. So like there's been some overlap when like content drawer comes up.

**system**: Where Marx asked us to consider, like if something's imported from fab into the content drawer, is there any potential reuse we get from the embeddings that we're already making on the fab side of things?

**system**: It seems like.

**system**: Any reuse there may be more in the MLS domain because I know they were talking about like if they get a request for getting embeddings for a file they've seen before then managing like caching to help manage costs and things better.

**system**: But from what I can tell reading through all of this description.

**system**: In your mind, the like the semantic search path here.

**system**: Is decoupled from the actual fab listings and any of the fab data happens to use the same MLS.

**system**: Team structures to go and generate the embeddings and get them cached locally on the client and maybe to translate the search queries to embeddings. But generally it sounds like you're holding.

**system**: The like holding the data locally and client doing whatever the like cosine, you know, whatever the query is.

**system**: To match things with the thresholds. But the costs, from what I'm understanding come in from a combination of the calls that you're trying to make to get the search queries turn into embeddings and then the call to index the assets into embeddings.

**system**: And if that's correct or both of those calls plan to go against EDA backends, in which case the billing conversation is just how and when does EDA backend call the fab, the fab credit APIs to ledger that or is there more of a request there for fab to help with some of the rest of the semantic search piece itself?

**system**: So the first part of your question is.

**system**: Exactly as you described it. It's completely decoupled from fab data.

**system**: There is a global caching system for the embeddings that's separate from any fab database.

**system**: On your second point.

**system**: I'm sorry.

**system**: I think you were leaning into it, but the, yeah, the, the other thing on my mind, like if we're talking about like credit charges and billing, it sounds like in that case, if you have different billing for like a cash hit versus a cash miss, that would still be all in your back end before you would necessarily determine and go to like ledger billing.

**system**: Correct.

**system**: Is that a safe assumption? Or maybe.

**system**: I think the intention is.

**system**: That it would only cost.

**system**: Money to index an asset.

**system**: If there was a cash miss.

**system**: Meaning we actually need to make a call to capture and tag and embed the assets.

**system**: Yeah, I think the important part of that question is any kind of business logic like that would be contained in the EDA back end, correct? Like that wouldn't be business logic that we would necessarily have visibility to.

**system**: I guess really what I'm boiling down to of the is, is, is the main thing you're looking for just how to connect that flow to the same billing APIs we're using for the other eda calls.

**microphone**: Figuring out exactly.

**system**: Yes, essentially that and like right now all of the API pings for this.

**system**: Like the captioning, the tagging, the embedding, go directly to like internal MLS services. And so, you know, the work that.

**system**: We need to do and kind of why I wanted to start chatting about this is.

**system**: We will need to route those API pings.

**system**: Through.

**system**: Some wrapper service that is hooked up to the, you know, the fab backends or billing that you're already doing. I think it would make a lot of sense.

**system**: To do those in the same EDA.

**system**: Backend services for simplicity.

**system**: So that's not the case at the moment.

**system**: But I think that would make sense.

**system**: And yeah, I think essentially, you know, we would just have to.

**system**: Maybe have some.

**system**: Some logic for handling.

**system**: A semantic search request versus.

**system**: Like an LLM request and make sure that the credit system.

**system**: Is hooked up.

**system**: The semantic search also.

**system**: Yeah, that as far as the technical implementation sounds very straightforward to me. I know that working with.

**system**: Oh gosh, I'm blanking on his name. Give me one second.

**system**: Just talking to him this morning.

**system**: Is it Pavlo?

**system**: No, not Pablo, that's something else.

**system**: Marat or Adrian? Yes, marat. Thank you. Sorry, I had more DMS today than I thought I was scrolling and scrolling. I know the way it feels.

**system**: But yeah, there, I know he's got an implementation already that can go and charge credits against an epic ID. So I, he's got a PR open for that.

**system**: Actually, funny enough, I just got a ping a separate ping for it. I have access to it. I need to request access to this repo, but I know there's a, there's a PR up here that they're working on for integrating that. He's been able to make charges.

**system**: He's adding in, we're adding in a new flow for like item potency for like if it fails so you can build that. But basically, you know, he was maintaining generating a transaction ID on your end, calling that with the credit epic ID and how many credits to charge. And it was processing everything there pretty well so far.

**system**: There's another API to like check balances.

**system**: We had a couple tickets for other things that we didn't need yet. So, you know, question there if this will get us into needing refund APIs or any, anything else that we'd kind of kicked the can on.

**system**: But I don't see anything there that's not already basically set up in some of the clients that have been prepared in the EDA back end for the other calls.

**system**: So it like, I think the big question there is probably more to Eugene of like checking like costs and margins for how you translate that into how many.

**system**: Credits get charged. But I don't see many, I don't see any really technical issues there.

**system**: Other than, I guess hesitate to bring this one up.

**system**: But with, with the investigation into like maybe using dev portal launch this that's pulling a thread on like, okay, well, what does that mean for orgs?

**system**: And who all needs to be aware of different contexts for a user beyond just a user ID? Like there's a question there. Do we need to be operating under a user ID and an org ID in some cases?

**system**: The client and the backends would all need to communicate on.

**system**: But ignoring that for the moment.

**system**: The basic test path should be there to prototype against that. It should be ready to go.

**system**: And it sounds like all of the credit.

**system**: Logic.

**system**: Is happening in.

**system**: The go eda backend. Is that right, Stuart?

**system**: Well, so the couch, the token collection information is all in the text chat service, right? So we end up, so that's what.

**system**: And at the moment we only track our costs, we're not tracking the press. We haven't separated those two things yet. We will be tracking, we'll be calculating like a price in terms of credits in the text chat service.

**system**: That gets returned to the EDA back end.

**system**: And then that is the EDA back end is the thing that actually logs the number of credits.

**system**: Per conversation turn that are used.

**system**: And then calls out to the fab service.

**system**: To, you know, any check balances, but also deducts credits as well.

**system**: By the time it's talking to the fab service, like we're in credits land, not token then. Exactly.

**system**: That's the key.

**system**: So that is good.

**system**: Yeah. So I mean, we could use a similar sort of model, right? Like in your MLS service, I'm assuming you're hitting some multimodal models. They'll probably give you information and credits.

**system**: And so in tokens and you'll want like some translation from tokens to credits or something like that.

**system**: I don't think.

**system**: It's quite as simple as that because some of the.

**system**: Models that we.

**system**: Might use might be self hosted as well.

**system**: For example, the embedding stuff. So it's not.

**system**: The case that we have like an indexing and asset costs this many tokens necessarily. Yeah.

**system**: I mean, it's the same thing as what we have, right? Like we have certain models that we self host. Like for example, you know, you know, some of these fine tube models we host in that, we pay the cost, the hosting costs for it. And, but we, but what we'll do is we'll just synthesize a cost associated with that, right? And we will try and use the same sort of metric for all of those costs on our side.

**system**: Yeah.

**system**: And then a basic question that I put in is like, do we handle fractional credits at the moment?

**system**: Can you detect less than one credit?

**system**: I've been adamantly trying to avoid that.

**system**: At least from the pure back end because I'm trying to avoid moving an integer type to a currency type.

**system**: But if, if we do fractional.

**system**: We could support it.

**system**: I think it gets weird because then it kind of bleeds into design.

**system**: Of like every different consumer. It's like there are two or three different places that are integrating against this as the like, you know, SaaS platform right now.

**system**: And that means, you know, we have two, three, four, five plus different parts of the company that will be implementing against it and maybe doing UIs to keep consistent.

**system**: So if we do want to change that something that I think we should do early and stick with, I'd prefer not to and just balance the credit costs where.

**system**: Like one credit is the like minimal unit that we ever think we'd want to charge.

**system**: I, I know that like when you get like, I know some of the things like anthropic or charging like if you look at it as like a million tokens converts to one credit. So like it's.

**system**: Instead of dealing with fractional things, they, they'll like ledger up things and round to a credit, but it'll have like an accrual. The downside there is that you start to get to like different tiers of like credits and other like sub currency types almost like calculating for how we're metering.

**system**: Sounds like that's a pain in the ass.

**system**: So I'm going to stop myself from rambling. That's my opinion. Mark and Eugene, I think have probably.

**system**: More of an authoritative stance on that one.

**system**: Or they are more the authority in my view. I'm just an opinion haver.

**system**: Jack, I think like.

**system**: There's semantic search, there's like eda calls and then there's like gen AI stuff. I think we should just create a fab credit to be roughly like the smallest unit.

**system**: So that it's like 0.002 cents or something like this and have that be sorry not a fab credit like a I credit within epic. So we try to match it roughly with what one embedding cost is. I think that's like the smallest.

**system**: Yeah. So ballpark like a thousand assets is around say one dollar.

**system**: So like in indexing one asset is like the smallest kind of.

**system**: Unit.

**system**: I guess that would be like point one of a cent.

**system**: Is one credit.

**system**: Which I think it might be fine, but it might mean for like a mesh generation.

**system**: It's thousands of credits.

**system**: Oh and no.

**system**: One sim I think. Yeah.

**system**: Or I think there was an order magnitude difference there.

**system**: Yeah, so I don't think it's too much. It might mean that like a mesh generation like yeah kind of costs.

**system**: Like.

**system**: Thousand. How much is a mesh narration? It's like it loads single digit dollars. It could be like like let's say 10 cents.

**system**: So probably like a hundred credits something something like that.

**system**: Which I guess is like from memory that's maybe.

**system**: 100 or 1000.

**system**: You said you said a thousand a thousand mesh was what or a thousand thousand assets is around one dollar.

**system**: A dollar. I'm sorry. I'm so sorry I misheard that that's my fault.

**system**: So I think it would.

**system**: If I understood the last credit FX free it would kind of be like mean roughly 10 times.

**system**: I think one mesh was around 10 credits the last time I saw.

**system**: So it would be like 10xing the unit cost.

**system**: Credit.

**system**: Yeah I mean I don't think that's surprising to us like we had that conversation earlier today we were talking about exactly the same thing of like user perception of 10 versus 100 credits for for those if we get to like credit inflation before launches to account for this.

**system**: Eugene Mark was your opinion there that that wasn't too big a deal?

**system**: Well one question would be like is there any accrual you can do on your side jack where like.

**system**: One doing one doesn't charge you anything but by the time you get to the 10th you're like okay that's a credit because you've accrued these things enough I mean we obviously could but.

**system**: It seemed it would seem a lot easier to store the credits as a as a float in the database.

**system**: And essentially do rounding handle that accrual rather than having a separate accrual system.

**system**: Or we just draw and and we we all agree to divide by a thousand on display or something like that again kind of easier to.

**system**: Store the ends than the floats.

**system**: Yeah my concern with floats is just like we're getting into some concept of stored value floating point precision issues just could lead to accounting issues that.

**system**: Will be probably in the grand scheme of things negligible but could lead to user issues.

**system**: And I guess what I'm kind of guessing Jack is that not all embeddings cost the same right like if you embed like a bigger image file or something like that it might be more than like you'd use more money to do that right?

**system**: It is true that different kind of different new asset types wouldn't will be equal but I think it's not too different.

**system**: Yeah, so I think all we need to do is just like not not sorry to like make it simpler like instead of going down in this like very fractional world I think we just always price.

**system**: What.

**system**: An embedding is a little bit more expensive than what we pay for it on average and then that'll cut cut like cover us for the margin analysis that we have. We're not going to make our money off of marginal right right Jason Darshan we're not going to make our big bucks off of the margins that we make per API call we're making big bucks off of like.

**system**: Rounding them up into a package of of here's a credit pack that costs like a lot more and then and then we'll have different price points for different types of like credit skews whether it's a subscription credit skew or a top obscure will have different margins baked in there. So I think all we need to make sure in this margin analysis is that on average we're a little bit we're charging a little bit more than what we're at what it costs us and I think that's like the simplistic heuristic that we need to take here.

**system**: That makes sense.

**system**: I'm also fine with keeping things as ints and it sounds like the.

**system**: Credit spend wouldn't be like ridiculous it's not like it's just a million credits for a mesh generation it sounds like 100.

**system**: There is the search side of of this so every time you make a search query that costs epic money.

**system**: Because you need to embed the text but it's quite cheap so that my estimate was one to five dollars per one million search queries.

**system**: Jack can you tell us a little bit more about that keystroke comment that you had sorry like I have a dead light here what like are we doing keystroke based stroke based search is that the idea?

**system**: In if the eda is calling this tool that's not a problem at all because it would just call it once as a tool call and we're good the keystroke comment was related to the content browser search UI where the current behavior is that after every keystroke it re-triggers a search.

**system**: And if we if we want to keep that behavior.

**system**: Then you know one search query.

**system**: Depending on how fast someone types and which you know what debouncing threshold we have on it. It could be like five five queries.

**system**: There is also the option to just have a search bar.

**system**: Sorry a search button.

**system**: You have to hit enter.

**system**: Or quick search when you're in semantic search mode.

**system**: Both are very easy to do they have some they obviously have some implications on the cost.

**system**: I have no clue how many.

**system**: Content browser.

**system**: Queries like searches including all the keystroke like one for every keystroke is made across like epic licensees.

**system**: And I don't know if any of that data is logged.

**system**: In fact I'd be surprised if it was because it's all on the client side.

**system**: And it'll be way too much information to log.

**system**: So I think we would have we.

**system**: Probably have to have some.

**system**: Like back of the envelope calculations.

**system**: On.

**system**: The number of search queries.

**system**: But it's going to be I think it's going to be a fairly.

**system**: Fairly rough estimate of what like the searching part of this might cost year so. Is semantic search again general question for fab as well like when we have it there is partial search partial word search even valuable in semantic search like if I'm searching for cars and I type in ca well it semantically find cars and cats.

**system**: Not really but what we're what we're actually implementing is is some form of hybrid search.

**system**: So you will you will have some.

**system**: Kind of string matching on file names that is like contributing to the search.

**system**: It's possible that.

**system**: That like the behavior would be if you start typing like ca.

**system**: It matches on like filenames and start with ca more similar to the existing content browser search and then when you add a t for cat then the kind of semantic signal is strong when you start seeing cats do you have to embed the CA? Like could you could you wait until they pause and then say all right now I'm going to embed this and now do a semantic search or just.

**system**: Yeah we could do we could do.

**system**: We could do lots of things like that.

**system**: We could have limits on like the number of the number of strings before.

**system**: We embed stuff this this might be an over complication I think the first version of this is probably going to have to you hit enter to search I just wanted to like bring up that searching does cost epics and money and we should probably have just some modeling around that yeah, I think we can just maybe even pad the margin a little bit more let's say on the index side and then figure out what the search behaviors are and then even see if people are requesting partial partial word search let's just like keep it simple and then let's not worry about the costs on the search side because it seems so de minimis right now and then just we can pad in a little bit more on the margin for when we index. I see stewardship mute too yeah yeah yeah you just in check sponsored assets in the search results.

**system**: There we go.

**system**: Yeah you're going to get moved out to the commercial team if you keep making comments like that oh you know being at google so long all the trips on that search context is that being made from a web context or a slate like a UE slate context.

**system**: I don't understand the question Michael is it being made from slave the UI the UI where that search like where the user would enter that search.

**system**: It's it's exactly the same UI as the content browser search bar so the slate the slate UI it's just that there'll be a toggle of like are you in semantic search mode or in normal mode?

**system**: The reason I'm asking is I'm not sure if.

**system**: The talent service has any existing integrations in slate itself but when we did similar kind of some similar things on web when we were guarding against just like the things like this that can cost money where you could run up a bill anywhere that it could be like you know bought it and abused where it was you know not something that we were like charging credits for directly like it was just kind of open for for usage maybe that doesn't apply here maybe you said we charge credits here but integrating talent is.

**system**: A nice feature from the ecosec team to at least catch a lot of like bot abuse to lock down things.

**system**: But I don't know.

**system**: How all the like capture stuff works that might require you to just be in web which might be.

**system**: Not usable for the circumstance.

**system**: But the user has to be logged in so if the user is logged in to do this then you know we've already we've already got the auth token for the user and therefore we should be able to use talent from the back end that's serving this search request.

**system**: We had a similar discussion with ecosec, mark and I this one about just the EDA and I think we're probably going to have to do some sort of talent integration there.

**system**: We can reuse you know the same stuff that we do for that.

**system**: I hadn't been through that just because we've always been web context but yeah I guess that can work in partial mode and just skip the capture part but still get some of the like challenge token responses.

**system**: Or.

**system**: Not speculate there but great if you guys have been investigating that.

**system**: Cool.

**system**: I think it's fairly straightforward I think like we.

**system**: We need to.

**system**: Add something to the EDA back end to credit to semantic search as well.

**system**: We need to hook up the auth which Shah and I we can take that offline but you should just use the same thing.

**system**: And then if we're keeping.

**system**: The credit as as like one index asset one asset index is one credit.

**system**: We might need to times things by 10 or so.

**system**: But it should be quite.

**system**: It should be straightforward otherwise.

**system**: It sounds like it sounds like you'll also be able to charge upfront one of the challenges with eda is that it has to kind of do the thing before we know how much to charge, which gives us a bit of a race condition of like we can pre like check if there's enough bounce remaining but we aren't doing any kind of like pre off or like balance hold against it for that right now. But if you can charge ahead of time you'd be able to charge see that the charge was successful before you continue with the API. So that sounds like a little bit of an easier path as well.

**system**: Minus one.

**system**: Okay.

**system**: Anything else I just have one more question is there is someone.

**system**: Product side for semantic search.

**system**: So Dan is Dan Prisman is looking at it from a UX point once we have the like the prototype in corgi.

**system**: That's the that's it.

**system**: Okay.

**system**: Yeah I think we should just make sure we know.

**system**: How this thing is going to be like the user flow for indexing I think something that we should probably someone needs to be thinking about carefully there for sure I mean so definitely because it's it's kind of you can do it automatically or you can press a button so what what we're going to do is put a version into corgi and like have people use it and see where it doesn't work.

**microphone**: I just heard about you.

**system**: Or like and have the UX folks like play around with it as well and have some opinions there but in the first instance it will be a button for triggering the reindexing or you have a setting that automatically exits it and that will probably be off by default.

**microphone**: Originally written.

**system**: Thank you yeah I think I'll talk to Dan about it.

**system**: But let's keep it simple, you know let's earn our way to worrying about floats I don't think the volume is going to be as high as we expect.

**system**: Okay thanks everyone thank you in case this linketh lost anyone needs it afterwards I pasted the API doc for the current one there's a you know code implementation against it too.

**microphone**: Awesome.

**system**: But let me know if anyone else needs the API reference for the existing service to service calls for credit transaction stuff.

**system**: Okay.

**system**: Thank you.

**system**: Thanks to appreciate it Jason Darsh yeah thanks for coming on board.

**microphone**: Thank.

**microphone**: You.
