digital-dream-labs / escape-pod-extension

MIT License
30 stars 27 forks source link

Tutorial #2

Open onlyspike opened 3 years ago

onlyspike commented 3 years ago

I have just set up my Escape Pod. I would like to create extensions but cant find any documentation for this. The github read me says you just need to edit /etc/escapepod.conf. It does not mention where this file is or how to access it?

bussardrobbie commented 3 years ago

@onlyspike The extensions engine needs further documentation and it is something we are actively pursuing in the next 1-2 weeks. The file is exactly where this README mentions it, however: if you access the Pod via ssh and then type "cd /etc" and then "nano escapepod.conf" you will see the contents of the file and be able to edit them. "/etc" is the directory name. When I update the docs I will be more explicit about this.

yekorzh commented 3 years ago

Could you confirm that integration steps in Readme for these examples are compatible with escapepod 1.0? I'm getting intent_system_unsupported intent for behaviours I provision via escapepod ui. Looks like they are ignored.

moribundant commented 3 years ago

The file you are looking for is: escape-pod.conf

yekorzh commented 3 years ago

The file you are looking for is: escape-pod.conf

@moribundant Thanks, I'm ok with the conf file name. I'm wondering if environment variables which you put in that file listed in the tutorial are applicable to escapeppod1.0, and if behaviour configuration example is valid

moribundant commented 3 years ago

I wish I could help, but this thing is so vague and the instructions so esoteric that anything is a crap shoot.

What we have is the folks at DDL are letting out 'tidbits' of code because they have been instructed by others who already have the requisite knowledge to make things happen. The instruction, for lack of a better term, is incomplete. I have taken the position of 'waiting'--at some juncture they will have to publish clear cut instructions or perish. I only hope they do not perish before that happens.

I have noticed that the Escape Pod is extremely resilient and stable--that's a good sign.

yekorzh commented 3 years ago

I must add that I'm running escape_pod on my existing debian armv8 server, not as image on RPI4. It took some time to investigate what is required to get it running, but it is working fine for everything but extension.

So I'm wondering is it because my setup missing something comparing to RPI image, or released version of escape_pod has different integration steps for extensions.

akissu commented 3 years ago

Could you confirm that integration steps in Readme for these examples are compatible with escapepod 1.0? I'm getting intent_system_unsupported intent for behaviours I provision via escapepod ui. Looks like they are ignored.

I too am experiencing this issue. I have the escape-pod-extension service running on the escapepod rpi itself, so I have escape-pod.conf pointing to localhost:PORT. Not sure if there's a chicken and egg situation going on whether the escapepod service needs to connect with the extension service, but it isn't running yet. Systemd logs shows the following when I try to trigger the battery example.

Jun 28 07:02:59 escapepod escape_pod[1497]: {"extend":false,"function":"stt.(*Server).Parse","incoming_text":"how is your battery","level":"info","msg":"","result_intent":"intent_system_unsupported","source":"parse.go:69","time":"2021-06-28 07:02:59"}
Jun 28 07:02:59 escapepod escape_pod[1497]: {"duration":6.464023283,"error":null,"function":"log.StreamServerInterceptor.func1","level":"info","method":"/sttpb.STT/Parse","msg":"stream info","received":40,"sent":1,"source":"stream.go:55","time":"2021-06-28 07:02:59"}
Jun 28 07:02:59 escapepod escape_pod[1497]: {"device":"0050905d","function":"saywhatnow.(*Server).ProcessIntent","intent":"intent_system_unsupported","level":"info","msg":"","parameters":null,"session":"8e773a16-516c-49","source":"intent.go:166","time":"2021-06-28 07:02:59"}
Jun 28 07:02:59 escapepod escape_pod[1497]: {"duration":6.47724378,"error":null,"function":"log.StreamServerInterceptor.func1","level":"info","method":"/chippergrpc2.ChipperGrpc/StreamingIntent","msg":"stream info","received":40,"sent":1,"source":"stream.go:55","time":"2021-06-28 07:02:59"}
Jun 28 07:03:00 escapepod escape_pod[1497]: 2021/06/28 07:03:00 write tcp ESCAPEPOD_IP:80->LAPTOP_IP:50302: write: broken pipe

I'm not sure whether the "extend":false KV is referring to the "Enable External Parsing" option for the behavior because that option is totally set.

I must add that I'm running escape_pod on my existing debian armv8 server, not as image on RPI4. It took some time to investigate what is required to get it running, but it is working fine for everything but extension.

So I'm wondering is it because my setup missing something comparing to RPI image, or released version of escape_pod has different integration steps for extensions.

Can you shed light on how you did this? From my quick observation, aside from the main binary and assets in /usr/local/escapepod, the systemd service, and probably some supporting boot scripts there doesn't seem to be anything extra that is required to run the escapepod service. Also, why does it have to run on arm? Is there a reason they don't provide an x86/amd64 binary, as well?

yekorzh commented 3 years ago

I too am experiencing this issue. I have the escape-pod-extension service running on the escapepod rpi itself, so I have escape-pod.conf pointing to localhost:PORT.

I run extension o n the same host as escapepod and used the following settings in escape-pod.conf:

ENABLE_EXTENSIONS=true ESCAPEPOD_EXTENDER_TARGET=127.0.0.1:8089 ESCAPEPOD_EXTENDER_DISABLE_TLS=true

I found that the integration works, but only for one intent: intent_weather_extend. For any other intent, escape_pod doesn't even try sending a request to extension and responds with 'intent_system_unsupported'. I tried contacting DDL support regarding the issue, but they never responded.

I must add that I'm running escape_pod on my existing debian armv8 server,

Can you shed light on how you did this? From my quick observation, aside from the main binary and assets in /usr/local/escapepod, the systemd service, and probably some supporting boot scripts there doesn't seem to be anything extra that is required to run the escapepod service. Also, why does it have to run on arm? Is there a reason they don't provide an x86/amd64 binary, as well?

Apart from /usr/local/escapepod, I also had to

Possibly a better way to do it is to use this docker image ( found it after I got my escape_pod running): https://github.com/cyb3rdog/escapepod-docker

akissu commented 3 years ago

I found that the integration works, but only for one intent: intent_weather_extend. For any other intent, escape_pod doesn't even try sending a request to extension and responds with 'intent_system_unsupported'. I tried contacting DDL support regarding the issue, but they never responded.

Okay. Initally the escapepod server was not connecting to the extender. I'm not sure why, ~~but after changing ESCAPEPOD_EXTENDER_TARGET=127.0.0.1:8089 to ESCAPEPOD_EXTENDER_TARGET=escapepod.local:8089~~ it is now connecting. However, I'm in the same boat as you now. I am able to trigger intent_weather_extend, but no other behaviors that I've manually added.

EDIT: The connection between the escapepod server and the extender seems to be intermittent.

moribundant commented 3 years ago

After seeing these recent developments and having issues now with my robot, I am wondering what configurations everyone is running. I am running an EP with an OSKR robot and all was working perfectly (except EP Extension) and now the robot gets a 923 error (vic-cloud) because I was trying to get the extension working, but now I think it is hosing something.

Anyway, I wish they had not 'done it this this way' with the EP and OSKR being separate entities. It would have been far simpler to just have a set of server scripts available that would allow OSKR to directly access the web along with the Chipper service for intents processing.

akissu commented 3 years ago

I recieved a response from the discord, and it was observed that I have massive latency issues that are causing timeouts. This would explain my intermittent success with getting the weather intent working. Here are the logs I sent and the reposnse I got from @cyb3rdog.

Jun 29 06:24:51 escapepod escape_pod[2963]: {"extend":true,"function":"stt.(*Server).Parse","incoming_text":"what's the weather","level":"info","msg":"","result_intent":"intent_weather_extend","source":"parse.go:69","time":"2021-06-29 06:24:51"}
Jun 29 06:24:51 escapepod escape_pod[2963]: {"duration":4.131161914,"error":null,"function":"log.StreamServerInterceptor.func1","level":"info","method":"/sttpb.STT/Parse","msg":"stream info","received":25,"sent":1,"source":"stream.go:55","time":"2021-06-29 06:24:51"}
Jun 29 06:24:52 escapepod escape_pod[2963]: 2021/06/29 06:24:52 write tcp 192.168.1.14:80->192.168.1.13:50360: write: broken pipe
Jun 29 06:24:56 escapepod escape_pod[2963]: {"device":"0050905d","function":"saywhatnow.(*Server).ProcessIntent","intent":"intent_weather_extend","level":"error","msg":"rpc error: code = DeadlineExceeded desc = context deadline exceeded","parameters":{"final_intent":"intent_weather_extend"},"session":"8b414c
95-d184-4d","source":"intent.go:128","time":"2021-06-29 06:24:56"}
Jun 29 06:24:56 escapepod escape_pod[2963]: {"action":"get_intent","function":"server.(*Server).StreamingIntent","level":"info","msg":"rpc error: code = Internal desc = stream send fail","source":"intent.go:39","status":"failed","time":"2021-06-29 06:24:56"}
Jun 29 06:24:56 escapepod escape_pod[2963]: {"duration":8.814228504,"error":"rpc error: code = Internal desc = stream send fail","function":"log.StreamServerInterceptor.func1","level":"info","method":"/chippergrpc2.ChipperGrpc/StreamingIntent","msg":"stream info","received":25,"sent":1,"source":"stream.go:55
","time":"2021-06-29 06:24:56"}

cyb3rdog:

well delays might be tricky to troubleshoot, but i dont think the RPI3 itself is a problem... first the escape pod runs the voice recognition, and then it queries the mongo db for corresponding intent (that appear like those 4 seconds above), once it knows how the intent is configured, it contacts your extension for response (that was the 8 seconds there). .... So perhaps the bottleneck might be the the mongo db, and the actual processing algorithm of the extension, because the gRPC communication itself is pretty quick.... .... you might perhaps want to crosscheck all 3 logs, to see where exactly it delays....

yekorzh commented 3 years ago

@akissu:

I'm in the same boat as you now. I am able to trigger intent_weather_extend, but no other behaviors that I've manually added. EDIT: The connection between the escapepod server and the extender seems to be intermittent.

I didn't have any issues with delays or connectivity, just intents I create manually ignored by escape_pod. I wonder if it can be license-related

@moribundant:

I'm running OSKR with EP.

akissu commented 2 years ago

Has there been any progress made on this? I am still unable to create custom intents as all custom behaviors still map to "intent_system_unsupported".

BillMerryman commented 2 years ago

For those you experiencing issues with every intent but weather, do you have ESCAPE_POD_ROBOT_TARGET and ESCAPE_POD_ROBOT_TOKEN configured as environment variables for your service? It looks like all but the weather intent call back to the robot SDK (so back to the robot itself) to elicit something happening.

yekorzh commented 2 years ago

For those you experiencing issues with every intent but weather, do you have ESCAPE_POD_ROBOT_TARGET and ESCAPE_POD_ROBOT_TOKEN configured as environment variables for your service? It looks like all but the weather intent call back to the robot SDK (so back to the robot itself) to elicit something happening.

In my case I have those variables set, but it doesn't matter as the problem is that escape pod isn't triggering the service, unless it is "intent_weather_extend"

iamalek commented 2 years ago

So it is not yet possible to record and store custom programs in the Escape Pod?

BillMerryman commented 2 years ago

For those you experiencing issues with every intent but weather, do you have ESCAPE_POD_ROBOT_TARGET and ESCAPE_POD_ROBOT_TOKEN configured as environment variables for your service? It looks like all but the weather intent call back to the robot SDK (so back to the robot itself) to elicit something happening.

In my case I have those variables set, but it doesn't matter as the problem is that escape pod isn't triggering the service, unless it is "intent_weather_extend"

Did you also add the new additional intents through the escapepod.local 'Behaviors' interface? The intent_weather_extend one is already there, so it makes sense that one fires.

yekorzh commented 2 years ago

Did you also add the new additional intents through the escapepod.local 'Behaviors' interface? The intent_weather_extend one is already there, so it makes sense that one fires.

Yes

Neo-dessinator commented 2 years ago

Could you confirm that integration steps in Readme for these examples are compatible with escapepod 1.0? I'm getting intent_system_unsupported intent for behaviours I provision via escapepod ui. Looks like they are ignored.

I too am experiencing this issue. I have the escape-pod-extension service running on the escapepod rpi itself, so I have escape-pod.conf pointing to localhost:PORT. Not sure if there's a chicken and egg situation going on whether the escapepod service needs to connect with the extension service, but it isn't running yet. Systemd logs shows the following when I try to trigger the battery example.

Jun 28 07:02:59 escapepod escape_pod[1497]: {"extend":false,"function":"stt.(*Server).Parse","incoming_text":"how is your battery","level":"info","msg":"","result_intent":"intent_system_unsupported","source":"parse.go:69","time":"2021-06-28 07:02:59"}
Jun 28 07:02:59 escapepod escape_pod[1497]: {"duration":6.464023283,"error":null,"function":"log.StreamServerInterceptor.func1","level":"info","method":"/sttpb.STT/Parse","msg":"stream info","received":40,"sent":1,"source":"stream.go:55","time":"2021-06-28 07:02:59"}
Jun 28 07:02:59 escapepod escape_pod[1497]: {"device":"0050905d","function":"saywhatnow.(*Server).ProcessIntent","intent":"intent_system_unsupported","level":"info","msg":"","parameters":null,"session":"8e773a16-516c-49","source":"intent.go:166","time":"2021-06-28 07:02:59"}
Jun 28 07:02:59 escapepod escape_pod[1497]: {"duration":6.47724378,"error":null,"function":"log.StreamServerInterceptor.func1","level":"info","method":"/chippergrpc2.ChipperGrpc/StreamingIntent","msg":"stream info","received":40,"sent":1,"source":"stream.go:55","time":"2021-06-28 07:02:59"}
Jun 28 07:03:00 escapepod escape_pod[1497]: 2021/06/28 07:03:00 write tcp ESCAPEPOD_IP:80->LAPTOP_IP:50302: write: broken pipe

I'm not sure whether the "extend":false KV is referring to the "Enable External Parsing" option for the behavior because that option is totally set.

I must add that I'm running escape_pod on my existing debian armv8 server, not as image on RPI4. It took some time to investigate what is required to get it running, but it is working fine for everything but extension. So I'm wondering is it because my setup missing something comparing to RPI image, or released version of escape_pod has different integration steps for extensions.

Can you shed light on how you did this? From my quick observation, aside from the main binary and assets in /usr/local/escapepod, the systemd service, and probably some supporting boot scripts there doesn't seem to be anything extra that is required to run the escapepod service. Also, why does it have to run on arm? Is there a reason they don't provide an x86/amd64 binary, as well?

Hello sir.

I am trying to setup the extension pod, an the same RPI as the escape pod. Could you eventually provide steps to be able to do ? Hope you can help > < So I can also tried to launche the services and help here

cyb3rdog commented 2 years ago

Hey everyone,

for those of you strugeling with this extension example, I would like to share few hints with you:

1) This escapepod extension should be considered only as example, as there is actualy few more ways to go... 2) The main point of interrest in this example is the protobuf definition, where the escapepod v1.0 client connects to this server side 'extension' binary, where the Unary grpc listener is implemented. Configuration of this 'server endpoint' is in /etc/escape-pod.conf and basically needs to be extended only with this:

ENABLE_EXTENSIONS=true
ESCAPEPOD_EXTENDER_TARGET=127.0.0.1:8089
ESCAPEPOD_EXTENDER_DISABLE_TLS=true

3) Reason for this architectural concept (escapepod is client to extension server) was very likely just copying the whole principle from intent processing realized in the Vector's DDL cloud, as in this scenario there can be only one 'cloud server'. 3) In the escapepod software version 1.0 there is also likely a bug, which requires the "intents/behaviours" marked for "External Parsing" to have the 'final_intent' reponse parameter's value same as the intent_name - the 'Behavior' field value, so keep this in mind when creating new "external parsing" intents, to save yourselves some nerves. 4) Your grpc server does not necessarily need to be implemented in golang, but it can be done in any programmig language which supports grpc protocol implementation. 5) Once the intent marked for "External Parsing" is received in extension, this example anyways uses the Vector's Go SDK to perform the actual "behaviours" overrides - So you can basically do the very very same thing in any other language which had Vector SDK developed for (node.js, c#, python....) 6) Although its perhaps the easiest and most suitable approach to deploy the extenstion binary to the same host as the escape-pod, it does not necessarily needs to be hosted there, you can have it hosted on any machine in same network as your vector and escapepod, and create the extension in any language and for any platform. 7) Some time ago, I have written my own extension, which is basically a proxy forwarding the unary request to its own event stream, to which the clients can connect and subscribe to. This was meant to provide with more 'friendly' way allowing broad variety of 'clients' to just connect to this extension proxy and just use it. Additionally, it also publishes methods for querying/creating/deleting the escapepod intents from your code.
So in case you'd like to know more about it, or use it as learning materials, feel free to visit my cyb3rdog/escape-pod-proxy repository. 8) I have also published the Python SDK for this particualar extension proxy of mine, to provide with some simple basic tutorials and examples of how to use this, how to be able to create intents/behaviour on the fly in your code, and to show the way, how to react to all escapepod intent events, regardless of its origin (vector's sdk/escapepod extension). Prerequisite of the use of this python sdk is to have this extension proxy of mine installed. See the documentation, deployment guide, and examples for more details.

I hope this will be of help to some of you, escpecially to begginers, and python coders, and that it will also provide with some insight to how this all actually works.

Cheers, cyb3rdog

Neo-dessinator commented 1 year ago

Thanks for your time and answer Cyb3rDog. Do you have any documentation on how to make thing work with your services ?

Otherwise, any help possible ? I have two problems atm : First one, if you prefer to use location_id for the weather and commend ZIP_CODE, you ave an error telling you you need to enter at least one parameter ....

Second one, i actually set up the docker and all, but when trying to trigger the weather intent, I have this error popping. And I can't understand it. any hint on what's wrong and on how to correct it ?

Aug 21 17:02:12 escapepod escape_pod[736]: {"level":"error","ts":"2022-08-21T17:02:12.759Z","msg":"stream_server_interceptor=rpc error: code = Internal desc = no processor defined","correlation_id":"cc16a4fqcobc2r1hb9u0","stacktrace":"github.com/digital-dream-labs/go-logger.(*logger).Errorf\n\tgithub.com/digital-dream-labs/go-logger@v0.0.0-20210716200444-aacb0c191ae0/logger.go:197\ngithub.com/digital-dream-labs/go-logger.LoggingStreamServerInterceptor.func1\n\tgithub.com/digital-dream-labs/go-logger@v0.0.0-20210716200444-aacb0c191ae0/grpc.go:57\ngoogle.golang.org/grpc.chainStreamInterceptors.func1.1\n\tgoogle.golang.org/grpc@v1.45.0/server.go:1410\ngoogle.golang.org/grpc.chainStreamInterceptors.func1\n\tgoogle.golang.org/grpc@v1.45.0/server.go:1412\ngoogle.golang.org/grpc.(*Server).processStreamingRPC\n\tgoogle.golang.org/grpc@v1.45.0/server.go:1548\ngoogle.golang.org/grpc.(*Server).handleStream\n\tgoogle.golang.org/grpc@v1.45.0/server.go:1623\ngoogle.golang.org/grpc.(*Server).serveStreams.func1.2\n\tgoogle.golang.org/grpc@v1.45.0/server.go:921"}